yxc20098 commited on
Commit
7f3e1be
·
1 Parent(s): 7266bf3

fix(scenario): defense-rush-survive — recalibrate after engine movement fixes

Browse files

The engine combat rebalance (moving units fire and take fire; the
pbox now actively fires) made an undefended fact survive longer: a
full 60-turn no-win episode reaches only ~t3768 in interrupt mode,
so the old after_ticks:4801 deadline was INERT — never reached
inside max_turns. all-defense (3 pbox, 0 units) and all-economy
(no pbox) therefore SURVIVED to the end without winning and
without any fail clause biting → DRAW degeneracy.

Recalibration: the deadline is realigned to after_ticks:3200 /
within_ticks:3199 on every tier — reliably reached by every
60-turn episode, so a survive-but-not-win policy (all-defense's
static turret line, all-economy's undefended-but-not-yet-razed
base) is a real reachable timeout LOSS, never a draw. The intended
pbox+e1 defense-first play wins by tick <=1923 on every level and
seed, well inside the new clock.

Bar re-verified scripted, 3 levels x seeds 1-4: intended balanced
pbox+e1 play WINS every tier and seed; stall / all-defense /
all-economy / brute-army all LOSE every tier and seed as a real
fact-razed or deadline LOSS, never a draw.

openra_bench/scenarios/packs/defense-rush-survive.yaml CHANGED
@@ -82,23 +82,31 @@ levels:
82
  # ── EASY ── the bare rush-defense skill. ONE smaller wave (4× e1)
83
  # rushes the fact; respond with at least one pbox covering the lane
84
  # mouth AND three trained defenders, kill 4 of the rushers before the
85
- # deadline. Stall loses (fact razed in ~18 turns / tick ~1600);
86
- # all-defense (3 pbox, 0 units) loses on own_units_gte:3 (or fact
87
- # razed when pbox alone doesn't blunt the rush); all-economy (no
88
- # pbox) loses to the rush; brute-army (e1 only) loses on
89
- # building_count_gte:pbox at the deadline. max_turns 60 → reachable
90
- # tick ≥4848 in interrupt mode (each step ≤90 ticks; some shorter
91
- # due to enemy-spotted/own-destroyed events), comfortably past the
92
- # 4801 `after_ticks` fail so a non-winner is a real reachable
 
 
 
 
 
 
 
 
93
  # timeout LOSS, never a draw. The intended pbox+e1 parallel-queue
94
- # play wins by tick ≤528 (every seed), well inside.
95
  easy:
96
  description: >
97
  A single concentrated wave of 4 rifle infantry charges your base
98
  (fact+tent+powr already standing). Win by holding the line and
99
  sustaining production: build at least one pillbox (pbox) covering
100
  the lane mouth AND have ≥3 of your own units alive AND destroy
101
- ≥4 of the rushers before tick 4800. Stalling, building only
102
  pillboxes (no units), building no pillbox, or spending only on
103
  defenders without a pillbox all fail.
104
  overrides:
@@ -121,13 +129,13 @@ levels:
121
  - building_count_gte: {type: pbox, n: 1}
122
  - own_units_gte: 3
123
  - units_killed_gte: 4
124
- - within_ticks: 4800
125
  # No `not own_units_gte:1` fail clause: the agent starts unit-less
126
  # and the throughput bar is enforced by the WIN condition
127
  # (own_units_gte:3). Loss is by clock or by losing the fact.
128
  fail_condition:
129
  any_of:
130
- - after_ticks: 4801
131
  - not: {building_count_gte: {type: fact, n: 1}}
132
  max_turns: 60
133
 
@@ -142,7 +150,7 @@ levels:
142
  keep producing: at least one pillbox at the lane mouth AND ≥3
143
  own units AND ≥6 enemy kills AND ≥4 own buildings (the
144
  pre-placed fact+tent+powr plus at least one more — the pillbox
145
- counts) before tick 4800. The same lazy/single-axis policies that
146
  fail easy fail here.
147
  overrides:
148
  actors:
@@ -163,10 +171,10 @@ levels:
163
  - own_units_gte: 3
164
  - units_killed_gte: 6
165
  - building_total_gte: 4
166
- - within_ticks: 4800
167
  fail_condition:
