After some prototyping I have what I think I want for the map. Just a simple piece of paper you take out that has the ASCII map on it.
This commit is contained in:
parent
acbf384e2a
commit
6c9016eb0f
21 changed files with 1184 additions and 92 deletions
2
Makefile
2
Makefile
|
@ -22,7 +22,7 @@ tracy_build:
|
||||||
meson compile -j 10 -C builddir
|
meson compile -j 10 -C builddir
|
||||||
|
|
||||||
test: build
|
test: build
|
||||||
./builddir/runtests "[animation]"
|
./builddir/runtests
|
||||||
|
|
||||||
run: build test
|
run: build test
|
||||||
powershell "cp ./builddir/zedcaster.exe ."
|
powershell "cp ./builddir/zedcaster.exe ."
|
||||||
|
|
|
@ -53,7 +53,8 @@
|
||||||
"tunnel_with_rocks": "assets/tunnel_with_rocks.png",
|
"tunnel_with_rocks": "assets/tunnel_with_rocks.png",
|
||||||
"tunnel_with_rocks_stage": "assets/tunnel_with_rocks_stage.png",
|
"tunnel_with_rocks_stage": "assets/tunnel_with_rocks_stage.png",
|
||||||
"ritual_crafting_area": "assets/ritual_crafting_area.png",
|
"ritual_crafting_area": "assets/ritual_crafting_area.png",
|
||||||
"the_ritual_circle": "assets/the_ritual_circle.png"
|
"the_ritual_circle": "assets/the_ritual_circle.png",
|
||||||
|
"paper_ui_background": "assets/paper_ui_background.png"
|
||||||
},
|
},
|
||||||
"worldgen": {
|
"worldgen": {
|
||||||
"enemy_probability": 50,
|
"enemy_probability": 50,
|
||||||
|
|
BIN
assets/paper_ui_background.png
Normal file
BIN
assets/paper_ui_background.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 285 KiB |
|
@ -4,20 +4,20 @@
|
||||||
"foreground": [40, 15, 125],
|
"foreground": [40, 15, 125],
|
||||||
"background": [200, 15, 75],
|
"background": [200, 15, 75],
|
||||||
"collision": false,
|
"collision": false,
|
||||||
"display":"\u289e"
|
"display":"."
|
||||||
},
|
},
|
||||||
"WALL_PLAIN": {
|
"WALL_PLAIN": {
|
||||||
"texture": "assets/wall_texture_test-256.png",
|
"texture": "assets/wall_texture_test-256.png",
|
||||||
"foreground": [230, 20, 30],
|
"foreground": [230, 20, 30],
|
||||||
"background": [230, 20, 120],
|
"background": [230, 20, 120],
|
||||||
"collision": true,
|
"collision": true,
|
||||||
"display": "\ua5b8"
|
"display": "#"
|
||||||
},
|
},
|
||||||
"WALL_VINES": {
|
"WALL_VINES": {
|
||||||
"texture": "assets/wall_with_vines-256.png",
|
"texture": "assets/wall_with_vines-256.png",
|
||||||
"foreground": [230, 20, 30],
|
"foreground": [230, 20, 30],
|
||||||
"background": [230, 20, 120],
|
"background": [230, 20, 120],
|
||||||
"collision": false,
|
"collision": false,
|
||||||
"display":"\u0799"
|
"display":"|"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ constexpr const int GUECS_PADDING = 3;
|
||||||
constexpr const int GUECS_BORDER_PX = 1;
|
constexpr const int GUECS_BORDER_PX = 1;
|
||||||
constexpr const int GUECS_FONT_SIZE = 30;
|
constexpr const int GUECS_FONT_SIZE = 30;
|
||||||
const sf::Color GUECS_FILL_COLOR = ColorValue::DARK_MID;
|
const sf::Color GUECS_FILL_COLOR = ColorValue::DARK_MID;
|
||||||
|
const sf::Color GUECS_TEXT_COLOR = ColorValue::LIGHT_LIGHT;
|
||||||
const sf::Color GUECS_BG_COLOR = ColorValue::MID;
|
const sf::Color GUECS_BG_COLOR = ColorValue::MID;
|
||||||
const sf::Color GUECS_BORDER_COLOR = ColorValue::MID;
|
const sf::Color GUECS_BORDER_COLOR = ColorValue::MID;
|
||||||
|
|
||||||
|
|
17
guecs.cpp
17
guecs.cpp
|
@ -64,9 +64,18 @@ namespace guecs {
|
||||||
text.init(cell, $font);
|
text.init(cell, $font);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$world.query<lel::Cell, WideText>([this](auto, auto& cell, auto& text) {
|
||||||
|
text.init(cell, $font);
|
||||||
|
});
|
||||||
|
|
||||||
|
$world.query<lel::Cell, WideLabel>([this](auto, auto& cell, auto& text) {
|
||||||
|
text.init(cell, $font);
|
||||||
|
});
|
||||||
|
|
||||||
$world.query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
|
$world.query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
|
||||||
sprite.init(cell);
|
sprite.init(cell);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UI::render(sf::RenderWindow& window) {
|
void UI::render(sf::RenderWindow& window) {
|
||||||
|
@ -94,6 +103,14 @@ namespace guecs {
|
||||||
window.draw(*text.text);
|
window.draw(*text.text);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$world.query<WideLabel>([&](auto, auto& text) {
|
||||||
|
window.draw(*text.text);
|
||||||
|
});
|
||||||
|
|
||||||
|
$world.query<WideText>([&](auto, auto& text) {
|
||||||
|
window.draw(*text.text);
|
||||||
|
});
|
||||||
|
|
||||||
$world.query<Textual>([&](auto, auto& text) {
|
$world.query<Textual>([&](auto, auto& text) {
|
||||||
window.draw(*text.text);
|
window.draw(*text.text);
|
||||||
});
|
});
|
||||||
|
|
77
guecs.hpp
77
guecs.hpp
|
@ -18,12 +18,34 @@ namespace guecs {
|
||||||
struct Label {
|
struct Label {
|
||||||
std::string label;
|
std::string label;
|
||||||
unsigned int size = GUECS_FONT_SIZE;
|
unsigned int size = GUECS_FONT_SIZE;
|
||||||
|
sf::Color color = GUECS_TEXT_COLOR;
|
||||||
shared_ptr<sf::Font> font = nullptr;
|
shared_ptr<sf::Font> font = nullptr;
|
||||||
shared_ptr<sf::Text> text = nullptr;
|
shared_ptr<sf::Text> text = nullptr;
|
||||||
|
|
||||||
void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) {
|
void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) {
|
||||||
|
dbc::check(font_ptr != nullptr, "you failed to initialize this Label");
|
||||||
if(font == nullptr) font = font_ptr;
|
if(font == nullptr) font = font_ptr;
|
||||||
if(text == nullptr) text = make_shared<sf::Text>(*font, label, size);
|
if(text == nullptr) text = make_shared<sf::Text>(*font, label, size);
|
||||||
|
text->setFillColor(color);
|
||||||
|
auto bounds = text->getLocalBounds();
|
||||||
|
auto text_cell = lel::center(bounds.size.x, bounds.size.y, cell);
|
||||||
|
// this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box
|
||||||
|
text->setPosition({float(text_cell.x), float(text_cell.y) - text_cell.h / 2});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WideLabel {
|
||||||
|
std::wstring label;
|
||||||
|
unsigned int size = GUECS_FONT_SIZE;
|
||||||
|
sf::Color color = GUECS_TEXT_COLOR;
|
||||||
|
shared_ptr<sf::Font> font = nullptr;
|
||||||
|
shared_ptr<sf::Text> text = nullptr;
|
||||||
|
|
||||||
|
void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) {
|
||||||
|
dbc::check(font_ptr != nullptr, "you failed to initialize this WideLabel");
|
||||||
|
if(font == nullptr) font = font_ptr;
|
||||||
|
if(text == nullptr) text = make_shared<sf::Text>(*font, label, size);
|
||||||
|
text->setFillColor(color);
|
||||||
auto bounds = text->getLocalBounds();
|
auto bounds = text->getLocalBounds();
|
||||||
auto text_cell = lel::center(bounds.size.x, bounds.size.y, cell);
|
auto text_cell = lel::center(bounds.size.x, bounds.size.y, cell);
|
||||||
// this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box
|
// this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box
|
||||||
|
@ -34,13 +56,17 @@ namespace guecs {
|
||||||
struct Textual {
|
struct Textual {
|
||||||
std::string content;
|
std::string content;
|
||||||
unsigned int size = GUECS_FONT_SIZE;
|
unsigned int size = GUECS_FONT_SIZE;
|
||||||
|
sf::Color color = GUECS_TEXT_COLOR;
|
||||||
|
int padding = GUECS_PADDING;
|
||||||
shared_ptr<sf::Font> font = nullptr;
|
shared_ptr<sf::Font> font = nullptr;
|
||||||
shared_ptr<sf::Text> text = nullptr;
|
shared_ptr<sf::Text> text = nullptr;
|
||||||
|
|
||||||
void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) {
|
void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) {
|
||||||
|
dbc::check(font_ptr != nullptr, "you failed to initialize this Text");
|
||||||
if(font == nullptr) font = font_ptr;
|
if(font == nullptr) font = font_ptr;
|
||||||
if(text == nullptr) text = make_shared<sf::Text>(*font, content, size);
|
if(text == nullptr) text = make_shared<sf::Text>(*font, content, size);
|
||||||
text->setPosition({float(cell.x + GUECS_PADDING * 2), float(cell.y + GUECS_PADDING * 2)});
|
text->setFillColor(color);
|
||||||
|
text->setPosition({float(cell.x + padding * 2), float(cell.y + padding * 2)});
|
||||||
text->setCharacterSize(size);
|
text->setCharacterSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +76,29 @@ namespace guecs {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WideText {
|
||||||
|
std::wstring content;
|
||||||
|
unsigned int size = GUECS_FONT_SIZE;
|
||||||
|
sf::Color color = GUECS_TEXT_COLOR;
|
||||||
|
int padding = GUECS_PADDING;
|
||||||
|
shared_ptr<sf::Font> font = nullptr;
|
||||||
|
shared_ptr<sf::Text> text = nullptr;
|
||||||
|
|
||||||
|
void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) {
|
||||||
|
dbc::check(font_ptr != nullptr, "you failed to initialize this WideText");
|
||||||
|
if(font == nullptr) font = font_ptr;
|
||||||
|
if(text == nullptr) text = make_shared<sf::Text>(*font, content, size);
|
||||||
|
text->setFillColor(color);
|
||||||
|
text->setPosition({float(cell.x + padding * 2), float(cell.y + padding * 2)});
|
||||||
|
text->setCharacterSize(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void update(std::wstring& new_content) {
|
||||||
|
content = new_content;
|
||||||
|
text->setString(content);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct Clickable {
|
struct Clickable {
|
||||||
/* This is actually called by UI::mouse and passed the entity ID of the
|
/* This is actually called by UI::mouse and passed the entity ID of the
|
||||||
* button pressed so you can interact with it in the event handler.
|
* button pressed so you can interact with it in the event handler.
|
||||||
|
@ -59,6 +108,7 @@ namespace guecs {
|
||||||
|
|
||||||
struct Sprite {
|
struct Sprite {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
int padding = GUECS_PADDING;
|
||||||
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
||||||
std::shared_ptr<sf::Texture> texture = nullptr;
|
std::shared_ptr<sf::Texture> texture = nullptr;
|
||||||
|
|
||||||
|
@ -67,26 +117,30 @@ namespace guecs {
|
||||||
texture = sprite_texture.texture;
|
texture = sprite_texture.texture;
|
||||||
sprite = make_shared<sf::Sprite>(*texture);
|
sprite = make_shared<sf::Sprite>(*texture);
|
||||||
sprite->setPosition({
|
sprite->setPosition({
|
||||||
float(cell.x + GUECS_PADDING),
|
float(cell.x + padding),
|
||||||
float(cell.y + GUECS_PADDING)});
|
float(cell.y + padding)});
|
||||||
|
|
||||||
auto size = texture->getSize();
|
auto size = texture->getSize();
|
||||||
sprite->setScale({
|
sprite->setScale({
|
||||||
float(cell.w - GUECS_PADDING * 2) / size.x,
|
float(cell.w - padding * 2) / size.x,
|
||||||
float(cell.h - GUECS_PADDING * 2) / size.y});
|
float(cell.h - padding * 2) / size.y});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Rectangle {
|
struct Rectangle {
|
||||||
|
int padding = GUECS_PADDING;
|
||||||
|
sf::Color color = GUECS_FILL_COLOR;
|
||||||
|
sf::Color border_color = GUECS_BORDER_COLOR;
|
||||||
|
int border_px = GUECS_BORDER_PX;
|
||||||
shared_ptr<sf::RectangleShape> shape = nullptr;
|
shared_ptr<sf::RectangleShape> shape = nullptr;
|
||||||
|
|
||||||
void init(lel::Cell& cell) {
|
void init(lel::Cell& cell) {
|
||||||
sf::Vector2f size{float(cell.w) - GUECS_PADDING * 2, float(cell.h) - GUECS_PADDING * 2};
|
sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2};
|
||||||
if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size);
|
if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size);
|
||||||
shape->setPosition({float(cell.x + GUECS_PADDING), float(cell.y + GUECS_PADDING)});
|
shape->setPosition({float(cell.x + padding), float(cell.y + padding)});
|
||||||
shape->setFillColor(GUECS_FILL_COLOR);
|
shape->setFillColor(color);
|
||||||
shape->setOutlineColor(GUECS_BORDER_COLOR);
|
shape->setOutlineColor(border_color);
|
||||||
shape->setOutlineThickness(GUECS_BORDER_PX);
|
shape->setOutlineThickness(border_px);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,6 +166,7 @@ namespace guecs {
|
||||||
float y = 0.0f;
|
float y = 0.0f;
|
||||||
float w = 0.0f;
|
float w = 0.0f;
|
||||||
float h = 0.0f;
|
float h = 0.0f;
|
||||||
|
sf::Color color = GUECS_BG_COLOR;
|
||||||
|
|
||||||
shared_ptr<sf::RectangleShape> shape = nullptr;
|
shared_ptr<sf::RectangleShape> shape = nullptr;
|
||||||
|
|
||||||
|
@ -128,7 +183,7 @@ namespace guecs {
|
||||||
sf::Vector2f size{float(w), float(h)};
|
sf::Vector2f size{float(w), float(h)};
|
||||||
if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size);
|
if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size);
|
||||||
shape->setPosition({float(x), float(y)});
|
shape->setPosition({float(x), float(y)});
|
||||||
shape->setFillColor(GUECS_BG_COLOR);
|
shape->setFillColor(color);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
32
gui_fsm.cpp
32
gui_fsm.cpp
|
@ -16,7 +16,6 @@ namespace gui {
|
||||||
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
|
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
|
||||||
$main_ui($window),
|
$main_ui($window),
|
||||||
$level($levels.current()),
|
$level($levels.current()),
|
||||||
$map_ui($level),
|
|
||||||
$combat_ui($level),
|
$combat_ui($level),
|
||||||
$status_ui($level),
|
$status_ui($level),
|
||||||
$font{FONT_FILE_NAME}
|
$font{FONT_FILE_NAME}
|
||||||
|
@ -28,7 +27,6 @@ namespace gui {
|
||||||
FSM_STATE(State, START, ev);
|
FSM_STATE(State, START, ev);
|
||||||
FSM_STATE(State, MOVING, ev);
|
FSM_STATE(State, MOVING, ev);
|
||||||
FSM_STATE(State, ATTACKING, ev);
|
FSM_STATE(State, ATTACKING, ev);
|
||||||
FSM_STATE(State, MAPPING, ev);
|
|
||||||
FSM_STATE(State, ROTATING, ev);
|
FSM_STATE(State, ROTATING, ev);
|
||||||
FSM_STATE(State, IDLE, ev);
|
FSM_STATE(State, IDLE, ev);
|
||||||
FSM_STATE(State, IN_COMBAT, ev);
|
FSM_STATE(State, IN_COMBAT, ev);
|
||||||
|
@ -41,10 +39,7 @@ namespace gui {
|
||||||
void FSM::START(Event ) {
|
void FSM::START(Event ) {
|
||||||
$main_ui.update_level($level);
|
$main_ui.update_level($level);
|
||||||
$level.world->set_the<Debug>({});
|
$level.world->set_the<Debug>({});
|
||||||
|
|
||||||
$main_ui.init();
|
$main_ui.init();
|
||||||
$map_ui.init();
|
|
||||||
|
|
||||||
$combat_ui.init();
|
$combat_ui.init();
|
||||||
$status_ui.init();
|
$status_ui.init();
|
||||||
$status_ui.log("Welcome to the game!");
|
$status_ui.log("Welcome to the game!");
|
||||||
|
@ -57,23 +52,6 @@ namespace gui {
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::MAPPING(Event ev) {
|
|
||||||
using enum Event;
|
|
||||||
// BUG: can't close window when in mapping
|
|
||||||
switch(ev) {
|
|
||||||
case MAP_OPEN:
|
|
||||||
state(State::IDLE);
|
|
||||||
break;
|
|
||||||
case CLOSE:
|
|
||||||
state(State::IDLE);
|
|
||||||
break;
|
|
||||||
case TICK:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dbc::log("invalid event sent to MAPPING");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FSM::MOVING(Event ) {
|
void FSM::MOVING(Event ) {
|
||||||
// this should be an optional that returns a point
|
// this should be an optional that returns a point
|
||||||
if(auto move_to = $main_ui.play_move()) {
|
if(auto move_to = $main_ui.play_move()) {
|
||||||
|
@ -148,7 +126,7 @@ namespace gui {
|
||||||
state(State::ROTATING);
|
state(State::ROTATING);
|
||||||
break;
|
break;
|
||||||
case MAP_OPEN:
|
case MAP_OPEN:
|
||||||
state(State::MAPPING);
|
$status_ui.map_open = !$status_ui.map_open;
|
||||||
break;
|
break;
|
||||||
case ATTACK:
|
case ATTACK:
|
||||||
state(State::ATTACKING);
|
state(State::ATTACKING);
|
||||||
|
@ -313,16 +291,15 @@ namespace gui {
|
||||||
$boss_fight_ui->render($window);
|
$boss_fight_ui->render($window);
|
||||||
} else {
|
} else {
|
||||||
$main_ui.render();
|
$main_ui.render();
|
||||||
|
|
||||||
$status_ui.render($window);
|
$status_ui.render($window);
|
||||||
|
|
||||||
$combat_ui.render($window);
|
$combat_ui.render($window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::render() {
|
void FSM::render() {
|
||||||
if(in_state(State::MAPPING)) {
|
if(in_state(State::NEXT_LEVEL)) {
|
||||||
$window.clear();
|
|
||||||
$map_ui.render($window);
|
|
||||||
} else if(in_state(State::NEXT_LEVEL)) {
|
|
||||||
$window.clear();
|
$window.clear();
|
||||||
$boss_fight_ui->render($window);
|
$boss_fight_ui->render($window);
|
||||||
} else {
|
} else {
|
||||||
|
@ -416,7 +393,6 @@ namespace gui {
|
||||||
|
|
||||||
$status_ui.update_level($level);
|
$status_ui.update_level($level);
|
||||||
$combat_ui.update_level($level);
|
$combat_ui.update_level($level);
|
||||||
$map_ui.update_level($level);
|
|
||||||
$main_ui.update_level($level);
|
$main_ui.update_level($level);
|
||||||
$boss_fight_ui = $levels.create_bossfight($level.world);
|
$boss_fight_ui = $levels.create_bossfight($level.world);
|
||||||
$boss_fight_ui->init();
|
$boss_fight_ui->init();
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include "stats.hpp"
|
#include "stats.hpp"
|
||||||
#include "levelmanager.hpp"
|
#include "levelmanager.hpp"
|
||||||
#include "fsm.hpp"
|
#include "fsm.hpp"
|
||||||
#include "map_view.hpp"
|
|
||||||
#include "main_ui.hpp"
|
#include "main_ui.hpp"
|
||||||
#include "combat_ui.hpp"
|
#include "combat_ui.hpp"
|
||||||
#include "status_ui.hpp"
|
#include "status_ui.hpp"
|
||||||
|
@ -16,7 +15,6 @@ namespace gui {
|
||||||
IN_COMBAT,
|
IN_COMBAT,
|
||||||
COMBAT_ROTATE,
|
COMBAT_ROTATE,
|
||||||
ATTACKING,
|
ATTACKING,
|
||||||
MAPPING,
|
|
||||||
ROTATING,
|
ROTATING,
|
||||||
NEXT_LEVEL,
|
NEXT_LEVEL,
|
||||||
IDLE,
|
IDLE,
|
||||||
|
@ -50,7 +48,6 @@ namespace gui {
|
||||||
MainUI $main_ui;
|
MainUI $main_ui;
|
||||||
GameLevel $level;
|
GameLevel $level;
|
||||||
shared_ptr<BossFightUI> $boss_fight_ui = nullptr;
|
shared_ptr<BossFightUI> $boss_fight_ui = nullptr;
|
||||||
MapViewUI $map_ui;
|
|
||||||
CombatUI $combat_ui;
|
CombatUI $combat_ui;
|
||||||
StatusUI $status_ui;
|
StatusUI $status_ui;
|
||||||
sf::Font $font;
|
sf::Font $font;
|
||||||
|
|
2
main.cpp
2
main.cpp
|
@ -13,7 +13,6 @@ int main(int argc, char* argv[]) {
|
||||||
ai::init("assets/ai.json");
|
ai::init("assets/ai.json");
|
||||||
animation::init();
|
animation::init();
|
||||||
|
|
||||||
|
|
||||||
sound::mute(true);
|
sound::mute(true);
|
||||||
gui::FSM main;
|
gui::FSM main;
|
||||||
main.event(gui::Event::STARTED);
|
main.event(gui::Event::STARTED);
|
||||||
|
@ -31,7 +30,6 @@ int main(int argc, char* argv[]) {
|
||||||
// ZED: need to sort out how to deal with this in the FSM
|
// ZED: need to sort out how to deal with this in the FSM
|
||||||
if(main.in_state(gui::State::IDLE)
|
if(main.in_state(gui::State::IDLE)
|
||||||
|| main.in_state(gui::State::NEXT_LEVEL)
|
|| main.in_state(gui::State::NEXT_LEVEL)
|
||||||
|| main.in_state(gui::State::MAPPING)
|
|
||||||
|| main.in_state(gui::State::IN_COMBAT))
|
|| main.in_state(gui::State::IN_COMBAT))
|
||||||
{
|
{
|
||||||
if(main.autowalking) {
|
if(main.autowalking) {
|
||||||
|
|
67
map_view.cpp
67
map_view.cpp
|
@ -6,64 +6,63 @@
|
||||||
#include "rand.hpp"
|
#include "rand.hpp"
|
||||||
#include "animation.hpp"
|
#include "animation.hpp"
|
||||||
#include "rand.hpp"
|
#include "rand.hpp"
|
||||||
|
#include <codecvt>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
using namespace components;
|
using namespace components;
|
||||||
|
|
||||||
MapViewUI::MapViewUI(GameLevel &level) :
|
MapViewUI::MapViewUI(GameLevel &level) :
|
||||||
$level(level)
|
$level(level), $tiles(level.map->width(), level.map->height())
|
||||||
{
|
{
|
||||||
$gui.position(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
||||||
$gui.layout(
|
|
||||||
"[*%(100,900)left|*%(200,900)map_grid| _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[_ | _ | _]"
|
|
||||||
"[bottom_status_left | bottom_status_right ]");
|
|
||||||
|
|
||||||
auto cell = $gui.cell_for($gui.entity("map_grid"));
|
|
||||||
$grid.position(cell.x, cell.y, cell.w, cell.h);
|
|
||||||
$grid.layout(
|
|
||||||
"[cell_11|cell_12|cell_13|cell_14|cell_15|cell_16|cell_17]"
|
|
||||||
"[cell_21|cell_22|cell_23|cell_24|cell_25|cell_26|cell_27]"
|
|
||||||
"[cell_31|cell_32|cell_33|cell_34|cell_35|cell_36|cell_37]"
|
|
||||||
"[cell_41|cell_42|cell_43|cell_44|cell_45|cell_46|cell_47]"
|
|
||||||
"[cell_51|cell_52|cell_53|cell_54|cell_55|cell_56|cell_57]");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapViewUI::update_level(GameLevel &level) {
|
void MapViewUI::update_level(GameLevel &level) {
|
||||||
$level = level;
|
$level = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapViewUI::init() {
|
void MapViewUI::init(int x, int y, int w, int h) {
|
||||||
$gui.world().set_the<guecs::Background>({$gui.$parser});
|
$gui.position(x, y, w, h);
|
||||||
|
$gui.layout(
|
||||||
|
"[*%(100,900)map_grid]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]"
|
||||||
|
"[_ ]");
|
||||||
for(auto& [name, cell] : $gui.cells()) {
|
for(auto& [name, cell] : $gui.cells()) {
|
||||||
auto box = $gui.entity(name);
|
auto box = $gui.entity(name);
|
||||||
if(name != "map_grid") {
|
if(name == "status") {
|
||||||
|
$gui.set<guecs::Sprite>(box, {"paper_ui_background"});
|
||||||
|
} else if(name != "map_grid") {
|
||||||
$gui.set<guecs::Rectangle>(box, {});
|
$gui.set<guecs::Rectangle>(box, {});
|
||||||
$gui.set<guecs::Label>(box, {name});
|
$gui.set<guecs::Label>(box, {name});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto grid = $gui.entity("map_grid");
|
||||||
|
$gui.set<guecs::WideText>(grid, {L"Loading...", 25, ColorValue::DARK_LIGHT, 20});
|
||||||
|
$gui.set<guecs::Sprite>(grid, {"paper_ui_background"});
|
||||||
|
|
||||||
$gui.init();
|
$gui.init();
|
||||||
|
|
||||||
for(auto& [name, cell] : $grid.cells()) {
|
|
||||||
auto box = $grid.entity(name);
|
|
||||||
$grid.set<guecs::Rectangle>(box, {});
|
|
||||||
$grid.set<guecs::Label>(box, {name});
|
|
||||||
}
|
|
||||||
|
|
||||||
$grid.init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapViewUI::render(sf::RenderWindow &window) {
|
void MapViewUI::render(sf::RenderWindow &window) {
|
||||||
|
$tiles = $level.map->tiles();
|
||||||
|
auto grid = $gui.entity("map_grid");
|
||||||
|
auto player_pos = $level.world->get<Position>($level.player);
|
||||||
|
|
||||||
|
std::string map_out = $tiles.to_string(player_pos.location.x, player_pos.location.y);
|
||||||
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
||||||
|
std::wstring map_wstr = converter.from_bytes(map_out);
|
||||||
|
|
||||||
|
auto& map_text = $gui.get<guecs::WideText>(grid);
|
||||||
|
map_text.update(map_wstr);
|
||||||
|
|
||||||
$gui.render(window);
|
$gui.render(window);
|
||||||
$grid.render(window);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,16 +2,17 @@
|
||||||
#include "levelmanager.hpp"
|
#include "levelmanager.hpp"
|
||||||
#include "textures.hpp"
|
#include "textures.hpp"
|
||||||
#include "guecs.hpp"
|
#include "guecs.hpp"
|
||||||
|
#include "tilemap.hpp"
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
class MapViewUI {
|
class MapViewUI {
|
||||||
public:
|
public:
|
||||||
guecs::UI $gui;
|
guecs::UI $gui;
|
||||||
guecs::UI $grid;
|
|
||||||
GameLevel $level;
|
GameLevel $level;
|
||||||
|
TileMap $tiles;
|
||||||
|
|
||||||
MapViewUI(GameLevel &level);
|
MapViewUI(GameLevel &level);
|
||||||
void init();
|
void init(int x, int y, int w, int h);
|
||||||
void render(sf::RenderWindow &window);
|
void render(sf::RenderWindow &window);
|
||||||
void update_level(GameLevel &level);
|
void update_level(GameLevel &level);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# clang might need _LIBCPP_ENABLE_CXX26_REMOVED_CODECVT
|
||||||
|
|
||||||
project('raycaster', 'cpp',
|
project('raycaster', 'cpp',
|
||||||
version: '0.1.0',
|
version: '0.1.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
|
|
|
@ -379,6 +379,7 @@ void Raycaster::update_level(GameLevel level) {
|
||||||
$sprites.clear();
|
$sprites.clear();
|
||||||
|
|
||||||
$level = level;
|
$level = level;
|
||||||
|
// BUG: this is way too complex, please make it easier, the issue is that I need to convert the maps to visible tiles and that involves wstring convert, but this is many steps done probably over and over
|
||||||
auto& tiles = $level.map->tiles();
|
auto& tiles = $level.map->tiles();
|
||||||
$map = textures::convert_char_to_texture(tiles.$tile_ids);
|
$map = textures::convert_char_to_texture(tiles.$tile_ids);
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ struct Raycaster {
|
||||||
double $dir_y = 0;
|
double $dir_y = 0;
|
||||||
|
|
||||||
// the 2d raycaster version of camera plane
|
// the 2d raycaster version of camera plane
|
||||||
double $plane_x = 0;
|
double $plane_x = 0.0;
|
||||||
double $plane_y = 0.66;
|
double $plane_y = 0.66;
|
||||||
sf::Texture $view_texture;
|
sf::Texture $view_texture;
|
||||||
sf::Sprite $view_sprite;
|
sf::Sprite $view_sprite;
|
||||||
|
|
|
@ -124,7 +124,9 @@ namespace gui {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* WARNING: This is really not the greatest way to do this. */
|
/* WARNING: This is really not the greatest way to do this.
|
||||||
|
* look in status_ui.update_level()
|
||||||
|
* */
|
||||||
void RitualUI::update() {
|
void RitualUI::update() {
|
||||||
dbc::log("RITUAL UPDATE NOT IMPLEMENTED");
|
dbc::log("RITUAL UPDATE NOT IMPLEMENTED");
|
||||||
}
|
}
|
||||||
|
|
1020
scripts/gcovr_patched_coverage.py
Normal file
1020
scripts/gcovr_patched_coverage.py
Normal file
File diff suppressed because it is too large
Load diff
|
@ -10,7 +10,8 @@ namespace gui {
|
||||||
using std::any, std::any_cast, std::string, std::make_any;
|
using std::any, std::any_cast, std::string, std::make_any;
|
||||||
|
|
||||||
StatusUI::StatusUI(GameLevel level) :
|
StatusUI::StatusUI(GameLevel level) :
|
||||||
$level(level), $ritual_ui(level)
|
$level(level), $ritual_ui(level),
|
||||||
|
$map_ui($level)
|
||||||
{
|
{
|
||||||
$gui.position(STATUS_UI_X, STATUS_UI_Y, STATUS_UI_WIDTH, STATUS_UI_HEIGHT);
|
$gui.position(STATUS_UI_X, STATUS_UI_Y, STATUS_UI_WIDTH, STATUS_UI_HEIGHT);
|
||||||
$gui.layout(
|
$gui.layout(
|
||||||
|
@ -37,6 +38,8 @@ namespace gui {
|
||||||
$log_to = $gui.entity("log_view");
|
$log_to = $gui.entity("log_view");
|
||||||
$gui.set<Rectangle>($log_to, {});
|
$gui.set<Rectangle>($log_to, {});
|
||||||
$gui.set<Textual>($log_to, {"Welcome to the Game!", 20});
|
$gui.set<Textual>($log_to, {"Welcome to the Game!", 20});
|
||||||
|
|
||||||
|
$map_ui.init(cell.x, cell.y, cell.w, cell.h);
|
||||||
} else {
|
} else {
|
||||||
auto button = $gui.entity(name);
|
auto button = $gui.entity(name);
|
||||||
$gui.set<Rectangle>(button, {});
|
$gui.set<Rectangle>(button, {});
|
||||||
|
@ -134,6 +137,11 @@ namespace gui {
|
||||||
|
|
||||||
void StatusUI::render(sf::RenderWindow &window) {
|
void StatusUI::render(sf::RenderWindow &window) {
|
||||||
$gui.render(window);
|
$gui.render(window);
|
||||||
|
|
||||||
|
if(map_open) {
|
||||||
|
$map_ui.render(window);
|
||||||
|
}
|
||||||
|
|
||||||
$ritual_ui.render(window);
|
$ritual_ui.render(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,6 +154,7 @@ namespace gui {
|
||||||
|
|
||||||
void StatusUI::update_level(GameLevel &level) {
|
void StatusUI::update_level(GameLevel &level) {
|
||||||
$level = level;
|
$level = level;
|
||||||
|
$map_ui.update_level($level);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,16 +5,19 @@
|
||||||
#include "textures.hpp"
|
#include "textures.hpp"
|
||||||
#include "guecs.hpp"
|
#include "guecs.hpp"
|
||||||
#include "ritual_ui.hpp"
|
#include "ritual_ui.hpp"
|
||||||
|
#include "map_view.hpp"
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
class StatusUI {
|
class StatusUI {
|
||||||
public:
|
public:
|
||||||
|
bool map_open = false;
|
||||||
guecs::UI $gui;
|
guecs::UI $gui;
|
||||||
DinkyECS::Entity $log_to;
|
DinkyECS::Entity $log_to;
|
||||||
std::map<std::string, size_t> $slots;
|
std::map<std::string, size_t> $slots;
|
||||||
std::deque<std::string> $messages;
|
std::deque<std::string> $messages;
|
||||||
GameLevel $level;
|
GameLevel $level;
|
||||||
RitualUI $ritual_ui;
|
RitualUI $ritual_ui;
|
||||||
|
MapViewUI $map_ui;
|
||||||
|
|
||||||
StatusUI(GameLevel level);
|
StatusUI(GameLevel level);
|
||||||
void select_slot(DinkyECS::Entity ent, std::any data);
|
void select_slot(DinkyECS::Entity ent, std::any data);
|
||||||
|
|
17
tilemap.cpp
17
tilemap.cpp
|
@ -1,6 +1,7 @@
|
||||||
#include "tilemap.hpp"
|
#include "tilemap.hpp"
|
||||||
#include "dbc.hpp"
|
#include "dbc.hpp"
|
||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
using components::Tile;
|
using components::Tile;
|
||||||
|
@ -14,18 +15,26 @@ TileMap::TileMap(size_t width, size_t height) :
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileMap::dump(int show_x, int show_y) {
|
std::string TileMap::to_string(int show_x, int show_y) {
|
||||||
|
std::string result;
|
||||||
|
|
||||||
for(matrix::each_row it{$tile_ids}; it.next();) {
|
for(matrix::each_row it{$tile_ids}; it.next();) {
|
||||||
const Tile &cell = $display[it.y][it.x];
|
const Tile &cell = $display[it.y][it.x];
|
||||||
|
|
||||||
if(int(it.x) == show_x && int(it.y) == show_y) {
|
if(int(it.x) == show_x && int(it.y) == show_y) {
|
||||||
fmt::print("{}<", cell.display);
|
result += "@";
|
||||||
} else {
|
} else {
|
||||||
fmt::print("{} ", cell.display);
|
result += cell.display;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(it.row) fmt::print("\n");
|
if(it.row) result += "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileMap::dump(int show_x, int show_y) {
|
||||||
|
std::cout << to_string(show_x, show_y) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileMap::set_tile(size_t x, size_t y, string tile_name) {
|
void TileMap::set_tile(size_t x, size_t y, string tile_name) {
|
||||||
|
|
|
@ -32,6 +32,7 @@ public:
|
||||||
void set_tile(size_t x, size_t y, std::string tile_name);
|
void set_tile(size_t x, size_t y, std::string tile_name);
|
||||||
std::vector<std::string> tile_names(bool collision);
|
std::vector<std::string> tile_names(bool collision);
|
||||||
|
|
||||||
|
std::string to_string(int show_x, int show_y);
|
||||||
void dump(int show_x=-1, int show_y=-1);
|
void dump(int show_x=-1, int show_y=-1);
|
||||||
bool INVARIANT();
|
bool INVARIANT();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue