Multi-fleet convoys work and always did -- London to Spain across the
Channel and the Mid-Atlantic with both fleets carrying, which is what the
fifty DATC convoy cases are about. What did not work was finding that out
from inside the game.
A convoy takes as many orders as there are seas to cross, and the rules give
two different answers to writing fewer. With no fleet ordered at all the
move is illegal -- legality is decided on the board alone -- and the panel
reddens it. With one fleet of a two-fleet chain the move is perfectly legal
and simply fails, silently, a turn later, with nothing on screen to tell it
apart from having been blocked.
From the chair where the orders are written those are one complaint: nobody
is carrying this. And it is worse than it looks, because the board
deliberately offers crossings that run through other powers' fleets, which
cannot be ordered at all, only asked for -- so a player can write a crossing
that no order of theirs could ever complete.
The panel now asks the question that matters rather than the one the rules
happen to answer: given everything on the table, is there a chain that gets
this army there? When there is not it says which kind of not, in amber
rather than the red an illegal order gets, because a legal order that will
fail is a different thing to tell somebody.
Diplomacy has a reputation and about half of it is wrong, so the landing
page states the rules completely -- they are short enough -- and says the
strange part out loud: there is no luck in this game, every unit is exactly
as strong as every other, and nothing happens on the board that somebody did
not agree to help with. It is also the honest place for the licence and for
where the map came from. A page that says nothing about that is a page
quietly hoping nobody asks.
The dice on starting are the only joke in here. There are none in this game;
that is the sound of every other board game you have played, and the last
one you hear before finding out that none of this is luck.
Giving up is two different things and concede.ts keeps them apart.
Resigning is unilateral, because nobody is entitled to your attention. But
the power does not leave the board -- it goes into civil disorder, holds
everything, waives its builds and is paid off as it loses centres, which is
what the rules already say happens to an absent player. That matters to
everyone else: a resigned Austria is still eleven centres somebody has to go
and take, and letting them evaporate would hand the game to whoever happened
to be next door. Verified by playing four years past a resignation: Austria
sits on its three while France reaches six.
A draw is not unilateral, and that is what keeps it Diplomacy rather than a
menu. Every surviving power votes, one refusal is enough, and each refusal
comes back with its reason so it can be argued with next year. A power
refuses while it leads or is within two of leading. Asked in Spring 1901 all
six refuse -- the right answer, since a game that could be drawn on the
first turn would not be worth playing.
Conceding is harder to get than a draw and should be: it carries only when
the solo was coming anyway. Otherwise refusing costs nothing but time, and
time is all the losing side has.
The resign button asks twice, in the page rather than in a browser dialog.
It is the one control here that cannot be taken back.
The illegal/invalid line (6.A.5, 6.D.8). The document separates an order
that is impossible in this position from one this position allows that
merely did not come off. The first is ignored and its unit is holding like
any other; the second means the unit tried to leave and cannot be propped up
where it stands. An army sent across water with a fleet on the route and no
convoy ordered is the second; the identical order with nobody in the sea at
all is the first. Guessing at this once cost four passing cases to buy one.
Reading the document cost nothing -- it says so outright, in the note under
6.D.8 and again under 6.D.32.
A support that only looked like a hold (6.A.5). "Supports A Yorkshire" and
"Supports A Yorkshire - Yorkshire" are the same shape once parsed, and the
case turns on the difference: the first holds a unit down, the second
supports a move nobody can legally make. The extractor was throwing that
away; it now keeps it, and the fixture is regenerated.
The head of a cycle (6.F.22). Kruijswijk's resolver guesses that an order
fails, sees what follows, then guesses the other way. Only the outermost
order in a cycle may do that, because its answer is the one everything else
was computed against. This engine let any order that reached the dependency
list first declare the cycle its own -- and an inner one takes both guesses
with its callers' provisional answers held fixed, gets the same result twice
for that reason, and writes it down as settled. The cycle then becomes
invisible: the backup rule never runs and Szykman's rule never fires, and
the position resolves to whichever of its two consistent readings the search
happened to walk into first. It had been doing this on every paradox and
getting away with it, because on a first-order paradox both readings agree.
Also carried across from the reference algorithm: an order that resolved
itself while a nested call was away must not have the guess written over it.
Three remain. 6.F.28 and 6.F.29 are sixth-order paradoxes -- the same
twenty-six orders with one support between them, and the point of the pair
is that the answer swings on it, where this resolver gives both the same
answer. 6.G.19 the document itself gives three answers to, calls a little
bit pedantic, and advises adjudicators not to offer at all.
Fifty of the DATC cases are about convoys, paradoxes included, and the
adjudicator passes them. But the army's half of a convoy could not be
ordered: the board offered a unit the provinces it could walk to, and a
crossing is by definition not one of those. The fleet's half could be
ordered, which made it worse -- the verb was there and did nothing anybody
could reach.
An army on a coast is now also offered the coasts a chain of crewed seas can
reach, in blue with long dashes, so a crossing does not look like a march. A
sea counts if a fleet is standing in it, whoever owns it; a fleet that has
not been ordered to convoy still counts, because it is a thing that could be
arranged and that is what the talking is for.
This is deliberately not the question the rules ask when they judge a convoy
order, which is whether water could ever get there. That one says yes to
most of Europe: offering thirty provinces because a chain of fleets is
conceivable is worse than offering none.
Clicking a blue coast writes the move viaConvoy. Not a formality -- the
rules let a unit be convoyed to a province it could have walked to, and the
two orders resolve differently.
The fleet's own offering was too loose in the other direction and is now on
the same chain: the North Sea listed eleven armies it could never carry, one
of them in Ankara, and wrote orders the adjudicator discarded without
saying why.
What needed nothing added: the order list already flags A Yorkshire → Norway
in red while it stands alone, and clears it when F North Sea convoys
Yorkshire → Norway joins it. The validator knew all along.
The rule is that the supporting unit must be able to reach the province the
supported unit is going *to*, not the province it is standing in. The board
offered the other set -- units standing next door -- so Vienna could not
support Venice into Tyrolia, which is an ordinary order: Vienna and Tyrolia
touch, Vienna and Venice do not. There was no way to write it at all.
It was wrong in the other direction too. Support to hold was offered for
units the supporter could not have reached, the order was written, and the
adjudicator turned it into a hold after submission without saying so.
This was a rules question living in a component, so it moves to the rules:
src/game/targets.ts, and eight tests instead of a closure.
The rest of the stiffness was that a stray click threw away a half-written
order. You picked Support, picked the unit to help, missed the destination
by a province, and the whole thing silently became a fresh move somewhere
else. A two-part order now stands its ground and sounds a refusal; clicking
the unit giving the order backs out of it, and any other unit of yours still
switches straight over, which is what makes writing a page of orders quick.
And the unit picked to support -- or to carry -- is marked on the board, in
a different colour from the unit giving the order. Without it the second
half of every support is written blind: you click a unit, every highlight on
the map changes, and nothing says which one you chose.
Both were being taken for the player, the same way a computer power's are,
which quietly removed half the consequence of the turn they had just played.
A beaten unit that finds somewhere to stand is a nuisance for years and one
that does not is gone; the winter is where a good spring turns into a bigger
army, or does not.
Offered as places rather than as a notation, for the same reason the orders
are: the rules already know what is allowed, so the interface only ever
offers what is. A beaten unit lists the provinces it may fall back to and
nothing else, with Disband beside them. The winter lists the home centres
that are yours and empty, and offers a fleet only where a fleet could sit --
so St Petersburg offers two coasts and Moscow offers none.
The game steps past anything with no decision in it. A retreat phase where
nothing of yours was thrown out, or a winter where your centres and units are
level, is not a choice, it is a screen asking you to press Done.
The planner worked one unit at a time, picking each one's best destination
independently. That is why nothing was ever taken: a defended province is
attacked by a single unit, bounces, and is attacked again next year for ever.
It now works the other way round -- list what is worth having, work out how
many units it takes, and commit that many or none. A province you cannot take
is not worth one unit.
Three things came out of that. A single unit still walks at an *empty*
province, since the worst case is a bounce and it might be free, but never at
a garrison. Garrisoning now needs two neighbours rather than one, because one
unit cannot dislodge another -- with one counting as a threat, almost every
centre on a crowded board was threatened, almost every unit stood still, and
nothing happened for two centuries. And an attack is priced at two units
unless the defender has two friends near enough to prop it up; assuming one
was enough meant almost every attack was priced at three, which nobody can
afford.
Asking for help now works from what a power wanted and could not have. It
used to read the moves already planned, which was exactly backwards once the
planner learned not to attack what it cannot take: the target is no longer in
the plan, so the bot stopped asking precisely when it needed to.
The game is now called at the end of 1912. This game has no clock of its own
and seven cautious powers will hold a standoff for ever -- a run to 2198 had
the board still alive and nobody near eighteen. Eighteen wins outright and
otherwise the survivors draw, which is a proper ending here and the commonest
way real games finish.
Units are a soldier and a ship rather than two wedges. A helmet and square
shoulders read as troops at any size; a triangle above a curved hull is a
boat before anybody has decided to look. Both in the power's colour with one
flat highlight, and a shadow so they sit on the ground instead of floating
over a border.
Spring orders, retreats, autumn orders, retreats, then the winter -- the only
phase that changes who owns anything. Everybody talks before the orders:
computer powers approach each other, answer on the merits, and what they
agree binds that turn and is judged at the end of it on the orders that were
given rather than on how the turn came out.
The loop has no interface attached on purpose. A whole game can be played out
in a test, which is the only way to ask the question that matters about the
bots -- not whether an order looks sensible but whether seven powers left
alone get anywhere.
Asking it found two things nothing else would have.
Every bot was submitting orders for all twenty-two units on the board rather
than its own three. The validator fills in a hold for every unit, which is
right for adjudication and wrong as an answer to what one power does this
turn; it only showed up when seven powers were asked at once.
And fifteen of nineteen units held in Spring 1901, when in this game every
unit moves. An empty province was priced by asking what the unit standing in
it could reach -- and there is no unit standing in it -- so every empty
non-centre scored zero and every move to one was skipped as worthless. It is
sixteen of nineteen now.
What the loop still does not do is finish. Played to 2149 the board is alive
and nobody has soloed: the powers take the neutrals and then hold each other
off. Taking a defended centre needs two units on it and the bots do not
reliably arrange that. That is the next piece of work and the test says so
rather than pretending otherwise.
Clicks on the board, because that is where the question is. Select a unit,
pick a verb, and the provinces the next click will accept light up. Nobody
writes a move the rules were never going to allow, and nobody has to learn a
notation to find that out.
What is offered comes from the rules rather than from the map, which is the
same split the map is built on: a fleet on the north coast of Spain is drawn
identically to one on the south coast and can go to entirely different
places. A support is only offered where both units could have gone, since you
cannot support a move you could not have made yourself, and a fleet is only
asked which coast it means when more than one is reachable.
Orders are drawn where they are given -- an arrow to the destination, a
dashed line to what a support is holding up, a ring round a unit staying put
-- and written out beside the board in the rules' own words, because an arrow
cannot tell you that the support you meant for Vienna is going to Budapest.
The written list runs through the validator on every keystroke, so an order
the rules will not take is struck through while it is being written rather
than after the turn.
Three attempts at drawing this map came to nothing worth looking at. Dividing
the plane by nearest province gives a tidy board that looks nothing like
Europe. Drawing the adjacency graph gives something unimpeachable about the
rules and not a map at all -- circles joined by lines. Fifty-six polygons
placed by eye gives fifty-six islands.
The standard map published with the diplomacy engine is AGPL-3.0, the same
licence as this project, so it can be carried across whole with attribution
rather than approximated badly. tools/map.py extracts the outlines, the unit
coordinates and the layer transform into board.json and can be re-run against
a newer copy. NOTICE.md says where it came from and what is still ours, which
is every colour and every mark drawn on top.
Drawing Europe accurately is real work, somebody did it properly, and they
published it under a licence that invites exactly this. Three days of my
approximating it would have produced something worse than the thing that
already existed.
Clicking still answers with the rules rather than the picture: a shape cannot
say that a fleet on Spain's north coast may not enter the Gulf of Lyon while
one on the south coast may, because both coasts are the same shape.
The board is regions again. Voronoi cells divide it with no gaps and no
overlaps and look like a board, which is what this was always supposed to be.
What they cannot do is reproduce every adjacency in the rules, because
provinces interleave -- the Adriatic borders Venice with Trieste between
their centres. The lesson I drew from that was to abandon regions and draw
the adjacency graph, which is unimpeachable and is not a map. It is circles
joined by lines.
The right answer is to stop asking the picture to carry the rules. Clicking a
province lights up exactly where its unit may legally go, taken from the
graph rather than from which shapes happen to share an edge. Vienna lights
Bohemia, Galicia, Budapest, Trieste and Tyrolia; a fleet on the north coast
of Spain does not light the Gulf of Lyon. The picture is a picture and the
rules answer for themselves when asked.
Coordinates placed by hand, roughly where each province falls in Europe, and
everything else drawn from those and from the adjacency rules. Nothing here
is a picture of anybody's board.
It draws the graph rather than regions, and that was not the first idea. The
first idea was Voronoi cells -- every point belonging to the nearest province
-- which makes a handsome cut-paper board and is wrong. Sixty-five pairs that
border each other in the rules came out with regions that did not touch, and
no amount of moving coordinates fixes it: provinces here interleave. The
Adriatic borders Venice with Trieste between their centres; the Atlantic
borders North Africa around the outside of Spain. Convex cells cannot say
that. A map that shows two regions meeting when the rules say otherwise is
worse than an ugly map -- it is a map that loses you the game.
The tests found three provinces drawn on top of each other and a distance
check of mine that was measuring Europe rather than checking my typing: it
failed fifteen honest placings because oceans are large and Moscow borders
five things. The exact check is that a line exists for every border in the
rules and for no others.
The viewBox is fitted to what is actually drawn. Europe is not rectangular,
and the box the coordinates were typed into left a third of the frame as
empty ocean -- which wastes the one thing this game was given more of than
the others.
A bot that only answers is not negotiating, it is a form to fill in. propose()
works from the plan the power has already made: what it wants this turn, where
that will not work alone, and who could make it work. Help taking something
defended first, then a quiet border over ground neither of them owns, then
peace when a neighbour is over your centres and your ambitions are elsewhere.
Three a turn at most, or six powers talking at once is a mailstorm.
Each overture carries what the power says, so it reaches a human as a message
rather than as a form.
A power will offer a quiet border to somebody it is attacking somewhere else,
and that is on purpose. Marching on French Belgium while suggesting both
sides leave Burgundy alone is not a lie and not incoherent -- a promise about
Burgundy is a promise about Burgundy, and it will be kept to the letter by
somebody robbing you at the same moment. A test asserted the opposite and the
test was wrong: refusing that offer would be playing a politer game than this
one. Asking the power you are attacking to help you, or offering it peace
while your orders say otherwise, are different things and are both refused.
Nothing here promises any of it will be kept. Whether the power still wants
the deal when orders are due is settled in settleUp, and the answer is
sometimes no.
A position is worth its centres, and almost nothing else: units are how you
get them and are worth nothing in themselves. Every other term is a small
correction on that one fact.
Orders are a greedy plan taken in order of what is worth most, with a second
unit put behind the first when the prize is worth two units -- a bot that
never doubles up is not playing this game. Agreements are applied after the
plan rather than as a constraint on it, on purpose: the plan has to know what
it is giving up before it can decide whether the promise is worth keeping.
Three things the tests taught it. It garrisons a threatened centre it is
already standing on, because scoring only moves had it defending Berlin by
marching the Munich garrison there. It never shoves at its own countryman,
which has no strength and wastes two units. And the price of breaking a
promise is how far it trusts the partner, not how far the partner trusts it
-- the other way round gives a power that has been lied to four times a high
cost of retaliating, because it has been scrupulous and is still well thought
of, which is exactly backwards.
Every decision comes back as a sentence. When a power turns on you it says
what the province was worth and what it thought you were worth, because being
betrayed should be infuriating rather than mysterious.
All 176 published cases now parse and run. Retreating passes 18 of 18,
building 7 of 7, civil disorder 13 of 13; movement is unchanged at 133 of
139.
The retreat and winter engine code was written before these cases and mostly
held up, but civil disorder was wrong in a way playing would never have shown.
It measured distance to a power's *home* centres. The rule is distance to the
centres it owns -- a Russia driven out of Moscow and holding Sweden measures
from Sweden -- so every power that had lost a home centre was disbanding the
wrong unit.
And it measured over the graph each unit moves on, which is wrong in both
directions. An army counts sea provinces it would have to be convoyed across,
so Albania is two steps from Naples rather than unreachable. A fleet counts
inland provinces it could never enter, so the Baltic is two from Warsaw. That
reads as nonsense until you notice what is being measured: not how the unit
would get home, but how far out of the way it is. A fleet in the Baltic is
still in the middle of Russia's business; one in the North Atlantic is not.
Civil disorder also only applies to the shortfall. A power that disbanded one
of the two it owed has half answered, and the automatic rule picks from what
is left rather than from what it started with.
A known deviation nobody has written down is a bug waiting to be
rediscovered, and a red mark nobody can explain is worse than a red mark with
a reason next to it.
A game of this ends in a solo, an elimination, a draw, or somebody else's
solo, and none of those is a win or a loss in the shape the other games on
this site use. The draw is the one that matters: it is the usual outcome and
it is neither, so it cannot borrow either tune.
Convoy routing is breadth-first over the fleets actually ordered to convoy
this army, so it returns the shortest chain and answers null rather than
guessing. It takes a set of fleets to treat as already gone, which is what
the adjudicator will need to ask whether a convoy survives being attacked.
The tests found a wrong assumption of mine rather than a wrong line of code:
taking the Channel out of a London to Brest convoy leaves no route at all.
The North Sea does not touch the Mid-Atlantic on this board -- the long way
round is over the top through the Norwegian Sea -- so the Channel is the
whole western sea route.
Seventy-five provinces as two graphs, because an army and a fleet do not move
on the same one, and three provinces whose two coasts do not connect.
The topology is a fact about a published game and free to use; the artwork is
not, and there is none here -- the map will be generated from this data the
way the cave game's dodecahedron is. The name is a working one for the same
reason the starship game is not called what you expect.
The tests check the board against itself, and symmetry is the one that pays:
it found the Skagerrak wired to the Baltic, which would have opened a back
door into the Baltic and made Denmark worth nothing.