From b41cf1c210ae0b4db52939c1779d5d7be4a4fe44 Mon Sep 17 00:00:00 2001 From: John Coffey Date: Wed, 9 Sep 2026 00:36:39 -0700 Subject: [PATCH] Run the published test cases, and fix what they found tools/datc.py turns the Diplomacy Adjudicator Test Cases into a fixture: the orders and their annotated outcomes, not the document's prose. 139 movement cases run; 107 pass. Three real faults so far, none of which the hand-written cases had caught: Orders were never validated. An illegal order has to be refused and the unit left holding -- still standing there, still in everybody's way -- and a fleet told to go to Spain has to be told which coast when both are reachable. There is now a validation pass, and ordering another country's unit is refused without disturbing the order its owner actually gave. The paradox rule did not terminate. Settling only what was already in the dependency cycle resolves nothing in a real paradox, so the resolver asked the same question forever -- Pandin's Paradox was a stack overflow rather than an answer. It now restarts the whole resolution with the convoyed army held still, which is inelegant and provably finite: each restart forces one more army to stand, and there are only so many armies. A held army kept its path. Szykman's rule stops the army; it has to stop the army's weight too, or the paradox re-forms on the next pass and the restart never converges. --- src/game/adjudicate.ts | 91 +- src/game/datc.json | 13762 +++++++++++++++++++++++++++++++++++++++ src/game/datc.test.ts | 76 + src/game/orders.ts | 117 +- tools/datc.py | 143 + tsconfig.app.json | 1 + 6 files changed, 14169 insertions(+), 21 deletions(-) create mode 100644 src/game/datc.json create mode 100644 src/game/datc.test.ts create mode 100644 tools/datc.py diff --git a/src/game/adjudicate.ts b/src/game/adjudicate.ts index f5e31de..6f6912e 100644 --- a/src/game/adjudicate.ts +++ b/src/game/adjudicate.ts @@ -1,5 +1,5 @@ import { ARMY, base } from './map' -import { canStep, convoyRoute, type Board, type Order, type Unit } from './orders' +import { canStep, convoyRoute, validate, type Board, type Order, type Unit } from './orders' /** * The adjudicator. @@ -47,11 +47,43 @@ export interface Outcome { type State = 'unresolved' | 'guessing' | 'resolved' +/** + * Thrown when a convoy paradox turns up, to start the whole resolution again + * with that convoy's army held still. Restarting is not elegant and it is + * provably finite, which matters more: every restart forces one more army to + * stand, and there are only so many armies. + */ +class Paradox extends Error { + stalled: readonly string[] + constructor(stalled: readonly string[]) { + super('convoy paradox') + this.stalled = stalled + } +} + export function adjudicate(board: Board, orderList: readonly Order[]): Outcome { - const orders = new Map() - for (const o of orderList) orders.set(base(o.at), o) - // A unit with no order holds; a unit with a nonsense order holds too. - for (const p of board.keys()) if (!orders.has(p)) orders.set(p, { type: 'hold', at: p }) + const forced = new Set() + for (;;) { + try { + return resolveAll(board, orderList, forced) + } catch (e) { + if (!(e instanceof Paradox)) throw e + const before = forced.size + for (const p of e.stalled) forced.add(p) + // No progress would mean looping forever; there is a bug if it happens. + if (forced.size === before) throw new Error('paradox made no progress') + } + } +} + +function resolveAll( + board: Board, + orderList: readonly Order[], + /** Convoyed armies a paradox has already forced to stand still. */ + forced: ReadonlySet, +): Outcome { + // A unit with no order holds, and so does a unit whose order was refused. + const { orders, illegal } = validate(board, orderList) const state = new Map() const result = new Map() @@ -106,6 +138,10 @@ export function adjudicate(board: Board, orderList: readonly Order[]): Outcome { /** Can this move physically happen at all? Zero attack strength if not. */ function hasPath(p: string): boolean { + // An army Szykman's rule has told to stand has no route anywhere, and + // therefore no weight: it cuts nothing and prevents nothing. Leaving it + // with a path is what let the paradox re-form on the next pass. + if (forced.has(p)) return false const o = orderAt(p) const unit = unitAt(p) if (o?.type !== 'move' || !unit) return false @@ -191,6 +227,10 @@ export function adjudicate(board: Board, orderList: readonly Order[]): Outcome { function adjudicateOne(p: string): boolean { const o = orderAt(p)! + // Szykman's rule, already applied: this army was carried into a paradox + // on an earlier pass and has been told to stand. + if (forced.has(p)) return false + if (o.type === 'hold') return true if (o.type === 'convoy') { @@ -301,19 +341,34 @@ export function adjudicate(board: Board, orderList: readonly Order[]): Outcome { const cycle = dep.slice(mark) dep.length = mark - const paradox = cycle.some((p) => orderAt(p)?.type === 'convoy') + const convoys = cycle.filter((p) => orderAt(p)?.type === 'convoy') - for (const p of cycle) { - const o = orderAt(p) - if (paradox) { - if (o?.type === 'move' && isConvoyed(p)) { - state.set(p, 'resolved') - result.set(p, false) - } else { - state.set(p, 'unresolved') - } - } else { - // Everybody in the ring moves. + if (convoys.length > 0) { + /* + * A convoy paradox: whether the convoy survives depends on the move the + * convoy is carrying. Szykman's rule settles it -- the convoyed move + * fails -- and it is a convention rather than a deduction, which is why + * it is written down here rather than buried in the arithmetic. + * + * The armies stalled are the ones those convoy orders name, not merely + * the ones that happen to be in the cycle, which in a real paradox is + * often none of them. Settling it by restarting rather than by patching + * the half-resolved state is what makes it terminate. + */ + const stalled: string[] = [] + for (const c of convoys) { + const o = orderAt(c) + if (o?.type === 'convoy') stalled.push(base(o.from)) + } + throw new Paradox(stalled) + } + + { + // A ring of units all moving into each other. Nobody dislodges + // anybody; they all shuffle round, so they all go. + // A ring of units all moving into each other. Nobody dislodges + // anybody; they all shuffle round, so they all go. + for (const p of cycle) { state.set(p, 'resolved') result.set(p, true) } @@ -324,6 +379,8 @@ export function adjudicate(board: Board, orderList: readonly Order[]): Outcome { const success = new Map() for (const p of orders.keys()) success.set(p, resolve(p)) + // An order that was never a legal order did not succeed at anything. + for (const p of illegal) success.set(p, false) const dislodged = new Map() for (const p of board.keys()) { diff --git a/src/game/datc.json b/src/game/datc.json new file mode 100644 index 0000000..e328893 --- /dev/null +++ b/src/game/datc.json @@ -0,0 +1,13762 @@ +[ + { + "id": "6.A.1", + "title": "moving to a province that is not a neighbour", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "move", + "at": "nth", + "to": "pic", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "nth": [ + "illegal" + ] + } + }, + { + "id": "6.A.2", + "title": "move army to sea", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "iri", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "lvp": [ + "illegal" + ] + } + }, + { + "id": "6.A.3", + "title": "move fleet to land", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "kie" + } + ], + "orders": [ + { + "type": "move", + "at": "kie", + "to": "mun", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "kie": [ + "illegal" + ] + } + }, + { + "id": "6.A.4", + "title": "move to own province", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "kie" + } + ], + "orders": [ + { + "type": "move", + "at": "kie", + "to": "kie", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "kie": [ + "illegal" + ] + } + }, + { + "id": "6.A.5", + "title": "move to own province with convoy", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "yor" + }, + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "germany", + "type": "fleet", + "at": "lon" + }, + { + "power": "germany", + "type": "army", + "at": "wal" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "yor", + "to": "yor", + "power": "england" + }, + { + "type": "move", + "at": "yor", + "to": "yor", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lvp", + "from": "yor", + "to": "yor", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "yor", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "wal", + "from": "lon", + "to": "yor", + "power": "germany" + } + ], + "expect": { + "nth": [ + "illegal" + ], + "yor": [ + "illegal", + "dislodged" + ], + "lvp": [ + "illegal" + ], + "lon": [ + "succeeds" + ], + "wal": [ + "given" + ] + } + }, + { + "id": "6.A.6", + "title": "ordering a unit of another country", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "lon" + } + ], + "orders": [ + { + "type": "move", + "at": "lon", + "to": "nth", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "lon": [ + "illegal" + ] + } + }, + { + "id": "6.A.7", + "title": "only armies can be convoyed", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + } + ], + "expect": { + "lon": [ + "illegal" + ], + "nth": [ + "illegal" + ] + } + }, + { + "id": "6.A.8", + "title": "support to hold yourself is not possible", + "units": [ + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + }, + { + "power": "austria", + "type": "fleet", + "at": "tri" + } + ], + "orders": [ + { + "type": "move", + "at": "ven", + "to": "tri", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "tyr", + "from": "ven", + "to": "tri", + "power": "italy" + }, + { + "type": "support", + "at": "tri", + "from": "tri", + "to": "tri", + "power": "austria" + } + ], + "expect": { + "ven": [ + "succeeds" + ], + "tyr": [ + "given" + ], + "tri": [ + "illegal", + "dislodged" + ] + } + }, + { + "id": "6.A.9", + "title": "fleets must follow coast if not on sea", + "units": [ + { + "power": "italy", + "type": "fleet", + "at": "rom" + } + ], + "orders": [ + { + "type": "move", + "at": "rom", + "to": "ven", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "rom": [ + "illegal" + ] + } + }, + { + "id": "6.A.10", + "title": "support on unreachable destination not possible", + "units": [ + { + "power": "austria", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "fleet", + "at": "rom" + }, + { + "power": "italy", + "type": "army", + "at": "apu" + } + ], + "orders": [ + { + "type": "hold", + "at": "ven", + "power": "austria" + }, + { + "type": "support", + "at": "rom", + "from": "apu", + "to": "ven", + "power": "italy" + }, + { + "type": "move", + "at": "apu", + "to": "ven", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "ven": [ + "stands" + ], + "rom": [ + "illegal" + ], + "apu": [ + "fails" + ] + } + }, + { + "id": "6.A.11", + "title": "simple bounce", + "units": [ + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + } + ], + "orders": [ + { + "type": "move", + "at": "vie", + "to": "tyr", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "ven", + "to": "tyr", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "vie": [ + "fails" + ], + "ven": [ + "fails" + ] + } + }, + { + "id": "6.A.12", + "title": "bounce of three units", + "units": [ + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + } + ], + "orders": [ + { + "type": "move", + "at": "vie", + "to": "tyr", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "mun", + "to": "tyr", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "ven", + "to": "tyr", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "vie": [ + "fails" + ], + "mun": [ + "fails" + ], + "ven": [ + "fails" + ] + } + }, + { + "id": "6.B.1", + "title": "moving with unspecified coast when coast is necessary", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "por" + } + ], + "orders": [ + { + "type": "move", + "at": "por", + "to": "spa", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "por": [ + "illegal" + ] + } + }, + { + "id": "6.B.2", + "title": "moving with unspecified coast when coast is not necessary", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "gas" + } + ], + "orders": [ + { + "type": "move", + "at": "gas", + "to": "spa", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "gas": [ + "succeeds" + ] + } + }, + { + "id": "6.B.3", + "title": "moving to impossible coast while other coast is possible", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "gas" + } + ], + "orders": [ + { + "type": "move", + "at": "gas", + "to": "spa/sc", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "gas": [ + "illegal" + ] + } + }, + { + "id": "6.B.4", + "title": "support to unreachable coast allowed", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "gas" + }, + { + "power": "france", + "type": "fleet", + "at": "mar" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "move", + "at": "gas", + "to": "spa/nc", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "mar", + "from": "gas", + "to": "spa/nc", + "power": "france" + }, + { + "type": "move", + "at": "wes", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "gas": [ + "succeeds" + ], + "mar": [ + "given" + ], + "wes": [ + "fails" + ] + } + }, + { + "id": "6.B.5", + "title": "support from unreachable coast not allowed", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "mar" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/nc" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + } + ], + "orders": [ + { + "type": "move", + "at": "mar", + "to": "lyo", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "spa/nc", + "from": "mar", + "to": "lyo", + "power": "france" + }, + { + "type": "hold", + "at": "lyo", + "power": "italy" + } + ], + "expect": { + "mar": [ + "fails" + ], + "spa": [ + "illegal" + ], + "lyo": [ + "stands" + ] + } + }, + { + "id": "6.B.6", + "title": "support can be cut with other coast", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "iri" + }, + { + "power": "england", + "type": "fleet", + "at": "nao" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/nc" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + } + ], + "orders": [ + { + "type": "support", + "at": "iri", + "from": "nao", + "to": "mao", + "power": "england" + }, + { + "type": "move", + "at": "nao", + "to": "mao", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "spa/nc", + "from": "mao", + "to": "mao", + "power": "france" + }, + { + "type": "hold", + "at": "mao", + "power": "france" + }, + { + "type": "move", + "at": "lyo", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "iri": [ + "given" + ], + "nao": [ + "succeeds" + ], + "spa": [ + "cut" + ], + "mao": [ + "dislodged" + ], + "lyo": [ + "fails" + ] + } + }, + { + "id": "6.B.7", + "title": "supporting own unit with unspecified coast", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "por" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "support", + "at": "por", + "from": "mao", + "to": "spa", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "spa/nc", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "lyo", + "from": "wes", + "to": "spa/sc", + "power": "italy" + }, + { + "type": "move", + "at": "wes", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "por": [ + "given" + ], + "mao": [ + "fails" + ], + "lyo": [ + "given" + ], + "wes": [ + "fails" + ] + } + }, + { + "id": "6.B.8", + "title": "supporting with unspecified coast when only one coast is possible", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "por" + }, + { + "power": "france", + "type": "fleet", + "at": "gas" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "support", + "at": "por", + "from": "gas", + "to": "spa", + "power": "france" + }, + { + "type": "move", + "at": "gas", + "to": "spa/nc", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "lyo", + "from": "wes", + "to": "spa/sc", + "power": "italy" + }, + { + "type": "move", + "at": "wes", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "por": [ + "given" + ], + "gas": [ + "fails" + ], + "lyo": [ + "given" + ], + "wes": [ + "fails" + ] + } + }, + { + "id": "6.B.9", + "title": "supporting with wrong coast", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "por" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "support", + "at": "por", + "from": "mao", + "to": "spa/nc", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "spa/sc", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "lyo", + "from": "wes", + "to": "spa/sc", + "power": "italy" + }, + { + "type": "move", + "at": "wes", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "por": [ + "invalid" + ], + "mao": [ + "fails" + ], + "lyo": [ + "given" + ], + "wes": [ + "succeeds" + ] + } + }, + { + "id": "6.B.10", + "title": "unit ordered with wrong coast", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "spa/nc" + } + ], + "orders": [ + { + "type": "move", + "at": "spa/nc", + "to": "lyo", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "spa": [ + "succeeds" + ] + } + }, + { + "id": "6.B.11", + "title": "coast cannot be ordered to change", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "spa/sc" + } + ], + "orders": [ + { + "type": "move", + "at": "spa/sc", + "to": "lyo", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "spa": [ + "illegal" + ] + } + }, + { + "id": "6.B.12", + "title": "army movement with coastal specification", + "units": [ + { + "power": "france", + "type": "army", + "at": "gas" + } + ], + "orders": [ + { + "type": "move", + "at": "gas", + "to": "spa/nc", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "gas": [ + "succeeds" + ] + } + }, + { + "id": "6.B.13", + "title": "coastal crawl not allowed", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "bul/sc" + }, + { + "power": "turkey", + "type": "fleet", + "at": "con" + } + ], + "orders": [ + { + "type": "move", + "at": "bul/sc", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "con", + "to": "bul/ec", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "bul": [ + "fails" + ], + "con": [ + "fails" + ] + } + }, + { + "id": "6.B.15", + "title": "supporting foreign unit with unspecified coast", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "por" + }, + { + "power": "england", + "type": "fleet", + "at": "mao" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "support", + "at": "por", + "from": "mao", + "to": "spa", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "spa/nc", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lyo", + "from": "wes", + "to": "spa/sc", + "power": "italy" + }, + { + "type": "move", + "at": "wes", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "por": [ + "given" + ], + "mao": [ + "fails" + ], + "lyo": [ + "given" + ], + "wes": [ + "fails" + ] + } + }, + { + "id": "6.B.16", + "title": "hold support with wrong coast", + "units": [ + { + "power": "france", + "type": "army", + "at": "gas" + }, + { + "power": "france", + "type": "army", + "at": "mar" + }, + { + "power": "italy", + "type": "fleet", + "at": "spa/sc" + }, + { + "power": "england", + "type": "fleet", + "at": "por" + } + ], + "orders": [ + { + "type": "move", + "at": "gas", + "to": "spa", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "mar", + "from": "gas", + "to": "spa", + "power": "france" + }, + { + "type": "hold", + "at": "spa/sc", + "power": "italy" + }, + { + "type": "support", + "at": "por", + "from": "spa/nc", + "to": "spa/nc", + "power": "england" + } + ], + "expect": { + "gas": [ + "fails" + ], + "mar": [ + "given" + ], + "spa": [ + "stands" + ], + "por": [ + "given" + ] + } + }, + { + "id": "6.B.17", + "title": "move support with wrong coast for departure province", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "mao" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/sc" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "hold", + "at": "mao", + "power": "england" + }, + { + "type": "move", + "at": "spa/sc", + "to": "mao", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "wes", + "from": "spa/nc", + "to": "mao", + "power": "italy" + } + ], + "expect": { + "mao": [ + "dislodged" + ], + "spa": [ + "succeeds" + ], + "wes": [ + "given" + ] + } + }, + { + "id": "6.B.18", + "title": "convoy starting from multi-coast province", + "units": [ + { + "power": "turkey", + "type": "army", + "at": "bul" + }, + { + "power": "turkey", + "type": "fleet", + "at": "bla" + } + ], + "orders": [ + { + "type": "move", + "at": "bul", + "to": "sev", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "convoy", + "at": "bla", + "from": "bul", + "to": "sev", + "power": "turkey" + } + ], + "expect": { + "bul": [ + "succeeds" + ], + "bla": [ + "available" + ] + } + }, + { + "id": "6.B.19", + "title": "convoy ending at multi-coast province", + "units": [ + { + "power": "italy", + "type": "army", + "at": "tus" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + } + ], + "orders": [ + { + "type": "move", + "at": "tus", + "to": "spa", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "convoy", + "at": "lyo", + "from": "tus", + "to": "spa", + "power": "italy" + } + ], + "expect": { + "tus": [ + "succeeds" + ], + "lyo": [ + "available" + ] + } + }, + { + "id": "6.C.1", + "title": "three army circular movement", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "army", + "at": "con" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + } + ], + "orders": [ + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "con", + "to": "smy", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "smy", + "to": "ank", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "ank": [ + "succeeds" + ], + "con": [ + "succeeds" + ], + "smy": [ + "succeeds" + ] + } + }, + { + "id": "6.C.2", + "title": "three army circular movement with support", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + }, + { + "power": "italy", + "type": "army", + "at": "con" + } + ], + "orders": [ + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "smy", + "to": "ank", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "bul", + "from": "ank", + "to": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "con", + "to": "smy", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "ank": [ + "succeeds" + ], + "smy": [ + "succeeds" + ], + "bul": [ + "given" + ], + "con": [ + "succeeds" + ] + } + }, + { + "id": "6.C.3", + "title": "a disrupted three army circular movement", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "army", + "at": "con" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "con", + "to": "smy", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "smy", + "to": "ank", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "bul", + "to": "con", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "ank": [ + "fails" + ], + "con": [ + "fails" + ], + "smy": [ + "fails" + ], + "bul": [ + "fails" + ] + } + }, + { + "id": "6.C.4", + "title": "a circular movement with attacked convoy", + "units": [ + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + }, + { + "power": "turkey", + "type": "fleet", + "at": "aeg" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ion" + }, + { + "power": "turkey", + "type": "fleet", + "at": "adr" + }, + { + "power": "italy", + "type": "fleet", + "at": "nap" + } + ], + "orders": [ + { + "type": "move", + "at": "tri", + "to": "ser", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "ser", + "to": "bul", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "bul", + "to": "tri", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "convoy", + "at": "aeg", + "from": "bul", + "to": "tri", + "power": "turkey" + }, + { + "type": "convoy", + "at": "ion", + "from": "bul", + "to": "tri", + "power": "turkey" + }, + { + "type": "convoy", + "at": "adr", + "from": "bul", + "to": "tri", + "power": "turkey" + }, + { + "type": "move", + "at": "nap", + "to": "ion", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "tri": [ + "succeeds" + ], + "ser": [ + "succeeds" + ], + "bul": [ + "succeeds" + ], + "aeg": [ + "available" + ], + "ion": [ + "available" + ], + "adr": [ + "available" + ], + "nap": [ + "fails" + ] + } + }, + { + "id": "6.C.5", + "title": "a disrupted circular movement due to dislodged convoy", + "units": [ + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + }, + { + "power": "turkey", + "type": "fleet", + "at": "aeg" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ion" + }, + { + "power": "turkey", + "type": "fleet", + "at": "adr" + }, + { + "power": "italy", + "type": "fleet", + "at": "nap" + }, + { + "power": "italy", + "type": "fleet", + "at": "tun" + } + ], + "orders": [ + { + "type": "move", + "at": "tri", + "to": "ser", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "ser", + "to": "bul", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "bul", + "to": "tri", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "convoy", + "at": "aeg", + "from": "bul", + "to": "tri", + "power": "turkey" + }, + { + "type": "convoy", + "at": "ion", + "from": "bul", + "to": "tri", + "power": "turkey" + }, + { + "type": "convoy", + "at": "adr", + "from": "bul", + "to": "tri", + "power": "turkey" + }, + { + "type": "move", + "at": "nap", + "to": "ion", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "tun", + "from": "nap", + "to": "ion", + "power": "italy" + } + ], + "expect": { + "tri": [ + "fails" + ], + "ser": [ + "fails" + ], + "bul": [ + "fails" + ], + "aeg": [ + "available" + ], + "ion": [ + "disrupted", + "dislodged" + ], + "adr": [ + "available" + ], + "nap": [ + "succeeds" + ], + "tun": [ + "given" + ] + } + }, + { + "id": "6.C.6", + "title": "two armies with two convoys", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "bel" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "bel", + "to": "lon", + "power": "france" + }, + { + "type": "move", + "at": "bel", + "to": "lon", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "nth": [ + "available" + ], + "lon": [ + "succeeds" + ], + "eng": [ + "available" + ], + "bel": [ + "succeeds" + ] + } + }, + { + "id": "6.C.7", + "title": "disrupted unit swap", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "bel" + }, + { + "power": "france", + "type": "army", + "at": "bur" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "bel", + "to": "lon", + "power": "france" + }, + { + "type": "move", + "at": "bel", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "move", + "at": "bur", + "to": "bel", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "nth": [ + "available" + ], + "lon": [ + "fails" + ], + "eng": [ + "available" + ], + "bel": [ + "fails" + ], + "bur": [ + "fails" + ] + } + }, + { + "id": "6.C.8", + "title": "no self dislodgment in disrupted circular movement", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "con" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "russia", + "type": "army", + "at": "ser" + } + ], + "orders": [ + { + "type": "move", + "at": "con", + "to": "bla", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "move", + "at": "bul", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "smy", + "from": "bul", + "to": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "bla", + "to": "bul/ec", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "ser", + "to": "bul", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "con": [ + "fails" + ], + "bul": [ + "fails" + ], + "smy": [ + "given" + ], + "bla": [ + "fails" + ], + "ser": [ + "fails" + ] + } + }, + { + "id": "6.C.9", + "title": "no help in dislodgment of own unit in disrupted circular movement", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "con" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "russia", + "type": "army", + "at": "ser" + }, + { + "power": "russia", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "move", + "at": "con", + "to": "bla", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "smy", + "from": "bul", + "to": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "bla", + "to": "bul/ec", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "ser", + "to": "bul", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "bul", + "to": "con", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "con": [ + "fails" + ], + "smy": [ + "given" + ], + "bla": [ + "fails" + ], + "ser": [ + "fails" + ], + "bul": [ + "fails" + ] + } + }, + { + "id": "6.D.1", + "title": "supported hold can prevent dislodgment", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "adr" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + } + ], + "orders": [ + { + "type": "support", + "at": "adr", + "from": "tri", + "to": "ven", + "power": "austria" + }, + { + "type": "move", + "at": "tri", + "to": "ven", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "hold", + "at": "ven", + "power": "italy" + }, + { + "type": "support", + "at": "tyr", + "from": "ven", + "to": "ven", + "power": "italy" + } + ], + "expect": { + "adr": [ + "given" + ], + "tri": [ + "fails" + ], + "ven": [ + "stands" + ], + "tyr": [ + "given" + ] + } + }, + { + "id": "6.D.2", + "title": "a move cuts support on hold", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "adr" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + } + ], + "orders": [ + { + "type": "support", + "at": "adr", + "from": "tri", + "to": "ven", + "power": "austria" + }, + { + "type": "move", + "at": "tri", + "to": "ven", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "vie", + "to": "tyr", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "hold", + "at": "ven", + "power": "italy" + }, + { + "type": "support", + "at": "tyr", + "from": "ven", + "to": "ven", + "power": "italy" + } + ], + "expect": { + "adr": [ + "given" + ], + "tri": [ + "succeeds" + ], + "vie": [ + "fails" + ], + "ven": [ + "dislodged" + ], + "tyr": [ + "cut" + ] + } + }, + { + "id": "6.D.3", + "title": "a move cuts support on move", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "adr" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "fleet", + "at": "ion" + } + ], + "orders": [ + { + "type": "support", + "at": "adr", + "from": "tri", + "to": "ven", + "power": "austria" + }, + { + "type": "move", + "at": "tri", + "to": "ven", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "hold", + "at": "ven", + "power": "italy" + }, + { + "type": "move", + "at": "ion", + "to": "adr", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "adr": [ + "cut" + ], + "tri": [ + "fails" + ], + "ven": [ + "stands" + ], + "ion": [ + "fails" + ] + } + }, + { + "id": "6.D.4", + "title": "support to hold on unit supporting a hold allowed", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "russia", + "type": "fleet", + "at": "bal" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "support", + "at": "ber", + "from": "kie", + "to": "kie", + "power": "germany" + }, + { + "type": "support", + "at": "kie", + "from": "ber", + "to": "ber", + "power": "germany" + }, + { + "type": "support", + "at": "bal", + "from": "pru", + "to": "ber", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "cut" + ], + "kie": [ + "given" + ], + "bal": [ + "given" + ], + "pru": [ + "fails" + ] + } + }, + { + "id": "6.D.5", + "title": "support to hold on unit supporting a move allowed", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "russia", + "type": "fleet", + "at": "bal" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "support", + "at": "ber", + "from": "mun", + "to": "sil", + "power": "germany" + }, + { + "type": "support", + "at": "kie", + "from": "ber", + "to": "ber", + "power": "germany" + }, + { + "type": "move", + "at": "mun", + "to": "sil", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "bal", + "from": "pru", + "to": "ber", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "cut" + ], + "kie": [ + "given" + ], + "mun": [ + "succeeds" + ], + "bal": [ + "given" + ], + "pru": [ + "fails" + ] + } + }, + { + "id": "6.D.6", + "title": "support to hold on convoying unit allowed", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "bal" + }, + { + "power": "germany", + "type": "fleet", + "at": "pru" + }, + { + "power": "russia", + "type": "fleet", + "at": "lvn" + }, + { + "power": "russia", + "type": "fleet", + "at": "bot" + } + ], + "orders": [ + { + "type": "move", + "at": "ber", + "to": "swe", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "bal", + "from": "ber", + "to": "swe", + "power": "germany" + }, + { + "type": "support", + "at": "pru", + "from": "bal", + "to": "bal", + "power": "germany" + }, + { + "type": "move", + "at": "lvn", + "to": "bal", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "bot", + "from": "lvn", + "to": "bal", + "power": "russia" + } + ], + "expect": { + "ber": [ + "succeeds" + ], + "bal": [ + "available" + ], + "pru": [ + "given" + ], + "lvn": [ + "fails" + ], + "bot": [ + "given" + ] + } + }, + { + "id": "6.D.7", + "title": "support to hold on moving unit not allowed", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "bal" + }, + { + "power": "germany", + "type": "fleet", + "at": "pru" + }, + { + "power": "russia", + "type": "fleet", + "at": "lvn" + }, + { + "power": "russia", + "type": "fleet", + "at": "bot" + }, + { + "power": "russia", + "type": "army", + "at": "fin" + } + ], + "orders": [ + { + "type": "move", + "at": "bal", + "to": "swe", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "pru", + "from": "bal", + "to": "bal", + "power": "germany" + }, + { + "type": "move", + "at": "lvn", + "to": "bal", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "bot", + "from": "lvn", + "to": "bal", + "power": "russia" + }, + { + "type": "move", + "at": "fin", + "to": "swe", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "bal": [ + "fails", + "dislodged" + ], + "pru": [ + "invalid" + ], + "lvn": [ + "succeeds" + ], + "bot": [ + "given" + ], + "fin": [ + "fails" + ] + } + }, + { + "id": "6.D.8", + "title": "failed convoy cannot receive hold support", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "ion" + }, + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "austria", + "type": "army", + "at": "alb" + }, + { + "power": "turkey", + "type": "army", + "at": "gre" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "hold", + "at": "ion", + "power": "austria" + }, + { + "type": "support", + "at": "ser", + "from": "alb", + "to": "gre", + "power": "austria" + }, + { + "type": "move", + "at": "alb", + "to": "gre", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "gre", + "to": "nap", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "bul", + "from": "gre", + "to": "gre", + "power": "turkey" + } + ], + "expect": { + "ion": [ + "stands" + ], + "ser": [ + "given" + ], + "alb": [ + "succeeds" + ], + "gre": [ + "invalid", + "dislodged" + ], + "bul": [ + "invalid" + ] + } + }, + { + "id": "6.D.9", + "title": "support to move on holding unit not allowed", + "units": [ + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + }, + { + "power": "austria", + "type": "army", + "at": "alb" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + } + ], + "orders": [ + { + "type": "move", + "at": "ven", + "to": "tri", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "tyr", + "from": "ven", + "to": "tri", + "power": "italy" + }, + { + "type": "support", + "at": "alb", + "from": "tri", + "to": "ser", + "power": "austria" + }, + { + "type": "hold", + "at": "tri", + "power": "austria" + } + ], + "expect": { + "ven": [ + "succeeds" + ], + "tyr": [ + "given" + ], + "alb": [ + "invalid" + ], + "tri": [ + "dislodged" + ] + } + }, + { + "id": "6.D.10", + "title": "self dislodgment prohibited", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + } + ], + "orders": [ + { + "type": "hold", + "at": "ber", + "power": "germany" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "mun", + "from": "kie", + "to": "ber", + "power": "germany" + } + ], + "expect": { + "ber": [ + "stands" + ], + "kie": [ + "fails" + ], + "mun": [ + "given" + ] + } + }, + { + "id": "6.D.11", + "title": "no self dislodgment of returning unit", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "russia", + "type": "army", + "at": "war" + } + ], + "orders": [ + { + "type": "move", + "at": "ber", + "to": "pru", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "mun", + "from": "kie", + "to": "ber", + "power": "germany" + }, + { + "type": "move", + "at": "war", + "to": "pru", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "fails" + ], + "kie": [ + "fails" + ], + "mun": [ + "given" + ], + "war": [ + "fails" + ] + } + }, + { + "id": "6.D.12", + "title": "supporting a foreign unit to dislodge own unit prohibited", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + } + ], + "orders": [ + { + "type": "hold", + "at": "tri", + "power": "austria" + }, + { + "type": "support", + "at": "vie", + "from": "ven", + "to": "tri", + "power": "austria" + }, + { + "type": "move", + "at": "ven", + "to": "tri", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "tri": [ + "stands" + ], + "vie": [ + "given" + ], + "ven": [ + "fails" + ] + } + }, + { + "id": "6.D.13", + "title": "supporting a foreign unit to dislodge a returning own unit prohibited", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "fleet", + "at": "apu" + } + ], + "orders": [ + { + "type": "move", + "at": "tri", + "to": "adr", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "support", + "at": "vie", + "from": "ven", + "to": "tri", + "power": "austria" + }, + { + "type": "move", + "at": "ven", + "to": "tri", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "move", + "at": "apu", + "to": "adr", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "tri": [ + "fails" + ], + "vie": [ + "given" + ], + "ven": [ + "fails" + ], + "apu": [ + "fails" + ] + } + }, + { + "id": "6.D.14", + "title": "supporting a foreign unit is not enough to prevent dislodgment", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + }, + { + "power": "italy", + "type": "fleet", + "at": "adr" + } + ], + "orders": [ + { + "type": "hold", + "at": "tri", + "power": "austria" + }, + { + "type": "support", + "at": "vie", + "from": "ven", + "to": "tri", + "power": "austria" + }, + { + "type": "move", + "at": "ven", + "to": "tri", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "tyr", + "from": "ven", + "to": "tri", + "power": "italy" + }, + { + "type": "support", + "at": "adr", + "from": "ven", + "to": "tri", + "power": "italy" + } + ], + "expect": { + "tri": [ + "dislodged" + ], + "vie": [ + "given" + ], + "ven": [ + "succeeds" + ], + "tyr": [ + "given" + ], + "adr": [ + "given" + ] + } + }, + { + "id": "6.D.15", + "title": "defender cannot cut support for attack on itself", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + } + ], + "orders": [ + { + "type": "support", + "at": "con", + "from": "bla", + "to": "ank", + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "ank", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "con": [ + "given" + ], + "bla": [ + "succeeds" + ], + "ank": [ + "fails", + "dislodged" + ] + } + }, + { + "id": "6.D.16", + "title": "convoying a unit dislodging a unit of same power is allowed", + "units": [ + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "bel" + } + ], + "orders": [ + { + "type": "hold", + "at": "lon", + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "bel", + "to": "lon", + "power": "england" + }, + { + "type": "support", + "at": "eng", + "from": "bel", + "to": "lon", + "power": "france" + }, + { + "type": "move", + "at": "bel", + "to": "lon", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "lon": [ + "dislodged" + ], + "nth": [ + "available" + ], + "eng": [ + "given" + ], + "bel": [ + "succeeds" + ] + } + }, + { + "id": "6.D.17", + "title": "dislodgment cuts supports", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + }, + { + "power": "turkey", + "type": "army", + "at": "arm" + } + ], + "orders": [ + { + "type": "support", + "at": "con", + "from": "bla", + "to": "ank", + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "ank", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "smy", + "from": "ank", + "to": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "arm", + "to": "ank", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "con": [ + "cut", + "dislodged" + ], + "bla": [ + "fails" + ], + "ank": [ + "succeeds" + ], + "smy": [ + "given" + ], + "arm": [ + "fails" + ] + } + }, + { + "id": "6.D.18", + "title": "a surviving unit will sustain support", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "russia", + "type": "army", + "at": "bul" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + }, + { + "power": "turkey", + "type": "army", + "at": "arm" + } + ], + "orders": [ + { + "type": "support", + "at": "con", + "from": "bla", + "to": "ank", + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "ank", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "bul", + "from": "con", + "to": "con", + "power": "russia" + }, + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "smy", + "from": "ank", + "to": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "arm", + "to": "ank", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "con": [ + "given" + ], + "bla": [ + "succeeds" + ], + "bul": [ + "given" + ], + "ank": [ + "fails", + "destroyed" + ], + "smy": [ + "given" + ], + "arm": [ + "fails" + ] + } + }, + { + "id": "6.D.19", + "title": "even when surviving is in alternative way", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "russia", + "type": "army", + "at": "smy" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + } + ], + "orders": [ + { + "type": "support", + "at": "con", + "from": "bla", + "to": "ank", + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "ank", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "smy", + "from": "ank", + "to": "con", + "power": "russia" + }, + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "con": [ + "given" + ], + "bla": [ + "succeeds" + ], + "smy": [ + "given" + ], + "ank": [ + "fails", + "dislodged" + ] + } + }, + { + "id": "6.D.20", + "title": "unit cannot cut support of its own country", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "yor" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + } + ], + "orders": [ + { + "type": "support", + "at": "lon", + "from": "nth", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "nth", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "yor", + "to": "lon", + "viaConvoy": false, + "power": "england" + }, + { + "type": "hold", + "at": "eng", + "power": "france" + } + ], + "expect": { + "lon": [ + "given" + ], + "nth": [ + "succeeds" + ], + "yor": [ + "fails" + ], + "eng": [ + "dislodged" + ] + } + }, + { + "id": "6.D.21", + "title": "dislodging does not cancel a support cut", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "tri" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "russia", + "type": "army", + "at": "sil" + }, + { + "power": "russia", + "type": "army", + "at": "ber" + } + ], + "orders": [ + { + "type": "hold", + "at": "tri", + "power": "austria" + }, + { + "type": "move", + "at": "ven", + "to": "tri", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "tyr", + "from": "ven", + "to": "tri", + "power": "italy" + }, + { + "type": "move", + "at": "mun", + "to": "tyr", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "sil", + "to": "mun", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "ber", + "from": "sil", + "to": "mun", + "power": "russia" + } + ], + "expect": { + "tri": [ + "stands" + ], + "ven": [ + "fails" + ], + "tyr": [ + "cut" + ], + "mun": [ + "fails", + "dislodged" + ], + "sil": [ + "succeeds" + ], + "ber": [ + "given" + ] + } + }, + { + "id": "6.D.22", + "title": "impossible fleet move cannot be supported", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "bur" + }, + { + "power": "russia", + "type": "army", + "at": "mun" + }, + { + "power": "russia", + "type": "army", + "at": "ber" + } + ], + "orders": [ + { + "type": "move", + "at": "kie", + "to": "mun", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "bur", + "from": "kie", + "to": "mun", + "power": "germany" + }, + { + "type": "move", + "at": "mun", + "to": "kie", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "ber", + "from": "mun", + "to": "kie", + "power": "russia" + } + ], + "expect": { + "kie": [ + "illegal", + "dislodged" + ], + "bur": [ + "illegal" + ], + "mun": [ + "succeeds" + ], + "ber": [ + "given" + ] + } + }, + { + "id": "6.D.23", + "title": "impossible coast move cannot be supported", + "units": [ + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/nc" + }, + { + "power": "france", + "type": "fleet", + "at": "mar" + } + ], + "orders": [ + { + "type": "move", + "at": "lyo", + "to": "spa/sc", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "wes", + "from": "lyo", + "to": "spa/sc", + "power": "italy" + }, + { + "type": "move", + "at": "spa/nc", + "to": "lyo", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "mar", + "from": "spa/nc", + "to": "lyo", + "power": "france" + } + ], + "expect": { + "lyo": [ + "succeeds" + ], + "wes": [ + "given" + ], + "spa": [ + "illegal", + "dislodged" + ], + "mar": [ + "illegal" + ] + } + }, + { + "id": "6.D.24", + "title": "impossible army move cannot be supported", + "units": [ + { + "power": "france", + "type": "army", + "at": "mar" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/sc" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "turkey", + "type": "fleet", + "at": "tys" + }, + { + "power": "turkey", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "move", + "at": "mar", + "to": "lyo", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "spa/sc", + "from": "mar", + "to": "lyo", + "power": "france" + }, + { + "type": "hold", + "at": "lyo", + "power": "italy" + }, + { + "type": "support", + "at": "tys", + "from": "wes", + "to": "lyo", + "power": "turkey" + }, + { + "type": "move", + "at": "wes", + "to": "lyo", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "mar": [ + "illegal" + ], + "spa": [ + "illegal" + ], + "lyo": [ + "dislodged" + ], + "tys": [ + "given" + ], + "wes": [ + "succeeds" + ] + } + }, + { + "id": "6.D.25", + "title": "invalid hold support can be supported", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "russia", + "type": "fleet", + "at": "bal" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "support", + "at": "ber", + "from": "pru", + "to": "pru", + "power": "germany" + }, + { + "type": "support", + "at": "kie", + "from": "ber", + "to": "ber", + "power": "germany" + }, + { + "type": "support", + "at": "bal", + "from": "pru", + "to": "ber", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "invalid" + ], + "kie": [ + "given" + ], + "bal": [ + "given" + ], + "pru": [ + "fails" + ] + } + }, + { + "id": "6.D.26", + "title": "invalid move support can be supported", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "russia", + "type": "fleet", + "at": "bal" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "support", + "at": "ber", + "from": "pru", + "to": "sil", + "power": "germany" + }, + { + "type": "support", + "at": "kie", + "from": "ber", + "to": "ber", + "power": "germany" + }, + { + "type": "support", + "at": "bal", + "from": "pru", + "to": "ber", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "invalid" + ], + "kie": [ + "given" + ], + "bal": [ + "given" + ], + "pru": [ + "fails" + ] + } + }, + { + "id": "6.D.27", + "title": "invalid convoy can be supported", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "swe" + }, + { + "power": "england", + "type": "fleet", + "at": "den" + }, + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "russia", + "type": "fleet", + "at": "bal" + }, + { + "power": "russia", + "type": "fleet", + "at": "pru" + } + ], + "orders": [ + { + "type": "move", + "at": "swe", + "to": "bal", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "den", + "from": "swe", + "to": "bal", + "power": "england" + }, + { + "type": "hold", + "at": "ber", + "power": "germany" + }, + { + "type": "convoy", + "at": "bal", + "from": "ber", + "to": "lvn", + "power": "russia" + }, + { + "type": "support", + "at": "pru", + "from": "bal", + "to": "bal", + "power": "russia" + } + ], + "expect": { + "swe": [ + "fails" + ], + "den": [ + "given" + ], + "ber": [ + "stands" + ], + "bal": [ + "invalid" + ], + "pru": [ + "given" + ] + } + }, + { + "id": "6.D.28", + "title": "impossible move and support", + "units": [ + { + "power": "austria", + "type": "army", + "at": "bud" + }, + { + "power": "russia", + "type": "fleet", + "at": "rum" + }, + { + "power": "turkey", + "type": "fleet", + "at": "bla" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "support", + "at": "bud", + "from": "rum", + "to": "rum", + "power": "austria" + }, + { + "type": "move", + "at": "rum", + "to": "hol", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "rum", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "bul", + "from": "bla", + "to": "rum", + "power": "turkey" + } + ], + "expect": { + "bud": [ + "given" + ], + "rum": [ + "illegal" + ], + "bla": [ + "fails" + ], + "bul": [ + "given" + ] + } + }, + { + "id": "6.D.29", + "title": "move to impossible coast and support", + "units": [ + { + "power": "austria", + "type": "army", + "at": "bud" + }, + { + "power": "russia", + "type": "fleet", + "at": "rum" + }, + { + "power": "turkey", + "type": "fleet", + "at": "bla" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "support", + "at": "bud", + "from": "rum", + "to": "rum", + "power": "austria" + }, + { + "type": "move", + "at": "rum", + "to": "bul/sc", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "rum", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "bul", + "from": "bla", + "to": "rum", + "power": "turkey" + } + ], + "expect": { + "bud": [ + "given" + ], + "rum": [ + "illegal" + ], + "bla": [ + "fails" + ], + "bul": [ + "given" + ] + } + }, + { + "id": "6.D.30", + "title": "move order without coast specification and receiving support", + "units": [ + { + "power": "italy", + "type": "fleet", + "at": "aeg" + }, + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "turkey", + "type": "fleet", + "at": "bla" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "support", + "at": "aeg", + "from": "con", + "to": "con", + "power": "italy" + }, + { + "type": "move", + "at": "con", + "to": "bul", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "bul", + "from": "bla", + "to": "con", + "power": "turkey" + } + ], + "expect": { + "aeg": [ + "given" + ], + "con": [ + "illegal" + ], + "bla": [ + "fails" + ], + "bul": [ + "given" + ] + } + }, + { + "id": "6.D.31", + "title": "a tricky impossible support", + "units": [ + { + "power": "austria", + "type": "army", + "at": "rum" + }, + { + "power": "turkey", + "type": "fleet", + "at": "bla" + } + ], + "orders": [ + { + "type": "move", + "at": "rum", + "to": "arm", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "support", + "at": "bla", + "from": "rum", + "to": "arm", + "power": "turkey" + } + ], + "expect": { + "rum": [ + "invalid" + ], + "bla": [ + "illegal" + ] + } + }, + { + "id": "6.D.32", + "title": "a missing fleet", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "france", + "type": "fleet", + "at": "lon" + }, + { + "power": "germany", + "type": "army", + "at": "yor" + } + ], + "orders": [ + { + "type": "support", + "at": "edi", + "from": "lvp", + "to": "yor", + "power": "england" + }, + { + "type": "move", + "at": "lvp", + "to": "yor", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lon", + "from": "yor", + "to": "yor", + "power": "france" + }, + { + "type": "move", + "at": "yor", + "to": "hol", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "edi": [ + "given" + ], + "lvp": [ + "fails" + ], + "lon": [ + "given" + ], + "yor": [ + "illegal" + ] + } + }, + { + "id": "6.D.33", + "title": "unwanted support allowed", + "units": [ + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "austria", + "type": "army", + "at": "vie" + }, + { + "power": "russia", + "type": "army", + "at": "gal" + }, + { + "power": "turkey", + "type": "army", + "at": "bul" + } + ], + "orders": [ + { + "type": "move", + "at": "ser", + "to": "bud", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "vie", + "to": "bud", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "support", + "at": "gal", + "from": "ser", + "to": "bud", + "power": "russia" + }, + { + "type": "move", + "at": "bul", + "to": "ser", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "ser": [ + "succeeds" + ], + "vie": [ + "fails" + ], + "gal": [ + "given" + ], + "bul": [ + "succeeds" + ] + } + }, + { + "id": "6.D.34", + "title": "support targeting own province not allowed", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "army", + "at": "sil" + }, + { + "power": "germany", + "type": "fleet", + "at": "bal" + }, + { + "power": "italy", + "type": "army", + "at": "pru" + }, + { + "power": "russia", + "type": "army", + "at": "war" + }, + { + "power": "russia", + "type": "army", + "at": "lvn" + } + ], + "orders": [ + { + "type": "move", + "at": "ber", + "to": "pru", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "sil", + "from": "ber", + "to": "pru", + "power": "germany" + }, + { + "type": "support", + "at": "bal", + "from": "ber", + "to": "pru", + "power": "germany" + }, + { + "type": "support", + "at": "pru", + "from": "lvn", + "to": "pru", + "power": "italy" + }, + { + "type": "support", + "at": "war", + "from": "lvn", + "to": "pru", + "power": "russia" + }, + { + "type": "move", + "at": "lvn", + "to": "pru", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "succeeds" + ], + "sil": [ + "given" + ], + "bal": [ + "given" + ], + "pru": [ + "illegal", + "destroyed" + ], + "war": [ + "given" + ], + "lvn": [ + "fails" + ] + } + }, + { + "id": "6.D.35", + "title": "dislodgment cuts supports allowing enemy to advance", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "fleet", + "at": "aeg" + }, + { + "power": "turkey", + "type": "army", + "at": "arm" + }, + { + "power": "turkey", + "type": "army", + "at": "smy" + } + ], + "orders": [ + { + "type": "move", + "at": "bla", + "to": "ank", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "con", + "from": "bla", + "to": "ank", + "power": "russia" + }, + { + "type": "move", + "at": "ank", + "to": "con", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "aeg", + "from": "ank", + "to": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "arm", + "to": "ank", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "smy", + "from": "arm", + "to": "ank", + "power": "turkey" + } + ], + "expect": { + "bla": [ + "fails" + ], + "con": [ + "cut", + "dislodged" + ], + "ank": [ + "succeeds" + ], + "aeg": [ + "given" + ], + "arm": [ + "succeeds" + ], + "smy": [ + "given" + ] + } + }, + { + "id": "6.E.1", + "title": "dislodged unit has no effect on attacker's province", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "sil" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "move", + "at": "ber", + "to": "pru", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "sil", + "from": "ber", + "to": "pru", + "power": "germany" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ber": [ + "succeeds" + ], + "kie": [ + "succeeds" + ], + "sil": [ + "given" + ], + "pru": [ + "fails", + "dislodged" + ] + } + }, + { + "id": "6.E.2", + "title": "no self dislodgment in head-to-head battle", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + } + ], + "orders": [ + { + "type": "move", + "at": "ber", + "to": "kie", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "mun", + "from": "ber", + "to": "kie", + "power": "germany" + } + ], + "expect": { + "ber": [ + "fails" + ], + "kie": [ + "fails" + ], + "mun": [ + "given" + ] + } + }, + { + "id": "6.E.3", + "title": "no help in dislodging own unit", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "england", + "type": "fleet", + "at": "kie" + } + ], + "orders": [ + { + "type": "move", + "at": "ber", + "to": "kie", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "mun", + "from": "kie", + "to": "ber", + "power": "germany" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "ber": [ + "fails" + ], + "mun": [ + "given" + ], + "kie": [ + "fails" + ] + } + }, + { + "id": "6.E.4", + "title": "non-dislodged loser still has effect", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "france", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "england", + "type": "fleet", + "at": "nwg" + }, + { + "power": "austria", + "type": "army", + "at": "kie" + }, + { + "power": "austria", + "type": "army", + "at": "ruh" + } + ], + "orders": [ + { + "type": "move", + "at": "hol", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "hel", + "from": "hol", + "to": "nth", + "power": "germany" + }, + { + "type": "support", + "at": "ska", + "from": "hol", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "nth", + "to": "hol", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "nth", + "to": "hol", + "power": "france" + }, + { + "type": "support", + "at": "edi", + "from": "nwg", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "nwg", + "to": "nth", + "power": "england" + }, + { + "type": "move", + "at": "nwg", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "austria" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "austria" + } + ], + "expect": { + "hol": [ + "fails" + ], + "hel": [ + "given" + ], + "ska": [ + "given" + ], + "nth": [ + "fails" + ], + "bel": [ + "given" + ], + "edi": [ + "given" + ], + "yor": [ + "given" + ], + "nwg": [ + "fails" + ], + "kie": [ + "given" + ], + "ruh": [ + "fails" + ] + } + }, + { + "id": "6.E.5", + "title": "loser dislodged by another army still has effect", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "france", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "england", + "type": "fleet", + "at": "nwg" + }, + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "austria", + "type": "army", + "at": "kie" + }, + { + "power": "austria", + "type": "army", + "at": "ruh" + } + ], + "orders": [ + { + "type": "move", + "at": "hol", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "hel", + "from": "hol", + "to": "nth", + "power": "germany" + }, + { + "type": "support", + "at": "ska", + "from": "hol", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "nth", + "to": "hol", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "nth", + "to": "hol", + "power": "france" + }, + { + "type": "support", + "at": "edi", + "from": "nwg", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "nwg", + "to": "nth", + "power": "england" + }, + { + "type": "move", + "at": "nwg", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lon", + "from": "nwg", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "austria" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "austria" + } + ], + "expect": { + "hol": [ + "fails" + ], + "hel": [ + "given" + ], + "ska": [ + "given" + ], + "nth": [ + "fails", + "dislodged" + ], + "bel": [ + "given" + ], + "edi": [ + "given" + ], + "yor": [ + "given" + ], + "nwg": [ + "succeeds" + ], + "lon": [ + "given" + ], + "kie": [ + "given" + ], + "ruh": [ + "fails" + ] + } + }, + { + "id": "6.E.6", + "title": "not dislodge because of own support still has effect", + "units": [ + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "france", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "austria", + "type": "army", + "at": "kie" + }, + { + "power": "austria", + "type": "army", + "at": "ruh" + } + ], + "orders": [ + { + "type": "move", + "at": "hol", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "hel", + "from": "hol", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "nth", + "to": "hol", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "nth", + "to": "hol", + "power": "france" + }, + { + "type": "support", + "at": "eng", + "from": "hol", + "to": "nth", + "power": "france" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "austria" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "austria" + } + ], + "expect": { + "hol": [ + "fails" + ], + "hel": [ + "given" + ], + "nth": [ + "fails" + ], + "bel": [ + "given" + ], + "eng": [ + "given" + ], + "kie": [ + "given" + ], + "ruh": [ + "fails" + ] + } + }, + { + "id": "6.E.7", + "title": "no self dislodgment with beleaguered garrison", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + } + ], + "orders": [ + { + "type": "hold", + "at": "nth", + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "nwy", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "hel", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "hel", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "ska", + "from": "nwy", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nth", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "nth": [ + "stands" + ], + "yor": [ + "given" + ], + "hol": [ + "given" + ], + "hel": [ + "fails" + ], + "ska": [ + "given" + ], + "nwy": [ + "fails" + ] + } + }, + { + "id": "6.E.8", + "title": "no self dislodgment with beleaguered garrison and head-to-head battle", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + } + ], + "orders": [ + { + "type": "move", + "at": "nth", + "to": "nwy", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "nwy", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "hel", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "hel", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "ska", + "from": "nwy", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nth", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "nth": [ + "fails" + ], + "yor": [ + "given" + ], + "hol": [ + "given" + ], + "hel": [ + "fails" + ], + "ska": [ + "given" + ], + "nwy": [ + "fails" + ] + } + }, + { + "id": "6.E.9", + "title": "almost self dislodgment with beleaguered garrison", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + } + ], + "orders": [ + { + "type": "move", + "at": "nth", + "to": "nwg", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "nwy", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "hel", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "hel", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "ska", + "from": "nwy", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nth", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "nth": [ + "succeeds" + ], + "yor": [ + "given" + ], + "hol": [ + "given" + ], + "hel": [ + "fails" + ], + "ska": [ + "given" + ], + "nwy": [ + "succeeds" + ] + } + }, + { + "id": "6.E.10", + "title": "almost circular movement with no self dislodgment with beleaguered garrison", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "den" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + } + ], + "orders": [ + { + "type": "move", + "at": "nth", + "to": "den", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "nwy", + "to": "nth", + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "hel", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "hel", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "den", + "to": "hel", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "ska", + "from": "nwy", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nth", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "nth": [ + "fails" + ], + "yor": [ + "given" + ], + "hol": [ + "given" + ], + "hel": [ + "fails" + ], + "den": [ + "fails" + ], + "ska": [ + "given" + ], + "nwy": [ + "fails" + ] + } + }, + { + "id": "6.E.11", + "title": "no self dislodgment with beleaguered garrison, unit swap with adjacent convoying and two coasts", + "units": [ + { + "power": "france", + "type": "army", + "at": "spa" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "france", + "type": "fleet", + "at": "lyo" + }, + { + "power": "germany", + "type": "army", + "at": "mar" + }, + { + "power": "germany", + "type": "army", + "at": "gas" + }, + { + "power": "italy", + "type": "fleet", + "at": "por" + }, + { + "power": "italy", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "move", + "at": "spa", + "to": "por", + "viaConvoy": true, + "power": "france" + }, + { + "type": "convoy", + "at": "mao", + "from": "spa", + "to": "por", + "power": "france" + }, + { + "type": "support", + "at": "lyo", + "from": "por", + "to": "spa/nc", + "power": "france" + }, + { + "type": "support", + "at": "mar", + "from": "gas", + "to": "spa", + "power": "germany" + }, + { + "type": "move", + "at": "gas", + "to": "spa", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "por", + "to": "spa/nc", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "wes", + "from": "por", + "to": "spa/nc", + "power": "italy" + } + ], + "expect": { + "spa": [ + "succeeds" + ], + "mao": [ + "available" + ], + "lyo": [ + "given" + ], + "mar": [ + "given" + ], + "gas": [ + "fails" + ], + "por": [ + "succeeds" + ], + "wes": [ + "given" + ] + } + }, + { + "id": "6.E.12", + "title": "support on attack on own unit can be used for other means", + "units": [ + { + "power": "austria", + "type": "army", + "at": "bud" + }, + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "italy", + "type": "army", + "at": "vie" + }, + { + "power": "russia", + "type": "army", + "at": "gal" + }, + { + "power": "russia", + "type": "army", + "at": "rum" + } + ], + "orders": [ + { + "type": "move", + "at": "bud", + "to": "rum", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "support", + "at": "ser", + "from": "vie", + "to": "bud", + "power": "austria" + }, + { + "type": "move", + "at": "vie", + "to": "bud", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "move", + "at": "gal", + "to": "bud", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "rum", + "from": "gal", + "to": "bud", + "power": "russia" + } + ], + "expect": { + "bud": [ + "fails" + ], + "ser": [ + "given" + ], + "vie": [ + "fails" + ], + "gal": [ + "fails" + ], + "rum": [ + "given" + ] + } + }, + { + "id": "6.E.13", + "title": "three way beleaguered garrison", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "fleet", + "at": "nth" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + } + ], + "orders": [ + { + "type": "support", + "at": "edi", + "from": "yor", + "to": "nth", + "power": "england" + }, + { + "type": "move", + "at": "yor", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bel", + "to": "nth", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "eng", + "from": "bel", + "to": "nth", + "power": "france" + }, + { + "type": "hold", + "at": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "nwg", + "to": "nth", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "nwy", + "from": "nwg", + "to": "nth", + "power": "russia" + } + ], + "expect": { + "edi": [ + "given" + ], + "yor": [ + "fails" + ], + "bel": [ + "fails" + ], + "eng": [ + "given" + ], + "nth": [ + "stands" + ], + "nwg": [ + "fails" + ], + "nwy": [ + "given" + ] + } + }, + { + "id": "6.E.14", + "title": "illegal head-to-head battle can still defend", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "russia", + "type": "fleet", + "at": "edi" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "lvp", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "lvp": [ + "fails" + ], + "edi": [ + "illegal" + ] + } + }, + { + "id": "6.E.15", + "title": "the friendly head-to-head battle", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "hol" + }, + { + "power": "england", + "type": "army", + "at": "ruh" + }, + { + "power": "france", + "type": "army", + "at": "kie" + }, + { + "power": "france", + "type": "army", + "at": "mun" + }, + { + "power": "france", + "type": "army", + "at": "sil" + }, + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "den" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "russia", + "type": "fleet", + "at": "bal" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "support", + "at": "hol", + "from": "ruh", + "to": "kie", + "power": "england" + }, + { + "type": "move", + "at": "ruh", + "to": "kie", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "mun", + "from": "kie", + "to": "ber", + "power": "france" + }, + { + "type": "support", + "at": "sil", + "from": "kie", + "to": "ber", + "power": "france" + }, + { + "type": "move", + "at": "ber", + "to": "kie", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "den", + "from": "ber", + "to": "kie", + "power": "germany" + }, + { + "type": "support", + "at": "hel", + "from": "ber", + "to": "kie", + "power": "germany" + }, + { + "type": "support", + "at": "bal", + "from": "pru", + "to": "ber", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "hol": [ + "given" + ], + "ruh": [ + "fails" + ], + "kie": [ + "fails" + ], + "mun": [ + "given" + ], + "sil": [ + "given" + ], + "ber": [ + "fails" + ], + "den": [ + "given" + ], + "hel": [ + "given" + ], + "bal": [ + "given" + ], + "pru": [ + "fails" + ] + } + }, + { + "id": "6.F.1", + "title": "no convoy in coastal provinces", + "units": [ + { + "power": "turkey", + "type": "army", + "at": "gre" + }, + { + "power": "turkey", + "type": "fleet", + "at": "aeg" + }, + { + "power": "turkey", + "type": "fleet", + "at": "con" + }, + { + "power": "turkey", + "type": "fleet", + "at": "bla" + } + ], + "orders": [ + { + "type": "move", + "at": "gre", + "to": "sev", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "convoy", + "at": "aeg", + "from": "gre", + "to": "sev", + "power": "turkey" + }, + { + "type": "convoy", + "at": "con", + "from": "gre", + "to": "sev", + "power": "turkey" + }, + { + "type": "convoy", + "at": "bla", + "from": "gre", + "to": "sev", + "power": "turkey" + } + ], + "expect": { + "gre": [ + "illegal" + ], + "aeg": [ + "illegal" + ], + "con": [ + "illegal" + ], + "bla": [ + "illegal" + ] + } + }, + { + "id": "6.F.2", + "title": "an army being convoyed can bounce as normal", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "france", + "type": "army", + "at": "par" + } + ], + "orders": [ + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bre", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bre", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "par", + "to": "bre", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "eng": [ + "available" + ], + "lon": [ + "fails" + ], + "par": [ + "fails" + ] + } + }, + { + "id": "6.F.3", + "title": "an army being convoyed can receive support", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "mao" + }, + { + "power": "france", + "type": "army", + "at": "par" + } + ], + "orders": [ + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bre", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bre", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "mao", + "from": "lon", + "to": "bre", + "power": "england" + }, + { + "type": "move", + "at": "par", + "to": "bre", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "eng": [ + "available" + ], + "lon": [ + "succeeds" + ], + "mao": [ + "given" + ], + "par": [ + "fails" + ] + } + }, + { + "id": "6.F.4", + "title": "an attacked convoy is not disrupted", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "hol", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "hol", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "nth": [ + "available" + ], + "lon": [ + "succeeds" + ], + "ska": [ + "fails" + ] + } + }, + { + "id": "6.F.5", + "title": "a beleaguered convoy is not disrupted", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "germany", + "type": "fleet", + "at": "den" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "hol", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "hol", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "eng", + "to": "nth", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "eng", + "to": "nth", + "power": "france" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "den", + "from": "ska", + "to": "nth", + "power": "germany" + } + ], + "expect": { + "nth": [ + "available" + ], + "lon": [ + "succeeds" + ], + "eng": [ + "fails" + ], + "bel": [ + "given" + ], + "ska": [ + "fails" + ], + "den": [ + "given" + ] + } + }, + { + "id": "6.F.6", + "title": "dislodged convoy does not cut support", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "germany", + "type": "army", + "at": "hol" + }, + { + "power": "germany", + "type": "army", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "france", + "type": "army", + "at": "pic" + }, + { + "power": "france", + "type": "army", + "at": "bur" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "hol", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "hol", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "bel", + "to": "bel", + "power": "germany" + }, + { + "type": "support", + "at": "bel", + "from": "hol", + "to": "hol", + "power": "germany" + }, + { + "type": "support", + "at": "hel", + "from": "ska", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "pic", + "to": "bel", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bur", + "from": "pic", + "to": "bel", + "power": "france" + } + ], + "expect": { + "nth": [ + "disrupted", + "dislodged" + ], + "lon": [ + "fails" + ], + "hol": [ + "given" + ], + "bel": [ + "cut" + ], + "hel": [ + "given" + ], + "ska": [ + "succeeds" + ], + "pic": [ + "fails" + ], + "bur": [ + "given" + ] + } + }, + { + "id": "6.F.7", + "title": "dislodged convoy does not cause contested province", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "hol", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "hol", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "hel", + "from": "ska", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "nth", + "to": "hol", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "nth": [ + "succeeds" + ], + "lon": [ + "fails" + ], + "hel": [ + "given" + ], + "ska": [ + "succeeds" + ] + } + }, + { + "id": "6.F.8", + "title": "dislodged convoy does not cause a bounce", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "germany", + "type": "army", + "at": "bel" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "hol", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "hol", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "hel", + "from": "ska", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "bel", + "to": "hol", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "nth": [ + "disrupted", + "dislodged" + ], + "lon": [ + "fails" + ], + "hel": [ + "given" + ], + "ska": [ + "succeeds" + ], + "bel": [ + "succeeds" + ] + } + }, + { + "id": "6.F.9", + "title": "dislodge of multi-route convoy", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + } + ], + "orders": [ + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "bre", + "from": "mao", + "to": "eng", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "eng", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "eng": [ + "disrupted", + "dislodged" + ], + "nth": [ + "available" + ], + "lon": [ + "succeeds" + ], + "bre": [ + "given" + ], + "mao": [ + "succeeds" + ] + } + }, + { + "id": "6.F.10", + "title": "dislodge of multi-route convoy with foreign fleet", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "germany", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "germany" + }, + { + "type": "support", + "at": "bre", + "from": "mao", + "to": "eng", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "eng", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "nth": [ + "available" + ], + "lon": [ + "succeeds" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "bre": [ + "given" + ], + "mao": [ + "succeeds" + ] + } + }, + { + "id": "6.F.11", + "title": "dislodge of multi-route convoy with only foreign fleets", + "units": [ + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "germany", + "type": "fleet", + "at": "eng" + }, + { + "power": "russia", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + } + ], + "orders": [ + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "germany" + }, + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "russia" + }, + { + "type": "support", + "at": "bre", + "from": "mao", + "to": "eng", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "eng", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "lon": [ + "succeeds" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "nth": [ + "available" + ], + "bre": [ + "given" + ], + "mao": [ + "succeeds" + ] + } + }, + { + "id": "6.F.12", + "title": "dislodged convoying fleet not on route", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "iri" + }, + { + "power": "france", + "type": "fleet", + "at": "nao" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + } + ], + "orders": [ + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "iri", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "support", + "at": "nao", + "from": "mao", + "to": "iri", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "iri", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "eng": [ + "available" + ], + "lon": [ + "succeeds" + ], + "iri": [ + "illegal", + "dislodged" + ], + "nao": [ + "given" + ], + "mao": [ + "succeeds" + ] + } + }, + { + "id": "6.F.13", + "title": "the unwanted alternative", + "units": [ + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "fleet", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "den" + } + ], + "orders": [ + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "france" + }, + { + "type": "support", + "at": "hol", + "from": "den", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "den", + "to": "nth", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "lon": [ + "succeeds" + ], + "nth": [ + "disrupted", + "dislodged" + ], + "eng": [ + "available" + ], + "hol": [ + "given" + ], + "den": [ + "succeeds" + ] + } + }, + { + "id": "6.F.14", + "title": "simple convoy paradox", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + } + ], + "orders": [ + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + } + ], + "expect": { + "lon": [ + "given" + ], + "wal": [ + "succeeds" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted", + "dislodged" + ] + } + }, + { + "id": "6.F.15", + "title": "simple convoy paradox with additional convoy", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "italy", + "type": "fleet", + "at": "iri" + }, + { + "power": "italy", + "type": "fleet", + "at": "mao" + }, + { + "power": "italy", + "type": "army", + "at": "naf" + } + ], + "orders": [ + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "convoy", + "at": "iri", + "from": "naf", + "to": "wal", + "power": "italy" + }, + { + "type": "convoy", + "at": "mao", + "from": "naf", + "to": "wal", + "power": "italy" + }, + { + "type": "move", + "at": "naf", + "to": "wal", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "lon": [ + "given" + ], + "wal": [ + "succeeds" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "iri": [ + "available" + ], + "mao": [ + "available" + ], + "naf": [ + "succeeds" + ] + } + }, + { + "id": "6.F.16", + "title": "pandin's paradox", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "fleet", + "at": "nth" + }, + { + "power": "germany", + "type": "fleet", + "at": "bel" + } + ], + "orders": [ + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "nth", + "from": "bel", + "to": "eng", + "power": "germany" + }, + { + "type": "move", + "at": "bel", + "to": "eng", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "lon": [ + "given" + ], + "wal": [ + "fails" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted" + ], + "nth": [ + "given" + ], + "bel": [ + "fails" + ] + } + }, + { + "id": "6.F.17", + "title": "pandin's extended paradox", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "fleet", + "at": "yor" + }, + { + "power": "germany", + "type": "fleet", + "at": "nth" + }, + { + "power": "germany", + "type": "fleet", + "at": "bel" + } + ], + "orders": [ + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "yor", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "nth", + "from": "bel", + "to": "eng", + "power": "germany" + }, + { + "type": "move", + "at": "bel", + "to": "eng", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "lon": [ + "given" + ], + "wal": [ + "fails" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted" + ], + "yor": [ + "given" + ], + "nth": [ + "given" + ], + "bel": [ + "fails" + ] + } + }, + { + "id": "6.F.18", + "title": "betrayal paradox", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "support", + "at": "bel", + "from": "nth", + "to": "nth", + "power": "france" + }, + { + "type": "support", + "at": "hel", + "from": "ska", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "nth": [ + "disrupted" + ], + "lon": [ + "fails" + ], + "eng": [ + "given" + ], + "bel": [ + "given" + ], + "hel": [ + "given" + ], + "ska": [ + "fails" + ] + } + }, + { + "id": "6.F.19", + "title": "multi-route convoy paradox", + "units": [ + { + "power": "france", + "type": "army", + "at": "tun" + }, + { + "power": "france", + "type": "fleet", + "at": "tys" + }, + { + "power": "france", + "type": "fleet", + "at": "ion" + }, + { + "power": "italy", + "type": "fleet", + "at": "nap" + }, + { + "power": "italy", + "type": "fleet", + "at": "rom" + } + ], + "orders": [ + { + "type": "move", + "at": "tun", + "to": "nap", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "tys", + "from": "tun", + "to": "nap", + "power": "france" + }, + { + "type": "convoy", + "at": "ion", + "from": "tun", + "to": "nap", + "power": "france" + }, + { + "type": "support", + "at": "nap", + "from": "rom", + "to": "tys", + "power": "italy" + }, + { + "type": "move", + "at": "rom", + "to": "tys", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "tun": [ + "fails" + ], + "tys": [ + "available" + ], + "ion": [ + "available" + ], + "nap": [ + "cut" + ], + "rom": [ + "fails" + ] + } + }, + { + "id": "6.F.20", + "title": "unwanted multi-route convoy paradox", + "units": [ + { + "power": "france", + "type": "army", + "at": "tun" + }, + { + "power": "france", + "type": "fleet", + "at": "tys" + }, + { + "power": "italy", + "type": "fleet", + "at": "nap" + }, + { + "power": "italy", + "type": "fleet", + "at": "ion" + }, + { + "power": "turkey", + "type": "fleet", + "at": "aeg" + }, + { + "power": "turkey", + "type": "fleet", + "at": "eas" + } + ], + "orders": [ + { + "type": "move", + "at": "tun", + "to": "nap", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "tys", + "from": "tun", + "to": "nap", + "power": "france" + }, + { + "type": "support", + "at": "nap", + "from": "ion", + "to": "ion", + "power": "italy" + }, + { + "type": "convoy", + "at": "ion", + "from": "tun", + "to": "nap", + "power": "italy" + }, + { + "type": "support", + "at": "aeg", + "from": "eas", + "to": "ion", + "power": "turkey" + }, + { + "type": "move", + "at": "eas", + "to": "ion", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "tun": [ + "fails" + ], + "tys": [ + "available" + ], + "nap": [ + "cut" + ], + "ion": [ + "disrupted", + "dislodged" + ], + "aeg": [ + "given" + ], + "eas": [ + "succeeds" + ] + } + }, + { + "id": "6.F.21", + "title": "dad's army convoy", + "units": [ + { + "power": "russia", + "type": "army", + "at": "edi" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + }, + { + "power": "russia", + "type": "army", + "at": "nwy" + }, + { + "power": "france", + "type": "fleet", + "at": "iri" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "england", + "type": "fleet", + "at": "nao" + }, + { + "power": "england", + "type": "fleet", + "at": "cly" + } + ], + "orders": [ + { + "type": "support", + "at": "edi", + "from": "nwy", + "to": "cly", + "power": "russia" + }, + { + "type": "convoy", + "at": "nwg", + "from": "nwy", + "to": "cly", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "cly", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "iri", + "from": "mao", + "to": "nao", + "power": "france" + }, + { + "type": "move", + "at": "mao", + "to": "nao", + "viaConvoy": false, + "power": "france" + }, + { + "type": "move", + "at": "lvp", + "to": "cly", + "viaConvoy": true, + "power": "england" + }, + { + "type": "convoy", + "at": "nao", + "from": "lvp", + "to": "cly", + "power": "england" + }, + { + "type": "support", + "at": "cly", + "from": "nao", + "to": "nao", + "power": "england" + } + ], + "expect": { + "edi": [ + "given" + ], + "nwg": [ + "available" + ], + "nwy": [ + "succeeds" + ], + "iri": [ + "given" + ], + "mao": [ + "succeeds" + ], + "lvp": [ + "fails" + ], + "nao": [ + "disrupted", + "destroyed" + ], + "cly": [ + "cut", + "destroyed" + ] + } + }, + { + "id": "6.F.22", + "title": "second order paradox with two resolutions", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "fleet", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "pic" + }, + { + "power": "russia", + "type": "army", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "move", + "at": "edi", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lon", + "from": "edi", + "to": "nth", + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "pic", + "to": "eng", + "power": "germany" + }, + { + "type": "move", + "at": "pic", + "to": "eng", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "nwy", + "to": "bel", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "nth", + "from": "nwy", + "to": "bel", + "power": "russia" + } + ], + "expect": { + "edi": [ + "succeeds" + ], + "lon": [ + "given" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "bel": [ + "given" + ], + "pic": [ + "succeeds" + ], + "nwy": [ + "fails" + ], + "nth": [ + "disrupted", + "dislodged" + ] + } + }, + { + "id": "6.F.23", + "title": "second order paradox with two exclusive convoys", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "fleet", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "lon" + }, + { + "power": "italy", + "type": "fleet", + "at": "mao" + }, + { + "power": "italy", + "type": "fleet", + "at": "iri" + }, + { + "power": "russia", + "type": "army", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "move", + "at": "edi", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "edi", + "to": "nth", + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "eng", + "to": "eng", + "power": "germany" + }, + { + "type": "support", + "at": "lon", + "from": "nth", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "mao", + "to": "eng", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "iri", + "from": "mao", + "to": "eng", + "power": "italy" + }, + { + "type": "move", + "at": "nwy", + "to": "bel", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "nth", + "from": "nwy", + "to": "bel", + "power": "russia" + } + ], + "expect": { + "edi": [ + "fails" + ], + "yor": [ + "given" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted" + ], + "bel": [ + "given" + ], + "lon": [ + "given" + ], + "mao": [ + "fails" + ], + "iri": [ + "given" + ], + "nwy": [ + "fails" + ], + "nth": [ + "disrupted" + ] + } + }, + { + "id": "6.F.24", + "title": "second order paradox with no resolution", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "iri" + }, + { + "power": "england", + "type": "fleet", + "at": "mao" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "russia", + "type": "army", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "move", + "at": "edi", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lon", + "from": "edi", + "to": "nth", + "power": "england" + }, + { + "type": "move", + "at": "iri", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "mao", + "from": "iri", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "bel", + "from": "eng", + "to": "eng", + "power": "france" + }, + { + "type": "move", + "at": "nwy", + "to": "bel", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "nth", + "from": "nwy", + "to": "bel", + "power": "russia" + } + ], + "expect": { + "edi": [ + "succeeds" + ], + "lon": [ + "given" + ], + "iri": [ + "fails" + ], + "mao": [ + "given" + ], + "bre": [ + "fails" + ], + "eng": [ + "disrupted" + ], + "bel": [ + "given" + ], + "nwy": [ + "fails" + ], + "nth": [ + "disrupted", + "dislodged" + ] + } + }, + { + "id": "6.F.25", + "title": "cut support last", + "units": [ + { + "power": "germany", + "type": "army", + "at": "ruh" + }, + { + "power": "germany", + "type": "army", + "at": "hol" + }, + { + "power": "germany", + "type": "army", + "at": "den" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "germany", + "type": "army", + "at": "fin" + }, + { + "power": "england", + "type": "army", + "at": "yor" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "fleet", + "at": "hel" + }, + { + "power": "england", + "type": "army", + "at": "bel" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "swe" + } + ], + "orders": [ + { + "type": "move", + "at": "ruh", + "to": "bel", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "hol", + "from": "ruh", + "to": "bel", + "power": "germany" + }, + { + "type": "move", + "at": "den", + "to": "nwy", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "ska", + "from": "den", + "to": "nwy", + "power": "germany" + }, + { + "type": "support", + "at": "fin", + "from": "den", + "to": "nwy", + "power": "germany" + }, + { + "type": "move", + "at": "yor", + "to": "hol", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "yor", + "to": "hol", + "power": "england" + }, + { + "type": "support", + "at": "hel", + "from": "yor", + "to": "hol", + "power": "england" + }, + { + "type": "hold", + "at": "bel", + "power": "england" + }, + { + "type": "move", + "at": "nwg", + "to": "nth", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "nwy", + "from": "nwg", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "swe", + "to": "ska", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "ruh": [ + "fails" + ], + "hol": [ + "cut", + "dislodged" + ], + "den": [ + "succeeds" + ], + "ska": [ + "available" + ], + "fin": [ + "given" + ], + "yor": [ + "succeeds" + ], + "nth": [ + "available" + ], + "hel": [ + "given" + ], + "bel": [ + "stands" + ], + "nwg": [ + "fails" + ], + "nwy": [ + "cut", + "dislodged" + ], + "swe": [ + "fails" + ] + } + }, + { + "id": "6.F.26", + "title": "convoy paradox with additional related convoys", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "italy", + "type": "army", + "at": "gas" + }, + { + "power": "italy", + "type": "army", + "at": "spa" + }, + { + "power": "italy", + "type": "fleet", + "at": "mao" + }, + { + "power": "russia", + "type": "army", + "at": "cly" + }, + { + "power": "russia", + "type": "fleet", + "at": "nao" + }, + { + "power": "russia", + "type": "fleet", + "at": "iri" + } + ], + "orders": [ + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "bre", + "to": "lon", + "power": "france" + }, + { + "type": "support", + "at": "gas", + "from": "spa", + "to": "bre", + "power": "italy" + }, + { + "type": "move", + "at": "spa", + "to": "bre", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "convoy", + "at": "mao", + "from": "spa", + "to": "bre", + "power": "italy" + }, + { + "type": "move", + "at": "cly", + "to": "wal", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "nao", + "from": "cly", + "to": "wal", + "power": "russia" + }, + { + "type": "convoy", + "at": "iri", + "from": "cly", + "to": "wal", + "power": "russia" + } + ], + "expect": { + "lon": [ + "given" + ], + "wal": [ + "succeeds" + ], + "bre": [ + "fails", + "dislodged" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "gas": [ + "given" + ], + "spa": [ + "succeeds" + ], + "mao": [ + "available" + ], + "cly": [ + "succeeds" + ], + "nao": [ + "available" + ], + "iri": [ + "available" + ] + } + }, + { + "id": "6.F.27", + "title": "two independent paradoxes", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "hel" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "italy", + "type": "army", + "at": "tun" + }, + { + "power": "italy", + "type": "fleet", + "at": "ion" + }, + { + "power": "turkey", + "type": "fleet", + "at": "aeg" + }, + { + "power": "turkey", + "type": "fleet", + "at": "gre" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "support", + "at": "bel", + "from": "nth", + "to": "nth", + "power": "france" + }, + { + "type": "support", + "at": "hel", + "from": "ska", + "to": "nth", + "power": "germany" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "tun", + "to": "gre", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "convoy", + "at": "ion", + "from": "tun", + "to": "gre", + "power": "italy" + }, + { + "type": "move", + "at": "aeg", + "to": "ion", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "support", + "at": "gre", + "from": "aeg", + "to": "ion", + "power": "turkey" + } + ], + "expect": { + "nth": [ + "disrupted" + ], + "lon": [ + "fails" + ], + "eng": [ + "given" + ], + "bel": [ + "given" + ], + "hel": [ + "given" + ], + "ska": [ + "fails" + ], + "tun": [ + "fails" + ], + "ion": [ + "disrupted", + "dislodged" + ], + "aeg": [ + "succeeds" + ], + "gre": [ + "given" + ] + } + }, + { + "id": "6.F.28", + "title": "sixth order paradox", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "fin" + }, + { + "power": "russia", + "type": "fleet", + "at": "stp/sc" + }, + { + "power": "russia", + "type": "fleet", + "at": "pru" + }, + { + "power": "russia", + "type": "fleet", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "den" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "cly" + }, + { + "power": "germany", + "type": "army", + "at": "lvn" + }, + { + "power": "germany", + "type": "fleet", + "at": "bot" + }, + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "bal" + }, + { + "power": "germany", + "type": "army", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "nth" + }, + { + "power": "germany", + "type": "army", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "army", + "at": "naf" + }, + { + "power": "england", + "type": "fleet", + "at": "mao" + }, + { + "power": "england", + "type": "fleet", + "at": "nao" + }, + { + "power": "england", + "type": "army", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "nwg" + }, + { + "power": "england", + "type": "fleet", + "at": "bar" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/nc" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + } + ], + "orders": [ + { + "type": "move", + "at": "fin", + "to": "bot", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "stp/sc", + "from": "fin", + "to": "bot", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "bal", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "swe", + "from": "pru", + "to": "bal", + "power": "russia" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "den", + "from": "ska", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nwg", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "cly", + "from": "nwy", + "to": "nwg", + "power": "russia" + }, + { + "type": "move", + "at": "lvn", + "to": "swe", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "bot", + "from": "lvn", + "to": "swe", + "power": "germany" + }, + { + "type": "move", + "at": "ber", + "to": "den", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "bal", + "from": "ber", + "to": "den", + "power": "germany" + }, + { + "type": "move", + "at": "hol", + "to": "lon", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "nth", + "from": "hol", + "to": "lon", + "power": "germany" + }, + { + "type": "move", + "at": "bel", + "to": "bre", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "eng", + "from": "bel", + "to": "bre", + "power": "germany" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "naf", + "to": "cly", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "mao", + "from": "naf", + "to": "cly", + "power": "england" + }, + { + "type": "convoy", + "at": "nao", + "from": "naf", + "to": "cly", + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "stp", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "nwg", + "from": "edi", + "to": "stp", + "power": "england" + }, + { + "type": "convoy", + "at": "bar", + "from": "edi", + "to": "stp", + "power": "england" + }, + { + "type": "move", + "at": "spa/nc", + "to": "mao", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bre", + "from": "spa/nc", + "to": "mao", + "power": "france" + } + ], + "expect": { + "fin": [ + "succeeds" + ], + "stp": [ + "given" + ], + "pru": [ + "succeeds" + ], + "swe": [ + "given" + ], + "ska": [ + "succeeds" + ], + "den": [ + "given" + ], + "nwy": [ + "succeeds" + ], + "cly": [ + "given" + ], + "lvn": [ + "fails" + ], + "bot": [ + "disrupted", + "dislodged" + ], + "ber": [ + "fails" + ], + "bal": [ + "disrupted", + "dislodged" + ], + "hol": [ + "fails" + ], + "nth": [ + "disrupted", + "dislodged" + ], + "bel": [ + "fails" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "wal": [ + "succeeds" + ], + "lon": [ + "given" + ], + "naf": [ + "fails" + ], + "mao": [ + "disrupted", + "dislodged" + ], + "nao": [ + "available" + ], + "edi": [ + "fails" + ], + "nwg": [ + "disrupted", + "dislodged" + ], + "bar": [ + "available" + ], + "spa": [ + "succeeds" + ], + "bre": [ + "given" + ] + } + }, + { + "id": "6.F.29", + "title": "sixth order butterfly effect", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "fin" + }, + { + "power": "russia", + "type": "fleet", + "at": "stp/sc" + }, + { + "power": "russia", + "type": "fleet", + "at": "pru" + }, + { + "power": "russia", + "type": "fleet", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "den" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "cly" + }, + { + "power": "germany", + "type": "army", + "at": "lvn" + }, + { + "power": "germany", + "type": "fleet", + "at": "bot" + }, + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "bal" + }, + { + "power": "germany", + "type": "army", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "nth" + }, + { + "power": "germany", + "type": "army", + "at": "bel" + }, + { + "power": "germany", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "fleet", + "at": "wal" + }, + { + "power": "england", + "type": "fleet", + "at": "lon" + }, + { + "power": "england", + "type": "army", + "at": "naf" + }, + { + "power": "england", + "type": "fleet", + "at": "mao" + }, + { + "power": "england", + "type": "fleet", + "at": "nao" + }, + { + "power": "england", + "type": "army", + "at": "edi" + }, + { + "power": "england", + "type": "fleet", + "at": "nwg" + }, + { + "power": "england", + "type": "fleet", + "at": "bar" + }, + { + "power": "england", + "type": "fleet", + "at": "por" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/nc" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + } + ], + "orders": [ + { + "type": "move", + "at": "fin", + "to": "bot", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "stp/sc", + "from": "fin", + "to": "bot", + "power": "russia" + }, + { + "type": "move", + "at": "pru", + "to": "bal", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "swe", + "from": "pru", + "to": "bal", + "power": "russia" + }, + { + "type": "move", + "at": "ska", + "to": "nth", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "den", + "from": "ska", + "to": "nth", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nwg", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "cly", + "from": "nwy", + "to": "nwg", + "power": "russia" + }, + { + "type": "move", + "at": "lvn", + "to": "swe", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "bot", + "from": "lvn", + "to": "swe", + "power": "germany" + }, + { + "type": "move", + "at": "ber", + "to": "den", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "bal", + "from": "ber", + "to": "den", + "power": "germany" + }, + { + "type": "move", + "at": "hol", + "to": "lon", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "nth", + "from": "hol", + "to": "lon", + "power": "germany" + }, + { + "type": "move", + "at": "bel", + "to": "bre", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "convoy", + "at": "eng", + "from": "bel", + "to": "bre", + "power": "germany" + }, + { + "type": "move", + "at": "wal", + "to": "eng", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "lon", + "from": "wal", + "to": "eng", + "power": "england" + }, + { + "type": "move", + "at": "naf", + "to": "cly", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "mao", + "from": "naf", + "to": "cly", + "power": "england" + }, + { + "type": "convoy", + "at": "nao", + "from": "naf", + "to": "cly", + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "stp", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "nwg", + "from": "edi", + "to": "stp", + "power": "england" + }, + { + "type": "convoy", + "at": "bar", + "from": "edi", + "to": "stp", + "power": "england" + }, + { + "type": "support", + "at": "por", + "from": "mao", + "to": "mao", + "power": "england" + }, + { + "type": "move", + "at": "spa/nc", + "to": "mao", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bre", + "from": "spa/nc", + "to": "mao", + "power": "france" + } + ], + "expect": { + "fin": [ + "fails" + ], + "stp": [ + "cut" + ], + "pru": [ + "fails" + ], + "swe": [ + "cut" + ], + "ska": [ + "fails" + ], + "den": [ + "cut" + ], + "nwy": [ + "fails" + ], + "cly": [ + "cut" + ], + "lvn": [ + "fails" + ], + "bot": [ + "available" + ], + "ber": [ + "fails" + ], + "bal": [ + "available" + ], + "hol": [ + "fails" + ], + "nth": [ + "available" + ], + "bel": [ + "fails" + ], + "eng": [ + "available" + ], + "wal": [ + "fails" + ], + "lon": [ + "cut" + ], + "naf": [ + "fails" + ], + "mao": [ + "available" + ], + "nao": [ + "available" + ], + "edi": [ + "fails" + ], + "nwg": [ + "available" + ], + "bar": [ + "available" + ], + "por": [ + "given" + ], + "spa": [ + "fails" + ], + "bre": [ + "cut" + ] + } + }, + { + "id": "6.F.30", + "title": "the attack comes from the starting position", + "units": [ + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "bel" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + } + ], + "orders": [ + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "support", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "bel", + "to": "eng", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bre", + "from": "bel", + "to": "eng", + "power": "france" + } + ], + "expect": { + "lon": [ + "fails" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "nth": [ + "given" + ], + "bel": [ + "succeeds" + ], + "bre": [ + "given" + ] + } + }, + { + "id": "6.G.1", + "title": "two units can swap provinces by convoy", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "england", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "ska", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "nwy": [ + "succeeds" + ], + "ska": [ + "available" + ], + "swe": [ + "succeeds" + ] + } + }, + { + "id": "6.G.2", + "title": "kidnapping an army", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "swe" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "ska", + "from": "nwy", + "to": "swe", + "power": "germany" + } + ], + "expect": { + "nwy": [ + "fails" + ], + "swe": [ + "fails" + ], + "ska": [ + "available" + ] + } + }, + { + "id": "6.G.3", + "title": "an unwanted disrupted convoy to adjacent province", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "army", + "at": "pic" + }, + { + "power": "france", + "type": "army", + "at": "bur" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + } + ], + "orders": [ + { + "type": "move", + "at": "bre", + "to": "eng", + "viaConvoy": false, + "power": "france" + }, + { + "type": "move", + "at": "pic", + "to": "bel", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bur", + "from": "pic", + "to": "bel", + "power": "france" + }, + { + "type": "support", + "at": "mao", + "from": "bre", + "to": "eng", + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "pic", + "to": "bel", + "power": "england" + } + ], + "expect": { + "bre": [ + "succeeds" + ], + "pic": [ + "succeeds" + ], + "bur": [ + "given" + ], + "mao": [ + "given" + ], + "eng": [ + "disrupted", + "dislodged" + ] + } + }, + { + "id": "6.G.4", + "title": "an unwanted disrupted convoy to adjacent province and opposite move", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "army", + "at": "pic" + }, + { + "power": "france", + "type": "army", + "at": "bur" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "army", + "at": "bel" + } + ], + "orders": [ + { + "type": "move", + "at": "bre", + "to": "eng", + "viaConvoy": false, + "power": "france" + }, + { + "type": "move", + "at": "pic", + "to": "bel", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bur", + "from": "pic", + "to": "bel", + "power": "france" + }, + { + "type": "support", + "at": "mao", + "from": "bre", + "to": "eng", + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "pic", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "bel", + "to": "pic", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "bre": [ + "succeeds" + ], + "pic": [ + "succeeds" + ], + "bur": [ + "given" + ], + "mao": [ + "given" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "bel": [ + "fails", + "dislodged" + ] + } + }, + { + "id": "6.G.5", + "title": "swapping with multiple fleets with one own fleet", + "units": [ + { + "power": "italy", + "type": "army", + "at": "rom" + }, + { + "power": "italy", + "type": "fleet", + "at": "tys" + }, + { + "power": "turkey", + "type": "army", + "at": "apu" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ion" + } + ], + "orders": [ + { + "type": "move", + "at": "rom", + "to": "apu", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "convoy", + "at": "tys", + "from": "apu", + "to": "rom", + "power": "italy" + }, + { + "type": "move", + "at": "apu", + "to": "rom", + "viaConvoy": false, + "power": "turkey" + }, + { + "type": "convoy", + "at": "ion", + "from": "apu", + "to": "rom", + "power": "turkey" + } + ], + "expect": { + "rom": [ + "succeeds" + ], + "tys": [ + "available" + ], + "apu": [ + "succeeds" + ], + "ion": [ + "available" + ] + } + }, + { + "id": "6.G.6", + "title": "swapping with unintended intent", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "army", + "at": "edi" + }, + { + "power": "france", + "type": "fleet", + "at": "iri" + }, + { + "power": "france", + "type": "fleet", + "at": "nth" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + }, + { + "power": "russia", + "type": "fleet", + "at": "nao" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "lvp", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "hold", + "at": "iri", + "power": "france" + }, + { + "type": "hold", + "at": "nth", + "power": "france" + }, + { + "type": "convoy", + "at": "nwg", + "from": "lvp", + "to": "edi", + "power": "russia" + }, + { + "type": "convoy", + "at": "nao", + "from": "lvp", + "to": "edi", + "power": "russia" + } + ], + "expect": { + "lvp": [ + "succeeds" + ], + "eng": [ + "available" + ], + "edi": [ + "succeeds" + ], + "iri": [ + "stands" + ], + "nth": [ + "stands" + ], + "nwg": [ + "available" + ], + "nao": [ + "available" + ] + } + }, + { + "id": "6.G.7", + "title": "swapping with illegal intent", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "ska" + }, + { + "power": "england", + "type": "fleet", + "at": "nwy" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "bot" + } + ], + "orders": [ + { + "type": "convoy", + "at": "ska", + "from": "swe", + "to": "nwy", + "power": "england" + }, + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "bot", + "from": "swe", + "to": "nwy", + "power": "russia" + } + ], + "expect": { + "ska": [ + "available" + ], + "nwy": [ + "fails" + ], + "swe": [ + "fails" + ], + "bot": [ + "illegal" + ] + } + }, + { + "id": "6.G.8", + "title": "explicit convoy that isn't there", + "units": [ + { + "power": "france", + "type": "army", + "at": "bel" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "hol" + } + ], + "orders": [ + { + "type": "move", + "at": "bel", + "to": "hol", + "viaConvoy": true, + "power": "france" + }, + { + "type": "move", + "at": "nth", + "to": "hel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "hol", + "to": "kie", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "bel": [ + "invalid" + ], + "nth": [ + "succeeds" + ], + "hol": [ + "succeeds" + ] + } + }, + { + "id": "6.G.9", + "title": "swapped or dislodged?", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "england", + "type": "fleet", + "at": "ska" + }, + { + "power": "england", + "type": "fleet", + "at": "fin" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "ska", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "support", + "at": "fin", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "nwy": [ + "succeeds" + ], + "ska": [ + "available" + ], + "fin": [ + "given" + ], + "swe": [ + "succeeds" + ] + } + }, + { + "id": "6.G.10", + "title": "swapped or an head-to-head battle?", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "england", + "type": "fleet", + "at": "den" + }, + { + "power": "england", + "type": "fleet", + "at": "fin" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "bar" + }, + { + "power": "france", + "type": "fleet", + "at": "nwg" + }, + { + "power": "france", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": true, + "power": "england" + }, + { + "type": "support", + "at": "den", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "support", + "at": "fin", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "convoy", + "at": "ska", + "from": "nwy", + "to": "swe", + "power": "germany" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "bar", + "from": "swe", + "to": "nwy", + "power": "russia" + }, + { + "type": "move", + "at": "nwg", + "to": "nwy", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "nth", + "from": "nwg", + "to": "nwy", + "power": "france" + } + ], + "expect": { + "nwy": [ + "succeeds" + ], + "den": [ + "given" + ], + "fin": [ + "given" + ], + "ska": [ + "available" + ], + "swe": [ + "fails", + "destroyed" + ], + "bar": [ + "given" + ], + "nwg": [ + "fails" + ], + "nth": [ + "given" + ] + } + }, + { + "id": "6.G.11", + "title": "a convoy to an adjacent province with a paradox", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nwy" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "bar" + } + ], + "orders": [ + { + "type": "support", + "at": "nwy", + "from": "nth", + "to": "ska", + "power": "england" + }, + { + "type": "move", + "at": "nth", + "to": "ska", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "convoy", + "at": "ska", + "from": "swe", + "to": "nwy", + "power": "russia" + }, + { + "type": "support", + "at": "bar", + "from": "swe", + "to": "nwy", + "power": "russia" + } + ], + "expect": { + "nwy": [ + "given" + ], + "nth": [ + "succeeds" + ], + "swe": [ + "fails" + ], + "ska": [ + "disrupted", + "dislodged" + ], + "bar": [ + "given" + ] + } + }, + { + "id": "6.G.12", + "title": "swapping two units with two convoys", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "england", + "type": "fleet", + "at": "nao" + }, + { + "power": "england", + "type": "fleet", + "at": "nwg" + }, + { + "power": "germany", + "type": "army", + "at": "edi" + }, + { + "power": "germany", + "type": "fleet", + "at": "nth" + }, + { + "power": "germany", + "type": "fleet", + "at": "eng" + }, + { + "power": "germany", + "type": "fleet", + "at": "iri" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": true, + "power": "england" + }, + { + "type": "convoy", + "at": "nao", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "convoy", + "at": "nwg", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "lvp", + "viaConvoy": true, + "power": "germany" + }, + { + "type": "convoy", + "at": "nth", + "from": "edi", + "to": "lvp", + "power": "germany" + }, + { + "type": "convoy", + "at": "eng", + "from": "edi", + "to": "lvp", + "power": "germany" + }, + { + "type": "convoy", + "at": "iri", + "from": "edi", + "to": "lvp", + "power": "germany" + } + ], + "expect": { + "lvp": [ + "succeeds" + ], + "nao": [ + "available" + ], + "nwg": [ + "available" + ], + "edi": [ + "succeeds" + ], + "nth": [ + "available" + ], + "eng": [ + "available" + ], + "iri": [ + "available" + ] + } + }, + { + "id": "6.G.13", + "title": "support cut on attack on itself via convoy", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "adr" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "fleet", + "at": "alb" + } + ], + "orders": [ + { + "type": "convoy", + "at": "adr", + "from": "tri", + "to": "ven", + "power": "austria" + }, + { + "type": "move", + "at": "tri", + "to": "ven", + "viaConvoy": true, + "power": "austria" + }, + { + "type": "support", + "at": "ven", + "from": "alb", + "to": "tri", + "power": "italy" + }, + { + "type": "move", + "at": "alb", + "to": "tri", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "adr": [ + "available" + ], + "tri": [ + "fails", + "dislodged" + ], + "ven": [ + "given" + ], + "alb": [ + "succeeds" + ] + } + }, + { + "id": "6.G.14", + "title": "bounce by convoy to adjacent province", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "england", + "type": "fleet", + "at": "den" + }, + { + "power": "england", + "type": "fleet", + "at": "fin" + }, + { + "power": "france", + "type": "fleet", + "at": "nwg" + }, + { + "power": "france", + "type": "fleet", + "at": "nth" + }, + { + "power": "germany", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "bar" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "den", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "support", + "at": "fin", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "move", + "at": "nwg", + "to": "nwy", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "nth", + "from": "nwg", + "to": "nwy", + "power": "france" + }, + { + "type": "convoy", + "at": "ska", + "from": "swe", + "to": "nwy", + "power": "germany" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": true, + "power": "russia" + }, + { + "type": "support", + "at": "bar", + "from": "swe", + "to": "nwy", + "power": "russia" + } + ], + "expect": { + "nwy": [ + "succeeds" + ], + "den": [ + "given" + ], + "fin": [ + "given" + ], + "nwg": [ + "fails" + ], + "nth": [ + "given" + ], + "ska": [ + "available" + ], + "swe": [ + "fails", + "destroyed" + ], + "bar": [ + "given" + ] + } + }, + { + "id": "6.G.15", + "title": "bounce and dislodge with double convoy", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "hol" + }, + { + "power": "england", + "type": "army", + "at": "yor" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "bel" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "yor", + "to": "lon", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "bel", + "to": "lon", + "power": "france" + }, + { + "type": "move", + "at": "bel", + "to": "lon", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "nth": [ + "available" + ], + "hol": [ + "given" + ], + "yor": [ + "fails" + ], + "lon": [ + "succeeds" + ], + "eng": [ + "available" + ], + "bel": [ + "fails", + "dislodged" + ] + } + }, + { + "id": "6.G.16", + "title": "the two unit in one province bug, moving by convoy", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "england", + "type": "army", + "at": "den" + }, + { + "power": "england", + "type": "fleet", + "at": "bal" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "ska" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "den", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "support", + "at": "bal", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "move", + "at": "nth", + "to": "nwy", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": true, + "power": "russia" + }, + { + "type": "convoy", + "at": "ska", + "from": "swe", + "to": "nwy", + "power": "russia" + }, + { + "type": "support", + "at": "nwg", + "from": "swe", + "to": "nwy", + "power": "russia" + } + ], + "expect": { + "nwy": [ + "succeeds" + ], + "den": [ + "given" + ], + "bal": [ + "given" + ], + "nth": [ + "fails" + ], + "swe": [ + "succeeds" + ], + "ska": [ + "available" + ], + "nwg": [ + "given" + ] + } + }, + { + "id": "6.G.17", + "title": "the two unit in one province bug, moving over land", + "units": [ + { + "power": "england", + "type": "army", + "at": "nwy" + }, + { + "power": "england", + "type": "army", + "at": "den" + }, + { + "power": "england", + "type": "fleet", + "at": "bal" + }, + { + "power": "england", + "type": "fleet", + "at": "ska" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + } + ], + "orders": [ + { + "type": "move", + "at": "nwy", + "to": "swe", + "viaConvoy": true, + "power": "england" + }, + { + "type": "support", + "at": "den", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "support", + "at": "bal", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "convoy", + "at": "ska", + "from": "nwy", + "to": "swe", + "power": "england" + }, + { + "type": "move", + "at": "nth", + "to": "nwy", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "swe", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "nwg", + "from": "swe", + "to": "nwy", + "power": "russia" + } + ], + "expect": { + "nwy": [ + "succeeds" + ], + "den": [ + "given" + ], + "bal": [ + "given" + ], + "ska": [ + "available" + ], + "nth": [ + "fails" + ], + "swe": [ + "succeeds" + ], + "nwg": [ + "given" + ] + } + }, + { + "id": "6.G.18", + "title": "the two unit in one province bug, with double convoy", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "hol" + }, + { + "power": "england", + "type": "army", + "at": "yor" + }, + { + "power": "england", + "type": "army", + "at": "lon" + }, + { + "power": "england", + "type": "army", + "at": "ruh" + }, + { + "power": "france", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "bel" + }, + { + "power": "france", + "type": "army", + "at": "wal" + } + ], + "orders": [ + { + "type": "convoy", + "at": "nth", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "support", + "at": "hol", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "yor", + "to": "lon", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "lon", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "ruh", + "from": "lon", + "to": "bel", + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "bel", + "to": "lon", + "power": "france" + }, + { + "type": "move", + "at": "bel", + "to": "lon", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "wal", + "from": "bel", + "to": "lon", + "power": "france" + } + ], + "expect": { + "nth": [ + "available" + ], + "hol": [ + "given" + ], + "yor": [ + "fails" + ], + "lon": [ + "succeeds" + ], + "ruh": [ + "given" + ], + "eng": [ + "available" + ], + "bel": [ + "succeeds" + ], + "wal": [ + "given" + ] + } + }, + { + "id": "6.G.19", + "title": "swapping with intent of unnecessary convoy", + "units": [ + { + "power": "france", + "type": "army", + "at": "mar" + }, + { + "power": "france", + "type": "fleet", + "at": "wes" + }, + { + "power": "italy", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "army", + "at": "spa" + } + ], + "orders": [ + { + "type": "move", + "at": "mar", + "to": "spa", + "viaConvoy": false, + "power": "france" + }, + { + "type": "convoy", + "at": "wes", + "from": "mar", + "to": "spa", + "power": "france" + }, + { + "type": "convoy", + "at": "lyo", + "from": "mar", + "to": "spa", + "power": "italy" + }, + { + "type": "move", + "at": "spa", + "to": "mar", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "mar": [ + "fails" + ], + "wes": [ + "illegal" + ], + "lyo": [ + "available" + ], + "spa": [ + "fails" + ] + } + }, + { + "id": "6.G.20", + "title": "explicit convoy to adjacent province disrupted", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "army", + "at": "pic" + }, + { + "power": "france", + "type": "army", + "at": "bur" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + } + ], + "orders": [ + { + "type": "move", + "at": "bre", + "to": "eng", + "viaConvoy": false, + "power": "france" + }, + { + "type": "move", + "at": "pic", + "to": "bel", + "viaConvoy": true, + "power": "france" + }, + { + "type": "support", + "at": "bur", + "from": "pic", + "to": "bel", + "power": "france" + }, + { + "type": "support", + "at": "mao", + "from": "bre", + "to": "eng", + "power": "france" + }, + { + "type": "convoy", + "at": "eng", + "from": "pic", + "to": "bel", + "power": "england" + } + ], + "expect": { + "bre": [ + "succeeds" + ], + "pic": [ + "fails" + ], + "bur": [ + "given" + ], + "mao": [ + "given" + ], + "eng": [ + "disrupted", + "dislodged" + ] + } + }, + { + "id": "6.H.1", + "title": "no supports during retreat", + "units": [ + { + "power": "austria", + "type": "fleet", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "turkey", + "type": "fleet", + "at": "gre" + }, + { + "power": "italy", + "type": "army", + "at": "ven" + }, + { + "power": "italy", + "type": "army", + "at": "tyr" + }, + { + "power": "italy", + "type": "fleet", + "at": "ion" + }, + { + "power": "italy", + "type": "fleet", + "at": "aeg" + }, + { + "power": "austria", + "type": "fleet", + "at": "tri" + }, + { + "power": "austria", + "type": "army", + "at": "ser" + }, + { + "power": "turkey", + "type": "fleet", + "at": "gre" + } + ], + "orders": [ + { + "type": "hold", + "at": "tri", + "power": "austria" + }, + { + "type": "hold", + "at": "ser", + "power": "austria" + }, + { + "type": "hold", + "at": "gre", + "power": "turkey" + }, + { + "type": "support", + "at": "ven", + "from": "tyr", + "to": "tri", + "power": "italy" + }, + { + "type": "move", + "at": "tyr", + "to": "tri", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "move", + "at": "ion", + "to": "gre", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "support", + "at": "aeg", + "from": "ion", + "to": "gre", + "power": "italy" + }, + { + "type": "move", + "at": "tri", + "to": "alb", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "support", + "at": "ser", + "from": "tri", + "to": "alb", + "power": "austria" + }, + { + "type": "move", + "at": "gre", + "to": "alb", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "tri": [ + "fails" + ], + "ser": [ + "illegal" + ], + "gre": [ + "fails" + ], + "ven": [ + "given" + ], + "tyr": [ + "succeeds" + ], + "ion": [ + "succeeds" + ], + "aeg": [ + "given" + ] + } + }, + { + "id": "6.H.2", + "title": "no supports from retreating unit", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "england", + "type": "fleet", + "at": "nwy" + }, + { + "power": "germany", + "type": "army", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "ruh" + }, + { + "power": "russia", + "type": "fleet", + "at": "edi" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "army", + "at": "fin" + }, + { + "power": "russia", + "type": "fleet", + "at": "hol" + }, + { + "power": "england", + "type": "fleet", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "edi" + }, + { + "power": "russia", + "type": "fleet", + "at": "hol" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "hold", + "at": "nwy", + "power": "england" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "germany" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "hold", + "at": "edi", + "power": "russia" + }, + { + "type": "support", + "at": "swe", + "from": "fin", + "to": "nwy", + "power": "russia" + }, + { + "type": "move", + "at": "fin", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "hold", + "at": "hol", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "nth", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "hol", + "from": "edi", + "to": "nth", + "power": "russia" + } + ], + "expect": { + "lvp": [ + "succeeds" + ], + "yor": [ + "given" + ], + "nwy": [ + "fails" + ], + "kie": [ + "given" + ], + "ruh": [ + "succeeds" + ], + "edi": [ + "fails" + ], + "swe": [ + "given" + ], + "fin": [ + "succeeds" + ], + "hol": [ + "illegal" + ] + } + }, + { + "id": "6.H.3", + "title": "no convoy during retreat", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "ruh" + }, + { + "power": "england", + "type": "army", + "at": "hol" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "hold", + "at": "nth", + "power": "england" + }, + { + "type": "hold", + "at": "hol", + "power": "england" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "germany" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "hol", + "to": "yor", + "viaConvoy": false, + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "hol", + "to": "yor", + "power": "england" + } + ], + "expect": { + "nth": [ + "illegal" + ], + "hol": [ + "illegal" + ], + "kie": [ + "given" + ], + "ruh": [ + "succeeds" + ] + } + }, + { + "id": "6.H.4", + "title": "no other moves during retreat", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "england", + "type": "army", + "at": "hol" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "ruh" + }, + { + "power": "england", + "type": "army", + "at": "hol" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + } + ], + "orders": [ + { + "type": "hold", + "at": "nth", + "power": "england" + }, + { + "type": "hold", + "at": "hol", + "power": "england" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "germany" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "hol", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "nth", + "to": "nwg", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "nth": [ + "illegal" + ], + "hol": [ + "succeeds" + ], + "kie": [ + "given" + ], + "ruh": [ + "succeeds" + ] + } + }, + { + "id": "6.H.5", + "title": "a unit may not retreat to the province from which it is attacked", + "units": [ + { + "power": "russia", + "type": "fleet", + "at": "con" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + }, + { + "power": "turkey", + "type": "fleet", + "at": "ank" + } + ], + "orders": [ + { + "type": "support", + "at": "con", + "from": "bla", + "to": "ank", + "power": "russia" + }, + { + "type": "move", + "at": "bla", + "to": "ank", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "hold", + "at": "ank", + "power": "turkey" + }, + { + "type": "move", + "at": "ank", + "to": "bla", + "viaConvoy": false, + "power": "turkey" + } + ], + "expect": { + "con": [ + "given" + ], + "bla": [ + "succeeds" + ], + "ank": [ + "illegal" + ] + } + }, + { + "id": "6.H.6", + "title": "unit may not retreat to a contested province", + "units": [ + { + "power": "austria", + "type": "army", + "at": "bud" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "germany", + "type": "army", + "at": "sil" + }, + { + "power": "italy", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "vie" + } + ], + "orders": [ + { + "type": "support", + "at": "bud", + "from": "tri", + "to": "vie", + "power": "austria" + }, + { + "type": "move", + "at": "tri", + "to": "vie", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "move", + "at": "mun", + "to": "boh", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "sil", + "to": "boh", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "hold", + "at": "vie", + "power": "italy" + }, + { + "type": "move", + "at": "vie", + "to": "boh", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "bud": [ + "given" + ], + "tri": [ + "succeeds" + ], + "mun": [ + "fails" + ], + "sil": [ + "fails" + ], + "vie": [ + "illegal" + ] + } + }, + { + "id": "6.H.7", + "title": "multiple retreat to same province will disband units", + "units": [ + { + "power": "austria", + "type": "army", + "at": "bud" + }, + { + "power": "austria", + "type": "army", + "at": "tri" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "germany", + "type": "army", + "at": "sil" + }, + { + "power": "italy", + "type": "army", + "at": "vie" + }, + { + "power": "italy", + "type": "army", + "at": "boh" + }, + { + "power": "italy", + "type": "army", + "at": "boh" + }, + { + "power": "italy", + "type": "army", + "at": "vie" + } + ], + "orders": [ + { + "type": "support", + "at": "bud", + "from": "tri", + "to": "vie", + "power": "austria" + }, + { + "type": "move", + "at": "tri", + "to": "vie", + "viaConvoy": false, + "power": "austria" + }, + { + "type": "support", + "at": "mun", + "from": "sil", + "to": "boh", + "power": "germany" + }, + { + "type": "move", + "at": "sil", + "to": "boh", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "hold", + "at": "vie", + "power": "italy" + }, + { + "type": "hold", + "at": "boh", + "power": "italy" + }, + { + "type": "move", + "at": "boh", + "to": "tyr", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "move", + "at": "vie", + "to": "tyr", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "bud": [ + "given" + ], + "tri": [ + "succeeds" + ], + "mun": [ + "given" + ], + "sil": [ + "succeeds" + ], + "vie": [ + "fails" + ], + "boh": [ + "fails" + ] + } + }, + { + "id": "6.H.8", + "title": "triple retreat to same province will disband units", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "england", + "type": "fleet", + "at": "yor" + }, + { + "power": "england", + "type": "fleet", + "at": "nwy" + }, + { + "power": "germany", + "type": "army", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "ruh" + }, + { + "power": "russia", + "type": "fleet", + "at": "edi" + }, + { + "power": "russia", + "type": "army", + "at": "swe" + }, + { + "power": "russia", + "type": "army", + "at": "fin" + }, + { + "power": "russia", + "type": "fleet", + "at": "hol" + }, + { + "power": "england", + "type": "fleet", + "at": "nwy" + }, + { + "power": "russia", + "type": "fleet", + "at": "edi" + }, + { + "power": "russia", + "type": "fleet", + "at": "hol" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "yor", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "hold", + "at": "nwy", + "power": "england" + }, + { + "type": "support", + "at": "kie", + "from": "ruh", + "to": "hol", + "power": "germany" + }, + { + "type": "move", + "at": "ruh", + "to": "hol", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "hold", + "at": "edi", + "power": "russia" + }, + { + "type": "support", + "at": "swe", + "from": "fin", + "to": "nwy", + "power": "russia" + }, + { + "type": "move", + "at": "fin", + "to": "nwy", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "hold", + "at": "hol", + "power": "russia" + }, + { + "type": "move", + "at": "nwy", + "to": "nth", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "edi", + "to": "nth", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "hol", + "to": "nth", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "lvp": [ + "succeeds" + ], + "yor": [ + "given" + ], + "nwy": [ + "fails" + ], + "kie": [ + "given" + ], + "ruh": [ + "succeeds" + ], + "edi": [ + "fails" + ], + "swe": [ + "given" + ], + "fin": [ + "succeeds" + ], + "hol": [ + "fails" + ] + } + }, + { + "id": "6.H.9", + "title": "dislodged unit will not make attacker's province contested", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "hel" + }, + { + "power": "england", + "type": "fleet", + "at": "den" + }, + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "sil" + }, + { + "power": "russia", + "type": "army", + "at": "pru" + }, + { + "power": "germany", + "type": "fleet", + "at": "kie" + } + ], + "orders": [ + { + "type": "move", + "at": "hel", + "to": "kie", + "viaConvoy": false, + "power": "england" + }, + { + "type": "support", + "at": "den", + "from": "hel", + "to": "kie", + "power": "england" + }, + { + "type": "move", + "at": "ber", + "to": "pru", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "hold", + "at": "kie", + "power": "germany" + }, + { + "type": "support", + "at": "sil", + "from": "ber", + "to": "pru", + "power": "germany" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "hel": [ + "succeeds" + ], + "den": [ + "given" + ], + "ber": [ + "succeeds" + ], + "kie": [ + "succeeds" + ], + "sil": [ + "given" + ], + "pru": [ + "fails", + "dislodged" + ] + } + }, + { + "id": "6.H.10", + "title": "retreating unit cannot bounce in attacker's province", + "units": [ + { + "power": "england", + "type": "army", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "ber" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "germany", + "type": "army", + "at": "pru" + }, + { + "power": "russia", + "type": "army", + "at": "war" + }, + { + "power": "russia", + "type": "army", + "at": "sil" + }, + { + "power": "england", + "type": "army", + "at": "kie" + }, + { + "power": "germany", + "type": "army", + "at": "pru" + } + ], + "orders": [ + { + "type": "hold", + "at": "kie", + "power": "england" + }, + { + "type": "move", + "at": "ber", + "to": "kie", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "support", + "at": "mun", + "from": "ber", + "to": "kie", + "power": "germany" + }, + { + "type": "hold", + "at": "pru", + "power": "germany" + }, + { + "type": "move", + "at": "war", + "to": "pru", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "sil", + "from": "war", + "to": "pru", + "power": "russia" + }, + { + "type": "move", + "at": "kie", + "to": "ber", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "pru", + "to": "ber", + "viaConvoy": false, + "power": "germany" + } + ], + "expect": { + "kie": [ + "illegal" + ], + "ber": [ + "succeeds" + ], + "mun": [ + "given" + ], + "pru": [ + "succeeds" + ], + "war": [ + "succeeds" + ], + "sil": [ + "given" + ] + } + }, + { + "id": "6.H.11", + "title": "retreat when dislodged by adjacent convoy", + "units": [ + { + "power": "france", + "type": "army", + "at": "gas" + }, + { + "power": "france", + "type": "army", + "at": "bur" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "france", + "type": "fleet", + "at": "wes" + }, + { + "power": "france", + "type": "fleet", + "at": "lyo" + }, + { + "power": "italy", + "type": "army", + "at": "mar" + }, + { + "power": "italy", + "type": "army", + "at": "mar" + } + ], + "orders": [ + { + "type": "move", + "at": "gas", + "to": "mar", + "viaConvoy": true, + "power": "france" + }, + { + "type": "support", + "at": "bur", + "from": "gas", + "to": "mar", + "power": "france" + }, + { + "type": "convoy", + "at": "mao", + "from": "gas", + "to": "mar", + "power": "france" + }, + { + "type": "convoy", + "at": "wes", + "from": "gas", + "to": "mar", + "power": "france" + }, + { + "type": "convoy", + "at": "lyo", + "from": "gas", + "to": "mar", + "power": "france" + }, + { + "type": "hold", + "at": "mar", + "power": "italy" + }, + { + "type": "move", + "at": "mar", + "to": "gas", + "viaConvoy": false, + "power": "italy" + } + ], + "expect": { + "gas": [ + "succeeds" + ], + "bur": [ + "given" + ], + "mao": [ + "available" + ], + "wes": [ + "available" + ], + "lyo": [ + "available" + ], + "mar": [ + "succeeds" + ] + } + }, + { + "id": "6.H.12", + "title": "retreat when dislodged by adjacent convoy while trying to do the same", + "units": [ + { + "power": "england", + "type": "army", + "at": "lvp" + }, + { + "power": "england", + "type": "fleet", + "at": "iri" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "england", + "type": "fleet", + "at": "nth" + }, + { + "power": "france", + "type": "fleet", + "at": "bre" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "russia", + "type": "army", + "at": "edi" + }, + { + "power": "russia", + "type": "fleet", + "at": "nwg" + }, + { + "power": "russia", + "type": "fleet", + "at": "nao" + }, + { + "power": "russia", + "type": "army", + "at": "cly" + }, + { + "power": "england", + "type": "army", + "at": "lvp" + } + ], + "orders": [ + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": true, + "power": "england" + }, + { + "type": "convoy", + "at": "iri", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "convoy", + "at": "nth", + "from": "lvp", + "to": "edi", + "power": "england" + }, + { + "type": "move", + "at": "bre", + "to": "eng", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "mao", + "from": "bre", + "to": "eng", + "power": "france" + }, + { + "type": "move", + "at": "edi", + "to": "lvp", + "viaConvoy": true, + "power": "russia" + }, + { + "type": "convoy", + "at": "nwg", + "from": "edi", + "to": "lvp", + "power": "russia" + }, + { + "type": "convoy", + "at": "nao", + "from": "edi", + "to": "lvp", + "power": "russia" + }, + { + "type": "support", + "at": "cly", + "from": "edi", + "to": "lvp", + "power": "russia" + }, + { + "type": "move", + "at": "lvp", + "to": "edi", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "lvp": [ + "succeeds" + ], + "iri": [ + "available" + ], + "eng": [ + "disrupted", + "dislodged" + ], + "nth": [ + "available" + ], + "bre": [ + "succeeds" + ], + "mao": [ + "given" + ], + "edi": [ + "succeeds" + ], + "nwg": [ + "available" + ], + "nao": [ + "available" + ], + "cly": [ + "given" + ] + } + }, + { + "id": "6.H.13", + "title": "no retreat with convoy in movement phase", + "units": [ + { + "power": "england", + "type": "army", + "at": "pic" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "par" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "england", + "type": "army", + "at": "pic" + } + ], + "orders": [ + { + "type": "hold", + "at": "pic", + "power": "england" + }, + { + "type": "convoy", + "at": "eng", + "from": "pic", + "to": "lon", + "power": "england" + }, + { + "type": "move", + "at": "par", + "to": "pic", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bre", + "from": "par", + "to": "pic", + "power": "france" + }, + { + "type": "move", + "at": "pic", + "to": "lon", + "viaConvoy": false, + "power": "england" + } + ], + "expect": { + "pic": [ + "illegal" + ], + "eng": [ + "invalid" + ], + "par": [ + "succeeds" + ], + "bre": [ + "given" + ] + } + }, + { + "id": "6.H.14", + "title": "no retreat with support in movement phase", + "units": [ + { + "power": "england", + "type": "army", + "at": "pic" + }, + { + "power": "england", + "type": "fleet", + "at": "eng" + }, + { + "power": "france", + "type": "army", + "at": "par" + }, + { + "power": "france", + "type": "army", + "at": "bre" + }, + { + "power": "france", + "type": "army", + "at": "bur" + }, + { + "power": "germany", + "type": "army", + "at": "mun" + }, + { + "power": "germany", + "type": "army", + "at": "mar" + }, + { + "power": "england", + "type": "army", + "at": "pic" + }, + { + "power": "france", + "type": "army", + "at": "bur" + } + ], + "orders": [ + { + "type": "hold", + "at": "pic", + "power": "england" + }, + { + "type": "support", + "at": "eng", + "from": "pic", + "to": "bel", + "power": "england" + }, + { + "type": "move", + "at": "par", + "to": "pic", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "bre", + "from": "par", + "to": "pic", + "power": "france" + }, + { + "type": "hold", + "at": "bur", + "power": "france" + }, + { + "type": "support", + "at": "mun", + "from": "mar", + "to": "bur", + "power": "germany" + }, + { + "type": "move", + "at": "mar", + "to": "bur", + "viaConvoy": false, + "power": "germany" + }, + { + "type": "move", + "at": "pic", + "to": "bel", + "viaConvoy": false, + "power": "england" + }, + { + "type": "move", + "at": "bur", + "to": "bel", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "pic": [ + "fails" + ], + "eng": [ + "invalid" + ], + "par": [ + "succeeds" + ], + "bre": [ + "given" + ], + "bur": [ + "fails" + ], + "mun": [ + "given" + ], + "mar": [ + "succeeds" + ] + } + }, + { + "id": "6.H.15", + "title": "no coastal crawl in retreat", + "units": [ + { + "power": "turkey", + "type": "fleet", + "at": "con" + }, + { + "power": "russia", + "type": "fleet", + "at": "bul/ec" + }, + { + "power": "russia", + "type": "fleet", + "at": "bla" + }, + { + "power": "russia", + "type": "fleet", + "at": "con" + } + ], + "orders": [ + { + "type": "hold", + "at": "con", + "power": "turkey" + }, + { + "type": "move", + "at": "bul/ec", + "to": "con", + "viaConvoy": false, + "power": "russia" + }, + { + "type": "support", + "at": "bla", + "from": "bul/ec", + "to": "con", + "power": "russia" + }, + { + "type": "move", + "at": "con", + "to": "bul/sc", + "viaConvoy": false, + "power": "russia" + } + ], + "expect": { + "con": [ + "illegal" + ], + "bul": [ + "succeeds" + ], + "bla": [ + "given" + ] + } + }, + { + "id": "6.H.16", + "title": "no coastal crawl escape from portugal", + "units": [ + { + "power": "england", + "type": "fleet", + "at": "por" + }, + { + "power": "france", + "type": "fleet", + "at": "spa/sc" + }, + { + "power": "france", + "type": "fleet", + "at": "mao" + } + ], + "orders": [ + { + "type": "hold", + "at": "por", + "power": "england" + }, + { + "type": "move", + "at": "spa/sc", + "to": "por", + "viaConvoy": false, + "power": "france" + }, + { + "type": "support", + "at": "mao", + "from": "spa/sc", + "to": "por", + "power": "france" + } + ], + "expect": { + "por": [ + "destroyed" + ], + "spa": [ + "succeeds" + ], + "mao": [ + "given" + ] + } + }, + { + "id": "6.H.17", + "title": "contested for both coasts", + "units": [ + { + "power": "france", + "type": "fleet", + "at": "mao" + }, + { + "power": "france", + "type": "fleet", + "at": "gas" + }, + { + "power": "france", + "type": "fleet", + "at": "wes" + }, + { + "power": "italy", + "type": "fleet", + "at": "tun" + }, + { + "power": "italy", + "type": "fleet", + "at": "tys" + }, + { + "power": "france", + "type": "fleet", + "at": "wes" + } + ], + "orders": [ + { + "type": "move", + "at": "mao", + "to": "spa/nc", + "viaConvoy": false, + "power": "france" + }, + { + "type": "move", + "at": "gas", + "to": "spa/nc", + "viaConvoy": false, + "power": "france" + }, + { + "type": "hold", + "at": "wes", + "power": "france" + }, + { + "type": "support", + "at": "tun", + "from": "tys", + "to": "wes", + "power": "italy" + }, + { + "type": "move", + "at": "tys", + "to": "wes", + "viaConvoy": false, + "power": "italy" + }, + { + "type": "move", + "at": "wes", + "to": "spa/sc", + "viaConvoy": false, + "power": "france" + } + ], + "expect": { + "mao": [ + "fails" + ], + "gas": [ + "fails" + ], + "wes": [ + "illegal" + ], + "tun": [ + "given" + ], + "tys": [ + "succeeds" + ] + } + } +] \ No newline at end of file diff --git a/src/game/datc.test.ts b/src/game/datc.test.ts new file mode 100644 index 0000000..10071fe --- /dev/null +++ b/src/game/datc.test.ts @@ -0,0 +1,76 @@ +import { describe, expect, it } from 'vitest' +import cases from './datc.json' +import { adjudicate } from './adjudicate' +import { boardFrom, type Order, type Unit } from './orders' + +/** + * The published test cases, run against this adjudicator. + * + * These are not my cases. They are the Diplomacy Adjudicator Test Cases, + * which is what the hobby settled on as the specification for what a correct + * adjudicator does, and they exist precisely because everybody's first + * attempt is subtly wrong in a way that plays fine. `tools/datc.py` turns the + * published document into the fixture beside this file; only the orders and + * their annotated outcomes come across. See NOTICE.md. + * + * Sections A to G are the movement phase and are run here. H is retreating + * and I and J are the winter, which need their own harnesses. + */ + +interface Case { + id: string + title: string + units: Unit[] + orders: Order[] + expect: Record +} + +const movement = (cases as unknown as Case[]).filter((c) => /^6\.[A-G]\./.test(c.id)) + +/* + * `invalid` marks an order the adjudicator should refuse to treat as an + * order at all -- a support for a move nobody made, say. It is a statement + * about parsing rather than about the outcome, and this engine reaches the + * same result by never counting such a support for anything, so there is + * nothing here to assert. `stands` and `destroyed` belong to the retreat + * phase, which this harness does not run. + */ +const SKIP = new Set(['invalid', 'stands', 'destroyed', 'no convoy', 'bounce']) + +describe('DATC', () => { + it.each(movement.map((c) => [c.id, c.title, c] as const))('%s %s', (_id, _title, c) => { + const outcome = adjudicate(boardFrom(c.units), c.orders) + + for (const [province, marks] of Object.entries(c.expect)) { + for (const mark of marks) { + if (SKIP.has(mark)) continue + switch (mark) { + case 'succeeds': + case 'given': + case 'available': + expect(outcome.success.get(province), `${province} ${mark}`).toBe(true) + break + case 'fails': + case 'cut': + case 'disrupted': + case 'illegal': + expect(outcome.success.get(province), `${province} ${mark}`).toBe(false) + break + case 'dislodged': + expect(outcome.dislodged.has(province), `${province} dislodged`).toBe(true) + break + } + } + } + + // Nobody unmentioned may be thrown out: a dislodgement the cases do not + // list is as wrong as one they list and this engine misses. + for (const province of outcome.dislodged.keys()) { + const marks = c.expect[province] ?? [] + expect( + marks.includes('dislodged') || marks.includes('destroyed'), + `${province} unexpectedly dislodged`, + ).toBe(true) + } + }) +}) diff --git a/src/game/orders.ts b/src/game/orders.ts index e1ef8a5..148058c 100644 --- a/src/game/orders.ts +++ b/src/game/orders.ts @@ -19,12 +19,18 @@ export interface Unit { at: string } +/** + * `power` is who gave the order, and is optional only because most of this + * engine's callers are handing it orders for units it already knows they + * own. When it is present it is checked: ordering another country's unit is + * not a clever move, it is not a move at all. + */ export type Order = - | { type: 'hold'; at: string } - | { type: 'move'; at: string; to: string; viaConvoy?: boolean } + | { type: 'hold'; at: string; power?: Power } + | { type: 'move'; at: string; to: string; viaConvoy?: boolean; power?: Power } /** `from === to` is a support to hold. */ - | { type: 'support'; at: string; from: string; to: string } - | { type: 'convoy'; at: string; from: string; to: string } + | { type: 'support'; at: string; from: string; to: string; power?: Power } + | { type: 'convoy'; at: string; from: string; to: string; power?: Power } /** Units by province. One unit to a province, whatever its coast. */ export type Board = Map @@ -99,3 +105,106 @@ export function convoyRoute( } return null } + +/** + * Which orders are orders at all. + * + * The rulebook's word is that an illegal order is not obeyed and the unit + * holds instead, and every published test case that says `illegal` is + * checking exactly that. It matters more than it sounds: a fleet ordered + * somewhere it cannot go must still be standing where it was, still + * occupying that province, still in everybody else's way. + * + * This is also where a fleet's coast is settled. An order that says "Spain" + * is fine when only one coast of Spain can be reached from where the fleet + * is, and is no order at all when both can -- the fleet has not been told + * which sea it is going to sit in. + */ +export interface Validated { + /** Province -> the order that will actually be carried out. */ + orders: Map + /** Provinces whose order was refused; those units hold. */ + illegal: Set +} + +export function validate(board: Board, given: readonly Order[]): Validated { + const orders = new Map() + const illegal = new Set() + + const refused = new Set() + + for (const order of given) { + const at = base(order.at) + const unit = board.get(at) + if (!unit) continue + // Ordering somebody else's unit is not an order. It is also not that + // unit's problem: whatever its owner told it to do, it still does. + if (order.power && order.power !== unit.power) { + refused.add(at) + continue + } + + const ok = check(board, unit, order) + if (ok) orders.set(at, ok) + else refused.add(at) + } + + for (const at of refused) if (!orders.has(at)) illegal.add(at) + for (const [p] of board) if (!orders.has(p)) orders.set(p, { type: 'hold', at: p }) + return { orders, illegal } +} + +/** The order as it will be obeyed, with the coast filled in, or null. */ +function check(board: Board, unit: Unit, order: Order): Order | null { + switch (order.type) { + case 'hold': + return order + + case 'move': { + if (base(order.to) === base(unit.at)) return null + const to = settleCoast(unit, order.to) + if (to === null) return null + if (unit.type === 'fleet') return canStep(unit, to) ? { ...order, to } : null + // An army may walk, or be carried; either is a legal thing to order. + if (canStep(unit, to)) return { ...order, to } + return convoyable(unit, to) ? { ...order, to, viaConvoy: true } : null + } + + case 'support': { + // You may only support into a province you could have gone to yourself. + if (base(order.from) === base(unit.at)) return null + return reaches(unit, order.to) ? order : null + } + + case 'convoy': { + if (unit.type !== 'fleet') return null + if (PROVINCES[base(unit.at)]!.terrain !== 'sea') return null + const army = board.get(base(order.from)) + if (!army || army.type !== 'army') return null + return convoyable(army, order.to) ? order : null + } + } +} + +/** A destination a fleet could sit on, or null when it was not told which. */ +function settleCoast(unit: Unit, to: string): string | null { + if (unit.type === 'army') return base(to) + if (to.includes('/')) return to + const coasts = PROVINCES[base(to)]?.coasts + if (!coasts) return to + const reachable = fleetCoasts(unit.at, to) + return reachable.length === 1 ? reachable[0]! : null +} + +/** Could this unit ever step here, on any coast? Used for supports. */ +function reaches(unit: Unit, to: string): boolean { + if (unit.type === 'army') return (ARMY[base(unit.at)] ?? []).includes(base(to)) + if (to.includes('/')) return (FLEET[unit.at] ?? []).includes(to) + return fleetCoasts(unit.at, to).length > 0 +} + +/** Both ends ashore, which is the most a convoy can be judged before it sails. */ +const convoyable = (unit: Unit, to: string): boolean => + unit.type === 'army' && + PROVINCES[base(unit.at)]!.terrain === 'coast' && + PROVINCES[base(to)]!.terrain === 'coast' diff --git a/tools/datc.py b/tools/datc.py new file mode 100644 index 0000000..5e6e712 --- /dev/null +++ b/tools/datc.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +""" +Turn the published Diplomacy Adjudicator Test Cases into a fixture. + + python3 tools/datc.py path/to/datc.html > src/game/datc.json + +Only the machine-readable half is taken across: the case number, its title, +the orders, and the outcome each order is annotated with. The document's +explanatory prose is Lucas Kruijswijk's writing and stays where it is -- see +NOTICE.md. What lands here are the cases themselves, which are the thing an +adjudicator is measured against. +""" +import html +import json +import re +import sys +import pathlib + +POWERS = ['austria', 'england', 'france', 'germany', 'italy', 'russia', 'turkey'] +ANNOTATIONS = [ + 'succeeds', 'fails', 'illegal', 'dislodged', 'given', 'invalid', + 'available', 'cut', 'disrupted', 'no convoy', 'bounce', + 'destroyed', 'stands', +] + + +def province_names(map_ts: pathlib.Path) -> dict[str, str]: + """id -> full name, read straight out of the board so they cannot drift.""" + out = {} + for m in re.finditer(r"^\s+([a-z]{3}): P\('([^']+)'", map_ts.read_text(), re.M): + out[m.group(2)] = m.group(1) + return out + + +def to_text(raw: str) -> list[str]: + t = re.sub(r'<(script|style)[^>]*>.*?', '', raw, flags=re.S | re.I) + t = re.sub(r'', '\n', t, flags=re.I) + t = re.sub(r'', '\n', t, flags=re.I) + t = re.sub(r'<[^>]+>', '', t) + return [l.rstrip() for l in html.unescape(t).split('\n')] + + +def norm(name: str) -> str: + return re.sub(r'\s+', ' ', name.replace('.', '').strip()).lower() + + +def main() -> int: + doc = pathlib.Path(sys.argv[1]) + names = province_names(pathlib.Path(__file__).parent.parent / 'src/game/map.ts') + lookup = {norm(n): i for n, i in names.items()} + + def place(text: str) -> str: + """'Spain(nc)' -> 'spa/nc'. Unknown names raise rather than guess.""" + text = text.strip() + coast = None + m = re.match(r'^(.*?)\s*\((nc|sc|ec|wc)\)$', text) + if m: + text, coast = m.group(1), m.group(2) + pid = lookup.get(norm(text)) + if pid is None: + raise KeyError(text) + return f'{pid}/{coast}' if coast else pid + + lines = to_text(doc.read_text(encoding='utf-8', errors='replace')) + heads = [(k, l) for k, l in enumerate(lines) + if re.match(r'\s*6\.[A-Z]\.\d+\.\s+TEST CASE', l)] + + cases, unknown = [], set() + for idx, (start, head) in enumerate(heads): + end = heads[idx + 1][0] if idx + 1 < len(heads) else len(lines) + m = re.match(r'\s*(6\.[A-Z]\.\d+)\.\s+TEST CASE,\s*(.*)', head) + case = {'id': m.group(1), 'title': m.group(2).strip().lower(), + 'units': [], 'orders': [], 'expect': {}} + + power = None + ok = True + for line in lines[start + 1:end]: + s = line.strip() + if not s: + continue + p = s.rstrip(':').strip().lower() + if s.endswith(':') and p in POWERS: + power = p + continue + if not re.match(r'^[AF]\s', s) or power is None: + continue + + body, marks = s, [] + while True: + m2 = re.search(r',?\s*(' + '|'.join(ANNOTATIONS) + r')\s*$', body, re.I) + if not m2: + break + marks.insert(0, m2.group(1).lower()) + body = body[:m2.start()].rstrip() + + try: + unit_type = 'army' if body[0] == 'A' else 'fleet' + rest = body[1:].strip() + + if m2 := re.match(r'^(.*?)\s+Convoys\s+A\s+(.*?)\s+-\s+(.*)$', rest, re.I): + at = place(m2.group(1)) + order = {'type': 'convoy', 'at': at, + 'from': place(m2.group(2)), 'to': place(m2.group(3))} + elif m2 := re.match(r'^(.*?)\s+Supports\s+[AF]\s+(.*?)\s+-\s+(.*)$', rest, re.I): + at = place(m2.group(1)) + order = {'type': 'support', 'at': at, + 'from': place(m2.group(2)), 'to': place(m2.group(3))} + elif m2 := re.match(r'^(.*?)\s+Supports\s+[AF]\s+(.*)$', rest, re.I): + at = place(m2.group(1)) + tgt = place(m2.group(2)) + order = {'type': 'support', 'at': at, 'from': tgt, 'to': tgt} + elif m2 := re.match(r'^(.*?)\s+-\s+(.*?)(\s+via\s+convoy)?$', rest, re.I): + at = place(m2.group(1)) + order = {'type': 'move', 'at': at, 'to': place(m2.group(2)), + 'viaConvoy': bool(m2.group(3))} + elif m2 := re.match(r'^(.*?)\s+Holds?$', rest, re.I): + at = place(m2.group(1)) + order = {'type': 'hold', 'at': at} + else: + at = place(rest) + order = {'type': 'hold', 'at': at} + except KeyError as e: + unknown.add(str(e)) + ok = False + break + + case['units'].append({'power': power, 'type': unit_type, 'at': at}) + case['orders'].append({**order, 'power': power}) + if marks: + case['expect'][at.split('/')[0]] = marks + + if ok and case['orders']: + cases.append(case) + + if unknown: + print(f'unmapped province names: {sorted(unknown)}', file=sys.stderr) + print(f'{len(cases)} of {len(heads)} cases parsed', file=sys.stderr) + json.dump(cases, sys.stdout, indent=1) + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tsconfig.app.json b/tsconfig.app.json index c44bf8f..18d7d9c 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -6,6 +6,7 @@ "module": "esnext", "types": ["vite/client"], "allowArbitraryExtensions": true, + "resolveJsonModule": true, "skipLibCheck": true, /* Bundler mode */