Quantcast

2.7.0

Alar of Daggerspine [08-31-15 - 22:29]
2.7.0

Signed-off-by: Alar of Daggerspine <alar@aspide.it>
Filename
.pkgmeta
FollowerPage.lua
GarrisonCommander.lua
Init.lua
MissionCache.lua
MissionCompletion.lua
MissionControl.lua
ShipYard.lua
embeds.xml
diff --git a/.pkgmeta b/.pkgmeta
index dd063b7..1be6825 100755
--- a/.pkgmeta
+++ b/.pkgmeta
@@ -9,6 +9,10 @@ externals:
 		url: svn://svn.wowace.com/wow/ace3/mainline/trunk
 		tag: latest

+	libs/LibItemUpgradeInfo-1.0:
+		url: git://git.wowace.com/wow/libitemupgradeinfo-1-0/mainline.git
+		tag: latest
+
 move-folders:
 	GarrisonCommander/GarrisonCommander-Broker: GarrisonCommander-Broker

diff --git a/FollowerPage.lua b/FollowerPage.lua
index 9d8f9d6..cde88db 100644
--- a/FollowerPage.lua
+++ b/FollowerPage.lua
@@ -20,6 +20,7 @@ local StaticPopupDialogs=StaticPopupDialogs
 local YES=YES
 local NO=NO
 local GARRISON_FOLLOWER_MAX_ITEM_LEVEL=GARRISON_FOLLOWER_MAX_ITEM_LEVEL
+local module=addon:NewSubClass("FollowerPage") --#module
 function addon:ShowImprovements()
 	local scroller=self:GetScroller("Items")
 	scroller:AddRow("Follower Upgrades",C.Orange())
diff --git a/GarrisonCommander.lua b/GarrisonCommander.lua
index c4dd396..32d05b7 100644
--- a/GarrisonCommander.lua
+++ b/GarrisonCommander.lua
@@ -24,7 +24,7 @@ local trc=false
 local pin=false
 local baseHeight
 local minHeight
-local addon=addon --#self
+local addon=addon --#addon
 local LE_FOLLOWER_TYPE_GARRISON_6_0=LE_FOLLOWER_TYPE_GARRISON_6_0
 local LE_FOLLOWER_TYPE_SHIPYARD_6_2=LE_FOLLOWER_TYPE_SHIPYARD_6_2
 ns.bigscreen=true
@@ -398,6 +398,10 @@ print("Initialize")
 	db.lifespan=nil -- Removed in 2.6.9
 	db.traits=nil -- Removed in 2.6.9
 	db.types=nil -- Removed in 2.6.9
+	chardb.missions=nil -- Removed
+	chardb.followers=nil
+	chardb.running=nil
+	chardb.runningIndex=nil
 	if type(dbGAC)== "table " and type(dbGAC.namespaces)=="table" then
 		dbGAC.namespaces.missionscache=nil  -- Removed in 2.6.9
 		dbGAC.namespaces=nil
@@ -423,7 +427,7 @@ print("Initialize")
 	L["Sort missions by:"],L["Original sort restores original sorting method, whatever it was (If you have another addon sorting mission, it should kick in again)"])
 	self:AddToggle("USEFUL",true,L["Enhance tooltip"],L["Adds a list of other useful followers to tooltip"])
 	self:AddToggle("MAXRES",true,L["Maximize result"],L["Allows a lower success percentage for resource missions. Use /gac gui to change percentage. Default is 80%"])
-	self:AddSlider("MAXRESCHANCE",80,50,100,L["Minum needed chance"],L["Applied when maximise result is enabled. Default is 80%"],1)
+	self:AddSlider("MAXRESCHANCE",80,50,100,L["Minum needed chance"],L["Applied when 'maximize result' is enabled. Default is 80%"],1)
 	ns.bigscreen=self:GetBoolean("BIGSCREEN")
 	self:AddLabel("Followers Panel")
 	self:AddSlider("MAXMISSIONS",5,1,8,L["Mission shown"],L["Mission shown for follower"],1)
