StakeOut: guide for agents
StakeOut is a squad tactics game played in the browser. A commander (your user) gives orders to four soldiers; a rival does the same, blind; the server fights out ninety seconds of combat on a small map and both watch the replay. Nobody can touch anything once it starts: the best plan wins. Each soldier thinks with a mind the commander writes: a state graph (states such as "Advance to the Crossroads" joined by arrows "while … when … → …"). Your job is to write those minds from your user's instructions, test them, and leave them in your user's Order Library.
How a battle is won
- Three objectives: the Mill (
Molino, west), the Crossroads (Cruce, centre) and the Ford (Vado, east). - The battle is played in pulses of 5 seconds (18 pulses, H+00:00 to H+01:30). Every pulse, an objective scores you 1 point when no enemy is left standing there and at least one of your soldiers there is standing, not pinned down (suppressed) and not under fire that pulse. Men standing on both sides there: nobody scores.
- From H+01:00 (the last 30 s) every point counts ×3. Whoever has more points at the end wins, or the first to 40.
- A squad wiped out or retreated does not end it: the other side must still take the objectives to score.
- Our side is A (south); the enemy deploys at B (north). The map is mirrored: the rival's plan is written for side A too.
What you can do (tools)
guide: this guide, by topic (overview,map,squad,minds,edits,tactics,examples). Readmindsandmapbefore writing a plan.list_orders,get_order: the commander's Order Library; a plan in words (with the ids you edit by) and as JSON.new_plan: a starting plan, from the default order or from one card per soldier (role, objective, mode).check_plan: validate a plan (and optionally apply edits) without saving: cleaned plan, warnings, readback, kit cost.save_order: save a whole plan (new, or over an order);edit_order: apply edits to a saved order.list_rivals,train: fight training battles against the server's bots (no money, no rank); each one is archived.list_reports,get_report: what happened, soldier by soldier and arrow by arrow, and a link to watch it.profile: callsign, rank, funds, training record.
You cannot open or accept contracts (battles between commanders, with credits at stake), touch the account, or see any other commander's plans, nor the bots' plans. Contracts are signed by your user at the web, with the order you prepared.
How to work with your user
- Read what they want (in any language). Ask only if a decision is truly theirs (which objective matters most, how much risk); otherwise pick sensible defaults and say so.
- Start from an order of theirs (
get_order) or a new one (new_plan). Write the minds: whole JSON or edits. check_planuntil it is clean; fix every warning you did not mean.- Show your user the readback (the server writes it, in their words) before or right after saving. It says what the plan will really do; never claim a soldier does something no arrow says.
save_order/edit_order. Give the order a short name that says the idea ("Fix and storm the Crossroads").trainagainst a bot (several runs: battles are random), read the summary, change one thing at a time, train again. Give your user the replay link: https://stakeout.verseprojects.com/cuartel/informes/<report id>.- Tell them it is in their Order Library (https://stakeout.verseprojects.com/cuartel/ordenes): they load it on the Order Table and fight.
The engine only does what the arrows say. Soldiers know how to do things (best cover nearby, the safest flanking route, whom to aid: fixed public rules); when and what is always the graph. There is no hidden brain to rely on.
The map: the Mill
Coordinates in units of about 40 m; y grows northward. Our side is A (south, y < 3), the enemy's B (north, y > 3); the centre row (y = 3) holds the three objectives. Plans name places by their identifier; the deployment areas (A-O, A-C, A-E) are not written in plans: each soldier starts from the one on the side of their first place.
| Place = identifier | (x, y) | Terrain |
|---|---|---|
South Hill = Colina-A | (1, 1.5) | no cover; high ground (sees far) |
South Farm = Granja-A | (3, 1.5) | cover 1 (facing north) |
South Woods = Bosque-A | (5, 1.5) | cover 1 (all sides); concealed; dense woods: sees and is seen only along its own paths |
Mill = Molino | (0, 3) | cover 1 (all sides); high ground (sees far); objective |
Orchard = Huerto | (1.5, 3) | cover 1 (all sides); concealed |
Crossroads = Cruce | (3, 3) | no cover; objective |
Ditch = Acequia | (4.5, 3) | cover 1 (facing north, south) |
Ford = Vado | (6, 3) | no cover; concealed; objective |
North Hill = Colina-B | (1, 4.5) | no cover; high ground (sees far) |
North Farm = Granja-B | (3, 4.5) | cover 1 (facing south) |
North Woods = Bosque-B | (5, 4.5) | cover 1 (all sides); concealed; dense woods: sees and is seen only along its own paths |
Places a plan may name: Colina-A, Granja-A, Bosque-A, Molino, Huerto, Cruce, Acequia, Vado, Colina-B, Granja-B, Bosque-B. Objectives: Cruce, Molino, Vado.
Paths (one pulse = 5 s)
- A-W ↔ A-C: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- A-W ↔ South Hill: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- A-C ↔ A-E: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- A-C ↔ South Farm: 2 / 3 / 4 pulses (fast / normal / stealth), open
- A-E ↔ South Woods: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- South Hill ↔ South Farm: 2 / 3 / 4 pulses (fast / normal / stealth), open
- South Hill ↔ Mill: 3 / 4 / 6 pulses (fast / normal / stealth), open
- South Hill ↔ Orchard: 2 / 3 / 4 pulses (fast / normal / stealth), open
- South Farm ↔ South Woods: 2 / 3 / 4 pulses (fast / normal / stealth), open
- South Farm ↔ Crossroads: 2 / 3 / 4 pulses (fast / normal / stealth), open
- South Farm ↔ Orchard: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- South Farm ↔ Ditch: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- South Woods ↔ Ditch: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- South Woods ↔ Ford: 4 / 6 / 8 pulses (fast / normal / stealth), ford
- Mill ↔ Orchard: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- Mill ↔ North Hill: 3 / 4 / 6 pulses (fast / normal / stealth), open
- Orchard ↔ Crossroads: 2 / 2 / 3 pulses (fast / normal / stealth), covered
- Orchard ↔ North Hill: 2 / 3 / 4 pulses (fast / normal / stealth), open
- Orchard ↔ North Farm: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- Crossroads ↔ Ditch: 2 / 2 / 3 pulses (fast / normal / stealth), covered
- Crossroads ↔ North Farm: 2 / 3 / 4 pulses (fast / normal / stealth), open
- Ditch ↔ Ford: 3 / 5 / 6 pulses (fast / normal / stealth), ford
- Ditch ↔ North Farm: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- Ditch ↔ North Woods: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- Ford ↔ North Woods: 4 / 6 / 8 pulses (fast / normal / stealth), ford
- B-W ↔ B-C: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- B-W ↔ North Hill: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- B-C ↔ B-E: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- B-C ↔ North Farm: 2 / 3 / 4 pulses (fast / normal / stealth), open
- B-E ↔ North Woods: 2 / 3 / 4 pulses (fast / normal / stealth), covered
- North Hill ↔ North Farm: 2 / 3 / 4 pulses (fast / normal / stealth), open
- North Farm ↔ North Woods: 2 / 3 / 4 pulses (fast / normal / stealth), open
A soldier in transit counts as being at the place they left, without cover. On a covered path they are harder to see; on a ford they cannot shoot. Fast is quicker but louder; stealth is slower and harder to spot.
Sight
Same place: always. Into or out of dense woods (and the deployment areas): only along a direct path. Otherwise by distance: ≤ 1.6 close, ≤ 3.2 medium, ≤ 4.8 long only if one end is high ground (the Hills, the Mill). Smoke blocks sight into, out of and inside its place. Cover counts only against fire from the sides it faces.
The squad
Four soldiers, U1–U4, chosen from five roles, at most 2 of a role: Rifleman = rifle, Machine gunner = mg, Scout = scout, Grenadier = gren, Medic = medic.
- Rifleman (
rifle): The deadliest at short and medium range. Carries 2 items. Items: up to 2. - Machine gunner (
mg): Suppressing fire at any range: the target is pinned down even on a miss. Cannot fire on a pulse it moved. Items: up to 1. - Scout (
scout): Sees farther and marks targets for the squad. Items: up to 1. - Grenadier (
gren): Hits neighboring positions without line of sight. Items: up to 1. - Medic (
medic): Stabilizes the fallen and gets them back in the fight; heals without a medkit. Items: up to 1.
Kit (kit: one list per soldier, each item at most once)
- Smoke (
humo): a screen over their own position before crossing ground under watch; blocks sight into, out of and inside it. - Grenade (
granada): pins down everyone in a position. - Medkit (
botiquin): stabilizes a fallen man or patches a wounded one, once each. - Mine (
mina): mines the approach to their position: the first enemy through is out of the fight. - Binoculars (
prismaticos): sees better at medium and long range, the whole battle.
An item is used only by an action on an arrow (throw smoke, throw a grenade, lay the mine) or by a state that says so (Storm throws the grenade before going in; Give aid uses the medkit if the soldier is not the medic). Nothing is used "by itself".
What things cost
Training battles against bots cost nothing. In a contract between commanders every item is paid when it is used, as a share of the table's stake (table 1: stake 800 Cr): grenade 8 Cr per use, medkit 6 Cr per use (up to 2 uses), smoke 4 Cr per use, mine 16 Cr per use, binoculars 4 Cr per battle carried; each own man down costs 24 Cr if the battle is lost. Tables 2 and 3 multiply all of it by 4 and 16. check_plan gives the most a plan's kit can cost.
Minds: the graph plan format (v: 2)
A plan is JSON. The server rebuilds it from allowed values only: any unknown field, value or id is refused with a message saying where (U2 · state s3: invalid avanzar to (got "Mill"; allowed: …)). Write identifiers exactly as listed here.
{ "v": 2,
"comp": [role, role, role, role], // U1..U4
"kit": [[item…], [item…], [item…], [item…]],
"soldiers": [ { "init": stateId, "states": [State…], "arrows": [Arrow…] } ×4 ],
"doctrine": { "arrows": [DocArrow…], "orders": [Order…] } }
State { "id", "k": kind, …params, "target"?: "peligroso" | "herido" | "objetivo", "firm"?: true }
Arrow { "id", "from": stateId | "*", "when": Event, "out": [Out…] } // up to 4 outputs
DocArrow { "id", "from": "*" | kind, "when": Event, "out": [Out…] } // a habit of the whole squad
Out { "to": stateId | Spec | "@stay" | "@back" | "@plan", "act"?: Action, "w"?: "casi" | "normal" | "aveces" }
Spec { "k": kind, …params } // a state by kind (doctrine and orders use these)
Event { "e": event, …params } | { "and": [Event, Event] }
Action { "a": "humo" | "granada" | "mina" | "senal", "at"?, "k"? }
Order { "id", "when": Event (squad events only), "units": [0..3…], "to"?: Spec | "@next", "act"?: Action }
| { "id", "when": Event, "retreat": true }
- Ids: 1–24 characters of letters, digits,
_and-, unique among a soldier's states. Arrow ids should be unique in the plan. - The main chain: from
init, follow each state'shecho(done) arrow to the next state. That chain is "the plan": it gives the soldier their objective (the last place they go to), their deployment and where@planreturns. A state that never completes by itself (Wait, Return fire, Pin down…) moves on by ahora,tiempo,calma,senalorllegaarrow. - Outputs:
@staycarries on (useful with an action: "throw smoke and keep going"),@backreturns to the state before,@planreturns to the first unfinished state of the main chain. - Weights: an arrow with several outputs splits by words:
casi= 9,normal= 3,aveces= 1 (normalised: usually + sometimes = 75 / 25). The dice come from the battle's seed, on the server. - firm ("at all costs"): while in that state only its own arrows count: no doctrine, no "*" arrows, no command orders.
- Limits: at most 120 states and 200 arrows (orders included) in the whole plan.
Precedence, every pulse, for each soldier
- Physics: a man down does nothing; a suppressed man does not move; a man driven out falls back.
- A command order that fires this pulse.
- The arrows of their current state, top to bottom (the first that holds wins).
- Their own
"*"arrows (any state). - The doctrine's habits.
- Nothing holds: the soldier stays in the current state.
At most one transition per soldier per pulse; actions happen as the arrow fires. Put specific arrows before general ones of the same state ("takes fire from the Mill → …" before "takes fire → …"): a later arrow hidden by an earlier, more general one never fires (check_plan warns).
Tension (0–5)
Rises when the soldier takes fire (+2 in the open, +1 in cover), is suppressed (+2), wounded (+2), sees a comrade fall (+1) or has an enemy in their place (+1); falls 1 per pulse without fire. Effects: an arrow into an exposed state may be delayed one pulse (probability tension/6); with several outputs, exposed ones weigh less (×(1 − tension/6)); at 5 the event limite fires (write what happens: panic or resolve; without an arrow, nothing happens).
States (k)
A place parameter of a state (or Spec) also takes @obj (their objective: the last place of their main chain) or @aqui (where they are). "Exposed" states are the ones tension makes them hesitate to enter. "done =" is what fires hecho.
| kind | name | params | exposed | done = |
|---|---|---|---|---|
avanzar | Advance | to: a place; pace: rapido, normal, sigilo; via: a place (optional) | yes | arrives |
saltos | Advance by bounds | to: a place; pace: rapido, normal, sigilo | yes | arrives |
flanquear | Flank | to: a place; pace: rapido, normal, sigilo | yes | arrives |
infiltrarse | Infiltrate | to: a place; via: a place (optional) | yes | arrives |
seguir | Follow | unit: 0–3 (U1 = 0 … U4 = 3) | yes | is alongside |
reforzar | Reinforce | pace: rapido, normal, sigilo | yes | arrives |
replegarse | Fall back | to: a place (optional); pace: rapido, normal, sigilo | arrives | |
apartarse | Clear out | — | is safe | |
contraatacar | Counterattack | to: a place (optional) | yes | arrives |
aguantar | Hold | at: a place (optional); posture: libre, emboscada, silencio | is in position | |
emboscar | Ambush | at: a place (optional); zone: nodo, cerca | is in position | |
cubrirse | Take cover | — | is in cover | |
vigilar | Watch | at: a place | — | |
esperar | Wait | — | — | |
fuego | Return fire | — | — | |
fijar | Pin down | at: a place | — | |
asaltar | Storm | to: a place | yes | takes the position |
socorrer | Give aid | unit: 0–3 (U1 = 0 … U4 = 3) (optional) | yes | finishes the treatment |
What each does: avanzar fastest way there (or via a place); fires on the move with a penalty; saltos one place, a pulse still in cover if any, the next…; flanquear the route with least exposure to the enemies they know of; infiltrarse stealth and holding fire, unless an arrow says otherwise; seguir goes with that soldier, at their pace; reforzar to the objective we do not hold with fewest known enemies; replegarse back to the place, or to the deployment; apartarse out of an announced artillery barrage; contraatacar back for the position they were driven out of; aguantar stays; holds the place; fires as their posture says; emboscar silent until an enemy enters the kill zone, then a volley and free fire; cubrirse best cover against those firing at them, here or next door; does not fire; vigilar stays, watching the place (+1 with binoculars); esperar reserve: stays put until an arrow moves them on; fuego stays and fires back at whoever fires at them; fijar fire on the enemies at that place; the machine gunner suppresses; asaltar fast to the place; throws a grenade first if carrying one; socorrer goes to the wounded or fallen and treats them (medic or medkit).
Events (e)
| event | meaning | params | fires | orders |
|---|---|---|---|---|
hecho | Done | — | the pulse it happens | |
tiempo | After N s like this | n: 5, 10, 15, 20, 30, 45, 60 | the pulse it happens | |
calma | N s with no fire | n: 5, 10, 15, 20, 30, 45, 60 | the pulse it happens | |
disparan | I take fire | cov: sin = in the open, without cover; from: a place (optional) | while true | |
suprimido | I am suppressed | — | while true | |
libre | My suppression wears off | — | the pulse it happens | |
herido | I am wounded | — | the pulse it happens | |
desalojado | I am driven out | — | the pulse it happens | |
sin | I run out of | item: humo, granada, botiquin, mina, prismaticos | the pulse it happens | |
limite | I am at my limit | — | while true | |
veo | I see the enemy | at: a place (optional); role: rifle, mg, scout, gren, medic (optional); min: 2 = two or more | while true | yes |
cerca | Enemy within grenade range | — | while true | |
abierto | About to cross open ground in view | — | while true | |
perdido | I lose sight of them | — | the pulse it happens | |
ausencia | No one seen at X by the hour | at: a place; n: a mission second: 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80 | once (milestone) | yes |
derribo | I take an enemy down | — | the pulse it happens | |
herido_cerca | Wounded teammate within reach | — | while true | |
cae | A teammate goes down | unit: 0–3 (U1 = 0 … U4 = 3) (optional) | the pulse it happens | |
compa_sup | Teammate suppressed | unit: 0–3 (U1 = 0 … U4 = 3) | while true | yes |
llega | Teammate is done | unit: 0–3 (U1 = 0 … U4 = 3) | once (milestone) | yes |
senal | Signal | k: 1, 2, 3, 4 | once (milestone) | yes |
bajas | We have N casualties | n: 1, 2, 3 | once (milestone) | yes |
derribados | We have N kills | n: 1, 2, 3 | once (milestone) | yes |
hora | It is the hour | n: a mission second: 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80 | once (milestone) | yes |
perdiendo | We are down by | n: 1, 2, 3, 4, 6, 8 | once (milestone) | yes |
ganando | We are up by | n: 1, 2, 3, 4, 6, 8 | once (milestone) | yes |
zona | Zone | at: an objective: Cruce, Molino, Vado; lost: true | once (milestone) | yes |
artilleria | Artillery called in here | — | while true |
"Orders" marks the events a command order may use (the commander knows them). hora works as "from that second on".
Actions (act)
humo: Throw smoke (needshumoin their kit);at:@aqui,@sig(here, the next place on their way) or a placegranada: Throw a grenade (needsgranadain their kit);at:@enemigo(the best enemy in reach) or a placemina: Lay a mine (needsminain their kit); —senal: Give the signal;k:1,2,3,4
Grenade targets: @enemigo or a place; smoke: @aqui, @sig or a place.
The doctrine
- Habits (
doctrine.arrows): arrows for every soldier,from="*"or a state kind ("avanzar"= while advancing). A soldier's own arrow for the same event wins. - Basic drill: the default habits new plans carry (keep the ids to keep them; drop any you do not want):
b-herido: Wounded on the move: take coverb-fuego: Under fire in the open on the move: take coverb-vuelta: Once the fire stops, back to the planb-art: Artillery called in: clear outb-art2: Once the barrage is over, back to the planb-socorro: Give aid to a wounded soldier within reach (medic or medkit)b-socorro2: Once treated, back to the planb-granada: Enemy within range: grenadeb-humo: Before crossing open ground in view, smoke on their own positionb-mina: At their post, mine the approach- Command orders (
doctrine.orders): when a squad event happens, the listed soldiers switch to a state (to: a Spec, or"@next"= their next step, e.g. out of the reserve), and/or do an action; orretreat: truepulls everyone out. Each fires once, at once, and overrides everything but afirmstate.
Edits: changing a saved order piece by piece
edit_order (and check_plan with edits) take a list of edits, the same small vocabulary the game's radio uses. Each edit is an object with an op and only the fields it needs. Soldiers are unit 1–4 here (not 0–3); places, kinds and events are the identifiers of the minds topic. Ids come from get_order (the [brackets]).
objetivo:unit,place: their objective (every state that went to the old one goes to the new one).paso:unit,place(or null: straight there): a place they pass on their way.reserva:unit,minute(0,15,25,35,45,55,65,75; 0 = moves out now): they wait until then.plantilla:unit,attitude(asalto,cauto,emboscar),initiative(estricta,plan,iniciativa,mision): rewrites their whole mind from a template, keeping objective, route and reserve.rol:unit,role.equipo:unit,kit(the full list).reaccion: adds an arrow to a soldier.unit;from= a state id,"*", or theto_nameof a state created by an earlier edit of the same call;event+ev_place,ev_n(seconds, mission second, points, count or signal number),ev_role,ev_unit(1–4),ev_cov(true = in the open),ev_min2,ev_item,ev_lost; optional second conditionand_event+and_place,and_n,and_unit. Destination:to= a state id,"@stay","@back","@plan"; orto_kind(+to_place,to_via,to_pace,to_posture,to_who1–4) to create a state, withto_name("n1"…) to chain more arrows from it. Optionalact(humo,granada,mina,senal) +act_place,act_k.quitar_flecha:ref= an arrow id (a soldier's or a doctrine habit's).estado:unit,ref= state id, and any ofkind,place,via,pace,posture,zone,target,firm.basica:basic= a basic drill id,ontrue / false.costumbre: a doctrine habit:from("*"or a kind),event+ ev_*,to_kind(+ to_*) orto"@stay"/"@back"/"@plan",act.orden: a command order:event+ ev_* (squad events only) and optionaland_event;units(1–4);to="@next","retirada"(general retreat) orto_kind(+ to_*;to_placenull = their own objective); optionalact.quitar_orden:ref= an order id.
Example: "U2, if you take fire from the Mill while advancing, take cover, and once it is quiet for 10 s flank to the Crossroads":
[{ "op": "reaccion", "unit": 2, "from": "u1s1", "event": "disparan", "ev_place": "Molino", "to_kind": "cubrirse", "to_name": "n1" },
{ "op": "reaccion", "unit": 2, "from": "n1", "event": "calma", "ev_n": 10, "to_kind": "flanquear", "to_place": "Cruce" }]
For bigger changes, write the whole plan and use save_order.
What works (measured on the server's engine)
- Keep a reserve for the end. From H+01:00 every point counts ×3. A soldier who waits (
esperar→hora55 or 60 → Advance) and goes in fresh can turn the battle around. - Pinning down takes points. A pinned soldier does not hold an objective. The machine gunner pins the target even on a miss; a grenade pins everyone in a position.
fijarwith the machine gunner +asaltarby others on a signal is the classic "fix and storm". - Do not walk in blind. Smoke before crossing watched ground (the basic drill does it if they carry smoke); bring a scout or binoculars: whoever sees first shoots first.
- Taking cover at the post costs points. "Take fire → Take cover" in any state pulls men off open objectives (the Crossroads has no cover): measured at about −10 points of win rate. The basic drill takes cover only on the move. At a post, prefer
fuego(return fire), or cover only when wounded. - A fallen soldier is not lost. The medic stabilizes the fallen and returns them to the fight. Keep the medic near where you expect to bleed.
- Ambush where they must come.
emboscarin cover next to an objective (the Orchard by the Crossroads, the Ditch by the Ford) opens with a volley bonus. - The Ford is slow (a ford path, no shooting in transit) and the Mill is high ground with all-round cover.
- Change one soldier at a time, then train again: battles are random, so judge over several runs. The report's lesson names the soldier that failed and why.
- No bot is easy: all are evolved plans, threat 2 (hard) or 3 (hardest) in
list_rivals. Beat the threat-2 ones first; a plan that only beats one bot is probably exploiting it.
Example: "pin the Crossroads and storm it; hold the Ford and the Mill"
- U1, machine gunner: walks to the South Farm (cover facing north), gives signal 1 on arrival and pins down the Crossroads; at H+01:00 runs into the Crossroads and holds it for the ×3 phase.
- U2, rifleman (grenade + smoke): walks to the Orchard and holds there; on signal 1, or at H+00:30 at the latest, storms the Crossroads (grenade first) and holds it.
- U3, rifleman (grenade): runs to the Ford and holds it; under fire, usually returns fire (75 %), sometimes stays put (25 %); after 10 s of calm, back to holding.
- U4, scout (binoculars): walks to the Mill (high ground, all-round cover) and holds it.
- Doctrine: the full basic drill; if at H+00:50 we are down by 3, everyone storms their objective.
Measured on the server (420 battles, 70 against each of the six bots): it wins about a third of its training battles, beats Raven nearly always and rarely beats Wolf. It is a starting point to adapt, not a finished plan.
{"v":2,"comp":["mg","rifle","rifle","scout"],"kit":[[],["granada","humo"],["granada"],["prismaticos"]],"soldiers":[{"init":"g1","states":[{"id":"g1","k":"avanzar","to":"Granja-A","pace":"normal"},{"id":"g2","k":"fijar","at":"Cruce"},{"id":"g4","k":"avanzar","to":"Cruce","pace":"rapido"},{"id":"g3","k":"aguantar","at":"Cruce","posture":"libre"}],"arrows":[{"id":"ga1","from":"g1","when":{"e":"hecho"},"out":[{"to":"g2","act":{"a":"senal","k":1}}]},{"id":"ga2","from":"g2","when":{"e":"hora","n":60},"out":[{"to":"g4"}]},{"id":"ga3","from":"g4","when":{"e":"hecho"},"out":[{"to":"g3"}]}]},{"init":"r1","states":[{"id":"r1","k":"avanzar","to":"Huerto","pace":"normal"},{"id":"r2","k":"aguantar","at":"Huerto","posture":"libre"},{"id":"r3","k":"asaltar","to":"Cruce"},{"id":"r4","k":"aguantar","at":"Cruce","posture":"libre"}],"arrows":[{"id":"ra1","from":"r1","when":{"e":"hecho"},"out":[{"to":"r2"}]},{"id":"ra2","from":"r2","when":{"e":"senal","k":1},"out":[{"to":"r3"}]},{"id":"ra4","from":"r2","when":{"e":"hora","n":30},"out":[{"to":"r3"}]},{"id":"ra3","from":"r3","when":{"e":"hecho"},"out":[{"to":"r4"}]}]},{"init":"v1","states":[{"id":"v1","k":"avanzar","to":"Vado","pace":"rapido"},{"id":"v2","k":"aguantar","at":"Vado","posture":"libre"},{"id":"v3","k":"fuego"}],"arrows":[{"id":"va1","from":"v1","when":{"e":"hecho"},"out":[{"to":"v2"}]},{"id":"va2","from":"v2","when":{"e":"disparan"},"out":[{"to":"v3","w":"normal"},{"to":"@stay","w":"aveces"}]},{"id":"va3","from":"v3","when":{"e":"calma","n":10},"out":[{"to":"@back"}]}]},{"init":"m1","states":[{"id":"m1","k":"avanzar","to":"Molino","pace":"normal"},{"id":"m2","k":"aguantar","at":"Molino","posture":"libre"}],"arrows":[{"id":"ma1","from":"m1","when":{"e":"hecho"},"out":[{"to":"m2"}]}]}],"doctrine":{"arrows":[{"id":"b-herido","from":"avanzar","when":{"e":"herido"},"out":[{"to":{"k":"cubrirse"}}],"basic":"Herido en marcha, a cubierto"},{"id":"b-fuego","from":"avanzar","when":{"e":"disparan","cov":"sin"},"out":[{"to":{"k":"cubrirse"}}],"basic":"En marcha bajo fuego al descubierto, a cubierto"},{"id":"b-vuelta","from":"cubrirse","when":{"e":"calma","n":10},"out":[{"to":"@plan"}],"basic":"Pasado el fuego, vuelve al plan"},{"id":"b-art","from":"*","when":{"e":"artilleria"},"out":[{"to":{"k":"apartarse"}}],"basic":"Artillería anunciada, se aparta"},{"id":"b-art2","from":"apartarse","when":{"e":"tiempo","n":15},"out":[{"to":"@plan"}],"basic":"Pasado el bombardeo, vuelve"},{"id":"b-socorro","from":"*","when":{"e":"herido_cerca"},"out":[{"to":{"k":"socorrer"}}],"basic":"Socorre al herido a su alcance (médico o botiquín)"},{"id":"b-socorro2","from":"socorrer","when":{"e":"hecho"},"out":[{"to":"@plan"}],"basic":"Atendido, vuelve al plan"},{"id":"b-granada","from":"*","when":{"e":"cerca"},"out":[{"to":"@stay","act":{"a":"granada","at":"@enemigo"}}],"basic":"Enemigo a tiro, granada"},{"id":"b-humo","from":"*","when":{"e":"abierto"},"out":[{"to":"@stay","act":{"a":"humo","at":"@aqui"}}],"basic":"Antes de cruzar al descubierto a la vista, humo sobre su posición"},{"id":"b-mina","from":"aguantar","when":{"e":"hecho"},"out":[{"to":"@stay","act":{"a":"mina"}}],"basic":"En su puesto, mina el acceso"}],"orders":[{"id":"o1","when":{"and":[{"e":"hora","n":50},{"e":"perdiendo","n":3}]},"units":[0,1,2,3],"to":{"k":"asaltar","to":"@obj"}}]}}
Arrow order matters: in r2, "signal 1" is checked before "it is H+00:30", so the signal wins when both hold. The same squad from cards (new_plan), to refine afterwards with edits:
{ "comp": ["mg", "rifle", "rifle", "scout"], "kit": [[], ["granada", "humo"], ["granada"], ["prismaticos"]],
"soldiers": [ { "dest": "Granja-A", "attitude": "cauto" }, { "dest": "Cruce", "via": "Huerto", "attitude": "asalto" },
{ "dest": "Vado", "attitude": "asalto" }, { "dest": "Molino", "attitude": "cauto" } ] }