--- a/src/chess/pgn.c Sat Apr 04 12:35:59 2026 +0200 +++ b/src/chess/pgn.c Sat Apr 04 13:25:47 2026 +0200 @@ -186,8 +186,8 @@ if (gamestate->stalemate || gamestate->remis) { result = "1/2-1/2"; } else if (gamestate->checkmate || gamestate->resign) { - if (gamestate->lastmove) { - result = (gamestate->lastmove->move.piece & COLOR_MASK) == WHITE ? + if (gamestate->movecount > 0) { + result = (last_move(gamestate).piece & COLOR_MASK) == WHITE ? "1-0" : "0-1"; } else { result = "0-1"; @@ -198,20 +198,18 @@ fprintf(stream, "[Result \"%s\"]\n\n", result); /* moves */ - int i = 1; - for (MoveList *movelist = gamestate->movelist ; - movelist ; movelist = movelist->next) { + for (unsigned i = 0 ; i < gamestate->movecount ; i++) { - if (++i % 2 == 0) { - fprintf(stream, "%d. %s", i/2, movelist->move.string); + if (i % 2 == 0) { + fprintf(stream, "%d. %s", 1+i/2, gamestate->moves[i].string); } else { - fprintf(stream, " %s", movelist->move.string); + fprintf(stream, "%s", gamestate->moves[i].string); } // TODO: move time and maybe other comments - /* line break every 10 moves */ - if ((i-1) % 20) { + /* line break every 10 half-moves */ + if ((i+1) % 10) { fputc(' ', stream); } else { fputc('\n', stream); @@ -268,8 +266,8 @@ } static size_t fen_color(char *str, GameState *gamestate) { - uint8_t color = opponent_color(gamestate->lastmove ? - (gamestate->lastmove->move.piece & COLOR_MASK) : BLACK); + uint8_t color = opponent_color(gamestate->movecount > 0 ? + (last_move(gamestate).piece & COLOR_MASK) : BLACK); str[0] = color == WHITE ? 'w' : 'b'; @@ -278,13 +276,12 @@ static bool fen_castling_chkmoved(GameState *gamestate, uint8_t row, uint8_t file) { - - MoveList *ml = gamestate->movelist; - while (ml) { - if (ml->move.fromfile == file && ml->move.fromrow == row) { + + for (unsigned i = 0 ; i < gamestate->movecount ; i++) { + if (gamestate->moves[i].fromfile == file + && gamestate->moves[i].fromrow == row) { return true; } - ml = ml->next; } return false; @@ -335,37 +332,21 @@ } static size_t fen_halfmove(char *str, GameState *gamestate) { - - unsigned int i = 0; - for (MoveList *move = gamestate->movelist ; move ; move = move->next) { - if (move->move.capture || (move->move.piece & PIECE_MASK) == PAWN) { - i = 0; + unsigned int hm = 0; + for (unsigned int i = 0; i < gamestate->movecount; i++) { + if (gamestate->moves[i].capture + || (gamestate->moves[i].piece & PIECE_MASK) == PAWN) { + hm = 0; } else { - i++; + hm++; } } - - char m[8]; - size_t len = sprintf(m, "%u", i); - memcpy(str, m, len); - - return len; + + return sprintf(str, "%u", hm); } static size_t fen_movenr(char *str, GameState *gamestate) { - - MoveList *move = gamestate->movelist; - unsigned int i = 1; - while (move) { - i++; - move = move->next; - } - - char m[8]; - size_t len = sprintf(m, "%u", i); - memcpy(str, m, len); - - return len; + return sprintf(str, "%u", gamestate->movecount); } void compute_fen(char *str, GameState *gamestate) {