Phase 1 A/C/D: void room fixed, authored portal + spawn FX, verbs finally taught

SLICE A - rooms become places: ExpeditionBiome duplicated to sub-slot 1
(X+1500) - ground, 205 decor children, rim cliffs, ambience; collider ring +
3 landmark colliders duplicated in the subscene; NEW in-room cover at BOTH
slots (4 collidable rocks each: Environment-layer box colliders in the
subscene + matching Synty rock meshes in Game.unity, placed clear of the
landing point, portal spot, spawn ring and boss spawn). Half of all rooms
previously played on a literal void.

SLICE C - owned FX wired: VFXConfig gains Portal + EnemySpawn slots
(FX_Portal_Round_01 / FX_Dust_Big_01 from PolygonParticleFX); the portal
beacon prefers the authored effect (procedural pillar stays as fallback);
enemies get a spawn-emerge cue on the ghost add-edge (primed-scan guard
skips the connect flood).

SLICE D (teaching) - the two undiscoverable verbs are now taught: dash on
the Move step, class ability + attack on the Rooms step (scheme-aware
glyphs); How-to-Play Controls adds Class ability + Dash rows and fixes the
wrong RT glyph; Loop step 1 mentions class pick + prep; the stale '50
starting Ore' now interpolates Tuning.StartingOre.

456/456 EditMode.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 12:45:25 -07:00
parent fefd7168ec
commit a482a9c4ed
8 changed files with 25039 additions and 5 deletions
@@ -72,7 +72,9 @@ namespace ProjectM.Client
Head(c, ranger ? "CLASS: Ranger (ranged anchor)" : "CLASS: Warrior (melee anchor)");
Body(c, "Move — WASD / Left Stick");
Body(c, "Aim — Mouse cursor / Right Stick");
Body(c, "Attack — LMB / RT (your primary verb)");
Body(c, "Attack — LMB / X (3-hit melee combo — the finisher hits hard)");
Body(c, ranger ? "Class ability — RMB / LT (aimed power shot)" : "Class ability — RMB / LT (cone slam with knockback)");
Body(c, "Dash — LShift / B (brief invulnerability — dodge THROUGH attacks)");
Body(c, "Build menu — Tab / Y");
Body(c, "Place / Cancel (in build) — LMB / RMB (A / B on gamepad)");
Body(c, "Deposit at base — G");
@@ -84,7 +86,7 @@ namespace ProjectM.Client
break;
case 1: // The Loop
Head(c, "THE LOOP — expedition RUNS are how you win");
Body(c, "1. BASE — build Turrets + a Fabricator around your Engine Core; spend Aether on PERMANENT class upgrades.");
Body(c, "1. BASE — pick your CLASS + buy PREP buffs (this run only); build Turrets + a Fabricator; spend Aether on PERMANENT class upgrades.");
Body(c, "2. READY UP [T] — when everyone is ready, the party launches into a multi-room run together.");
Body(c, "3. RUN — clear each room, pick 1 of 3 BOONS (this run only), choose your path on the map, mine the crystals.");
Body(c, "4. BOSS — fell it and the party returns with the haul: +1 on the Engine meter. A wipe banks nothing.");