Xiaochuang Yuan commited on
Commit
96a24fc
ยท
1 Parent(s): 938baa1

combat-flanking-attack: per-tier maps reinforce flanker doctrine

Browse files

Replaces the generic rush-hour-arena with three custom-built 128x48
arenas that physically reinforce what this pack measures (refuse the
frontal trade, route around the line via off-axis corridors). The
defender geometry, actor layouts, and win/fail predicates are
unchanged; the new maps add WATER obstacle walls that close near-axis
shortcuts inside the e3 Dragon range envelope and channel the flanker
through the intended FAR-flank lanes.

Map design (mapgen 'arena' generator + obstacle clusters):

* easy - combat-flanking-attack-easy 128x48 cordon 2
ONE flank lane (NORTH y=2..7). Middle band y=10..15
walled across x=10..55 so a flanker MUST climb to y=2..7
via the west connector strip x=2..9. South half y=24..45
walled across x=10..125 so south flank is unavailable.

* medium - combat-flanking-attack-medium 128x48 cordon 2
TWO flank lanes (NORTH y=2..7 + SOUTH y=40..45). Mid-
bands y=10..15 and y=25..30 walled across x=10..55 so
neither lane can be 'shortened' inside the line's range
envelope.

* hard - combat-flanking-attack-hard 128x48 cordon 2
BOTH lanes open, agent stages NORTH (y=14..17) or SOUTH
(y=23..26) per seed (spawn_point round-robin). Walls
y=8..13 and y=27..32 across x=10..55 close shallow
shortcuts; the engagement axis y=14..26 stays open so a
brute marches into the 10-e3 wall (LOSS by line
firepower), while the FAR flanks at y=2..7 or y=40..45
are the only safe bypasses (reached via west connector
strip x=2..9).

Far-east sentinel `fact` moved from (120,20) to (120,4) so it
remains placeable inside the cleared north band on every tier.

Smoke check: every level compiles with map_supported=True; all
actors in-bounds (x in [0..127], y in [0..47]).

data/maps/combat-flanking-attack-easy.oramap ADDED
Binary file (984 Bytes). View file
 
data/maps/combat-flanking-attack-hard.oramap ADDED
Binary file (983 Bytes). View file
 
data/maps/combat-flanking-attack-medium.oramap ADDED
Binary file (984 Bytes). View file
 
openra_bench/scenarios/packs/combat-flanking-attack.yaml CHANGED
@@ -52,8 +52,30 @@
52
  # 1-vs-1 instead of 1-vs-N; all 4 tanks survive, โ‰ฅ5 e3 killed.
53
  #
54
  # Engine guardrails (per CLAUDE.md / SCENARIO_REVIEW_CHECKLIST.md):
55
- # - Map: rush-hour-arena (128 ร— 40, playable x in [2..126],
56
- # y in [2..38]). Strike force stages at x=6; enemy line at x=60.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  # - Persistent far-east enemy `fact` keeps the episode alive past
58
  # the moment the line is wiped, so the win/fail evaluator sees
59
  # the terminal frame (no DRAW collapse on enemy-unit wipe).
@@ -152,6 +174,30 @@ levels:
152
  rocket soldiers at x=60. Kill three enemies, keep at least three
153
  tanks, within about 50 turns.
154
  overrides:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  actors:
156
  # STRIKE FORCE โ€” 4 medium tanks stacked at the west edge,
157
  # stance:1 ReturnFire so they only engage when ordered.
@@ -168,8 +214,9 @@ levels:
168
  - {type: e3, owner: enemy, position: [60, 20], stance: 2}
169
  - {type: e3, owner: enemy, position: [60, 21], stance: 2}
170
  # Persistent far-east enemy fact โ€” prevents engine auto-done
171
- # on enemy unit wipe collapsing the run to DRAW.
172
- - {type: fact, owner: enemy, position: [120, 20]}
 
173
  win_condition:
174
  all_of:
175
  - {units_killed_gte: 3}
@@ -213,6 +260,24 @@ levels:
213
  Kill four enemies, keep at least three tanks, within about 50
214
  turns.
215
  overrides:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  actors:
217
  - {type: 2tnk, owner: agent, position: [6, 18], stance: 1}
