src/chess/pgn.c

changeset 98
9cb41383540f
parent 88
e4a648fe6ce7
--- 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) {

mercurial