bugfix(saveload): Serialize base state machine in TurretStateMachine and DozerActionStateMachine#2896
Conversation
…action state machines
|
| Filename | Overview |
|---|---|
| GeneralsMD/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp | Bumps TurretStateMachine xfer to version 2; gates StateMachine::xfer call behind version >= 2 guard; adds StateMachine::loadPostProcess chain |
| GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/DozerAIUpdate.cpp | Bumps DozerActionStateMachine xfer to version 2; gates StateMachine::xfer after existing m_task xfer; adds StateMachine::loadPostProcess chain |
| Generals/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp | Mirror of GeneralsMD fix — identical version bump and base-xfer chain for TurretStateMachine |
| Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/DozerAIUpdate.cpp | Mirror of GeneralsMD fix — identical version bump and base-xfer chain for DozerActionStateMachine |
Sequence Diagram
sequenceDiagram
participant Caller
participant DerivedSM as TurretStateMachine / DozerActionStateMachine
participant BaseSM as StateMachine
Note over Caller,BaseSM: Save (version 2)
Caller->>DerivedSM: xfer(xfer)
DerivedSM->>DerivedSM: "xferVersion(&version, 2)"
DerivedSM->>DerivedSM: "xferUser(&m_task) [DozerOnly]"
DerivedSM->>BaseSM: "StateMachine::xfer(xfer) [version>=2]"
BaseSM->>BaseSM: "xferVersion(&v, 1)"
BaseSM->>BaseSM: xfer sleepTill, defaultStateID, curStateID, snapshot, goal, lock
Note over Caller,BaseSM: Load (version 2)
Caller->>DerivedSM: xfer(xfer)
DerivedSM->>DerivedSM: xferVersion reads 2
DerivedSM->>DerivedSM: "xferUser(&m_task) [DozerOnly]"
DerivedSM->>BaseSM: "StateMachine::xfer(xfer) [version>=2]"
BaseSM->>BaseSM: restores m_currentState, goal, lock
Note over Caller,BaseSM: Load (version 1 - legacy save)
Caller->>DerivedSM: xfer(xfer)
DerivedSM->>DerivedSM: xferVersion reads 1
DerivedSM->>DerivedSM: "xferUser(&m_task) [DozerOnly]"
Note over DerivedSM: base xfer skipped - machine resets to default (old behaviour preserved)
Note over Caller,BaseSM: loadPostProcess (all versions)
Caller->>DerivedSM: loadPostProcess()
DerivedSM->>BaseSM: StateMachine::loadPostProcess() [no-op]
Reviews (5): Last reviewed commit: "fix(savegame): serialize base StateMachi..." | Re-trigger Greptile
…AIL_COMPATIBLE_XFER_SAVE
xezon
left a comment
There was a problem hiding this comment.
I observed save bug in USA 02: after save (not load) the Aircraft Carrier loses its target. Will this change fix that?
c4742a5 to
1bba86b
Compare
is there an issue and repro steps you can point me to? |
Repro:
Result: Planes stop attacking target. |
#2996 :) |
|
Needs to be replicated to Generals. |
…action state machines (Generals)
Fixes:
TurretStateMachine::xferandDozerActionStateMachine::xferoverride the base but never callStateMachine::xfer, so the active state ID, sleep timer, goal, and lock flag are never serialized. On load the machine snaps back to its default state.Now both chain to
StateMachine::xfer/loadPostProcess, matching every other state-machine subclass. Bumped to version 2 and gated the base call so existing version-1 saves still load. Audited all 18 StateMachine subclasses — these two were the only ones missing it.Todo: