Grow the recipe list on refresh
This commit is contained in:
1 parent
1a22c0083d
commit
32fa9d7737
1 file changed
+39
-11
+39
-11
@@ -498,6 +498,7 @@ end
|
|||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
local randResultCache = {}
|
local randResultCache = {}
|
||||||
|
local calcResultCache = {}
|
||||||
|
|
||||||
EID.bagOfCraftingOffset = 0
|
EID.bagOfCraftingOffset = 0
|
||||||
EID.bagOfCraftingCurPickupCount = -1
|
EID.bagOfCraftingCurPickupCount = -1
|
||||||
@@ -508,6 +509,8 @@ EID.icount = 0
|
|||||||
|
|
||||||
EID.lockedResults = nil
|
EID.lockedResults = nil
|
||||||
EID.refreshNextTick = false
|
EID.refreshNextTick = false
|
||||||
|
EID.refreshPosition = 0
|
||||||
|
EID.bagOfCraftingRefreshes = 0
|
||||||
EID.downHeld = 0
|
EID.downHeld = 0
|
||||||
EID.upHeld = 0
|
EID.upHeld = 0
|
||||||
|
|
||||||
@@ -616,19 +619,30 @@ function EID:handleBagOfCraftingRendering()
|
|||||||
|
|
||||||
local queryString = table.concat(itemQuery,",")
|
local queryString = table.concat(itemQuery,",")
|
||||||
if EID.lockedResults ~= nil then
|
if EID.lockedResults ~= nil then
|
||||||
results = randResultCache[EID.lockedResults]
|
results = calcResultCache[EID.lockedResults]
|
||||||
elseif randResultCache[queryString] == nil or EID.refreshNextTick then
|
elseif calcResultCache[queryString] == nil or EID.refreshNextTick then
|
||||||
local randResults = {}
|
--build on top of our previous recipe lists, if possible
|
||||||
|
local randResults = randResultCache[queryString] or {}
|
||||||
local skipRandom = false
|
local skipRandom = false
|
||||||
--check every single possible recipe for our highest value pickups
|
--check every single possible recipe for our highest value pickups
|
||||||
--limit it in the options, since the number of total combinations quickly grows (nCr):
|
--limit it in the options, since the number of total combinations quickly grows (nCr):
|
||||||
--12 = 495, 13 = 1287, 14 = 3003, 15 = 6435, 16 = 12870
|
--12 = 495, 13 = 1287, 14 = 3003, 15 = 6435, 16 = 12870
|
||||||
local mostValuable = {}
|
local mostValuable = {}
|
||||||
|
|
||||||
|
--shift our thorough check forward one ingredient each refresh (it will find duplicates, but spamming refresh will get a lot of variety)
|
||||||
|
if (EID.refreshNextTick) then
|
||||||
|
EID.bagOfCraftingRefreshes = EID.bagOfCraftingRefreshes + 1
|
||||||
|
if (#itemQuery >= EID.Config["BagOfCraftingCombinationMax"] + EID.bagOfCraftingRefreshes) then
|
||||||
|
for i=1,EID.Config["BagOfCraftingCombinationMax"] do
|
||||||
|
mostValuable[i] = itemQuery[i+EID.bagOfCraftingRefreshes]
|
||||||
|
end
|
||||||
|
end
|
||||||
--we have less items than our threshold; every single recipe will be listed
|
--we have less items than our threshold; every single recipe will be listed
|
||||||
if (#itemQuery <= EID.Config["BagOfCraftingCombinationMax"]) then
|
elseif (#itemQuery <= EID.Config["BagOfCraftingCombinationMax"]) then
|
||||||
mostValuable = itemQuery
|
mostValuable = itemQuery
|
||||||
skipRandom = true
|
skipRandom = true
|
||||||
else
|
else
|
||||||
|
--grab the X most valuable ingredients
|
||||||
for i=1,EID.Config["BagOfCraftingCombinationMax"] do
|
for i=1,EID.Config["BagOfCraftingCombinationMax"] do
|
||||||
mostValuable[i] = itemQuery[i]
|
mostValuable[i] = itemQuery[i]
|
||||||
end
|
end
|
||||||
@@ -649,7 +663,7 @@ function EID:handleBagOfCraftingRendering()
|
|||||||
combinations(arr,length-1,i+1,tempResult)
|
combinations(arr,length-1,i+1,tempResult)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
combinations(mostValuable)
|
if (#mostValuable >= 8) then combinations(mostValuable) end
|
||||||
|
|
||||||
--do random pulls for some more recipe choices
|
--do random pulls for some more recipe choices
|
||||||
if (not skipRandom) then
|
if (not skipRandom) then
|
||||||
@@ -679,22 +693,33 @@ function EID:handleBagOfCraftingRendering()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
randResultCache[queryString] = calcResults
|
calcResultCache[queryString] = calcResults
|
||||||
|
randResultCache[queryString] = randResults
|
||||||
results = calcResults
|
results = calcResults
|
||||||
--sort our final results by quality, then alphabetical item name
|
--sort our final results by quality, then alphabetical item name
|
||||||
table.sort(results, function(a, b)
|
table.sort(results, function(a, b)
|
||||||
if (EID.itemWeightsLookup[a[2]] == EID.itemWeightsLookup[b[2]]) then
|
if EID.itemWeightsLookup[a[2]] == EID.itemWeightsLookup[b[2]] then
|
||||||
return (EID:getObjectName(5, 100, a[2]) < EID:getObjectName(5, 100, b[2]))
|
return (EID:getObjectName(5, 100, a[2]) < EID:getObjectName(5, 100, b[2]))
|
||||||
else
|
else
|
||||||
return (EID.itemWeightsLookup[a[2]] > EID.itemWeightsLookup[b[2]])
|
return (EID.itemWeightsLookup[a[2]] > EID.itemWeightsLookup[b[2]])
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
--don't reset our location on refresh, so you can more easily refresh for lower quality recipes
|
if not EID.refreshNextTick then
|
||||||
if (not EID.refreshNextTick) then EID.bagOfCraftingOffset = 0 end
|
EID.bagOfCraftingOffset = 0
|
||||||
|
EID.bagOfCraftingRefreshes = 0
|
||||||
|
--jump to the item we were looking at before, so you can more easily refresh for variants of recipes
|
||||||
|
elseif EID.bagOfCraftingOffset > 0 then
|
||||||
|
for k,v in ipairs(results) do
|
||||||
|
if (v[2] == EID.refreshPosition) then
|
||||||
|
EID.bagOfCraftingOffset = k-1
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
EID.refreshNextTick = false
|
EID.refreshNextTick = false
|
||||||
else
|
else
|
||||||
results = randResultCache[queryString]
|
results = calcResultCache[queryString]
|
||||||
end
|
end
|
||||||
|
|
||||||
if #results == 0 then
|
if #results == 0 then
|
||||||
@@ -746,7 +771,10 @@ function EID:handleBagOfCraftingRendering()
|
|||||||
else EID.lockedResults = nil end
|
else EID.lockedResults = nil end
|
||||||
--refresh the recipes
|
--refresh the recipes
|
||||||
elseif Input.IsActionTriggered(ButtonAction.ACTION_SHOOTRIGHT, EID.player.ControllerIndex) then
|
elseif Input.IsActionTriggered(ButtonAction.ACTION_SHOOTRIGHT, EID.player.ControllerIndex) then
|
||||||
if (EID.lockedResults == nil) then EID.refreshNextTick = true end
|
if (EID.lockedResults == nil) then
|
||||||
|
EID.refreshNextTick = true
|
||||||
|
if (results[EID.bagOfCraftingOffset+1]) then EID.refreshPosition = results[EID.bagOfCraftingOffset+1][2] end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
--scroll pages quickly if the button is held
|
--scroll pages quickly if the button is held
|
||||||
if Input.IsActionPressed(ButtonAction.ACTION_SHOOTDOWN, EID.player.ControllerIndex) and Isaac.GetTime() - EID.downHeld > 750 then
|
if Input.IsActionPressed(ButtonAction.ACTION_SHOOTDOWN, EID.player.ControllerIndex) and Isaac.GetTime() - EID.downHeld > 750 then
|
||||||
|
|||||||
Reference in new issue
Block a user