[lane B+C] L5 Large Intestine: the dark, the gas, and The Blockage — the campaign is complete
The last level. 6 segments, 3200 units, 51 events, and the end of the game: `next: null`.
THE GAS. GDD: "flammable gas pockets: shooting inside one detonates it (hurts everyone —
risk/reward)". Built literally, as an entity whose kill() throws a blast:
- one cannon pellet sets it off (hp 10) — the hazard has to be hair-trigger or "don't shoot
near it" is not a constraint;
- the blast reaches 16 units, FALLS OFF with distance, wipes foes, hurts YOU, and chains
through other pockets, so a corridor of them is a fuse;
- foe:false, so the pocket itself scores nothing — you are paid for what the blast KILLS,
which makes the reward self-balancing.
Measured: one pellet into a line of four detonated all four; a blast took 4 virions and paid
240; the player takes 30.3 coat point-blank, 15.4 at mid range and 0 at 20 units. "Detonate
from max range" — which C's Blockage spec calls optimal play — is a real, measurable skill.
And the cruelty that makes the level: fog 0.075 is the densest in the game and there are no
real-time lights in GUTS, so THE POCKETS ARE THE LIGHTING. Clearing a room safely also clears
the lights. No new rendering path was added for the dark; the biome's fog and the emissives
already did it.
THE BLOCKAGE (LANE_C_NOTES §Boss specs 3) — 5 armoured plates -> 4 tumbling chunks -> the core
under a 30s doom timer, with gas pockets seeded into every phase, so the boss's own room is its
worst weakness. First cut ran 25.7s, shorter than the mid-game Guardian, which is the wrong
shape for a finale — its windows are continuous by spec, so hp went 120/130/150 -> 220/230/280.
Now: 49.7s brute-forcing the plates, 30.2s using the gas. The room is the weapon, and the
difference is 40%.
The reputation loop lands here as designed: two biofilm gates, the second sixty units from the
final boss. Five levels of deciding whether to shoot the cyan resolve into three phage escorts
and a full coat, or nothing at all, in the dark, at the door.
Registering L5 also closes two dangling threads — L4's ileocecal valve and LS_appendix's exit
both pointed at it and now resolve.
C's tooling: 6/6 levels valid, sim par 540 vs par-pace 505 (reachable, with room for the boss),
pressure 1.33/4.09/3.21/5.75/4.12, min clearance 8.30 vs the 2.5 law. par.score corrected
7000 -> 4000 and a missing checkpoint added at 3060 (the 30s law caught a 34.8s gap I had left
between the boss and the gate).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
87a4803bde
commit
a3784c0371
@ -121,6 +121,15 @@ export const BALANCE = {
|
||||
// reap timing, and a boss that silently spawns no core is the worst bug in the file.
|
||||
mucosal_node: { hp: 150, radius: 2.6, score: 400, pool: 12 },
|
||||
|
||||
// gas_pocket — L5's signature (GDD: "flammable gas pockets: shooting inside one detonates it
|
||||
// (hurts everyone — risk/reward)"). Static, and hp 10 means ONE cannon pellet sets it off:
|
||||
// the danger has to be a hair-trigger or "don't shoot near it" is not a real constraint.
|
||||
// foe:false, so it scores nothing itself and allies ignore it — you get paid for what the
|
||||
// blast KILLS, not for the barrel, which makes the reward self-balancing. It is also the
|
||||
// level's light source (ART_BIBLE: darkness is the medium, the pockets glow), so a room full
|
||||
// of them is a room you can see, and clearing them is clearing the lights.
|
||||
gas_pocket: { hp: 10, radius: 3.6, score: 0, blast: 16, blastPlayer: 34, blastEnemy: 90, pool: 20 },
|
||||
|
||||
// mast_cell — L1's sentinel (LANE_C_NOTES §Boss specs 5). A patrolling immune cell with NO
|
||||
// attack: auraDps 0 means it shares the floater's drift branch and its aura does nothing at
|
||||
// all. hp 400 is not a health bar, it is a THRESHOLD — high enough that killing it takes
|
||||
|
||||
@ -49,6 +49,35 @@ const BOSSES = {
|
||||
],
|
||||
},
|
||||
|
||||
// LANE_C_NOTES §3. The final boss: hull attrition, inverting the Guardian. C's spec makes the
|
||||
// gas pockets the fight — "shoot one and it detonates, destroying adjacent plates outright, and
|
||||
// hurting you inside ~15 units. Optimal play = detonate 2-3 from max range." That needs no
|
||||
// special-casing here: pockets are entities whose kill() already chains a blast through
|
||||
// everything nearby, so seeding the ring with them via `bloom` makes them the boss's own worst
|
||||
// weakness. The player's problem is that they are also the only light in the room.
|
||||
the_blockage: {
|
||||
telegraph: 1.5, // C: "a full-canal groan 1.5 s before each contraction"
|
||||
node: 'mucosal_node', // the armoured plates
|
||||
rho: 0.72,
|
||||
phases: [
|
||||
// P1 The Face — 5 plates, continuous (C: "the pockets are the timer", not an iris).
|
||||
// hp is high because the windows are NOT: C's spec makes P1 continuous ("the pockets are
|
||||
// the timer"), so unlike the Guardian nothing gates your dps but your own aim. First cut at
|
||||
// 120 gave a 25.7s finale — shorter than the mid-game boss, which is the wrong shape for a
|
||||
// campaign. The pockets are the intended shortcut: a detonation does 90 to every plate in
|
||||
// range, so using the room is worth roughly a third of a plate per blast.
|
||||
{ id: 1, open: 9, period: 9, nodes: 5, hp: 220, armored: 0, vents: 3, ventEvery: 2.8,
|
||||
bloom: { every: 4.0, kinds: ['gas_pocket'], cap: 6, rearmAt: 99 } },
|
||||
// P2 Fragmentation — the mass breaks into 4 tumbling chunks; the core opens intermittently.
|
||||
{ id: 2, open: 2.0, period: 6.0, nodes: 4, hp: 230, armored: 1, vents: 3, ventEvery: 2.2,
|
||||
bloom: { every: 3.4, kinds: ['gas_pocket', 'virion'], cap: 8, rearmAt: 99 } },
|
||||
// P3 The Push — the colon contracts and drives it toward the exit with you behind it.
|
||||
// 30s doom: if it plugs the rectum, you lose.
|
||||
{ id: 3, open: 1.6, period: 5.0, nodes: 1, hp: 280, armored: 0, vents: 4, ventEvery: 1.8,
|
||||
doom: 30, bloom: { every: 2.6, kinds: ['gas_pocket'], cap: 5, rearmAt: 99 } },
|
||||
],
|
||||
},
|
||||
|
||||
// LANE_C_NOTES §5. The restraint boss, and the one that is not shaped like a boss at all —
|
||||
// hence `kind: 'sentinel'` and its own update path. There is no ring, no window and no hp bar
|
||||
// you are meant to empty: there is a cell on patrol, and a question. Damage is the FAILURE
|
||||
|
||||
@ -148,6 +148,15 @@ const ARCHETYPES = {
|
||||
geo: () => new THREE.DodecahedronGeometry(B.enemies.mucosal_node.radius, 0),
|
||||
color: EMISSIVE.hostile,
|
||||
},
|
||||
// gas_pocket — L5's flammable methane bubble. Acid-green (readability law: this WILL hurt you),
|
||||
// static like the spore cloud, and in a biome whose fog is the densest in the game it is also
|
||||
// the only thing you can see by. Detonation lives in kill().
|
||||
gas_pocket: {
|
||||
cfg: B.enemies.gas_pocket,
|
||||
geo: () => new THREE.IcosahedronGeometry(B.enemies.gas_pocket.radius, 2),
|
||||
color: EMISSIVE.acid,
|
||||
foe: false,
|
||||
},
|
||||
// mast_cell — L1's sentinel. CYAN, and the colour is the whole encounter: the readability law
|
||||
// says cyan is not your enemy, and the level is watching whether the player believes it. A big
|
||||
// soft icosphere so it reads as a cell full of granules rather than a target. foe:false, so
|
||||
@ -175,6 +184,9 @@ export function createEnemies({ scene, world, bus, rng, assets = null }) {
|
||||
const live = [];
|
||||
const buckets = new Map();
|
||||
let onDeath = null, onBlast = null; // set by combat/index.js
|
||||
// The player, captured each update(). kill() needs it for the gas-pocket blast and kill() is
|
||||
// reached from hurt(), which weapons call directly — so it cannot take it as an argument.
|
||||
let _player = null;
|
||||
const _playerPos = new THREE.Vector3(); // player world pos, resolved once per frame
|
||||
|
||||
for (const [type, def] of Object.entries(ARCHETYPES)) {
|
||||
@ -274,6 +286,29 @@ export function createEnemies({ scene, world, bus, rng, assets = null }) {
|
||||
|
||||
function kill(e, kind) {
|
||||
e.alive = false;
|
||||
|
||||
// GAS POCKET DETONATION (GDD §L5): "shooting inside one detonates it — hurts everyone".
|
||||
// Everyone means everyone: the blast hurts the player if they are inside it, wipes foes, and
|
||||
// reaches other pockets, so a line of them CHAINS. Recursion terminates because `alive` is
|
||||
// cleared above before the blast goes out — a pocket can never detonate itself twice.
|
||||
if (e.type === 'gas_pocket') {
|
||||
const cfg = e.cfg;
|
||||
onBlast?.(e.pos, cfg.blast * 0.5, 0.5);
|
||||
forEachNear(e.s, cfg.blast, (o) => {
|
||||
if (o === e) return;
|
||||
const d = Math.hypot(o.s - e.s, o.x - e.x, o.y - e.y);
|
||||
if (d <= cfg.blast) hurt(o, cfg.blastEnemy, 'gas');
|
||||
});
|
||||
const ps = _player?.state;
|
||||
if (ps?.alive) {
|
||||
const d = Math.hypot(ps.s - e.s, ps.x - e.x, ps.y - e.y);
|
||||
// Falls off with distance, so "detonate it from max range" (C's Blockage spec calls that
|
||||
// the optimal play) is a real skill rather than a coin flip.
|
||||
if (d <= cfg.blast) _player?.damage?.(cfg.blastPlayer * (1 - d / cfg.blast), 'gas');
|
||||
}
|
||||
bus.emit('audio:cue', { name: 'torpedo_blast' });
|
||||
}
|
||||
|
||||
if (!e.foe) {
|
||||
// An ally died (flora or phage): never scores, never combos. Flora killed by the player's
|
||||
// own fire (not 'spent') signals the BIOME STANDING meter — "don't shoot the biome", made
|
||||
@ -320,6 +355,7 @@ export function createEnemies({ scene, world, bus, rng, assets = null }) {
|
||||
|
||||
// --- behaviours -------------------------------------------------------------------
|
||||
function update(dt, player) {
|
||||
_player = player;
|
||||
const ps = player.state;
|
||||
// resolve the player's world position ONCE — darts and turrets all want it, and
|
||||
// world.sample() allocates (see NOTES → Lane A: an out-param sample would kill the
|
||||
|
||||
138
web/js/levels/L5_large_intestine.json
Normal file
138
web/js/levels/L5_large_intestine.json
Normal file
@ -0,0 +1,138 @@
|
||||
{
|
||||
"schema": 2,
|
||||
"id": "L5_large_intestine",
|
||||
"name": "Large Intestine",
|
||||
"tagline": "Bring a light",
|
||||
"seed": 20260703,
|
||||
"par": { "time": 540, "score": 4000, "samples": 3 },
|
||||
"next": null,
|
||||
"design": {
|
||||
"owner": "Lane C",
|
||||
"status": "AUTHORED (round 3). The last level. Everything it needed - gas-pocket detonation, the boss framework, the reputation cash-out, arena mode - landed in rounds 2 and 3, so it is built rather than skeletoned.",
|
||||
"identity": "The dark level, and the payoff level. Fog 0.075 is the densest in the game: you cannot see the room, you can only see the gas. The pockets ARE the lighting, and they are also the thing most likely to kill you - so every choice about visibility is a choice about risk. Ends on The Blockage and the ejection.",
|
||||
"anatomy": "Cecum (where the appendix hangs, and where a returning secret-route player rejoins) -> ascending colon -> hepatic flexure -> transverse colon -> splenic flexure -> descending -> sigmoid -> rectum. Real order, real flexures.",
|
||||
"the_gas": "GDD: 'flammable gas pockets: shooting inside one detonates it (hurts everyone - risk/reward)'. Built literally. A pocket is one cannon pellet from going off, the blast reaches 16 units and falls off with distance, it wipes foes and it CHAINS through other pockets. So a corridor of them is a fuse, and the correct play is almost always to set it off from as far away as you can - which is exactly what C's Blockage spec calls optimal. The cruelty is that the pockets are the light: clear a room safely and you clear the lights with it.",
|
||||
"the_dark": "No scanner-light entity exists (ART_BIBLE: GUTS has no real-time lights, and adding one for a single level would be a new rendering path). The darkness is the biome's fog doing the work and the emissives being the only bright things in it. Honest, and it makes the gas read as the light source without a single new system.",
|
||||
"the_cash_out": "Two biofilm gates, and this is what the whole reputation loop has been for. The first (s1180) is the fast route the parked V2 idea promised - tend the colon and the biofilm parts. The second (s2820) is the one that matters: it seeds the Blockage arena with phage allies before the hardest fight in the game. A player who has been kind to the biome for five levels fights the finale with an escort; a player who has not, fights it alone in the dark.",
|
||||
"why_no_churn": "Same deferral as L3: the GDD's gas VENTS that shove the player are a force, and no hazard applies one. The pockets carry the beat instead.",
|
||||
"finale": "The gate is `anal_verge` with `to: null` - the campaign ends here. GDD: 'it blows, and the canal expels you both.' Mechanically that is the boss ending and 200 units of the fastest flow in the game with nothing left to fight."
|
||||
},
|
||||
"segments": [
|
||||
{
|
||||
"biome": "large_intestine",
|
||||
"name": "Cecum",
|
||||
"length": 300,
|
||||
"radius": { "base": 30, "wobble": 0.2 },
|
||||
"curviness": 0.2,
|
||||
"flow": 4,
|
||||
"note": "You drop out of the ileocecal valve into a wide dark pouch - and if you took the secret, this is also where you come back in. Slowest flow in the level: the player needs a moment to understand that they can no longer see."
|
||||
},
|
||||
{
|
||||
"biome": "large_intestine",
|
||||
"name": "Ascending Colon",
|
||||
"length": 600,
|
||||
"radius": { "base": 22, "wobble": 0.25 },
|
||||
"curviness": 0.35,
|
||||
"flow": 5,
|
||||
"note": "Climbing, in the dark, with the first gas pockets in it. The teaching stretch: pockets alone, pockets with a foe behind them, pockets in a line."
|
||||
},
|
||||
{
|
||||
"biome": "large_intestine",
|
||||
"name": "Transverse Colon",
|
||||
"length": 700,
|
||||
"radius": { "base": 24, "wobble": 0.3 },
|
||||
"curviness": 0.45,
|
||||
"flow": 5,
|
||||
"note": "The long crossing and the gas swamp (arenas[0]). The widest, gassiest stretch - and the biofilm gate sits at the end of it, so the whole segment is the question of whether the biome likes you."
|
||||
},
|
||||
{
|
||||
"biome": "large_intestine",
|
||||
"name": "Descending Colon",
|
||||
"length": 600,
|
||||
"radius": { "base": 20, "wobble": 0.25 },
|
||||
"curviness": 0.4,
|
||||
"flow": 6,
|
||||
"note": "Down the far side. Narrower, faster, and this is where C. difficile blooms - the corpses that keep hurting, in a corridor where you also cannot afford a stray shot near the gas."
|
||||
},
|
||||
{
|
||||
"biome": "large_intestine",
|
||||
"name": "Sigmoid Colon",
|
||||
"length": 500,
|
||||
"radius": { "base": 16, "wobble": 0.3 },
|
||||
"curviness": 0.6,
|
||||
"flow": 6,
|
||||
"note": "The twist. Highest curviness in the level in its tightest tube: blind bends, norovirus swarms coming round them, and pockets you meet before you see them."
|
||||
},
|
||||
{
|
||||
"biome": "large_intestine",
|
||||
"name": "Rectum",
|
||||
"length": 500,
|
||||
"radius": { "base": 18, "wobble": 0.15 },
|
||||
"curviness": 0.15,
|
||||
"flow": 8,
|
||||
"note": "It opens and straightens for the last fight (arenas[1]) - and then, once the Blockage is gone, becomes the fastest 200 units in the game with nothing left in them."
|
||||
}
|
||||
],
|
||||
"arenas": [
|
||||
{ "at": 1250, "radius": 85, "biome": "large_intestine", "note": "The gas swamp. Spans s 1165-1335." },
|
||||
{ "at": 2950, "radius": 80, "biome": "large_intestine", "note": "The Blockage. Spans s 2870-3030." }
|
||||
],
|
||||
"events": [
|
||||
{ "s": 20, "type": "checkpoint", "name": "Cecum" },
|
||||
{ "s": 60, "type": "pickup", "kind": "nutrient_orb", "count": 3, "spread": 45, "note": "Orbs in the dark. In fog 0.075 an emissive pickup line is not just a reward, it is the only wayfinding the cecum offers." },
|
||||
{ "s": 110, "type": "spawn", "enemy": "faecali_beacon", "count": 3, "spread": 70, "rho": 0.6, "note": "The colon's own commensal, greeting you at the door - and here they are LIGHTS as well as friends. The level opens by showing you that the friendly thing is also the thing you can see by." },
|
||||
{ "s": 150, "type": "checkpoint", "name": "Cecal Floor" },
|
||||
{ "s": 200, "type": "spawn", "enemy": "gas_pocket", "count": 1, "note": "TEACH THE GAS. One pocket, alone, in the widest room of the level with nothing else happening. A player will shoot it - that is the point, and at this range with full coat the blast teaches the lesson it needs to teach without taking the run." },
|
||||
{ "s": 280, "type": "checkpoint", "name": "Ascending" },
|
||||
|
||||
{ "s": 340, "type": "spawn", "enemy": "gas_pocket", "count": 3, "spread": 70, "note": "TEACH THE CHAIN: three in a line. Set off the near one and watch it take the others - the fuse, demonstrated where nothing is chasing you." },
|
||||
{ "s": 400, "type": "spawn", "enemy": "norovirus_swarm", "count": 6, "spread": 60, "note": "TEACH norovirus: individually trivial, and there are six. The arithmetic threat, met for the first time in a corridor." },
|
||||
{ "s": 440, "type": "checkpoint", "name": "Ascending Run" },
|
||||
{ "s": 500, "type": "spawn", "enemy": "gas_pocket", "count": 2, "spread": 50 },
|
||||
{ "s": 520, "type": "spawn", "enemy": "norovirus_swarm", "count": 5, "spread": 50, "note": "THE FIRST REAL CHOICE: a swarm arriving through a pocket field. Detonating clears them all at once and costs you the light and some hull; shooting them one by one is safe, slow, and one stray pellet ends the argument anyway." },
|
||||
{ "s": 600, "type": "checkpoint", "name": "Hepatic Flexure" },
|
||||
{ "s": 660, "type": "pickup", "kind": "biopsy_sample", "count": 1, "theta": 1.05, "rho": 0.9, "note": "SAMPLE 1/3, wall-pinned on the flexure. Costs a wall-hug on a blind bend in the dark - the mildest of the three, and still worse than anything L1 asked." },
|
||||
{ "s": 700, "type": "pickup", "kind": "mucin_glob", "count": 2, "spread": 40 },
|
||||
{ "s": 760, "type": "checkpoint", "name": "Transverse Entry" },
|
||||
|
||||
{ "s": 840, "type": "spawn", "enemy": "cdiff_bloom", "count": 2, "spread": 60, "note": "TEACH C. difficile: the kill that isn't clean. Two of them, in open water, so the player learns that the corpse keeps hurting BEFORE they meet one in a corridor at s1720." },
|
||||
{ "s": 900, "type": "checkpoint", "name": "Transverse Colon" },
|
||||
{ "s": 960, "type": "spawn", "enemy": "gas_pocket", "count": 4, "spread": 110, "note": "The swamp proper begins. Four pockets scattered through a widening room: the lighting rig, and the minefield, and the same objects." },
|
||||
{ "s": 1020, "type": "spawn", "enemy": "akkermansia", "count": 3, "spread": 60, "rho": 0.5, "note": "The coat-for-standing trade, on the racing line, 160 units before a biofilm gate that reads standing. The most pointed placement of that choice in the game." },
|
||||
{ "s": 1060, "type": "checkpoint", "name": "Gas Swamp" },
|
||||
{ "s": 1120, "type": "spawn", "enemy": "norovirus_swarm", "count": 8, "spread": 90, "note": "The biggest swarm in the level, in the gassiest room in the level. The pockets are right there. The game is not going to tell you what to do about it." },
|
||||
{ "s": 1180, "type": "biofilm", "need": 50, "allies": 2, "coat": 35, "note": "THE FAST ROUTE (V2_IDEAS: 'don't shoot the biome, it helps you in level 5' - the promise, kept, in the level it was made about). Tend the colon and the biofilm parts mid-swamp: two phage escorts and a coat refill, in the dark, with a swarm on you." },
|
||||
{ "s": 1220, "type": "checkpoint", "name": "Mid Transverse" },
|
||||
{ "s": 1280, "type": "pickup", "kind": "biopsy_sample", "count": 1, "theta": 4.19, "rho": 0.85, "note": "SAMPLE 2/3, out at the swamp's wall. The round trip is through the pocket field, and the pockets are how you can see to make it." },
|
||||
{ "s": 1340, "type": "spawn", "enemy": "gas_pocket", "count": 3, "spread": 80 },
|
||||
{ "s": 1380, "type": "checkpoint", "name": "Splenic Flexure" },
|
||||
{ "s": 1440, "type": "pickup", "kind": "antacid_ammo", "count": 2, "spread": 30, "note": "Torpedoes for the Blockage's armoured plate, 1400 units out. Same silent contract as L2 and L3: the tool arrives long before the lock." },
|
||||
{ "s": 1540, "type": "checkpoint", "name": "Descending" },
|
||||
|
||||
{ "s": 1620, "type": "spawn", "enemy": "norovirus_swarm", "count": 6, "spread": 60 },
|
||||
{ "s": 1720, "type": "checkpoint", "name": "Descending Run" },
|
||||
{ "s": 1760, "type": "spawn", "enemy": "cdiff_bloom", "count": 3, "spread": 70, "note": "TEST C. difficile, in a 20-unit corridor: three of them, and every corpse leaves a cloud you then have to fly through or clear. The beat where the level stops being about the gas for a moment." },
|
||||
{ "s": 1840, "type": "spawn", "enemy": "gas_pocket", "count": 3, "spread": 70, "note": "Pockets among the spore clouds - two different reasons not to shoot, in the same corridor." },
|
||||
{ "s": 1920, "type": "checkpoint", "name": "Descending Floor" },
|
||||
{ "s": 1980, "type": "pickup", "kind": "mucin_glob", "count": 2, "spread": 40 },
|
||||
{ "s": 2060, "type": "spawn", "enemy": "norovirus_swarm", "count": 7, "spread": 70 },
|
||||
{ "s": 2120, "type": "checkpoint", "name": "Sigmoid" },
|
||||
|
||||
{ "s": 2180, "type": "spawn", "enemy": "gas_pocket", "count": 4, "spread": 90, "note": "The sigmoid's twist begins, and the pockets are now behind bends: you meet the light after you have already committed to the corner." },
|
||||
{ "s": 2260, "type": "spawn", "enemy": "cdiff_bloom", "count": 2, "spread": 50 },
|
||||
{ "s": 2320, "type": "checkpoint", "name": "Sigmoid Coils" },
|
||||
{ "s": 2380, "type": "pickup", "kind": "biopsy_sample", "count": 1, "theta": 5.76, "rho": 0.88, "note": "SAMPLE 3/3, wall-pinned in the tightest, twistiest, darkest stretch of the campaign, with pockets in it. The last collectible in the game and by some distance the meanest." },
|
||||
{ "s": 2440, "type": "spawn", "enemy": "norovirus_swarm", "count": 6, "spread": 55 },
|
||||
{ "s": 2520, "type": "checkpoint", "name": "Rectosigmoid" },
|
||||
{ "s": 2600, "type": "spawn", "enemy": "gas_pocket", "count": 3, "spread": 60 },
|
||||
{ "s": 2700, "type": "checkpoint", "name": "Rectum" },
|
||||
{ "s": 2760, "type": "pickup", "kind": "mucin_glob", "count": 3, "spread": 35, "note": "The last refills in the campaign. The room opens, the fog stays, and the level gives you everything it has left before the door." },
|
||||
{ "s": 2790, "type": "pickup", "kind": "antacid_ammo", "count": 2, "spread": 25 },
|
||||
|
||||
{ "s": 2820, "type": "biofilm", "need": 55, "allies": 3, "coat": 45, "note": "THE CASH-OUT THAT MATTERS. Sixty units before the final boss, the colon decides whether you fought for it or through it: three phage escorts and a full coat, or nothing at all. Every cyan thing the player did or did not shoot across five levels resolves here, in the dark, at the door of the hardest fight in the game." },
|
||||
{ "s": 2880, "type": "checkpoint", "name": "The Blockage", "note": "The boss checkpoint, outside the arena (2870-3030 - this sits just before it). C's law: never respawn inside the encounter." },
|
||||
{ "s": 2950, "type": "boss", "id": "the_blockage", "note": "THE FINAL BOSS. Three phases per LANE_C_NOTES §Boss specs 3: the Face (5 armoured plates, gas pockets bulging between them), Fragmentation (4 tumbling chunks), and the Push (a 30s doom timer while the colon drives it toward the exit with you behind it). Its own gas is its weakness and your light - detonating from range is the whole fight." },
|
||||
{ "s": 3060, "type": "checkpoint", "name": "The Verge", "note": "Just past the arena. The 30s law needs it, and it also means a player who beats the Blockage never has to beat it twice." },
|
||||
{ "s": 3200, "type": "gate", "id": "anal_verge", "to": null, "note": "The end of the campaign. GDD: 'it blows, and the canal expels you both.' 250 units at flow 8 with nothing left alive in them - the game's only victory lap." }
|
||||
]
|
||||
}
|
||||
@ -23,7 +23,7 @@
|
||||
* Round-2 microbe pass added `flora` (the first friend), `spore_pod` (a distinct-mesh foe),
|
||||
* `phage` (the first ally — a friendly seeker that hunts foes), and `mucus_grazer` (a commensal
|
||||
* that trades your coat for faster standing). */
|
||||
export const ARCHETYPES = ['floater', 'seeker', 'turret', 'flora', 'spore_pod', 'phage', 'mucus_grazer', 'cdiff', 'latcher', 'virion', 'driller', 'beacon'];
|
||||
export const ARCHETYPES = ['floater', 'seeker', 'turret', 'flora', 'spore_pod', 'phage', 'mucus_grazer', 'cdiff', 'latcher', 'virion', 'driller', 'beacon', 'gas_pocket'];
|
||||
|
||||
/**
|
||||
* Fields:
|
||||
@ -109,6 +109,15 @@ export const ENEMIES = Object.freeze({
|
||||
'allies quicker. Cyan (a commensal), amoeba-blob shape so the coat cost reads as a ' +
|
||||
'different bug, not a betrayal by the healing rod.',
|
||||
},
|
||||
gas_pocket: {
|
||||
archetype: 'gas_pocket', biome: 'large_intestine', tint: 0xc8ff3a, wall: false,
|
||||
note: 'A pocket of flammable colonic gas — methane and hydrogen, which a real colon really ' +
|
||||
'does produce enough of to be an ignition hazard during electrocautery. THE L5 ' +
|
||||
'MECHANIC (GDD): one pellet detonates it, the blast hurts EVERYONE inside ~16 units ' +
|
||||
'and chains through other pockets. Acid-green: the readability law says this will hurt ' +
|
||||
'you, and in the darkest biome in the game it is also the only thing you can see by. ' +
|
||||
'Clearing a room safely means clearing the lights.',
|
||||
},
|
||||
cdiff_bloom: {
|
||||
archetype: 'cdiff', biome: 'large_intestine', tint: 0xff7a2a, wall: false,
|
||||
note: 'Clostridioides difficile — waits for antibiotics to clear the neighbours, then blooms ' +
|
||||
|
||||
@ -60,7 +60,7 @@ export const SUPPORTED_SCHEMAS = new Set([1, 2]);
|
||||
// LS_appendix is the secret and is NOT on the critical path: L4's ileocecal valve routes there
|
||||
// only when BIOME STANDING is high enough (the gate's `secretTo`/`secretNeed`, honoured in
|
||||
// boot.js). It lives in the registry so it can be loaded, chained out of, and selfchecked.
|
||||
export const CAMPAIGN = ['L1_mouth', 'L2_esophagus', 'L3_stomach', 'L4_small_intestine', 'LS_appendix'];
|
||||
export const CAMPAIGN = ['L1_mouth', 'L2_esophagus', 'L3_stomach', 'L4_small_intestine', 'L5_large_intestine', 'LS_appendix'];
|
||||
|
||||
/** Booting with no ?lvl= gives you the vertical slice. Lane F: see LANE_C_NOTES §→ Lane F. */
|
||||
export const DEFAULT_LEVEL = 'L2_esophagus';
|
||||
|
||||
Loading…
Reference in New Issue
Block a user