LANTERN purge B3+B5: delete the cycle/core/win-lose spine + onboarding; save epoch v7
Deletes CyclePhaseSystem, GoalReachedSystem, CoreDamage/CoreRestore, ThreatDirector, CoreIntegrity/GoalProgress/RunPhase/RunOutcome/ThreatState components, CoreVisualFeedbackSystem, and the whole Client/Onboarding slice (+6 test files). Keepers reworked: RunDirectorSystem (UpdateBefore attr + launch guard + goal/threat bank removed; sole SaveRequest raiser now), CycleDirectorSpawnSystem (ledger/meta host only), WaveSystem UNGATED (waves run wherever a WaveDirector is baked), EnemyAISystem core-fallback stripped, AmbientAudioSystem reworked (bed + run cues; no CycleState gate), MusicSystem RunInfo-only, HudSystem big trim (goal meter, core bar, siege banner, terminal banner, outcome flash, onboarding hook all gone), MetaShop/ClassPrep/AimReticle siege gates dropped, DebugOverlay/ops re-meant (SpawnWave=force next wave, EndSiege=quiet arena; SetCalm/AdvanceGoal/SetHeat retired, bytes reserved), TuningConfig Core knobs retired (ids 20-23 reserved), StorageMath.DrainFraction deleted, HowToPlay copy rewritten. Save epoch v7 (fresh epoch, operator-approved): SaveData drops goal/core/outcome + conveyor/machine-IO fields; MinLoadableVersion=7; PendingSave/PendingStructure trimmed; RollTerminalCampaignForward deleted; SaveStructureScan signature slimmed. 390 tests green; Play world-creation clean (player + waves live, no exceptions). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,67 +21,38 @@ namespace ProjectM.Simulation
|
||||
public byte Tier;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// One serialized player-built structure (M7). Flat scalars (JsonUtility has no int2). The production
|
||||
/// cooldown is stored as REMAINING ticks (epoch-independent) so it survives the server-tick origin reset on a
|
||||
/// fresh session; the in-flight conveyor item (if any) rides here, while variable-length machine I/O buffers
|
||||
/// live in the flat <see cref="SaveData.StructureIo"/> table keyed by index.
|
||||
/// </summary>
|
||||
/// <summary>One serialized player-built structure. Flat scalars (JsonUtility has no int2).</summary>
|
||||
[Serializable]
|
||||
public struct StructureSave
|
||||
{
|
||||
public byte Type;
|
||||
public int CellX;
|
||||
public int CellZ;
|
||||
public byte Direction; // conveyor facing (0 for non-conveyors)
|
||||
public uint RemainingTicks; // production/cooldown ticks left at save time
|
||||
public byte ConveyorResId; // in-flight conveyor item resource (0 = none)
|
||||
public int ConveyorCount;
|
||||
public float HP; // EB-1: hit points at save time (0 from a pre-v3 save -> restored to baked Max)
|
||||
public float HP; // EB-1: hit points at save time (0 -> restored to baked Max)
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// One serialized machine I/O buffer row, joined to <see cref="SaveData.Structures"/> by
|
||||
/// <see cref="StructureIndex"/>. A flat top-level array (JsonUtility can't nest arrays-of-arrays); Slot 0 =
|
||||
/// MachineInput, Slot 1 = MachineOutput.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public struct StructureIoRow
|
||||
{
|
||||
public int StructureIndex;
|
||||
public byte Slot;
|
||||
public byte ResourceId;
|
||||
public int Count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Versioned, host-authoritative save slice (the FOUNDATION): the long-arc goal charge/target + the shared
|
||||
/// resource ledger. JsonUtility-friendly — a class with flat fields and an array FIELD (never a root array).
|
||||
/// The schema is intentionally ADDITIVE: future fields (placed structures, threat, storage) append without
|
||||
/// breaking old saves, gated by <see cref="Version"/> migration.
|
||||
/// Versioned, host-authoritative save slice: the shared resource ledger + player-built structures + the
|
||||
/// permanent meta. JsonUtility-friendly — a class with flat fields and an array FIELD (never a root array).
|
||||
/// The schema is ADDITIVE going forward, gated by <see cref="Version"/> migration.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class SaveData
|
||||
{
|
||||
public const int CurrentVersion = 6; // v6: permanent META (per-class upgrade tiers + run counters); v5 added RunOutcome; v4 added CoreCurrent
|
||||
public const int CurrentVersion = 7; // v7: LANTERN fresh epoch — goal/core/outcome + conveyor/machine-I/O fields dropped
|
||||
|
||||
/// <summary>Oldest save schema the loader accepts (additive); a v2 save loads with structures at full HP.</summary>
|
||||
public const int MinLoadableVersion = 2;
|
||||
/// <summary>Oldest save schema the loader accepts. v7 is a FRESH EPOCH (operator-approved): older saves are ignored.</summary>
|
||||
public const int MinLoadableVersion = 7;
|
||||
|
||||
public int Version = CurrentVersion;
|
||||
public int GoalCharge;
|
||||
public int GoalTarget;
|
||||
public int CoreCurrent; // END-1: Engine Core integrity at save time (0 from a pre-v4 save -> restored to baked Max)
|
||||
public int RunOutcome; // END-2: 0=InProgress (also any pre-v5 save) / 1=Victory / 2=Loss -> a finished run loads finished
|
||||
|
||||
// v6 — permanent meta-progression (0/empty-defaults on any v<=5 save):
|
||||
// Permanent meta-progression:
|
||||
public int RunsCompleted; // boss-cleared runs (the HUD counter + the HostSalt fold at restore)
|
||||
public int MaxDepthReached; // deepest room actually CLEARED across all runs (honest depth, never planned)
|
||||
public MetaUpgradeSave[] MetaUpgrades = Array.Empty<MetaUpgradeSave>(); // sparse per-class tiers
|
||||
|
||||
public LedgerRow[] Ledger = Array.Empty<LedgerRow>();
|
||||
public StructureSave[] Structures = Array.Empty<StructureSave>();
|
||||
public StructureIoRow[] StructureIo = Array.Empty<StructureIoRow>();
|
||||
public long SavedAtMs;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user