|
|
|
|
@@ -16,6 +16,10 @@ GamePiecesAppMenu::GamePiecesAppMenu(std::shared_ptr<MenuStack> menuStack, std::
|
|
|
|
|
for (int i = 1; i <= this->settings->getMaximumPiecesSize(); i++) {
|
|
|
|
|
this->playerCursor.addRow(i + 1, this->settings->getMenu().readPiecesList().getNumberOfPieces(i) + 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this->settings->getMaximumPiecesSize() < GENERATED_PIECES_SIZE) {
|
|
|
|
|
this->playerCursor.addRow(this->settings->getMaximumPiecesSize() + 2, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GamePiecesAppMenu::computeFrame() {
|
|
|
|
|
@@ -30,7 +34,20 @@ void GamePiecesAppMenu::computeFrame() {
|
|
|
|
|
if (this->playerCursor.getPosition().y == 0) {
|
|
|
|
|
this->menuStack->push(std::make_shared<GameDistributionAppMenu>(this->menuStack, this->settings, this->renderWindow));
|
|
|
|
|
}
|
|
|
|
|
if (this->playerCursor.getPosition().y > 1) {
|
|
|
|
|
|
|
|
|
|
if (this->playerCursor.getPosition().y == (this->settings->getMaximumPiecesSize() + 2)) {
|
|
|
|
|
int newMaxSize = this->settings->getMaximumPiecesSize() + 1;
|
|
|
|
|
this->settings->loadPieces(newMaxSize);
|
|
|
|
|
|
|
|
|
|
this->playerCursor.removeRow(newMaxSize + 1);
|
|
|
|
|
this->playerCursor.addRow(newMaxSize + 1, this->settings->getMenu().readPiecesList().getNumberOfPieces(newMaxSize) + 4);
|
|
|
|
|
this->playerCursor.goToPosition({0u, newMaxSize + 1u});
|
|
|
|
|
|
|
|
|
|
if (newMaxSize < GENERATED_PIECES_SIZE) {
|
|
|
|
|
this->playerCursor.addRow(newMaxSize + 2, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (this->playerCursor.getPosition().y > 1) {
|
|
|
|
|
if (this->playerCursor.getPosition().x >= 4) {
|
|
|
|
|
this->settings->selectPieces(createSinglePieceType(this->playerCursor.getPosition().y - 1), this->playerCursor.getPosition().x - 4);
|
|
|
|
|
}
|
|
|
|
|
@@ -78,7 +95,8 @@ void GamePiecesAppMenu::drawFrame() const {
|
|
|
|
|
this->drawSelectedPiecesRow(15.f);
|
|
|
|
|
|
|
|
|
|
bool drawFromFirstElem = (this->playerCursor.getPosition().y == 1);
|
|
|
|
|
int firstElem = std::clamp(((int) this->playerCursor.getPosition().y) - 2, 1, this->settings->getMaximumPiecesSize() - 2);
|
|
|
|
|
bool addExtraLine = (this->settings->getMaximumPiecesSize() < GENERATED_PIECES_SIZE);
|
|
|
|
|
int firstElem = std::clamp(((int) this->playerCursor.getPosition().y) - 2, 1, this->settings->getMaximumPiecesSize() - 2 + (addExtraLine ? 1 : 0));
|
|
|
|
|
this->drawRow(firstElem, 25.f, drawFromFirstElem);
|
|
|
|
|
this->drawRow(firstElem + 1, 35.f, drawFromFirstElem);
|
|
|
|
|
this->drawRow(firstElem + 2, 45.f, drawFromFirstElem);
|
|
|
|
|
@@ -140,31 +158,57 @@ void GamePiecesAppMenu::drawSelectedPiecesRow(float yPos) const {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GamePiecesAppMenu::drawRow(int piecesSize, float yPos, bool drawFromFirstElem) const {
|
|
|
|
|
int numberOfPieces = this->settings->getMenu().readPiecesList().getNumberOfPieces(piecesSize);
|
|
|
|
|
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});
|
|
|
|
|
text.setOutlineColor({255, 255, 255});
|
|
|
|
|
|
|
|
|
|
this->placeText(text, {}, "SIZE " + std::to_string(piecesSize), 1.f, yPos, {});
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 7; i++) {
|
|
|
|
|
if (i + firstElem >= numberOfPieces) return;
|
|
|
|
|
|
|
|
|
|
if ((i + firstElem) < 0) {
|
|
|
|
|
switch (i + firstElem) {
|
|
|
|
|
case -4 : {this->placeText(text, this->playerCursor, "ALL", 10.f + (i * 10.f), yPos, sf::Vector2u{0, piecesSize + 1u}); break;}
|
|
|
|
|
case -3 : {this->placeText(text, this->playerCursor, "CONVEX", 10.f + (i * 10.f), yPos, sf::Vector2u{1, piecesSize + 1u}); break;}
|
|
|
|
|
case -2 : {this->placeText(text, this->playerCursor, "HOLELESS", 10.f + (i * 10.f), yPos, sf::Vector2u{2, piecesSize + 1u}); break;}
|
|
|
|
|
case -1 : {this->placeText(text, this->playerCursor, "OTHER", 10.f + (i * 10.f), yPos, sf::Vector2u{3, piecesSize + 1u}); break;}
|
|
|
|
|
}
|
|
|
|
|
if (piecesSize > this->settings->getMaximumPiecesSize()) {
|
|
|
|
|
sf::Text text(this->pressStartFont, "", this->settings->getWindowSizeMultiplier() * 2);
|
|
|
|
|
text.setOutlineThickness(this->settings->getWindowSizeMultiplier() / 2);
|
|
|
|
|
if (this->playerCursor.getPosition().y == (piecesSize + 1)) {
|
|
|
|
|
text.setOutlineColor({255, 255, 255});
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const Piece& piece = this->settings->getMenu().readPiecesList().lookAtPiece({piecesSize, firstElem + i});
|
|
|
|
|
int cellSize = (8 * this->settings->getWindowSizeMultiplier()) / (piece.getLength());
|
|
|
|
|
sf::FloatRect piecePosition(sf::Vector2f(10.f + (i * 10.f), yPos - 4.f) * (float) this->settings->getWindowSizeMultiplier(), sf::Vector2f(8 , 8) * (float) this->settings->getWindowSizeMultiplier());
|
|
|
|
|
this->drawPiece(piece, cellSize, piecePosition, this->playerCursor.getPosition() == sf::Vector2u{i + firstElem + 4u, piecesSize + 1u});
|
|
|
|
|
text.setOutlineColor({0, 0, 0});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string sizeString = "LOAD SIZE " + std::to_string(piecesSize) + "? ";
|
|
|
|
|
if (piecesSize <= 10) {
|
|
|
|
|
text.setFillColor({0, 255, 0});
|
|
|
|
|
this->placeText(text, {}, sizeString + "(LOW LOAD TIME)", 1.f, yPos, {});
|
|
|
|
|
}
|
|
|
|
|
else if (piecesSize <= 13) {
|
|
|
|
|
text.setFillColor({255, 255, 0});
|
|
|
|
|
this->placeText(text, {}, sizeString + "(MEDIUM LOAD TIME)", 1.f, yPos, {});
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
text.setFillColor({255, 0, 0});
|
|
|
|
|
this->placeText(text, {}, sizeString + "(LONG LOAD TIME)", 1.f, yPos, {});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
int numberOfPieces = this->settings->getMenu().readPiecesList().getNumberOfPieces(piecesSize);
|
|
|
|
|
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});
|
|
|
|
|
text.setOutlineColor({255, 255, 255});
|
|
|
|
|
|
|
|
|
|
this->placeText(text, {}, "SIZE " + std::to_string(piecesSize), 1.f, yPos, {});
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 7; i++) {
|
|
|
|
|
if (i + firstElem >= numberOfPieces) return;
|
|
|
|
|
|
|
|
|
|
if ((i + firstElem) < 0) {
|
|
|
|
|
switch (i + firstElem) {
|
|
|
|
|
case -4 : {this->placeText(text, this->playerCursor, "ALL", 10.f + (i * 10.f), yPos, sf::Vector2u{0, piecesSize + 1u}); break;}
|
|
|
|
|
case -3 : {this->placeText(text, this->playerCursor, "CONVEX", 10.f + (i * 10.f), yPos, sf::Vector2u{1, piecesSize + 1u}); break;}
|
|
|
|
|
case -2 : {this->placeText(text, this->playerCursor, "HOLELESS", 10.f + (i * 10.f), yPos, sf::Vector2u{2, piecesSize + 1u}); break;}
|
|
|
|
|
case -1 : {this->placeText(text, this->playerCursor, "OTHER", 10.f + (i * 10.f), yPos, sf::Vector2u{3, piecesSize + 1u}); break;}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const Piece& piece = this->settings->getMenu().readPiecesList().lookAtPiece({piecesSize, firstElem + i});
|
|
|
|
|
int cellSize = (8 * this->settings->getWindowSizeMultiplier()) / (piece.getLength());
|
|
|
|
|
sf::FloatRect piecePosition(sf::Vector2f(10.f + (i * 10.f), yPos - 4.f) * (float) this->settings->getWindowSizeMultiplier(), sf::Vector2f(8 , 8) * (float) this->settings->getWindowSizeMultiplier());
|
|
|
|
|
this->drawPiece(piece, cellSize, piecePosition, this->playerCursor.getPosition() == sf::Vector2u{i + firstElem + 4u, piecesSize + 1u});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|