45 static void addmove(GameState* gamestate, Move *move) { |
45 static void addmove(GameState* gamestate, Move *move) { |
46 MoveList *elem = malloc(sizeof(MoveList)); |
46 MoveList *elem = malloc(sizeof(MoveList)); |
47 elem->next = NULL; |
47 elem->next = NULL; |
48 elem->move = *move; |
48 elem->move = *move; |
49 |
49 |
|
50 clock_gettime(CLOCK_REALTIME, &(elem->move.timestamp)); |
|
51 |
50 if (gamestate->lastmove) { |
52 if (gamestate->lastmove) { |
|
53 struct timespec *lasttstamp = &(gamestate->lastmove->move.timestamp); |
|
54 time_t sec = elem->move.timestamp.tv_sec - lasttstamp->tv_sec; |
|
55 long int nanos; |
|
56 if (elem->move.timestamp.tv_nsec < lasttstamp->tv_nsec) { |
|
57 nanos = 1e9L-(lasttstamp->tv_nsec - elem->move.timestamp.tv_nsec); |
|
58 sec--; |
|
59 } else { |
|
60 nanos = elem->move.timestamp.tv_nsec - lasttstamp->tv_nsec; |
|
61 } |
|
62 |
|
63 elem->move.movetime.tv_sec = sec; |
|
64 elem->move.movetime.tv_nsec = nanos; |
|
65 |
51 gamestate->lastmove->next = elem; |
66 gamestate->lastmove->next = elem; |
52 gamestate->lastmove = elem; |
67 gamestate->lastmove = elem; |
53 } else { |
68 } else { |
|
69 elem->move.movetime.tv_nsec = 0; |
|
70 elem->move.movetime.tv_sec = 0; |
54 gamestate->movelist = gamestate->lastmove = elem; |
71 gamestate->movelist = gamestate->lastmove = elem; |
55 } |
72 } |
56 } |
73 } |
57 |
74 |
58 char getpiecechr(uint8_t piece) { |
75 char getpiecechr(uint8_t piece) { |
522 return 0; |
539 return 0; |
523 } else { |
540 } else { |
524 return 0; |
541 return 0; |
525 } |
542 } |
526 } |
543 } |
|
544 |
|
545 uint16_t remaining_movetime(GameInfo *gameinfo, GameState *gamestate, |
|
546 uint8_t color) { |
|
547 if (!gameinfo->timecontrol) { |
|
548 return 0; |
|
549 } |
|
550 |
|
551 if (gamestate->movelist) { |
|
552 uint16_t time = gameinfo->time; |
|
553 long int nanos = 0; |
|
554 |
|
555 MoveList *movelist = color == WHITE ? |
|
556 gamestate->movelist : gamestate->movelist->next; |
|
557 |
|
558 while (movelist) { |
|
559 time += gameinfo->addtime; |
|
560 |
|
561 struct timespec *movetime = &(movelist->move.movetime); |
|
562 if (movetime->tv_sec >= time) { |
|
563 return 0; |
|
564 } |
|
565 |
|
566 time -= movetime->tv_sec; |
|
567 nanos += movetime->tv_nsec; |
|
568 |
|
569 movelist = movelist->next ? movelist->next->next : NULL; |
|
570 } |
|
571 |
|
572 time_t sec; |
|
573 movelist = gamestate->lastmove; |
|
574 if ((movelist->move.piece & COLOR_MASK) != color) { |
|
575 struct timespec *lastmovetstamp = &(movelist->move.timestamp); |
|
576 struct timespec currenttstamp; |
|
577 clock_gettime(CLOCK_REALTIME, ¤ttstamp); |
|
578 nanos += currenttstamp.tv_nsec - lastmovetstamp->tv_nsec; |
|
579 sec = currenttstamp.tv_sec - lastmovetstamp->tv_sec; |
|
580 if (sec >= time) { |
|
581 return 0; |
|
582 } |
|
583 |
|
584 time -= sec; |
|
585 } |
|
586 |
|
587 sec = nanos / 1e9L; |
|
588 |
|
589 if (sec >= time) { |
|
590 return 0; |
|
591 } |
|
592 |
|
593 time -= sec; |
|
594 |
|
595 return time; |
|
596 } else { |
|
597 return gameinfo->time; |
|
598 } |
|
599 } |