feat(kæde): fanen Kæder og forslag i Kræver handling
This commit is contained in:
@@ -62,6 +62,8 @@ end
|
||||
|
||||
-- entry fra ADStorageStats.attentionList -> advice ("open"|"flow"|"produce"|"none"), info
|
||||
function SmartPickupFrame:attentionAdvice(entry)
|
||||
-- kæde-forslag har ingen vare (stat): klik fører til fanen Kæder
|
||||
if entry ~= nil and entry.kind == "chainSuggest" then return "chain", nil end
|
||||
if entry ~= nil and entry.kind == "sell" and entry.stat ~= nil then return sellAdviceFor(entry.stat) end
|
||||
if entry == nil or entry.kind ~= "empty" or entry.stat == nil then return "none", nil end
|
||||
local stat = entry.stat
|
||||
@@ -83,6 +85,7 @@ function SmartPickupFrame:attentionAdvice(entry)
|
||||
end
|
||||
|
||||
function SmartPickupFrame:attentionHint(advice, info)
|
||||
if advice == "chain" then return self.i18n:getText("spu_attention_hintChain") end
|
||||
if advice == "open" then return string.format(self.i18n:getText("spu_attention_hintOpen"), tostring(info.run.name)) end
|
||||
if advice == "flow" then return self.i18n:getText(info.sell and "spu_attention_hintSellFlow" or "spu_attention_hintFlow") end
|
||||
if advice == "produce" then return self.i18n:getText("spu_attention_hintProduce") end
|
||||
@@ -91,6 +94,10 @@ end
|
||||
|
||||
function SmartPickupFrame:onAttentionClick(entry)
|
||||
self:safe(function(frame)
|
||||
if entry ~= nil and entry.kind == "chainSuggest" then
|
||||
frame:switchTab(SmartPickupFrame.TAB_CHAINS)
|
||||
return
|
||||
end
|
||||
local adEnv = frame.getAdEnv()
|
||||
local advice, info = frame:attentionAdvice(entry)
|
||||
if adEnv == nil or advice == "none" then return end
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
-- Smart Pickup — fanen Kæder
|
||||
-- Produktionskæderne som træ: rod (produktion spilleren har tændt) -> varer -> råvarer, med kilde, behov pr.
|
||||
-- måned og flowstatus; afgrødeforslag kan godkendes/afvises og en rod sættes på pause. Rækkerne bygges af
|
||||
-- ADChainView (testet); her kun kloning, farve og klik. Evaluering højst hvert CHAIN_EVALUATE_MS (visning, handler ikke).
|
||||
|
||||
SmartPickupFrame.CHAIN_EVALUATE_MS = 5000
|
||||
|
||||
-- Spillets ur i ms; uden g_time evalueres ved hver opbygning (der kun sker hvert CHAIN_REBUILD_TICKS s).
|
||||
local function nowMs()
|
||||
return type(g_time) == "number" and g_time or nil
|
||||
end
|
||||
|
||||
function SmartPickupFrame:chainLast(adEnv, force)
|
||||
local now = nowMs()
|
||||
local due = force or ADChain.last == nil or now == nil or self.chainEvaluatedAt == nil
|
||||
or now - self.chainEvaluatedAt >= SmartPickupFrame.CHAIN_EVALUATE_MS
|
||||
if due then
|
||||
ADChain.evaluate(adEnv)
|
||||
self.chainEvaluatedAt = now
|
||||
end
|
||||
return ADChain.last
|
||||
end
|
||||
|
||||
function SmartPickupFrame:chainTitle(last, name)
|
||||
local title = last ~= nil and last.titles ~= nil and last.titles[name] or nil
|
||||
return title or self:fruitTitle(name)
|
||||
end
|
||||
|
||||
-- Klik på en kæde-knap: udfør, evaluér straks (ny visning) og genopbyg.
|
||||
function SmartPickupFrame:onChainAction(action)
|
||||
if action.kind == "approve" then
|
||||
ADChain.approve(action.fieldId)
|
||||
elseif action.kind == "dismiss" then
|
||||
ADChain.dismiss(action.fieldId)
|
||||
elseif action.kind == "pause" or action.kind == "resume" then
|
||||
ADChain.setPaused(action.rootKey, action.kind == "pause")
|
||||
end
|
||||
local adEnv = self.getAdEnv()
|
||||
if adEnv ~= nil then self:chainLast(adEnv, true) end
|
||||
self:requestRebuild()
|
||||
end
|
||||
|
||||
-- Række med prik + c1..c5 (flowListPrefab); knappen er c5 (klik i c5 = handling, som Flows-listen).
|
||||
function SmartPickupFrame:addChainRow(entry)
|
||||
local unpackFn = table.unpack or unpack
|
||||
local row = self:addRow(self.flowListPrefab, {kind = "chainRow"})
|
||||
local cells = {}
|
||||
for index = 1, 5 do cells[index] = row:getDescendantByName("c" .. index) end
|
||||
SmartPickupFrame.setCells(cells, entry.cells)
|
||||
local dot = row:getDescendantByName("dot")
|
||||
local color = ADFlowView.LEVEL_COLORS[entry.level or "running"]
|
||||
if dot ~= nil and dot.setImageColor ~= nil and color ~= nil then
|
||||
dot:setImageColor(nil, unpackFn(color))
|
||||
-- rækker uden egen status (forslag/afvis/auto) får ingen prik — kun rod og noder har status
|
||||
if entry.kind ~= "root" and entry.kind ~= "node" and dot.setVisible ~= nil then dot:setVisible(false) end
|
||||
end
|
||||
if cells[4] ~= nil and cells[4].setTextColor ~= nil and color ~= nil and entry.level ~= "running" then
|
||||
cells[4]:setTextColor(unpackFn(color))
|
||||
end
|
||||
if entry.action ~= nil then
|
||||
local action, actionCell = entry.action, cells[5]
|
||||
self:makeRowClickable(row, function(frame)
|
||||
local onButton = frame.lastClickX == nil or actionCell == nil or actionCell.absPosition == nil
|
||||
or frame.lastClickX >= actionCell.absPosition[1]
|
||||
if onButton then frame:onChainAction(action) end
|
||||
end)
|
||||
end
|
||||
return row
|
||||
end
|
||||
|
||||
function SmartPickupFrame:fillChainRows(adEnv)
|
||||
local i18n = self.i18n
|
||||
local last = self:chainLast(adEnv, false)
|
||||
local rows = ADChainView.rows(last, function(name) return self:chainTitle(last, name) end,
|
||||
SmartPickupFrame.formatCompact, function(key) return i18n:getText(key) end)
|
||||
for _, entry in ipairs(rows) do
|
||||
if entry.kind == "info" or entry.kind == "empty" then
|
||||
self:addTextRow(entry.text)
|
||||
else
|
||||
self:addChainRow(entry)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -16,8 +16,11 @@ SmartPickupFrame.TAB_OVERVIEW, SmartPickupFrame.TAB_FLOWS, SmartPickupFrame.TAB_
|
||||
SmartPickupFrame.MONTH_REBUILD_TICKS = 5
|
||||
-- Marksilo-fanen har klikbare valg: genopbygges sjældnere, så fokus ikke rykker midt i et valg
|
||||
SmartPickupFrame.FIELDSILO_REBUILD_TICKS = 30
|
||||
-- Kæder-fanen (gui/SmartPickupChainTab.lua): klikbare forslag/pause, så genopbygning sjældent (som Marksiloer)
|
||||
SmartPickupFrame.TAB_CHAINS = 10
|
||||
SmartPickupFrame.CHAIN_REBUILD_TICKS = 30
|
||||
-- Lagerfaner: én pr. bygningstype (indeks -> kind i ADSources.getFarmInventory)
|
||||
SmartPickupFrame.TAB_NAMES = {"spu_tab_overview", "spu_tab_flows", "spu_tab_fields", "spu_tab_month", "spu_tab_fieldsilos", "spu_tab_factories", "spu_tab_silos", "spu_tab_barns", "spu_tab_sheds"}
|
||||
SmartPickupFrame.TAB_NAMES = {"spu_tab_overview", "spu_tab_flows", "spu_tab_fields", "spu_tab_month", "spu_tab_fieldsilos", "spu_tab_factories", "spu_tab_silos", "spu_tab_barns", "spu_tab_sheds", "spu_tab_chains"}
|
||||
SmartPickupFrame.TAB_KINDS = {[6] = "factory", [7] = "silo", [8] = "husbandry", [9] = "objectStorage"}
|
||||
|
||||
function SmartPickupFrame.getTabKind(tab)
|
||||
@@ -466,6 +469,17 @@ function SmartPickupFrame:rebuild()
|
||||
self:restoreFocusIfLost()
|
||||
return
|
||||
end
|
||||
if self.currentTab == SmartPickupFrame.TAB_CHAINS then
|
||||
if adEnv ~= nil then
|
||||
self:fillChainRows(adEnv)
|
||||
end
|
||||
self.monthRebuildTicks = SmartPickupFrame.CHAIN_REBUILD_TICKS
|
||||
self:colorRows()
|
||||
self.boxLayout:invalidateLayout()
|
||||
self:refreshButtons()
|
||||
self:restoreFocusIfLost()
|
||||
return
|
||||
end
|
||||
if self.currentTab == SmartPickupFrame.TAB_MONTH then
|
||||
if adEnv ~= nil then
|
||||
self:fillMonthRows(adEnv)
|
||||
@@ -611,7 +625,8 @@ function SmartPickupFrame:refreshButtons()
|
||||
wanted = self.overviewButtons
|
||||
elseif self.currentTab == SmartPickupFrame.TAB_FIELDS then
|
||||
wanted = self:getFieldButtons()
|
||||
elseif self.currentTab == SmartPickupFrame.TAB_MONTH or self.currentTab == SmartPickupFrame.TAB_FIELDSILOS then
|
||||
elseif self.currentTab == SmartPickupFrame.TAB_MONTH or self.currentTab == SmartPickupFrame.TAB_FIELDSILOS
|
||||
or self.currentTab == SmartPickupFrame.TAB_CHAINS then
|
||||
wanted = self.monthButtons
|
||||
elseif SmartPickupFrame.getTabKind(self.currentTab) ~= nil then
|
||||
wanted = self.storageButtons
|
||||
@@ -636,7 +651,8 @@ function SmartPickupFrame:refreshLive()
|
||||
self:setStatusText(self.i18n:getText("spu_status_noAd"))
|
||||
return
|
||||
end
|
||||
if self.currentTab == SmartPickupFrame.TAB_MONTH or self.currentTab == SmartPickupFrame.TAB_FIELDSILOS then
|
||||
if self.currentTab == SmartPickupFrame.TAB_MONTH or self.currentTab == SmartPickupFrame.TAB_FIELDSILOS
|
||||
or self.currentTab == SmartPickupFrame.TAB_CHAINS then
|
||||
self.monthRebuildTicks = (self.monthRebuildTicks or 0) - 1
|
||||
if self.monthRebuildTicks <= 0 then self:requestRebuild() end
|
||||
self:refreshButtons()
|
||||
|
||||
@@ -183,8 +183,18 @@ function SmartPickupFrame:addKpiRow(stats)
|
||||
return row
|
||||
end
|
||||
|
||||
-- Varepunkterne + kædens afgrødeforslag (ADChain.last; ingen evaluering her), samme loft MAX_ATTENTION.
|
||||
function SmartPickupFrame:attentionFor(stats)
|
||||
local attention = ADStorageStats.attentionList(stats, SmartPickupFrame.MAX_ATTENTION)
|
||||
if ADChain == nil or ADChain.last == nil then return attention end
|
||||
return ADStorageStats.mergeAttention(attention, ADStorageStats.chainEntries(ADChain.last), SmartPickupFrame.MAX_ATTENTION)
|
||||
end
|
||||
|
||||
function SmartPickupFrame:alertText(entry)
|
||||
local stat, fc, i18n = entry.stat, SmartPickupFrame.formatCompact, self.i18n
|
||||
if entry.kind == "chainSuggest" then
|
||||
return string.format(i18n:getText("spu_attention_chainSuggest"), entry.fieldId or 0, tostring(entry.from), tostring(entry.to))
|
||||
end
|
||||
if entry.kind == "empty" then
|
||||
return string.format(i18n:getText("spu_alert_empty"), stat.title, self:formatDays(stat.days), fc(stat.farmLevel or 0), fc(math.abs(stat.net or 0)))
|
||||
elseif entry.kind == "full" then
|
||||
@@ -263,7 +273,7 @@ end
|
||||
function SmartPickupFrame:fillItemOverview(adEnv, inventory, fullInventory)
|
||||
local i18n = self.i18n
|
||||
local stats = self:computeItemStats(adEnv, inventory, fullInventory)
|
||||
local attention = ADStorageStats.attentionList(stats, SmartPickupFrame.MAX_ATTENTION)
|
||||
local attention = self:attentionFor(stats)
|
||||
self.itemView = {kpiRow = self:addKpiRow(stats), alertRows = {}, itemRows = {}, key = self:itemStructureKey(stats, attention)}
|
||||
self.itemRebuildTicks = SmartPickupFrame.ITEM_REBUILD_TICKS
|
||||
self:addTextRow(i18n:getText("spu_attention"))
|
||||
@@ -307,7 +317,7 @@ function SmartPickupFrame:refreshItemOverview(adEnv, inventory, fullInventory)
|
||||
local view = self.itemView
|
||||
if view == nil then return end
|
||||
local stats = self:computeItemStats(adEnv, inventory, fullInventory)
|
||||
local attention = ADStorageStats.attentionList(stats, SmartPickupFrame.MAX_ATTENTION)
|
||||
local attention = self:attentionFor(stats)
|
||||
if self:itemStructureKey(stats, attention) ~= view.key then
|
||||
self.itemRebuildTicks = (self.itemRebuildTicks or 0) - 1
|
||||
if self.itemRebuildTicks <= 0 then self:requestRebuild() end
|
||||
|
||||
Reference in New Issue
Block a user