218
  - {type: 2tnk, owner: agent, position: [6, 19], stance: 1}
@@ -223,14 +288,15 @@ levels:
223
  # e3 within Dragon range (~5) of a tank fires on that tank.
224
  # Frontal: lead tank at x=55..60, y=20 sits in range of
225
  # every e3 simultaneously โ‡’ 5 rockets/turn focused on lead.
226
- # Flank from y=8 or y=32 keeps all but the edge e3 out of
227
- # range; only 1-2 e3 fire on the leading flanker at a time.
 
228
  - {type: e3, owner: enemy, position: [60, 18], stance: 2}
229
  - {type: e3, owner: enemy, position: [60, 19], stance: 2}
230
  - {type: e3, owner: enemy, position: [60, 20], stance: 2}
231
  - {type: e3, owner: enemy, position: [60, 21], stance: 2}
232
  - {type: e3, owner: enemy, position: [60, 22], stance: 2}
233
- - {type: fact, owner: enemy, position: [120, 20]}
234
  win_condition:
235
  all_of:
236
  - {units_killed_gte: 4}
@@ -281,6 +347,34 @@ levels:
281
  stage in the north or south corridor depending on seed. Kill
282
  five enemies, keep at least three tanks, within about 50 turns.
283
  overrides:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
284
  actors:
285
  # spawn_point 0 โ€” NORTH staging corridor (y=14..17). Closer
286
  # to the e3 line latitude so a frontal march MUST engage the
@@ -300,9 +394,9 @@ levels:
300
  # โ‡’ every e3 in Dragon range of a tank fires on that tank.
301
  # Frontal from either spawn enters the kill envelope of
302
  # the entire 10-e3 wall (Manhattan โ‰ค5 to all e3 from a tank
303
- # on the engagement axis at x=55..62). Flank from y=8 or
304
- # y=32 keeps all but the edge e3 out of range โ€” sequenced
305
- # 1-vs-1 engagement preserves the survival bar.
306
  - {type: e3, owner: enemy, position: [60, 17], stance: 2}
307
  - {type: e3, owner: enemy, position: [60, 18], stance: 2}
308
  - {type: e3, owner: enemy, position: [60, 19], stance: 2}
@@ -313,7 +407,7 @@ levels:
313
  - {type: e3, owner: enemy, position: [62, 19], stance: 2}
314
  - {type: e3, owner: enemy, position: [62, 21], stance: 2}
315
  - {type: e3, owner: enemy, position: [62, 22], stance: 2}
316
- - {type: fact, owner: enemy, position: [120, 20]}
317
  win_condition:
318
  all_of:
319
  - {units_killed_gte: 5}
 
52
  # 1-vs-1 instead of 1-vs-N; all 4 tanks survive, โ‰ฅ5 e3 killed.
53
  #
54
  # Engine guardrails (per CLAUDE.md / SCENARIO_REVIEW_CHECKLIST.md):
55
+ # - Map: per-tier custom arena (128 ร— 48, cordon 2 โ‡’ playable
56
+ # x in [2..125], y in [2..45]) generated via mapgen's `arena`
57
+ # generator with WATER obstacle clusters that physically
58
+ # reinforce the flanker-vs-frontal doctrine:
59
+ # * easy โ€” `combat-flanking-attack-easy`: ONE flank lane
60
+ # (NORTH y=2..7). Middle band y=10..15 walled
61
+ # across x=10..55 so a flanker MUST climb to y=2..7
62
+ # via the west connector strip x=2..9. South half
63
+ # y=24..45 walled across x=10..125 so south flank
64
+ # is unavailable on easy.
65
+ # * medium โ€” `combat-flanking-attack-medium`: TWO flank lanes
66
+ # (NORTH y=2..7 + SOUTH y=40..45). Mid-bands
67
+ # y=10..15 and y=25..30 walled across x=10..55 so
68
+ # neither lane can be "shortened" inside the line's
69
+ # Dragon range envelope.
70
+ # * hard โ€” `combat-flanking-attack-hard`: BOTH lanes open,
71
+ # agent stages NORTH (y=14..17) or SOUTH (y=23..26)
72
+ # per seed. Walls y=8..13 and y=27..32 across
73
+ # x=10..55 close shallow shortcuts; the engagement
74
+ # axis y=14..26 stays open so a brute marches into
75
+ # the 10-e3 wall (LOSS), while the FAR flanks at
76
+ # y=2..7 or y=40..45 are the only safe bypasses
77
+ # (reached via west connector strip x=2..9).
78
+ # Strike force at x=6; enemy line at x=60.
79
  # - Persistent far-east enemy `fact` keeps the episode alive past
