Skip to content

Commit f5bd576

Browse files
authored
Feature/#321 craft queue (#344)
* concentrationCosts update refactor to consider optional reagents * ConcentrationToggle wip * more concentration fixes * also update simulation mode as workaround * Simulation Mode Concentration Toggles
1 parent 0a55907 commit f5bd576

File tree

11 files changed

+240
-72
lines changed

11 files changed

+240
-72
lines changed

Classes/CraftQueue.lua

+1-12
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ function CraftSim.CraftQueue:RestoreFromDB()
213213
return nil
214214
end)
215215

216-
-- at last restore subrecipe target mode item counts (and recipes)
216+
-- at last restore subrecipes)
217217
self:UpdateSubRecipesTargetItemCounts()
218218

219219
print("CraftQueue Restore Finished")
@@ -253,11 +253,6 @@ function CraftSim.CraftQueue:FilterSortByPriority()
253253
end)
254254
local sortedCharacterRecipes = GUTIL:Sort(characterRecipesNoAltDependency,
255255
function(a, b)
256-
if a:IsTargetCountSatisfied() and not b:IsTargetCountSatisfied() then
257-
return false
258-
elseif not a:IsTargetCountSatisfied() and b:IsTargetCountSatisfied() then
259-
return true
260-
end
261256
if a.allowedToCraft and not b.allowedToCraft then
262257
return true
263258
elseif not a.allowedToCraft and b.allowedToCraft then
@@ -281,12 +276,6 @@ function CraftSim.CraftQueue:FilterSortByPriority()
281276

282277
-- then sort the rest items by subrecipedepth and character names / profit
283278
local sortedRestRecipes = GUTIL:Sort(restRecipes, function(a, b)
284-
if a:IsTargetCountSatisfied() and not b:IsTargetCountSatisfied() then
285-
return false
286-
elseif not a:IsTargetCountSatisfied() and b:IsTargetCountSatisfied() then
287-
return true
288-
end
289-
290279
if a.recipeData.subRecipeDepth > b.recipeData.subRecipeDepth then
291280
return true
292281
elseif a.recipeData.subRecipeDepth < b.recipeData.subRecipeDepth then

Classes/CraftQueueItem.lua

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ function CraftSim.CraftQueueItem:new(options)
2020
self.recipeData = options.recipeData
2121
---@type number
2222
self.amount = options.amount or 1
23+
self.concentrating = self.recipeData.concentrating
2324

2425
-- canCraft caches
2526
self.allowedToCraft = false
@@ -41,7 +42,9 @@ end
4142
--- calculates allowedToCraft, canCraftOnce, gearEquipped, correctProfessionOpen, notOnCooldown and craftAbleAmount
4243
function CraftSim.CraftQueueItem:CalculateCanCraft()
4344
CraftSim.DEBUG:StartProfiling('CraftSim.CraftQueueItem:CalculateCanCraft')
44-
self.canCraftOnce, self.craftAbleAmount = self.recipeData:CanCraft(1)
45+
local _, craftAbleAmount = self.recipeData:CanCraft(1)
46+
self.craftAbleAmount = craftAbleAmount
47+
self.canCraftOnce = craftAbleAmount > 0
4548
self.gearEquipped = self.recipeData.professionGearSet:IsEquipped() or false
4649
self.correctProfessionOpen = self.recipeData:IsProfessionOpen() or false
4750
self.notOnCooldown = not self.recipeData:OnCooldown()
@@ -59,6 +62,7 @@ end
5962
---@class CraftSim.CraftQueueItem.Serialized
6063
---@field recipeID number
6164
---@field amount? number
65+
---@field concentrating? boolean
6266
---@field crafterData CraftSim.CrafterData
6367
---@field requiredReagents CraftSim.Reagent.Serialized[]
6468
---@field optionalReagents CraftingReagentInfo[]
@@ -75,6 +79,7 @@ function CraftSim.CraftQueueItem:Serialize()
7579
local serializedData = {
7680
recipeID = recipeData.recipeID,
7781
crafterData = recipeData.crafterData,
82+
concentrating = recipeData.concentrating,
7883
requiredReagents = recipeData.reagentData:SerializeRequiredReagents(),
7984
optionalReagents = recipeData.reagentData:GetOptionalCraftingReagentInfoTbl(),
8085
professionGearSet = recipeData.professionGearSet:Serialize(),
@@ -94,6 +99,7 @@ function CraftSim.CraftQueueItem:Serialize()
9499

95100
local serializedCraftQueueItem = serializeCraftQueueRecipeData(self.recipeData)
96101
serializedCraftQueueItem.amount = self.amount
102+
serializedCraftQueueItem.concentrating = self.concentrating
97103

98104
return serializedCraftQueueItem
99105
end
@@ -110,6 +116,7 @@ function CraftSim.CraftQueueItem:Deserialize(serializedData)
110116
local recipeData = CraftSim.RecipeData(serializedCraftQueueItem.recipeID, nil, nil,
111117
serializedCraftQueueItem.crafterData)
112118
recipeData.subRecipeDepth = serializedCraftQueueItem.subRecipeDepth or 0
119+
recipeData.concentrating = serializedCraftQueueItem.concentrating
113120
recipeData.subRecipeCostsEnabled = serializedCraftQueueItem.subRecipeCostsEnabled
114121
recipeData.parentRecipeInfo = serializedCraftQueueItem.parentRecipeInfo or {}
115122

Classes/ReagentData.lua

+14-11
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ function CraftSim.ReagentData:GetMaxSkillFactor()
185185
return rr:GetCraftingReagentInfoByQuality(3, true)
186186
end)
187187

188+
-- explicitly do not use concentration flag here
189+
188190
print("max quality reagents crafting tbl:")
189191
print(maxQualityReagentsCraftingTbl, true)
190192

@@ -193,14 +195,14 @@ function CraftSim.ReagentData:GetMaxSkillFactor()
193195
local operationInfoWithReagents = nil
194196
if self.recipeData.orderData then
195197
baseOperationInfo = C_TradeSkillUI.GetCraftingOperationInfoForOrder(recipeID, {},
196-
self.recipeData.orderData.orderID, self.recipeData.concentrating)
198+
self.recipeData.orderData.orderID, false)
197199
operationInfoWithReagents = C_TradeSkillUI.GetCraftingOperationInfoForOrder(recipeID,
198-
maxQualityReagentsCraftingTbl, self.recipeData.orderData.orderID, self.recipeData.concentrating)
200+
maxQualityReagentsCraftingTbl, self.recipeData.orderData.orderID, false)
199201
else
200202
baseOperationInfo = C_TradeSkillUI.GetCraftingOperationInfo(recipeID, {}, self.recipeData.allocationItemGUID,
201-
self.recipeData.concentrating)
203+
false)
202204
operationInfoWithReagents = C_TradeSkillUI.GetCraftingOperationInfo(recipeID, maxQualityReagentsCraftingTbl,
203-
self.recipeData.allocationItemGUID, self.recipeData.concentrating)
205+
self.recipeData.allocationItemGUID, false)
204206
end
205207

