|
|
|
#include "main_ui.hpp"
|
|
|
|
#include "components.hpp"
|
|
|
|
|
|
|
|
namespace gui {
|
|
|
|
using namespace components;
|
|
|
|
|
|
|
|
MainUI::MainUI(sf::RenderWindow& window) :
|
|
|
|
$window(window),
|
|
|
|
$overlay_ui($level),
|
|
|
|
$rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
|
|
|
|
{
|
|
|
|
$window.setVerticalSyncEnabled(VSYNC);
|
|
|
|
$window.setFramerateLimit(FRAME_LIMIT);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::dirty() {
|
|
|
|
$needs_render = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::debug() {
|
|
|
|
auto& dbg = $level.world->get_the<Debug>();
|
|
|
|
dbg.FPS = !dbg.FPS;
|
|
|
|
dbg.PATHS = !dbg.PATHS;
|
|
|
|
|
|
|
|
if(dbg.FPS) {
|
|
|
|
// it's on now, enable things
|
|
|
|
auto player = $level.world->get_the<Player>();
|
|
|
|
auto& player_combat = $level.world->get<Combat>(player.entity);
|
|
|
|
player_combat.hp = player_combat.max_hp;
|
|
|
|
$overlay_ui.show_text("top_left", "STATS");
|
|
|
|
} else {
|
|
|
|
// it's off now, close it
|
|
|
|
$overlay_ui.close_text("top_left");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::draw_stats() {
|
|
|
|
auto player = $level.world->get_the<Player>();
|
|
|
|
auto player_combat = $level.world->get<Combat>(player.entity);
|
|
|
|
std::string stats = fmt::format("STATS\n"
|
|
|
|
"HP: {}\n"
|
|
|
|
"mean:{:>8.5}\n"
|
|
|
|
"sdev: {:>8.5}\n"
|
|
|
|
"min: {:>8.5}\n"
|
|
|
|
"max: {:>8.5}\n"
|
|
|
|
"count:{:<10}\n\n"
|
|
|
|
"VSync? {}\n"
|
|
|
|
"FR Limit: {}\n"
|
|
|
|
"Debug? {}\n\n",
|
|
|
|
player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min,
|
|
|
|
$stats.max, $stats.n, VSYNC,
|
|
|
|
FRAME_LIMIT, DEBUG_BUILD);
|
|
|
|
|
|
|
|
$overlay_ui.update_text("top_left", stats);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::draw_blood() {
|
|
|
|
auto player = $level.world->get_the<Player>();
|
|
|
|
auto player_combat = $level.world->get<Combat>(player.entity);
|
|
|
|
if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) {
|
|
|
|
$overlay_ui.show_sprite("middle", "blood_splatter");
|
|
|
|
} else {
|
|
|
|
$overlay_ui.close_sprite("middle");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::init() {
|
|
|
|
$rayview.init_shaders();
|
|
|
|
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
|
|
|
|
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
|
|
|
|
$overlay_ui.render();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::draw() {
|
|
|
|
auto start = std::chrono::high_resolution_clock::now();
|
|
|
|
|
|
|
|
if($needs_render) $rayview.render();
|
|
|
|
$rayview.draw($window);
|
|
|
|
|
|
|
|
auto end = std::chrono::high_resolution_clock::now();
|
|
|
|
auto elapsed = std::chrono::duration<double>(end - start);
|
|
|
|
$stats.sample(1/elapsed.count());
|
|
|
|
|
|
|
|
$overlay_ui.draw($window);
|
|
|
|
|
|
|
|
auto debug = $level.world->get_the<Debug>();
|
|
|
|
if(debug.FPS) draw_stats();
|
|
|
|
|
|
|
|
draw_blood();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MainUI::play_rotate() {
|
|
|
|
bool done = $camera.play_rotate($rayview);
|
|
|
|
$needs_render = !done;
|
|
|
|
return done;
|
|
|
|
}
|
|
|
|
|
|
|
|
// this could be an optional that returs a Point
|
|
|
|
std::optional<Point> MainUI::play_move() {
|
|
|
|
if($camera.play_move($rayview)) {
|
|
|
|
$needs_render = false;
|
|
|
|
return std::make_optional<Point>({
|
|
|
|
size_t($camera.target_x),
|
|
|
|
size_t($camera.target_y)});
|
|
|
|
} else {
|
|
|
|
$needs_render = true;
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::plan_rotate(int dir) {
|
|
|
|
$camera.plan_rotate($rayview, dir);
|
|
|
|
}
|
|
|
|
|
|
|
|
Point MainUI::plan_move(int dir, bool strafe) {
|
|
|
|
return $camera.plan_move($rayview, dir, strafe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::abort_plan() {
|
|
|
|
$camera.abort_plan($rayview);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::dead_entity(DinkyECS::Entity entity) {
|
|
|
|
auto &sprite = $level.world->get<Sprite>(entity);
|
|
|
|
$rayview.update_sprite(entity, sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::update_level(GameLevel level) {
|
|
|
|
$level = level;
|
|
|
|
auto& player_position = $level.world->get<Position>($level.player);
|
|
|
|
$player = player_position.location;
|
|
|
|
$rayview.update_level($level);
|
|
|
|
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
|
|
|
|
dirty();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::mouse(int x, int y) {
|
|
|
|
$overlay_ui.$gui.mouse(x, y);
|
|
|
|
}
|
|
|
|
}
|