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."