From f4b58fb67eb0c1a6df5df02b88821ec37e34f7b2 Mon Sep 17 00:00:00 2001 From: zulianc Date: Sun, 30 Mar 2025 22:43:41 +0200 Subject: [PATCH] omg omg --- .../AppMenus/GamePiecesAppMenu.cpp | 91 ++++++++++++++++--- src/GraphicalUI/AppMenus/GamePiecesAppMenu.h | 4 +- src/GraphicalUI/PiecesType.h | 14 +++ src/GraphicalUI/PlayerCursor.cpp | 4 +- src/GraphicalUI/Settings.cpp | 2 +- src/Pieces/PiecesFiles.cpp | 2 +- 6 files changed, 99 insertions(+), 18 deletions(-) diff --git a/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp b/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp index 9bec014..955a240 100644 --- a/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp +++ b/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp @@ -11,7 +11,7 @@ GamePiecesAppMenu::GamePiecesAppMenu(std::shared_ptr menuStack, std::shared_ptr settings, std::shared_ptr renderWindow) : AppMenu(menuStack, settings, renderWindow), - playerCursor({1, 1}) { + playerCursor({1, (unsigned int) this->settings->getSelectedPieces().size() + 1u}) { for (int i = 1; i <= MAXIMUM_PIECES_SIZE; i++) { this->playerCursor.addRow(i + 1, this->settings->getMenu().readPiecesList().getNumberOfPieces(i) + 4); @@ -22,19 +22,42 @@ void GamePiecesAppMenu::computeFrame() { this->updateMetaBinds(); this->playerCursor.updatePosition(); + if (this->playerCursor.movedDown() && this->playerCursor.getPosition().y == 2) { + this->playerCursor.goToPosition({0, 2}); + } + if (this->enterReleased) { if (this->playerCursor.getPosition().y == 0) { this->menuStack->push(std::make_shared(this->menuStack, this->settings, this->renderWindow)); } if (this->playerCursor.getPosition().y > 1) { - //TODO + if (this->playerCursor.getPosition().x >= 4) { + this->settings->selectPieces(createSinglePieceType(this->playerCursor.getPosition().y - 1), this->playerCursor.getPosition().x - 4); + } + else { + switch (this->playerCursor.getPosition().x) { + case 0 : {this->settings->selectPieces(ALL_PIECES, this->playerCursor.getPosition().y - 1); break;} + case 1 : {this->settings->selectPieces(CONVEX_PIECES, this->playerCursor.getPosition().y - 1); break;} + case 2 : {this->settings->selectPieces(HOLELESS_PIECES, this->playerCursor.getPosition().y - 1); break;} + case 3 : {this->settings->selectPieces(OTHER_PIECES, this->playerCursor.getPosition().y - 1); break;} + } + } + this->playerCursor.addPosition(0, 1); } } if (this->escReleased) { if (this->playerCursor.getPosition().y == 1) { - //TODO + if (this->playerCursor.getPosition().x > 0) { + this->settings->unselectPieces(this->playerCursor.getPosition().x - 1); + this->playerCursor.removePosition(this->playerCursor.getPosition().x - 1, 1); + } } else { + if (this->settings->getSelectedPieces().size() == 0) { + this->settings->selectPieces(ALL_PIECES, 4); + } + this->settings->confirmSelectedPieces(); + this->menuStack->pop(); } } @@ -51,24 +74,66 @@ void GamePiecesAppMenu::drawFrame() const { if (this->playerCursor.getPosition().y == 0) { this->placeText(text, this->playerCursor, "PIECES DISTRIBUTION", 5.f, 15.f, sf::Vector2u{0, 0}); - // TODO draw pieces line - this->drawRow(1, 35.f); - this->drawRow(2, 45.f); + this->drawSelectedPiecesRow(25.f); + this->drawRow(1, 35.f, true); + this->drawRow(2, 45.f, true); } else { - // TODO draw pieces line + this->drawSelectedPiecesRow(15.f); + + bool drawFromFirstElem = (this->playerCursor.getPosition().y == 1); int firstElem = std::clamp(((int) this->playerCursor.getPosition().y) - 2, 1, MAXIMUM_PIECES_SIZE - 2); - this->drawRow(firstElem, 25.f); - this->drawRow(firstElem + 1, 35.f); - this->drawRow(firstElem + 2, 45.f); + this->drawRow(firstElem, 25.f, drawFromFirstElem); + this->drawRow(firstElem + 1, 35.f, drawFromFirstElem); + this->drawRow(firstElem + 2, 45.f, drawFromFirstElem); } this->renderWindow->display(); } -void GamePiecesAppMenu::drawRow(int piecesSize, float yPos) const { +void GamePiecesAppMenu::drawSelectedPiecesRow(float yPos) const { + sf::RectangleShape rect({(float) this->renderWindow->getSize().x, 8.f * this->settings->getWindowSizeMultiplier()}); + rect.setPosition({0.f, (yPos - 4.f) * this->settings->getWindowSizeMultiplier()}); + rect.setFillColor({240, 240, 240}); + this->renderWindow->draw(rect); + + sf::Text text(this->pressStartFont, "", this->settings->getWindowSizeMultiplier()); + text.setFillColor({0, 0, 0}); + + int elem = (this->playerCursor.getPosition().y == 1) ? std::max(((int) this->playerCursor.getPosition().x) - 4, 0) : 0; + float xProgress = 1.f; + + bool first = true; + while (true) { + if ((this->playerCursor.getPosition().y == 1) && (elem == this->playerCursor.getPosition().x)) { + this->placeText(text, {}, "|", xProgress, yPos, {}); + xProgress += (1.f + (text.getGlobalBounds().size.x / this->settings->getWindowSizeMultiplier())); + } + + if (elem >= this->settings->getSelectedPieces().size()) return; + + const auto& [pieceType, value] = this->settings->getSelectedPieces().at(elem); + + int pieceSize = getSizeOfPieces(pieceType); + if (pieceSize > 0) { + const Piece& piece = this->settings->getMenu().readPiecesList().lookAtPiece({pieceSize, value}); + int cellSize = (8 * this->settings->getWindowSizeMultiplier()) / (piece.getLength()); + sf::FloatRect piecePosition(sf::Vector2f(xProgress, yPos - 4.f) * (float) this->settings->getWindowSizeMultiplier(), sf::Vector2f(8 , 8) * (float) this->settings->getWindowSizeMultiplier()); + this->drawPiece(piece, cellSize, piecePosition, false); + xProgress += (1.f + 8.f); + } + else { + this->placeText(text, {}, ((first) ? "" : " ") + getPiecesTypeName(pieceType) + "_" + std::to_string(value), xProgress, yPos, {}); + xProgress += (1.f + (text.getGlobalBounds().size.x / this->settings->getWindowSizeMultiplier())); + } + + elem++; + } +} + +void GamePiecesAppMenu::drawRow(int piecesSize, float yPos, bool drawFromFirstElem) const { int numberOfPieces = this->settings->getMenu().readPiecesList().getNumberOfPieces(piecesSize); - int firstElem = std::max(((int) this->playerCursor.getPosition().x) - 7, -4); + int firstElem = (drawFromFirstElem) ? -4 : std::max(((int) this->playerCursor.getPosition().x) - 7, -4); sf::Text text(this->pressStartFont, "", this->settings->getWindowSizeMultiplier()); text.setFillColor({0, 0, 0}); @@ -111,7 +176,7 @@ void GamePiecesAppMenu::drawPiece(const Piece& piece, int cellSize, const sf::Fl for (const Position& cellPosition : piece.getPositions()) { cell.setPosition(sf::Vector2f(piecePosition.position.x + (cellPosition.x * cellSize), - piecePosition.position.y + ((piece.getLength() - cellPosition.y - 1) * cellSize))); + piecePosition.position.y + ((piece.getLength() - cellPosition.y - 1) * cellSize) )); this->renderWindow->draw(cell); } } diff --git a/src/GraphicalUI/AppMenus/GamePiecesAppMenu.h b/src/GraphicalUI/AppMenus/GamePiecesAppMenu.h index 68afc3e..7974b2d 100644 --- a/src/GraphicalUI/AppMenus/GamePiecesAppMenu.h +++ b/src/GraphicalUI/AppMenus/GamePiecesAppMenu.h @@ -21,7 +21,9 @@ class GamePiecesAppMenu : public AppMenu { void drawFrame() const override; private: - void drawRow(int piecesSize, float yPos) const; + void drawSelectedPiecesRow(float yPos) const; + + void drawRow(int piecesSize, float yPos, bool drawFromFirstElem) const; void drawPiece(const Piece& piece, int cellSize, const sf::FloatRect& pos, bool selected) const; }; diff --git a/src/GraphicalUI/PiecesType.h b/src/GraphicalUI/PiecesType.h index ac1da67..5817967 100644 --- a/src/GraphicalUI/PiecesType.h +++ b/src/GraphicalUI/PiecesType.h @@ -1,5 +1,7 @@ #pragma once +#include + enum PiecesType { CONVEX_PIECES, @@ -19,3 +21,15 @@ inline int getSizeOfPieces(PiecesType type) { inline PiecesType createSinglePieceType(int size) { return PiecesType(SINGLE_PIECE + size - 1); } + +inline std::string getPiecesTypeName(PiecesType piecesType) { + static const std::string PIECES_TYPE_NAME[] = { + "CONVEX", + "HOLELESS", + "OTHER", + "ALL", + "SINGLE" + }; + + return PIECES_TYPE_NAME[piecesType]; +} diff --git a/src/GraphicalUI/PlayerCursor.cpp b/src/GraphicalUI/PlayerCursor.cpp index 5d530c1..e4dfd9c 100644 --- a/src/GraphicalUI/PlayerCursor.cpp +++ b/src/GraphicalUI/PlayerCursor.cpp @@ -71,7 +71,7 @@ bool PlayerCursor::addPosition(unsigned int x, unsigned int y) { if (x > this->rows.at(y)) return false; this->rows.at(y)++; - if (x <= this->position.x) { + if ((y == this->position.y) && (x <= this->position.x)) { this->position.x++; } return true; @@ -82,7 +82,7 @@ bool PlayerCursor::removePosition(unsigned int x, unsigned int y) { if (x >= this->rows.at(y)) return false; this->rows.at(y)--; - if (x < this->position.x) { + if ((y == this->position.y) && (x < this->position.x)) { this->position.x--; } return true; diff --git a/src/GraphicalUI/Settings.cpp b/src/GraphicalUI/Settings.cpp index 51f15e4..0d2a9a1 100644 --- a/src/GraphicalUI/Settings.cpp +++ b/src/GraphicalUI/Settings.cpp @@ -271,7 +271,7 @@ bool Settings::decreaseDistribution(int size) { void Settings::confirmDistribution() { for (int i = 1; i <= 15; i++) { - this->menu.getPiecesList().changeCustomDistribution(i, (double) this->distributions.at(i) / (DISTRIBUTION_MAX + 0.001)); + this->menu.getPiecesList().changeCustomDistribution(i, (double) 1 / (this->distributions.at(i) + 0.001)); } } diff --git a/src/Pieces/PiecesFiles.cpp b/src/Pieces/PiecesFiles.cpp index 0184173..4d71ed4 100644 --- a/src/Pieces/PiecesFiles.cpp +++ b/src/Pieces/PiecesFiles.cpp @@ -91,7 +91,7 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector& pieces, std: char positionByte; for (int i = 0; i < polyominoSize; i++) { piecesFile.get(positionByte); - int x = (positionByte & xMask) >> 4; + int x = ((unsigned char) positionByte & xMask) >> 4; int y = positionByte & yMask; piecePositions.insert(Position{x, y}); }