diff --git a/components.hpp b/components.hpp index 55a96aa..d6f750d 100644 --- a/components.hpp +++ b/components.hpp @@ -4,6 +4,7 @@ #include "dinkyecs.hpp" #include "point.hpp" #include +#include #include #include #include @@ -15,6 +16,11 @@ namespace components { using namespace nlohmann; + struct SpriteEffect { + int frames; + std::shared_ptr effect; + }; + struct Position { Point location; }; diff --git a/raycaster.cpp b/raycaster.cpp index f6b9b4f..4440f2c 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -9,6 +9,7 @@ #include #include "components.hpp" #include "textures.hpp" +#include "systems.hpp" using namespace fmt; using std::make_unique; @@ -180,10 +181,9 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { // float level = sqrt(rec.first); float level = lights[sprite_pos.location.y][sprite_pos.location.x] * PERCENT; - shared_ptr effect = nullptr; + shared_ptr effect = System::sprite_effect($level, rec.second); - if(rec.second == aiming_at) { - effect = $flame; + if(effect) { apply_sprite_effect(effect, sprite_width, sprite_height); } else { effect = $brightness; @@ -411,7 +411,4 @@ void Raycaster::update_level(GameLevel level) { void Raycaster::init_shaders() { $brightness = shaders::get("rayview_sprites"); - $brightness->setUniform("source", sf::Shader::CurrentTexture); - $flame = shaders::get("flame"); - $flame->setUniform("source", sf::Shader::CurrentTexture); } diff --git a/raycaster.hpp b/raycaster.hpp index 29ec234..4d562a4 100644 --- a/raycaster.hpp +++ b/raycaster.hpp @@ -13,7 +13,6 @@ struct Raycaster { int $pitch=0; sf::Clock $clock; std::shared_ptr $brightness = nullptr; - std::shared_ptr $flame = nullptr; double $pos_x = 0; double $pos_y = 0; diff --git a/shaders.cpp b/shaders.cpp index 6983191..dbc161f 100644 --- a/shaders.cpp +++ b/shaders.cpp @@ -7,17 +7,25 @@ #include namespace shaders { -using std::shared_ptr, std::make_shared; + using std::shared_ptr, std::make_shared; -static ShaderManager SMGR; -static bool INITIALIZED = false; -static int VERSION = 0; + static ShaderManager SMGR; + static bool INITIALIZED = false; + static int VERSION = 0; -bool load_shader(std::string name, nlohmann::json& settings) { - std::string file_name = settings["file_name"]; - auto ptr = std::make_shared(); - bool good = ptr->loadFromFile(file_name, sf::Shader::Type::Fragment); - if(good) SMGR.shaders.try_emplace(name, name, file_name, ptr); + inline void configure_shader_defaults(std::shared_ptr ptr) { + ptr->setUniform("source", sf::Shader::CurrentTexture); + } + + bool load_shader(std::string name, nlohmann::json& settings) { + std::string file_name = settings["file_name"]; + auto ptr = std::make_shared(); + bool good = ptr->loadFromFile(file_name, sf::Shader::Type::Fragment); + + if(good) { + configure_shader_defaults(ptr); + SMGR.shaders.try_emplace(name, name, file_name, ptr); + } return good; } diff --git a/systems.cpp b/systems.cpp index d06588b..856044c 100644 --- a/systems.cpp +++ b/systems.cpp @@ -15,6 +15,7 @@ #include "rituals.hpp" #include "battle.hpp" #include +#include "shaders.hpp" using std::string; using namespace fmt; @@ -176,6 +177,7 @@ void System::death(GameLevel &level, components::ComponentMap& components) { world.remove(ent); world.remove(ent); world.remove(ent); + world.remove(ent); if(auto snd = world.get_if(ent)) { sound::stop(snd->attack); @@ -235,6 +237,11 @@ void System::combat(GameLevel &level) { player_combat.attack(enemy.combat), 0 }; + if(result.player_did > 0) { + auto effect = shaders::get("flame"); + world.set(enemy.entity, {100, effect}); + } + if(enemy.ai.wants_to("kill_enemy")) { result.enemy_did = enemy.combat.attack(player_combat); animate_entity(world, enemy.entity); @@ -390,3 +397,20 @@ std::wstring System::draw_map(GameLevel level, size_t view_x, size_t view_y, int return result; } + + +std::shared_ptr System::sprite_effect(GameLevel &level, DinkyECS::Entity entity) { + if(level.world->has(entity)) { + auto& se = level.world->get(entity); + + if(se.frames > 0) { + se.frames--; + return se.effect; + } else { + level.world->remove(entity); + return nullptr; + } + } else { + return nullptr; + } +} diff --git a/systems.hpp b/systems.hpp index dd79af0..777a6a1 100644 --- a/systems.hpp +++ b/systems.hpp @@ -21,4 +21,7 @@ namespace System { void enemy_ai(GameLevel &level); void combat(GameLevel &level); + + std::shared_ptr sprite_effect(GameLevel &level, DinkyECS::Entity entity); + }