|
|
|
@ -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)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|