Compare commits
1 Commits
assets
...
6ed85869ae
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ed85869ae |
@@ -24,11 +24,12 @@ You will find more infos about the Rotation System, the scoring system, or the d
|
||||
|
||||
- Every polyominoes up to pentedecaminoes!
|
||||
- 7bag with proportionnality for each polyomino size!
|
||||
- AutoRS as the Rotation System!
|
||||
- 0° rotations!
|
||||
- All spin!
|
||||
- IRS, IHS, infinite hold, and other leniency mechanics!
|
||||
- Customizable board size!
|
||||
- Customizable keybinds!
|
||||
- 0° rotations!
|
||||
- AutoRS as the Rotation System!
|
||||
- IRS, IHS, infinite hold, and other leniency mechanics!
|
||||
- Very bland interface!! (i'm not a designer)
|
||||
|
||||
### Available gamemodes
|
||||
@@ -37,6 +38,7 @@ You will find more infos about the Rotation System, the scoring system, or the d
|
||||
- MARATHON : clear 200 lines with increasing gravity!
|
||||
- ULTRA : scores as much as possible in only 2 minutes!
|
||||
- MASTER : clear 200 lines at levels higher than maximum gravity!
|
||||
- INVISIBLE : get 1000 grade while not being able to see the board!
|
||||
- ZEN : practice indefinitely in this mode with no gravity!
|
||||
|
||||
### Screenshots
|
||||
|
||||
@@ -366,6 +366,10 @@ bool Game::areBlocksBones() const {
|
||||
return this->parameters.getBoneBlocks();
|
||||
}
|
||||
|
||||
bool Game::isBoardInvisible() const {
|
||||
return this->parameters.getInvisibleBoard();
|
||||
}
|
||||
|
||||
const Board& Game::getBoard() const {
|
||||
return this->board.getBoard();
|
||||
}
|
||||
|
||||
@@ -136,6 +136,11 @@ class Game {
|
||||
*/
|
||||
bool areBlocksBones() const;
|
||||
|
||||
/**
|
||||
* @return If the board is currently invisible
|
||||
*/
|
||||
bool isBoardInvisible() const;
|
||||
|
||||
/**
|
||||
* @return The board
|
||||
*/
|
||||
|
||||
@@ -24,6 +24,8 @@ void GameParameters::reset() {
|
||||
case MARATHON : {this->level = 1; break;}
|
||||
// goes from level 20 to 39
|
||||
case MASTER : {this->level = 20; break;}
|
||||
// goes from level 1 to 19
|
||||
case INVISIBLE : {this->level = 1; break;}
|
||||
// no gravity
|
||||
case ZEN : {this->level = 0; break;}
|
||||
default : this->level = 1;
|
||||
@@ -34,7 +36,7 @@ void GameParameters::reset() {
|
||||
|
||||
void GameParameters::lockedPiece(const LineClear& lineClear) {
|
||||
switch (this->gamemode) {
|
||||
// modes where level increases
|
||||
// modes where level increases with lines
|
||||
case MARATHON :
|
||||
case MASTER : {
|
||||
int previousLines = this->clearedLines;
|
||||
@@ -51,9 +53,23 @@ void GameParameters::lockedPiece(const LineClear& lineClear) {
|
||||
default : this->clearedLines += lineClear.lines;
|
||||
}
|
||||
|
||||
int previousGrade = this->grade;
|
||||
if (!((lineClear.lines == 0) && ((this->grade % 100) == 99))) {
|
||||
this->grade += (1 + lineClear.lines);
|
||||
}
|
||||
|
||||
switch (this->gamemode) {
|
||||
// modes where level increases with grade
|
||||
case INVISIBLE : {
|
||||
if (previousGrade / 100 < this->grade / 100) {
|
||||
this->level += 2;
|
||||
this->updateStats();
|
||||
}
|
||||
break;
|
||||
}
|
||||
// other modes
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
|
||||
bool GameParameters::hasWon(int framesPassed) const {
|
||||
@@ -66,6 +82,8 @@ bool GameParameters::hasWon(int framesPassed) const {
|
||||
case MARATHON : return this->clearedLines >= 200;
|
||||
// win once 200 lines have been cleared
|
||||
case MASTER : return this->clearedLines >= 200;
|
||||
// win once 1000 grade has been passed
|
||||
case INVISIBLE : return this->grade >= 1000;
|
||||
// infinite mode
|
||||
case ZEN :
|
||||
default : return false;
|
||||
@@ -84,7 +102,8 @@ void GameParameters::updateStats() {
|
||||
}
|
||||
// 3 for slow-controls gamemodes
|
||||
case MARATHON :
|
||||
case MASTER : {
|
||||
case MASTER :
|
||||
case INVISIBLE : {
|
||||
this->nextQueueLength = 3;
|
||||
break;
|
||||
}
|
||||
@@ -94,10 +113,13 @@ void GameParameters::updateStats() {
|
||||
/* BONE BLOCKS */
|
||||
switch (this->gamemode) {
|
||||
// blocks turns into bone blocks at level 30
|
||||
case MASTER : this->boneBlocks = (this->level >= 30);
|
||||
case MASTER : {this->boneBlocks = (this->level >= 30); break;}
|
||||
default : this->boneBlocks = false;
|
||||
}
|
||||
|
||||
/* INVISIBLE */
|
||||
this->invisibleBoard = (this->gamemode == INVISIBLE);
|
||||
|
||||
/* GRAVITY */
|
||||
// get gravity for an assumed 20-rows board
|
||||
static const int gravityPerLevel[] = {
|
||||
@@ -152,6 +174,8 @@ void GameParameters::updateStats() {
|
||||
case MARATHON : {this->ARE = 24 - (this->level - 1); break;}
|
||||
// starts at 400ms (24f) at lvl 20 and ends at 083ms (5f) at lvl 39
|
||||
case MASTER : {this->ARE = 24 - (this->level - 20); break;}
|
||||
// fixed at 250ms (15f)
|
||||
case INVISIBLE : {this->ARE = 15; break;}
|
||||
// no ARE by default
|
||||
default : this->ARE = 0;
|
||||
}
|
||||
@@ -228,6 +252,10 @@ bool GameParameters::getBoneBlocks() const {
|
||||
return this->boneBlocks;
|
||||
}
|
||||
|
||||
bool GameParameters::getInvisibleBoard() const {
|
||||
return this->invisibleBoard;
|
||||
}
|
||||
|
||||
int GameParameters::getGravity() const {
|
||||
return this->gravity;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ class GameParameters {
|
||||
int grade; // the current amount of points
|
||||
int nextQueueLength; // the number of pieces visibles in the next queue
|
||||
bool boneBlocks; // wheter all blocks are bone blocks
|
||||
bool invisibleBoard; // wheter the board is invisible
|
||||
int gravity; // the gravity at which pieces drop
|
||||
int lockDelay; // the time before the piece lock in place
|
||||
int forcedLockDelay; // the forced time before the piece lock in place
|
||||
@@ -77,9 +78,14 @@ class GameParameters {
|
||||
int getNextQueueLength() const;
|
||||
|
||||
/**
|
||||
* Returns wheter the blocks are currently bone blocks
|
||||
* @return Wheter the blocks are currently bone blocks
|
||||
*/
|
||||
bool getBoneBlocks() const;
|
||||
|
||||
/**
|
||||
* @return Wheter the board is currently invisible
|
||||
*/
|
||||
bool getInvisibleBoard() const;
|
||||
|
||||
/**
|
||||
* @return The current gravity for a 20-line high board
|
||||
|
||||
@@ -11,6 +11,7 @@ enum Gamemode {
|
||||
MARATHON,
|
||||
ULTRA,
|
||||
MASTER,
|
||||
INVISIBLE,
|
||||
ZEN
|
||||
};
|
||||
|
||||
@@ -24,6 +25,7 @@ inline std::string getGamemodeName(Gamemode gamemode) {
|
||||
"MARATHON",
|
||||
"ULTRA",
|
||||
"MASTER",
|
||||
"INVISIBLE",
|
||||
"ZEN"
|
||||
};
|
||||
|
||||
@@ -39,6 +41,7 @@ inline std::string getGamemodeGoal(Gamemode gamemode) {
|
||||
"200 lines",
|
||||
"2 minutes",
|
||||
"200 lines",
|
||||
"1000 grade",
|
||||
"Infinite"
|
||||
};
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "AppMenu.h"
|
||||
|
||||
#include "../../Utils/AssetManager.h"
|
||||
|
||||
AppMenu::AppMenu(std::shared_ptr<MenuStack> menuStack, std::shared_ptr<Settings> settings, std::shared_ptr<sf::RenderWindow> renderWindow) : menuStack(menuStack),
|
||||
settings(settings),
|
||||
renderWindow(renderWindow)
|
||||
{
|
||||
const Asset& file = getResource(AssetName::data_fonts_pressstart_prstartk_ttf);
|
||||
|
||||
this->pressStartFont = sf::Font(file.data, file.size);
|
||||
}
|
||||
@@ -21,10 +21,16 @@ class AppMenu {
|
||||
bool enterReleased = false;
|
||||
bool escPressed = false;
|
||||
bool escReleased = false;
|
||||
sf::Font pressStartFont;
|
||||
sf::Font pressStartFont = sf::Font("data/fonts/pressstart/prstartk.ttf");
|
||||
|
||||
public:
|
||||
AppMenu(std::shared_ptr<MenuStack> menuStack, std::shared_ptr<Settings> settings, std::shared_ptr<sf::RenderWindow> renderWindow);
|
||||
AppMenu(std::shared_ptr<MenuStack> menuStack, std::shared_ptr<Settings> settings, std::shared_ptr<sf::RenderWindow> renderWindow) :
|
||||
menuStack(menuStack),
|
||||
settings(settings),
|
||||
renderWindow(renderWindow)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void computeFrame() = 0;
|
||||
|
||||
|
||||
@@ -104,17 +104,26 @@ void GamePlayingAppMenu::computeFrame() {
|
||||
|
||||
void GamePlayingAppMenu::drawFrame() const {
|
||||
this->renderWindow->clear(sf::Color(200, 200, 200));
|
||||
|
||||
|
||||
sf::Color bonesBlockColor(0, 0, 0);
|
||||
sf::Color bonesBlockGhostColor(100, 100, 100);
|
||||
bool areBlockBones = this->game.areBlocksBones();
|
||||
bool isBoardInvisible = this->game.isBoardInvisible() && !(this->game.hasWon() || this->game.hasLost());
|
||||
|
||||
sf::Vector2f cellSize(this->cellSizeZoom, this->cellSizeZoom);
|
||||
float cellOutlineThickness = this->cellSizeZoom / 4;
|
||||
bool drawActivePiece = (this->game.getActivePiece() != nullptr) && (!this->game.hasLost());
|
||||
|
||||
// board
|
||||
for (int y = this->game.getBoard().getBaseHeight() + 9; y >= 0; y--) {
|
||||
for (int x = 0; x < this->game.getBoard().getWidth(); x++) {
|
||||
Block block = this->game.getBoard().getBlock(Position{x, y});
|
||||
if (isBoardInvisible) block = NOTHING;
|
||||
|
||||
sf::RectangleShape cell(cellSize);
|
||||
cell.setFillColor(this->getColorOfBlock(block, (block == NOTHING) ? 0 : -30));
|
||||
cell.setFillColor((areBlockBones && block != NOTHING)
|
||||
? bonesBlockColor
|
||||
: this->getColorOfBlock(block, (block == NOTHING) ? 0 : -30));
|
||||
cell.setPosition(this->getBoardBlockPosition(x, y));
|
||||
this->renderWindow->draw(cell);
|
||||
}
|
||||
@@ -122,7 +131,10 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
|
||||
if (drawActivePiece) {
|
||||
// ghost piece
|
||||
sf::Color ghostColor = this->getColorOfBlock(this->game.getActivePiece()->getBlockType(), 100);
|
||||
sf::Color ghostColor = areBlockBones
|
||||
? bonesBlockGhostColor
|
||||
: this->getColorOfBlock(this->game.getActivePiece()->getBlockType(), 100);
|
||||
|
||||
for (const Position& position : this->game.getActivePiece()->getPositions()) {
|
||||
Position cellPosition = (this->game.getGhostPiecePosition() + position);
|
||||
|
||||
@@ -133,13 +145,13 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
}
|
||||
|
||||
// active piece outline
|
||||
float pieceOutlineSize = std::roundf(this->cellSizeZoom / 4);
|
||||
sf::Color pieceOultlineColor = sf::Color(255, 255 - (255 * this->game.getForcedLockDelayProgression()), 255 - (255 * this->game.getForcedLockDelayProgression()));
|
||||
|
||||
for (const Position& position : this->game.getActivePiece()->getPositions()) {
|
||||
Position cellPosition = (this->game.getActivePiecePosition() + position);
|
||||
|
||||
sf::RectangleShape cell(cellSize);
|
||||
cell.setOutlineThickness(pieceOutlineSize);
|
||||
cell.setOutlineThickness(cellOutlineThickness);
|
||||
cell.setOutlineColor(pieceOultlineColor);
|
||||
cell.setPosition(this->getBoardBlockPosition(cellPosition.x, cellPosition.y));
|
||||
this->renderWindow->draw(cell);
|
||||
@@ -154,7 +166,9 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
|
||||
if (drawActivePiece) {
|
||||
// active piece
|
||||
sf::Color pieceColor = this->getColorOfBlock(this->game.getActivePiece()->getBlockType(), -200 * (this->game.getLockDelayProgression()));
|
||||
sf::Color pieceColor = areBlockBones
|
||||
? bonesBlockColor
|
||||
: this->getColorOfBlock(this->game.getActivePiece()->getBlockType(), -200 * (this->game.getLockDelayProgression()));
|
||||
|
||||
for (const Position& position : this->game.getActivePiece()->getPositions()) {
|
||||
Position cellPosition = (this->game.getActivePiecePosition() + position);
|
||||
@@ -173,7 +187,9 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
nextBox.position.y -= upShift;
|
||||
|
||||
sf::Vector2f nextCellSize(this->nextCellSizeZoom, this->nextCellSizeZoom);
|
||||
sf::Color color = this->getColorOfBlock(this->game.getNextPieces().at(i).getBlockType(), 0);
|
||||
sf::Color pieceColor = areBlockBones
|
||||
? bonesBlockColor
|
||||
: this->getColorOfBlock(this->game.getNextPieces().at(i).getBlockType(), 0);
|
||||
sf::Color boxColor = sf::Color(180, 180, 180);
|
||||
|
||||
int lowestRank = 0;
|
||||
@@ -181,7 +197,7 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
for (int x = 0; x < this->game.getNextPieces().at(i).getLength(); x++) {
|
||||
sf::RectangleShape cell(nextCellSize);
|
||||
if (this->game.getNextPieces().at(i).getPositions().contains(Position{x, y})) {
|
||||
cell.setFillColor(color);
|
||||
cell.setFillColor(pieceColor);
|
||||
lowestRank = y;
|
||||
}
|
||||
else {
|
||||
@@ -199,9 +215,11 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
// hold box
|
||||
if (this->game.getHeldPiece() != nullptr) {
|
||||
sf::Vector2f holdCellSize(this->holdCellSizeZoom, this->holdCellSizeZoom);
|
||||
sf::Color color = this->getColorOfBlock(this->game.getHeldPiece()->getBlockType(), 0);
|
||||
sf::Color color = areBlockBones
|
||||
? bonesBlockColor
|
||||
: this->getColorOfBlock(this->game.getHeldPiece()->getBlockType(), 0);
|
||||
sf::Color boxColor = sf::Color(180, 180, 180);
|
||||
|
||||
|
||||
for (int y = 0; y < this->game.getHeldPiece()->getLength(); y++) {
|
||||
for (int x = 0; x < this->game.getHeldPiece()->getLength(); x++) {
|
||||
sf::RectangleShape cell(holdCellSize);
|
||||
@@ -212,7 +230,7 @@ void GamePlayingAppMenu::drawFrame() const {
|
||||
cell.setFillColor(boxColor);
|
||||
}
|
||||
cell.setPosition(sf::Vector2f(this->holdBoxPosition.position.x + (x * this->nextCellSizeZoom),
|
||||
this->holdBoxPosition.position.y + ((this->game.getHeldPiece()->getLength() - y - 1) * this->holdCellSizeZoom)));
|
||||
this->holdBoxPosition.position.y + ((this->game.getHeldPiece()->getLength() - y - 1) * this->holdCellSizeZoom)));
|
||||
this->renderWindow->draw(cell);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
GameSettingsAppMenu::GameSettingsAppMenu(std::shared_ptr<MenuStack> menuStack, std::shared_ptr<Settings> settings, std::shared_ptr<sf::RenderWindow> renderWindow) :
|
||||
AppMenu(menuStack, settings, renderWindow),
|
||||
playerCursor({2, 3, 2}) {
|
||||
playerCursor({2, 3, 3}) {
|
||||
|
||||
}
|
||||
|
||||
@@ -33,7 +33,8 @@ void GameSettingsAppMenu::computeFrame() {
|
||||
case 2 : {
|
||||
switch (this->playerCursor.getPosition().x) {
|
||||
case 0 : {this->settings->setGamemode(MASTER); break;}
|
||||
case 1 : {this->settings->setGamemode(ZEN); break;}
|
||||
case 1 : {this->settings->setGamemode(INVISIBLE); break;}
|
||||
case 2 : {this->settings->setGamemode(ZEN); break;}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -76,7 +77,8 @@ void GameSettingsAppMenu::drawFrame() const {
|
||||
this->placeText(text, this->playerCursor, "MARATHON", 25.f, 35.f, sf::Vector2u{1, 1});
|
||||
this->placeText(text, this->playerCursor, "ULTRA", 50.f, 35.f, sf::Vector2u{2, 1});
|
||||
this->placeText(text, this->playerCursor, "MASTER", 5.f, 45.f, sf::Vector2u{0, 2});
|
||||
this->placeText(text, this->playerCursor, "ZEN", 25.f, 45.f, sf::Vector2u{1, 2});
|
||||
this->placeText(text, this->playerCursor, "INVISIBLE", 25.f, 45.f, sf::Vector2u{1, 2});
|
||||
this->placeText(text, this->playerCursor, "ZEN", 50.f, 45.f, sf::Vector2u{2, 2});
|
||||
|
||||
this->renderWindow->display();
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
#include "AppMenu.h"
|
||||
#include "../PlayerCursor.h"
|
||||
#include "../../Utils/AssetManager.h"
|
||||
|
||||
#include <stack>
|
||||
#include <memory>
|
||||
@@ -23,9 +22,8 @@ SettingsKeybindsAppMenu::SettingsKeybindsAppMenu(std::shared_ptr<MenuStack> menu
|
||||
std::string textureName = ACTION_NAMES[action];
|
||||
textureName = std::regex_replace(textureName, std::regex(" "), "");
|
||||
|
||||
const Asset& textureData = getResource("data/images/keybinds/" + textureName + ".png");
|
||||
|
||||
this->iconTextures[action] = sf::Texture(textureData.data, textureData.size, false, {{0, 0}, {16, 16}});
|
||||
std::filesystem::path texturePath("data/images/keybinds/" + textureName + ".png");
|
||||
this->iconTextures[action] = sf::Texture(texturePath, false, {{0, 0}, {16, 16}});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@ int main() {
|
||||
|
||||
|
||||
void resetSettingsFile() {
|
||||
std::filesystem::create_directories("data/config");
|
||||
std::ofstream settingsFile("data/config/settings.bin", std::ios::trunc | std::ios::binary);
|
||||
char byte;
|
||||
|
||||
@@ -138,7 +137,6 @@ void resetSettingsFile() {
|
||||
void resetKeybindFile(int layout) {
|
||||
if (layout < 0 || layout > 4) return;
|
||||
|
||||
std::filesystem::create_directories("data/config/keybinds/layout");
|
||||
std::ofstream layoutFile("data/config/keybinds/layout" + std::to_string(layout) + ".bin", std::ios::trunc | std::ios::binary);
|
||||
std::map<Action, sfKey> keybinds;
|
||||
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
#include <filesystem>
|
||||
#include <algorithm>
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
|
||||
PiecesFiles::PiecesFiles() {
|
||||
}
|
||||
@@ -134,12 +132,7 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector<Piece>& pieces, std:
|
||||
|
||||
bool PiecesFiles::getFilePath(int polyominoSize, std::string& filePath) const {
|
||||
std::string dataFolderPath = "data/pieces/";
|
||||
|
||||
if (!fs::exists(dataFolderPath)) {
|
||||
fs::create_directories(dataFolderPath);
|
||||
}
|
||||
|
||||
if (!fs::is_directory(dataFolderPath)) {
|
||||
if (!std::filesystem::is_directory(dataFolderPath)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
#include "./AssetManager.h"
|
||||
|
||||
#include <map>
|
||||
|
||||
static const unsigned char data_fonts_pressstart_prstartk_ttf[] = {
|
||||
#include <data/fonts/pressstart/prstartk.ttf.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_fonts_pressstart_prstart_ttf[] = {
|
||||
#include <data/fonts/pressstart/prstart.ttf.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Rotate0_png[] = {
|
||||
#include <data/images/keybinds/Rotate0.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Moveright_png[] = {
|
||||
#include <data/images/keybinds/Moveright.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_RotateCW_png[] = {
|
||||
#include <data/images/keybinds/RotateCW.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Pause_png[] = {
|
||||
#include <data/images/keybinds/Pause.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Hold_png[] = {
|
||||
#include <data/images/keybinds/Hold.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Softdrop_png[] = {
|
||||
#include <data/images/keybinds/Softdrop.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_RotateCCW_png[] = {
|
||||
#include <data/images/keybinds/RotateCCW.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Moveleft_png[] = {
|
||||
#include <data/images/keybinds/Moveleft.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Rotate180_png[] = {
|
||||
#include <data/images/keybinds/Rotate180.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Retry_png[] = {
|
||||
#include <data/images/keybinds/Retry.png.h>
|
||||
};
|
||||
|
||||
static const unsigned char data_images_keybinds_Harddrop_png[] = {
|
||||
#include <data/images/keybinds/Harddrop.png.h>
|
||||
};
|
||||
|
||||
static const Asset assets[] = {
|
||||
{data_fonts_pressstart_prstartk_ttf, sizeof(data_fonts_pressstart_prstartk_ttf)},
|
||||
{data_fonts_pressstart_prstart_ttf, sizeof(data_fonts_pressstart_prstart_ttf)},
|
||||
{data_images_keybinds_Rotate0_png, sizeof(data_images_keybinds_Rotate0_png)},
|
||||
{data_images_keybinds_Moveright_png, sizeof(data_images_keybinds_Moveright_png)},
|
||||
{data_images_keybinds_RotateCW_png, sizeof(data_images_keybinds_RotateCW_png)},
|
||||
{data_images_keybinds_Pause_png, sizeof(data_images_keybinds_Pause_png)},
|
||||
{data_images_keybinds_Hold_png, sizeof(data_images_keybinds_Hold_png)},
|
||||
{data_images_keybinds_Softdrop_png, sizeof(data_images_keybinds_Softdrop_png)},
|
||||
{data_images_keybinds_RotateCCW_png, sizeof(data_images_keybinds_RotateCCW_png)},
|
||||
{data_images_keybinds_Moveleft_png, sizeof(data_images_keybinds_Moveleft_png)},
|
||||
{data_images_keybinds_Rotate180_png, sizeof(data_images_keybinds_Rotate180_png)},
|
||||
{data_images_keybinds_Retry_png, sizeof(data_images_keybinds_Retry_png)},
|
||||
{data_images_keybinds_Harddrop_png, sizeof(data_images_keybinds_Harddrop_png)},
|
||||
|
||||
};
|
||||
|
||||
static const std::map<std::string, AssetName> assetMap = {
|
||||
{"data/fonts/pressstart/prstartk.ttf", AssetName::data_fonts_pressstart_prstartk_ttf},
|
||||
{"data/fonts/pressstart/prstart.ttf", AssetName::data_fonts_pressstart_prstart_ttf},
|
||||
{"data/images/keybinds/Rotate0.png", AssetName::data_images_keybinds_Rotate0_png},
|
||||
{"data/images/keybinds/Moveright.png", AssetName::data_images_keybinds_Moveright_png},
|
||||
{"data/images/keybinds/RotateCW.png", AssetName::data_images_keybinds_RotateCW_png},
|
||||
{"data/images/keybinds/Pause.png", AssetName::data_images_keybinds_Pause_png},
|
||||
{"data/images/keybinds/Hold.png", AssetName::data_images_keybinds_Hold_png},
|
||||
{"data/images/keybinds/Softdrop.png", AssetName::data_images_keybinds_Softdrop_png},
|
||||
{"data/images/keybinds/RotateCCW.png", AssetName::data_images_keybinds_RotateCCW_png},
|
||||
{"data/images/keybinds/Moveleft.png", AssetName::data_images_keybinds_Moveleft_png},
|
||||
{"data/images/keybinds/Rotate180.png", AssetName::data_images_keybinds_Rotate180_png},
|
||||
{"data/images/keybinds/Retry.png", AssetName::data_images_keybinds_Retry_png},
|
||||
{"data/images/keybinds/Harddrop.png", AssetName::data_images_keybinds_Harddrop_png},
|
||||
|
||||
};
|
||||
|
||||
const Asset& getResource(AssetName fileName) {
|
||||
return assets[static_cast<std::size_t>(fileName)];
|
||||
}
|
||||
|
||||
const Asset& getResource(const std::string& fileName) {
|
||||
return getResource(assetMap.at(fileName));
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
struct Asset {
|
||||
const unsigned char* data;
|
||||
std::size_t size;
|
||||
};
|
||||
|
||||
enum class AssetName {
|
||||
data_fonts_pressstart_prstartk_ttf,
|
||||
data_fonts_pressstart_prstart_ttf,
|
||||
data_images_keybinds_Rotate0_png,
|
||||
data_images_keybinds_Moveright_png,
|
||||
data_images_keybinds_RotateCW_png,
|
||||
data_images_keybinds_Pause_png,
|
||||
data_images_keybinds_Hold_png,
|
||||
data_images_keybinds_Softdrop_png,
|
||||
data_images_keybinds_RotateCCW_png,
|
||||
data_images_keybinds_Moveleft_png,
|
||||
data_images_keybinds_Rotate180_png,
|
||||
data_images_keybinds_Retry_png,
|
||||
data_images_keybinds_Harddrop_png,
|
||||
|
||||
};
|
||||
|
||||
const Asset& getResource(AssetName fileName);
|
||||
|
||||
const Asset& getResource(const std::string& fileName);
|
||||
@@ -1,7 +1,5 @@
|
||||
add_rules("mode.debug", "mode.release")
|
||||
|
||||
includes("xmake/bin2c.lua")
|
||||
|
||||
add_requires("sfml 3.0.0")
|
||||
|
||||
set_languages("c++20")
|
||||
@@ -15,14 +13,8 @@ target("core")
|
||||
|
||||
target("graph")
|
||||
set_default(true)
|
||||
add_rules("bin2c", {
|
||||
extensions = {".png", ".ttf"},
|
||||
outputSource = {"src/Utils/AssetManager.cpp"},
|
||||
outputHeader = {"src/Utils/AssetManager.h"}
|
||||
})
|
||||
set_kind("binary")
|
||||
add_files("./src/GraphicalUI/**.cpp")
|
||||
add_files("data/fonts/**.ttf", "data/images/**.png")
|
||||
add_deps("core")
|
||||
add_packages("sfml")
|
||||
|
||||
|
||||
124
xmake/bin2c.lua
124
xmake/bin2c.lua
@@ -1,124 +0,0 @@
|
||||
rule("bin2c")
|
||||
set_extensions(".bin")
|
||||
|
||||
on_load(function (target)
|
||||
local headerdir = path.join(target:autogendir(), "rules", "bin2c")
|
||||
|
||||
local outputSource = table.unpack(target:extraconf("rules", "bin2c", "outputSource"))
|
||||
|
||||
if not os.isdir(headerdir) then
|
||||
os.mkdir(headerdir)
|
||||
end
|
||||
|
||||
target:add("includedirs", headerdir)
|
||||
|
||||
target:add("files", outputSource)
|
||||
end)
|
||||
|
||||
before_buildcmd_files(function (target, batchcmds, sourcebatch, opt)
|
||||
local outputHeader = table.unpack(target:extraconf("rules", "bin2c", "outputHeader"))
|
||||
|
||||
local outputHeaderEnumContent = ""
|
||||
|
||||
for _, filePath in ipairs(sourcebatch.sourcefiles) do
|
||||
local escapedName = string.gsub(filePath, "[/|.]", "_")
|
||||
outputHeaderEnumContent = outputHeaderEnumContent .. "\t" .. escapedName .. ",\n"
|
||||
end
|
||||
|
||||
local outputHeaderContent = string.format([[
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
struct Asset {
|
||||
const unsigned char* data;
|
||||
std::size_t size;
|
||||
};
|
||||
|
||||
enum class AssetName {
|
||||
%s
|
||||
};
|
||||
|
||||
const Asset& getResource(AssetName fileName);
|
||||
|
||||
const Asset& getResource(const std::string& fileName);
|
||||
]], outputHeaderEnumContent)
|
||||
|
||||
local outputSource = table.unpack(target:extraconf("rules", "bin2c", "outputSource"))
|
||||
|
||||
local relativePath = path.join(path.relative(path.directory(outputHeader), path.directory(outputSource)), path.filename(outputHeader))
|
||||
|
||||
local outputSourceContent = string.format([[
|
||||
#include "%s"
|
||||
|
||||
#include <map>
|
||||
|
||||
]], relativePath)
|
||||
|
||||
|
||||
local outputSourceArrayVars = ""
|
||||
local outputSourceMapVars = ""
|
||||
|
||||
for _, filePath in ipairs(sourcebatch.sourcefiles) do
|
||||
local escapedName = string.gsub(filePath, "[/|.]", "_")
|
||||
local varDecl = string.format("static const unsigned char %s[] = {\n\t#include <%s>\n};\n\n", escapedName, filePath .. ".h")
|
||||
outputSourceContent = outputSourceContent .. varDecl
|
||||
outputSourceArrayVars = outputSourceArrayVars .. string.format("\t{%s, sizeof(%s)},\n", escapedName, escapedName)
|
||||
outputSourceMapVars = outputSourceMapVars .. string.format("\t{\"%s\", AssetName::%s},\n", filePath, escapedName)
|
||||
end
|
||||
|
||||
outputSourceContent = outputSourceContent .. string.format([[
|
||||
static const Asset assets[] = {
|
||||
%s
|
||||
};
|
||||
|
||||
static const std::map<std::string, AssetName> assetMap = {
|
||||
%s
|
||||
};
|
||||
|
||||
]], outputSourceArrayVars, outputSourceMapVars)
|
||||
|
||||
outputSourceContent = outputSourceContent .. [[
|
||||
const Asset& getResource(AssetName fileName) {
|
||||
return assets[static_cast<std::size_t>(fileName)];
|
||||
}
|
||||
|
||||
const Asset& getResource(const std::string& fileName) {
|
||||
return getResource(assetMap.at(fileName));
|
||||
}
|
||||
]]
|
||||
|
||||
for _, sourcefile_bin in ipairs(sourcebatch.sourcefiles) do
|
||||
-- get header file
|
||||
local headerdir = path.join(target:autogendir(), "rules", "bin2c")
|
||||
local headerfile = path.join(headerdir, sourcefile_bin .. ".h")
|
||||
target:add("includedirs", headerdir)
|
||||
|
||||
-- add commands
|
||||
batchcmds:show_progress(opt.progress, "${color.build.object}generating.bin2c %s", sourcefile_bin)
|
||||
batchcmds:mkdir(headerdir)
|
||||
local argv = {"lua", "private.utils.bin2c", "-i", path(sourcefile_bin), "-o", path(headerfile)}
|
||||
local linewidth = target:extraconf("rules", "bin2c", "linewidth")
|
||||
if linewidth then
|
||||
table.insert(argv, "-w")
|
||||
table.insert(argv, tostring(linewidth))
|
||||
end
|
||||
local nozeroend = target:extraconf("rules", "bin2c", "nozeroend")
|
||||
if nozeroend then
|
||||
table.insert(argv, "--nozeroend")
|
||||
end
|
||||
batchcmds:vrunv(os.programfile(), argv, {envs = {XMAKE_SKIP_HISTORY = "y"}})
|
||||
|
||||
-- add deps
|
||||
batchcmds:add_depfiles(sourcefile_bin)
|
||||
batchcmds:set_depmtime(os.mtime(headerfile))
|
||||
batchcmds:set_depcache(target:dependfile(headerfile))
|
||||
|
||||
end
|
||||
|
||||
batchcmds:show_progress(opt.progress, "${color.build.object}generating.bin2c %s", outputHeader)
|
||||
io.writefile(outputHeader, outputHeaderContent)
|
||||
batchcmds:show_progress(opt.progress, "${color.build.object}generating.bin2c %s", outputSource)
|
||||
io.writefile(outputSource, outputSourceContent)
|
||||
end)
|
||||
Reference in New Issue
Block a user