diff --git a/Board.cpp b/Board.cpp index 38eaed5..68f61bf 100644 --- a/Board.cpp +++ b/Board.cpp @@ -89,22 +89,17 @@ void Board::setupInitialPosition() { return; } -int setupFromFEN(std::string strFEN) { +int Board::setupFromFEN(std::string strFEN) { std::vector splitFEN = split(strFEN, ' '); - if(splitFEN.size() != 6) // a valid FEN *must* contain 6 fields + if(splitFEN.size() != 6) // a valid FEN *must* contain 6 fields return -1; + // ====== START OF FIELD 1 ====== std::vector splitField1 = split(splitFEN[0], '/'); int rank = 0, file = 0; int skip = 0; bool wKingPlaced = false, bKingPlaced = false; for(auto &ranks : splitField1) { for(auto &sym : ranks) { - if(skip) { - boardGrid[rank][file] = nullptr; // remove reference - skip--; - file++; - continue; - } switch(sym) { case 'R': // white rook @@ -173,17 +168,62 @@ int setupFromFEN(std::string strFEN) { case '5': case '6': case '7': - case '8': - case '9': - skip = atoi(sym); + case '8': { + std::string skipStr(1, sym); + skip = atoi(skipStr.c_str()); + skip--; // fix off by 1 error + do { + boardGrid[rank][file] = nullptr; // remove reference + file = (file < 8) ? file + 1 : 0; + } while(--skip); break; + } default: // invalid character? return -1; + break; } file++; + if(file > 7) { + file = 0; + break; + } } rank++; + if(rank > 7) + break; + } + // ======= END OF FIELD 1 ====== + // ======= START OF FIELD 2 ====== + std::string w = "w"; + std::string b = "b"; + if(splitFEN[1] == w) + playerTurn = PL_WHITE; + else if(splitFEN[1] == b) + playerTurn = PL_BLACK; + else { + // invalid FEN + return -1; + } + // ====== END OF FIELD 2 ====== + // ====== START OF FIELD 3 ====== + std::string k = "k", K = "K", q = "q", Q = "Q"; + if(splitFEN[2] == "-") { + // nobody can castle, either side + // locate Kings and set appropriate variables + // canCastleKS, canCastleQS + } + if(splitFEN[2].find(k) != std::string::npos) { + // black king can castle kingside + } + if(splitFEN[2].find(K) != std::string::npos) { + // white king can castle kingside + } + if(splitFEN[2].find(q) != std::string::npos) { + // black king can castle queenside + } + if(splitFEN[2].find(Q) != std::string::npos) { + // white king can castle queenside } return 0; } @@ -198,4 +238,8 @@ void Board::deserializeBoard(uint64_t incomingBoard) { boardRows[i] = (incomingBoard >> (8 * i)) & 0xFF; // how do we then figure out what has moved? return; +} + +std::unique_ptr &Board::getPieceAt(Square square) { + return boardGrid[square.rank][square.file]; } \ No newline at end of file