static void
loa_game_new_game (loa_game_t *game)
{
- loa_board_init (&game->board);
+ loa_board_reset (&game->board);
}
static loa_bool_t
-loa_game_move (loa_game_t *game, const char * peer,
- int x1, int y1, int x2, int y2)
+loa_game_move (loa_game_t *game, const char * peer, loa_move_t *move)
{
char *error;
- if (! loa_board_move (&game->board, x1, y1, x2, y2, &error)) {
- loudgame_sendf (&game->lg, peer, "Illegal move: %c%d%c%d: %s",
- 'a' + x1, LOA_BOARD_SIZE - y1,
- 'a' + x2, LOA_BOARD_SIZE - y2,
- error);
+ if (! loa_board_move (&game->board, move, &error)) {
+ loudgame_sendf (&game->lg, peer, "Illegal move: %s: %s",
+ loa_move_to_string (move), error);
return FALSE;
}
static void
loa_game_handle_move (loa_game_t *game,
const char *peer,
- const char *move)
+ const char *move_string)
{
- char xc1, xc2;
- int x1, y1, x2, y2;
- int matched;
+ loa_move_t move;
- matched = sscanf (move, " %c %d %c %d ", &xc1, &y1, &xc2, &y2);
- if (matched != 4) {
+ if (! loa_move_init_from_string (&move, move_string)) {
loudgame_sendf (&game->lg, peer,
- "Error: The 'move' command requires a move of the form 'b1d3'");
+ "Error: The 'move' command requires a move of the form 'b1-d3'");
return;
}
- x1 = tolower (xc1) - 'a';
- x2 = tolower (xc2) - 'a';
- /* We use an upper-left origin internally. */
- y1 = LOA_BOARD_SIZE - y1;
- y2 = LOA_BOARD_SIZE - y2;
- if (! loa_game_move (game, peer, x1, y1, x2, y2))
+ if (! loa_game_move (game, peer, &move))
return;
- loudgame_broadcastf (&game->lg, "%c%d%c%d",
- 'a' + x1, LOA_BOARD_SIZE - y1,
- 'a' + x2, LOA_BOARD_SIZE - y2);
+ loudgame_broadcastf (&game->lg, "%s", loa_move_to_string (&move));
- if (loa_board_is_won (&game->board, x2, y2))
+ if (loa_board_is_won (&game->board, move.x2, move.y2))
loudgame_broadcastf (&game->lg, "%s wins", peer);
}
+static void
+loa_game_handle_history (loa_game_t *game,
+ const char *peer)
+{
+ int i;
+
+ for (i = 0; i < game->board.num_moves; i++)
+ loudgame_sendf (&game->lg, peer, "%s",
+ loa_move_to_string (&game->board.moves[i]));
+}
+
static void
loa_game_handle_pass (loa_game_t *game, const char *peer)
{
"\tmove aNbN\tMove a piece, (eg. 'move b1d3')\n"
"\tpass \t\tSkip a turn (only legal if no moves are possible)\n"
"\tnew \t\tBegin a new game\n"
+ "\thistory \t\tShow the move history of the game\n"
"\thelp \t\tThis help message\n"
"\trules \t\tA description of the Lines of Action rules\n"
"\n"
loa_game_handle_pass (game, peer);
else if (strcmp (message, "new") == 0)
loa_game_handle_new (game, peer);
+ else if (strcmp (message, "history") == 0)
+ loa_game_handle_history (game, peer);
else if (strcmp (message, "help") == 0)
loa_game_handle_help (game, peer);
else if (strcmp (message, "rules") == 0)
if (err)
return err;
+ loa_board_init (&game->board);
+
loa_game_new_game (game);
return 0;