168
  any_of:
169
- - after_ticks: 4801
170
  - not: {building_count_gte: {type: fact, n: 1}}
171
  max_turns: 60
172
 
@@ -232,10 +240,10 @@ levels:
232
  - units_killed_gte: 8
233
  - building_total_gte: 4
234
  - units_lost_lte: 3
235
- - within_ticks: 4800
236
  fail_condition:
237
  any_of:
238
- - after_ticks: 4801
239
  - not: {building_count_gte: {type: fact, n: 1}}
240
  - not: {units_lost_lte: 3}
241
  max_turns: 60
 
82
  # ── EASY ── the bare rush-defense skill. ONE smaller wave (4× e1)
83
  # rushes the fact; respond with at least one pbox covering the lane
84
  # mouth AND three trained defenders, kill 4 of the rushers before the
85
+ # deadline. Stall loses (fact razed); all-defense (3 pbox, 0 units)
86
+ # loses on own_units_gte:3 — the static defence survives so the
87
+ # `after_ticks` deadline is the catch-all that converts it to a
88
+ # real LOSS; all-economy (no pbox) loses to the rush / the
89
+ # deadline; brute-army (e1 only) loses on building_count_gte:pbox
90
+ # at the deadline.
91
+ #
92
+ # Engine recalibration note (movement fixes): with the engine
93
+ # combat rebalance an undefended fact survives long enough that a
94
+ # full 60-turn no-win episode reaches only ~t3768 in interrupt
95
+ # mode (each step is cut short by enemy-spotted / own-destroyed
96
+ # events). The old `after_ticks: 4801` was therefore INERT —
97
+ # never reached inside max_turns — so all-defense / all-economy
98
+ # ended as a DRAW. The deadline is realigned to `after_ticks:
99
+ # 3200` (within_ticks 3199), reliably reached by every 60-turn
100
+ # episode, so a survive-but-not-win policy is a real reachable
101
  # timeout LOSS, never a draw. The intended pbox+e1 parallel-queue
102
+ # play wins by tick ≤1923 (every level + seed), well inside.
103
  easy:
104
  description: >
105
  A single concentrated wave of 4 rifle infantry charges your base
106
  (fact+tent+powr already standing). Win by holding the line and
107
  sustaining production: build at least one pillbox (pbox) covering
108
  the lane mouth AND have ≥3 of your own units alive AND destroy
109
+ ≥4 of the rushers before tick 3199. Stalling, building only
110
  pillboxes (no units), building no pillbox, or spending only on
111
  defenders without a pillbox all fail.
112
  overrides:
 
129
  - building_count_gte: {type: pbox, n: 1}
130
  - own_units_gte: 3
131
  - units_killed_gte: 4
132
+ - within_ticks: 3199
133
  # No `not own_units_gte:1` fail clause: the agent starts unit-less
134
  # and the throughput bar is enforced by the WIN condition
135
  # (own_units_gte:3). Loss is by clock or by losing the fact.
136
  fail_condition:
137
  any_of:
138
+ - after_ticks: 3200
139
  - not: {building_count_gte: {type: fact, n: 1}}
140
  max_turns: 60
141
 
 
150
  keep producing: at least one pillbox at the lane mouth AND ≥3
151
  own units AND ≥6 enemy kills AND ≥4 own buildings (the
152
  pre-placed fact+tent+powr plus at least one more — the pillbox
153
+ counts) before tick 3199. The same lazy/single-axis policies that
154
  fail easy fail here.
155
  overrides:
156
  actors:
 
171
  - own_units_gte: 3
172
  - units_killed_gte: 6
173
  - building_total_gte: 4
174
+ - within_ticks: 3199
175
  fail_condition:
176
  any_of:
177
+ - after_ticks: 3200
178
  - not: {building_count_gte: {type: fact, n: 1}}
179
  max_turns: 60
180
 
 
240
  - units_killed_gte: 8
241
  - building_total_gte: 4
242
  - units_lost_lte: 3
243
+ - within_ticks: 3199
244
  fail_condition:
245
  any_of:
246
+ - after_ticks: 3200
247
  - not: {building_count_gte: {type: fact, n: 1}}
248
  - not: {units_lost_lte: 3}
249
  max_turns: 60