support unsupported sizes

This commit is contained in:
2025-03-31 20:29:34 +02:00
parent d5ac79559e
commit de14978b01
7 changed files with 76 additions and 43 deletions

View File

@@ -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++;

View File

@@ -6,6 +6,7 @@
#include <stack>
#include <memory>
#include <algorithm>
#include <SFML/Graphics.hpp>
@@ -13,7 +14,7 @@ StartUpAppMenu::StartUpAppMenu(std::shared_ptr<MenuStack> 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()) {

View File

@@ -12,7 +12,7 @@ static const double TIME_BETWEEN_FRAMES = (1000.f / FRAMES_PER_SECOND);
GraphApp::GraphApp() {
this->settings = std::make_shared<Settings>(0);
this->settings = std::make_shared<Settings>(false);
this->menuStack = std::make_shared<MenuStack>();
this->renderWindow = std::make_shared<sf::RenderWindow>();
}

View File

@@ -5,6 +5,7 @@
#include "PiecesType.h"
#include <vector>
#include <optional>
#include <fstream>
#include <algorithm>
#include <SFML/Graphics.hpp>
@@ -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<int> 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) {

View File

@@ -5,9 +5,10 @@
#include "PiecesType.h"
#include <vector>
#include <optional>
#include <SFML/Graphics.hpp>
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<int> maximumPiecesSizeRequest);
void saveSettingsToFile() const;

View File

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