#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" #include "lights.hpp" using std::string; using ftxui::Canvas, ftxui::Component, ftxui::Screen, ftxui::Button; using lighting::LightRender; struct ActionLog { std::deque messages; void log(std::string msg) { messages.push_front(msg); if(messages.size() > 20) { messages.pop_back(); } } }; struct UnDumbTSS { sf::Texture texture; sf::Sprite sprite; sf::Shader shader; sf::Shader& load_shader(string filename) { bool good = shader.loadFromFile(filename, sf::Shader::Fragment); dbc::check(good, "shader could not be loaded"); return shader; } }; class GUI { string $status_text = "NOT DEAD"; Canvas $canvas; Map& $game_map; ActionLog $log; Panel $status_ui; Panel $map_view; Panel $inventory_ui; LightRender $lights; bool $show_modal = false; Component $test_button; DinkyECS::World& $world; SoundManager $sounds; SFMLRender $renderer; UnDumbTSS $paused; 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(); void shutdown(); int main(bool run_once=false); void pause_screen(); void draw_paused(); void init_shaders(); };