From 0cac934480fabd8ae9255ff56e9bdc46bca38b98 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Tue, 29 Sep 2026 18:01:44 +0200 Subject: [PATCH] fix: Fields under Stop alt-pause vises stoppet med [Start], [Start] genoptager kun den mark; listen skjules bag redigeringsvinduet (tekst skinnede igennem) (v1.59.3.0) --- FS25_ADSmartPickup/adFieldJobs.lua | 21 ++++++++++++--- FS25_ADSmartPickup/adFieldView.lua | 11 ++++++-- .../gui/SmartPickupEditPanel.lua | 3 +++ .../gui/SmartPickupFieldTab.lua | 26 +++++++++++++++---- FS25_ADSmartPickup/l10n/l10n_da.xml | 1 + FS25_ADSmartPickup/l10n/l10n_en.xml | 1 + FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_fieldStatus.lua | 7 +++++ 8 files changed, 60 insertions(+), 12 deletions(-) diff --git a/FS25_ADSmartPickup/adFieldJobs.lua b/FS25_ADSmartPickup/adFieldJobs.lua index 2968159..80301eb 100644 --- a/FS25_ADSmartPickup/adFieldJobs.lua +++ b/FS25_ADSmartPickup/adFieldJobs.lua @@ -291,6 +291,16 @@ function ADFieldJobs.awaitingPlayer(fieldId) return nil end +-- Under global pause: kun denne mark genoptages (de andre venter på Start alle). nil = pause igen. +function ADFieldJobs.setFieldResumed(id, isOn) + ADFieldJobs.state.resumed = ADFieldJobs.state.resumed or {} + ADFieldJobs.state.resumed[id] = isOn ~= false or nil +end + +function ADFieldJobs.isFieldResumed(id) + return (ADFieldJobs.state.resumed or {})[id] == true +end + function ADFieldJobs.requestStart(id) ADFieldJobs.note(id, {startRequested = true}) end @@ -313,6 +323,7 @@ end -- Pause (Stop alt og parkér): intet nyt sendes ud, ingen genstart efter indlæsning. Gemmes. function ADFieldJobs.setPaused(value) ADFieldJobs.state.paused = value == true + ADFieldJobs.state.resumed = {} ADFieldJobs.save() Logging.info(ADFieldJobs.LOG_PREFIX .. "markarbejde %s", value and "på pause" or "genoptaget") end @@ -492,9 +503,11 @@ function ADFieldJobs.tick(adEnv, dt) -- lidt efter start, og indtil da ligner de maskiner ledige (in-game 26/9: kultivatoren blev taget midt -- i spillerens eget CP-job 45 s efter indlæsning) if ADFieldJobs.now < ADFieldJobs.STARTUP_GRACE_MS then return end - -- Stop alt og parkér: intet sendes ud og intet genstartes, før spilleren trykker Start alle - if ADFieldJobs.state.paused then return end - if not ADFieldJobs.resumedAfterLoad then + -- Stop alt og parkér: intet sendes ud og intet genstartes, før spilleren trykker Start alle — undtagen + -- marker spilleren har genoptaget enkeltvis ([Start] i Fields-listen, ADFieldJobs.setFieldResumed) + local paused, resumed = ADFieldJobs.state.paused, ADFieldJobs.state.resumed or {} + if paused and next(resumed) == nil then return end + if not paused and not ADFieldJobs.resumedAfterLoad then -- én gang, før noget nyt sendes ud: CP-maskiner der var midt i et job, fortsætter (og tæller som aktive) ADFieldJobs.resumedAfterLoad = true local okResume, errResume = pcall(ADFieldWork.resumeAfterLoad, adEnv) @@ -507,7 +520,7 @@ function ADFieldJobs.tick(adEnv, dt) if ADPool ~= nil then infos = ADPool.queueOrder(infos, ADFieldJobs.waitingSince) end for index, info in ipairs(infos) do -- passive marker (der sker intet uden brugeren) vurderes kun i deres tiendedel af sekunderne - if not ADFieldModel.isPassive(ADFieldJobs.getField(info.id)) or index % ADFieldJobs.PASSIVE_SLICES == slice then + if (not paused or resumed[info.id]) and (not ADFieldModel.isPassive(ADFieldJobs.getField(info.id)) or index % ADFieldJobs.PASSIVE_SLICES == slice) then stepped = stepped + 1 local ok, err = pcall(stepField, adEnv, info, env) if not ok then Logging.warning(ADFieldJobs.LOG_PREFIX .. "F%s fejl: %s", tostring(info.id), tostring(err)) end diff --git a/FS25_ADSmartPickup/adFieldView.lua b/FS25_ADSmartPickup/adFieldView.lua index 5de24bc..d9ce235 100644 --- a/FS25_ADSmartPickup/adFieldView.lua +++ b/FS25_ADSmartPickup/adFieldView.lua @@ -88,12 +88,19 @@ ADFieldView.ERROR_REASONS = { spu_field_reason_tooNarrow = true, spu_field_reason_widthUnknown = true, spu_field_reason_noSowFruit = true, } --- s = {hasMarker, working, awaiting, startRequested, reasonKey} -> "running"|"waiting"|"error"|"stopped" +-- Arbejder marken reelt? Under global pause (Stop alt) kun hvis spilleren har genoptaget netop den. +-- s = {working, paused, resumed} +function ADFieldView.isActiveWork(s) + return s.working == true and (not s.paused or s.resumed == true) +end + +-- s = {hasMarker, working, paused, resumed, awaiting, startRequested, reasonKey} -> "running"|"waiting"|"error"|"stopped" function ADFieldView.fieldStatus(s) if not s.hasMarker then return "error" end if s.reasonKey ~= nil and ADFieldView.ERROR_REASONS[s.reasonKey] then return "error" end + if s.paused and not s.resumed then return "stopped" end if s.awaiting or s.startRequested then return "waiting" end - if s.working then return s.reasonKey ~= nil and "waiting" or "running" end + if ADFieldView.isActiveWork(s) then return s.reasonKey ~= nil and "waiting" or "running" end if s.reasonKey ~= nil then return "waiting" end return "stopped" end diff --git a/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua b/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua index 3be64c7..6f96731 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua @@ -76,6 +76,8 @@ function SmartPickupFrame:openEditPanel(kind, id) self.editPanelOpen, self.editPanelKind, self.editPanelId = true, kind, id self:closeGuide() self.editOverlay:setVisible(true) + -- listen skjules bag vinduet: dens tekster skinnede igennem panelet (in-game 29/9) + self.boxLayout:setVisible(false) self:layoutEditPanel() self:requestRebuild() end @@ -85,6 +87,7 @@ function SmartPickupFrame:hideEditPanel() self.editPanelOpen, self.editPanelKind, self.editPanelId = false, nil, nil self:clearPanelRows() if self.editOverlay ~= nil then self.editOverlay:setVisible(false) end + if self.boxLayout ~= nil then self.boxLayout:setVisible(true) end end function SmartPickupFrame:closeEditPanel() diff --git a/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua b/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua index c94bf29..d1a3af0 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua @@ -109,7 +109,8 @@ function SmartPickupFrame:fieldCells(row) return { name, crop, self:fieldPlanText(field, info), self.i18n:getText(field.plan.mode == "auto" and "spu_field_mode_auto" or "spu_field_mode_manual"), - self:fieldStatusText(field, info, true), + self:fieldStatusText(field, info, true) .. ((ADFieldJobs.state.paused and not ADFieldJobs.isFieldResumed(info.id) + and ADFieldModel.isWorking(field)) and (" " .. self.i18n:getText("spu_field_pausedSuffix")) or ""), ADFlowView.joinCounted(names, ", ", "-"), self:fieldActionText(info.id), } @@ -168,12 +169,19 @@ function SmartPickupFrame:refreshFieldLevels() end end +-- Arbejder marken reelt (ikke bare et plan-trin under Stop alt-pause)? +function SmartPickupFrame:fieldIsActive(id, field) + field = field or ADFieldJobs.getField(id) + return field ~= nil and ADFieldView.isActiveWork({working = ADFieldModel.isWorking(field), + paused = ADFieldJobs.state.paused == true, resumed = ADFieldJobs.isFieldResumed(id)}) +end + -- [Start] kræver en markør (Stop/Overtag altid muligt når marken arbejder). function SmartPickupFrame:fieldCanStart(id) local field, info = ADFieldJobs.getField(id), ADFields.getInfo(id) if field == nil or info == nil then return false end return ADFieldView.canStart({hasMarker = info.markerId ~= nil, - working = ADFieldModel.isWorking(field) or ADFieldJobs.awaitingPlayer(id) ~= nil}) + working = self:fieldIsActive(id, field) or ADFieldJobs.awaitingPlayer(id) ~= nil}) end function SmartPickupFrame:fieldLevel(id) @@ -181,6 +189,7 @@ function SmartPickupFrame:fieldLevel(id) if field == nil or info == nil then return "stopped" end local reason = type(field.reason) == "table" and field.reason.key or nil return ADFieldView.fieldStatus({hasMarker = info.markerId ~= nil, working = ADFieldModel.isWorking(field), + paused = ADFieldJobs.state.paused == true, resumed = ADFieldJobs.isFieldResumed(id), awaiting = ADFieldJobs.awaitingPlayer(id) ~= nil, startRequested = ADFieldJobs.isStartRequested ~= nil and ADFieldJobs.isStartRequested(id) or false, reasonKey = reason}) @@ -190,7 +199,7 @@ end function SmartPickupFrame:fieldActionText(id, forButton) local field = ADFieldJobs.getField(id) if ADFieldJobs.awaitingPlayer(id) ~= nil then return self.i18n:getText("spu_field_button_takeover") end - local isWorking = field ~= nil and ADFieldModel.isWorking(field) + local isWorking = self:fieldIsActive(id, field) if forButton then return self.i18n:getText(isWorking and "spu_field_button_stop" or "spu_field_button_start") end return self.i18n:getText(isWorking and "spu_flowList_stop" or "spu_flowList_start") end @@ -340,7 +349,7 @@ function SmartPickupFrame:refreshFieldRows(adEnv) if row ~= nil then SmartPickupFrame.setCells(entry.cells, self:fieldCells(row)) total = total + 1 - if ADFieldModel.isWorking(row.field) then working = working + 1 end + if self:fieldIsActive(entry.id, row.field) then working = working + 1 end end end self:refreshFieldLevels() @@ -386,9 +395,16 @@ function SmartPickupFrame:toggleField(id) ADFieldJobs.requestTakeover(id) frame.statusOverride = string.format(frame.i18n:getText("spu_field_takeoverRequested"), id) frame.statusOverrideTicks = SmartPickupFrame.STATUS_OVERRIDE_TICKS - elseif ADFieldModel.isWorking(field) then + elseif frame:fieldIsActive(id, field) then ADFieldJobs.stopField(frame.getAdEnv(), id) + ADFieldJobs.setFieldResumed(id, false) + elseif ADFieldJobs.state.paused and ADFieldModel.isWorking(field) then + -- Stop alt-pause: kun denne mark genoptages fra sit trin (de andre venter på Start alle) + ADFieldJobs.setFieldResumed(id, true) + frame.statusOverride = string.format(frame.i18n:getText("spu_field_startRequested"), id) + frame.statusOverrideTicks = SmartPickupFrame.STATUS_OVERRIDE_TICKS else + if ADFieldJobs.state.paused then ADFieldJobs.setFieldResumed(id, true) end local decision = ADFieldJobs.lastDecision[id] if decision == nil or decision.care == nil then ADFieldJobs.forceReady(id) diff --git a/FS25_ADSmartPickup/l10n/l10n_da.xml b/FS25_ADSmartPickup/l10n/l10n_da.xml index 25b1873..2c15d26 100644 --- a/FS25_ADSmartPickup/l10n/l10n_da.xml +++ b/FS25_ADSmartPickup/l10n/l10n_da.xml @@ -260,6 +260,7 @@ + diff --git a/FS25_ADSmartPickup/l10n/l10n_en.xml b/FS25_ADSmartPickup/l10n/l10n_en.xml index bd79ade..62c24ca 100644 --- a/FS25_ADSmartPickup/l10n/l10n_en.xml +++ b/FS25_ADSmartPickup/l10n/l10n_en.xml @@ -260,6 +260,7 @@ + diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 54846aa..3ff5b7c 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.59.2.0 + 1.59.3.0 <en>AD Smart Pickup</en> diff --git a/tests/test_fieldStatus.lua b/tests/test_fieldStatus.lua index ad7cdbd..da70c62 100644 --- a/tests/test_fieldStatus.lua +++ b/tests/test_fieldStatus.lua @@ -22,5 +22,12 @@ check("i ro", V.fieldStatus({hasMarker = true}), "stopped") check("kan starte: med markør", V.canStart({hasMarker = true, working = false}), true) check("kan starte: uden markør -> nej", V.canStart({hasMarker = false, working = false}), false) check("kan stoppe: uden markør men i gang", V.canStart({hasMarker = false, working = true}), true) +-- global pause (Stop alt): arbejdstrin uden maskiner = stoppet, [Start] genoptager kun den mark (in-game 29/9) +check("pause: arbejdstrin -> stoppet", V.fieldStatus({hasMarker = true, working = true, paused = true}), "stopped") +check("pause: genoptaget mark -> kører", V.fieldStatus({hasMarker = true, working = true, paused = true, resumed = true}), "running") +check("pause: mangler markør stadig rød", V.fieldStatus({hasMarker = false, paused = true}), "error") +check("pause: arbejder-tæller falsk", V.isActiveWork({working = true, paused = true}), false) +check("pause: genoptaget arbejder-tæller sand", V.isActiveWork({working = true, paused = true, resumed = true}), true) +check("ingen pause: arbejder", V.isActiveWork({working = true}), true) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)