fichier settings

This commit is contained in:
2025-03-22 22:03:57 +01:00
parent 30dd323e22
commit 6b16abda6a
7 changed files with 138 additions and 25 deletions

View File

@@ -38,7 +38,7 @@ _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

View File

@@ -1,6 +1,7 @@
#include "MainAppMenu.h"
#include "AppMenu.h"
#include "InGameAppMenu.h"
#include <stack>
#include <memory>
@@ -14,7 +15,7 @@ MainAppMenu::MainAppMenu(std::shared_ptr<std::stack<AppMenu>> 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();

View File

@@ -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<Action, std::vector<sfKey>> keybinds;
int layoutNumber;
public:
Keybinds();
Keybinds(int layoutNumber);
void loadKeybindsFromFile();

View File

@@ -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);
}

View File

@@ -4,31 +4,99 @@
#include "Keybinds.h"
#include <SFML/Graphics.hpp>
#include <fstream>
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);
}

View File

@@ -7,6 +7,9 @@
#include <SFML/Graphics.hpp>
#include <vector>
static const int MAXIMUM_BOARD_WIDTH = 40;
static const int MAXIMUM_BOARD_HEIGHT = 40;
class Settings {
private:

View File

@@ -1,12 +1,18 @@
#include "GraphApp.h"
#include "../Pieces/PiecesFiles.h"
#include <fstream>
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) {