| 248 year, month, day); |
248 year, month, day); |
| 249 } |
249 } |
| 250 return date; |
250 return date; |
| 251 } |
251 } |
| 252 |
252 |
| |
253 const char *pgn_player_name(GameState *gamestate, uint8_t color) { |
| |
254 const char *name = color == WHITE ? gamestate->wname : gamestate->bname; |
| |
255 return name[0] != '\0' ? name : "Anonymous"; |
| |
256 } |
| |
257 |
| 253 void write_pgn(FILE* stream, GameState *gamestate, GameInfo *gameinfo, |
258 void write_pgn(FILE* stream, GameState *gamestate, GameInfo *gameinfo, |
| 254 bool export_comments) { |
259 bool export_comments) { |
| 255 /* STR tag pairs */ |
260 /* STR tag pairs */ |
| 256 fprintf(stream, "[Event \"%s\"]\n", "terminal-chess game"); |
261 fprintf(stream, "[Event \"%s\"]\n", "terminal-chess game"); |
| 257 fprintf(stream, "[Site \"%s\"]\n", "Somewhere on Earth"); |
262 fprintf(stream, "[Site \"%s\"]\n", "Somewhere on Earth"); |
| 258 fprintf(stream, "[Date \"%s\"]\n", pgn_date(gamestate)); |
263 fprintf(stream, "[Date \"%s\"]\n", pgn_date(gamestate)); |
| 259 fprintf(stream, "[Round \"%s\"]\n", "-"); |
264 fprintf(stream, "[Round \"%s\"]\n", "-"); |
| 260 // TODO: maybe allow players to enter their names before game starts |
265 fprintf(stream, "[White \"%s\"]\n", pgn_player_name(gamestate, WHITE)); |
| 261 fprintf(stream, "[White \"%s\"]\n", "Anonymous"); |
266 fprintf(stream, "[Black \"%s\"]\n", pgn_player_name(gamestate, BLACK)); |
| 262 fprintf(stream, "[Black \"%s\"]\n", "Anonymous"); |
|
| 263 |
267 |
| 264 char *result; |
268 char *result; |
| 265 if (gamestate->stalemate || gamestate->remis) { |
269 if (gamestate->stalemate || gamestate->remis) { |
| 266 result = "1/2-1/2"; |
270 result = "1/2-1/2"; |
| 267 } else if (gamestate->wresign) { |
271 } else if (gamestate->wresign) { |