Retreats and the winter
Movement is the part everybody thinks about and it is not the part that decides the game. A beaten unit that finds somewhere to stand is a nuisance for years; one that does not is gone. And the winter is where a good spring turns into a bigger army, or does not. Four things are closed to a retreat: anywhere unreachable, anywhere occupied, the province the attacker came from, and any province two units bounced out of -- that last is the one people forget, since a bounce leaves a province empty and closed rather than empty and open. The exception is an attacker who arrived by convoy: it never marched through the ground between, so there is nothing to stop the loser falling back that way. Two units retreating to the same province destroy each other, there being no support in this phase and nothing to break the tie with. Ownership changes only in the autumn and only by standing on a centre. A centre you walked through in the spring is not yours; one you walked away from stays yours until somebody else stands on it, which is why a power with no units can still hold centres. Civil disorder removes what is furthest from home, fleets first, then alphabetically -- arbitrary in the last step on purpose, so that two adjudicators never disagree about a game nobody is playing.
This commit is contained in:
+11
-1
@@ -28,6 +28,12 @@ export interface Dislodgement {
|
||||
unit: Unit
|
||||
/** Where the attacker came from. A unit may not retreat back into it. */
|
||||
attackedFrom: string
|
||||
/**
|
||||
* The attacker came over water. That lifts the restriction above: a unit
|
||||
* put ashore by a convoy never passed through the ground between, so there
|
||||
* is nothing to say the loser cannot fall back that way.
|
||||
*/
|
||||
byConvoy: boolean
|
||||
}
|
||||
|
||||
export interface Outcome {
|
||||
@@ -323,7 +329,11 @@ export function adjudicate(board: Board, orderList: readonly Order[]): Outcome {
|
||||
for (const p of board.keys()) {
|
||||
if (!isDislodged(p)) continue
|
||||
const attacker = movesInto(p).find((q) => success.get(q))!
|
||||
dislodged.set(p, { unit: unitAt(p)!, attackedFrom: attacker })
|
||||
dislodged.set(p, {
|
||||
unit: unitAt(p)!,
|
||||
attackedFrom: attacker,
|
||||
byConvoy: isConvoyed(attacker),
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user