80
  # the moment the line is wiped, so the win/fail evaluator sees
81
  # the terminal frame (no DRAW collapse on enemy-unit wipe).
 
174
  rocket soldiers at x=60. Kill three enemies, keep at least three
175
  tanks, within about 50 turns.
176
  overrides:
177
+ # EASY MAP โ€” 128x48 arena (cordon 2 -> playable x in [2..125],
178
+ # y in [2..45]). ONE obvious flank corridor (NORTH y=2..7).
179
+ # Middle band y=10..15 walled across x=10..55 so a flanker
180
+ # climbing from the west stage at y=18..21 cannot "shortcut"
181
+ # close to the line; it must reach y=2..7 via the west
182
+ # connector strip x=2..9 (cordon-side, always clear). South
183
+ # half y=24..45 walled across x=10..55 so the south flank is
184
+ # impossible (easy tier teaches single-corridor recognition).
185
+ base_map:
186
+ generator: arena
187
+ name: combat-flanking-attack-easy
188
+ width: 128
189
+ height: 48
190
+ cordon: 2
191
+ title: 'Flanking-Attack โ€” Easy (North Lane Only)'
192
+ obstacles:
193
+ # North middle wall โ€” closes y=10..15 across x=10..55.
194
+ - {x: 10, y: 10, w: 46, h: 6}
195
+ # South wall โ€” closes y=24..45 across x=10..125 so a south
196
+ # flank is unavailable on easy. (West strip x=2..9 stays
197
+ # clear; engagement strip x=56..125 also stays clear so
198
+ # the flanker can drive east on y=2..7 past the line and
199
+ # descend.)
200
+ - {x: 10, y: 24, w: 116, h: 22}
201
  actors:
202
  # STRIKE FORCE โ€” 4 medium tanks stacked at the west edge,
203
  # stance:1 ReturnFire so they only engage when ordered.
 
214
  - {type: e3, owner: enemy, position: [60, 20], stance: 2}
215
  - {type: e3, owner: enemy, position: [60, 21], stance: 2}
216
  # Persistent far-east enemy fact โ€” prevents engine auto-done
217
+ # on enemy unit wipe collapsing the run to DRAW. Placed at
218
+ # y=4 inside the cleared north band so it remains placeable.
219
+ - {type: fact, owner: enemy, position: [120, 4]}
220
  win_condition:
221
  all_of:
222
  - {units_killed_gte: 3}
 
260
  Kill four enemies, keep at least three tanks, within about 50
261
  turns.
262
  overrides:
263
+ # MEDIUM MAP โ€” 128x48 arena (cordon 2 -> playable x in [2..125],
264
+ # y in [2..45]). TWO flank corridors (NORTH y=2..7 + SOUTH
265
+ # y=40..45). Mid-bands y=10..15 and y=25..30 walled across
266
+ # x=10..55 so neither lane can be "shortened" by cutting
267
+ # close to the line (cutting at y=12 or y=28 would put the
268
+ # tank inside Dragon range of the e3 wall).
269
+ base_map:
270
+ generator: arena
271
+ name: combat-flanking-attack-medium
272
+ width: 128
273
+ height: 48
274
+ cordon: 2
275
+ title: 'Flanking-Attack โ€” Medium (Two Flank Lanes)'
276
+ obstacles:
277
+ # North middle wall โ€” closes y=10..15 across x=10..55.
278
+ - {x: 10, y: 10, w: 46, h: 6}
279
+ # South middle wall โ€” closes y=25..30 across x=10..55.
280
+ - {x: 10, y: 25, w: 46, h: 6}
281
  actors:
282
  - {type: 2tnk, owner: agent, position: [6, 18], stance: 1}
283
  - {type: 2tnk, owner: agent, position: [6, 19], stance: 1}
 
