From 39cd06e8f3309e0028233d5824c000cad611e802 Mon Sep 17 00:00:00 2001 From: sherl Date: Tue, 28 Jan 2025 00:05:48 +0100 Subject: [PATCH] audio feedback for wrong choice, ask the player repeatedly to pick a valid field also prepared helper functions for checking if there is a possible move --- Chinczyk188/Board.cpp | 3 +- Chinczyk188/Engine.cpp | 53 +++++++++++++++--- Chinczyk188/Engine.hpp | 4 ++ Chinczyk188/res/audio/timgormly_incorrect.ogg | Bin 0 -> 6899 bytes 4 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 Chinczyk188/res/audio/timgormly_incorrect.ogg diff --git a/Chinczyk188/Board.cpp b/Chinczyk188/Board.cpp index ca69324..ca3015d 100644 --- a/Chinczyk188/Board.cpp +++ b/Chinczyk188/Board.cpp @@ -225,7 +225,7 @@ void Board::selectAField(short &pickStatus, short &field) { sf::Vector2f mapped; - while (this->manualUpdate()) { + while (this->manualUpdate() && this->running()) { sf::Event currentEvent = this->lastEvent; switch (currentEvent.type) { @@ -233,7 +233,6 @@ void Board::selectAField(short &pickStatus, short &field) { case sf::Event::Closed: this->closeWindow(); // Zamknięcie okna powinno wyjść z tej pętli - pickStatus = 8; break; case sf::Event::MouseButtonPressed: diff --git a/Chinczyk188/Engine.cpp b/Chinczyk188/Engine.cpp index d1c8730..c20e216 100644 --- a/Chinczyk188/Engine.cpp +++ b/Chinczyk188/Engine.cpp @@ -24,6 +24,11 @@ Engine::Engine(): currentPlayerIndex(0) { std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego wygranej.\n\n"; this->tadaLoaded = false; } + + if (!this->invalidBuffer.openFromFile("res/audio/timgormly_incorrect.ogg")) { + std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego niepoprawnego wyboru.\n\n"; + this->invalidLoaded = false; + } } void Engine::addPlayer(const std::string& name, unsigned int seed, short color) { @@ -130,15 +135,17 @@ void Engine::nextTurn() { } break; - } else std::cout << "Podaj jedna z wymienionych odpowiedzi!\n> "; + } else { + std::cout << "Podaj jedna z wymienionych odpowiedzi!\n> "; + this->invalidBuffer.play(); + this->board.smartSleep(1000); + } } break; // 4 pionki na planszy - musi ruszyć pionek, o ile może case 4: - // TODO pickAPlace = true; - this->pawnmoveBuffer.play(); break; } @@ -181,7 +188,7 @@ void Engine::nextTurn() { } if (pickAPlace) { - std::cout << "Wybierz prosze pionek na planszy ktorym chcesz wykonac ruch.\n"; + std::cout << "Wybierz prosze pionek na planszy, ktorym chcesz wykonac ruch.\n"; } // Użytkownik wybiera pionek na planszy, którym chce się ruszyć @@ -199,7 +206,14 @@ void Engine::nextTurn() { if (pickAPlace) { moveResult = this->movePiece(currentPlayer.getColor(), selectedField, diceRoll); - if (!moveResult) std::cout << "Nie mozna wykonac tego ruchu.\n"; + if (!moveResult) { + std::cout << "Nie mozesz wykonac tego ruchu.\n"; + this->invalidBuffer.play(); + this->board.smartSleep(1000); + // Jeżeli błąd nie jest wywołany wyłączeniem gry, + // to poproś gracza o ponowny wybór ruchu + if (this->board.running()) pickStatus = 0; + } } else { // Nadpisz moveResult jeżeli gracz nie wybiera pionka moveResult = true; @@ -251,6 +265,32 @@ void Engine::nextTurn() { return; } +/** + * @brief Turn a field into the first pawn inside it. + * + * @param[in] color Player's color + * @param[in] field Given field + * + * @return Player's pawn ID, between 0 and 3. + */ +short Engine::fieldToFirstPawnId(short color, short field) { + // TODO + return 0; +} + +/** + * @brief Iterates through player's pawns to check if they can move. + * + * @param[in] color Player's color + * @param[in] steps Amount of steps + * + * @return Returns the number of pawns which can be moved given the step count. + */ +short Engine::checkPossibleMoves(short color, short steps) { + // TODO + return 0; +} + /** * @brief Returns the first pawn at a player's base. * @@ -258,7 +298,6 @@ void Engine::nextTurn() { * * @return The first pawn at base, or -1 if no pawns at base. */ - short Engine::getFirstPawnAtBase(short color) { for (int i = 0; i < 4; i++) { if (players[color].getRelativePawns()[i] == -1) { @@ -276,7 +315,6 @@ short Engine::getFirstPawnAtBase(short color) { * * @return The first pawn at base, or -1 if no pawns at base. */ - short Engine::getFirstPawnNotAtBase(short color) { for (int i = 0; i < 4; i++) { if (players[color].getRelativePawns()[i] != -1) { @@ -295,7 +333,6 @@ short Engine::getFirstPawnNotAtBase(short color) { * * @return Returns true on success, false on failure */ - short Engine::spawnPiece(short color, short pawnId) { short * relativePieces = players[color].getRelativePawns(); if (relativePieces[pawnId] == -1) { diff --git a/Chinczyk188/Engine.hpp b/Chinczyk188/Engine.hpp index ca3064c..fac3445 100644 --- a/Chinczyk188/Engine.hpp +++ b/Chinczyk188/Engine.hpp @@ -29,14 +29,18 @@ class Engine { bool movePiece(short color, short field, short steps); short getFirstPawnAtBase(short color); short getFirstPawnNotAtBase(short color); + short fieldToFirstPawnId(short color, short field); + short checkPossibleMoves(short color, short steps); // Audio bool dicerollLoaded = true; bool pawnmoveLoaded = true; bool tadaLoaded = true; + bool invalidLoaded = true; sf::Music dicerollBuffer; sf::Music pawnmoveBuffer; sf::Music tadaBuffer; + sf::Music invalidBuffer; // Pomocnicze std::string winnerNickname = ""; diff --git a/Chinczyk188/res/audio/timgormly_incorrect.ogg b/Chinczyk188/res/audio/timgormly_incorrect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fc55e09da7ed51f5798ec0fa02f911af84a9a7a1 GIT binary patch literal 6899 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 literal 0 HcmV?d00001