ref: 4d10a9f000eaf678308e19270e0f1a1ef107ae63
parent: 5b84fda237d70d33baac4bcb3c77507b93ea3cc5
author: zamfofex <zamfofex@twdb.moe>
date: Sat Apr 6 16:59:27 EDT 2024
improve FEN generation
--- a/chess.c
+++ b/chess.c
@@ -858,18 +858,26 @@
{int x, y;
unsigned char piece;
+ int count;
for (y = 7 ; y >= 0 ; y--)
{+ count = 0;
for (x = 0 ; x < 8 ; x++)
{piece = chess->board[(x + 1) + (y + 2) * 10];
if (piece == moonfish_empty)
{- *fen++ = '1';
+ count++;
continue;
}
+ if (count != 0)
+ {+ *fen++ = '0' + count;
+ count = 0;
+ }
+
switch (piece % 16)
{default:
@@ -898,10 +906,33 @@
fen++;
}
+ if (count != 0) *fen++ = '0' + count;
+
*fen++ = '/';
}
- fen[-1] = 0;
+ fen--;
+
+ *fen++ = ' ';
+ if (chess->white) *fen++ = 'w';
+ else *fen++ = 'b';
+ *fen++ = ' ';
+
+ if (chess->castle.white_oo) *fen++ = 'K';
+ if (chess->castle.white_ooo) *fen++ = 'Q';
+ if (chess->castle.black_oo) *fen++ = 'k';
+ if (chess->castle.black_ooo) *fen++ = 'q';
+ if (fen[-1] == ' ') *fen++ = '-';
+
+ *fen++ = ' ';
+ if (chess->passing)
+ {+ *fen++ = 'a' + chess->passing % 10 - 1;
+ *fen++ = '1' + chess->passing / 10 - 2;
+ }
+
+ if (fen[-1] == ' ') *fen++ = '-';
+ *fen = 0;
}
void moonfish_to_san(struct moonfish_chess *chess, char *name, struct moonfish_move *move)
--- a/tools/chat.c
+++ b/tools/chat.c
@@ -170,6 +170,7 @@
char *names, *name0;
char fen[128];
char *password;
+ int i;
moonfish_chess(&chess);
@@ -252,6 +253,9 @@
moonfish_chess(&chess);
fprintf(in, "ucinewgame\n");
+ for (i = 0 ; fen[i] != 0 ; i++)
+ if (fen[i] == ' ') fen[i] = '_';
+
moonfish_write_text(argv0, tls, "PRIVMSG ");
moonfish_write_text(argv0, tls, channel);
moonfish_write_text(argv0, tls, " :https://lichess.org/export/fen.gif?fen=");
@@ -302,6 +306,9 @@
moonfish_to_san(&chess, name, &move);
moonfish_play(&chess, &move);
moonfish_to_fen(&chess, fen);
+
+ for (i = 0 ; fen[i] != 0 ; i++)
+ if (fen[i] == ' ') fen[i] = '_';
moonfish_write_text(argv0, tls, "PRIVMSG ");
moonfish_write_text(argv0, tls, channel);
--
⑨