src/chess/rules.c

changeset 40
47162a7621da
parent 36
ebe0c961e9a6
child 47
d726e4b46c33
equal deleted inserted replaced
39:4d3d398ba689 40:47162a7621da
46 static void addmove(GameState* gamestate, Move *move) { 46 static void addmove(GameState* gamestate, Move *move) {
47 MoveList *elem = malloc(sizeof(MoveList)); 47 MoveList *elem = malloc(sizeof(MoveList));
48 elem->next = NULL; 48 elem->next = NULL;
49 elem->move = *move; 49 elem->move = *move;
50 50
51 gettimeofday(&(elem->move.timestamp), NULL); 51 struct timeval curtimestamp;
52 gettimeofday(&curtimestamp, NULL);
53 elem->move.timestamp.tv_sec = curtimestamp.tv_sec;
54 elem->move.timestamp.tv_usec = curtimestamp.tv_usec;
52 55
53 if (gamestate->lastmove) { 56 if (gamestate->lastmove) {
54 struct timeval *lasttstamp = &(gamestate->lastmove->move.timestamp); 57 struct movetimeval *lasttstamp = &(gamestate->lastmove->move.timestamp);
55 time_t sec = elem->move.timestamp.tv_sec - lasttstamp->tv_sec; 58 uint64_t sec = curtimestamp.tv_sec - lasttstamp->tv_sec;
56 suseconds_t micros; 59 suseconds_t micros;
57 if (elem->move.timestamp.tv_usec < lasttstamp->tv_usec) { 60 if (curtimestamp.tv_usec < lasttstamp->tv_usec) {
58 micros = 1e6L-(lasttstamp->tv_usec - elem->move.timestamp.tv_usec); 61 micros = 1e6L-(lasttstamp->tv_usec - curtimestamp.tv_usec);
59 sec--; 62 sec--;
60 } else { 63 } else {
61 micros = elem->move.timestamp.tv_usec - lasttstamp->tv_usec; 64 micros = curtimestamp.tv_usec - lasttstamp->tv_usec;
62 } 65 }
63 66
64 elem->move.movetime.tv_sec = sec; 67 elem->move.movetime.tv_sec = sec;
65 elem->move.movetime.tv_usec = micros; 68 elem->move.movetime.tv_usec = micros;
66 69
557 gamestate->movelist : gamestate->movelist->next; 560 gamestate->movelist : gamestate->movelist->next;
558 561
559 while (movelist) { 562 while (movelist) {
560 time += gameinfo->addtime; 563 time += gameinfo->addtime;
561 564
562 struct timeval *movetime = &(movelist->move.movetime); 565 struct movetimeval *movetime = &(movelist->move.movetime);
563 if (movetime->tv_sec >= time) { 566 if (movetime->tv_sec >= time) {
564 return 0; 567 return 0;
565 } 568 }
566 569
567 time -= movetime->tv_sec; 570 time -= movetime->tv_sec;
571 } 574 }
572 575
573 time_t sec; 576 time_t sec;
574 movelist = gamestate->lastmove; 577 movelist = gamestate->lastmove;
575 if ((movelist->move.piece & COLOR_MASK) != color) { 578 if ((movelist->move.piece & COLOR_MASK) != color) {
576 struct timeval *lastmovetstamp = &(movelist->move.timestamp); 579 struct movetimeval *lastmovetstamp = &(movelist->move.timestamp);
577 struct timeval currenttstamp; 580 struct timeval currenttstamp;
578 gettimeofday(&currenttstamp, NULL); 581 gettimeofday(&currenttstamp, NULL);
579 micros += currenttstamp.tv_usec - lastmovetstamp->tv_usec; 582 micros += currenttstamp.tv_usec - lastmovetstamp->tv_usec;
580 sec = currenttstamp.tv_sec - lastmovetstamp->tv_sec; 583 sec = currenttstamp.tv_sec - lastmovetstamp->tv_sec;
581 if (sec >= time) { 584 if (sec >= time) {

mercurial