|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <ftxui/screen/screen.hpp>
|
|
|
|
#include <ftxui/dom/canvas.hpp>
|
|
|
|
#include <SFML/Window.hpp>
|
|
|
|
#include <SFML/System.hpp>
|
|
|
|
#include <SFML/Graphics.hpp>
|
|
|
|
#include <SFML/Graphics/Rect.hpp>
|
|
|
|
#include "point.hpp"
|
|
|
|
#include <codecvt>
|
|
|
|
#include "ansi_parser.hpp"
|
|
|
|
|
|
|
|
using ftxui::Canvas, ftxui::Screen;
|
|
|
|
|
|
|
|
#define BG_TILE L'█'
|
|
|
|
|
|
|
|
constexpr int VIDEO_X = 1600;
|
|
|
|
constexpr int VIDEO_Y = 900;
|
|
|
|
constexpr int MIN_FONT_SIZE = 20;
|
|
|
|
constexpr int MAX_FONT_SIZE = 140;
|
|
|
|
constexpr int GAME_MAP_POS = 600;
|
|
|
|
constexpr int UI_FONT_SIZE=30;
|
|
|
|
constexpr int BASE_MAP_FONT_SIZE=90;
|
|
|
|
|
|
|
|
enum class Value {
|
|
|
|
BLACK=0, DARK_DARK, DARK_MID,
|
|
|
|
DARK_LIGHT, MID, LIGHT_DARK, LIGHT_MID,
|
|
|
|
LIGHT_LIGHT, WHITE, TRANSPARENT
|
|
|
|
};
|
|
|
|
|
|
|
|
struct SFMLRender {
|
|
|
|
sf::RenderWindow $window;
|
|
|
|
int $map_font_size;
|
|
|
|
float $line_spacing;
|
|
|
|
std::unordered_map<wchar_t, sf::Sprite> $sprites;
|
|
|
|
sf::Font $font;
|
|
|
|
sf::Texture $font_texture;
|
|
|
|
sf::Glyph $base_glyph;
|
|
|
|
sf::Sprite $bg_sprite;
|
|
|
|
sf::FloatRect $bg_bounds;
|
|
|
|
sf::Text $ui_text;
|
|
|
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> $converter;
|
|
|
|
sf::Color $default_fg;
|
|
|
|
sf::Color $default_bg;
|
|
|
|
ANSIParser $ansi;
|
|
|
|
sf::FloatRect $ui_bounds;
|
|
|
|
|
|
|
|
SFMLRender();
|
|
|
|
|
|
|
|
// disable copy
|
|
|
|
SFMLRender(SFMLRender &other) = delete;
|
|
|
|
|
|
|
|
sf::Color color(int val);
|
|
|
|
sf::Color color(Value val);
|
|
|
|
sf::Sprite &get_text_sprite(wchar_t tile);
|
|
|
|
bool resize_map(int new_size, Point &view_port);
|
|
|
|
void render_text(std::string &text, float x, float y);
|
|
|
|
void draw_text_ui(Screen &screen, float x, float y);
|
|
|
|
void draw_screen(Screen &screen, float map_off_x=0.0f, float map_off_y=0.0f);
|
|
|
|
|
|
|
|
bool poll_event(sf::Event &event) {
|
|
|
|
return $window.pollEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void close() { return $window.close(); }
|
|
|
|
|
|
|
|
bool is_open() { return $window.isOpen(); }
|
|
|
|
|
|
|
|
int font_size() { return $map_font_size; }
|
|
|
|
void clear() { $window.clear(); }
|
|
|
|
void display() { $window.display(); }
|
|
|
|
};
|