diff --git a/components.hpp b/components.hpp index 725555f..f5c6a3d 100644 --- a/components.hpp +++ b/components.hpp @@ -1,28 +1,30 @@ #pragma once #include "dinkyecs.hpp" -struct Player { - DinkyECS::Entity entity; -}; +namespace Components { + struct Player { + DinkyECS::Entity entity; + }; -struct Position { - Point location; -}; + struct Position { + Point location; + }; -struct Motion { - int dx; - int dy; -}; + struct Motion { + int dx; + int dy; + }; -struct Combat { - int hp; - int damage; -}; + struct Combat { + int hp; + int damage; + }; -struct Treasure { - int amount; -}; + struct Treasure { + int amount; + }; -struct Tile { - std::string chr = "!"; -}; + struct Tile { + std::string chr = "!"; + }; +} diff --git a/gui.cpp b/gui.cpp index 8377343..1d008f8 100644 --- a/gui.cpp +++ b/gui.cpp @@ -26,6 +26,7 @@ using std::string; using namespace fmt; using namespace std::chrono_literals; using namespace ftxui; +using namespace Components; std::array VALUES{ sf::Color{1, 4, 2}, // black @@ -96,8 +97,9 @@ void GUI::create_renderer() { }); } -void GUI::handle_events() { +bool GUI::handle_events() { sf::Event event; + bool event_happened = false; while($window.pollEvent(event)) { if(event.type == sf::Event::Closed) { @@ -105,27 +107,31 @@ void GUI::handle_events() { } else if(event.type == sf::Event::KeyPressed) { auto player = $world.get(); auto& player_motion = $world.component(player.entity); - auto& player_position = $world.component(player.entity); if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { player_motion.dx = -1; + event_happened = true; } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { player_motion.dx = 1; + event_happened = true; } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { player_motion.dy = -1; + event_happened = true; } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { player_motion.dy = 1; + event_happened = true; } - - $game_map.set_target(player_position.location); - $game_map.make_paths(); - // COMPOSE system? You create a bunch of callbacks and then combine them into - // a single run over the data? - System::enemy_pathing($world, $game_map, player); - System::motion($world, $game_map); - System::combat($world, player); } } + + return event_happened; +} + +void GUI::run_systems() { + auto player = $world.get(); + System::enemy_pathing($world, $game_map, player); + System::motion($world, $game_map); + System::combat($world, player); } void GUI::burn() { @@ -209,7 +215,10 @@ int GUI::main() { while($window.isOpen()) { render_scene(); - handle_events(); + + if(handle_events()) { + run_systems(); + } std::this_thread::sleep_for(10ms); } diff --git a/gui.hpp b/gui.hpp index edb10af..fdfee0a 100644 --- a/gui.hpp +++ b/gui.hpp @@ -46,8 +46,6 @@ class GUI { sf::Font $font; sf::Text $ui_text; sf::Text $map_text; - bool $shake_it = false; - bool $burn_baby_burn = false; std::wstring_convert> $converter; sf::RenderWindow $window; Screen $screen; @@ -63,11 +61,12 @@ public: sf::Color color(int val); void create_renderer(); void render_scene(); - void handle_events(); + bool handle_events(); void draw_screen(bool clear=true, float map_off_x=0.0f, float map_off_y=0.0f); void shake(); void burn(); void configure_world(); + void run_systems(); int main(); }; diff --git a/scripts/reset_build.sh b/scripts/reset_build.sh index 11e8d63..9d56a7f 100755 --- a/scripts/reset_build.sh +++ b/scripts/reset_build.sh @@ -7,4 +7,5 @@ mkdir subprojects mv packagecache ./subprojects/ mkdir builddir cp wraps/*.wrap subprojects/ -meson setup --default-library=static --prefer-static builddir +# on OSX you can't do this with static +meson setup builddir diff --git a/systems.cpp b/systems.cpp index 1f1d627..5634c6a 100644 --- a/systems.cpp +++ b/systems.cpp @@ -5,6 +5,8 @@ using std::string; using namespace fmt; +using namespace Components; + void System::enemy_pathing(DinkyECS::World &world, Map &game_map, Player &player) { // move enemies system world.system([&](const auto &ent, auto &position, auto &motion) { diff --git a/systems.hpp b/systems.hpp index d6277c9..0aa4b81 100644 --- a/systems.hpp +++ b/systems.hpp @@ -4,6 +4,8 @@ #include "components.hpp" #include +using namespace Components; + namespace System { void motion(DinkyECS::World &world, Map &game_map); void combat(DinkyECS::World &world, Player &player);