summaryrefslogtreecommitdiff
path: root/src/ctaklm.c
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2021-01-01 11:45:12 -0500
committertslil <tslil@posteo.de>2026-08-28 19:37:41 +0100
commitf0d5cde50cc7a825acadbfe58b6046a4912f4814 (patch)
treecaddafa40551bfa99c98d9931457aa4655352d06 /src/ctaklm.c
parent604ea936443f86afd6df2af50cf73c930f687400 (diff)
tak.h now tracks win state, optimisations, saved a byte on counts
Diffstat (limited to 'src/ctaklm.c')
-rw-r--r--src/ctaklm.c71
1 files changed, 38 insertions, 33 deletions
diff --git a/src/ctaklm.c b/src/ctaklm.c
index 5dbfde8..5ad7e8e 100644
--- a/src/ctaklm.c
+++ b/src/ctaklm.c
@@ -146,15 +146,15 @@ print_info(void) {
rst,
(ply < 2) ? " (counter-play start)" : "");
printf("Flats remaining: %sWhite%s %02d, %sBlack%s %02d\n",
- wht,rst,white_flats,
- blk,rst,black_flats);
+ wht,rst,white_count & 127,
+ blk,rst,black_count & 127);
printf("Caps remaining: %sWhite%s %d, %sBlack%s %d\n",
- wht,rst,white_caps,
- blk,rst,black_caps);
+ wht,rst,white_count >> 7,
+ blk,rst,black_count >> 7);
}
char *gamelog = 0;
-uint8_t auto_board = 0xFF, auto_info = 0xFF, won = 0x00;
+uint8_t auto_board = 0xFF, auto_info = 0xFF;
static void
append_to_gamelog(char *line, const uint8_t win_line) {
@@ -182,43 +182,49 @@ append_to_gamelog(char *line, const uint8_t win_line) {
static void
end_game(char *line, char *win) {
- won = 0xFF;
append_to_gamelog(line, 0);
append_to_gamelog(win, 1);
print_board();
puts("Game over:");
puts(gamelog);
- puts("\nEnter `new' to play again.");
+ putchar('\n');
}
static void
handle_turn(char *line) {
- if (won) {
- puts("Game over, enter `new' to play again.");
- } else {
- switch (do_ptn(line)) {
- // Errors
- case PTN_INVALID : { puts("Invalid PTN."); break; }
- case ACT_ILLEGAL : { puts("Illegal action."); break; }
- case ACT_OVERFLOW : {
- puts("Move would cause internal overflow, select another.");
- break;
- }
- // Valid, append to game log
- case PTN_VALID:
- case ACT_OK: {
- append_to_gamelog(line, 0);
- if (auto_info) print_info();
- if (auto_board) print_board();
- break;
+ // Track win state
+ uint8_t new_win = (won == -1);
+ switch (do_ptn(line)) {
+ // Errors
+ case PTN_INVALID: { puts("Invalid PTN."); break; }
+ case ACT_ILLEGAL: { puts("Illegal action."); break; }
+ case ACT_OVERFLOW: {
+ puts("Move would cause internal overflow, select another.");
+ break;
+ }
+ // Game has ended
+ case GAME_END: {
+ // Did it end this turn?
+ if (new_win) {
+ switch (won) {
+ case WIN_DRAGON: { end_game(line,"R-R"); break; }
+ case WIN_DRAW: { end_game(line,"1/2-1/2"); break; }
+ case WIN_FLAT_BLACK: { end_game(line,"0-F"); break; }
+ case WIN_FLAT_WHITE: { end_game(line,"F-0"); break; }
+ case WIN_ROAD_BLACK: { end_game(line,"0-R"); break; }
+ case WIN_ROAD_WHITE: { end_game(line,"R-0"); break; }
+ }
}
- // A win
- case WIN_DRAGON: { end_game(line,"R-R"); break; }
- case WIN_DRAW: { end_game(line,"1/2-1/2"); break; }
- case WIN_FLAT_BLACK: { end_game(line,"0-F"); break; }
- case WIN_FLAT_WHITE: { end_game(line,"F-0"); break; }
- case WIN_ROAD_BLACK: { end_game(line,"0-R"); break; }
- case WIN_ROAD_WHITE: { end_game(line,"R-0"); break; }
+ puts("Game over, enter `new' to play again.");
+ break;
+ }
+ // Valid, append to game log
+ case PTN_VALID:
+ case ACT_OK: {
+ append_to_gamelog(line, 0);
+ if (auto_info) print_info();
+ if (auto_board) print_board();
+ break;
}
}
}
@@ -226,7 +232,6 @@ handle_turn(char *line) {
static void
new_game(uint8_t size) {
reset_state(size);
- won = 0x00;
printf("New %dx%d game!\n",size,size);
if (gamelog) gamelog = realloc(gamelog, sizeof(char));
else gamelog = malloc(sizeof(char));