void King::listMoves(vector<Move *> *mList) { Piece *p; unsigned int castlingFlags = pulchess_board->castlingFlags; // mosse normali // for(int i=-1; i<2; i++) { for(int j=-1; j<2; j++) { if( !COORDSOK(x+i, y+j) ) continue; if(i==0 && j==0) continue; p = pulchess_board->GetPiece(x+i, y+j); // se esiste una pedina nel posto scelto, ed e' del colore opposto // oppure se la casella prescelta e' vuota, allora e' una mossa valida. if( p != NULL && IsEnemy(p) ) { mList->push_back( new Move( xy2pos(x+i,y+j), pos, 1) ); } else if( p == NULL) { mList->push_back( new Move( xy2pos(x+i,y+j), pos, 0) ); } } } // Kingside castling // if( //moveCount == 0 && (( colour == WHITE && (castlingFlags&CASTLING_WHITE_K) ) || ( colour == BLACK && (castlingFlags&CASTLING_BLACK_K) )) && pulchess_board->GetPiece(pos+1) == NULL && pulchess_board->GetPiece(pos+2) == NULL ) { p = pulchess_board->GetPiece(pos+3); if( p != NULL && p->GetKind() == PIECE_ROOK && //p->moveCount == 0 && !pulchess_board->CanEatThis(pos+1, colour) && !pulchess_board->CanEatThis(pos+2, colour) ) { mList->push_back( new CastlingMove(KINGSIDE_CASTLING, colour) ); } } // Queenside castling // if(( ( colour == WHITE && (castlingFlags&CASTLING_WHITE_Q) ) || ( colour == BLACK && (castlingFlags&CASTLING_BLACK_Q) ) ) && pulchess_board->GetPiece(pos-1) == NULL && pulchess_board->GetPiece(pos-2) == NULL && pulchess_board->GetPiece(pos-3) == NULL ) { if( !pulchess_board->CanEatThis(pos-1, colour) && !pulchess_board->CanEatThis(pos-2, colour) ) { mList->push_back( new CastlingMove(QUEENSIDE_CASTLING, colour) ); } } }