Starting a bit of refactoring to sort out how to handle the various UIs.
This commit is contained in:
parent
d8400d0a76
commit
f0829bb9ea
3 changed files with 94 additions and 58 deletions
113
gui.cpp
113
gui.cpp
|
@ -29,49 +29,7 @@ using namespace std::chrono_literals;
|
||||||
using namespace ftxui;
|
using namespace ftxui;
|
||||||
using namespace components;
|
using namespace components;
|
||||||
|
|
||||||
|
void InventoryUI::create_render() {
|
||||||
GUI::GUI(DinkyECS::World &world, Map& game_map) :
|
|
||||||
$game_map(game_map),
|
|
||||||
$log({{"Welcome to the game!"}}),
|
|
||||||
$status_ui(0, 0, STATUS_UI_WIDTH, STATUS_UI_HEIGHT),
|
|
||||||
$map_view(GAME_MAP_PIXEL_POS, 0, 0, 0, true),
|
|
||||||
$inventory_ui(INVENTORY_PIXEL_X, INVENTORY_PIXEL_Y, INVENTORY_WIDTH, INVENTORY_HEIGHT),
|
|
||||||
$lights(game_map.width(), game_map.height()),
|
|
||||||
$world(world),
|
|
||||||
$sounds("./assets"),
|
|
||||||
$renderer()
|
|
||||||
{
|
|
||||||
// this needs a config file soon
|
|
||||||
// $sounds.load("ambient", "ambient_sound.mp3");
|
|
||||||
$sounds.load("loot_gold", "loot_gold.mp3");
|
|
||||||
$sounds.load("combat_player_hit", "combat_player_hit.mp3");
|
|
||||||
$sounds.load("combat_enemy_hit", "combat_enemy_hit.mp3");
|
|
||||||
$sounds.load("combat_miss", "combat_miss.mp3");
|
|
||||||
resize_map(MAX_FONT_SIZE);
|
|
||||||
init_shaders();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GUI::resize_map(int new_size) {
|
|
||||||
$renderer.resize_grid(new_size, $map_view);
|
|
||||||
// set canvas to best size
|
|
||||||
$canvas = Canvas($map_view.width * 2, $map_view.height * 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GUI::save_world() {
|
|
||||||
$log.log("Game saved!");
|
|
||||||
save::to_file("./savefile.world", $world, $game_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GUI::create_renderer() {
|
|
||||||
$renderer.init_terminal();
|
|
||||||
auto player = $world.get_the<Player>();
|
|
||||||
|
|
||||||
$map_view.set_renderer(Renderer([&] {
|
|
||||||
System::draw_map($world, $game_map, $lights.lighting(), $canvas, $map_view.width, $map_view.height);
|
|
||||||
return canvas($canvas);
|
|
||||||
}));
|
|
||||||
|
|
||||||
|
|
||||||
auto cell = [](const char* t) { return text(t) | border; };
|
auto cell = [](const char* t) { return text(t) | border; };
|
||||||
auto inventory_test = Renderer([cell] {
|
auto inventory_test = Renderer([cell] {
|
||||||
return hflow({
|
return hflow({
|
||||||
|
@ -85,6 +43,12 @@ void GUI::create_renderer() {
|
||||||
}) | border | flex;
|
}) | border | flex;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
set_renderer(inventory_test);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatusUI::create_render() {
|
||||||
|
auto player = $world.get_the<Player>();
|
||||||
|
|
||||||
auto status_rend = Renderer([&, player]{
|
auto status_rend = Renderer([&, player]{
|
||||||
const auto& player_combat = $world.get<Combat>(player.entity);
|
const auto& player_combat = $world.get<Combat>(player.entity);
|
||||||
const auto& inventory = $world.get<Inventory>(player.entity);
|
const auto& inventory = $world.get<Inventory>(player.entity);
|
||||||
|
@ -112,8 +76,53 @@ void GUI::create_renderer() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$status_ui.set_renderer(status_rend);
|
set_renderer(status_rend);
|
||||||
$inventory_ui.set_renderer(inventory_test);
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GUI::GUI(DinkyECS::World &world, Map& game_map) :
|
||||||
|
$game_map(game_map),
|
||||||
|
$status_ui(world),
|
||||||
|
$map_view(),
|
||||||
|
$inventory_ui(),
|
||||||
|
$lights(game_map.width(), game_map.height()),
|
||||||
|
$world(world),
|
||||||
|
$sounds("./assets"),
|
||||||
|
$renderer()
|
||||||
|
{
|
||||||
|
// this needs a config file soon
|
||||||
|
// $sounds.load("ambient", "ambient_sound.mp3");
|
||||||
|
$sounds.load("loot_gold", "loot_gold.mp3");
|
||||||
|
$sounds.load("combat_player_hit", "combat_player_hit.mp3");
|
||||||
|
$sounds.load("combat_enemy_hit", "combat_enemy_hit.mp3");
|
||||||
|
$sounds.load("combat_miss", "combat_miss.mp3");
|
||||||
|
resize_map(MAX_FONT_SIZE);
|
||||||
|
init_shaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::resize_map(int new_size) {
|
||||||
|
$renderer.resize_grid(new_size, $map_view);
|
||||||
|
// set canvas to best size
|
||||||
|
$canvas = Canvas($map_view.width * 2, $map_view.height * 4);
|
||||||
|
dbc::log("WHY IS RESIZING LIGHTS STILL WORKING?!!!!!!!!!!!!!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::save_world() {
|
||||||
|
$status_ui.log("Game saved!");
|
||||||
|
save::to_file("./savefile.world", $world, $game_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::create_renderer() {
|
||||||
|
$renderer.init_terminal();
|
||||||
|
|
||||||
|
$map_view.set_renderer(Renderer([&] {
|
||||||
|
System::draw_map($world, $game_map, $lights.lighting(), $canvas, $map_view.width, $map_view.height);
|
||||||
|
return canvas($canvas);
|
||||||
|
}));
|
||||||
|
|
||||||
|
$status_ui.create_render();
|
||||||
|
$inventory_ui.create_render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::handle_world_events() {
|
void GUI::handle_world_events() {
|
||||||
|
@ -129,32 +138,32 @@ void GUI::handle_world_events() {
|
||||||
auto enemy_combat = $world.get<Combat>(entity);
|
auto enemy_combat = $world.get<Combat>(entity);
|
||||||
|
|
||||||
if(damage.enemy_did > 0) {
|
if(damage.enemy_did > 0) {
|
||||||
$log.log(format("Enemy HIT YOU for {} damage!", damage.enemy_did));
|
$status_ui.log(format("Enemy HIT YOU for {} damage!", damage.enemy_did));
|
||||||
$log.log(format("-- Enemy has {} HP left.", enemy_combat.hp));
|
$status_ui.log(format("-- Enemy has {} HP left.", enemy_combat.hp));
|
||||||
$sounds.play("combat_enemy_hit");
|
$sounds.play("combat_enemy_hit");
|
||||||
shake();
|
shake();
|
||||||
} else {
|
} else {
|
||||||
$log.log("Enemy MISSED YOU.");
|
$status_ui.log("Enemy MISSED YOU.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(damage.player_did > 0) {
|
if(damage.player_did > 0) {
|
||||||
$log.log(format("You HIT enemy for {} damage!", damage.player_did));
|
$status_ui.log(format("You HIT enemy for {} damage!", damage.player_did));
|
||||||
$sounds.play("combat_player_hit");
|
$sounds.play("combat_player_hit");
|
||||||
} else {
|
} else {
|
||||||
$sounds.play("combat_miss");
|
$sounds.play("combat_miss");
|
||||||
$log.log("You MISSED the enemy.");
|
$status_ui.log("You MISSED the enemy.");
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case eGUI::LOOT: {
|
case eGUI::LOOT: {
|
||||||
auto &loot = std::any_cast<Loot&>(data);
|
auto &loot = std::any_cast<Loot&>(data);
|
||||||
auto inventory = $world.get<Inventory>(player.entity);
|
auto inventory = $world.get<Inventory>(player.entity);
|
||||||
$sounds.play("loot_gold");
|
$sounds.play("loot_gold");
|
||||||
$log.log(format("You found {} gold. You have {} now.",
|
$status_ui.log(format("You found {} gold. You have {} now.",
|
||||||
loot.amount, inventory.gold));
|
loot.amount, inventory.gold));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$log.log(format("INVALID EVENT! {},{}", evt, entity));
|
$status_ui.log(format("INVALID EVENT! {},{}", evt, entity));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
36
gui.hpp
36
gui.hpp
|
@ -48,14 +48,40 @@ struct UnDumbTSS {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class GUI {
|
|
||||||
|
class InventoryUI : public Panel {
|
||||||
|
public:
|
||||||
|
InventoryUI() : Panel(INVENTORY_PIXEL_X, INVENTORY_PIXEL_Y, INVENTORY_WIDTH, INVENTORY_HEIGHT) {}
|
||||||
|
void create_render();
|
||||||
|
};
|
||||||
|
|
||||||
|
class StatusUI : public Panel {
|
||||||
|
public:
|
||||||
|
ActionLog $log;
|
||||||
string $status_text = "NOT DEAD";
|
string $status_text = "NOT DEAD";
|
||||||
|
DinkyECS::World& $world;
|
||||||
|
|
||||||
|
StatusUI(DinkyECS::World& world) :
|
||||||
|
Panel(0, 0, STATUS_UI_WIDTH, STATUS_UI_HEIGHT),
|
||||||
|
$log({{"Welcome to the game!"}}),
|
||||||
|
$world(world) {}
|
||||||
|
void create_render();
|
||||||
|
void log(string msg) {
|
||||||
|
$log.log(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MapViewUI : public Panel {
|
||||||
|
public:
|
||||||
|
MapViewUI() : Panel(GAME_MAP_PIXEL_POS, 0, 0, 0, true) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class GUI {
|
||||||
Canvas $canvas;
|
Canvas $canvas;
|
||||||
Map& $game_map;
|
Map& $game_map;
|
||||||
ActionLog $log;
|
StatusUI $status_ui;
|
||||||
Panel $status_ui;
|
MapViewUI $map_view;
|
||||||
Panel $map_view;
|
InventoryUI $inventory_ui;
|
||||||
Panel $inventory_ui;
|
|
||||||
LightRender $lights;
|
LightRender $lights;
|
||||||
bool $show_modal = false;
|
bool $show_modal = false;
|
||||||
Component $test_button;
|
Component $test_button;
|
||||||
|
|
|
@ -17,7 +17,8 @@ const int UI_PANEL_BORDER_PX=5;
|
||||||
|
|
||||||
using ftxui::Renderer, ftxui::Component, ftxui::Element, ftxui::Screen;
|
using ftxui::Renderer, ftxui::Component, ftxui::Element, ftxui::Screen;
|
||||||
|
|
||||||
struct Panel {
|
class Panel {
|
||||||
|
public:
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
int width;
|
int width;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue