You now have blood on your screen when below half health.

This commit is contained in:
Zed A. Shaw 2025-02-13 13:15:20 -05:00
parent 1c8f542c21
commit d2700d2928
12 changed files with 90 additions and 13 deletions

61
gui.cpp
View file

@ -6,6 +6,7 @@
#include "components.hpp"
#include <numbers>
#include "systems.hpp"
#include "events.hpp"
namespace gui {
@ -50,6 +51,7 @@ namespace gui {
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
$status_view.create_render();
$status_view.log("Welcome to the game!");
$renderer.init_terminal();
$map_view.create_render();
@ -143,6 +145,7 @@ namespace gui {
state(State::MAPPING);
break;
case ATTACK:
$status_view.log("You attack!");
$rotation = -30.0f;
state(State::ATTACKING);
break;
@ -215,7 +218,10 @@ namespace gui {
auto& debug = $level.world->get_the<Debug>();
debug.FPS = !debug.FPS;
debug.PATHS = !debug.PATHS;
} break;
auto player = $level.world->get_the<Player>();
auto& player_combat = $level.world->get<Combat>(player.entity);
player_combat.hp = player_combat.max_hp;
} break;
default:
break; // ignored
}
@ -253,6 +259,18 @@ namespace gui {
$window.draw($text);
}
void FSM::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) {
auto blood = $textures.sprite_textures.at("blood_splatter").sprite;
blood->setPosition({RAY_VIEW_X,0});
blood->setScale({3.0, 3.0});
$window.draw(*blood);
}
}
void FSM::draw_gui() {
sf::RectangleShape rect({SCREEN_WIDTH - RAY_VIEW_WIDTH, SCREEN_HEIGHT});
rect.setPosition({0,0});
@ -290,6 +308,7 @@ namespace gui {
$stats.sample(1/elapsed.count());
draw_gui();
draw_blood();
draw_weapon();
}
@ -314,9 +333,49 @@ namespace gui {
System::motion($level);
System::lighting($level);
System::death($level);
handle_world_events();
}
bool FSM::active() {
return !in_state(State::END);
}
void FSM::handle_world_events() {
using eGUI = Events::GUI;
auto& world = *$level.world;
while(world.has_event<eGUI>()) {
auto [evt, entity, data] = world.recv<eGUI>();
switch(evt) {
case eGUI::COMBAT: {
auto &damage = std::any_cast<Events::Combat&>(data);
auto enemy_combat = world.get<Combat>(entity);
if(damage.enemy_did > 0) {
$status_view.log(fmt::format("Enemy HIT YOU for {} damage!", damage.enemy_did));
$status_view.log(fmt::format("-- Enemy has {} HP left.", enemy_combat.hp));
} else {
$status_view.log("Enemy MISSED YOU.");
}
if(damage.player_did > 0) {
$status_view.log(fmt::format("You HIT enemy for {} damage!", damage.player_did));
} else {
$status_view.log("You MISSED the enemy.");
}
}
break;
case eGUI::LOOT: {
// auto &item = std::any_cast<InventoryItem&>(data);
// $status_view.log(fmt::format("You picked up a {}.",
// std::string(item.data["name"])));
$status_view.log("You picked up an item.");
}
break;
default:
$status_view.log(fmt::format("INVALID EVENT! {},{}", evt, entity));
}
}
}
}