@@ -794,31 +798,14 @@ function addon:CreatePrivateDb()
 					}
 				},
 				missionControl={
-					version=1,
+					version=3,
 					allowedRewards = {
-						followerUpgrade=true,
-						gold=true,
-						itemLevel=true,
-						resources=true,
-						xp=true,
-						scroll=true,
-						apexis=true,
-						oil=true,
-						other=true
+						['*']=true,
 					},
 					rewardChance={
-						followerUpgrade=100,
-						gold=100,
-						itemLevel=100,
-						resources=100,
-						xp=100,
-						scroll=100,
-						apexis=100,
-						oil=100,
-						seal=100,
-						other=100
+						['*']=100,
 					},
-					rewardOrder={1,2,3,4,5,6,7,8,9,10},
+					rewardList={},
 					useOneChance=true,
 					minimumChance = 100,
 					minDuration = 0,
@@ -1087,18 +1074,12 @@ function addon:CreateOptionsLayer(...)
 	return o,totsize
 end
 function addon:AddOptionToOptionsLayer(o,flag,maxsize)
---@debug@
-	print("Adding option",flag)
---@end-debug@
 	maxsize=tonumber(maxsize) or 160
 	if (not flag) then return 0 end
 	local info=addon:GetVarInfo(flag)
 	if (info) then
 		local data={option=info}
 		local widget
---@debug@
-	print("Adding option",flag,info.type,info)
---@end-debug@
 		if (info.type=="toggle") then
 			widget=AceGUI:Create("CheckBox")
 			local value=addon:GetBoolean(flag)
@@ -1377,6 +1358,14 @@ function addon.ClonedGarrisonMissionMechanic_OnEnter(this)
 	end
 	tip:Show()
 end
+local function removeAllFollowers(missionID)
+	local x=G.GetBasicMissionInfo(missionID)
+	if x then
+		for i=1,#x.followers do
+			G.RemoveFollowerFromMission(missionID,x.followers[i])
+		end
+	end
+end
 function addon:HookedGarrisonFollowerPage_ShowFollower(frame,followerID,force)
 	return self:RenderFollowerPageMissionList(frame,followerID,force)
 end
@@ -1387,7 +1376,17 @@ do
 	local mh=nil
 	local tContains=tContains
 	local function MissionOnClick(this,...)
-
+		local m=GMF.MissionTab.MissionPage.missionInfo
+		if m and m.missionID then
+			holdEvents()
+			local rc,message=pcall(removeAllFollowers,m.missionID)
+			if not rec then
+				print(message)
+			end
+			releaseEvents()
+
+
+		end
 --@debug@
 print(this.frame,this.frame:GetName())
 --@end-debug@
@@ -1559,9 +1558,6 @@ function addon:RefreshMenu()
 	end
 end
 function addon:AddMenu()
---@debug@
-print("Adding Menu")
---@end-debug@
 	if GCF.Menu then
 		return
 	end
@@ -1576,7 +1572,7 @@ print("Adding Menu")
 		self:RenderFollowerPageMissionList(nil,GMF.FollowerTab.followerID)
 	elseif GMF.MissionControlTab:IsVisible() then
 		self.currentmenu=GMF.MissionControlTab
-		menu,size=self:CreateOptionsLayer('BIGSCREEN','USEFUL','MOVEPANEL')
+		menu,size=self:CreateOptionsLayer('BIGSCREEN','GCMINLEVEL','GCMINUPGRADE','GCSKIPRARE','GCSKIPEPIC','USEFUL')
 	end
 --@debug@
 	self:AddOptionToOptionsLayer(menu,'DBG')
@@ -1595,14 +1591,8 @@ print("Adding Menu")
 	GCF.Menu=menu
 end
 function addon:RemoveMenu()
---@debug@
-print("Removing menu")
---@end-debug@
 	if (GCF.Menu) then
 		local rc,message=pcall(GCF.Menu.Release,GCF.Menu)
-		--@debug@
-		print("Removed menu",rc,message)
-		--@end-debug@
 		GCF.Menu=nil
 	end
 end
@@ -1840,6 +1830,7 @@ local fakeinfo={followerID=false}
 local fakeframe={}

 function addon:FillMissionPage(missionInfo)
+
 	--@debug@
 	print("FillMissionPage",missionInfo)
 	--@end-debug@
@@ -1887,17 +1878,12 @@ function addon:FillMissionPage(missionInfo)
 			local followerID=members[i]
 			if (followerID) then
 				main:AssignFollowerToMission(followerframe,self:GetAnyData(missionInfo.followerTypeID,followerID))
-				--	local rc,error=pcall(GarrisonMissionPage_AddFollower,followerID)
-				--	if (not rc) then
-				--		print("fillmissinopage",error)
-				--	end
 			end
 		end
 	else
-
---@debug@
-print("No martini no party")
---@end-debug@
+		--@debug@
+		print("No martini no party")
+		--@end-debug@
 	end
 	main:UpdateMissionParty(main.MissionTab.MissionPage.Followers)
 	main:UpdateMissionData(main.MissionTab.MissionPage)
@@ -2261,9 +2247,6 @@ function addon:ScriptGarrisonMissionButton_OnClick(tab,button)
 		return
 	end
 	if (type(tab.info)~="table") then return end
-	if (tab.fromFollowerPage) then
-		self:OpenMissionsTab()
-	end
 	self:FillMissionPage(tab.info)
 end
 function addon:OnClick_GCMissionButton(frame,button)
@@ -2354,7 +2337,7 @@ function deleteGarrisonMissionFrame_SetFollowerPortrait(portraitFrame, followerI
 	end
 end

-function addon:GarrisonMissionPageOnClose(self)
+function addon:GarrisonMissionPageOnClose()
 	GMF:ClearParty()
 	GarrisonMissionFrame.MissionTab.MissionPage:Hide();
 	GarrisonMissionFrame.followerCounters = nil;
@@ -2518,6 +2501,7 @@ function addon:ScriptGarrisonMissionButton_OnEnter(this, button)
 --@debug@
 	GameTooltip:AddDoubleLine("MissionID",this.info.missionID)
 	GameTooltip:AddDoubleLine("Class",this.info.class)
+	GameTooltip:AddDoubleLine(this.info.class,this.info[this.info.class])
 	GameTooltip:AddDoubleLine("TitleLen",this.Title:GetStringWidth())
 	GameTooltip:AddDoubleLine("SummaryLen",this.Summary:GetStringWidth())
 	GameTooltip:AddDoubleLine("Reward",this.Rewards[1]:GetWidth())
diff --git a/Init.lua b/Init.lua
index cfa8db9..acef281 100644
--- a/Init.lua
+++ b/Init.lua
@@ -13,7 +13,6 @@ local tostringall=tostringall
 local tostring=tostring
 local tonumber=tonumber
 local type=type
-print("init loaded")
 --@debug@
 LoadAddOn("Blizzard_DebugTools")
 LoadAddOn("LibDebug")
@@ -383,7 +382,9 @@ ns.traitTable={
 	[232]="Dancer"
 }
 }
-
+-- Caching iteminfo
+ns.I=LibStub("LibItemUpgradeInfo-1.0")
+ns.GetItemInfo=ns.I:GetCachingGetItemInfo()
 -- Pseudo Global Support.
 -- Calling ns.Configure() will give to the calling function a preloaded env

@@ -409,29 +410,5 @@ function ns.Configure()
 		end
 		setfenv(2, ENV)
 end
--------------------- to be estracted to CountersCache
---
---local G=C_Garrison
---ns.Abilities=setmetatable({},{
---	__index=function(t,k) rawset(t,k,G.GetFollowerAbilityName(k)) return rawget(t,k) end
---})
---
---
---

---[[ TtraitTable generator
-local TT=C_Garrison.GetRecruiterAbilityList(true)
-local map={}
-local  keys={}
-for i,v in pairs(C_Garrison.GetRecruiterAbilityCategories()) do
-	keys[v]=i
-end
-for  _,trait in  pairs(TT) do
-	local key=keys[trait.category]
-	if type(map[key])~="table"  then
-			map[key]={}
-	end
-	map[key][trait.id]=trait.name
-end
-ATEINFO['abilities']=map
---]]
+
diff --git a/MissionCache.lua b/MissionCache.lua
index 8bd317f..07fafd7 100644
--- a/MissionCache.lua
+++ b/MissionCache.lua
@@ -317,13 +317,12 @@ function addon:GetMissionIterator(followerType,func)
 end
 local function inList(self,id,reward)
 	if self.key=='xp'  then
-		if reward.followerXP then return reward.followerXp end
+		if reward.followerXP then return reward.followerXP end
 	elseif self.key=='followerUpgrade' then
 		if not reward.itemID then return false end
-		local info=addon:IsFollowerUpgrade(reward.itemID)
-		if info then
-			local _,_,level=strsplit(':',info)
-			return 	tonumber(level) or 0
+		local level=addon:IsFollowerUpgrade(reward.itemID)
+		if level then
+			return tonumber(level) or 0
 		end
 	elseif self.key=='itemLevel' then
 		if not reward.itemID then return false end
@@ -338,9 +337,9 @@ local function inList(self,id,reward)
 		end
 	elseif self.key=='other' then
 		return reward.quantity or 0
-	elseif reward.itemID and tcontains(self.list,reward.itemID) then
+	elseif reward.currencyID and tContains(self.list,-reward.currencyID) then
 		return reward.quantity or 1
-	elseif reward.currency and tcontains(self.list,reward.currency) then
+	elseif reward.itemID and tContains(self.list,reward.itemID) then
 		return reward.quantity or 1
 	end
 	return false
@@ -373,23 +372,30 @@ local function newMissionType(key,name,icon,maxable,mat,func,...)
 end
 classes={
 	newMissionType('xp',L['Follower experience'],'XPBonus_icon',false,false,nil,0),
-	newMissionType('resources',GetCurrencyInfo(GARRISON_CURRENCY),'inv_garrison_resource',true,true,nil,GARRISON_CURRENCY),
-	newMissionType('oil',GetCurrencyInfo(GARRISON_SHIP_OIL_CURRENCY),'garrison_oil',true,true,nil,GARRISON_SHIP_OIL_CURRENCY),
+	newMissionType('resources',GetCurrencyInfo(GARRISON_CURRENCY),'inv_garrison_resource',true,true,nil,-GARRISON_CURRENCY),
+	newMissionType('oil',GetCurrencyInfo(GARRISON_SHIP_OIL_CURRENCY),'garrison_oil',true,true,nil,-GARRISON_SHIP_OIL_CURRENCY),
 	newMissionType('rush',L['Rush orders'],'INV_Scroll_12',false,false,nil,122595,122594,122596,122592,122590,122593,122591,122576),
-	newMissionType('apexis',GetCurrencyInfo(823),'inv_apexis_draenor',false,false,nil,823),
-	newMissionType('seal',GetCurrencyInfo(994),'ability_animusorbs',false,false,nil,824),
+	newMissionType('apexis',GetCurrencyInfo(823),'inv_apexis_draenor',false,false,nil,-823),
+	newMissionType('seal',GetCurrencyInfo(994),'ability_animusorbs',false,false,nil,-994),
 	newMissionType('gold',BONUS_ROLL_REWARD_MONEY,'inv_misc_coin_01',false,false,nil,0),
 	newMissionType('followerUpgrade',L['Follower equipment set or upgrade'],'Garrison_ArmorUpgrade',false,false,nil,0),
 	newMissionType('itemLevel',L['Item Tokens'],'INV_Bracer_Cloth_Reputation_C_01',false,false,nil,0),
-	newMissionType('other',L['Other rewards'],'INV_Box_02',false,false,nil,0),
 	newMissionType('primalspirit',L['Reagents'],'6BF_Explosive_shard',false,false,nil,118472,120945,113261,113262,113263,113264),
-	newMissionType('ark',L['Archaelogy'],'achievement_character_orc_male',false,false,nil,829,828,821,108439,109585,109584), -- Fragments and completer
-	newMissionType('training',L['Follower Training'],'Spell_Holy_WeaponMastery',false,false,nil,123858,118354,118475,122582,122580,122584,118474),
+	newMissionType('ark',L['Archaelogy'],'achievement_character_orc_male',false,false,nil,-829,-828,-821,108439,109585,109584), -- Fragments and completer
+	newMissionType('training',L['Follower Training'],'Spell_Holy_WeaponMastery',false,false,nil,123858,118354,118475,122582,122583,122580,122584,118474),
 	newMissionType('legendary',L['Legendary Items'],'INV_Relics_Runestone',false,false,nil,115510,115280,128693),
 	newMissionType('toys',L['Toys and Mounts'],'INV_LesserGronnMount_Red',false,false,nil,128310,127748,128311),
 	newMissionType('reputation',L['Reputation Items'],'Spell_Shadow_DemonicCircleTeleport',false,false,nil,117492,128315),
+	newMissionType('other',L['Other rewards'],'INV_Box_02',false,false,nil,0),
 }
 function addon:GetRewardClasses()
 	return classes
 end
-
+function addon:TestMission(id)
+	local rewards=G.GetMissionRewardInfo(id)
+	for id,reward in pairs(rewards) do
+		for _,v in pairs(classes) do
+			print(v.key,v.func(v,id,reward))
+		end
+	end
+end
diff --git a/MissionCompletion.lua b/MissionCompletion.lua
index de5b0f0..830d56e 100644
--- a/MissionCompletion.lua
+++ b/MissionCompletion.lua
@@ -8,6 +8,7 @@ local GMFMissions=GarrisonMissionFrameMissions
 local GSFMissions=GarrisonMissionFrameMissions
 local GARRISON_CURRENCY=GARRISON_CURRENCY
 local GARRISON_SHIP_OIL_CURRENCY=_G.GARRISON_SHIP_OIL_CURRENCY or 0
+local SEAL_CURRENCY=994
 local LE_FOLLOWER_TYPE_GARRISON_6_0=_G.LE_FOLLOWER_TYPE_GARRISON_6_0
 local LE_FOLLOWER_TYPE_SHIPYARD_6_2=_G.LE_FOLLOWER_TYPE_SHIPYARD_6_2
 local pairs=pairs
@@ -36,9 +37,15 @@ function module:GenerateMissionCompleteList(title,anchor)
 end
 --@debug@
 function addon.ShowRewards()
-	module:GenerateMissionCompleteList("Test")
+	module:GenerateMissionCompleteList("Test",UIParent)
 end
 --@end-debug@
+local cappedCurrencies={
+	GARRISON_CURRENCY,
+	GARRISON_SHIP_OIL_CURRENCY,
+	SEAL_CURRENCY
+}
+
 local missions={}
 local followerType=LE_FOLLOWER_TYPE_GARRISON_6_0
 local states={}
@@ -99,27 +106,30 @@ function module:CloseReport()
 	addon:RefreshParties()
 	addon:RefreshMissions()
 end
-function module:MissionComplete(this,button)
-
---@debug@
-print(this,button,this.missionType)
---@end-debug@
+function module:MissionComplete(this,button,skiprescheck)
 	followerType=this.missionType
 	missions=G.GetCompleteMissions(followerType)
+
 	if (missions and #missions > 0) then
+		this:SetEnabled(false)
 		GMFMissions.CompleteDialog.BorderFrame.ViewButton:SetEnabled(false) -- Disabling standard Blizzard Completion
 		GSFMissions.CompleteDialog.BorderFrame.ViewButton:SetEnabled(false) -- Disabling standard Blizzard Completion
-		report=self:GenerateMissionCompleteList("Missions' results",followerType==LE_FOLLOWER_TYPE_GARRISON_6_0 and GMF or GSF)
 		wipe(rewards.followerBase)
 		wipe(rewards.followerXP)
 		wipe(rewards.currencies)
 		wipe(rewards.items)
+		local message=C("WARNING",'red')
+		local wasted={}
 		for i=1,#missions do
 			for k,v in pairs(missions[i].followers) do
 				rewards.followerBase[v]=self:GetAnyData(followerType,v,'qLevel',0)
 			end
 			for k,v in pairs(missions[i].rewards) do
 				if v.itemID then GetItemInfo(v.itemID) end -- tickling server
+				if v.currencyID and tContains(cappedCurrencies,v.currencyID) then
+					local currentQT=select(2,GetCurrencyInfo(v.currencyID))
+					wasted[v.currencyID]=(wasted[v.currencyID] or 0) + v.quantity
+				end
 			end
 			local m=missions[i]
 --totalTimeString, totalTimeSeconds, isMissionTimeImproved, successChance, partyBuffs, isEnvMechanicCountered, xpBonus, materialMultiplier, goldMultiplier = C_Garrison.GetPartyMissionInfo(MISSION_PAGE_FRAME.missionInfo.missionID);
@@ -128,10 +138,43 @@ print(this,button,this.missionType)
 			_,_,m.isMissionTimeImproved,m.successChance,_,_,m.xpBonus,m.resourceMultiplier,m.goldMultiplier=G.GetPartyMissionInfo(m.missionID)

 		end
+		local stop
+		for id,qt in pairs(wasted) do
+			local name,current,_,_,_,cap=GetCurrencyInfo(id)
+			--@debug@
+			print(name,current,qt,cap)
+			--@debug-end@
+			current=current+qt
+			if current+qt > cap then
+				message=message.."\n"..format(L["Capped %1$s. Spend at least %2$d of them"],name,current-cap)
+				stop =true
+			end
+		end
+		if stop and not skiprescheck then
+			self:Popup(message.."\n" ..L["If you continue, you will loose them"],0,
+				function()
+					module:MissionComplete(this,button,true)
+				end,
+				function()
+					this:SetEnabled(true)
+					if GMF then
+						GMF:Hide()
+						GMFMissions.CompleteDialog.BorderFrame.ViewButton:SetEnabled(true)
+					end
+					if GSF then
+						GSF:Hide()
+						GSFMissions.CompleteDialog.BorderFrame.ViewButton:SetEnabled(true)
+					end
+				end
+			)
+			return
+		end
+		report=self:GenerateMissionCompleteList("Missions' results",followerType==LE_FOLLOWER_TYPE_GARRISON_6_0 and GMF or GSF)
 		report:SetUserData('missions',missions)
 		report:SetUserData('current',1)
 		self:Events(true)
 		self:MissionAutoComplete("INIT")
+		this:SetEnabled(true)
 	end
 end
 function module:GetMission(missionID)
@@ -199,7 +242,7 @@ function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 		end
 		startTimer(0.1)
 		return
-	else -- event == LOOP
+	else -- event == LOOP or INIT
 		if (currentMission) then
 			local step=currentMission.state or -1
 			if (step<1) then
diff --git a/MissionControl.lua b/MissionControl.lua
index 1044566..82301c0 100644
--- a/MissionControl.lua
+++ b/MissionControl.lua
@@ -18,7 +18,8 @@ local pairs=pairs
 local tinsert=tinsert
 local tremove=tremove
 local dbg
-local tItems = {
+local tItems ={
+	--[[
 	{t = 'Enable/Disable money rewards.', i = 'Interface\\Icons\\inv_misc_coin_01', key = 'gold'},
 	{t = 'Enable/Disable resource awards. (Resources/Seals)', i= 'Interface\\Icons\\inv_garrison_resource', key = 'resources'},
 	{t = 'Enable/Disable oil awards.', i= 'Interface\\Icons\\garrison_oil', key = 'oil'},
@@ -30,17 +31,23 @@ local tItems = {
 	{t = 'Enable/Disable generc rewards.', i = "Interface\\ICONS\\INV_Box_02", key = 'other'},
 	{t = 'Enable/Disable Seal of Tempered Fate.', i = "Interface\\Icons\\ability_animusorbs", key = 'seal'},
 	{t = 'Enable/Disable Primal Spirit.', i = "Interface\\Icons\\6BF_Explosive_shard", key = 'primalspirit'},
-	{t = 'Enable/Disable Follower Equip Set.', i = "Interface\\Icons\\Garrison_GreenArmor", key = 'followerSet'},
-}
-tItems=addon:GetRewardClasses()
-local tOrder
-local tSort={}
+	--]]
+	}
+for _,data in ipairs(addon:GetRewardClasses()) do
+	tItems[data.key]=data
+end
+local classlist={} ---#table local reference to settings.rewardList
+local class2order={} ---#table maps a classname to its priority
 local settings
 local module=addon:NewSubClass("MissionControl") --#module
 function module:GMCBusy(followerID)
 	return GMCUsedFollowers[followerID]
 end
 addon.GMCBusy=module.GMCBusy
+---
+-- Builds a mission list based on user preferences
+-- @param #module self self
+-- @param #table workList table to be filled with mission list
 function module:GMCCreateMissionList(workList)
 	--First get rid of unwanted rewards and missions that are too long
 	local settings=self.privatedb.profile.missionControl
@@ -50,38 +57,43 @@ function module:GMCCreateMissionList(workList)
 		local discarded=false
 		local class=self:GetMissionData(missionID,"class")
 		repeat
-
---@debug@
-print("|cffff0000",'Examing',missionID,self:GetMissionData(missionID,"name"),class,"|r")
---@end-debug@
+			--@debug@
+			print("|cffff0000",'Examining',missionID,self:GetMissionData(missionID,"name"),class,"|r")
+			--@end-debug@
 			local durationSeconds=self:GetMissionData(missionID,'durationSeconds')
 			if (durationSeconds > settings.maxDuration * 3600 or durationSeconds <  settings.minDuration * 3600) then
-
---@debug@
-print(missionID,"discarded due to len",durationSeconds /3600)
---@end-debug@
+				--@debug@
+				print("  ",missionID,"discarded due to duration",durationSeconds /3600)
+				--@end-debug@
 				break
 			end -- Mission too long, out of here
 			if self:GetMissionData(missionID,'isRare') and addon:GetBoolean('GCSKIPRARE') then
-
---@debug@
-print(missionID,"discarded due to rarity")
---@end-debug@
+				--@debug@
+				print("  ",missionID,"discarded due to rarity")
+				--@end-debug@
 				break
 			end
 			if (not ar[class]) then
-
---@debug@
-print(missionID,"discarded due to class == ", class)
---@end-debug@
+				--@debug@
+				print("  ",missionID,"discarded due to class == ", class)
+				--@end-debug@
 				discarded=true
 				break
 			end
 			if class=="itemLevel" then
 				if self:GetMissionData(missionID,'itemLevel') < settings.minLevel then
---@debug@
-print(missionID,"discarded due to ilevel == ", self:GetMissionData(missionID,'itemLevel'))
---@end-debug@
+					--@debug@
+					print("  ",missionID,"discarded due to ilevel == ", self:GetMissionData(missionID,'itemLevel'))
+					--@end-debug@
+					discarded=true
+					break
+				end
+			elseif class=="followerUpgrade" then
+				if self:GetMissionData(missionID,'followerUpgrade') < settings.minUpgrade and
+					self:GetMissionData(missionID,'followerUpgrade') > 600 then
+					--@debug@
+					print("  ",missionID,"discarded due to followerUpgrade == ", self:GetMissionData(missionID,'followerUpgrade'))
+					--@end-debug@
 					discarded=true
 					break
 				end
@@ -98,25 +110,27 @@ print(missionID,"discarded due to ilevel == ", self:GetMissionData(missionID,'it
 		if (c1==c2) then
 			return addon:GetMissionData(i1,c1,0) > addon:GetMissionData(i2,c2,0)
 		else
-			return (tSort[c1] or i1)<(tSort[c2] or i2)
+			return (class2order[c1] or i1)<(class2order[c2] or i2)
 		end
 	end
 	table.sort(workList,msort)
---@debug@
+	--@debug@
 	for i=1,#workList do
 		local id=workList[i]
 		print(self:GetMissionData(id,'name'),self:GetMissionData(id,'class'),self:GetMissionData(id,self:GetMissionData(id,'class')))
 	end
---@end-debug@
+	--@end-debug@
 end
---- This routine can be called both as coroutin and as a standard one
+---
+-- This routine can be called both as coroutin and as a standard one
 -- In standard version, delay between group building and submitting is done via a self schedule
---@param #integer missionID Optional, to run a single mission
---@param #bool start Optional, tells that follower already are on mission and that we need just to start it
+-- @param #module self
+-- @param #number missionID Optional, to run a single mission
+-- @param #boolean start Optional, tells that follower already are on mission and that we need just to start it
 function module:GMCRunMission(missionID,start)
---@debug@
+	--@debug@
 	print("Asked to start mission",missionID)
---@end-debug@
+	--@end-debug@
 	local GMC=GMF.MissionControlTab
 	if (start) then
 		G.StartMission(missionID)
@@ -126,9 +140,9 @@ function module:GMCRunMission(missionID,start)
 	end
 	for i=1,#GMC.list.Parties do
 		local party=GMC.list.Parties[i]
---@debug@
+		--@debug@
 		print("Checking",party.missionID)
---@end-debug@
+		--@end-debug@
 		if (missionID and party.missionID==missionID or not missionID) then
 			GMC.list.widget:RemoveChild(party.missionID)
 			GMC.list.widget:DoLayout()
@@ -194,13 +208,13 @@ do
 				end
 				local party={members={},perc=0}
 				self:MCMatchMaker(missionID,party,settings.skipEpic,minimumChance)
---@debug@
+				--@debug@
 				print(missionID,"  Requested",class,";",minimumChance,"Mission",party.perc,party.full,settings)
---@end-debug@
+				--@end-debug@
 				if ( party.full and party.perc >= minimumChance) then
---@debug@
+					--@debug@
 					print(missionID,"  Acccepted",party)
---@end-debug@
+					--@end-debug@
 					local mb=AceGUI:Create("GMCMissionButton")
 					for i=1,#party.members do
 						GMCUsedFollowers[party.members[i]]=true
@@ -227,27 +241,27 @@ function module:GMC_OnClick_Run(this,button)
 	this:Disable()
 	GMC.logoutButton:Disable()
 	do
-	local elapsed=0
-	local co=coroutine.wrap(self.GMCRunMission)
-	self:RawHookScript(GMC.runButton,'OnUpdate',function(this,ts)
-		elapsed=elapsed+ts
-		if (elapsed>0.25) then
-			elapsed=0
-			local rc=co(self)
-			if (not rc) then
-				self:Unhook(GMC.runButton,'OnUpdate')
-				GMC.logoutButton:Enable()
+		local elapsed=0
+		local co=coroutine.wrap(self.GMCRunMission)
+		self:RawHookScript(GMC.runButton,'OnUpdate',function(this,ts)
+			elapsed=elapsed+ts
+			if (elapsed>0.25) then
+				elapsed=0
+				local rc=co(self)
+				if (not rc) then
+					self:Unhook(GMC.runButton,'OnUpdate')
+					GMC.logoutButton:Enable()
+				end
 			end
 		end
-	end
-	)
+		)
 	end
 end
 function module:GMC_OnClick_Start(this,button)
 	local GMC=GMF.MissionControlTab
---@debug@
-print(C("-------------------------------------------------","Yellow"))
---@end-debug@
+	--@debug@
+	print(C("-------------------------------------------------","Yellow"))
+	--@end-debug@
 	GMC.list.widget:ClearChildren()
 	if (self:GetTotFollowers(AVAILABLE) == 0) then
 		GMC.list.widget:SetTitle("All followers are busy")
@@ -275,149 +289,177 @@ print(C("-------------------------------------------------","Yellow"))

 end
 local chestTexture
+local function buildDragging(frame,drawItemButtons)
+	local GMC=GMF.MissionControlTab
+	frame:SetScript('OnClick', function(this)
+		settings.allowedRewards[this.key] = not settings.allowedRewards[this.key]
+		drawItemButtons()
+		GMC.startButton:Click()
+	end)
+	frame:SetScript('OnEnter', function(this)
+		GameTooltip:SetOwner(this, 'ANCHOR_BOTTOMRIGHT')
+		GameTooltip:AddLine(this.tooltip);
+		for _,line in ipairs(this.list) do
+			local info=GetItemInfo(line,2)
+			if info then GameTooltip:AddLine(info) end
+		end
+		GameTooltip:Show()
+	end)
+	frame:RegisterForDrag("LeftButton")
+	frame:SetMovable(true)
+	frame:SetScript("OnDragStart",function(this,button)
+			--@debug@
+			print("Start",this:GetName(),GetMouseFocus():GetName(),this:GetID(),this.key)
+			--@end-debug@
+			local f=GMC.ignoreFrames[this:GetID()+1]
+			if f then f:ClearAllPoints() end
+			this:StartMoving()
+			this.oldframestrata=this:GetFrameStrata()
+			this:SetFrameStrata("FULLSCREEN_DIALOG")
+	end)
+	frame:SetScript("OnDragStop",function(this,button)
+		this:StopMovingOrSizing()
+		--@debug@
+		print("Stopped",this:GetName(),GetMouseFocus():GetName(),this:GetID(),this.key)
+		--@end-debug@
+		this:SetFrameStrata(this.oldframestrata)
+	end)
+	frame:SetScript("OnReceiveDrag",function(this,...)
+			--@debug@
+			print("Receive",this:GetName(),GetMouseFocus():GetName(),this:GetID(),this.key,...)
+			--@end-debug@
+			local from=this:GetID()
+			local to
+			local x,y=this:GetCenter()
+			local id=this:GetID()
+			for i=1,#GMC.ignoreFrames do
+				local f=GMC.ignoreFrames[i]
+				if f:GetID() ~= id then
+					if f:IsMouseOver()  then
+						to=f:GetID()
+						break
+					end
+					if y>=f:GetBottom() and y<=f:GetTop() and x>=f:GetLeft() and x<=f:GetRight() then
+						to=f:GetID()
+						break
+					end
+				end
+			end
+			if (to) then
+				local appo=tremove(classlist,from)
+				tinsert(classlist,to,appo)
+				--@debug@
+				print(appo,"from:",from,"to:",to)
+				DevTools_Dump(classlist)
+				--@end-debug@
+			end
+			drawItemButtons()
+			--module:Refresh()
+	end)
+	frame:SetScript('OnLeave', function() GameTooltip:Hide() end)
+
+end
 local function drawItemButtons(frame)
 	local GMC=GMF.MissionControlTab
 	frame=frame or GMC.rewards
-	local scale=0.8
+	local scale=1.0
 	local h=37 -- itemButtonTemplate standard size
 	local gap=5
 	local single=settings.useOneChance
 	--for j = 1, #tItems do
-		--local i=tOrder[j]
-	for j,i in ipairs(tOrder) do
-		local frame = GMC.ignoreFrames[j] or CreateFrame('BUTTON', "Priority" .. j, frame, 'ItemButtonTemplate')
-		GMC.ignoreFrames[j] = frame
-		frame:SetID(j)
-		frame:ClearAllPoints()
-		frame:SetScale(scale)
-			--frame:SetPoint('TOPLEFT', 10,(j) * ((-h * scale) -gap))
-		if j==1 then
-			frame:SetPoint('TOPLEFT', 35,-35)
+	--local i=tOrder[j]
+	local wrap=#classlist/2 +1
+	for frameIndex,i in ipairs(classlist) do
+		local row = GMC.ignoreFrames[frameIndex]
+		if not row then
+		 	row= CreateFrame('BUTTON', "Priority" .. frameIndex, frame, 'ItemButtonTemplate')
+			row.chance=settings.rewardChance[row.key] or 100
+			GMC.ignoreFrames[frameIndex] = row
+			row.slider=row.slider or factory:Slider(row,0,100,row.chance,row.chance)
+			row.slider:SetWidth(128)
+			row.slider:SetPoint('BOTTOMLEFT',row,'BOTTOMRIGHT',15,0)
+			row.slider.Text:SetFontObject('NumberFont_Outline_Med')
+			row.slider.isPercent=true
+			row.slider:SetScript("OnValueChanged",function(this,value)
+				settings.rewardChance[this:GetParent().key]=this:OnValueChanged(value)
+				module:Refresh()
+			end
+			)
+			row.chest = row.chest or row:CreateTexture(nil, 'BACKGROUND')
+			row.chest:SetTexture('Interface\\Garrison\\GarrisonMissionUI2.blp')
+			row.chest:SetAtlas(chestTexture)
+			row.chest:SetSize((209-(209*0.25))*0.30, (155-(155*0.25)) * 0.30)
+			row.chest:SetPoint('CENTER',row.slider, 0, 15)
+			buildDragging(row,drawItemButtons)
+		end
+		row:SetID(frameIndex)
+		row:ClearAllPoints()
+		row:SetScale(scale)
+		--frame:SetPoint('TOPLEFT', 10,(j) * ((-h * scale) -gap))
+		if frameIndex==1 then
+			row:SetPoint('TOPLEFT', 10,-35)
+		elseif frameIndex==wrap then
+			row:SetPoint('TOPRIGHT', -(10 + 145),-35)
 		else
-			frame:SetPoint('TOPLEFT', GMC.ignoreFrames[j-1],'BOTTOMLEFT',0,-6)
+			row:SetPoint('TOPLEFT', GMC.ignoreFrames[frameIndex-1],'BOTTOMLEFT',0,-5)
 		end
-		frame.icon:SetTexture(tItems[i].i)
-		frame.key=tItems[i].key
-		tSort[frame.key]=j
-		frame.tooltip=tItems[i].t
-		frame.allowed=settings.allowedRewards[frame.key]
-		frame.chance=settings.rewardChance[frame.key]
-		frame.icon:SetDesaturated(not frame.allowed)
-		if frame.key=="itemLevel" then
-			frame.Count:SetText(settings.minLevel)
-			frame.Count:SetPoint('BOTTOMRIGHT',0,5)
-			frame.Count:Show()
-		elseif frame.key=="followerUpgrade" then
-			frame.Count:SetText(settings.minUpgrade)
-			frame.Count:Show()
+		row.icon:SetTexture(tItems[i].i)
+		row.key=tItems[i].key
+		class2order[row.key]=frameIndex
+		row.tooltip=tItems[i].t
+		row.list=tItems[i].list
+		row.allowed=settings.allowedRewards[row.key]
+		row.chance=settings.rewardChance[row.key] or 100
+		row.icon:SetDesaturated(not row.allowed)
+		if row.key=="itemLevel" then
+			row.Count:SetText(settings.minLevel)
+			row.Count:SetJustifyH("RIGHT")
+			row.Count:SetPoint('BOTTOMRIGHT',0,5)
+			row.Count:Show()
+		elseif row.key=="followerUpgrade" then
+			row.Count:SetText(settings.minUpgrade)
+			row.Count:SetJustifyH("RIGHT")
+			row.Count:SetPoint('BOTTOMRIGHT',0,5)
+			row.Count:Show()
 		else
-			frame.Count:Hide()
+			row.Count:Hide()
 		end
 		-- Need to resave them asap in order to populate the array for future scans
-		settings.allowedRewards[frame.key]=frame.allowed
-		settings.rewardChance[frame.key]=frame.chance
-		frame.slider=frame.slider or factory:Slider(frame,0,100,frame.chance or 100,frame.chance or 100)
-		frame.slider:SetWidth(128)
-		frame.slider:SetPoint('BOTTOMLEFT',60,0)
-		frame.slider.Text:SetFontObject('NumberFont_Outline_Med')
+		settings.allowedRewards[row.key]=row.allowed
+		settings.rewardChance[row.key]=row.chance
+		--row.slider:OnValueChanged(row.chance)
+		row.slider:SetValue(row.chance)
 		if (single) then
-			frame.slider.Text:SetTextColor(C.Silver())
+			row.slider:SetTextColor(C.Silver())
 		else
-			frame.slider.Text:SetTextColor(C.Green())
+			row.slider:SetTextColor(C.Green())
 		end
-		frame.slider.isPercent=true
-		frame.slider:SetScript("OnValueChanged",function(this,value)
-			settings.rewardChance[this:GetParent().key]=this:OnValueChanged(value)
-			end
-		)
-		frame.slider:OnValueChanged(settings.rewardChance[frame.key] or 100)
+		row.slider:OnValueChanged(settings.rewardChance[row.key] or 100)
 		--frame.slider:SetText(settings.rewardChance[frame.key])
-		frame.chest = frame.chest or frame:CreateTexture(nil, 'BACKGROUND')
-		frame.chest:SetTexture('Interface\\Garrison\\GarrisonMissionUI2.blp')
-		frame.chest:SetAtlas(chestTexture)
-		frame.chest:SetSize((209-(209*0.25))*0.30, (155-(155*0.25)) * 0.30)
-		frame.chest:SetPoint('CENTER',frame.slider, 0, 15)
 		if (single) then
-			frame.chest:SetDesaturated(true)
+			row.chest:SetDesaturated(true)
 		else
-			frame.chest:SetDesaturated(false)
+			row.chest:SetDesaturated(false)
 		end
-		frame.chest:Show()
-		frame:SetScript('OnClick', function(this)
-			settings.allowedRewards[this.key] = not settings.allowedRewards[this.key]
-			drawItemButtons()
-			GMC.startButton:Click()
-		end)
-		frame:SetScript('OnEnter', function(this)
-			GameTooltip:SetOwner(this, 'ANCHOR_BOTTOMRIGHT')
-			GameTooltip:AddLine(this.tooltip);
-			GameTooltip:Show()
-		end)
-		frame:RegisterForDrag("LeftButton")
-		frame:SetMovable(true)
-		frame:SetScript("OnDragStart",function(this,button)
-
---@debug@
-print("Start",this:GetID(),this.key)
---@end-debug@
-			this:StartMoving()
-			this.oldframestrata=this:GetFrameStrata()
-			this:SetFrameStrata("FULLSCREEN_DIALOG")
-		end)
-		frame:SetScript("OnDragStop",function(this,button)
-			this:StopMovingOrSizing()
-
---@debug@
-print("Stopped",this:GetID(),this.key)
---@end-debug@
-			this:SetFrameStrata(this.oldframestrata)
-
-		end)
-		frame:SetScript("OnReceiveDrag",function(this)
-
---@debug@
-print("Receive",this:GetID(),this.key)
---@end-debug@
-				local from=this:GetID()
-				local to
-				local x,y=this:GetCenter()
-				local id=this:GetID()
-				for i=1,#GMC.ignoreFrames do
-					local f=GMC.ignoreFrames[i]
-					if f:GetID() ~= id then
-						if y>=f:GetBottom() and y<=f:GetTop() then
-							to=f:GetID()
-						end
-					end
-				end
-				if (to) then
-
---@debug@
-print("from:",from,"to:",to)
---@end-debug@
-					local appo=tremove(tOrder,from)
-					tinsert(tOrder,to,appo)
-				end
-				drawItemButtons()
-				GMC.startButton:Click()
-		end)
-		frame:SetScript('OnLeave', function() GameTooltip:Hide() end)
-		frame:Show()
-		frame.top=frame:GetTop()
-		frame.bottom=frame:GetBottom()
+		row.chest:Show()
+		row:Show()
+		row.top=row:GetTop()
+		row.bottom=row:GetBottom()
 	end
 	if not GMC.rewardinfo then
 		GMC.rewardinfo = frame:CreateFontString()
 		local info=GMC.rewardinfo
 		info:SetFontObject('GameFontHighlight')
-		info:SetText("Click to enable/disable a reward.\nDrag to reorder")
+		info:SetText("Click to enable/disable a reward. Drag to reorder")
 		info:SetTextColor(1, 1, 1)
 		info:SetPoint("BOTTOM",0,-5)
 	end
-	frame:SetWidth(200)
 	return GMC.ignoreFrames[#tItems]
 end
 local function dbfixV1()
+--@debug@
+	print('dbfixV1')
+--@debug-end@
 	if type(settings.allowedRewards['equip'])~='nil' then
 		settings.allowedRewards['itemLevel']=settings.allowedRewards['equip']
 		settings.rewardChance['itemLevel']=settings.rewardChance['equip']
@@ -430,15 +472,62 @@ local function dbfixV1()
 		settings.allowedRewards['followerEquip']=nil
 		settings.rewardChance['followerEquip']=nil
 	end
+	settings.version=2
+end
+local function dbfixV2()
+--@debug@
+	print('dbfixV2')
+--@debug-end@
+	local old=
+		{
+			'gold',
+			'resources',
+			'oil',
+			'rush',
+			'xp',
+			'followerUpgrade',
+			'itemLevel',
+			'apexis',
+			'seal',
+			'other'
+		}
+	settings.rewardList={}
+	settings.itemIgnoreList=nil
+	local a=settings.rewardList
+	if type(settings.rewardOrder)=="table" then
+		for _,i in ipairs(settings.rewardOrder) do
+			if old[i] ~='-' then
+				tinsert(a,old[i])
+				old[i]='-'
+			end
+		end
+	end
+	for  _,v in ipairs(old) do
+		if v~='-' then
+			tinsert(a,v)
+		end
+	end
+	for index,key in ipairs(a) do
+		class2order[key]=index
+	end
+	for _,v in ipairs(addon:GetRewardClasses()) do
+		if not class2order[v.key] then
+			tinsert(a,v.key)
+		end
+	end
+	settings.rewardOrder=nil
+	settings.version=3
 end
-local function toggleEpicWarning(warning)
+local function toggleEpicWarning()
 	local GMC=GMF.MissionControlTab
+	local warning=GMC.warning
+	if not warning then return end
 	if (settings.skipEpic) then
 		warning:Show()
-		GMC.duration:SetPoint("TOPLEFT",GMC.rewards,"TOPRIGHT",0,-30)
+		GMC.list.widget:SetPoint("TOPLEFT",GMC.chance,"TOPRIGHT",0,ns.bigscreen and -60 or -50)
 	else
 		warning:Hide()
-		GMC.duration:SetPoint("TOPLEFT",GMC.rewards,"TOPRIGHT",0,0)
+		GMC.list.widget:SetPoint("TOPLEFT",GMC.chance,"TOPRIGHT",0,-30)
 	end
 end
 function module:OnInitialized()
@@ -449,29 +538,17 @@ function module:OnInitialized()
 	local GMC = CreateFrame('FRAME', nil, GMF)
 	GMF.MissionControlTab=GMC
 	settings=chardb.missionControl
-	tOrder=settings.rewardOrder
 	if settings.version < 2 then
 		dbfixV1()
 	end
-	if false then
-		local aa={}
-		for k,v in pairs(tOrder) do aa[k]=v end
-		for k,v in pairs(aa) do tOrder[k]=nil end
-		wipe(tOrder)
-		for i=1,#tItems do
-			tinsert(tOrder,i)
-		end
-		_G.tOrder=tOrder
-	end
-	if #tOrder<#tItems then
-		for i=#tOrder+1,#tItems do
-			tOrder[i]=i
-		end
+	if settings.version < 3 or type(settings.rewardOrder)=='table' then
+		dbfixV2()
 	end
-	for i=1,#tOrder do
-		tSort[tItems[tOrder[i]].key]=i
-	end
-
+	wipe(class2order)
+	classlist=settings.rewardList
+	for index,key in ipairs(classlist) do
+		class2order[key]=index
+	end
 	if settings.itemPrio then
 		settings.itemPrio=nil
 	end
@@ -489,19 +566,22 @@ function module:OnInitialized()
 	local rewards=GMC.rewards
 	local list=GMC.list
 	local flags=GMC.flags
-	rewards:SetPoint("TOPLEFT",20,-25)
-	rewards:SetPoint("BOTTOMLEFT",20,25)
-	list.widget:SetPoint("TOPLEFT",duration,"TOPRIGHT",0,-30)
+	list.widget:SetPoint("TOPLEFT",chance,"TOPRIGHT",0,-30)
 	list.widget:SetPoint("BOTTOMRIGHT",GMF,"BOTTOMRIGHT",-25,25)
-	--duration:SetPoint("TOPLEFT",rewards,"TOPRIGHT",0,-50) Now, its position is decided in toggleEpicWarning
-	chance:SetPoint("TOPLEFT",duration,"BOTTOMLEFT",0,0)
-	flags:SetPoint("TOPLEFT",chance,"BOTTOMLEFT",0,0)
---@debug@
---	AddBackdrop(rewards)
---	AddBackdrop(duration,0,1,0)
---	AddBackdrop(chance,0,0,1)
---	AddBackdrop(flags,0,1,1)
---@end-debug@
+	duration:SetPoint("TOPLEFT",20,-25)
+	chance:SetPoint("TOPLEFT",duration,"TOPRIGHT",0,0)
+	rewards:SetPoint("TOPLEFT",duration,"BOTTOMLEFT",0,0)
+	rewards:SetPoint("BOTTOMLEFT",20,25)
+	toggleEpicWarning()
+	if flags then
+		flags:SetPoint("TOPLEFT",chance,"BOTTOMLEFT",0,0)
+	end
+	--@debug@
+	--AddBackdrop(rewards)
+	--AddBackdrop(duration,0,1,0)
+	--AddBackdrop(chance,0,0,1)
+	--	AddBackdrop(flags,0,1,1)
+	--@end-debug@
 	GMC.Credits=GMC:CreateFontString(nil,"ARTWORK","QuestFont_Shadow_Small")
 	GMC.Credits:SetWidth(0)
 	GMC.Credits:SetFormattedText(C(L["Original concept and interface by %s"],'Yellow'),C("Motig","Red") )
@@ -511,6 +591,7 @@ function module:OnInitialized()
 end
 local refreshTimer
 function module:Refresh()
+	if not GMF.MissionControlTab.startButton then return end
 	if GMF.MissionControlTab.startButton:IsEnabled() and not IsMouseButtonDown("LeftButton") then
 		self:GMC_OnClick_Start(GMF.MissionControlTab.startButton,"LeftUp")
 	else
@@ -525,25 +606,18 @@ function module:GMCBuildChance()
 	local GMC=GMF.MissionControlTab
 	--Chance
 	local frame= CreateFrame('FRAME', nil, GMC)
-	frame:SetSize(210, 170)
-
-	GMC.cc = frame:CreateFontString() --title
-	GMC.cc:SetFontObject('GameFontNormalHuge')
-	GMC.cc:SetText(L['Success Chance'])
-	GMC.cc:SetPoint('TOP', 0, -5)
-	GMC.cc:SetTextColor(C:White())
-
+	frame:SetSize(210, 165)
 	GMC.cp = frame:CreateTexture(nil, 'BACKGROUND') --Chest
 	GMC.cp:SetTexture('Interface\\Garrison\\GarrisonMissionUI2.blp')
 	GMC.cp:SetAtlas(chestTexture)
 	GMC.cp:SetDesaturated(not settings.useOneChance)
 	GMC.cp:SetSize((209-(209*0.25))*0.60, (155-(155*0.25))*0.60)
-	GMC.cp:SetPoint('CENTER', 0, 20)
+	GMC.cp:SetPoint('CENTER', 0, 40)

 	GMC.ct = frame:CreateFontString() --Chance number
 	GMC.ct:SetFontObject('ZoneTextFont')
 	GMC.ct:SetFormattedText('%d%%',settings.minimumChance)
-	GMC.ct:SetPoint('CENTER', 0,20)
+	GMC.ct:SetPoint('CENTER', 0,25)
 	if settings.useOneChance then
 		GMC.ct:SetTextColor(C:Green())
 	else
@@ -552,9 +626,10 @@ function module:GMCBuildChance()
 	GMC.cs = factory:Slider(frame,0,100,settings.minimumChance,L['Minumum needed chance'],L["Mission with lower success chance will be ignored"]) -- Slider
 	GMC.cs:SetPoint('CENTER', 0, -25)
 	GMC.cs:SetScript('OnValueChanged', function(self, value)
-			local value = math.floor(value)
-			GMC.ct:SetText(value..'%')
-			settings.minimumChance = value
+		local value = math.floor(value)
+		GMC.ct:SetText(value..'%')
+		settings.minimumChance = value
+		module:Refresh()
 	end)
 	GMC.cs:SetValue(settings.minimumChance)
 	GMC.ck=factory:Checkbox(frame,settings.useOneChance,L["Global success chance"],L["Unchecking this will allow you to set specific success chance for each reward type"])
@@ -569,6 +644,7 @@ function module:GMCBuildChance()
 			GMC.ct:SetTextColor(C.Silver())
 		end
 		drawItemButtons()
+		module:Refresh()
 	end)
 	return frame
 end
@@ -587,78 +663,98 @@ local function timeslidechange(this,value)
 	GMC.mt:SetTextColor(1, c, c)
 	GMC.mt:SetFormattedText("%d-%dh",settings.minDuration,settings.maxDuration)
 end
+function addon:ApplyGCMINLEVEL(value)
+	settings.minLevel=value
+	drawItemButtons()
+	module:Refresh()
+end
+function addon:ApplyGCMINUPGRADE(value)
+	settings.minUpgrade=value
+	drawItemButtons()
+	module:Refresh()
+end
+function addon:ApplyGCSKIPEPIC(value)
+	settings.skipEpic=value
+	toggleEpicWarning()
+	module:Refresh()
+end
+function addon:ApplyGCSKIPRARE(value)
+	settings.skipRare=value
+	module:Refresh()
+end
 function module:GMCBuildFlags()
-	-- Duration
 	local GMC=GMF.MissionControlTab
-	local frame= CreateFrame('FRAME', nil, GMC) -- Flags frame
-	frame:SetSize(210, 30+40*5)
-	local title = frame:CreateFontString() -- Title
-	title:SetFontObject('GameFontNormalHuge')
-	title:SetText(L['Other settings'])
-	title:SetPoint('TOPLEFT', 0, -5)
-	title:SetPoint('TOPRIGHT', 0, -5)
-	title:SetTextColor(1, 1, 1)
-	title:SetJustifyH("CENTER")
-	GMC.skipRare=factory:Checkbox(frame,settings.skipRare,L["Ignore rare missions"],L["Rare missions will not be considered"])
-	GMC.skipRare:SetPoint("TOPLEFT",title,"BOTTOMLEFT",0,-5)
-	GMC.skipRare:SetScript("OnClick",function(this)
-		settings.skipRare=this:GetChecked()
-		module:GMC_OnClick_Start(GMC.startButton,"LeftUp")
-	end)
-	local warning=GMC:CreateFontString(nil,"ARTWORK","CombatTextFont")
+	local warning=GMC:CreateFontString(nil,"ARTWORK",ns.bigscreen and "GameFontNormalHuge" or "GameFontNormal")
 	warning:SetText(L["Epic followers are NOT sent alone on xp only missions"])
-	warning:SetPoint("TOPLEFT",GMC.rewards,"TOPRIGHT",0,0)
+	warning:SetPoint("TOPLEFT",GMC.chance,"TOPRIGHT",0,0)
 	warning:SetPoint("TOPRIGHT",GMC,"TOPRIGHT",0,-25)
 	warning:SetJustifyH("CENTER")
 	warning:SetTextColor(C.Orange())
-	toggleEpicWarning(warning)
-	GMC.skipEpic=factory:Checkbox(frame,settings.skipEpic,L["Ignore epic for xp missions."],L["IF you have a Salvage Yard you probably dont want to have this one checked"])
-	GMC.skipEpic:SetPoint("TOPLEFT",GMC.skipRare,"BOTTOMLEFT",0,-5)
-	GMC.skipEpic:SetScript("OnClick",function(this)
-		settings.skipEpic=this:GetChecked()
-		toggleEpicWarning(warning)
-		module:Refresh()
-	end)
-	GMC.minLevel=factory:Slider(frame,540,715,settings.minLevel,L["Item minimum level"],L['Minimum requested level for equipment rewards'])
-	GMC.minLevel:SetPoint('TOP', GMC.skipEpic,"BOTTOM",0, -25)
-	GMC.minLevel:SetScript('OnValueChanged', function(self, value)
+	GMC.warning=warning
+	if true then
+		addon:AddLabel(L["Mission Control"])
+		addon:AddSlider("GCMINLEVEL",settings.minLevel,535,715,L["Item minimum level"],L['Minimum requested level for equipment rewards'],15)
+		addon:AddSlider("GCMINUPGRADE",settings.minUpgrade,600,675,L["Follower set minimum upgrade"],L['Minimum requested upgrade for followers set (Enhancements are always included)'],15)
+		addon:AddToggle("GCSKIPEPIC",settings.skipEpic,L["Ignore epic for xp missions."],L["IF you have a Salvage Yard you probably dont want to have this one checked"])
+		addon:AddToggle("GCSKIPRARE",settings.skipRare,L["Ignore rare missions"],L["Rare missions will not be considered"])
+	else
+		-- Duration
+		local frame= CreateFrame('FRAME', nil, GMC) -- Flags frame
+		frame:SetSize(210, 30+40*5)
+		local title = frame:CreateFontString() -- Title
+		title:SetFontObject('GameFontNormalHuge')
+		title:SetText(L['Other settings'])
+		title:SetPoint('TOPLEFT', 0, -5)
+		title:SetPoint('TOPRIGHT', 0, -5)
+		title:SetTextColor(1, 1, 1)
+		title:SetJustifyH("CENTER")
+		GMC.skipRare=factory:Checkbox(frame,settings.skipRare,L["Ignore rare missions"],L["Rare missions will not be considered"])
+		GMC.skipRare:SetPoint("TOPLEFT",title,"BOTTOMLEFT",0,-5)
+		GMC.skipRare:SetScript("OnClick",function(this)
+			settings.skipRare=this:GetChecked()
+			module:GMC_OnClick_Start(GMC.startButton,"LeftUp")
+		end)
+		GMC.skipEpic=factory:Checkbox(frame,settings.skipEpic,L["Ignore epic for xp missions."],L["IF you have a Salvage Yard you probably dont want to have this one checked"])
+		GMC.skipEpic:SetPoint("TOPLEFT",GMC.skipRare,"BOTTOMLEFT",0,-5)
+		GMC.skipEpic:SetScript("OnClick",function(this)
+			settings.skipEpic=this:GetChecked()
+			toggleEpicWarning(warning)
+			module:Refresh()
+		end)
+		GMC.minLevel=factory:Slider(frame,540,715,settings.minLevel,L["Item minimum level"],L['Minimum requested level for equipment rewards'])
+		GMC.minLevel:SetPoint('TOP', GMC.skipEpic,"BOTTOM",0, -25)
+		GMC.minLevel:SetScript('OnValueChanged', function(self, value)
 			local value = math.floor(value)
 			settings.minLevel = value
 			drawItemButtons()
 			module:Refresh()
-	end)
-	--GMC.minLevel:SetValue(settings.minLevel)
-	GMC.minLevel:SetStep(15)
-	GMC.minUpgrade=factory:Slider(frame,600,675,settings.minUpgrade,L["Follower set minimum upgrade"],L['Minimum requested upgrade for followers set (Enhancements are always included)'])
-	GMC.minUpgrade:SetPoint('TOP', GMC.minLevel,"BOTTOM",0, -25)
-	GMC.minUpgrade:SetScript('OnValueChanged', function(self, value)
+		end)
+		--GMC.minLevel:SetValue(settings.minLevel)
+		GMC.minLevel:SetStep(15)
+		GMC.minUpgrade=factory:Slider(frame,600,675,settings.minUpgrade,L["Follower set minimum upgrade"],L['Minimum requested upgrade for followers set (Enhancements are always included)'])
+		GMC.minUpgrade:SetPoint('TOP', GMC.minLevel,"BOTTOM",0, -25)
+		GMC.minUpgrade:SetScript('OnValueChanged', function(self, value)
 			local value = math.floor(value)
 			settings.minUpgrade = value
 			drawItemButtons()
 			module:Refresh()
-	end)
-	--GMC.minUpgrade:SetValue(settings.minUpgrade)
-	GMC.minUpgrade:SetStep(15)
-	return frame
+		end)
+		--GMC.minUpgrade:SetValue(settings.minUpgrade)
+		GMC.minUpgrade:SetStep(15)
+		return frame
+	end
 end
 function module:GMCBuildDuration()
 	-- Duration
 	local GMC=GMF.MissionControlTab
-	local frame= CreateFrame('FRAME', nil, GMC) -- Dutation frame
-	frame:SetSize(210, 220)
+	local frame= CreateFrame('FRAME', 'PIPPO', GMC) -- Dutation frame
+	frame:SetSize(210, 165)
 	frame:SetPoint('TOP',0, -20)

-	GMC.mdt = frame:CreateFontString() -- Title
-	GMC.mdt:SetFontObject('GameFontNormalHuge')
-	GMC.mdt:SetText(L['Mission Duration'])
-	GMC.mdt:SetPoint('TOP', 0, -5)
-	GMC.mdt:SetTextColor(1, 1, 1)
-
-
 	GMC.hg = frame:CreateTexture(nil, 'BACKGROUND') -- Hourglass
 	GMC.hg:SetTexture('Interface\\Timer\\Challenges-Logo.blp')
 	GMC.hg:SetSize(7, 70)
-	GMC.hg:SetPoint('CENTER', 0, 0)
+	GMC.hg:SetPoint('CENTER', 0, 10)
 	GMC.hg:SetBlendMode('ADD')

 	GMC.rune = frame:CreateTexture(nil, 'BACKGROUND') --Rune
@@ -666,7 +762,7 @@ function module:GMCBuildDuration()
 	--bb:SetTexture('dungeons\\textures\\devices\\mm_clockface_01.blp')
 	GMC.rune:SetTexture('World\\Dungeon\\Challenge\\clockRunes.blp')
 	GMC.rune:SetSize(80, 80)
-	GMC.rune:SetPoint('CENTER', 0, 0)
+	GMC.rune:SetPoint('CENTER', 0, 10)
 	GMC.rune:SetBlendMode('ADD')

 	GMC.mt = frame:CreateFontString() -- Duration string over hourglass
@@ -677,7 +773,7 @@ function module:GMCBuildDuration()

 	GMC.ms1 = factory:Slider(frame,0,24,settings.minDuration,L['Minimum mission duration.'])
 	GMC.ms2 = factory:Slider(frame,0,24,settings.maxDuration,L['Maximum mission duration.'])
-	GMC.ms1:SetPoint('TOP', frame,'TOP',0, -45)
+	GMC.ms1:SetPoint('TOP', frame,'TOP',0, -10)
 	GMC.ms2:SetPoint('BOTTOM', frame,'BOTTOM',0, 15)
 	GMC.ms2.max=true
 	GMC.ms1:SetScript('OnValueChanged', timeslidechange)
@@ -690,6 +786,7 @@ function module:GMCBuildRewards()
 	--Allowed rewards
 	local GMC=GMF.MissionControlTab
 	local frame = CreateFrame('FRAME', nil, GMC)
+	frame:SetWidth(420)
 	GMC.itf = frame:CreateFontString()
 	GMC.itf:SetFontObject('GameFontNormalHuge')
 	GMC.itf:SetText(L['Allowed Rewards'])
diff --git a/ShipYard.lua b/ShipYard.lua
index d817abc..4507706 100644
--- a/ShipYard.lua
+++ b/ShipYard.lua
@@ -47,6 +47,7 @@ function module:OnInitialize()
 	self:SafeSecureHook("GarrisonShipyardMapMission_OnLeave")
 	local ref=GSFMissions.CompleteDialog.BorderFrame.ViewButton

+
 --@debug@
 print(ref)
 --@end-debug@
@@ -138,6 +139,7 @@ function module:ScriptMapButtonOnClick(this)
 end
 function module:HookedGSF_OnClickMission(this,missionInfo)
 	self:FillMissionPage(missionInfo)
+	self:RefreshFollowerStatus()
 end
 function module:HookedGarrisonFollowerButton_UpdateCounters(gsf,frame,follower,showcounter,lastupdate)
 	if follower.followerTypeID~=LE_FOLLOWER_TYPE_SHIPYARD_6_2 then return end
@@ -172,6 +174,9 @@ print("Doing one time initialization for",this:GetName(),...)
 	GCS=addon:CreateHeader(self)
 	self:ScriptGarrisonShipyardFrame_OnShow()
 	self:SafeHookScript(GSF,"OnShow")
+	GSF.FollowerStatusInfo=GSF:CreateFontString(nil, "BORDER", "GameFontNormal")
+	GSF.FollowerStatusInfo:SetPoint("TOPRIGHT",-30,-5)
+	GSF.FollowerStatusInfo:Show()
 end
 function module:ScriptGarrisonShipyardFrame_OnShow()
 	GCS:Show()
@@ -180,7 +185,7 @@ function module:ScriptGarrisonShipyardFrame_OnShow()
 	GSF:SetPoint("TOPLEFT",GCS,"BOTTOMLEFT",0,23)
 	GSF:SetPoint("TOPRIGHT",GCS,"BOTTOMRIGHT",0,23)
 	self:RefreshMenu()
-
+	self:RefreshFollowerStatus()
 --@debug@
 print("Doing all time initialization")
 --@end-debug@
@@ -319,6 +324,31 @@ function module:ShowEnhancements()
 	end
 	u:Show()
 end
+do
+	local s=setmetatable({},{__index=function(t,k) return 0 end})
+	local FOLLOWER_STATUS_FORMAT="Ship status: " ..
+								C(AVAILABLE..':%d ','green') ..
+								C(GARRISON_FOLLOWER_ON_MISSION .. ":%d ",'red')
+	function module:RefreshFollowerStatus()
+
+		wipe(s)
+		for _,followerID in self:GetShipsIterator() do
+			local status=self:GetFollowerStatus(followerID)
+			s[status]=s[status]+1
+		end
+		if (GSF.FollowerStatusInfo) then
+			GSF.FollowerStatusInfo:SetWidth(0)
+			GSF.FollowerStatusInfo:SetFormattedText(
+				FOLLOWER_STATUS_FORMAT,
+				s[AVAILABLE],
+				s[GARRISON_FOLLOWER_ON_MISSION]
+				)
+		end
+	end
+	function module:GetTotFollowers(status)
+		return s[status] or 0
+	end
+end
 --[[ Follower
 displayHeight = 0.25
 followerTypeID = 2
diff --git a/embeds.xml b/embeds.xml
index 0474c94..a9575d2 100644
--- a/embeds.xml
+++ b/embeds.xml
@@ -11,5 +11,6 @@
 	<Include file="libs\Ace3\AceLocale-3.0\AceLocale-3.0.xml"/>
 	<Include file="libs\Ace3\AceDB-3.0\AceDB-3.0.xml"/>
 	<Include file="libs\LibDeformat-3.0\lib.xml"/>
+	<Include file="libs\LibItemUpgradeInfo-1.0\LibItemUpgradeInfo-1.0.xml"/>
 	<Include file="libs\LibInit\LibInit.xml"/>
 </Ui>