Spaces:
Running
build-defensive-tower-cluster: tailor map to chokepoint-arena (96x40)
Browse filesReplace the shared rush-hour-arena (128x40 open) with a per-pack
chokepoint-arena map (96x40) that physically funnels the rush band
through a single 4-cell corridor (y=18..21 through a vertical water
wall at x=43..52, pinch_width=10). The agent fact sits at x=10 in the
WEST lobe; attackers spawn in the EAST lobe at (70,20) and the rusher
bot's A* path to the agent centroid has no alternative but the
corridor โ water elsewhere along x=43..52.
Why the new geometry strengthens the discrimination:
* Stall โ rush funnels through the corridor and razes the fact.
* Pbox-line (cells [(20,18),(25,19),(30,20),(35,21)] in the agent's
west lobe, between fact and corridor) spreads thin along the
y=18..21 attack lane, fails the radius-4 region clause around
the fact (0 of 4 inside the disc), and dissipates kill rate
across the corridor mouth so the band reaches the fact.
* Pure-army โ fails count clause and is overrun.
* Intended cluster (4 pbox wrapping the active fact within radius
4) sees the WHOLE band sequentially as it funnels out of the
corridor; overlapping pbox dps shreds it.
Map spec (chokepoint-arena, 96x40, cordon=2):
* pinch_x=48, pinch_width=10, corridor_width=4, corridor_y=20
* Single materialised map shared across all three tiers
(build-defensive-tower-cluster-chokepoint-96x40.oramap)
Actor changes:
* Drop the (120,20) anti-DRAW enemy fact (out of bounds on a
96-wide map); relocate to (90,20) in the east lobe.
* Move attacker spawn from (60..62, *) to (70..72, *) (still east
lobe; closer to the corridor mouth on the smaller map).
* Hard: add a scheduled_events spawn_actors wave at tick 2700
(4xe1 + 1xe3) so the cluster has to handle reinforcements after
it assembles โ strengthens the bar against line/pure-army.
Same 4-pbox / 2400-cash budget and kill bars (3/5/6) as before; only
the map and per-tier actor positions move. Win/fail predicates
unchanged.
Validation (scripted policies, tests/test_build_defensive_tower_cluster.py):
21 tests pass (4 seeds x 3 tiers):
* Intended adaptive cluster WIN every level + every seed.
* Stall LOSS x12, pbox-line LOSS x12, pure-army LOSS x12.
* Wrong-centre cluster LOSS on hard (fact-flip discrimination).
* Determinism, invariants, fact-alive predicate, hard
spawn_points, reachable timeout all pass.
|
Binary file (942 Bytes). View file
|
|
|
|
Binary file (881 Bytes). View file
|
|
|
|
@@ -123,7 +123,41 @@ meta:
|
|
| 123 |
- "military quadrant doctrine"
|
| 124 |
author: "openra-bench"
|
| 125 |
|
| 126 |
-
base_map:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
base:
|
| 129 |
agent: {faction: allies}
|
|
|
|
| 123 |
- "military quadrant doctrine"
|
| 124 |
author: "openra-bench"
|
| 125 |
|
| 126 |
+
base_map:
|
| 127 |
+
# Tailored arena: 128x40 open rectangle (cordon 2) so the agent fact at
|
| 128 |
+
# the map CENTRE (64,20) is EQUIDISTANT from all four diagonal corners
|
| 129 |
+
# โ the geometric prerequisite for the skirt-vs-concentrate test. Four
|
| 130 |
+
# symmetric far-corner water markers (2x2 each, near the map's NE/NW/
|
| 131 |
+
# SE/SW edges) visually demarcate the four quadrants without touching
|
| 132 |
+
# any rusher path or the corner pbox discs themselves: the markers sit
|
| 133 |
+
# OUTSIDE every corner-region disc (radius-4 around (46,9)/(82,9)/(46,
|
| 134 |
+
# 31)/(82,31) for easy/medium, and (32,9)/(96,9)/(32,31)/(96,31) for
|
| 135 |
+
# the hard WEST/EAST seeds) and OUTSIDE every diagonal rush corridor
|
| 136 |
+
# from corner spawn to fact, so they affect neither the build placement
|
| 137 |
+
# nor the rush charge. They give each quadrant a distinct terrain
|
| 138 |
+
# signature so a "centre-only" or "mass-on-one-corner" defense reads
|
| 139 |
+
# visually wrong before the predicate even bites. The 128-wide canvas
|
| 140 |
+
# is the minimum that admits the hard EAST seed's NE corner at x=96
|
| 141 |
+
# with playable cells out to x=125. Bounds 2,2,124,36.
|
| 142 |
+
generator: arena
|
| 143 |
+
name: build-defensive-skirt-corners-128x40
|
| 144 |
+
width: 128
|
| 145 |
+
height: 40
|
| 146 |
+
cordon: 2
|
| 147 |
+
title: Defensive Skirt Four Corners 128x40
|
| 148 |
+
obstacles:
|
| 149 |
+
# NW quadrant marker โ between map NW corner and the easy NW disc
|
| 150 |
+
# (46,9). At (22,5)-(23,6) it sits ~24 cells from the NW corner disc
|
| 151 |
+
# centre, well outside its radius-4 envelope, and ~10 cells off the
|
| 152 |
+
# straight diagonal from (46,9) toward the fact at (64,20) so it
|
| 153 |
+
# never blocks a rush.
|
| 154 |
+
- {x: 22, y: 5, w: 2, h: 2}
|
| 155 |
+
# NE quadrant marker โ symmetric, near map NE corner.
|
| 156 |
+
- {x: 104, y: 5, w: 2, h: 2}
|
| 157 |
+
# SW quadrant marker โ symmetric, near map SW corner.
|
| 158 |
+
- {x: 22, y: 33, w: 2, h: 2}
|
| 159 |
+
# SE quadrant marker โ symmetric, near map SE corner.
|
| 160 |
+
- {x: 104, y: 33, w: 2, h: 2}
|
| 161 |
|
| 162 |
base:
|
| 163 |
agent: {faction: allies}
|
|
@@ -2,22 +2,43 @@
|
|
| 2 |
#
|
| 3 |
# REASONING focus: CONCENTRATED-DEFENSE topology. A single high-value
|
| 4 |
# building (the agent fact) is the protected asset. A heavy rush band
|
| 5 |
-
#
|
| 6 |
-
#
|
| 7 |
-
#
|
| 8 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
#
|
| 10 |
# The win predicate makes the topology decision load-bearing โ total
|
| 11 |
# pbox count alone is not enough; โฅ3 of the pillboxes must sit INSIDE
|
| 12 |
# a radius-4 disc around the fact. A pbox-LINE policy (the obvious
|
| 13 |
-
# sibling: pboxes strung
|
| 14 |
-
# count but FAILS the region bar AND lets the
|
| 15 |
-
# band overwhelm the thin frontage at the
|
| 16 |
-
# cluster WINS.
|
| 17 |
#
|
| 18 |
-
# Sibling to
|
| 19 |
-
#
|
| 20 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
#
|
| 22 |
# Real-world anchor:
|
| 23 |
# โข ERQA spatial-commit primitive โ place a small, finite resource set
|
|
@@ -30,44 +51,54 @@
|
|
| 30 |
# uniform spread across all approaches.
|
| 31 |
#
|
| 32 |
# Discrimination (four-script bar โ scripted, no model needed):
|
| 33 |
-
# โข stall (observe-only): spends nothing, the rush
|
| 34 |
-
#
|
| 35 |
-
# `after_ticks` also fires as a
|
|
|
|
| 36 |
# โข pbox-line (the "build-defensive-tower-line" solution โ pboxes
|
| 37 |
-
# strung along the attack lane far from the fact): meets
|
| 38 |
-
# clause but FAILS the region clause (
|
| 39 |
-
# inside the radius-4 disc around the fact) AND the
|
| 40 |
-
# rusher band slip through
|
| 41 |
# โข pure-army (only e1, no pbox): FAILS the count clause AND the
|
| 42 |
# region clause; the rifle wall alone cannot stop the heavier
|
| 43 |
# medium/hard waves either โ LOSS.
|
| 44 |
# โข intended CLUSTER (3-4 pboxes wrapping the fact within radius 4):
|
| 45 |
-
# overlapping pbox fire shreds the focused rush
|
| 46 |
-
# kill + fact-alive clauses all satisfied โ WIN.
|
| 47 |
#
|
| 48 |
# Why the spec works (engine combat sheet, per CLAUDE.md):
|
| 49 |
# โข pbox = pillbox (anti-infantry base defence; cost 600cr; dps very
|
| 50 |
# high vs rifle infantry; 1ร1 footprint, easy to cluster). The
|
| 51 |
# defense queue is SEPARATE from infantry so parallel queues are
|
| 52 |
# allowed (CLAUDE.md).
|
| 53 |
-
# โข A radius-4 disc around the fact
|
| 54 |
-
#
|
| 55 |
-
#
|
| 56 |
# โข `building_count_gte:{fact,1}` (PRESENT-TENSE) is the fact-alive
|
| 57 |
# check โ `has_building` is a one-shot ever-seen set that stays true
|
| 58 |
# after the fact is razed (documented CLAUDE.md footgun).
|
| 59 |
# โข `after_ticks: BUDGET+1` fail clause is reachable within max_turns
|
| 60 |
# (no interrupts โ exactly 90 ticks/step โ max tick = 93+90ยท(N-1));
|
| 61 |
# stallers hit it and LOSE rather than draw.
|
| 62 |
-
# โข A persistent unarmed enemy `fact` at
|
| 63 |
-
# alive past full rusher elimination so the win/fail
|
| 64 |
-
# the terminal frame (no DRAW collapse on
|
|
|
|
|
|
|
| 65 |
# โข The `rusher` bot relentlessly charges the agent's centroid (the
|
| 66 |
# agent fact) โ that's WHY a cluster at the fact wins and a line
|
| 67 |
-
#
|
| 68 |
-
#
|
| 69 |
-
#
|
| 70 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
meta:
|
| 73 |
id: build-defensive-tower-cluster
|
|
@@ -75,13 +106,14 @@ meta:
|
|
| 75 |
capability: reasoning
|
| 76 |
real_world_meaning: >
|
| 77 |
A single high-value building (the fact โ your construction yard) is
|
| 78 |
-
the protected asset, and a concentrated enemy band
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
|
|
|
| 85 |
The win predicate makes the topology decision load-bearing: total
|
| 86 |
pbox count alone is not enough; โฅ3 of the pillboxes must sit INSIDE
|
| 87 |
the radius-4 disc around the fact, AND the fact must survive.
|
|
@@ -100,7 +132,20 @@ meta:
|
|
| 100 |
- "defense-in-depth around critical infrastructure"
|
| 101 |
author: "openra-bench"
|
| 102 |
|
| 103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
|
| 105 |
base:
|
| 106 |
agent: {faction: allies}
|
|
@@ -116,9 +161,10 @@ base:
|
|
| 116 |
planning: true
|
| 117 |
# No interrupts โ defense topology is a STATIC up-front decision; the
|
| 118 |
# threat axis is known a priori (the rusher always charges the agent
|
| 119 |
-
# fact
|
| 120 |
-
# (exactly 90 ticks/step โ
|
| 121 |
-
# `after_ticks` fail clause
|
|
|
|
| 122 |
interrupts: {}
|
| 123 |
termination:
|
| 124 |
max_ticks: 12000
|
|
@@ -128,36 +174,25 @@ levels:
|
|
| 128 |
# โโ EASY โโ bare CONCENTRATED-DEFENSE skill: budget covers exactly
|
| 129 |
# 4 pbox (2400cr). Win requires โฅ3 of the 4 INSIDE the radius-4 disc
|
| 130 |
# around the fact at (10,20). A line layout (pbox strung at x=20..35
|
| 131 |
-
# along the
|
| 132 |
-
# fails
|
|
|
|
|
|
|
| 133 |
# max_turns 60 โ reachable tick 93+90ยท59 = 5403; deadline 5400.
|
| 134 |
easy:
|
| 135 |
-
# Original (pre-verbosity-sweep) description preserved for
|
| 136 |
-
# contributors. The trimmed version below removes scripted-policy
|
| 137 |
-
# spoilers and cell-coord dumps; load-bearing intent kept.
|
| 138 |
-
#
|
| 139 |
-
# A rusher band of rifle infantry charges your construction yard
|
| 140 |
-
# (fact, at (10,20)). Build 4 pillboxes (pbox โ 600cr each, budget
|
| 141 |
-
# exactly 2400) AND place at least 3 of them INSIDE the radius-4
|
| 142 |
-
# disc around the fact, so their overlapping fields of fire shred
|
| 143 |
-
# the rush at the doorstep of the protected asset. A thin pillbox
|
| 144 |
-
# LINE strung along the attack lane (pboxes at x=20..35) fails the
|
| 145 |
-
# region clause (none land inside the radius-4 disc around the
|
| 146 |
-
# fact) and also lets the rifle band slip through. Stall, pure-
|
| 147 |
-
# army, and pbox-line all LOSE. The fact must survive; โฅ3 enemy
|
| 148 |
-
# units must die before tick 5400.
|
| 149 |
description: >
|
| 150 |
-
A rifle band
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
within
|
|
|
|
| 154 |
starting_cash: 2400
|
| 155 |
overrides:
|
| 156 |
actors:
|
| 157 |
-
# Pre-placed agent base. Fact at (10,20);
|
| 158 |
-
# of the fact (behind it) so they aren't in
|
| 159 |
-
# fire and they leave plenty of cells inside
|
| 160 |
-
# disc free for cluster pboxes.
|
| 161 |
- {type: fact, owner: agent, position: [10, 20]}
|
| 162 |
- {type: tent, owner: agent, position: [6, 18]}
|
| 163 |
- {type: powr, owner: agent, position: [6, 22]}
|
|
@@ -168,15 +203,16 @@ levels:
|
|
| 168 |
- {type: e1, owner: agent, position: [12, 19], stance: 2}
|
| 169 |
- {type: e1, owner: agent, position: [12, 20], stance: 2}
|
| 170 |
- {type: e1, owner: agent, position: [12, 21], stance: 2}
|
| 171 |
-
# Rusher band
|
| 172 |
-
# the way to the agent
|
| 173 |
-
# to overwhelm a thin line / no-pbox defence
|
| 174 |
-
# โฅ3 pbox (dps very high vs infantry, overlapping fields of
|
| 175 |
-
# fire) shreds it
|
| 176 |
-
- {type: e1, owner: enemy, position: [
|
| 177 |
# Unarmed high-HP marker (anti-DRAW): keeps the episode alive
|
| 178 |
# past full rusher elimination so the win/fail check fires.
|
| 179 |
-
|
|
|
|
| 180 |
win_condition:
|
| 181 |
all_of:
|
| 182 |
- {building_count_gte: {type: pbox, n: 4}}
|
|
@@ -196,29 +232,18 @@ levels:
|
|
| 196 |
# line layout (1 at fact, 3 along the lane) still meets the count
|
| 197 |
# but FAILS the region (1 of 4 inside the disc, not the required 3)
|
| 198 |
# AND the line cannot mass enough firepower to stop the heavier
|
| 199 |
-
# band. The intended cluster (3
|
| 200 |
-
# nearby, OR all 4 inside the disc)
|
| 201 |
-
# 5 to require the cluster to actually
|
|
|
|
| 202 |
# max_turns 60 โ reachable tick 5403; deadline 5400.
|
| 203 |
medium:
|
| 204 |
-
# Original (pre-verbosity-sweep) description preserved for
|
| 205 |
-
# contributors. The trimmed version below removes scripted-policy
|
| 206 |
-
# spoilers and cell-coord dumps; load-bearing intent kept.
|
| 207 |
-
#
|
| 208 |
-
# The full rush band โ 6 rifle infantry + 2 rocket soldiers โ
|
| 209 |
-
# charges your construction yard (fact, at (10,20)). Build 4
|
| 210 |
-
# pillboxes (budget exactly 2400cr = 4 pbox at 600 each) AND
|
| 211 |
-
# place at least 3 of them INSIDE the radius-4 disc around the
|
| 212 |
-
# fact. A pillbox LINE (1 at the fact, 3 along the lane) meets
|
| 213 |
-
# the count but FAILS the region bar (1 of 4 inside the disc, not
|
| 214 |
-
# the required 3) AND cannot mass enough firepower to blunt the
|
| 215 |
-
# heavier band. Stall, pure-army, and pbox-line all LOSE. The
|
| 216 |
-
# fact must survive; โฅ5 enemy units must die before tick 5400.
|
| 217 |
description: >
|
| 218 |
-
Heavier rush โ rifles plus rocket soldiers โ
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
five, within about
|
|
|
|
| 222 |
starting_cash: 2400
|
| 223 |
overrides:
|
| 224 |
actors:
|
|
@@ -231,16 +256,14 @@ levels:
|
|
| 231 |
- {type: e1, owner: agent, position: [12, 20], stance: 2}
|
| 232 |
- {type: e1, owner: agent, position: [12, 21], stance: 2}
|
| 233 |
- {type: e1, owner: agent, position: [8, 20], stance: 2}
|
| 234 |
-
# Canonical heavy rush: 6ร e1 + 2ร e3
|
| 235 |
-
#
|
| 236 |
-
# the
|
| 237 |
-
#
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
-
|
| 241 |
-
- {type:
|
| 242 |
-
# Anti-DRAW marker.
|
| 243 |
-
- {type: fact, owner: enemy, position: [120, 20]}
|
| 244 |
win_condition:
|
| 245 |
all_of:
|
| 246 |
- {building_count_gte: {type: pbox, n: 4}}
|
|
@@ -263,32 +286,21 @@ levels:
|
|
| 263 |
# READ the fact's latitude from observation and place the cluster
|
| 264 |
# relative to it. Enemies don't honour spawn_point (engine:
|
| 265 |
# oramap.rs::expand_scenario_actors per CLAUDE.md), so the rusher
|
| 266 |
-
# band is staged
|
| 267 |
-
#
|
| 268 |
-
#
|
| 269 |
-
#
|
|
|
|
|
|
|
|
|
|
| 270 |
# max_turns 60 โ reachable tick 5403; deadline 5400.
|
| 271 |
hard:
|
| 272 |
-
# Original (pre-verbosity-sweep) description preserved for
|
| 273 |
-
# contributors. The trimmed version below removes scripted-policy
|
| 274 |
-
# spoilers and cell-coord dumps; load-bearing intent kept.
|
| 275 |
-
#
|
| 276 |
-
# The agent construction yard (fact) flips between NORTH (y=14)
|
| 277 |
-
# and SOUTH (y=26) by seed; the cluster centre must follow.
|
| 278 |
-
# Build 4 pillboxes (budget 2400cr = 4 pbox at 600 each) AND
|
| 279 |
-
# place at least 3 of them INSIDE the radius-4 disc around the
|
| 280 |
-
# CURRENT fact (either (10,14) or (10,26) โ read it from the
|
| 281 |
-
# observation). A line layout, a cluster around (10,20) (the
|
| 282 |
-
# old centre that no longer holds the fact), or any plan that
|
| 283 |
-
# doesn't follow the fact's latitude FAILS the region bar AND
|
| 284 |
-
# lets the rush reach the fact. Stall, pure-army, pbox-line
|
| 285 |
-
# all LOSE. The fact must survive; โฅ6 enemy units must die
|
| 286 |
-
# before tick 5400.
|
| 287 |
description: >
|
| 288 |
-
Same rush, but the yard sits in the
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
within
|
|
|
|
| 292 |
starting_cash: 2400
|
| 293 |
overrides:
|
| 294 |
actors:
|
|
@@ -310,18 +322,23 @@ levels:
|
|
| 310 |
- {type: e1, owner: agent, position: [12, 27], stance: 2, spawn_point: 1}
|
| 311 |
- {type: e1, owner: agent, position: [8, 26], stance: 2, spawn_point: 1}
|
| 312 |
# Enemies don't honour spawn_point (CLAUDE.md). Stage the rush
|
| 313 |
-
# band at
|
| 314 |
-
#
|
| 315 |
-
#
|
| 316 |
-
#
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
-
|
| 320 |
-
- {type:
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 325 |
win_condition:
|
| 326 |
all_of:
|
| 327 |
- {building_count_gte: {type: pbox, n: 4}}
|
|
|
|
| 2 |
#
|
| 3 |
# REASONING focus: CONCENTRATED-DEFENSE topology. A single high-value
|
| 4 |
# building (the agent fact) is the protected asset. A heavy rush band
|
| 5 |
+
# is FORCED through a single narrow corridor (the chokepoint between
|
| 6 |
+
# two open lobes), then converges on the agent's centroid โ which IS
|
| 7 |
+
# the fact. The right doctrine is a TIGHT CLUSTER of pillboxes
|
| 8 |
+
# WRAPPING the fact (overlapping fields of fire on the single cell the
|
| 9 |
+
# fact sits on), NOT a thin line spread between the fact and the
|
| 10 |
+
# corridor โ because the line dissipates its kill rate across the
|
| 11 |
+
# 4-cell corridor mouth and cannot mass enough fire on the rush band
|
| 12 |
+
# before the band reaches the unprotected fact.
|
| 13 |
#
|
| 14 |
# The win predicate makes the topology decision load-bearing โ total
|
| 15 |
# pbox count alone is not enough; โฅ3 of the pillboxes must sit INSIDE
|
| 16 |
# a radius-4 disc around the fact. A pbox-LINE policy (the obvious
|
| 17 |
+
# sibling: pboxes strung between the fact and the corridor mouth)
|
| 18 |
+
# satisfies the count but FAILS the region bar AND lets the
|
| 19 |
+
# concentrated rifle/rocket band overwhelm the thin frontage at the
|
| 20 |
+
# fact โ line LOSES, intended cluster WINS.
|
| 21 |
#
|
| 22 |
+
# Sibling to `build-defensive-tower-line` (which rewards a long-frontage
|
| 23 |
+
# line across a wide threat-axis); on THIS pack the threat is FOCUSED
|
| 24 |
+
# on a single point (the agent fact) by the corridor geometry, so the
|
| 25 |
+
# doctrine inverts.
|
| 26 |
+
#
|
| 27 |
+
# MAP (per tier, materialised via `chokepoint-arena` generator):
|
| 28 |
+
# โข All tiers โ 96ร40, cordon=2, single pinch wall at x=43..52
|
| 29 |
+
# (pinch_width=10) with a 4-cell corridor at y=18..21 (the only
|
| 30 |
+
# passable cells between west and east lobes).
|
| 31 |
+
# โข West lobe (xโ[2,42]) โ agent base. Fact sits at the WEST EDGE
|
| 32 |
+
# (x=10) so the rush MUST traverse the corridor THEN the entire
|
| 33 |
+
# west lobe to reach the fact; the cluster wrapping the fact has
|
| 34 |
+
# time to assemble before the band arrives.
|
| 35 |
+
# โข East lobe (xโ[53,93]) โ attackers spawn here; the rusher bot
|
| 36 |
+
# charges the agent fact, so its A* path is forced through the
|
| 37 |
+
# single y=18..21 corridor (water elsewhere along x=43..52).
|
| 38 |
+
# โข Hard tier flips the fact NORTH (y=14) / SOUTH (y=26) by seed;
|
| 39 |
+
# the corridor stays at y=20 so the rush still has to traverse it
|
| 40 |
+
# AND then turn north/south to reach the active fact โ the
|
| 41 |
+
# cluster centre must follow the fact.
|
| 42 |
#
|
| 43 |
# Real-world anchor:
|
| 44 |
# โข ERQA spatial-commit primitive โ place a small, finite resource set
|
|
|
|
| 51 |
# uniform spread across all approaches.
|
| 52 |
#
|
| 53 |
# Discrimination (four-script bar โ scripted, no model needed):
|
| 54 |
+
# โข stall (observe-only): spends nothing, the rush funnels through
|
| 55 |
+
# the corridor and razes the fact โ fact-alive fail clause fires
|
| 56 |
+
# โ LOSS (no draw degeneracy because `after_ticks` also fires as a
|
| 57 |
+
# backstop).
|
| 58 |
# โข pbox-line (the "build-defensive-tower-line" solution โ pboxes
|
| 59 |
+
# strung along the y=18..21 attack lane far from the fact): meets
|
| 60 |
+
# the count clause but FAILS the region clause (0 line-pboxes land
|
| 61 |
+
# inside the radius-4 disc around the fact) AND the spread lets
|
| 62 |
+
# the rusher band slip through gaps to reach the fact โ LOSS.
|
| 63 |
# โข pure-army (only e1, no pbox): FAILS the count clause AND the
|
| 64 |
# region clause; the rifle wall alone cannot stop the heavier
|
| 65 |
# medium/hard waves either โ LOSS.
|
| 66 |
# โข intended CLUSTER (3-4 pboxes wrapping the fact within radius 4):
|
| 67 |
+
# overlapping pbox fire shreds the focused rush at the fact;
|
| 68 |
+
# count + region + kill + fact-alive clauses all satisfied โ WIN.
|
| 69 |
#
|
| 70 |
# Why the spec works (engine combat sheet, per CLAUDE.md):
|
| 71 |
# โข pbox = pillbox (anti-infantry base defence; cost 600cr; dps very
|
| 72 |
# high vs rifle infantry; 1ร1 footprint, easy to cluster). The
|
| 73 |
# defense queue is SEPARATE from infantry so parallel queues are
|
| 74 |
# allowed (CLAUDE.md).
|
| 75 |
+
# โข A radius-4 disc around the fact contains ~50 cells; plenty of
|
| 76 |
+
# room for โฅ3 pboxes after the fact's 2ร2 footprint plus the
|
| 77 |
+
# pre-placed tent/powr are subtracted.
|
| 78 |
# โข `building_count_gte:{fact,1}` (PRESENT-TENSE) is the fact-alive
|
| 79 |
# check โ `has_building` is a one-shot ever-seen set that stays true
|
| 80 |
# after the fact is razed (documented CLAUDE.md footgun).
|
| 81 |
# โข `after_ticks: BUDGET+1` fail clause is reachable within max_turns
|
| 82 |
# (no interrupts โ exactly 90 ticks/step โ max tick = 93+90ยท(N-1));
|
| 83 |
# stallers hit it and LOSE rather than draw.
|
| 84 |
+
# โข A persistent unarmed enemy `fact` at the far east edge keeps the
|
| 85 |
+
# episode alive past full rusher elimination so the win/fail
|
| 86 |
+
# evaluator sees the terminal frame (no DRAW collapse on
|
| 87 |
+
# enemy-wipe auto-done). On a 96-wide map it sits at (90, *) โ
|
| 88 |
+
# well within the playable rectangle.
|
| 89 |
# โข The `rusher` bot relentlessly charges the agent's centroid (the
|
| 90 |
# agent fact) โ that's WHY a cluster at the fact wins and a line
|
| 91 |
+
# between the fact and the corridor doesn't: the rush focal point
|
| 92 |
+
# is the fact itself, and the corridor funnels the band so a
|
| 93 |
+
# cluster sees the WHOLE band sequentially.
|
| 94 |
+
# โข Cash is intentionally tight (exactly 4ร600cr = 2400 for the four
|
| 95 |
+
# pboxes). A model that wastes cash on extra units cannot complete
|
| 96 |
+
# the pbox count.
|
| 97 |
+
# โข Hard tier adds a SECOND reinforcement wave via `scheduled_events`
|
| 98 |
+
# at tick 2700 (~30 turns in); the wave is heavier and timed AFTER
|
| 99 |
+
# the cluster has had time to assemble, so the bar discriminates:
|
| 100 |
+
# a working cluster shreds the wave too; a pbox-line / pure-army
|
| 101 |
+
# defence cannot survive both waves.
|
| 102 |
|
| 103 |
meta:
|
| 104 |
id: build-defensive-tower-cluster
|
|
|
|
| 106 |
capability: reasoning
|
| 107 |
real_world_meaning: >
|
| 108 |
A single high-value building (the fact โ your construction yard) is
|
| 109 |
+
the protected asset, and a concentrated enemy band funnelled
|
| 110 |
+
through a single narrow corridor charges directly at it. Right
|
| 111 |
+
doctrine: a TIGHT CLUSTER of pillboxes WRAPPING the fact,
|
| 112 |
+
overlapping fields of fire on the single point that matters. Wrong
|
| 113 |
+
doctrine: a thin LINE of pillboxes strung between the fact and the
|
| 114 |
+
corridor mouth โ the line satisfies a naive "we built N defences"
|
| 115 |
+
count but cannot stop a focused rush from reaching the fact,
|
| 116 |
+
because the firepower is too dispersed to mass on the threat.
|
| 117 |
The win predicate makes the topology decision load-bearing: total
|
| 118 |
pbox count alone is not enough; โฅ3 of the pillboxes must sit INSIDE
|
| 119 |
the radius-4 disc around the fact, AND the fact must survive.
|
|
|
|
| 132 |
- "defense-in-depth around critical infrastructure"
|
| 133 |
author: "openra-bench"
|
| 134 |
|
| 135 |
+
# Base map: per-tier override below. The default below is the
|
| 136 |
+
# chokepoint geometry every level inherits (the only mode this pack
|
| 137 |
+
# supports โ see the topology rationale at the top of the file).
|
| 138 |
+
base_map:
|
| 139 |
+
generator: chokepoint-arena
|
| 140 |
+
name: build-defensive-tower-cluster-chokepoint-96x40
|
| 141 |
+
width: 96
|
| 142 |
+
height: 40
|
| 143 |
+
cordon: 2
|
| 144 |
+
pinch_x: 48
|
| 145 |
+
pinch_width: 10
|
| 146 |
+
corridor_width: 4
|
| 147 |
+
corridor_y: 20
|
| 148 |
+
title: Cluster Chokepoint 96x40
|
| 149 |
|
| 150 |
base:
|
| 151 |
agent: {faction: allies}
|
|
|
|
| 161 |
planning: true
|
| 162 |
# No interrupts โ defense topology is a STATIC up-front decision; the
|
| 163 |
# threat axis is known a priori (the rusher always charges the agent
|
| 164 |
+
# fact through the only passable corridor). Disabling interrupts also
|
| 165 |
+
# makes the tick budget deterministic (exactly 90 ticks/step โ
|
| 166 |
+
# max_turns is a hard tick budget that the `after_ticks` fail clause
|
| 167 |
+
# reliably bites in).
|
| 168 |
interrupts: {}
|
| 169 |
termination:
|
| 170 |
max_ticks: 12000
|
|
|
|
| 174 |
# โโ EASY โโ bare CONCENTRATED-DEFENSE skill: budget covers exactly
|
| 175 |
# 4 pbox (2400cr). Win requires โฅ3 of the 4 INSIDE the radius-4 disc
|
| 176 |
# around the fact at (10,20). A line layout (pbox strung at x=20..35
|
| 177 |
+
# along the corridor band y=18..21) lands 0 pbox inside the disc โ
|
| 178 |
+
# region clause fails AND the spread can't mass enough fire on the
|
| 179 |
+
# corridor mouth to stop the band. Stall loses (clock OR fact razed);
|
| 180 |
+
# pure-army loses (count + fact razed).
|
| 181 |
# max_turns 60 โ reachable tick 93+90ยท59 = 5403; deadline 5400.
|
| 182 |
easy:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 183 |
description: >
|
| 184 |
+
A rifle band funnels through the single narrow corridor (y=18..21
|
| 185 |
+
through the wall at x=43..52) and charges your construction yard
|
| 186 |
+
on the west. Budget $2400 โ build four pillboxes with at least
|
| 187 |
+
three sitting within four cells of the yard. Keep the yard alive,
|
| 188 |
+
kill three enemies, within about 60 turns.
|
| 189 |
starting_cash: 2400
|
| 190 |
overrides:
|
| 191 |
actors:
|
| 192 |
+
# Pre-placed agent base in the WEST lobe. Fact at (10,20);
|
| 193 |
+
# tent and powr WEST of the fact (behind it) so they aren't in
|
| 194 |
+
# the rush line of fire and they leave plenty of cells inside
|
| 195 |
+
# the radius-4 disc free for cluster pboxes.
|
| 196 |
- {type: fact, owner: agent, position: [10, 20]}
|
| 197 |
- {type: tent, owner: agent, position: [6, 18]}
|
| 198 |
- {type: powr, owner: agent, position: [6, 22]}
|
|
|
|
| 203 |
- {type: e1, owner: agent, position: [12, 19], stance: 2}
|
| 204 |
- {type: e1, owner: agent, position: [12, 20], stance: 2}
|
| 205 |
- {type: e1, owner: agent, position: [12, 21], stance: 2}
|
| 206 |
+
# Rusher band in the EAST lobe โ forced through the y=18..21
|
| 207 |
+
# corridor on the way to the agent fact at (10,20). 5ร e1 is
|
| 208 |
+
# enough to overwhelm a thin line / no-pbox defence; a cluster
|
| 209 |
+
# of โฅ3 pbox (dps very high vs infantry, overlapping fields of
|
| 210 |
+
# fire) shreds it as it funnels out of the corridor mouth.
|
| 211 |
+
- {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 5}
|
| 212 |
# Unarmed high-HP marker (anti-DRAW): keeps the episode alive
|
| 213 |
# past full rusher elimination so the win/fail check fires.
|
| 214 |
+
# Far east corner of the east lobe.
|
| 215 |
+
- {type: fact, owner: enemy, position: [90, 20]}
|
| 216 |
win_condition:
|
| 217 |
all_of:
|
| 218 |
- {building_count_gte: {type: pbox, n: 4}}
|
|
|
|
| 232 |
# line layout (1 at fact, 3 along the lane) still meets the count
|
| 233 |
# but FAILS the region (1 of 4 inside the disc, not the required 3)
|
| 234 |
# AND the line cannot mass enough firepower to stop the heavier
|
| 235 |
+
# band funnelled through the corridor. The intended cluster (3
|
| 236 |
+
# pbox INSIDE the disc + 1 spare nearby, OR all 4 inside the disc)
|
| 237 |
+
# survives. Kill bar raised to 5 to require the cluster to actually
|
| 238 |
+
# fight, not just absorb.
|
| 239 |
# max_turns 60 โ reachable tick 5403; deadline 5400.
|
| 240 |
medium:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 241 |
description: >
|
| 242 |
+
Heavier rush โ rifles plus rocket soldiers โ funnels through the
|
| 243 |
+
single narrow corridor and charges your construction yard.
|
| 244 |
+
Budget $2400, build four pillboxes with at least three within
|
| 245 |
+
four cells of the yard. Keep it alive, kill five, within about
|
| 246 |
+
60 turns.
|
| 247 |
starting_cash: 2400
|
| 248 |
overrides:
|
| 249 |
actors:
|
|
|
|
| 256 |
- {type: e1, owner: agent, position: [12, 20], stance: 2}
|
| 257 |
- {type: e1, owner: agent, position: [12, 21], stance: 2}
|
| 258 |
- {type: e1, owner: agent, position: [8, 20], stance: 2}
|
| 259 |
+
# Canonical heavy rush: 6ร e1 + 2ร e3 in the east lobe at
|
| 260 |
+
# y=20, forced through the y=18..21 corridor on the way to
|
| 261 |
+
# the agent fact. A line / pure-army defence is overrun in
|
| 262 |
+
# ~6-8 turns; the cluster (overlapping pbox dps) holds.
|
| 263 |
+
- {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 6}
|
| 264 |
+
- {type: e3, owner: enemy, position: [72, 20], stance: 3, count: 2}
|
| 265 |
+
# Anti-DRAW marker (east edge).
|
| 266 |
+
- {type: fact, owner: enemy, position: [90, 20]}
|
|
|
|
|
|
|
| 267 |
win_condition:
|
| 268 |
all_of:
|
| 269 |
- {building_count_gte: {type: pbox, n: 4}}
|
|
|
|
| 286 |
# READ the fact's latitude from observation and place the cluster
|
| 287 |
# relative to it. Enemies don't honour spawn_point (engine:
|
| 288 |
# oramap.rs::expand_scenario_actors per CLAUDE.md), so the rusher
|
| 289 |
+
# band is staged at the corridor latitude (y=20) โ the only
|
| 290 |
+
# passable cells through the wall โ and converges on whichever fact
|
| 291 |
+
# is present this seed by turning north or south after emerging
|
| 292 |
+
# from the corridor mouth. Additionally a `scheduled_events`
|
| 293 |
+
# reinforcement wave fires at tick 2700 (~30 turns), giving the
|
| 294 |
+
# cluster time to assemble first; the wave overwhelms a line /
|
| 295 |
+
# pure-army defence but a real cluster handles both waves.
|
| 296 |
# max_turns 60 โ reachable tick 5403; deadline 5400.
|
| 297 |
hard:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 298 |
description: >
|
| 299 |
+
Same corridor and same focused rush, but the yard sits in the
|
| 300 |
+
NORTH or SOUTH west-edge slot by seed, and a reinforcement wave
|
| 301 |
+
arrives mid-episode. Budget $2400, build four pillboxes with at
|
| 302 |
+
least three within four cells of the current yard. Keep it
|
| 303 |
+
alive, kill six, within about 60 turns.
|
| 304 |
starting_cash: 2400
|
| 305 |
overrides:
|
| 306 |
actors:
|
|
|
|
| 322 |
- {type: e1, owner: agent, position: [12, 27], stance: 2, spawn_point: 1}
|
| 323 |
- {type: e1, owner: agent, position: [8, 26], stance: 2, spawn_point: 1}
|
| 324 |
# Enemies don't honour spawn_point (CLAUDE.md). Stage the rush
|
| 325 |
+
# band at the corridor latitude (y=20) โ the only passable
|
| 326 |
+
# cells through the wall โ so it funnels through and then
|
| 327 |
+
# turns N/S after emerging into the west lobe toward the
|
| 328 |
+
# active fact. Heavier than medium: 5รe1 + 2รe3.
|
| 329 |
+
- {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 5}
|
| 330 |
+
- {type: e3, owner: enemy, position: [72, 20], stance: 3, count: 2}
|
| 331 |
+
# Anti-DRAW marker on the symmetry axis (east edge).
|
| 332 |
+
- {type: fact, owner: enemy, position: [90, 20]}
|
| 333 |
+
# Mid-episode reinforcement wave (after the cluster has time to
|
| 334 |
+
# assemble) โ a working cluster shreds both waves; a line /
|
| 335 |
+
# pure-army defence cannot survive the combined pressure.
|
| 336 |
+
scheduled_events:
|
| 337 |
+
- tick: 2700
|
| 338 |
+
type: spawn_actors
|
| 339 |
+
actors:
|
| 340 |
+
- {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 4}
|
| 341 |
+
- {type: e3, owner: enemy, position: [72, 20], stance: 3, count: 1}
|
| 342 |
win_condition:
|
| 343 |
all_of:
|
| 344 |
- {building_count_gte: {type: pbox, n: 4}}
|