| 566 void gamestate_at_move(const GameState *gamestate, |
566 void gamestate_at_move(const GameState *gamestate, |
| 567 unsigned move_number, GameState *replay) { |
567 unsigned move_number, GameState *replay) { |
| 568 gamestate_init(replay); |
568 gamestate_init(replay); |
| 569 memcpy(&replay->info, &gamestate->info, sizeof(GameInfo)); |
569 memcpy(&replay->info, &gamestate->info, sizeof(GameInfo)); |
| 570 replay->review = true; |
570 replay->review = true; |
| 571 // TODO: respect move_start offset |
571 |
| |
572 if (gamestate->move_start > 0) { |
| |
573 replay->move_start = gamestate->move_start; |
| |
574 replay->fifty_cntr_start = gamestate->fifty_cntr_start; |
| |
575 free(replay->fen_start); |
| |
576 replay->fen_start = strdup(gamestate->fen_start); |
| |
577 } |
| |
578 |
| 572 if (move_number > gamestate->movecount) { |
579 if (move_number > gamestate->movecount) { |
| 573 move_number = gamestate->movecount; |
580 move_number = gamestate->movecount; |
| 574 } |
581 } |
| 575 for (unsigned i = 0 ; i < move_number ; i++) { |
582 for (unsigned i = 0 ; i < move_number ; i++) { |
| 576 apply_move(replay, &(gamestate->moves[i])); |
583 apply_move(replay, &(gamestate->moves[i])); |