206208
if baseOperationInfo and operationInfoWithReagents then
@@ -228,31 +230,32 @@ function CraftSim.ReagentData:GetMaxSkillFactor()
228230
end
229231

230232
---@return number skillWithReagents
231-
---@return number concentrationCosts
232-
function CraftSim.ReagentData:GetSkillAndConcentrationCostFromRequiredReagents()
233+
function CraftSim.ReagentData:GetSkillFromRequiredReagents()
233234
local requiredTbl = self:GetRequiredCraftingReagentInfoTbl()
234235

235236
local recipeID = self.recipeData.recipeID
236237

238+
-- explicitly do not u use concentration here
239+
237240
local baseOperationInfo = nil
238241
local operationInfoWithReagents = nil
239242
if self.recipeData.orderData then
240243
baseOperationInfo = C_TradeSkillUI.GetCraftingOperationInfoForOrder(recipeID, {},
241-
self.recipeData.orderData.orderID, self.recipeData.concentrating)
244+
self.recipeData.orderData.orderID, false)
242245
operationInfoWithReagents = C_TradeSkillUI.GetCraftingOperationInfoForOrder(recipeID, requiredTbl,
243-
self.recipeData.orderData.orderID, self.recipeData.concentrating)
246+
self.recipeData.orderData.orderID, false)
244247
else
245248
baseOperationInfo = C_TradeSkillUI.GetCraftingOperationInfo(recipeID, {}, self.recipeData.allocationItemGUID,
246-
self.recipeData.concentrating)
249+
false)
247250
operationInfoWithReagents = C_TradeSkillUI.GetCraftingOperationInfo(recipeID, requiredTbl,
248-
self.recipeData.allocationItemGUID, self.recipeData.concentrating)
251+
self.recipeData.allocationItemGUID, false)
249252
end
250253

251254
if baseOperationInfo and operationInfoWithReagents then
252255
local baseSkill = baseOperationInfo.baseSkill + baseOperationInfo.bonusSkill
253256
local skillWithReagents = operationInfoWithReagents.baseSkill + operationInfoWithReagents.bonusSkill
254257

255-
return skillWithReagents - baseSkill, operationInfoWithReagents.concentrationCost or 0
258+
return skillWithReagents - baseSkill
256259
end
257260
print("ReagentData: Could not determine required reagent skill: operationInfos nil")
258261
return 0

Classes/RecipeData.lua

+33-5
Original file line numberDiff line numberDiff line change
@@ -453,14 +453,31 @@ function CraftSim.RecipeData:SetNonQualityReagentsMax()
453453
end
454454
end
455455

