diff --git a/Chinczyk188/Engine.cpp b/Chinczyk188/Engine.cpp index 79000dc..c6ddb17 100644 --- a/Chinczyk188/Engine.cpp +++ b/Chinczyk188/Engine.cpp @@ -18,6 +18,11 @@ Engine::Engine(): currentPlayerIndex(0) { std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego ruchu pionkow.\n\n"; this->pawnmoveLoaded = false; } + + if (!this->tadaBuffer.openFromFile("res/audio/jimhancock_tada.ogg")) { + std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego wygranej.\n\n"; + this->tadaLoaded = false; + } } void Engine::addPlayer(const std::string& name, unsigned int seed, short color) { @@ -58,89 +63,111 @@ void Engine::nextTurn() { bool pickAPlace = false; // Wylosowanie szóstki to specjalny przypadek if (diceRoll == 6) { - if (currentPlayer.pawnsActive == 0) { - // Musi wyjść pionkiem - std::cout << currentPlayer.getName() << " wychodzi pierwszym pionkiem z bazy.\n"; - currentPlayer.pawnsAtBase--; - currentPlayer.pawnsActive++; - this->pawnmoveBuffer.play(); - this->board.smartSleep(2000); - } else if (currentPlayer.pawnsActive > 0 && currentPlayer.pawnsActive < 4) { - // Może wyjść z bazy albo ruszyć pionek - std::string choice; + std::string choice; + switch (currentPlayer.pawnsActive) { - std::cout << "Co chcesz zrobic?\n"; - std::cout << "a) Wyjsc pionkiem z bazy\n" - << "b) Wykonac ruch wyciagnietym wczesniej pionkiem\n" - << "> "; + // 0 pionków na planszy - musi wyjść pionkiem + case 0: + std::cout << currentPlayer.getName() << " wychodzi pierwszym pionkiem z bazy.\n"; + currentPlayer.pawnsAtBase--; + currentPlayer.pawnsActive++; + this->pawnmoveBuffer.play(); + this->board.smartSleep(2000); + break; - while (true) { + // 1, 2, 3 pionki na planszy - może wyjść z bazy albo ruszyć pionek + case 1: case 2: case 3: - // Czyścimy bufor, aby zignorować cokolwiek, co pojawiło się po znaku - // białym a przed \n - aby np. żaden z użytkowników nie mógł - // napisać "a a" i potencjalnie zadecydować o ruchu oponenta. - // std::cin.ignore(std::numeric_limits::max(), '\n'); + std::cout << "Co chcesz zrobic?\n"; + std::cout << "a) Wyjsc pionkiem z bazy\n" + << "b) Wykonac ruch wyciagnietym wczesniej pionkiem\n" + << "> "; - // std::cin >> choice; - // std::cin.sync(); - choice = this->board.asyncStrGetline(); - choice[0] |= 32; + while (true) { - if (choice[0] == 'a') { + // getline() nie pozostawia nic w buforze wejściowym, dlatego nie musimy + // aż tak na niego uważać, jak w przypadku cin'a. - pickAPlace = false; - std::cout << currentPlayer.getName() << " wychodzi " - << currentPlayer.pawnsActive + 1 << ". pionkiem z bazy.\n"; - currentPlayer.pawnsAtBase--; - currentPlayer.pawnsActive++; - this->pawnmoveBuffer.play(); - this->board.smartSleep(2000); - break; + choice = this->board.asyncStrGetline(); + choice[0] |= 32; - } else if (choice[0] == 'b') { + if (choice[0] == 'a') { - if (currentPlayer.pawnsActive > 1) { - pickAPlace = true; - } else { - std::cout << currentPlayer.getName() << " rusza jedyny pionek " - << diceRoll << " pol do przodu.\n"; - this->pawnmoveBuffer.play(); + pickAPlace = false; + std::cout << currentPlayer.getName() << " wychodzi " + << currentPlayer.pawnsActive + 1 << ". pionkiem z bazy.\n"; + currentPlayer.pawnsAtBase--; + currentPlayer.pawnsActive++; + this->pawnmoveBuffer.play(); this->board.smartSleep(2000); - } - break; + break; - } else std::cout << "Podaj jedna z wymienionych odpowiedzi!\n> "; - } + } else if (choice[0] == 'b') { + + if (currentPlayer.pawnsActive > 1) { + pickAPlace = true; + } else { + std::cout << currentPlayer.getName() << " rusza jedyny pionek " + << diceRoll << " pol do przodu.\n"; + this->pawnmoveBuffer.play(); + this->board.smartSleep(2000); + } + break; + + } else std::cout << "Podaj jedna z wymienionych odpowiedzi!\n> "; + } + break; + + // 4 pionki na planszy - musi ruszyć pionek, o ile może + case 4: + // TODO + pickAPlace = true; + this->pawnmoveBuffer.play(); + break; - } else if (currentPlayer.pawnsActive == 4) { - // Musi ruszyć pionek, o ile może - // TODO - pickAPlace = true; - this->pawnmoveBuffer.play(); } + } else { - // Musi ruszyć któryś z pionków - pickAPlace = true; - if (currentPlayer.pawnsActive == 1) { - // Jedyny pionek możemy ruszyć za niego - pickAPlace = false; - std::cout << currentPlayer.getName() << " rusza jedyny pionek " - << diceRoll << " pol do przodu.\n"; - this->pawnmoveBuffer.play(); - this->board.smartSleep(2000); + // Jeśli nie wypadło 6, gracz musi ruszyć któryś z pionków + switch (currentPlayer.pawnsActive) { + + // 0 pionków na planszy + case 0: + // Gracz nie może ruszyć pionków, których nie ma. + pickAPlace = false; + break; + + // 1 pionek na planszy + case 1: + // Nie potrzebujemy, aby gracz wskazał jedyny pionek na planszy, + // dlatego ruszamy go za niego. + pickAPlace = false; + // TODO: znajdź ten pionek i ustaw selectedField na niego!!! + std::cout << currentPlayer.getName() << " rusza jedyny pionek " + << diceRoll << " pol do przodu.\n"; + this->pawnmoveBuffer.play(); + this->board.smartSleep(2000); + break; + + // 2, 3, 4 pionki na planszy + case 2: case 3: case 4: + // Gracz musi wybrać pionek + pickAPlace = true; + break; + } } - if (currentPlayer.pawnsActive > 1 && pickAPlace) { + if (pickAPlace) { std::cout << "Wybierz prosze pionek na planszy ktorym chcesz wykonac ruch.\n"; } // Użytkownik wybiera pionek na planszy, którym chce się ruszyć short pickStatus = 0; short selectedField = -1; - if (currentPlayer.pawnsActive == 0 || !pickAPlace) pickStatus = 8; // pomiń pętlę + if (!pickAPlace) pickStatus = 8; // pomiń pętlę while (pickStatus != 8) { this->board.selectAField(pickStatus, selectedField); @@ -149,10 +176,13 @@ void Engine::nextTurn() { std::cout << "(Engine.cpp) selected: " << selectedField << "\n"; - this->pawnmoveBuffer.play(); - this->board.smartSleep(1000); + // Jeżeli gracz się ruszył, odtwórz dźwięk ruchu + if (selectedField != -1) { + this->pawnmoveBuffer.play(); + this->board.smartSleep(1000); + } - // TEST + // Debug: odkomentuj, aby wymusić wygraną: // currentPlayer.tryMovingPawn(0, 0); // if (!pickAPlace) { @@ -161,6 +191,7 @@ void Engine::nextTurn() { if (currentPlayer.hasWon()) { // Zostanie wykorzystane do zwiększenia liczby wygranych + this->tadaBuffer.play(); this->winnerNickname = currentPlayer.getName(); announceWinner(currentPlayer); } else { diff --git a/Chinczyk188/Engine.hpp b/Chinczyk188/Engine.hpp index b9929ee..2aadfce 100644 --- a/Chinczyk188/Engine.hpp +++ b/Chinczyk188/Engine.hpp @@ -28,8 +28,10 @@ class Engine { // Audio bool dicerollLoaded = true; bool pawnmoveLoaded = true; + bool tadaLoaded = true; sf::Music dicerollBuffer; sf::Music pawnmoveBuffer; + sf::Music tadaBuffer; // Pomocnicze std::string winnerNickname = ""; diff --git a/Chinczyk188/Game.cpp b/Chinczyk188/Game.cpp index 1980570..213fa62 100644 --- a/Chinczyk188/Game.cpp +++ b/Chinczyk188/Game.cpp @@ -181,6 +181,8 @@ Game::Game() { // Konstruktor klasy. Klasę Game tworzymy poprzez // ustawienie domyślnych wartości i stworzenie okna. + std::cout << "\033]0;" << "Chinczyk188" << "\007" << "\n"; + this->initVariables(); this->board.initVariables(); this->board.initWindow(); @@ -292,7 +294,7 @@ void Game::run() { this->dumpLeaderboards(this->leaderboardLocation); this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false); - this->board.smartSleep(10000); + this->board.smartSleep(20000); board.closeWindow(); diff --git a/Chinczyk188/Player.cpp b/Chinczyk188/Player.cpp index 5f91efa..e66d600 100644 --- a/Chinczyk188/Player.cpp +++ b/Chinczyk188/Player.cpp @@ -28,7 +28,7 @@ short Player::getColor() const { } short Player::tryMovingPawn(short pawnID, short fields) { - // this->pawnsFinished = 4; // do testowania, wymuszania zakończenia gry + // this->pawnsFinished = 4; // do debugowania, wymusza zakończenia gry return 0; } diff --git a/Chinczyk188/res/audio/jimhancock_tada.ogg b/Chinczyk188/res/audio/jimhancock_tada.ogg new file mode 100644 index 0000000..cc9feea Binary files /dev/null and b/Chinczyk188/res/audio/jimhancock_tada.ogg differ