Spaces:
Running
fix(scenario): econ-buy-vs-build-decision — recalibrate after engine movement fixes
Browse filesThe engine movement fixes (attack_unit no-teleport; moving units
fire and take fire) shifted combat balance. The old hard tier
staged a rush band at BOTH latitudes every seed (enemy actors did
not honour spawn_point); the off-latitude band drifted in as a
dispersed second wave and the intended 4-tank buy-now force could
not clear the 5-kill bar before the within_ticks deadline — the
intended buy-now play LOST every hard seed.
Recalibration (hard tier): the rusher band now declares the
matching spawn_point so exactly ONE concentrated wave places at
the seed-chosen base latitude (per-owner spawn_point filter —
CLAUDE.md). The band is 5x e1 + 1x e3 — slightly heavier than
medium's 5x e1 so hard stays harder — and the inert anti-DRAW
enemy marker is duplicated per spawn_point group. The buy-now
4-tank force clears the kill bar at tick ~1473, inside the 1499
clock, while stall and build-weap-first still LOSE.
Bar re-verified scripted, 3 levels x seeds 1-4: intended buy-now
WINS every tier and seed; stall and build-weap-first both LOSE
every tier and seed as a real deadline / fact-razed LOSS, never
a draw.
|
@@ -65,10 +65,11 @@
|
|
| 65 |
# past the last rusher death (CLAUDE.md auto-done footgun).
|
| 66 |
# • Hard tier defines 2 agent spawn_point groups (NORTH base
|
| 67 |
# y=14 / SOUTH base y=26) — UPGRADED contract; the rusher band
|
| 68 |
-
#
|
| 69 |
-
#
|
| 70 |
-
#
|
| 71 |
-
#
|
|
|
|
| 72 |
#
|
| 73 |
# Sibling pack candidate (not implemented here): the INVERSION —
|
| 74 |
# slow enemy + sustained pressure ⇒ tech-up (build weap) WINS,
|
|
@@ -262,29 +263,42 @@ levels:
|
|
| 262 |
|
| 263 |
# ── HARD ─────────────────────────────────────────────────────────
|
| 264 |
# +1 axis: seed-driven base latitude. TWO agent spawn_point groups
|
| 265 |
-
# (NORTH base y=14 / SOUTH base y=26) round-robined by seed
|
| 266 |
-
# rusher band
|
| 267 |
-
#
|
| 268 |
-
#
|
| 269 |
-
#
|
| 270 |
-
#
|
| 271 |
-
#
|
| 272 |
-
#
|
| 273 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 274 |
hard:
|
| 275 |
description: >
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
decision must be made from the live threat reading.
|
| 288 |
overrides:
|
| 289 |
actors:
|
| 290 |
# ── AGENT spawn 0 — NORTH base (y=14) ─────────────────────
|
|
@@ -308,17 +322,23 @@ levels:
|
|
| 308 |
- {type: weap, owner: agent, position: [18, 26], spawn_point: 1}
|
| 309 |
- {type: fix, owner: agent, position: [18, 28], spawn_point: 1}
|
| 310 |
- {type: e1, owner: agent, position: [12, 26], spawn_point: 1, stance: 0}
|
| 311 |
-
# ──
|
| 312 |
-
#
|
| 313 |
-
#
|
| 314 |
-
#
|
| 315 |
-
#
|
| 316 |
-
#
|
| 317 |
-
#
|
| 318 |
-
- {type: e1, owner: enemy, position: [70, 14], stance: 3, count:
|
| 319 |
-
|
| 320 |
-
- {type: e1, owner: enemy, position: [70, 26], stance: 3, count:
|
| 321 |
-
- {type:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
win_condition:
|
| 323 |
all_of:
|
| 324 |
- {units_killed_gte: 5}
|
|
|
|
| 65 |
# past the last rusher death (CLAUDE.md auto-done footgun).
|
| 66 |
# • Hard tier defines 2 agent spawn_point groups (NORTH base
|
| 67 |
# y=14 / SOUTH base y=26) — UPGRADED contract; the rusher band
|
| 68 |
+
# declares the matching spawn_point so exactly ONE concentrated
|
| 69 |
+
# band places at the seed-chosen base latitude (per-owner
|
| 70 |
+
# spawn_point filter — CLAUDE.md). The off-latitude band is
|
| 71 |
+
# filtered out, so the buy-now force faces a single
|
| 72 |
+
# concentrated wave it can clear inside the clock.
|
| 73 |
#
|
| 74 |
# Sibling pack candidate (not implemented here): the INVERSION —
|
| 75 |
# slow enemy + sustained pressure ⇒ tech-up (build weap) WINS,
|
|
|
|
| 263 |
|
| 264 |
# ── HARD ─────────────────────────────────────────────────────────
|
| 265 |
# +1 axis: seed-driven base latitude. TWO agent spawn_point groups
|
| 266 |
+
# (NORTH base y=14 / SOUTH base y=26) round-robined by seed. The
|
| 267 |
+
# rusher band declares the SAME spawn_point so exactly ONE
|
| 268 |
+
# concentrated band places at the matching latitude (the
|
| 269 |
+
# per-owner spawn_point filter — CLAUDE.md — the chosen
|
| 270 |
+
# spawn_point keeps that owner's matching actors and drops the
|
| 271 |
+
# rest, for BOTH owners). The buy-vs-build decision is IDENTICAL
|
| 272 |
+
# across spawns (the cash, the war factory, the response shape
|
| 273 |
+
# are all symmetric) — a memorised "rush comes from y=14"
|
| 274 |
+
# opening cannot generalise, but the capability generalises
|
| 275 |
+
# cleanly.
|
| 276 |
+
#
|
| 277 |
+
# Engine recalibration note (movement fixes): the engine
|
| 278 |
+
# movement fixes (attack_unit no-teleport; moving units fire and
|
| 279 |
+
# take fire) shifted combat balance. The old hard tier staged a
|
| 280 |
+
# rush band at BOTH latitudes every seed (enemy actors then
|
| 281 |
+
# didn't honour spawn_point); the off-latitude band drifted in
|
| 282 |
+
# as a dispersed second wave and the intended 4-tank buy-now
|
| 283 |
+
# force could not clear the kill bar before the deadline → the
|
| 284 |
+
# intended play LOST every hard seed. The band is now ONE
|
| 285 |
+
# concentrated wave at the active latitude (5× e1 + 1× e3 —
|
| 286 |
+
# slightly heavier than medium's 5× e1, so hard stays harder),
|
| 287 |
+
# which the buy-now force clears inside the clock while
|
| 288 |
+
# stall / build-weap-first still LOSE.
|
| 289 |
hard:
|
| 290 |
description: >
|
| 291 |
+
A rusher band (5 rifle infantry + 1 rocket soldier) is
|
| 292 |
+
charging your construction yard from the lane mouth — your
|
| 293 |
+
base stages from a seed-chosen latitude (north y=14 or
|
| 294 |
+
south y=26), so a single memorised pre-pick cannot
|
| 295 |
+
generalise. Your starting cash ($3400) is exactly enough for
|
| 296 |
+
EITHER 4 medium tanks (build 2tnk × 4 from the pre-placed
|
| 297 |
+
war factory) OR a second war factory (build weap, residual
|
| 298 |
+
$1400 = 1 tank). The rush is incoming NOW. Win when ≥5 enemy
|
| 299 |
+
units are killed AND your fact is still standing AND the
|
| 300 |
+
clock has not run out (tick ≤ 1499). Stall,
|
| 301 |
+
build-second-factory-first, or under-spend all fail.
|
|
|
|
| 302 |
overrides:
|
| 303 |
actors:
|
| 304 |
# ── AGENT spawn 0 — NORTH base (y=14) ─────────────────────
|
|
|
|
| 322 |
- {type: weap, owner: agent, position: [18, 26], spawn_point: 1}
|
| 323 |
- {type: fix, owner: agent, position: [18, 28], spawn_point: 1}
|
| 324 |
- {type: e1, owner: agent, position: [12, 26], spawn_point: 1, stance: 0}
|
| 325 |
+
# ── Rusher band — one concentrated wave per latitude, each
|
| 326 |
+
# tagged with the matching spawn_point so exactly ONE band
|
| 327 |
+
# places at the active base latitude (per-owner
|
| 328 |
+
# spawn_point filter — CLAUDE.md). 5× e1 + 1× e3 — slightly
|
| 329 |
+
# heavier than medium so hard stays harder, but light
|
| 330 |
+
# enough that the 4-tank buy-now force clears the kill bar
|
| 331 |
+
# inside the clock.
|
| 332 |
+
- {type: e1, owner: enemy, position: [70, 14], stance: 3, count: 5, spawn_point: 0}
|
| 333 |
+
- {type: e3, owner: enemy, position: [72, 14], stance: 3, count: 1, spawn_point: 0}
|
| 334 |
+
- {type: e1, owner: enemy, position: [70, 26], stance: 3, count: 5, spawn_point: 1}
|
| 335 |
+
- {type: e3, owner: enemy, position: [72, 26], stance: 3, count: 1, spawn_point: 1}
|
| 336 |
+
# Inert enemy `fact` marker far east (anti-DRAW) — must be
|
| 337 |
+
# duplicated per enemy spawn_point group (the per-owner
|
| 338 |
+
# filter would otherwise drop the unmatched one), one on
|
| 339 |
+
# each base latitude.
|
| 340 |
+
- {type: fact, owner: enemy, position: [120, 14], spawn_point: 0}
|
| 341 |
+
- {type: fact, owner: enemy, position: [120, 26], spawn_point: 1}
|
| 342 |
win_condition:
|
| 343 |
all_of:
|
| 344 |
- {units_killed_gte: 5}
|