Base<->Expedition ties: portal rooms, class-at-base, prep spend + Health.Max, C3/C4/Spitter (DR-046)
Portal-gated rooms: new RunLifecycle.RoomExplore loot window; room+nodes persist past the last kill; PortalInteractRequest -> server-only PortalCommand advances (client derives the portal pos). RunDirectorSystem moves teardown off the InRoom edge, relocates the boss-branch/route-gate into the RoomExplore exit, and advances an empty expedition immediately (incl. a boss clear). Class-at-base via a shared ClassSwapUtil (meta-band strip + per-class MetaTierState replay, so the base RPC and the dev SetClass can't drift); ClassSelectRequest Staging-gated. Per-run PREP buffs (PrepPurchaseRequest, PrepCatalog): once-per-run == the row's prep StatModifier band is present, TotalOf-before-Withdraw atomic, stripped on Returning beside the boon band. Health.Max promoted to [GhostField] (the one ghost-hash re-bake) so the boss + floating enemy HP bars read it directly. Feel: melee cone connect-thunk (C3), hit-stop throttle so a horde wipe can't stutter (C4), Spitter cornered-hold. 456/456 EditMode; two adversarial reviews (pre-code 13-confirmed folded; post-impl clean bar the RoomExplore boss-clear dead-time, fixed). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -129,6 +129,19 @@ namespace ProjectM.Simulation
|
||||
/// never floods past readable (also bounded by the director's MaxAlive count).</summary>
|
||||
public const int BossSummonLiveCap = 8;
|
||||
|
||||
// ---- DR-046 room-exit PORTAL / loot window ----
|
||||
|
||||
/// <summary>Client-side portal position offset from the room origin (where the party landed): a short step
|
||||
/// back toward the entrance, so 'leave the way you came'. Client VFX + proximity prompt only.</summary>
|
||||
public const float PortalOffsetZ = -5f;
|
||||
|
||||
/// <summary>How close the local player must be to the portal to show 'E to LEAVE' + send the interact.</summary>
|
||||
public const float PortalInteractRange = 3.5f;
|
||||
|
||||
/// <summary>RoomExplore soft-timeout (~30 s @60): auto-advance if nobody interacts the portal (no softlock).</summary>
|
||||
public const uint ExploreGraceTicks = 1800;
|
||||
|
||||
|
||||
|
||||
// ---- Inventory (per-player bag; InventoryMath / ResourceHarvestSystem / InventoryDepositSystem) ----
|
||||
|
||||
@@ -154,6 +167,14 @@ namespace ProjectM.Simulation
|
||||
/// <summary>Width of the boon band [Base, Base+Span) — far above any realistic per-run pick count.</summary>
|
||||
public const uint BoonSourceIdSpan = 0x10000u;
|
||||
|
||||
/// <summary>DR-046: base PREP-LOADOUT run-scoped SourceId band [Base, Base+Span). DISJOINT from boon
|
||||
/// (0x00B00000), class (0x00C1A550), meta (0x00E7A000), equip (0x00E91000); one prep option's live
|
||||
/// StatModifier is keyed PrepSourceIdBase + optionId. Stripped on the Returning edge like boons.</summary>
|
||||
public const uint PrepSourceIdBase = 0x00D00000u;
|
||||
/// <summary>Width of the prep band (far above the tiny option count).</summary>
|
||||
public const uint PrepSourceIdSpan = 0x10000u;
|
||||
|
||||
|
||||
/// <summary>Base of the PERMANENT meta-upgrade SourceId band: a purchased tier's live StatModifier is
|
||||
/// keyed MetaSourceIdBase + UpgradeId (absolute-value UPSERT — one row per owned upgrade, set to
|
||||
/// ValuePerTier*tier). Persisted via MetaTierState (SaveData v6) and re-applied born-correct at spawn.
|
||||
|
||||
Reference in New Issue
Block a user