aboutsummaryrefslogtreecommitdiff
path: root/web/pw-server/src/routes/docs/rules.md
blob: 4d37729aa032381b6cd47c08fca31e16c4b66bc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# How to play

## Protocol

In every game turn, your bot will receive a json-encoded line on stdin, describing the current
state of the game. Each state will hold a set of planets, and a set of spaceship fleets
traveling between the planets (_expeditions_).

Example game state:

```json
{
  "planets": [
    {
      "ship_count": 2,
      "x": -2.0,
      "y": 0.0,
      "owner": 1,
      "name": "your planet"
    },
    {
      "ship_count": 4,
      "x": 2.0,
      "y": 0.0,
      "owner": 2,
      "name": "enemy planet"
    },
    {
      "ship_count": 2,
      "x": 0.0,
      "y": 2.0,
      "owner": null,
      "name": "neutral planet"
    }
  ],
  "expeditions": [
    {
      "id": 169,
      "ship_count": 8,
      "origin": "your planet",
      "destination": "enemy planet",
      "owner": 1,
      "turns_remaining": 2
    }
  ]
}
```

The `owner` field holds a player number when the planet is held by a player, and is
`null` otherwise. Your bot is always referred to as player 1.  
Planets will never move during the game.

Every turn, you may send out expeditions to conquer other planets. You can do this by writing
a json-encoded line to stdout:

Example command:

```json
{
  "moves": [
    {
      "origin": "your planet",
      "destination": "enemy planet",
      "ship_count": 2
    }
  ]
}

You can dispatch as many expeditions as you like.
```

## Rules

All players send out their commands simultaneously, so there is no player order.

The amount of turns an expedition will travel is equal to the ceiled euclidean distance
between its origin and destination planet.

Each turn, one additional ship will be constructed on each player-owned planet.
Neutral planets do not construct ships.

Ships will only battle on planets. Combat resolution is simple: every ship destroys one enemy
ship, last man standing gets to keep the planet. When no player has ships remaining, the planet will turn neutral.

A turn progresses as follows:

1. Construct ships
2. Dispatch expeditions
3. Arrivals & combat resolution

It is not allowed for players to abandon a planet - at least one ship should remain at all times.
Note that you are still allowed to dispatch the full ship count you observe in the game state,
as an additional ship will be constructed before the ships depart.

The game will end when no enemy player ships remain (neutral ships may survive), or when the
turn limit is reached. When the turn limit is hit, the game will end it a tie.
Currently, the limit is set at 500 turns.

## Writing your bot

You can code a bot in python 3.10 using the [web editor](/editor). A working example bot is provided.
If you'd like to use a different programming language, or prefer coding on your own editor,
you can try [local development](/docs/local-development).

As logging to stdout will be interpreted as commands by the game server, we suggest you log to stderr.  
In python, you can do this using

```python
print("hello world", file=sys.stderr)
```

Output written to stderr will be displayed alongside the match replay.

Feel free to launch some test matches to get the hang of it!