From 6b16abda6a07efe25ae15709a618a3edc14af4f7 Mon Sep 17 00:00:00 2001 From: zulianc Date: Sat, 22 Mar 2025 22:03:57 +0100 Subject: [PATCH] fichier settings --- doc/files_format.md | 4 +- src/GraphicalUI/AppMenus/MainAppMenu.cpp | 3 +- src/GraphicalUI/Keybinds.h | 6 +- src/GraphicalUI/PiecesType.h | 16 ++--- src/GraphicalUI/Settings.cpp | 90 +++++++++++++++++++++--- src/GraphicalUI/Settings.h | 3 + src/GraphicalUI/main.cpp | 41 ++++++++++- 7 files changed, 138 insertions(+), 25 deletions(-) diff --git a/doc/files_format.md b/doc/files_format.md index 5c5bcc7..0833829 100644 --- a/doc/files_format.md +++ b/doc/files_format.md @@ -38,10 +38,10 @@ _Repeat for every avaible actions._ The settings file has the following format: - The number of the chosen keybinds (from 0 to 4), stored with 1 byte -- The size multiplier of the window, stored with 1 byte +- The window size mode, stored with 1 byte - The number of the last selected gamemode (converted from an Enum), stored with 1 byte - The last selected width of the board, stored with 1 byte - The last selected height of the board, stored with 1 byte - The uniformity mode (0 for default distribution, 1 for uniformous distribution, 2 for custom distribution), stored with 1 byte - If custom distribution is set, store the proportion of each size (15x1 byte total) -- Every selected pieces, using 1 byte for the type of selection (once again converted from an Enum) and 1 byte for the actual value \ No newline at end of file +- Every selected pieces, using 1 byte for the type of selection (once again converted from an Enum) and 1 byte for the actual value diff --git a/src/GraphicalUI/AppMenus/MainAppMenu.cpp b/src/GraphicalUI/AppMenus/MainAppMenu.cpp index 60d4aed..73a3e8b 100644 --- a/src/GraphicalUI/AppMenus/MainAppMenu.cpp +++ b/src/GraphicalUI/AppMenus/MainAppMenu.cpp @@ -1,6 +1,7 @@ #include "MainAppMenu.h" #include "AppMenu.h" +#include "InGameAppMenu.h" #include #include @@ -14,7 +15,7 @@ MainAppMenu::MainAppMenu(std::shared_ptr> menuStack, std::sh void MainAppMenu::computeFrame() { if (sf::Keyboard::isKeyPressed(sfKey::Enter)) { - + this->menuStack->push(InGameAppMenu(this->menuStack, this->settings, this->renderWindow)); } else if (sf::Keyboard::isKeyPressed(sfKey::Escape)) { this->menuStack->pop(); diff --git a/src/GraphicalUI/Keybinds.h b/src/GraphicalUI/Keybinds.h index 58da4ce..4c62f4c 100644 --- a/src/GraphicalUI/Keybinds.h +++ b/src/GraphicalUI/Keybinds.h @@ -8,13 +8,17 @@ using sfKey = sf::Keyboard::Key; +static const int NUMBER_OF_KEYBINDS = 5; +static const int CUSTOMIZABLE_KEYBINDS = NUMBER_OF_KEYBINDS - 1; + class Keybinds { private: std::map> keybinds; + int layoutNumber; public: - Keybinds(); + Keybinds(int layoutNumber); void loadKeybindsFromFile(); diff --git a/src/GraphicalUI/PiecesType.h b/src/GraphicalUI/PiecesType.h index 5d9c071..ac1da67 100644 --- a/src/GraphicalUI/PiecesType.h +++ b/src/GraphicalUI/PiecesType.h @@ -2,20 +2,20 @@ enum PiecesType { - CONVEX, - HOLELESS, - OTHERS, - ALL, - SINGLE + CONVEX_PIECES, + HOLELESS_PIECES, + OTHER_PIECES, + ALL_PIECES, + SINGLE_PIECE }; inline int getSizeOfPieces(PiecesType type) { - if (type < SINGLE) return 0; + if (type < SINGLE_PIECE) return 0; - else return (type - SINGLE + 1); + else return (type - SINGLE_PIECE + 1); } inline PiecesType createSinglePieceType(int size) { - return PiecesType(SINGLE + size - 1); + return PiecesType(SINGLE_PIECE + size - 1); } diff --git a/src/GraphicalUI/Settings.cpp b/src/GraphicalUI/Settings.cpp index ad21459..7b1f9c7 100644 --- a/src/GraphicalUI/Settings.cpp +++ b/src/GraphicalUI/Settings.cpp @@ -4,31 +4,99 @@ #include "Keybinds.h" #include +#include -static const int NUMBER_OF_KEYBINDS = 5; -static const int CUSTOMIZABLE_KEYBINDS = NUMBER_OF_KEYBINDS - 1; static const sf::Vector2u BASE_WINDOW_SIZE = {80, 50}; static const int WINDOW_SIZE_MULTIPLIERS[] = {4, 6, 9, 14, 20}; static const int WINDOW_SIZE_LAST_MODE = (sizeof(WINDOW_SIZE_MULTIPLIERS) / sizeof(int)) - 1; Settings::Settings() { - for (int i = 1; i <= 15; i++) { + for (int i = 1; i <= MAXIMUM_PIECES_SIZE; i++) { this->menu.getPiecesList().loadPieces(i); } + this->keybinds.reserve(NUMBER_OF_KEYBINDS); + for (int i = 0; i < NUMBER_OF_KEYBINDS; i++) { + this->keybinds.emplace_back(i); + } + this->loadSettingsFromFile(); } void Settings::loadSettingsFromFile() { + std::ifstream settingsFile("data/config/settings.bin", std::ios::binary); + char byte; + + // keybind layout + settingsFile.get(&byte, 1); + this->chosenKeybinds = byte; + + // window size mode + settingsFile.get(&byte, 1); + this->windowSizeMode = byte; + + // gamemode + settingsFile.get(&byte, 1); + this->gamemode = Gamemode(byte); + + // board width + settingsFile.get(&byte, 1); + this->menu.setBoardWidth(byte); + + // board height + settingsFile.get(&byte, 1); + this->menu.setBoardHeight(byte); + + // piece distribution + settingsFile.get(&byte, 1); //TODO - this->menu.getPiecesList().unselectAll(); - this->menu.getPiecesList().selectAllPieces(4); - this->windowSizeMode = 2; + + // selected pieces + char pieceType; + char pieceValue; + this->selectedPieces.clear(); + while (settingsFile.get(&pieceType, 1)) { + settingsFile.get(&pieceValue, 1); + this->selectedPieces.push_back({PiecesType(pieceType), pieceValue}); + } } void Settings::saveSettingsToFile() const { + std::ofstream settingsFile("data/config/settings.bin", std::ios::trunc | std::ios::binary); + char byte; + + // keybind layout + byte = this->chosenKeybinds; + settingsFile.write(&byte, 1); + + // window size mode + byte = this->windowSizeMode; + settingsFile.write(&byte, 1); + + // gamemode + byte = this->gamemode; + settingsFile.write(&byte, 1); + + // board width + byte = this->menu.getBoardWidth(); + settingsFile.write(&byte, 1); + + // board height + byte = this->menu.getBoardHeight(); + settingsFile.write(&byte, 1); + + // piece distribution //TODO + settingsFile.write(&byte, 1); + + // selected pieces + for (const auto& [type, value] : this->selectedPieces) { + byte = type; + settingsFile.write(&byte, 1); + byte = value; + settingsFile.write(&byte, 1); + } } bool Settings::selectNextKeybinds() { @@ -89,14 +157,14 @@ void Settings::confirmSelectedPieces() { if (size == 0) { switch (type) { - case CONVEX : {this->menu.getPiecesList().selectConvexPieces(value); break;} - case HOLELESS : {this->menu.getPiecesList().selectHolelessPieces(value); break;} - case OTHERS : {this->menu.getPiecesList().selectOtherPieces(value); break;} - case ALL : {this->menu.getPiecesList().selectAllPieces(value); break;} + 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;} } } else { - if (size > 15) return; + if (size > MAXIMUM_PIECES_SIZE) return; this->menu.getPiecesList().selectPiece(size, value); } diff --git a/src/GraphicalUI/Settings.h b/src/GraphicalUI/Settings.h index 4128434..e088197 100644 --- a/src/GraphicalUI/Settings.h +++ b/src/GraphicalUI/Settings.h @@ -7,6 +7,9 @@ #include #include +static const int MAXIMUM_BOARD_WIDTH = 40; +static const int MAXIMUM_BOARD_HEIGHT = 40; + class Settings { private: diff --git a/src/GraphicalUI/main.cpp b/src/GraphicalUI/main.cpp index e56c6ce..983ff93 100644 --- a/src/GraphicalUI/main.cpp +++ b/src/GraphicalUI/main.cpp @@ -1,12 +1,18 @@ #include "GraphApp.h" #include "../Pieces/PiecesFiles.h" + #include +void resetConfigFiles(); +void resetSettingsFile(); +void resetKeybindFile(int layout); + + int main() { std::srand(std::time(NULL)); - // dev version + // keep only for dev PiecesFiles pf; for (int i = 1; i <= MAXIMUM_PIECES_SIZE; i++) { if (!std::filesystem::exists("data/pieces/" + std::to_string(i) + "minos.bin")) { @@ -23,7 +29,7 @@ int main() { } } - // release version + // before compiling release version //resetConfigFiles(); GraphApp UI; @@ -41,7 +47,38 @@ void resetConfigFiles() { } void resetSettingsFile() { + std::ofstream settingsFile("data/config/settings.bin", std::ios::trunc | std::ios::binary); + char byte; + // keybind layout + byte = 0; + settingsFile.write(&byte, 1); + + // window size mode + byte = 2; + settingsFile.write(&byte, 1); + + // gamemode + byte = SPRINT; + settingsFile.write(&byte, 1); + + // board width + byte = 10; + settingsFile.write(&byte, 1); + + // board height + byte = 20; + settingsFile.write(&byte, 1); + + // piece distribution + byte = 0; + settingsFile.write(&byte, 1); + + // selected pieces + byte = ALL_PIECES; + settingsFile.write(&byte, 1); + byte = 4; + settingsFile.write(&byte, 1); } void resetKeybindFile(int layout) {