yxc20098 commited on
Commit
0fb13a4
·
1 Parent(s): f5eebfa

fix(scenario): econ-buy-vs-build-decision — recalibrate after engine movement fixes

Browse files

The 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.

openra_bench/scenarios/packs/econ-buy-vs-build-decision.yaml CHANGED
@@ -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
- # places at BOTH latitudes every seed (enemy actors don't honour
69
- # spawn_point, CLAUDE.md) but the rusher targets the AGENT
70
- # centroid so the active band is always the one in the agent's
71
- # latitude.
 
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; the
266
- # rusher band places at BOTH latitudes every seed (enemy actors
267
- # don't honour spawn_point CLAUDE.md oramap.rs footgun), but
268
- # the `rusher` bot always targets the agent centroid so the active
269
- # threat axis flips per seed. The buy-vs-build decision is
270
- # IDENTICAL across spawns (the cash, the war factory, the
271
- # response shape are all symmetric) a memorised "rush comes
272
- # from y=14" opening cannot generalise, but the capability
273
- # generalises cleanly. Kill bar 6, same clock.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  hard:
275
  description: >
276
- Two rusher bands (one north y=14, one south y=26) are visible
277
- at the lane mouth but the rusher bot always charges YOUR
278
- construction yard (whichever latitude you spawned at). Your
279
- starting cash ($3400) is exactly enough for EITHER 4 medium
280
- tanks (build 2tnk × 4 from the pre-placed war factory) OR a
281
- second war factory (build weap, residual $1400 = 1 tank).
282
- The rush is incoming NOW. Win when ≥6 enemy units are killed
283
- AND your fact is still standing AND the clock has not run out
284
- (tick 3600). Stall, build-second-factory-first, or
285
- under-spend all fail. The base latitude varies by seed so a
286
- single memorised pre-pick cannot generalise — the buy-now
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
- # ── NORTH rusher band (y=14) always places ──────────────
312
- # Rusher targets agent centroid, so on a NORTH spawn this
313
- # band charges the fact directly; on a SOUTH spawn it
314
- # angles southward (the rusher's relentless charge always
315
- # reorients to the centroid). Bands kept light (4× e1 each)
316
- # so 4 medium tanks at the base auto-fire enough kills to
317
- # clear the bar before fact damage compounds.
318
- - {type: e1, owner: enemy, position: [70, 14], stance: 3, count: 4}
319
- # ── SOUTH rusher band (y=26) always places ──────────────
320
- - {type: e1, owner: enemy, position: [70, 26], stance: 3, count: 4}
321
- - {type: fact, owner: enemy, position: [120, 20]}
 
 
 
 
 
 
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). 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}