src/chess/rules.c

changeset 33
866025982aa9
parent 29
c6a1ad6cf749
child 36
ebe0c961e9a6
equal deleted inserted replaced
32:8a0b85303ee8 33:866025982aa9
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, &currenttstamp);
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 }

mercurial