diff --git a/doc/files_format.md b/doc/files_format.md index 55cdb20..e862b92 100644 --- a/doc/files_format.md +++ b/doc/files_format.md @@ -55,5 +55,5 @@ The settings file has the following format: - For every single piece, use 1 byte for (the size + encoding that it is a single piece), and 3 bytes to store the number of the piece (allows number up to 16M, size 15 has 6M pieces). -The current file format version is 10. +The current file format version is 11. If the file starts with a number lower than that, it will be regenerated upon launching the game. diff --git a/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp b/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp index 0e8d164..4970c6b 100644 --- a/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp +++ b/src/GraphicalUI/AppMenus/GamePiecesAppMenu.cpp @@ -112,15 +112,27 @@ void GamePiecesAppMenu::drawSelectedPiecesRow(float yPos) const { 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); + if (!(pieceSize > this->settings->getMaximumPiecesSize())) { + 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, {}, "ERROR_UNSUPPORTED", xProgress, yPos, {}); + xProgress += (1.f + (text.getGlobalBounds().size.x / this->settings->getWindowSizeMultiplier())); + } } else { - this->placeText(text, {}, ((first) ? "" : " ") + getPiecesTypeName(pieceType) + "_" + std::to_string(value), xProgress, yPos, {}); - xProgress += (1.f + (text.getGlobalBounds().size.x / this->settings->getWindowSizeMultiplier())); + if (!(value > this->settings->getMaximumPiecesSize())) { + this->placeText(text, {}, ((first) ? "" : " ") + getPiecesTypeName(pieceType) + "_" + std::to_string(value), xProgress, yPos, {}); + xProgress += (1.f + (text.getGlobalBounds().size.x / this->settings->getWindowSizeMultiplier())); + } + else { + this->placeText(text, {}, "ERROR_UNSUPPORTED", xProgress, yPos, {}); + xProgress += (1.f + (text.getGlobalBounds().size.x / this->settings->getWindowSizeMultiplier())); + } } elem++; diff --git a/src/GraphicalUI/AppMenus/StartUpAppMenu.cpp b/src/GraphicalUI/AppMenus/StartUpAppMenu.cpp index d33965f..74fefb5 100644 --- a/src/GraphicalUI/AppMenus/StartUpAppMenu.cpp +++ b/src/GraphicalUI/AppMenus/StartUpAppMenu.cpp @@ -6,6 +6,7 @@ #include #include +#include #include @@ -13,7 +14,7 @@ StartUpAppMenu::StartUpAppMenu(std::shared_ptr menuStack, std::shared AppMenu(menuStack, settings, renderWindow), playerCursor({LOADED_PIECES_SIZE + 1}) { - this->playerCursor.goToPosition({MINIMUM_PIECES_SIZE, 0}); + this->playerCursor.goToPosition({(unsigned int) std::clamp(this->settings->getMaximumPiecesSize(), MINIMUM_PIECES_SIZE, LOADED_PIECES_SIZE), 0u}); } void StartUpAppMenu::computeFrame() { @@ -30,7 +31,7 @@ void StartUpAppMenu::computeFrame() { } if (this->enterReleased) { - *this->settings = Settings(this->playerCursor.getPosition().x); + this->settings->loadSettingsFromFile(true, {this->playerCursor.getPosition().x}); this->menuStack->pop(); if (this->settings->hasLoadedPieces()) { diff --git a/src/GraphicalUI/GraphApp.cpp b/src/GraphicalUI/GraphApp.cpp index 5db3ea8..98a884d 100644 --- a/src/GraphicalUI/GraphApp.cpp +++ b/src/GraphicalUI/GraphApp.cpp @@ -12,7 +12,7 @@ static const double TIME_BETWEEN_FRAMES = (1000.f / FRAMES_PER_SECOND); GraphApp::GraphApp() { - this->settings = std::make_shared(0); + this->settings = std::make_shared(false); this->menuStack = std::make_shared(); this->renderWindow = std::make_shared(); } diff --git a/src/GraphicalUI/Settings.cpp b/src/GraphicalUI/Settings.cpp index ba546bc..6a02bb8 100644 --- a/src/GraphicalUI/Settings.cpp +++ b/src/GraphicalUI/Settings.cpp @@ -5,6 +5,7 @@ #include "PiecesType.h" #include +#include #include #include #include @@ -17,15 +18,16 @@ static const int DISTRIBUTION_MAX = 20; Settings::Settings(bool loadPieces) { + this->keybinds.clear(); this->keybinds.reserve(NUMBER_OF_KEYBINDS); for (int i = 0; i < NUMBER_OF_KEYBINDS; i++) { this->keybinds.emplace_back(i); } - this->loadSettingsFromFile(loadPieces); + this->loadSettingsFromFile(loadPieces, {}); } -bool Settings::loadPieces(int maximumPiecesSizeRequest) { +void Settings::loadPieces(int maximumPiecesSizeRequest) { if (maximumPiecesSizeRequest < MINIMUM_PIECES_SIZE) { maximumPiecesSizeRequest = MINIMUM_PIECES_SIZE; } @@ -40,12 +42,13 @@ bool Settings::loadPieces(int maximumPiecesSizeRequest) { i++; } - this->maximumPiecesSize = (succeeded) ? maximumPiecesSizeRequest : 0; - return succeeded; - + if (succeeded) { + this->maximumPiecesSize = maximumPiecesSizeRequest; + } + this->loadedPieces = succeeded; } -void Settings::loadSettingsFromFile(bool loadPieces) { +void Settings::loadSettingsFromFile(bool loadPieces, std::optional maximumPiecesSizeRequest) { std::ifstream settingsFile("data/config/settings.bin", std::ios::binary); char byte; @@ -54,8 +57,15 @@ void Settings::loadSettingsFromFile(bool loadPieces) { // maximum pieces size settingsFile.get(byte); + this->maximumPiecesSize = byte; + if (loadPieces) { - this->loadedPieces = this->loadPieces(byte); + if (maximumPiecesSizeRequest.has_value()) { + this->loadPieces(maximumPiecesSizeRequest.value()); + } + else { + this->loadPieces(byte); + } } else { this->loadedPieces = false; @@ -124,18 +134,15 @@ void Settings::loadSettingsFromFile(bool loadPieces) { if (getSizeOfPieces(PiecesType(pieceType)) == 0) { settingsFile.get(pieceSize); - if (!(pieceSize > this->maximumPiecesSize)) { - this->selectedPieces.emplace_back(PiecesType(pieceType), pieceSize); - } + this->selectedPieces.emplace_back(PiecesType(pieceType), pieceSize); } else { - if (!(getSizeOfPieces(PiecesType(pieceType)) > this->maximumPiecesSize)) { - settingsFile.get(lowByte); - settingsFile.get(midByte); - settingsFile.get(highByte); - int pieceNumber = ((unsigned char) lowByte) + ((unsigned char) midByte << 8) + ((unsigned char) highByte << 16); - this->selectedPieces.emplace_back(PiecesType(pieceType), pieceNumber); - } + settingsFile.get(lowByte); + settingsFile.get(midByte); + settingsFile.get(highByte); + + int pieceNumber = ((unsigned char) lowByte) + ((unsigned char) midByte << 8) + ((unsigned char) highByte << 16); + this->selectedPieces.emplace_back(PiecesType(pieceType), pieceNumber); } } this->confirmSelectedPieces(); @@ -309,25 +316,33 @@ void Settings::confirmSelectedPieces() { this->menu.getPiecesList().unselectAll(); - if (this->getSelectedPieces().size() == 0) { - this->selectedPieces.push_back(DEFAULT_SELECTION); - } - + bool selectedNone = true; for (const auto& [type, value] : this->selectedPieces) { int size = getSizeOfPieces(type); if (size == 0) { - switch (type) { - case CONVEX_PIECES : {this->menu.getPiecesList().selectConvexPieces(value); break;} - case HOLELESS_PIECES : {this->menu.getPiecesList().selectHolelessPieces(value); break;} - case OTHER_PIECES : {this->menu.getPiecesList().selectOtherPieces(value); break;} - case ALL_PIECES : {this->menu.getPiecesList().selectAllPieces(value); break;} + if (!(value > this->maximumPiecesSize)) { + switch (type) { + case CONVEX_PIECES : {this->menu.getPiecesList().selectConvexPieces(value); break;} + case HOLELESS_PIECES : {this->menu.getPiecesList().selectHolelessPieces(value); break;} + case OTHER_PIECES : {this->menu.getPiecesList().selectOtherPieces(value); break;} + case ALL_PIECES : {this->menu.getPiecesList().selectAllPieces(value); break;} + } + selectedNone = false; } } else { - this->menu.getPiecesList().selectPiece(size, value); + if (!(getSizeOfPieces(type) > this->maximumPiecesSize)) { + this->menu.getPiecesList().selectPiece(size, value); + selectedNone = false; + } } } + + if (selectedNone) { + this->selectedPieces.push_back(DEFAULT_SELECTION); + this->confirmSelectedPieces(); + } } bool Settings::increaseDistribution(int size) { diff --git a/src/GraphicalUI/Settings.h b/src/GraphicalUI/Settings.h index acbea99..71f0c69 100644 --- a/src/GraphicalUI/Settings.h +++ b/src/GraphicalUI/Settings.h @@ -5,9 +5,10 @@ #include "PiecesType.h" #include +#include #include -static const int CURRENT_FILE_FORMAT_VERSION = 10; +static const int CURRENT_FILE_FORMAT_VERSION = 11; static const int MAXIMUM_BOARD_WIDTH = 40; static const int MAXIMUM_BOARD_HEIGHT = 40; @@ -15,7 +16,7 @@ static const int MAXIMUM_BOARD_HEIGHT = 40; static const int MINIMUM_PIECES_SIZE = 4; static const int MAXIMUM_PIECES_SIZE = 15; -//#define __JMINOS_RELEASE__ +#define __JMINOS_RELEASE__ #ifdef __JMINOS_RELEASE__ static const int LOADED_PIECES_SIZE = 15; #else @@ -42,10 +43,10 @@ class Settings { Settings(bool loadPieces); private: - bool loadPieces(int maximumPiecesSizeRequest); + void loadPieces(int maximumPiecesSizeRequest); public: - void loadSettingsFromFile(bool loadPieces = true); + void loadSettingsFromFile(bool loadPieces, std::optional maximumPiecesSizeRequest); void saveSettingsToFile() const; diff --git a/src/GraphicalUI/main.cpp b/src/GraphicalUI/main.cpp index 59c4487..6436539 100644 --- a/src/GraphicalUI/main.cpp +++ b/src/GraphicalUI/main.cpp @@ -30,7 +30,11 @@ int main() { settingsFile.get(byte); if ((unsigned char) byte < CURRENT_FILE_FORMAT_VERSION) { + std::cout << "files format changed, regenerating..." << std::endl; resetSettingsFile(); + for (int i = 0; i < NUMBER_OF_KEYBINDS; i++) { + resetKeybindFile(i); + } } } @@ -61,7 +65,7 @@ void resetSettingsFile() { // maximum pieces size byte = MINIMUM_PIECES_SIZE; settingsFile.write(&byte, 1); - + // keybind layout byte = 0; settingsFile.write(&byte, 1);