diff -r 02c509a44e98 -r 41017d0a72c5 src/chess/rules.c --- a/src/chess/rules.c Wed Jun 11 16:54:20 2014 +0200 +++ b/src/chess/rules.c Mon Jun 16 13:45:31 2014 +0200 @@ -44,6 +44,22 @@ return simulation; } +void gamestate_init(GameState *gamestate) { + memset(gamestate, 0, sizeof(GameState)); + + Board initboard = { + {WROOK, WKNIGHT, WBISHOP, WQUEEN, WKING, WBISHOP, WKNIGHT, WROOK}, + {WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN}, + {BROOK, BKNIGHT, BBISHOP, BQUEEN, BKING, BBISHOP, BKNIGHT, BROOK} + }; + memcpy(gamestate->board, initboard, sizeof(Board)); +} + void gamestate_cleanup(GameState *gamestate) { MoveList *elem; elem = gamestate->movelist; @@ -587,7 +603,7 @@ } } -int eval_move(GameState *gamestate, char *mstr, Move *move) { +int eval_move(GameState *gamestate, char *mstr, Move *move, uint8_t color) { memset(move, 0, sizeof(Move)); move->fromfile = POS_UNSPECIFIED; move->fromrow = POS_UNSPECIFIED; @@ -612,7 +628,7 @@ if (!move->promotion) { return INVALID_MOVE_SYNTAX; } else { - move->promotion |= gamestate->mycolor; + move->promotion |= color; len -= 2; mstr[len] = 0; } @@ -629,7 +645,7 @@ move->piece = KING; move->fromfile = fileidx('e'); move->tofile = fileidx('g'); - move->fromrow = move->torow = gamestate->mycolor == WHITE ? 0 : 7; + move->fromrow = move->torow = color == WHITE ? 0 : 7; } else { /* move (e.g. "Nf3") */ move->piece = getpiece(mstr[0]); @@ -664,7 +680,7 @@ move->piece = KING; move->fromfile = fileidx('e'); move->tofile = fileidx('c'); - move->fromrow = move->torow = gamestate->mycolor == WHITE ? 0 : 7; + move->fromrow = move->torow = color == WHITE ? 0 : 7; } else { move->piece = getpiece(mstr[0]); if (mstr[2] == 'x') { @@ -701,12 +717,12 @@ if (move->piece) { if (move->piece == PAWN - && move->torow == (gamestate->mycolor==WHITE?7:0) + && move->torow == (color==WHITE?7:0) && !move->promotion) { return NEED_PROMOTION; } - move->piece |= gamestate->mycolor; + move->piece |= color; if (move->fromfile == POS_UNSPECIFIED || move->fromrow == POS_UNSPECIFIED) { return getlocation(gamestate, move);