456+
function CraftSim.RecipeData:GetConcentrationCosts()
457+
-- includes required and optionals
458+
local allReagentsTbl = self.reagentData:GetCraftingReagentInfoTbl()
459+
-- on purpose do not use concentration so we will always get the costs
460+
local operationInfo
461+
if self.orderData then
462+
operationInfo = C_TradeSkillUI.GetCraftingOperationInfoForOrder(self.recipeID, allReagentsTbl,
463+
self.orderData.orderID,
464+
false)
465+
else
466+
operationInfo = C_TradeSkillUI.GetCraftingOperationInfo(self.recipeID, allReagentsTbl, self.allocationItemGUID,
467+
false)
468+
end
469+
470+
return (operationInfo and operationInfo.concentrationCost) or 0
471+
end
472+
456473
-- Update the professionStats property of the RecipeData according to set reagents and gearSet (and any stat modifiers)
457474
function CraftSim.RecipeData:UpdateProfessionStats()
458-
local skillRequiredReagents, concentrationCost = self.reagentData:GetSkillAndConcentrationCostFromRequiredReagents()
475+
local skillRequiredReagents = self.reagentData:GetSkillFromRequiredReagents()
459476
local optionalStats = self.reagentData:GetProfessionStatsByOptionals()
460477
local itemStats = self.professionGearSet.professionStats
461478
local buffStats = self.buffData.professionStats
462479

463-
self.concentrationCost = concentrationCost or 0
480+
self.concentrationCost = self:GetConcentrationCosts()
464481

465482
self.professionStats:Clear()
466483

@@ -503,6 +520,8 @@ function CraftSim.RecipeData:Copy()
503520
---@type CraftSim.RecipeData
504521
local copy = CraftSim.RecipeData(self.recipeID, self.isRecraft, self.orderData ~= nil, self.crafterData)
505522
copy.concentrating = self.concentrating
523+
copy.concentrationCost = self.concentrationCost
524+
copy.concentrationData = self.concentrationData and self.concentrationData:Copy()
506525
copy.reagentData = self.reagentData:Copy(copy)
507526
copy.cooldownData = self.cooldownData:Copy()
508527
copy.professionGearSet = self.professionGearSet:Copy()
@@ -511,7 +530,6 @@ function CraftSim.RecipeData:Copy()
511530
copy.professionStatModifiers = self.professionStatModifiers:Copy()
512531
copy.priceData = self.priceData:Copy(copy)
513532
copy.resultData = self.resultData:Copy(copy)
514-
copy.concentrationData = self.concentrationData:Copy()
515533
copy.orderData = self.orderData
516534
copy.crafterData = self.crafterData
517535
copy.subRecipeCostsEnabled = self.subRecipeCostsEnabled
@@ -734,10 +752,13 @@ function CraftSim.RecipeData:Craft(amount)
734752
if self.isEnchantingRecipe then
735753
local vellumLocation = GUTIL:GetItemLocationFromItemID(CraftSim.CONST.ENCHANTING_VELLUM_ID)
736754
if vellumLocation then
737-
C_TradeSkillUI.CraftEnchant(self.recipeID, amount, craftingReagentInfoTbl, vellumLocation)
755+
C_TradeSkillUI.CraftEnchant(self.recipeID, amount, craftingReagentInfoTbl, vellumLocation, self
756+
.concentrating)
738757
end
739758
else
740-
C_TradeSkillUI.CraftRecipe(self.recipeID, amount, craftingReagentInfoTbl)
759+
C_TradeSkillUI.CraftRecipe(self.recipeID, amount, craftingReagentInfoTbl, nil,
760+
self.orderData and self.orderData.orderID,
761+
self.concentrating)
741762
end
742763
end
743764

@@ -760,6 +781,13 @@ function CraftSim.RecipeData:CanCraft(amount)
760781

761782
local isChargeRecipe = self.cooldownData.maxCharges > 0
762783

784+
local concentrationAmount = math.huge
785+
if self.concentrating and self.concentrationCost > 0 then
786+
concentrationAmount = math.floor(self.concentrationData:GetCurrentAmount() / (self.concentrationCost * amount))
787+
end
788+
789+
craftAbleAmount = math.min(craftAbleAmount, concentrationAmount)
790+
763791
if not isChargeRecipe then
764792
return hasEnoughReagents, craftAbleAmount
765793
else

Libs/GUTIL

Submodule GUTIL updated 1 file

Locals/enUS.lua

+1
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ greater or equal the configured sale rate threshold.
550550
[CraftSim.CONST.TEXT.CRAFT_QUEUE_EDIT_RECIPE_CRAFTING_COSTS_LABEL] = "Crafting Costs: ",
551551
[CraftSim.CONST.TEXT.CRAFT_QUEUE_EDIT_RECIPE_AVERAGE_PROFIT_LABEL] = "Average Profit: ",
552552
[CraftSim.CONST.TEXT.CRAFT_QUEUE_EDIT_RECIPE_RESULTS_LABEL] = "Results",
553+
[CraftSim.CONST.TEXT.CRAFT_QUEUE_EDIT_RECIPE_CONCENTRATION_CHECKBOX] = " Concentration",
553554
[CraftSim.CONST.TEXT.CRAFT_QUEUE_AUCTIONATOR_SHOPPING_LIST_PER_CHARACTER_CHECKBOX] = "Per Character",
554555
[CraftSim.CONST.TEXT.CRAFT_QUEUE_AUCTIONATOR_SHOPPING_LIST_PER_CHARACTER_CHECKBOX_TOOLTIP] = "Create an " ..
555556
f.bb("Auctionator Shopping List") .. " for each crafter character\ninstead of one shopping list for all",

0 commit comments

Comments
 (0)