All players start the game with 15 points, and there is no "everyone takes five" rule. This keeps scores generally (though not necessarily) positive.
The game flow works like this:
During config phase, the clients can send game.move_root_square
and game.move_null_square. The referee will respond with
game.set_root_square and game.set_null_square
for valid moves.
When the game begins, the referee will immediately send
game.turn("red"). The Red client should now accept
the player's move, and send game.move. If this is valid,
the referee will send game.move, possibly followed
by game.bonus. The referee will then send
game.turn("blue"), and the cycle will continue.
(All ref-to-client RPCs are broadcast simultaneously to all players and observers. This game has no hidden information.)
red
blue
yellow
green
game.move_root_square(tokennum, x, y)
-- Move one of the root tokens.
(Config phase only.)
game.move_null_square(tokennum, x, y)
-- Move one of the null tokens.
(Config phase only.)
game.move(x, y, size, dir)
-- Make a move.
game.set_root_square(player, tokennum, x, y)
-- The given root token has been moved by the given player.
(Config phase only.)
game.set_null_square(player, tokennum, x, y)
-- The given null token has been moved by the given player.
(Config phase only.)
game.turn(seat)
-- It is now the given seat's turn.
(This is sent after game-unsuspend, even if it was sent for the current turn
before the game was suspended.)
game.move(seat, x, y, size, dir)
-- The given seat has made a move.
game.bonus(seat1, bonus, seat2, penalty, x, y, dir)
-- The seat seat2 has incurred a penalty-point penalty,
and the seat seat1 has gained a bonus-point bonus,
because of seat2's move at x, y, dir attacking
seat1.
game.out_of_bounds
-- "That location is off the board."
game.token_overlap
-- "Two root or null tokens cannot occupy the same space."
game.invalid_direction
-- "The "direction" field is invalid."
game.invalid_size
-- "The "size" field is invalid."
game.invalid_token
-- "The "token" field is invalid."
game.out_of_pieces
-- "You have no more pieces of that size to play."
game.square_occupied
-- "That square is already occupied."
game.no_target
-- "Your piece must point at another piece or at a root."
game.null_target
-- "No piece may point at a null square."