#pragma once #include #include #include #include #include #include #include #include #include "ftxui/component/component.hpp" // for Button, operator|=, Renderer, Vertical, Modal #include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive, Component #include "ftxui/dom/elements.hpp" // for operator|, separator, text, size, Element, vbox, border, GREATER_THAN, WIDTH, center, HEIGHT #include #include #include "map.hpp" #include "dinkyecs.hpp" #include "components.hpp" #include "sound.hpp" #include "render.hpp" #include "panel.hpp" using std::string; using ftxui::Canvas, ftxui::Component, ftxui::Screen, ftxui::Button; constexpr int SCREEN_WIDTH = 40; constexpr int SCREEN_HEIGHT = 30; struct ActionLog { std::deque messages; void log(std::string msg) { messages.push_front(msg); if(messages.size() > 20) { messages.pop_back(); } } }; const int GAME_MAP_POS = 600; class GUI { sf::RectangleShape $darkness; sf::Texture $light_test; string $status_text = "NOT DEAD"; Canvas $canvas; Map& $game_map; ActionLog $log; Panel $status_ui; Panel $map_view; bool $show_modal = false; Component $test_button; DinkyECS::World& $world; SoundManager $sounds; SFMLRender $renderer; public: GUI(DinkyECS::World& world, Map& game_map); // disable copying GUI(GUI &gui) = delete; void resize_map(int new_size); void create_renderer(); void render_scene(); bool handle_ui_events(); void handle_world_events(); void draw_screen(bool clear=true, float map_off_x=0.0f, float map_off_y=0.0f); void run_systems(); void save_world(); void shake(); int main(); };