shithub: moonfish

Download patch

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);
--