void SEARCHER::do_move(const int& move) { int from = m_from(move),to = m_to(move),sq; /*remove captured piece*/ if(m_capture(move)) { if(is_ep(move)) { sq = to - pawn_dir[player]; } else { sq = to; } pcRemove(m_capture(move),sq); board[sq] = empty; } /*move piece*/ if(m_promote(move)) { board[to] = m_promote(move); board[from] = empty; pcAdd(m_promote(move),to); pcRemove(COMBINE(player,pawn),from); } else { board[to] = board[from]; board[from] = empty; pcSwap(from,to); } /*move castle*/ if(is_castle(move)) { int fromc,toc; if(to > from) { fromc = to + RR; toc = to + LL; } else { fromc = to + 2*LL; toc = to + RR; } board[toc] = board[fromc]; board[fromc] = empty; pcSwap(fromc,toc); } /*update current state*/ epsquare = 0; fifty++; if(DECOMB(player,m_piece(move)) == pawn) { fifty = 0; if(to - from == (2 * pawn_dir[player])) { epsquare = ((to + from) >> 1); }
/*init data*/ void SEARCHER::init_data() { register int i,sq,pic; ply = 0; pstack = stack + 0; for(i = wking;i < elephant;i++) { plist[i] = 0; } for(sq = A1;sq <= H8;sq++) { if(!(sq & 0x88)) { list[sq]->sq = sq; list[sq]->prev = 0; list[sq]->next = 0; pic = board[sq]; if(pic != empty) { pcAdd(pic,sq); } } } }