diff --git a/cpp/src/controller/manual.cpp b/cpp/src/controller/manual.cpp index 3e99c4e..0f714b4 100644 --- a/cpp/src/controller/manual.cpp +++ b/cpp/src/controller/manual.cpp @@ -51,6 +51,14 @@ void ManualController::show_legal_moves(Coords xy) { } void ManualController::make_move(Move move) { + // handle promotion before making the move + Colour colour = board.white_to_play ? White : Black; + Coords source = Coords::from_index(move.source_square); + Piece promotion_piece = Piece::None; + if (board.piece_at(move.source_square) == Piece::Pawn + && board.colour_at(move.source_square) == White && source.y == 6) + promotion_piece = (Piece) (colour | view.ask_about_promotion()); + move.promoting_to = promotion_piece; board = board.make_move(move); reset_selection(); diff --git a/cpp/src/main.cpp b/cpp/src/main.cpp index a7c1777..ada2f49 100644 --- a/cpp/src/main.cpp +++ b/cpp/src/main.cpp @@ -11,11 +11,9 @@ #include int main(int argc, char* argv[]) { - std::string pos = - "r2qkb1r/2p1pppp/p1n1b3/1p6/B2P4/2P1P3/P4PPP/R1BQK1NR w KQkq - 0 9 "; // std::string pos = - // "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 4 3 - // "; + // "r2qkb1r/2p1pppp/p1n1b3/1p6/B2P4/2P1P3/P4PPP/R1BQK1NR w KQkq - 0 9 "; + std::string pos = "8/6K1/5P2/8/1k6/8/8/8 w - - 0 1"; // pos for ai timing< // std::string pos = diff --git a/cpp/src/view/gui.cpp b/cpp/src/view/gui.cpp index a80ddd1..97418af 100644 --- a/cpp/src/view/gui.cpp +++ b/cpp/src/view/gui.cpp @@ -134,6 +134,81 @@ void GUI::draw_pieces(const Board& board) { } } +int GUI::show_popup( + const std::string& message, const std::vector& options +) { + sf::RenderWindow popup(sf::VideoMode(300, 200), "Choice"); + sf::Font font; + + if (!font.loadFromFile("res/arial.ttf")) { + std::cerr << "Error: Could not load font!" << std::endl; + return -1; + } + + sf::Text text(message, font, 20); + text.setPosition(20, 20); + text.setFillColor(sf::Color::Black); + + std::vector buttonShapes; + std::vector buttonTexts; + + for (size_t i = 0; i < options.size(); ++i) { + sf::RectangleShape button(sf::Vector2f(200, 30)); + button.setPosition(50, 70 + i * 40); + button.setFillColor(sf::Color(150, 150, 150)); + buttonShapes.push_back(button); + + sf::Text buttonText(options[i], font, 18); + buttonText.setPosition(60, 75 + i * 40); + buttonText.setFillColor(sf::Color::Black); + buttonTexts.push_back(buttonText); + } + + while (popup.isOpen()) { + sf::Event event; + while (popup.pollEvent(event)) { + if (event.type == sf::Event::Closed) + popup.close(); + else if (event.type == sf::Event::MouseButtonPressed) { + for (size_t i = 0; i < buttonShapes.size(); ++i) { + if (buttonShapes[i].getGlobalBounds().contains( + event.mouseButton.x, + event.mouseButton.y + )) { + popup.close(); + return i; + } + } + } + } + + popup.clear(sf::Color::White); + popup.draw(text); + for (size_t i = 0; i < buttonShapes.size(); ++i) { + popup.draw(buttonShapes[i]); + popup.draw(buttonTexts[i]); + } + popup.display(); + } + return -1; +} + +Piece GUI::ask_about_promotion() { + std::vector options = {"Queen", "Rook", "Bishop", "Knight"}; + int idx = show_popup("Please choose a promotion for your pawn", options); + switch (idx) { + case 0: + return Queen; + case 1: + return Rook; + case 2: + return Bishop; + case 3: + return Knigt; + }; + return Piece::None; +} + void GUI::show() { while (window.isOpen()) handle_events(); diff --git a/cpp/src/view/gui.hpp b/cpp/src/view/gui.hpp index d134084..ca04796 100644 --- a/cpp/src/view/gui.hpp +++ b/cpp/src/view/gui.hpp @@ -15,6 +15,7 @@ class GUI : public View { GUI(); void show() override; + Piece ask_about_promotion(); void update_board(const Board&, int8_t, std::vector) override; void notify_checkmate(Colour) override; void notify_stalemate(Colour) override; @@ -27,6 +28,10 @@ class GUI : public View { sf::Color colours[2] = {sf::Color(0xB88762FF), sf::Color(0xEDD6B0FF)}; sf::Color alt_colours[2] = {sf::Color(0xDCC34BFF), sf::Color(0xF6EB72FF)}; + + int show_popup( + const std::string& message, const std::vector& options + ); void load_textures(); void handle_events(); void handle_click(int, int); diff --git a/cpp/src/view/view.hpp b/cpp/src/view/view.hpp index 3713d2b..1649a80 100644 --- a/cpp/src/view/view.hpp +++ b/cpp/src/view/view.hpp @@ -15,6 +15,7 @@ class View { } virtual void show() = 0; + virtual Piece ask_about_promotion() = 0; virtual void update_board(const Board&, int8_t, std::vector) = 0; virtual void notify_checkmate(Colour) = 0; virtual void notify_stalemate(Colour) = 0;