src/chess/rules.c

changeset 33
866025982aa9
parent 29
c6a1ad6cf749
child 36
ebe0c961e9a6
     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, &currenttstamp);
    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 +}

mercurial