1.1 --- a/src/chess/rules.c Wed Apr 09 09:34:07 2014 +0200 1.2 +++ b/src/chess/rules.c Wed Apr 09 11:12:04 2014 +0200 1.3 @@ -47,10 +47,27 @@ 1.4 elem->next = NULL; 1.5 elem->move = *move; 1.6 1.7 + clock_gettime(CLOCK_REALTIME, &(elem->move.timestamp)); 1.8 + 1.9 if (gamestate->lastmove) { 1.10 + struct timespec *lasttstamp = &(gamestate->lastmove->move.timestamp); 1.11 + time_t sec = elem->move.timestamp.tv_sec - lasttstamp->tv_sec; 1.12 + long int nanos; 1.13 + if (elem->move.timestamp.tv_nsec < lasttstamp->tv_nsec) { 1.14 + nanos = 1e9L-(lasttstamp->tv_nsec - elem->move.timestamp.tv_nsec); 1.15 + sec--; 1.16 + } else { 1.17 + nanos = elem->move.timestamp.tv_nsec - lasttstamp->tv_nsec; 1.18 + } 1.19 + 1.20 + elem->move.movetime.tv_sec = sec; 1.21 + elem->move.movetime.tv_nsec = nanos; 1.22 + 1.23 gamestate->lastmove->next = elem; 1.24 gamestate->lastmove = elem; 1.25 } else { 1.26 + elem->move.movetime.tv_nsec = 0; 1.27 + elem->move.movetime.tv_sec = 0; 1.28 gamestate->movelist = gamestate->lastmove = elem; 1.29 } 1.30 } 1.31 @@ -524,3 +541,59 @@ 1.32 return 0; 1.33 } 1.34 } 1.35 + 1.36 +uint16_t remaining_movetime(GameInfo *gameinfo, GameState *gamestate, 1.37 + uint8_t color) { 1.38 + if (!gameinfo->timecontrol) { 1.39 + return 0; 1.40 + } 1.41 + 1.42 + if (gamestate->movelist) { 1.43 + uint16_t time = gameinfo->time; 1.44 + long int nanos = 0; 1.45 + 1.46 + MoveList *movelist = color == WHITE ? 1.47 + gamestate->movelist : gamestate->movelist->next; 1.48 + 1.49 + while (movelist) { 1.50 + time += gameinfo->addtime; 1.51 + 1.52 + struct timespec *movetime = &(movelist->move.movetime); 1.53 + if (movetime->tv_sec >= time) { 1.54 + return 0; 1.55 + } 1.56 + 1.57 + time -= movetime->tv_sec; 1.58 + nanos += movetime->tv_nsec; 1.59 + 1.60 + movelist = movelist->next ? movelist->next->next : NULL; 1.61 + } 1.62 + 1.63 + time_t sec; 1.64 + movelist = gamestate->lastmove; 1.65 + if ((movelist->move.piece & COLOR_MASK) != color) { 1.66 + struct timespec *lastmovetstamp = &(movelist->move.timestamp); 1.67 + struct timespec currenttstamp; 1.68 + clock_gettime(CLOCK_REALTIME, ¤ttstamp); 1.69 + nanos += currenttstamp.tv_nsec - lastmovetstamp->tv_nsec; 1.70 + sec = currenttstamp.tv_sec - lastmovetstamp->tv_sec; 1.71 + if (sec >= time) { 1.72 + return 0; 1.73 + } 1.74 + 1.75 + time -= sec; 1.76 + } 1.77 + 1.78 + sec = nanos / 1e9L; 1.79 + 1.80 + if (sec >= time) { 1.81 + return 0; 1.82 + } 1.83 + 1.84 + time -= sec; 1.85 + 1.86 + return time; 1.87 + } else { 1.88 + return gameinfo->time; 1.89 + } 1.90 +}