288
  # e3 within Dragon range (~5) of a tank fires on that tank.
289
  # Frontal: lead tank at x=55..60, y=20 sits in range of
290
  # every e3 simultaneously โ‡’ 5 rockets/turn focused on lead.
291
+ # Flank from y=2..7 (north lane) or y=40..45 (south lane)
292
+ # keeps all but the edge e3 out of range; only 1-2 e3 fire
293
+ # on the leading flanker at a time.
294
  - {type: e3, owner: enemy, position: [60, 18], stance: 2}
295
  - {type: e3, owner: enemy, position: [60, 19], stance: 2}
296
  - {type: e3, owner: enemy, position: [60, 20], stance: 2}
297
  - {type: e3, owner: enemy, position: [60, 21], stance: 2}
298
  - {type: e3, owner: enemy, position: [60, 22], stance: 2}
299
+ - {type: fact, owner: enemy, position: [120, 4]}
300
  win_condition:
301
  all_of:
302
  - {units_killed_gte: 4}
 
347
  stage in the north or south corridor depending on seed. Kill
348
  five enemies, keep at least three tanks, within about 50 turns.
349
  overrides:
350
+ # HARD MAP โ€” 128x48 arena (cordon 2 -> playable y in [2..45]).
351
+ # BOTH flank corridors open (NORTH y=2..7 + SOUTH y=40..45),
352
+ # but the agent stages NORTH (y=14..17) or SOUTH (y=23..26)
353
+ # per seed. Walls y=8..13 and y=27..32 across x=10..55 close
354
+ # the shallow shortcuts that would otherwise let a tank
355
+ # diagonally cut close to the line at lower attrition. The
356
+ # engagement axis y=14..26 stays clear so a brute attack_move
357
+ # east still funnels into the line's kill envelope (LOSS),
358
+ # while the only safe bypass routes are the FAR flanks
359
+ # y=2..7 (north spawn) or y=40..45 (south spawn) reached via
360
+ # the west connector strip x=2..9 (cordon-side, always
361
+ # clear).
362
+ base_map:
363
+ generator: arena
364
+ name: combat-flanking-attack-hard
365
+ width: 128
366
+ height: 48
367
+ cordon: 2
368
+ title: 'Flanking-Attack โ€” Hard (Spawn-Varied Flank)'
369
+ obstacles:
370
+ # North middle wall โ€” closes y=8..13 across x=10..55. y=14
371
+ # stays clear so the NORTH staging corridor (y=14..17) is
372
+ # not isolated from the west connector x=2..9.
373
+ - {x: 10, y: 8, w: 46, h: 6}
374
+ # South middle wall โ€” closes y=27..32 across x=10..55. y=26
375
+ # stays clear so the SOUTH staging corridor (y=23..26) is
376
+ # not isolated from the west connector x=2..9.
377
+ - {x: 10, y: 27, w: 46, h: 6}
378
  actors:
379
  # spawn_point 0 โ€” NORTH staging corridor (y=14..17). Closer
380
  # to the e3 line latitude so a frontal march MUST engage the
 
394
  # โ‡’ every e3 in Dragon range of a tank fires on that tank.
395
  # Frontal from either spawn enters the kill envelope of
396
  # the entire 10-e3 wall (Manhattan โ‰ค5 to all e3 from a tank
397
+ # on the engagement axis at x=55..62). Flank from y=2..7 or
398
+ # y=40..45 keeps all but the edge e3 out of range โ€”
399
+ # sequenced 1-vs-1 engagement preserves the survival bar.
400
  - {type: e3, owner: enemy, position: [60, 17], stance: 2}
401
  - {type: e3, owner: enemy, position: [60, 18], stance: 2}
402
  - {type: e3, owner: enemy, position: [60, 19], stance: 2}
 
407
  - {type: e3, owner: enemy, position: [62, 19], stance: 2}
408
  - {type: e3, owner: enemy, position: [62, 21], stance: 2}
409
  - {type: e3, owner: enemy, position: [62, 22], stance: 2}
410
+ - {type: fact, owner: enemy, position: [120, 4]}
411
  win_condition:
412
  all_of:
413
  - {units_killed_gte: 5}