From a35ca7c4accb2bc363a6b5286907ebdbdcb08eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 001/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- .../condition/KeyReleasedCondition.cpp | 15 ++++ .../condition/KeyReleasedCondition.hpp | 18 ++++ .../condition/LastStateCondition.cpp | 13 +++ .../condition/LastStateCondition.hpp | 20 +++++ core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++ core/event/management/controller/Jump.cpp | 15 ++++ core/event/management/controller/Jump.hpp | 25 ++++++ core/event/management/controller/Run.cpp | 21 +++++ core/event/management/controller/Run.hpp | 29 +++++++ .../controller/statemachine/StateMachine.cpp | 5 ++ .../controller/statemachine/StateMachine.hpp | 3 + core/loader/LevelLoaderFromFile.cpp | 81 +++++++++-------- core/loader/LevelLoaderFromFile.hpp | 4 + game/mobs/hero/Hero.cpp | 86 +++++++++++++++++++ game/mobs/hero/Hero.hpp | 23 +++++ 17 files changed, 343 insertions(+), 43 deletions(-) create mode 100644 core/event/management/condition/KeyReleasedCondition.cpp create mode 100644 core/event/management/condition/KeyReleasedCondition.hpp create mode 100644 core/event/management/condition/LastStateCondition.cpp create mode 100644 core/event/management/condition/LastStateCondition.hpp create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp create mode 100644 game/mobs/hero/Hero.cpp create mode 100644 game/mobs/hero/Hero.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b1ae6b4..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/KeyReleasedCondition.cpp b/core/event/management/condition/KeyReleasedCondition.cpp new file mode 100644 index 0000000..fd9df64 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.cpp @@ -0,0 +1,15 @@ +#include "KeyReleasedCondition.hpp" +#include +#include +std::unordered_set mad::core::KeyReleasedCondition::triggers() { + return {mad::core::Event::Type::KeyReleased}; +} +bool mad::core::KeyReleasedCondition::is_triggered_by(const mad::core::Event &event) { + const auto &keystroke = const_cast_to(event); + return keystroke.key_id == m_key_id; +} + +mad::core::KeyReleasedCondition::KeyReleasedCondition(const int m_key_id) : m_key_id(m_key_id){ +} +void mad::core::KeyReleasedCondition::on_start() { +} diff --git a/core/event/management/condition/KeyReleasedCondition.hpp b/core/event/management/condition/KeyReleasedCondition.hpp new file mode 100644 index 0000000..ec846c9 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_KEYRELEASEDCONDITION_HPP +#define MAD_KEYRELEASEDCONDITION_HPP + +#include "Condition.hpp" +namespace mad::core { + struct KeyReleasedCondition : Condition { + public: + explicit KeyReleasedCondition(int m_key_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + const int m_key_id; + }; +}// namespace mad::core + +#endif//MAD_KEYRELEASEDCONDITION_HPP diff --git a/core/event/management/condition/LastStateCondition.cpp b/core/event/management/condition/LastStateCondition.cpp new file mode 100644 index 0000000..a2fb453 --- /dev/null +++ b/core/event/management/condition/LastStateCondition.cpp @@ -0,0 +1,13 @@ +#include "LastStateCondition.hpp" + +bool mad::core::LastStateCondition::is_triggered_by(const mad::core::Event &event) { + return m_to_state_id == m_machine->get_previous_state_id(); +} +std::unordered_set mad::core::LastStateCondition::triggers() { + return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::Collision, mad::core::Event::Type::KeyHeld, mad::core::Event::Type::KeyReleased, mad::core::Event::Type::LevelPause, mad::core::Event::Type::Menu, mad::core::Event::Type::Movement, mad::core::Event::Type::Runner, mad::core::Event::Type::Visual, mad::core::Event::Type::WindowClose}; +} +void mad::core::LastStateCondition::on_start() { +} +mad::core::LastStateCondition::LastStateCondition(std::shared_ptr m_machine, mad::core::StateMachine::StateId m_to_state_id) : m_machine(m_machine), m_to_state_id(m_to_state_id){ + +} diff --git a/core/event/management/condition/LastStateCondition.hpp b/core/event/management/condition/LastStateCondition.hpp new file mode 100644 index 0000000..89ec58e --- /dev/null +++ b/core/event/management/condition/LastStateCondition.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_LASTSTATECONDITION_HPP +#define MAD_LASTSTATECONDITION_HPP + +#include "Condition.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +namespace mad::core { + struct LastStateCondition : Condition { + public: + LastStateCondition(std::shared_ptr m_machine, StateMachine::StateId m_to_state_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + std::shared_ptr m_machine; + StateMachine::StateId m_to_state_id; + }; +}// namespace mad::core + +#endif//MAD_LASTSTATECONDITION_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index b986148..ab5f66c 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -13,6 +13,7 @@ void mad::core::Transition::handle(const mad::core::Event &event) { if (!is_active || m_state_machine->has_made_transition) return; if (m_condition->is_triggered_by(event)) { m_state_machine->has_made_transition = true; + m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); for (auto &i : m_state_machine->m_transitions[current_state]) { @@ -41,6 +42,7 @@ mad::core::StateMachine::StateId mad::core::StateMachine::add_state(const std::s } void mad::core::StateMachine::set_initial_state(mad::core::StateMachine::StateId state_id) { m_current_state_id = state_id; + m_previous_state_id = state_id; for (auto &i : m_transitions[state_id]) { i->is_active = true; } @@ -52,3 +54,6 @@ void mad::core::StateMachine::add_transition(mad::core::StateMachine::StateId st } mad::core::StateMachine::StateMachine(std::shared_ptr m_dispatcher) : m_dispatcher(std::move(m_dispatcher)){ } +mad::core::StateMachine::StateId mad::core::StateMachine::get_previous_state_id() { + return m_previous_state_id; +} diff --git a/core/event/management/controller/statemachine/StateMachine.hpp b/core/event/management/controller/statemachine/StateMachine.hpp index 733e029..05e4791 100644 --- a/core/event/management/controller/statemachine/StateMachine.hpp +++ b/core/event/management/controller/statemachine/StateMachine.hpp @@ -21,9 +21,12 @@ namespace mad::core { void add_transition(StateId state_id_from, StateId state_id_to, std::shared_ptr transition_condition); void set_initial_state(StateId state_id); void control() override; + StateId get_previous_state_id(); + private: StateId m_current_state_id = -1; + StateId m_previous_state_id = -1; std::vector> m_states; std::vector>> m_transitions; std::shared_ptr m_dispatcher; diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 808610c..924c28b 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,9 +1,10 @@ #include "LevelLoaderFromFile.hpp" -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" +#include <../../game/mobs/hero/Hero.hpp> +#include +#include +#include +#include +#include #include @@ -19,7 +20,7 @@ namespace mad::core { std::unique_ptr LevelLoaderFromFile::load(std::shared_ptr global_dispatcher, std::shared_ptr system_listener) { - auto level_dispatcher = std::make_shared(); + level_dispatcher = std::make_shared(); auto world = std::make_shared(*level_dispatcher); @@ -27,17 +28,22 @@ namespace mad::core { m_config_json["camera"]["position"]["y"]}; auto camera = std::make_shared(camera_position, world); + controllers = {std::make_shared( + camera)}; + + Entity::Id hero_id = create_world(world); camera->turn_on(*level_dispatcher, hero_id); level_dispatcher->registry(camera); - level_dispatcher->registry(std::make_shared(world, hero_id)); + //level_dispatcher->registry(std::make_shared(world, hero_id)); + /* std::vector> controllers { std::make_shared(camera) };*/ - ///State Machine + /*///State Machine struct C1 : mad::core::Controller { void control() override { //SPDLOG_DEBUG("controller 1"); @@ -57,7 +63,7 @@ namespace mad::core { machine->set_initial_state(0); std::vector> controllers{machine, std::make_shared( - camera)}; + camera)};*/ auto level_runner = std::make_unique( system_listener, @@ -66,8 +72,7 @@ namespace mad::core { global_dispatcher, level_dispatcher, world, - controllers - ); + controllers); level_dispatcher->registry(std::make_shared(*level_runner)); level_dispatcher->registry(std::make_shared(*level_runner)); @@ -82,7 +87,7 @@ namespace mad::core { Entity::Id hero_id = 0; std::string map_line; while (std::getline(m_level_map, map_line)) { - for (char object: map_line) { + for (char object : map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, @@ -99,9 +104,8 @@ namespace mad::core { break; } case Objects::Hero: { - hero_id = create_hero(world, - {current_position_x, - current_position_y}); + Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + hero_id = hero.get_hero_id(); break; } case Objects::Enemy1: { @@ -137,16 +141,14 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile) - }})); + StaticImage::TransformType::Tile)}})); Entity::Id square_id = world->create_physical_entity( 0, position, 0, image_storage, - is_stable - ); + is_stable); } Entity::Id LevelLoaderFromFile::create_hero(std::shared_ptr world, Vec2d position) { @@ -160,37 +162,32 @@ namespace mad::core { image_storage = std::make_shared( std::unordered_map>( {{ImageStorage::TypeAction::Idle, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], - m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) - }, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"])}, {ImageStorage::TypeAction::Run, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], - m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }} - ) - ); + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"])}})); hero_id = world->create_physical_entity( 0, position, 0, image_storage, - false, false - ); + false, false); return hero_id; } -} \ No newline at end of file +}// namespace mad::core \ No newline at end of file diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index e12e665..46d2f52 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -115,6 +115,10 @@ namespace mad::core { std::ifstream m_level_map; + std::vector> controllers; + + std::shared_ptr level_dispatcher; + std::unordered_map m_objects = { {'.', Objects::Empty}, {'#', Objects::StableBlock}, diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp new file mode 100644 index 0000000..8407ce7 --- /dev/null +++ b/game/mobs/hero/Hero.cpp @@ -0,0 +1,86 @@ +#include "Hero.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/KeyReleasedCondition.hpp" +#include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["hero"]["source"]; + + std::shared_ptr image_storage; + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) + }, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }} + ) + ); + + hero_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + false, false + ); + + + ///State Machine + struct C1 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 1"); + }; + }; + struct C2 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 2"); + }; + }; + auto machine = std::make_shared( + std::shared_ptr(level_dispatcher)); + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(2, 0, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(2, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); + machine->set_initial_state(0); + controllers.push_back(machine); +} +mad::core::Entity::Id mad::core::Hero::get_hero_id() const { + return hero_id; +} diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp new file mode 100644 index 0000000..d8795df --- /dev/null +++ b/game/mobs/hero/Hero.hpp @@ -0,0 +1,23 @@ +#ifndef MAD_HERO_HPP +#define MAD_HERO_HPP + +#include "loader/LevelLoaderFromFile.hpp" +#include "world/LocalWorld.hpp" +#include +#include "world/entity/PhysicalEntity.hpp" +#include +namespace mad::core { + class Hero { + public: + Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers); + Entity::Id get_hero_id() const; + + private: + std::shared_ptr m_world; + Entity::Id hero_id; + std::shared_ptr level_dispatcher; + int last_pressed_key; + }; +}// namespace mad::core + +#endif//MAD_HERO_HPP From b36e8f9d015964fd72939c5db1bc13d61223849b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 002/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- core/world/LocalWorld.cpp | 3 +++ core/world/LocalWorld.hpp | 2 ++ game/mobs/hero/Hero.cpp | 2 +- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index b65987c..d104bdc 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -93,3 +93,6 @@ mad::core::Entity::Id mad::core::LocalWorld::create_physical_entity(int z_ind, m mad::core::Entity &mad::core::LocalWorld::get_entity(mad::core::Entity::Id id) noexcept { return m_storage.get_entity(id); } +mad::core::EntityStorage &mad::core::LocalWorld::get_storage() { + return m_storage; +} diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 14c38a8..4f4d4c6 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -34,6 +34,8 @@ namespace mad::core { Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, bool is_fixed = false, bool is_rotated = true) override; + EntityStorage& get_storage(); + private: std::shared_ptr>> m_step_events_queue; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From d9bd2dc635b5c26f6d87b2f73f2e304dd291cead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 003/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Fall.cpp | 6 ++ core/event/management/controller/Fall.hpp | 17 +++ core/event/management/controller/FlyUp.cpp | 6 ++ core/event/management/controller/FlyUp.hpp | 18 ++++ .../management/controller/GroundMovement.cpp | 7 ++ .../management/controller/GroundMovement.hpp | 17 +++ core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ---- .../controller/{Jump.cpp => JumpImpulse.cpp} | 8 +- .../controller/{Jump.hpp => JumpImpulse.hpp} | 10 +- core/event/management/controller/Movement.cpp | 27 +++++ .../controller/{Run.hpp => Movement.hpp} | 18 ++-- core/event/management/controller/Run.cpp | 25 ----- .../event/management/controller/StartJump.cpp | 6 ++ .../event/management/controller/StartJump.hpp | 17 +++ core/visual/image/storage/ImageStorage.hpp | 5 +- core/world/LocalWorld.cpp | 3 + core/world/LocalWorld.hpp | 2 +- core/world/entity/PhysicalEntity.cpp | 10 +- core/world/entity/PhysicalEntity.hpp | 1 + game/mobs/hero/Hero.cpp | 98 ++++++++++++++++-- game/mobs/hero/Hero.hpp | 1 + .../hero/hero_fall/adventurer-fall-00.png | Bin 0 -> 1004 bytes .../hero/hero_fall/adventurer-fall-01.png | Bin 0 -> 999 bytes .../hero/hero_fly_up/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_idle/adventurer-idle-00.png | Bin 0 -> 1134 bytes .../hero/hero_idle/adventurer-idle-01.png | Bin 0 -> 1127 bytes .../hero/hero_idle/adventurer-idle-02.png | Bin 0 -> 1206 bytes .../hero/hero_idle/adventurer-idle-03.png | Bin 0 -> 1110 bytes .../hero/hero_jump/adventurer-jump-00.png | Bin 0 -> 1095 bytes .../hero/hero_jump/adventurer-jump-01.png | Bin 0 -> 1049 bytes .../hero/hero_jump/adventurer-jump-02.png | Bin 0 -> 1094 bytes .../hero/hero_jump/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_run/adventurer-run-00.png | Bin 0 -> 1073 bytes .../hero/hero_run/adventurer-run-01.png | Bin 0 -> 1043 bytes .../hero/hero_run/adventurer-run-02.png | Bin 0 -> 963 bytes .../hero/hero_run/adventurer-run-03.png | Bin 0 -> 1140 bytes .../hero/hero_run/adventurer-run-04.png | Bin 0 -> 1075 bytes .../hero/hero_run/adventurer-run-05.png | Bin 0 -> 859 bytes game/resources/levels/level_01/config.json | 54 +++++++--- game/resources/levels/level_01/map | 2 +- 42 files changed, 292 insertions(+), 99 deletions(-) create mode 100644 core/event/management/controller/Fall.cpp create mode 100644 core/event/management/controller/Fall.hpp create mode 100644 core/event/management/controller/FlyUp.cpp create mode 100644 core/event/management/controller/FlyUp.hpp create mode 100644 core/event/management/controller/GroundMovement.cpp create mode 100644 core/event/management/controller/GroundMovement.hpp delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp rename core/event/management/controller/{Jump.cpp => JumpImpulse.cpp} (65%) rename core/event/management/controller/{Jump.hpp => JumpImpulse.hpp} (57%) create mode 100644 core/event/management/controller/Movement.cpp rename core/event/management/controller/{Run.hpp => Movement.hpp} (50%) delete mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/StartJump.cpp create mode 100644 core/event/management/controller/StartJump.hpp create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-00.png create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-01.png create mode 100644 game/resources/animated/hero/hero_fly_up/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-00.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-01.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-02.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-03.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-00.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-01.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-02.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-00.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-01.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-02.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-04.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-05.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Fall.cpp b/core/event/management/controller/Fall.cpp new file mode 100644 index 0000000..ed817e6 --- /dev/null +++ b/core/event/management/controller/Fall.cpp @@ -0,0 +1,6 @@ +#include "Fall.hpp" + +mad::core::Fall::Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fall; + Idle_animation = ImageStorage::TypeAction::Fall; +} diff --git a/core/event/management/controller/Fall.hpp b/core/event/management/controller/Fall.hpp new file mode 100644 index 0000000..4e8274d --- /dev/null +++ b/core/event/management/controller/Fall.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_FALL_HPP +#define MAD_FALL_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Fall : public Movement { + public: + Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FALL_HPP diff --git a/core/event/management/controller/FlyUp.cpp b/core/event/management/controller/FlyUp.cpp new file mode 100644 index 0000000..969d7e2 --- /dev/null +++ b/core/event/management/controller/FlyUp.cpp @@ -0,0 +1,6 @@ +#include "FlyUp.hpp" + +mad::core::FlyUp::FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fly_up; + Idle_animation = ImageStorage::TypeAction::Fly_up; +} diff --git a/core/event/management/controller/FlyUp.hpp b/core/event/management/controller/FlyUp.hpp new file mode 100644 index 0000000..e87bc4a --- /dev/null +++ b/core/event/management/controller/FlyUp.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_FLYUP_HPP +#define MAD_FLYUP_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class FlyUp : public Movement { + public: + FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FLYUP_HPP diff --git a/core/event/management/controller/GroundMovement.cpp b/core/event/management/controller/GroundMovement.cpp new file mode 100644 index 0000000..b8e127e --- /dev/null +++ b/core/event/management/controller/GroundMovement.cpp @@ -0,0 +1,7 @@ + +#include "GroundMovement.hpp" + +mad::core::GroundMovement::GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Run; + Idle_animation = ImageStorage::TypeAction::Idle; +} diff --git a/core/event/management/controller/GroundMovement.hpp b/core/event/management/controller/GroundMovement.hpp new file mode 100644 index 0000000..339fe34 --- /dev/null +++ b/core/event/management/controller/GroundMovement.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_GROUNDMOVEMENT_HPP +#define MAD_GROUNDMOVEMENT_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class GroundMovement : public Movement { + public: + GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_GROUNDMOVEMENT_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/JumpImpulse.cpp similarity index 65% rename from core/event/management/controller/Jump.cpp rename to core/event/management/controller/JumpImpulse.cpp index 9e5dd5a..6ffc28d 100644 --- a/core/event/management/controller/Jump.cpp +++ b/core/event/management/controller/JumpImpulse.cpp @@ -1,8 +1,8 @@ -#include "Jump.hpp" +#include "JumpImpulse.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +mad::core::JumpImpulse::JumpImpulse(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { } -void mad::core::Jump::control() { +void mad::core::JumpImpulse::control() { auto impulse = [](mad::core::Vec2d dir) { return mad::core::LambdaIntent( @@ -11,5 +11,5 @@ void mad::core::Jump::control() { }); }; - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -2000000.0f})); } diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/JumpImpulse.hpp similarity index 57% rename from core/event/management/controller/Jump.hpp rename to core/event/management/controller/JumpImpulse.hpp index 25d5cf1..5e69a29 100644 --- a/core/event/management/controller/Jump.hpp +++ b/core/event/management/controller/JumpImpulse.hpp @@ -1,15 +1,15 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP +#ifndef MAD_JUMPIMPULSE_HPP +#define MAD_JUMPIMPULSE_HPP #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Jump : public Controller { + class JumpImpulse : public Controller { public: - explicit Jump(std::shared_ptr world, Entity::Id entity_id); + explicit JumpImpulse(std::shared_ptr world, Entity::Id entity_id); void control() override; @@ -22,4 +22,4 @@ namespace mad::core { } -#endif//MAD_JUMP_HPP +#endif//MAD_JUMPIMPULSE_HPP diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp new file mode 100644 index 0000000..a580c78 --- /dev/null +++ b/core/event/management/controller/Movement.cpp @@ -0,0 +1,27 @@ +#include "Movement.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Movement::Movement(std::shared_ptr world, Entity::Id entity_id, mad::core::Movement::Direction dir, float velocity) : m_world(world), m_entity_id(entity_id), dir(dir), velocity(velocity){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); +} +void mad::core::Movement::control() { + auto set_horizontal_velocity = [](float vel) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).set_linear_horizontal_velocity(vel, event_dispatcher); + }); + }; + if(dir == Direction::Right || dir == Direction::Left){ + m_entity->set_action(Move_animation); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(velocity)); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(-velocity)); + } + } + else if(dir == Direction::Idle){ + m_entity->set_action(Idle_animation); + } + + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Movement.hpp similarity index 50% rename from core/event/management/controller/Run.hpp rename to core/event/management/controller/Movement.hpp index 07ed05c..2bac02d 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Movement.hpp @@ -1,18 +1,21 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP +#ifndef MAD_MOVEMENT_HPP +#define MAD_MOVEMENT_HPP + + #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Run : public Controller { + class Movement : public Controller { public: enum class Direction { Right, Left, + Idle, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Movement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); void control() override; @@ -21,9 +24,12 @@ namespace mad::core { Entity::Id m_entity_id; Direction dir; PhysicalEntity* m_entity; - + float velocity; + protected: + ImageStorage::TypeAction Move_animation; + ImageStorage::TypeAction Idle_animation; }; } -#endif//MAD_RUN_HPP +#endif//MAD_MOVEMENT_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/StartJump.cpp b/core/event/management/controller/StartJump.cpp new file mode 100644 index 0000000..c124a52 --- /dev/null +++ b/core/event/management/controller/StartJump.cpp @@ -0,0 +1,6 @@ +#include "StartJump.hpp" + +mad::core::StartJump::StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Jump; + Idle_animation = ImageStorage::TypeAction::Jump; +} diff --git a/core/event/management/controller/StartJump.hpp b/core/event/management/controller/StartJump.hpp new file mode 100644 index 0000000..ea4df13 --- /dev/null +++ b/core/event/management/controller/StartJump.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_STARTJUMP_HPP +#define MAD_STARTJUMP_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class StartJump : public Movement { + public: + StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_STARTJUMP_HPP diff --git a/core/visual/image/storage/ImageStorage.hpp b/core/visual/image/storage/ImageStorage.hpp index 5699096..d866bd0 100644 --- a/core/visual/image/storage/ImageStorage.hpp +++ b/core/visual/image/storage/ImageStorage.hpp @@ -13,7 +13,10 @@ namespace mad::core { enum class TypeAction { Idle, Run, - Attack + Attack, + Jump, + Fly_up, + Fall, }; explicit ImageStorage(std::unordered_map> actions); diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index d104bdc..efa14c6 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -54,6 +54,9 @@ void mad::core::LocalWorld::produce(mad::core::EventDispatcher &dispatcher) { for (Entity::Id entity_id : m_storage.extract(TrueFilter())) { if (auto physical_entity = cast_to_or_null(m_storage.get_entity(entity_id)); physical_entity != nullptr) { physical_entity->synchronize_position_with_viewable(); + if(abs(physical_entity->get_linear_velocity().get_y()) > 0.01){ + //SPDLOG_DEBUG("vel {}", physical_entity->get_linear_velocity().get_y()); + } } } diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 4f4d4c6..4cb88c3 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -22,7 +22,7 @@ namespace mad::core { class LocalWorld : public World { public: - explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 30.0f}); + explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 60.0f}); bool manipulate(const Filter &filter, const Intent &intent) override; diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 9b58177..6f94482 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,8 +37,10 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 0.3f; - fixtureDef.restitution = 0.2f; + fixtureDef.friction = 0.0f; + fixtureDef.restitution = 0.0f; + body->SetLinearDamping(0.0000000001); + body->SetAngularDamping(0); body->CreateFixture(&fixtureDef); body->SetTransform(body->GetPosition(), initial_rotation); @@ -69,6 +71,10 @@ void mad::core::PhysicalEntity::apply_force_to_center(mad::core::Vec2d force, ma void mad::core::PhysicalEntity::set_linear_velocity(mad::core::Vec2d velocity, mad::core::EventDispatcher &dispatcher) { body->SetLinearVelocity(velocity); } +void mad::core::PhysicalEntity::set_linear_horizontal_velocity(float velocity, mad::core::EventDispatcher &dispatcher) { + body->SetLinearVelocity({velocity, body->GetLinearVelocity().y}); +} + void mad::core::PhysicalEntity::apply_angular_impulse(float impulse, mad::core::EventDispatcher &dispatcher, bool awake) { body->ApplyAngularImpulse(impulse, awake); } diff --git a/core/world/entity/PhysicalEntity.hpp b/core/world/entity/PhysicalEntity.hpp index fff81c2..6c3e0fd 100644 --- a/core/world/entity/PhysicalEntity.hpp +++ b/core/world/entity/PhysicalEntity.hpp @@ -45,6 +45,7 @@ namespace mad::core { void apply_angular_impulse(float impulse, EventDispatcher &dispatcher, bool awake = true); void apply_torque(float torque, EventDispatcher &dispatcher, bool awake = true); void set_linear_velocity(Vec2d velocity, EventDispatcher &dispatcher); + void set_linear_horizontal_velocity(float velocity, EventDispatcher &dispatcher); void set_angular_velocity(float velocity, EventDispatcher &dispatcher); void set_linear_damping(float linear_damping, EventDispatcher &dispatcher); void set_angular_damping(float angular_damping, EventDispatcher &dispatcher); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core diff --git a/game/resources/animated/hero/hero_fall/adventurer-fall-00.png b/game/resources/animated/hero/hero_fall/adventurer-fall-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4b30fb90d8d77f591fa2c00b728f6fdcaa5c5b GIT binary patch literal 1004 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 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-00.png b/game/resources/animated/hero/hero_idle/adventurer-idle-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd528e863cf02b31c7cd6cc923034015a745f60 GIT binary patch literal 1134 zcmV-!1d;oRP)XYxd z%)~`q3?`ZwGQ&ccn#forX7!Td>ckZaLiyKW|4~Z0K3wjV%Cb%FX*7mUa?{h_J?H#> z-*e9IoO5BDZMNBFn|}eR7@dB2<}{55_p2LisYFsLmv;d0=u2-2_gN~uMotB8iwUFd#mtzN=4xA) zAxbo+g>+vGbF8_FbMFNJ_`}`Dp+!`H!Qd#nZ=9zuAmR2Mp)Vj&_4x7sX0ihuZma}A z$(*4MShLx9a6Utg)5*Zu9{kVxwD+HkajLRTeXR(|E^Pb#ampt>J@mb*^nS`@JPv@r zvJTJ$6dThc6Yl6_IuWN@cB;yJgmB;qrsra`{xV_+dU9X0QUB|k*GWC~jN$u@w_i0I z0w8Ecs%59TAwYu~rxVbE*QvGJ`B^IpJx@#}d$^;Mh4kjLVR2!C$#|T)4=w|mApNPm z@Ey~0F#s~zWi##z*z$~oJ36_YP4R$3E|`tbjbV=d8ezxl?-Eq{nQ|luS+!(uKm8m* zrJuzG?FMkL@u&a^8e0|;OW(%h*rh7-5ddS90hacZLeD#!+Du(|lL~to;NkgK-e)E{ z#_-Km9@%Gpg>Sis<<%9G`3RHoI4wOt&;kUNexl)!#L(yJQYN<^G*r1gTBAvA_iF3t z0${h-CoE64oFhvs={wrJ2O9pWlgSaX`l!~0+!^(5FYgyK$$rlOLRKFS*ZTpec6$g} zeWZ`QfI~V=Q0X_}dNZbWE&ZGTjKF52zfoZ?GnUo#T+Dc?+#YfR-9#oX6|@n7kaI*2 z=t|Fds=Rw~W^w>DFh<4t4h7m$1IP_@OIPeQs@_HfTNbjAOiHXTuh>sPW7nFE-ogod zF{iJ*m4bGs+!B*n73>)8MIik0cH;PBL{h7&EXyPkg@>hXt1B;+dIyGt`W61oK9es+ zmhBr&`e3P`iJ8geM7uTrJ@R*ItoNSe`>FF!5iVq}O{LwI*Apm$kezE;wPO9&yT4pw z%XzUgBwWZ+JkEGBMfxruP2h($07*qoM6N<$f|lkf AqW}N^ literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-01.png b/game/resources/animated/hero/hero_idle/adventurer-idle-01.png new file mode 100644 index 0000000000000000000000000000000000000000..230c1cb30f47fc1ae3db9e1f34429b345a4926dd GIT binary patch literal 1127 zcmV-t1ep7YP)ESc;_C9 zN~YPOF@}(l7a8lA02vurp5=gLRm^pN?Vjl0Cv3cj&Psl!Yu-+WQxzf z_?nL9Z2+i?D%)EE8o+#ft|W(Nn#kTxpH?ATq)a-;z~v|a*Qal20iTyEp=)$BZ$oh^ zj1GrUoC<(O2{NI~tbv+3nM^vTRmc|hcKQGa_`JqlT~rO-!m((WCbE*wNjjP4hwOaW z`!M0?l(8O;PH`o4%@~&oris{O3vR_G0kkyPH9*^ysvsPlLUAe_{4B^|R}USJx*6>1 zF-VDqkX$|AyPMXgYHesF!cF&i=8iqZWOe?G-hAU=k#79NRT}y}7XFS1samZ~)c}Ok zhw!hVQqWL)cSsAncVOXtrc#(FG~FvdPv=EukP7`~6b zdql(|h>M6$0-)AiL(H{;|HBIac&e(5%Xj)aeT#N`OaBZ)i0A|gQQ3WzQ1~LFc9j8_ zg8`R=-(G%=Q1~J<@mT=UnH3T40f8-wPGwg@4HS`Zx_mfYzM_5m4ZrG0z? zfTgh1yHZtwlV`YzKENoH5Ld90WHhmRW%xKx)vpNQ-!ibUMA zljWT+0T2pbH0!zurioNqZGWgf5!r)ddKIV3N9}qvAYaY0-+X{wYAsY3QoT$Q3C~Xy z%`0DjPikit>SY!eqRhl+i!Ok%Q+xiMEedR;%G}hiWYbvy8i?Uo*eC!?>+-@q&4JxQ z{0kwXlepA(lDoY3QU#oe>lt&aNcVZSL@c8b={src5dqUgVu=K)A3{dj%uQYAQd~n( z6jZhNM@mr?&cs#xTgs`-S1Vy(cj3AENarrBR;vc+M06jTq9_1lvso#4`Fo*$h4orG ztX8WKoxcm=L_D^?4suPIn6G&ugcI@KvBthyE2^rp)w+?oTdhc{s`7*_iMKq<+s}#X zv!Db-?6*=HK%2bGefBa&hJuU?1#wCl+T>*boMkzoEj*Nfh@+|sfPmLSt!=}+(~=YI zstCe~=vd8Wr5eYbMY0M@nKYS9mBe33h%6-%BvQ+~`pE@DcIw+vGPyNlzLFCgA>l-p t5(y@gDVG1_?{6}h!e+4ue^34w_#H}Ld7*XQd&mF)002ovPDHLkV1mdw8z%q& literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-02.png b/game/resources/animated/hero/hero_idle/adventurer-idle-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2668b590bc2ab2ffead9465e8f2538ae88cd34c8 GIT binary patch literal 1206 zcmV;n1WEgeP)t%mk;?vU!GyH0*Y1*|JHBF2?Ep!3V(Y$=@}%tAyU6o77fqMR6#M z-0+|{6abAhR6>SP1BIJqqKk1YTQMmjn21F-;Z!UVKy{^61GE<+*?4>tC=P|AUk}h%cZAyKo%Gcm z(MgGhkXpUiR?m*g0`2;+mwV2OOt-wmc){8poqX?Tl5X%+KNTIH3-1vjr`C?j0suUV z$0)rodwgb<{pHmJPxZsgrnUL6e#Ko-`lmLGLdebp`wr1|(M?6~cbd0$4^zPaW&PLm z`Tgb9`uM`=4I-~J>b_5W^sa~y#AIad6Dy6}(mHGR08r#Cq}XoP=P!)j(8n%W=I6Dc z&|}zevwNEk(^*lLB%2Bb@aHd4`spPAitTp&=Q{HvQ^5cL(dA`YPJV1O1V8{0fJW~v zEkS1FmjRsqK60B*Fyy(+h*hOK-$r-7jk|BX!;t4PbF)6Cf&sF#vb3jPe3gOG6~i$Y zDlKo*VZyN`a?KWCEfWp1^Nd&_+v85c zXJP~97h`zkVzzC07JwDMzD!%br$||w)WjRI;j9?SNTD@Pdsvoxyj6l!5&)Uiudz_` zCZ(Vu`5W8|30E;DG199bLsI)vYWB5ZMO4kK6J@Fg6 z2tb+4+^jEUjT0F2ou|}wfU6zt0Q%Digj|RT5?4Fgd936K?29n~D)3{Q4d{CF_vNuG zr=@dpPePnhp8p1hi16rP=;E2yC;N{X_gD0Bri0&($Q*oKHS4-OJt(QjqR_f0!@ z;+YSVkXX0tilT5Q4MYrEY#tnhb%EB@*FAEL*=#oIHU+|u-@=SXzc>9Ioqr19M9Onb z?6rhZRh2yRgG}X_kyKS>uO&=LW{eLG?h@)(IFX{9EX`)Ovr}H+Noxkf*9REBK7d1t zvQu6Fz>yIba^$W@T5fg#cS$itmIvk?rg*ws0cj+%5{pTNwoOU0Y*U6b9*(5NUs{OF zheCuR3p9UuNtb=`{Rq+cs{Vf|E;d8LiOh#WjE5sEM3??jXFMFiVloNulm7+&0QQ2K U4h?yP-v9sr07*qoM6N<$f=IDF&Hw-a literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-03.png b/game/resources/animated/hero/hero_idle/adventurer-idle-03.png new file mode 100644 index 0000000000000000000000000000000000000000..53207e8a2f1ed323478a1e16c27559eff02c46ba GIT binary patch literal 1110 zcmV-c1gZOpP)BW*kqGUHreDqK&gh)Q%4Wc(RPn0?Mv$^rB>Slz@cWE!eOWhbOWU%kSjcK7uN1{}-fQQ} z6T1jSqQ-bA66IX*qS3Av6$`PcW;~ir0qE+m3qU-Owi1d&(OeowKAK>xZ;;;mJ&g4Y z8lq$)Wv`w-@i4nP++ut(%pac9EWGh3)9%6=z4G#r4Yu*)=V={!S9*;|Ikk3oxB&=d zj?#3a@2~HBJe*8Q_!|Lt(@lL;ijrIB3K^_WDaQrcilC!UKo7@>ZH=>#PVZUL)N55RCwrCh{{yq}c>prmRT<%d3NsQOI7}+H z$`*^w5HTB{XL%_?-@q|~p;2b+I$_ldK;OV1!O$qnONEQG=fTIBxV%PpOXa0nc4~+F z`|)cY>a4Y5xOIoI%F9a;dVakIJ5&IYnVcb{H50?3TKJI$UU>6UV-7Nel;vT#zaPgP zb|QLQ)LCnJGb<^I~ZP+YC=agV*wD@zwQ*yafRP28j0k9CgVzi4Qia1mY$xIGFq?VLYF%?tp z<}_B(>vU3_(AlAr)ccxgQZ0sIv33C1){Q4N20*=gm-yOd?DNICJr`Q&~=?U%lctbXF<_*oqe_xzM34bKG`ERu5=;w zR+9kOqponb-NfYh1e46vuxfYUac ziD~?J=z~qAO)-9yX!;Qo1F=N|uA&lbf!(FJEO1%(3%bzpVPRc_KIk1@%>I&_+?=^N zbN+MAoS6$*vSi7UB}DrKD$J1^)>(^GZCt4JQ83kG^uPM?^ETds90k@u_&!t4u=}u zY5U0dZRv5B(lhW20D8X8V80jN*a-1>Oy0}izeQO_<`Rpds92N1@r112ZWk{dc@%(9 zUnu|{cPWvX2ztH_u;N_>$}(cpawybo0-$DxT>^66-ip`fPk-a}`O}%nw5vdwkke;} zc%o(#@4rzCz@LR*;eY#MSs%0F_4(2Bb&j6xqqnJ@+PXq|o7&T&RFI>}(NIepTb{N6 zoa`QZ9%JNNe69z`8NEr^F7W>mqPa@Y>J~WiAEebS_*LYItJivz%&(+t47Ic|5i!`T zyQFt&l%d)u(_@uAR|psePi?J984je@?!v8dI`$Qa{Q9FRLQp3Jkln-m#10-#+XsK^ z<8gwNOxp+;2EgBffDejXVlKJBd#B$q9fN5hLoIDg$0HQjb@}d67n+$)og+;x?L<3I z0jv|Xgv6WD681X?ycq;s3{>sEp5!s$H=ofWcP4Cb)7c=81PhhgOP%%p2Eh246O5lZ zK{$~FV7B8pvmM8Ql;9;yAB?8*Ik#{J@6;#(!=S|FS~c#}EC7TPNd~Q3fRr$&W}&XC zK^V8k8Q`+4_Uwa{nEzZMri6s=#8=stS9#KZ3wwrr=Qa-$p&$fqvf;p60-)Gg!Iz&L zW8liyY%VM^6N>38O1dNhhQaKTh-;l6vZ=HjS0ag1vyfZ!3;>g%AP;L6X2Zj>%-u{Z zJ|WJX?^4n^P2aULJ5lh*fz+x4ll~E0q{@o^PXVX`!hi)B^##;vcQ@9fTP&F-LB@VsOQ2bl-F`DEv94J)>-t-*T*#Y;8>n;$_S>RVE(9sH-c1Y0 zvmhdo2>WeO)zhjMV$(EfOD3dq>42 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-01.png b/game/resources/animated/hero/hero_jump/adventurer-jump-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b20e0343c77fa6ecb46aa2cfeccfa0f8699f6427 GIT binary patch literal 1049 zcmV+!1m^pRP)izazx1zV>AS_=w^KI)u_p$@kw8d z8Z_}?I+1`ebIQV8e1SL@rB)%5O*>i`mI9@=rF306K6KO;>(f0?+D~$mbI&>Vch2|z z&iVa*P@+VM5+zEMC{d!s{{^AS(D4qpG+PZKmCP{mZ6MeG!RZqm+`C8S&rQVQqFmbn zK+E&5DOrD;5-WhS+Da;!k!Gub;~nl?e6Y$cYPpWjx2G9fSCZsURGO5T6H6@Wh-qXgeND}8}r zZjLVyWZXNQYpXYN zp_$%3me*qJEYsvrV*>yS;Sej!*${k`5H-sd<{}XQ9)00(_QS6;I8L>Qmp_^2op;~X zyA6FpW_tTrO(nS7TrP(i8wvy%jb_o_^OTGao&hKjv&r?AcADC{Mbpu4j@+v+fa(?k zNZ-;8YTvsEfY&#M|Cb+xf9gjXlXJ5A>1@J_51wIS!_5T@q;+k*r7rgY~MT|%O%1c6w%=$Of{ zjk4|8SQ1U9nKIV{Sz$J-iMIXiB64#cFJtnKS9FQdC*;;z!MoQt2EbzQcT8L6-nY-g zLO29-zp?$1Hw8eoZ4Y05dJ^xYi&QzBdbXmwM9CF{n<6d`4p8Z;W7mdc?N%C_)r7J6 zF#s0BAsVbER-@Nst@{{>wFPnRvk@gBSa+?p8Hqwad9!~USPc3}Br?>P1<_<0CO-#Y zKM(~>z>UBKYTd__)mplY40UzMts!;OZnWAchr_bi7(EWbtLML0mJC5>W?zoS^EV^% z9)`mbP1FAIjizb*n?OD2I$9^MT!A89J<{nY#^dcA(u$rM zrAKKi%7s|0R$0Zm?6$;dyd7e%%_IPJ8`HQfh*&H}w~yB&|KhI)(S z=kKnv+myyB)?|-E5K3i~dq=sDXe5F!I7fUvB>>^H-BmC?8&BXg8`R(S{|bKrE6Hcb TLPIqs00000NkvXXu0mjfd%y9w literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-02.png b/game/resources/animated/hero/hero_jump/adventurer-jump-02.png new file mode 100644 index 0000000000000000000000000000000000000000..ba27779940e0644fb74d1bfdf8d863c973b2036d GIT binary patch literal 1094 zcmV-M1iAZ(P)9&_Hb*pLGr17@BNpIHcLz6VIq9Z$3eaQFaa_%|z ze1G5b`+d(j7b>Wrf(k154lQ`Zg1OY=G(7-If~C8q^Ti*J8+XY(D$?y9!1J5 zf5M|Xf+o2|nxC8J!%t4Iy?s-mzy01W034=W8mA>0$qB*jRfIp|Geg0(M4}S~F|!># zw1@6veDE2*(0nvC1ZWLy6FraJQ#NOnoX}Sz(Ch>t6kJ<)Y6-1m%=+HLBxa&?J^2DQ zkB8w)*|Pa85u)0vMC^)=r$#j+(TT$QNOXd;Bj-!Tc6RqN5*Z@cy4jqajg`%5iIC97 zdH@Fc?quigB_h!Yygo0_elSe9v$teya_Xu87>Nu~R~Il>&vt#V#OzH07w_(EQKL|imLx2|t`pb&Rl8hwYaG`g16x#W7Bag}WvKO9D zXdvo&lVuTlCSCTzS|S8s%dvhlGCd9tKLM-+4{-ChUjcA3*KT@f4|*mooOVaqeA0zn z=-$uFf`;Ga1z>&fL5$Ddp?Tjy0OpPzBD~=i9#2jIknpV$2L}3YnAehw_+4J}=F({1cM#WbSPG}q?KhtdfR_5@EjZPzQ0r8wb*cc2*;@J3*XzYF3@M8#t+a~0QR8r|3Qp6sRo`fuhN`M%->-@xMM&No0CSm) zsBt>Y8izxCb2N_8|=8zN{kOn~on7XZ4h|G!G>w#F9m zyRHkD&BmBZ}hywXp0V{x${B9%;Xm)|A;j+`08tteno6-d7{sy3UM%AF&ss)~SN6v{_-7K$M~ zBdKJP%X9P0XS2dE3`>JAhV+bFo}0&|REz0!hF8ygFMIk5D)_hY2che3yBE_uw*UYD M07*qoM6N<$f+g)C)c^nh literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-03.png b/game/resources/animated/hero/hero_jump/adventurer-jump-03.png new file mode 100644 index 0000000000000000000000000000000000000000..0458013c8dae7ecf137a009f0de9d2dc5fb7c074 GIT binary patch literal 1019 zcmVHJ^vVQpW(c}v>cx7okus_yS(ar3JEV;Dv^i{T*}CJ!)paNe35`SSfONF=l! zfW7aWCmQKi<8np@U@|#OD7;U}X4ATOYG%Z2X%Oj!JjvU?Z<()*PbP=)cmj$ZKEwCO zbgZ90WQm~5tDH#>bK#RtJ|3JQ?FmtyS|@kT(RcSbI!3=B?FrEp8z36#=0K~dYCWb} znYc1@oeQ6J^7;5-(w?Gf;@xf^;Nxl-P9-+XO^*CP`o^R#Zo`aB$NI?@msJx0-@G>s zZyp99=nnv}IC~9%k5(%| zgQ|^Wi_4m7RHD*^+h!)0-)J$@{$l{#TTFA$vBS`han%o-j`eRjr2tVj(s%Sl!ls8? z9zDk729a5B#A>w?A0Dk%hKi~;dwL}+9OfpLR|{pKnwQei-9=`-#B9N-StrZ#=2b~? zx$NZg`Tuuny)<;We7U8Nc4q@OAE2qmBNLi?=++(Sd^S3k&`4O#U%FF5pJ=u>7Tc)aNMsJ!I0LfnUS0%aqGb{ z%WG@GE7tgSbb{u_5^jrG>~K0r7fWJ~-MHU~n*FoC{mNd&ZfX=OYb7rJG^NG|Uw;8M p_r>7Qc&+H`sH2WL>Zs%K#Gfd5Tp^4i<(B{e002ovPDHLkV1llc@^t_J literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-00.png b/game/resources/animated/hero/hero_run/adventurer-run-00.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d7cc057f4e6efed4564cae0c022f961089639c GIT binary patch literal 1073 zcmV-11kU@3P)-L~*N`~w~w_wx-vWOaAj0Tr1#<;j-qKOzD_ka(^N1x1$ z&X}lV2_{Q)VF4#B!HhU@z*x40Ez6)V7<6!9m(sy)IX>LAw!&0yZ+Wrbm)@Rp`uqOA z=llEh^b~T)A%`4t$iX_qMiZX+;2^tqRmjw_h`u0vsvm&8jUQWz>&!g0^&zql;pC6) zJX`%F0Q#&><(?`Da5p?{d1Lcz%I`np*6j&d72L-8!K(nMMJiVYh6s(`VsSAd|K;Nk z#fA!bZGVu^@-%(Xt5gNIq0j2cxzuMX*lg|-ExsH?$kr~SC)Ak_N2Quh8qsEH@Zyge1)v9?%~&S7b$(z zgDb2ub|=g$m4ZV-fv>2HLqWkcQ7F2)&s*Zk%Gd93!(jks7Ilifssy-RI{?7G-8=dI z{b2xJetZwSWbWnAcQ>hPX%I!v9kIk|tB|z>oVj5NC^^=_NT{8O;Y-Q&k6q|7#XP{7 z8v~-LzuywKtvxceI7g|sP!@aDq=523fN@PrTeo#{DU;zT$^(Jqx=dk$V4#(ATw%W^(;IwIr58P~L=fN@Qupt)7J zVa z&){|!1JJt?GzVSgOUZ*>pZuj0=e-HB!?;aTo3(>5fvnv}T2D=<^+p1T@=Bopo)kCZ zZhFslXT-N5_mQ9Po0leC*Ma4lZ`x47VEEdbS*=-l{*;_B-_4(N6HDpRT34nkj4wxdQmg3?G zuQ`7Cx4w*dv*L)7pD#BB0=!dE#14OcTC$J0T>_xg<)E#*&lVAo1tBrRNPR16%lye? zzd3gWpVJ9hIKOOfcBi7qc}+tqiYWB^Y5KM^ZNBC7?{-s~ymkki*EB{KBDfrRgtR%k r!#@Ou!00000NkvXXu0mjf3}y^* literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-01.png b/game/resources/animated/hero/hero_run/adventurer-run-01.png new file mode 100644 index 0000000000000000000000000000000000000000..96d832012e63466c4cfc2b9e5b864f7af21b1e72 GIT binary patch literal 1043 zcmV+u1nm2XP)2%@jT z9`t2H%IuT4maPSmLF4|wS~9H8Qm|=8m&G(IH~o{`n_eH%dw08vy4<7%$rmo1^SkHX z-|ut&p96K(Raaeg)m0Z_JDlG5>J!tMU()g-sDuD`sqfQ@{wcW+>&Z3v{V<(}+X2uP zG@kE>nE-!g9#mYhTLyBb_W*#IzPCcGt(Eb~DLN0gql6WHnMk076#$b8dr3nTV|^mU z+FH>TG&}E1SE4NeIn#T9VxhFjo=DCyJ~?Hl-KeG@cY98fiNDPoN1O2aJZAdd3cY$O ziR2tgSmE@yw}^M0qVtsq@vc)gR3)nFtToi#O-o=mK99_9Uy$swMq@xR!|yF~{mxyk zOuokc8`qd^D%an~AD!Ot{rPJ%;)4%AugJG+kfH8wJ6+Iqe6noDn)ceZk?9Gds>)B# z9Rgraq=n$+Apnj)+W~KS07zV%p?jc5gkRkV_g__wS<7A%e6ma`mm`(S5mi+HqN+-< zZxF^lV^5@o`AnME*WZmyPjH+L0AfvhsT2aL08-F(;ge-EmCM;S3&OHBQ*H@Msm9fE zIaEfbC)|brQ~@MkD3HnL?R->K9|4@bB34(k;ApjlY?4sVSpZU(&Jjg*8v;-TkQH6G z(@qH1$DiNdX#SBL24Fsu1|Waw9E&UE??UgEq2%E~SL3x>E4%PX5~*Cy^huH^7{;ao z^O-d7y#M7U`_+qI5d7^jQtLri0k{U~zkS=8-B7FFtY-218-a3{`a8{M((DI}xnEty zQPaJa)vW^YuYndO6JwjoEM$}Dr8OaY+^x-9vT2O3wE-|XcmaTB#|+jiOG2iB{_nLe N002ovPDHLkV1oY={2u@S literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-02.png b/game/resources/animated/hero/hero_run/adventurer-run-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3b74df0890213dc31ab88d93038a14e31daed2 GIT binary patch literal 963 zcmV;!13dhRP) z<(}{RpYNRWoqM57nKEU{lqpl@u0xdC;is?fXM5W=nQu#|ap7<|0qB19h@pNhg@?92 zhYqv?$mLW<41M)GiFksO-<+YRqa6TsQN_E%CjsUobA|_YLs6prAH){Z65#sG4e4vz z%$2|x0InJr!BK^&$?GJO3At`3>rgTwIebl<^{cw5>h}D$5lk2IaC^1hKK{fml&NX` zUYVNKGm~#OLcwd~%idlI;Hz!cZ3{_NY_humsM(#A4YlJ8olG%bjodPG8-;0lI@&q- zfu9#Y`-DUH{=&e`J#cZ*a2y2-xut2M(rT4wCq{MK-mN?IxxV<39iD>52lo*Hyvg5~ zB*vA%7`>rE&i4qQi}Niokm(g%xN0blg16s+?ru_=CILKdw{G{NbY)*Sm!a;pZc+32K|^sAEaX^cCx9*_7hq0QzKCGR&n{-O z&-29Oc=Ot|JHGvjN{dB=qfx9C6#^g}jp~6u`~2GkLw;IQVVr&aIQ#kuZ(8QZ`&;q2 z-FVz?>@8ah8dTFOyMJQkU$x=PTaW7PU}X!>?0+E}$feWbmE#{9_G7w`!BgiXK!@*X z-8OvUD8G&=0C;cxLAA}wWAA^@@QI`JzkAqFOrZdBA36{_`W^@Yg>T6taF67vAJ={pH@W?%q$#{aRDn-pij#6yD z@;7+Nz3ouqa7oPiQL)T?#UuuA+70S{AfS@n&4fe+Rv^+Y2DKI2|md)8fP7KvDWF lSsnQ=t7}Gb2L|)5<{u@>Infw4#AN^g002ovPDHLkV1mT5)A0ZR literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-03.png b/game/resources/animated/hero/hero_run/adventurer-run-03.png new file mode 100644 index 0000000000000000000000000000000000000000..a512930ec81d583aac03630d3d9fa7e4441facf0 GIT binary patch literal 1140 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 Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 004/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- .../condition/KeyReleasedCondition.cpp | 15 ++++ .../condition/KeyReleasedCondition.hpp | 18 ++++ .../condition/LastStateCondition.cpp | 13 +++ .../condition/LastStateCondition.hpp | 20 +++++ core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++ core/event/management/controller/Jump.cpp | 15 ++++ core/event/management/controller/Jump.hpp | 25 ++++++ core/event/management/controller/Run.cpp | 21 +++++ core/event/management/controller/Run.hpp | 29 +++++++ .../controller/statemachine/StateMachine.cpp | 5 ++ .../controller/statemachine/StateMachine.hpp | 3 + core/loader/LevelLoaderFromFile.cpp | 45 +++++----- core/loader/LevelLoaderFromFile.hpp | 4 + game/mobs/hero/Hero.cpp | 86 +++++++++++++++++++ game/mobs/hero/Hero.hpp | 23 +++++ 17 files changed, 327 insertions(+), 23 deletions(-) create mode 100644 core/event/management/condition/KeyReleasedCondition.cpp create mode 100644 core/event/management/condition/KeyReleasedCondition.hpp create mode 100644 core/event/management/condition/LastStateCondition.cpp create mode 100644 core/event/management/condition/LastStateCondition.hpp create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp create mode 100644 game/mobs/hero/Hero.cpp create mode 100644 game/mobs/hero/Hero.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b1ae6b4..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/KeyReleasedCondition.cpp b/core/event/management/condition/KeyReleasedCondition.cpp new file mode 100644 index 0000000..fd9df64 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.cpp @@ -0,0 +1,15 @@ +#include "KeyReleasedCondition.hpp" +#include +#include +std::unordered_set mad::core::KeyReleasedCondition::triggers() { + return {mad::core::Event::Type::KeyReleased}; +} +bool mad::core::KeyReleasedCondition::is_triggered_by(const mad::core::Event &event) { + const auto &keystroke = const_cast_to(event); + return keystroke.key_id == m_key_id; +} + +mad::core::KeyReleasedCondition::KeyReleasedCondition(const int m_key_id) : m_key_id(m_key_id){ +} +void mad::core::KeyReleasedCondition::on_start() { +} diff --git a/core/event/management/condition/KeyReleasedCondition.hpp b/core/event/management/condition/KeyReleasedCondition.hpp new file mode 100644 index 0000000..ec846c9 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_KEYRELEASEDCONDITION_HPP +#define MAD_KEYRELEASEDCONDITION_HPP + +#include "Condition.hpp" +namespace mad::core { + struct KeyReleasedCondition : Condition { + public: + explicit KeyReleasedCondition(int m_key_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + const int m_key_id; + }; +}// namespace mad::core + +#endif//MAD_KEYRELEASEDCONDITION_HPP diff --git a/core/event/management/condition/LastStateCondition.cpp b/core/event/management/condition/LastStateCondition.cpp new file mode 100644 index 0000000..a2fb453 --- /dev/null +++ b/core/event/management/condition/LastStateCondition.cpp @@ -0,0 +1,13 @@ +#include "LastStateCondition.hpp" + +bool mad::core::LastStateCondition::is_triggered_by(const mad::core::Event &event) { + return m_to_state_id == m_machine->get_previous_state_id(); +} +std::unordered_set mad::core::LastStateCondition::triggers() { + return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::Collision, mad::core::Event::Type::KeyHeld, mad::core::Event::Type::KeyReleased, mad::core::Event::Type::LevelPause, mad::core::Event::Type::Menu, mad::core::Event::Type::Movement, mad::core::Event::Type::Runner, mad::core::Event::Type::Visual, mad::core::Event::Type::WindowClose}; +} +void mad::core::LastStateCondition::on_start() { +} +mad::core::LastStateCondition::LastStateCondition(std::shared_ptr m_machine, mad::core::StateMachine::StateId m_to_state_id) : m_machine(m_machine), m_to_state_id(m_to_state_id){ + +} diff --git a/core/event/management/condition/LastStateCondition.hpp b/core/event/management/condition/LastStateCondition.hpp new file mode 100644 index 0000000..89ec58e --- /dev/null +++ b/core/event/management/condition/LastStateCondition.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_LASTSTATECONDITION_HPP +#define MAD_LASTSTATECONDITION_HPP + +#include "Condition.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +namespace mad::core { + struct LastStateCondition : Condition { + public: + LastStateCondition(std::shared_ptr m_machine, StateMachine::StateId m_to_state_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + std::shared_ptr m_machine; + StateMachine::StateId m_to_state_id; + }; +}// namespace mad::core + +#endif//MAD_LASTSTATECONDITION_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index b986148..ab5f66c 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -13,6 +13,7 @@ void mad::core::Transition::handle(const mad::core::Event &event) { if (!is_active || m_state_machine->has_made_transition) return; if (m_condition->is_triggered_by(event)) { m_state_machine->has_made_transition = true; + m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); for (auto &i : m_state_machine->m_transitions[current_state]) { @@ -41,6 +42,7 @@ mad::core::StateMachine::StateId mad::core::StateMachine::add_state(const std::s } void mad::core::StateMachine::set_initial_state(mad::core::StateMachine::StateId state_id) { m_current_state_id = state_id; + m_previous_state_id = state_id; for (auto &i : m_transitions[state_id]) { i->is_active = true; } @@ -52,3 +54,6 @@ void mad::core::StateMachine::add_transition(mad::core::StateMachine::StateId st } mad::core::StateMachine::StateMachine(std::shared_ptr m_dispatcher) : m_dispatcher(std::move(m_dispatcher)){ } +mad::core::StateMachine::StateId mad::core::StateMachine::get_previous_state_id() { + return m_previous_state_id; +} diff --git a/core/event/management/controller/statemachine/StateMachine.hpp b/core/event/management/controller/statemachine/StateMachine.hpp index 733e029..05e4791 100644 --- a/core/event/management/controller/statemachine/StateMachine.hpp +++ b/core/event/management/controller/statemachine/StateMachine.hpp @@ -21,9 +21,12 @@ namespace mad::core { void add_transition(StateId state_id_from, StateId state_id_to, std::shared_ptr transition_condition); void set_initial_state(StateId state_id); void control() override; + StateId get_previous_state_id(); + private: StateId m_current_state_id = -1; + StateId m_previous_state_id = -1; std::vector> m_states; std::vector>> m_transitions; std::shared_ptr m_dispatcher; diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 4b19898..9276a96 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,9 +1,10 @@ #include "LevelLoaderFromFile.hpp" -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" +#include <../../game/mobs/hero/Hero.hpp> +#include +#include +#include +#include +#include #include @@ -18,7 +19,7 @@ namespace mad::core { std::unique_ptr LevelLoaderFromFile::load(std::shared_ptr global_dispatcher, std::shared_ptr system_listener) { - auto level_dispatcher = std::make_shared(); + level_dispatcher = std::make_shared(); auto world = std::make_shared(*level_dispatcher); @@ -26,17 +27,22 @@ namespace mad::core { m_config_json["camera"]["position"]["y"]}; auto camera = std::make_shared(camera_position, world); + controllers = {std::make_shared( + camera)}; + + Entity::Id hero_id = create_world(world); camera->turn_on(*level_dispatcher, hero_id); level_dispatcher->registry(camera); - level_dispatcher->registry(std::make_shared(world, hero_id)); + //level_dispatcher->registry(std::make_shared(world, hero_id)); + /* std::vector> controllers { std::make_shared(camera) };*/ - ///State Machine + /*///State Machine struct C1 : mad::core::Controller { void control() override { //SPDLOG_DEBUG("controller 1"); @@ -56,7 +62,7 @@ namespace mad::core { machine->set_initial_state(0); std::vector> controllers{machine, std::make_shared( - camera)}; + camera)};*/ auto level_runner = std::make_unique( system_listener, @@ -65,8 +71,7 @@ namespace mad::core { global_dispatcher, level_dispatcher, world, - controllers - ); + controllers); level_dispatcher->registry(std::make_shared(*level_runner)); level_dispatcher->registry(std::make_shared(*level_runner)); @@ -82,7 +87,7 @@ namespace mad::core { Entity::Id hero_id = 0; std::string map_line; while (std::getline(m_level_map, map_line)) { - for (char object: map_line) { + for (char object : map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, @@ -99,9 +104,8 @@ namespace mad::core { break; } case Objects::Hero: { - hero_id = create_hero(world, - {current_position_x, - current_position_y}); + Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + hero_id = hero.get_hero_id(); break; } case Objects::Enemy1: { @@ -137,16 +141,14 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile) - }})); + StaticImage::TransformType::Tile)}})); Entity::Id square_id = world->create_physical_entity( 0, position, 0, image_storage, - is_stable - ); + is_stable); } Entity::Id LevelLoaderFromFile::create_hero(std::shared_ptr world, Vec2d position) { @@ -185,10 +187,9 @@ namespace mad::core { position, 0, image_storage, - false, false - ); + false, false); return hero_id; } -} \ No newline at end of file +}// namespace mad::core \ No newline at end of file diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index e12e665..46d2f52 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -115,6 +115,10 @@ namespace mad::core { std::ifstream m_level_map; + std::vector> controllers; + + std::shared_ptr level_dispatcher; + std::unordered_map m_objects = { {'.', Objects::Empty}, {'#', Objects::StableBlock}, diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp new file mode 100644 index 0000000..8407ce7 --- /dev/null +++ b/game/mobs/hero/Hero.cpp @@ -0,0 +1,86 @@ +#include "Hero.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/KeyReleasedCondition.hpp" +#include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["hero"]["source"]; + + std::shared_ptr image_storage; + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) + }, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }} + ) + ); + + hero_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + false, false + ); + + + ///State Machine + struct C1 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 1"); + }; + }; + struct C2 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 2"); + }; + }; + auto machine = std::make_shared( + std::shared_ptr(level_dispatcher)); + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(2, 0, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(2, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); + machine->set_initial_state(0); + controllers.push_back(machine); +} +mad::core::Entity::Id mad::core::Hero::get_hero_id() const { + return hero_id; +} diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp new file mode 100644 index 0000000..d8795df --- /dev/null +++ b/game/mobs/hero/Hero.hpp @@ -0,0 +1,23 @@ +#ifndef MAD_HERO_HPP +#define MAD_HERO_HPP + +#include "loader/LevelLoaderFromFile.hpp" +#include "world/LocalWorld.hpp" +#include +#include "world/entity/PhysicalEntity.hpp" +#include +namespace mad::core { + class Hero { + public: + Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers); + Entity::Id get_hero_id() const; + + private: + std::shared_ptr m_world; + Entity::Id hero_id; + std::shared_ptr level_dispatcher; + int last_pressed_key; + }; +}// namespace mad::core + +#endif//MAD_HERO_HPP From 5859a7189e60261d67692adee96986b8dd7f31b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 005/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- core/world/LocalWorld.cpp | 3 +++ core/world/LocalWorld.hpp | 2 ++ game/mobs/hero/Hero.cpp | 2 +- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index b65987c..d104bdc 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -93,3 +93,6 @@ mad::core::Entity::Id mad::core::LocalWorld::create_physical_entity(int z_ind, m mad::core::Entity &mad::core::LocalWorld::get_entity(mad::core::Entity::Id id) noexcept { return m_storage.get_entity(id); } +mad::core::EntityStorage &mad::core::LocalWorld::get_storage() { + return m_storage; +} diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 14c38a8..4f4d4c6 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -34,6 +34,8 @@ namespace mad::core { Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, bool is_fixed = false, bool is_rotated = true) override; + EntityStorage& get_storage(); + private: std::shared_ptr>> m_step_events_queue; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From c97f35cc674153c3916e767f13ce6907cbccb455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 006/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Fall.cpp | 6 ++ core/event/management/controller/Fall.hpp | 17 +++ core/event/management/controller/FlyUp.cpp | 6 ++ core/event/management/controller/FlyUp.hpp | 18 ++++ .../management/controller/GroundMovement.cpp | 7 ++ .../management/controller/GroundMovement.hpp | 17 +++ core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ---- .../controller/{Jump.cpp => JumpImpulse.cpp} | 8 +- .../controller/{Jump.hpp => JumpImpulse.hpp} | 10 +- core/event/management/controller/Movement.cpp | 27 +++++ .../controller/{Run.hpp => Movement.hpp} | 18 ++-- core/event/management/controller/Run.cpp | 25 ----- .../event/management/controller/StartJump.cpp | 6 ++ .../event/management/controller/StartJump.hpp | 17 +++ core/visual/image/storage/ImageStorage.hpp | 5 +- core/world/LocalWorld.cpp | 3 + core/world/LocalWorld.hpp | 2 +- core/world/entity/PhysicalEntity.cpp | 10 +- core/world/entity/PhysicalEntity.hpp | 1 + game/mobs/hero/Hero.cpp | 98 ++++++++++++++++-- game/mobs/hero/Hero.hpp | 1 + .../hero/hero_fall/adventurer-fall-00.png | Bin 0 -> 1004 bytes .../hero/hero_fall/adventurer-fall-01.png | Bin 0 -> 999 bytes .../hero/hero_fly_up/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_idle/adventurer-idle-00.png | Bin 0 -> 1134 bytes .../hero/hero_idle/adventurer-idle-01.png | Bin 0 -> 1127 bytes .../hero/hero_idle/adventurer-idle-02.png | Bin 0 -> 1206 bytes .../hero/hero_idle/adventurer-idle-03.png | Bin 0 -> 1110 bytes .../hero/hero_jump/adventurer-jump-00.png | Bin 0 -> 1095 bytes .../hero/hero_jump/adventurer-jump-01.png | Bin 0 -> 1049 bytes .../hero/hero_jump/adventurer-jump-02.png | Bin 0 -> 1094 bytes .../hero/hero_jump/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_run/adventurer-run-00.png | Bin 0 -> 1073 bytes .../hero/hero_run/adventurer-run-01.png | Bin 0 -> 1043 bytes .../hero/hero_run/adventurer-run-02.png | Bin 0 -> 963 bytes .../hero/hero_run/adventurer-run-03.png | Bin 0 -> 1140 bytes .../hero/hero_run/adventurer-run-04.png | Bin 0 -> 1075 bytes .../hero/hero_run/adventurer-run-05.png | Bin 0 -> 859 bytes game/resources/levels/level_01/config.json | 53 ++++++++-- game/resources/levels/level_01/map | 2 +- 42 files changed, 292 insertions(+), 98 deletions(-) create mode 100644 core/event/management/controller/Fall.cpp create mode 100644 core/event/management/controller/Fall.hpp create mode 100644 core/event/management/controller/FlyUp.cpp create mode 100644 core/event/management/controller/FlyUp.hpp create mode 100644 core/event/management/controller/GroundMovement.cpp create mode 100644 core/event/management/controller/GroundMovement.hpp delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp rename core/event/management/controller/{Jump.cpp => JumpImpulse.cpp} (65%) rename core/event/management/controller/{Jump.hpp => JumpImpulse.hpp} (57%) create mode 100644 core/event/management/controller/Movement.cpp rename core/event/management/controller/{Run.hpp => Movement.hpp} (50%) delete mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/StartJump.cpp create mode 100644 core/event/management/controller/StartJump.hpp create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-00.png create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-01.png create mode 100644 game/resources/animated/hero/hero_fly_up/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-00.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-01.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-02.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-03.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-00.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-01.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-02.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-00.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-01.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-02.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-04.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-05.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Fall.cpp b/core/event/management/controller/Fall.cpp new file mode 100644 index 0000000..ed817e6 --- /dev/null +++ b/core/event/management/controller/Fall.cpp @@ -0,0 +1,6 @@ +#include "Fall.hpp" + +mad::core::Fall::Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fall; + Idle_animation = ImageStorage::TypeAction::Fall; +} diff --git a/core/event/management/controller/Fall.hpp b/core/event/management/controller/Fall.hpp new file mode 100644 index 0000000..4e8274d --- /dev/null +++ b/core/event/management/controller/Fall.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_FALL_HPP +#define MAD_FALL_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Fall : public Movement { + public: + Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FALL_HPP diff --git a/core/event/management/controller/FlyUp.cpp b/core/event/management/controller/FlyUp.cpp new file mode 100644 index 0000000..969d7e2 --- /dev/null +++ b/core/event/management/controller/FlyUp.cpp @@ -0,0 +1,6 @@ +#include "FlyUp.hpp" + +mad::core::FlyUp::FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fly_up; + Idle_animation = ImageStorage::TypeAction::Fly_up; +} diff --git a/core/event/management/controller/FlyUp.hpp b/core/event/management/controller/FlyUp.hpp new file mode 100644 index 0000000..e87bc4a --- /dev/null +++ b/core/event/management/controller/FlyUp.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_FLYUP_HPP +#define MAD_FLYUP_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class FlyUp : public Movement { + public: + FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FLYUP_HPP diff --git a/core/event/management/controller/GroundMovement.cpp b/core/event/management/controller/GroundMovement.cpp new file mode 100644 index 0000000..b8e127e --- /dev/null +++ b/core/event/management/controller/GroundMovement.cpp @@ -0,0 +1,7 @@ + +#include "GroundMovement.hpp" + +mad::core::GroundMovement::GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Run; + Idle_animation = ImageStorage::TypeAction::Idle; +} diff --git a/core/event/management/controller/GroundMovement.hpp b/core/event/management/controller/GroundMovement.hpp new file mode 100644 index 0000000..339fe34 --- /dev/null +++ b/core/event/management/controller/GroundMovement.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_GROUNDMOVEMENT_HPP +#define MAD_GROUNDMOVEMENT_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class GroundMovement : public Movement { + public: + GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_GROUNDMOVEMENT_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/JumpImpulse.cpp similarity index 65% rename from core/event/management/controller/Jump.cpp rename to core/event/management/controller/JumpImpulse.cpp index 9e5dd5a..6ffc28d 100644 --- a/core/event/management/controller/Jump.cpp +++ b/core/event/management/controller/JumpImpulse.cpp @@ -1,8 +1,8 @@ -#include "Jump.hpp" +#include "JumpImpulse.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +mad::core::JumpImpulse::JumpImpulse(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { } -void mad::core::Jump::control() { +void mad::core::JumpImpulse::control() { auto impulse = [](mad::core::Vec2d dir) { return mad::core::LambdaIntent( @@ -11,5 +11,5 @@ void mad::core::Jump::control() { }); }; - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -2000000.0f})); } diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/JumpImpulse.hpp similarity index 57% rename from core/event/management/controller/Jump.hpp rename to core/event/management/controller/JumpImpulse.hpp index 25d5cf1..5e69a29 100644 --- a/core/event/management/controller/Jump.hpp +++ b/core/event/management/controller/JumpImpulse.hpp @@ -1,15 +1,15 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP +#ifndef MAD_JUMPIMPULSE_HPP +#define MAD_JUMPIMPULSE_HPP #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Jump : public Controller { + class JumpImpulse : public Controller { public: - explicit Jump(std::shared_ptr world, Entity::Id entity_id); + explicit JumpImpulse(std::shared_ptr world, Entity::Id entity_id); void control() override; @@ -22,4 +22,4 @@ namespace mad::core { } -#endif//MAD_JUMP_HPP +#endif//MAD_JUMPIMPULSE_HPP diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp new file mode 100644 index 0000000..a580c78 --- /dev/null +++ b/core/event/management/controller/Movement.cpp @@ -0,0 +1,27 @@ +#include "Movement.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Movement::Movement(std::shared_ptr world, Entity::Id entity_id, mad::core::Movement::Direction dir, float velocity) : m_world(world), m_entity_id(entity_id), dir(dir), velocity(velocity){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); +} +void mad::core::Movement::control() { + auto set_horizontal_velocity = [](float vel) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).set_linear_horizontal_velocity(vel, event_dispatcher); + }); + }; + if(dir == Direction::Right || dir == Direction::Left){ + m_entity->set_action(Move_animation); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(velocity)); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(-velocity)); + } + } + else if(dir == Direction::Idle){ + m_entity->set_action(Idle_animation); + } + + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Movement.hpp similarity index 50% rename from core/event/management/controller/Run.hpp rename to core/event/management/controller/Movement.hpp index 07ed05c..2bac02d 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Movement.hpp @@ -1,18 +1,21 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP +#ifndef MAD_MOVEMENT_HPP +#define MAD_MOVEMENT_HPP + + #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Run : public Controller { + class Movement : public Controller { public: enum class Direction { Right, Left, + Idle, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Movement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); void control() override; @@ -21,9 +24,12 @@ namespace mad::core { Entity::Id m_entity_id; Direction dir; PhysicalEntity* m_entity; - + float velocity; + protected: + ImageStorage::TypeAction Move_animation; + ImageStorage::TypeAction Idle_animation; }; } -#endif//MAD_RUN_HPP +#endif//MAD_MOVEMENT_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/StartJump.cpp b/core/event/management/controller/StartJump.cpp new file mode 100644 index 0000000..c124a52 --- /dev/null +++ b/core/event/management/controller/StartJump.cpp @@ -0,0 +1,6 @@ +#include "StartJump.hpp" + +mad::core::StartJump::StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Jump; + Idle_animation = ImageStorage::TypeAction::Jump; +} diff --git a/core/event/management/controller/StartJump.hpp b/core/event/management/controller/StartJump.hpp new file mode 100644 index 0000000..ea4df13 --- /dev/null +++ b/core/event/management/controller/StartJump.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_STARTJUMP_HPP +#define MAD_STARTJUMP_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class StartJump : public Movement { + public: + StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_STARTJUMP_HPP diff --git a/core/visual/image/storage/ImageStorage.hpp b/core/visual/image/storage/ImageStorage.hpp index 5699096..d866bd0 100644 --- a/core/visual/image/storage/ImageStorage.hpp +++ b/core/visual/image/storage/ImageStorage.hpp @@ -13,7 +13,10 @@ namespace mad::core { enum class TypeAction { Idle, Run, - Attack + Attack, + Jump, + Fly_up, + Fall, }; explicit ImageStorage(std::unordered_map> actions); diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index d104bdc..efa14c6 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -54,6 +54,9 @@ void mad::core::LocalWorld::produce(mad::core::EventDispatcher &dispatcher) { for (Entity::Id entity_id : m_storage.extract(TrueFilter())) { if (auto physical_entity = cast_to_or_null(m_storage.get_entity(entity_id)); physical_entity != nullptr) { physical_entity->synchronize_position_with_viewable(); + if(abs(physical_entity->get_linear_velocity().get_y()) > 0.01){ + //SPDLOG_DEBUG("vel {}", physical_entity->get_linear_velocity().get_y()); + } } } diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 4f4d4c6..4cb88c3 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -22,7 +22,7 @@ namespace mad::core { class LocalWorld : public World { public: - explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 30.0f}); + explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 60.0f}); bool manipulate(const Filter &filter, const Intent &intent) override; diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 9b58177..6f94482 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,8 +37,10 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 0.3f; - fixtureDef.restitution = 0.2f; + fixtureDef.friction = 0.0f; + fixtureDef.restitution = 0.0f; + body->SetLinearDamping(0.0000000001); + body->SetAngularDamping(0); body->CreateFixture(&fixtureDef); body->SetTransform(body->GetPosition(), initial_rotation); @@ -69,6 +71,10 @@ void mad::core::PhysicalEntity::apply_force_to_center(mad::core::Vec2d force, ma void mad::core::PhysicalEntity::set_linear_velocity(mad::core::Vec2d velocity, mad::core::EventDispatcher &dispatcher) { body->SetLinearVelocity(velocity); } +void mad::core::PhysicalEntity::set_linear_horizontal_velocity(float velocity, mad::core::EventDispatcher &dispatcher) { + body->SetLinearVelocity({velocity, body->GetLinearVelocity().y}); +} + void mad::core::PhysicalEntity::apply_angular_impulse(float impulse, mad::core::EventDispatcher &dispatcher, bool awake) { body->ApplyAngularImpulse(impulse, awake); } diff --git a/core/world/entity/PhysicalEntity.hpp b/core/world/entity/PhysicalEntity.hpp index fff81c2..6c3e0fd 100644 --- a/core/world/entity/PhysicalEntity.hpp +++ b/core/world/entity/PhysicalEntity.hpp @@ -45,6 +45,7 @@ namespace mad::core { void apply_angular_impulse(float impulse, EventDispatcher &dispatcher, bool awake = true); void apply_torque(float torque, EventDispatcher &dispatcher, bool awake = true); void set_linear_velocity(Vec2d velocity, EventDispatcher &dispatcher); + void set_linear_horizontal_velocity(float velocity, EventDispatcher &dispatcher); void set_angular_velocity(float velocity, EventDispatcher &dispatcher); void set_linear_damping(float linear_damping, EventDispatcher &dispatcher); void set_angular_damping(float angular_damping, EventDispatcher &dispatcher); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core diff --git a/game/resources/animated/hero/hero_fall/adventurer-fall-00.png b/game/resources/animated/hero/hero_fall/adventurer-fall-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4b30fb90d8d77f591fa2c00b728f6fdcaa5c5b GIT binary patch literal 1004 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 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-00.png b/game/resources/animated/hero/hero_idle/adventurer-idle-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd528e863cf02b31c7cd6cc923034015a745f60 GIT binary patch literal 1134 zcmV-!1d;oRP)XYxd z%)~`q3?`ZwGQ&ccn#forX7!Td>ckZaLiyKW|4~Z0K3wjV%Cb%FX*7mUa?{h_J?H#> z-*e9IoO5BDZMNBFn|}eR7@dB2<}{55_p2LisYFsLmv;d0=u2-2_gN~uMotB8iwUFd#mtzN=4xA) zAxbo+g>+vGbF8_FbMFNJ_`}`Dp+!`H!Qd#nZ=9zuAmR2Mp)Vj&_4x7sX0ihuZma}A z$(*4MShLx9a6Utg)5*Zu9{kVxwD+HkajLRTeXR(|E^Pb#ampt>J@mb*^nS`@JPv@r zvJTJ$6dThc6Yl6_IuWN@cB;yJgmB;qrsra`{xV_+dU9X0QUB|k*GWC~jN$u@w_i0I z0w8Ecs%59TAwYu~rxVbE*QvGJ`B^IpJx@#}d$^;Mh4kjLVR2!C$#|T)4=w|mApNPm z@Ey~0F#s~zWi##z*z$~oJ36_YP4R$3E|`tbjbV=d8ezxl?-Eq{nQ|luS+!(uKm8m* zrJuzG?FMkL@u&a^8e0|;OW(%h*rh7-5ddS90hacZLeD#!+Du(|lL~to;NkgK-e)E{ z#_-Km9@%Gpg>Sis<<%9G`3RHoI4wOt&;kUNexl)!#L(yJQYN<^G*r1gTBAvA_iF3t z0${h-CoE64oFhvs={wrJ2O9pWlgSaX`l!~0+!^(5FYgyK$$rlOLRKFS*ZTpec6$g} zeWZ`QfI~V=Q0X_}dNZbWE&ZGTjKF52zfoZ?GnUo#T+Dc?+#YfR-9#oX6|@n7kaI*2 z=t|Fds=Rw~W^w>DFh<4t4h7m$1IP_@OIPeQs@_HfTNbjAOiHXTuh>sPW7nFE-ogod zF{iJ*m4bGs+!B*n73>)8MIik0cH;PBL{h7&EXyPkg@>hXt1B;+dIyGt`W61oK9es+ zmhBr&`e3P`iJ8geM7uTrJ@R*ItoNSe`>FF!5iVq}O{LwI*Apm$kezE;wPO9&yT4pw z%XzUgBwWZ+JkEGBMfxruP2h($07*qoM6N<$f|lkf AqW}N^ literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-01.png b/game/resources/animated/hero/hero_idle/adventurer-idle-01.png new file mode 100644 index 0000000000000000000000000000000000000000..230c1cb30f47fc1ae3db9e1f34429b345a4926dd GIT binary patch literal 1127 zcmV-t1ep7YP)ESc;_C9 zN~YPOF@}(l7a8lA02vurp5=gLRm^pN?Vjl0Cv3cj&Psl!Yu-+WQxzf z_?nL9Z2+i?D%)EE8o+#ft|W(Nn#kTxpH?ATq)a-;z~v|a*Qal20iTyEp=)$BZ$oh^ zj1GrUoC<(O2{NI~tbv+3nM^vTRmc|hcKQGa_`JqlT~rO-!m((WCbE*wNjjP4hwOaW z`!M0?l(8O;PH`o4%@~&oris{O3vR_G0kkyPH9*^ysvsPlLUAe_{4B^|R}USJx*6>1 zF-VDqkX$|AyPMXgYHesF!cF&i=8iqZWOe?G-hAU=k#79NRT}y}7XFS1samZ~)c}Ok zhw!hVQqWL)cSsAncVOXtrc#(FG~FvdPv=EukP7`~6b zdql(|h>M6$0-)AiL(H{;|HBIac&e(5%Xj)aeT#N`OaBZ)i0A|gQQ3WzQ1~LFc9j8_ zg8`R=-(G%=Q1~J<@mT=UnH3T40f8-wPGwg@4HS`Zx_mfYzM_5m4ZrG0z? zfTgh1yHZtwlV`YzKENoH5Ld90WHhmRW%xKx)vpNQ-!ibUMA zljWT+0T2pbH0!zurioNqZGWgf5!r)ddKIV3N9}qvAYaY0-+X{wYAsY3QoT$Q3C~Xy z%`0DjPikit>SY!eqRhl+i!Ok%Q+xiMEedR;%G}hiWYbvy8i?Uo*eC!?>+-@q&4JxQ z{0kwXlepA(lDoY3QU#oe>lt&aNcVZSL@c8b={src5dqUgVu=K)A3{dj%uQYAQd~n( z6jZhNM@mr?&cs#xTgs`-S1Vy(cj3AENarrBR;vc+M06jTq9_1lvso#4`Fo*$h4orG ztX8WKoxcm=L_D^?4suPIn6G&ugcI@KvBthyE2^rp)w+?oTdhc{s`7*_iMKq<+s}#X zv!Db-?6*=HK%2bGefBa&hJuU?1#wCl+T>*boMkzoEj*Nfh@+|sfPmLSt!=}+(~=YI zstCe~=vd8Wr5eYbMY0M@nKYS9mBe33h%6-%BvQ+~`pE@DcIw+vGPyNlzLFCgA>l-p t5(y@gDVG1_?{6}h!e+4ue^34w_#H}Ld7*XQd&mF)002ovPDHLkV1mdw8z%q& literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-02.png b/game/resources/animated/hero/hero_idle/adventurer-idle-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2668b590bc2ab2ffead9465e8f2538ae88cd34c8 GIT binary patch literal 1206 zcmV;n1WEgeP)t%mk;?vU!GyH0*Y1*|JHBF2?Ep!3V(Y$=@}%tAyU6o77fqMR6#M z-0+|{6abAhR6>SP1BIJqqKk1YTQMmjn21F-;Z!UVKy{^61GE<+*?4>tC=P|AUk}h%cZAyKo%Gcm z(MgGhkXpUiR?m*g0`2;+mwV2OOt-wmc){8poqX?Tl5X%+KNTIH3-1vjr`C?j0suUV z$0)rodwgb<{pHmJPxZsgrnUL6e#Ko-`lmLGLdebp`wr1|(M?6~cbd0$4^zPaW&PLm z`Tgb9`uM`=4I-~J>b_5W^sa~y#AIad6Dy6}(mHGR08r#Cq}XoP=P!)j(8n%W=I6Dc z&|}zevwNEk(^*lLB%2Bb@aHd4`spPAitTp&=Q{HvQ^5cL(dA`YPJV1O1V8{0fJW~v zEkS1FmjRsqK60B*Fyy(+h*hOK-$r-7jk|BX!;t4PbF)6Cf&sF#vb3jPe3gOG6~i$Y zDlKo*VZyN`a?KWCEfWp1^Nd&_+v85c zXJP~97h`zkVzzC07JwDMzD!%br$||w)WjRI;j9?SNTD@Pdsvoxyj6l!5&)Uiudz_` zCZ(Vu`5W8|30E;DG199bLsI)vYWB5ZMO4kK6J@Fg6 z2tb+4+^jEUjT0F2ou|}wfU6zt0Q%Digj|RT5?4Fgd936K?29n~D)3{Q4d{CF_vNuG zr=@dpPePnhp8p1hi16rP=;E2yC;N{X_gD0Bri0&($Q*oKHS4-OJt(QjqR_f0!@ z;+YSVkXX0tilT5Q4MYrEY#tnhb%EB@*FAEL*=#oIHU+|u-@=SXzc>9Ioqr19M9Onb z?6rhZRh2yRgG}X_kyKS>uO&=LW{eLG?h@)(IFX{9EX`)Ovr}H+Noxkf*9REBK7d1t zvQu6Fz>yIba^$W@T5fg#cS$itmIvk?rg*ws0cj+%5{pTNwoOU0Y*U6b9*(5NUs{OF zheCuR3p9UuNtb=`{Rq+cs{Vf|E;d8LiOh#WjE5sEM3??jXFMFiVloNulm7+&0QQ2K U4h?yP-v9sr07*qoM6N<$f=IDF&Hw-a literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-03.png b/game/resources/animated/hero/hero_idle/adventurer-idle-03.png new file mode 100644 index 0000000000000000000000000000000000000000..53207e8a2f1ed323478a1e16c27559eff02c46ba GIT binary patch literal 1110 zcmV-c1gZOpP)BW*kqGUHreDqK&gh)Q%4Wc(RPn0?Mv$^rB>Slz@cWE!eOWhbOWU%kSjcK7uN1{}-fQQ} z6T1jSqQ-bA66IX*qS3Av6$`PcW;~ir0qE+m3qU-Owi1d&(OeowKAK>xZ;;;mJ&g4Y z8lq$)Wv`w-@i4nP++ut(%pac9EWGh3)9%6=z4G#r4Yu*)=V={!S9*;|Ikk3oxB&=d zj?#3a@2~HBJe*8Q_!|Lt(@lL;ijrIB3K^_WDaQrcilC!UKo7@>ZH=>#PVZUL)N55RCwrCh{{yq}c>prmRT<%d3NsQOI7}+H z$`*^w5HTB{XL%_?-@q|~p;2b+I$_ldK;OV1!O$qnONEQG=fTIBxV%PpOXa0nc4~+F z`|)cY>a4Y5xOIoI%F9a;dVakIJ5&IYnVcb{H50?3TKJI$UU>6UV-7Nel;vT#zaPgP zb|QLQ)LCnJGb<^I~ZP+YC=agV*wD@zwQ*yafRP28j0k9CgVzi4Qia1mY$xIGFq?VLYF%?tp z<}_B(>vU3_(AlAr)ccxgQZ0sIv33C1){Q4N20*=gm-yOd?DNICJr`Q&~=?U%lctbXF<_*oqe_xzM34bKG`ERu5=;w zR+9kOqponb-NfYh1e46vuxfYUac ziD~?J=z~qAO)-9yX!;Qo1F=N|uA&lbf!(FJEO1%(3%bzpVPRc_KIk1@%>I&_+?=^N zbN+MAoS6$*vSi7UB}DrKD$J1^)>(^GZCt4JQ83kG^uPM?^ETds90k@u_&!t4u=}u zY5U0dZRv5B(lhW20D8X8V80jN*a-1>Oy0}izeQO_<`Rpds92N1@r112ZWk{dc@%(9 zUnu|{cPWvX2ztH_u;N_>$}(cpawybo0-$DxT>^66-ip`fPk-a}`O}%nw5vdwkke;} zc%o(#@4rzCz@LR*;eY#MSs%0F_4(2Bb&j6xqqnJ@+PXq|o7&T&RFI>}(NIepTb{N6 zoa`QZ9%JNNe69z`8NEr^F7W>mqPa@Y>J~WiAEebS_*LYItJivz%&(+t47Ic|5i!`T zyQFt&l%d)u(_@uAR|psePi?J984je@?!v8dI`$Qa{Q9FRLQp3Jkln-m#10-#+XsK^ z<8gwNOxp+;2EgBffDejXVlKJBd#B$q9fN5hLoIDg$0HQjb@}d67n+$)og+;x?L<3I z0jv|Xgv6WD681X?ycq;s3{>sEp5!s$H=ofWcP4Cb)7c=81PhhgOP%%p2Eh246O5lZ zK{$~FV7B8pvmM8Ql;9;yAB?8*Ik#{J@6;#(!=S|FS~c#}EC7TPNd~Q3fRr$&W}&XC zK^V8k8Q`+4_Uwa{nEzZMri6s=#8=stS9#KZ3wwrr=Qa-$p&$fqvf;p60-)Gg!Iz&L zW8liyY%VM^6N>38O1dNhhQaKTh-;l6vZ=HjS0ag1vyfZ!3;>g%AP;L6X2Zj>%-u{Z zJ|WJX?^4n^P2aULJ5lh*fz+x4ll~E0q{@o^PXVX`!hi)B^##;vcQ@9fTP&F-LB@VsOQ2bl-F`DEv94J)>-t-*T*#Y;8>n;$_S>RVE(9sH-c1Y0 zvmhdo2>WeO)zhjMV$(EfOD3dq>42 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-01.png b/game/resources/animated/hero/hero_jump/adventurer-jump-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b20e0343c77fa6ecb46aa2cfeccfa0f8699f6427 GIT binary patch literal 1049 zcmV+!1m^pRP)izazx1zV>AS_=w^KI)u_p$@kw8d z8Z_}?I+1`ebIQV8e1SL@rB)%5O*>i`mI9@=rF306K6KO;>(f0?+D~$mbI&>Vch2|z z&iVa*P@+VM5+zEMC{d!s{{^AS(D4qpG+PZKmCP{mZ6MeG!RZqm+`C8S&rQVQqFmbn zK+E&5DOrD;5-WhS+Da;!k!Gub;~nl?e6Y$cYPpWjx2G9fSCZsURGO5T6H6@Wh-qXgeND}8}r zZjLVyWZXNQYpXYN zp_$%3me*qJEYsvrV*>yS;Sej!*${k`5H-sd<{}XQ9)00(_QS6;I8L>Qmp_^2op;~X zyA6FpW_tTrO(nS7TrP(i8wvy%jb_o_^OTGao&hKjv&r?AcADC{Mbpu4j@+v+fa(?k zNZ-;8YTvsEfY&#M|Cb+xf9gjXlXJ5A>1@J_51wIS!_5T@q;+k*r7rgY~MT|%O%1c6w%=$Of{ zjk4|8SQ1U9nKIV{Sz$J-iMIXiB64#cFJtnKS9FQdC*;;z!MoQt2EbzQcT8L6-nY-g zLO29-zp?$1Hw8eoZ4Y05dJ^xYi&QzBdbXmwM9CF{n<6d`4p8Z;W7mdc?N%C_)r7J6 zF#s0BAsVbER-@Nst@{{>wFPnRvk@gBSa+?p8Hqwad9!~USPc3}Br?>P1<_<0CO-#Y zKM(~>z>UBKYTd__)mplY40UzMts!;OZnWAchr_bi7(EWbtLML0mJC5>W?zoS^EV^% z9)`mbP1FAIjizb*n?OD2I$9^MT!A89J<{nY#^dcA(u$rM zrAKKi%7s|0R$0Zm?6$;dyd7e%%_IPJ8`HQfh*&H}w~yB&|KhI)(S z=kKnv+myyB)?|-E5K3i~dq=sDXe5F!I7fUvB>>^H-BmC?8&BXg8`R(S{|bKrE6Hcb TLPIqs00000NkvXXu0mjfd%y9w literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-02.png b/game/resources/animated/hero/hero_jump/adventurer-jump-02.png new file mode 100644 index 0000000000000000000000000000000000000000..ba27779940e0644fb74d1bfdf8d863c973b2036d GIT binary patch literal 1094 zcmV-M1iAZ(P)9&_Hb*pLGr17@BNpIHcLz6VIq9Z$3eaQFaa_%|z ze1G5b`+d(j7b>Wrf(k154lQ`Zg1OY=G(7-If~C8q^Ti*J8+XY(D$?y9!1J5 zf5M|Xf+o2|nxC8J!%t4Iy?s-mzy01W034=W8mA>0$qB*jRfIp|Geg0(M4}S~F|!># zw1@6veDE2*(0nvC1ZWLy6FraJQ#NOnoX}Sz(Ch>t6kJ<)Y6-1m%=+HLBxa&?J^2DQ zkB8w)*|Pa85u)0vMC^)=r$#j+(TT$QNOXd;Bj-!Tc6RqN5*Z@cy4jqajg`%5iIC97 zdH@Fc?quigB_h!Yygo0_elSe9v$teya_Xu87>Nu~R~Il>&vt#V#OzH07w_(EQKL|imLx2|t`pb&Rl8hwYaG`g16x#W7Bag}WvKO9D zXdvo&lVuTlCSCTzS|S8s%dvhlGCd9tKLM-+4{-ChUjcA3*KT@f4|*mooOVaqeA0zn z=-$uFf`;Ga1z>&fL5$Ddp?Tjy0OpPzBD~=i9#2jIknpV$2L}3YnAehw_+4J}=F({1cM#WbSPG}q?KhtdfR_5@EjZPzQ0r8wb*cc2*;@J3*XzYF3@M8#t+a~0QR8r|3Qp6sRo`fuhN`M%->-@xMM&No0CSm) zsBt>Y8izxCb2N_8|=8zN{kOn~on7XZ4h|G!G>w#F9m zyRHkD&BmBZ}hywXp0V{x${B9%;Xm)|A;j+`08tteno6-d7{sy3UM%AF&ss)~SN6v{_-7K$M~ zBdKJP%X9P0XS2dE3`>JAhV+bFo}0&|REz0!hF8ygFMIk5D)_hY2che3yBE_uw*UYD M07*qoM6N<$f+g)C)c^nh literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-03.png b/game/resources/animated/hero/hero_jump/adventurer-jump-03.png new file mode 100644 index 0000000000000000000000000000000000000000..0458013c8dae7ecf137a009f0de9d2dc5fb7c074 GIT binary patch literal 1019 zcmVHJ^vVQpW(c}v>cx7okus_yS(ar3JEV;Dv^i{T*}CJ!)paNe35`SSfONF=l! zfW7aWCmQKi<8np@U@|#OD7;U}X4ATOYG%Z2X%Oj!JjvU?Z<()*PbP=)cmj$ZKEwCO zbgZ90WQm~5tDH#>bK#RtJ|3JQ?FmtyS|@kT(RcSbI!3=B?FrEp8z36#=0K~dYCWb} znYc1@oeQ6J^7;5-(w?Gf;@xf^;Nxl-P9-+XO^*CP`o^R#Zo`aB$NI?@msJx0-@G>s zZyp99=nnv}IC~9%k5(%| zgQ|^Wi_4m7RHD*^+h!)0-)J$@{$l{#TTFA$vBS`han%o-j`eRjr2tVj(s%Sl!ls8? z9zDk729a5B#A>w?A0Dk%hKi~;dwL}+9OfpLR|{pKnwQei-9=`-#B9N-StrZ#=2b~? zx$NZg`Tuuny)<;We7U8Nc4q@OAE2qmBNLi?=++(Sd^S3k&`4O#U%FF5pJ=u>7Tc)aNMsJ!I0LfnUS0%aqGb{ z%WG@GE7tgSbb{u_5^jrG>~K0r7fWJ~-MHU~n*FoC{mNd&ZfX=OYb7rJG^NG|Uw;8M p_r>7Qc&+H`sH2WL>Zs%K#Gfd5Tp^4i<(B{e002ovPDHLkV1llc@^t_J literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-00.png b/game/resources/animated/hero/hero_run/adventurer-run-00.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d7cc057f4e6efed4564cae0c022f961089639c GIT binary patch literal 1073 zcmV-11kU@3P)-L~*N`~w~w_wx-vWOaAj0Tr1#<;j-qKOzD_ka(^N1x1$ z&X}lV2_{Q)VF4#B!HhU@z*x40Ez6)V7<6!9m(sy)IX>LAw!&0yZ+Wrbm)@Rp`uqOA z=llEh^b~T)A%`4t$iX_qMiZX+;2^tqRmjw_h`u0vsvm&8jUQWz>&!g0^&zql;pC6) zJX`%F0Q#&><(?`Da5p?{d1Lcz%I`np*6j&d72L-8!K(nMMJiVYh6s(`VsSAd|K;Nk z#fA!bZGVu^@-%(Xt5gNIq0j2cxzuMX*lg|-ExsH?$kr~SC)Ak_N2Quh8qsEH@Zyge1)v9?%~&S7b$(z zgDb2ub|=g$m4ZV-fv>2HLqWkcQ7F2)&s*Zk%Gd93!(jks7Ilifssy-RI{?7G-8=dI z{b2xJetZwSWbWnAcQ>hPX%I!v9kIk|tB|z>oVj5NC^^=_NT{8O;Y-Q&k6q|7#XP{7 z8v~-LzuywKtvxceI7g|sP!@aDq=523fN@PrTeo#{DU;zT$^(Jqx=dk$V4#(ATw%W^(;IwIr58P~L=fN@Qupt)7J zVa z&){|!1JJt?GzVSgOUZ*>pZuj0=e-HB!?;aTo3(>5fvnv}T2D=<^+p1T@=Bopo)kCZ zZhFslXT-N5_mQ9Po0leC*Ma4lZ`x47VEEdbS*=-l{*;_B-_4(N6HDpRT34nkj4wxdQmg3?G zuQ`7Cx4w*dv*L)7pD#BB0=!dE#14OcTC$J0T>_xg<)E#*&lVAo1tBrRNPR16%lye? zzd3gWpVJ9hIKOOfcBi7qc}+tqiYWB^Y5KM^ZNBC7?{-s~ymkki*EB{KBDfrRgtR%k r!#@Ou!00000NkvXXu0mjf3}y^* literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-01.png b/game/resources/animated/hero/hero_run/adventurer-run-01.png new file mode 100644 index 0000000000000000000000000000000000000000..96d832012e63466c4cfc2b9e5b864f7af21b1e72 GIT binary patch literal 1043 zcmV+u1nm2XP)2%@jT z9`t2H%IuT4maPSmLF4|wS~9H8Qm|=8m&G(IH~o{`n_eH%dw08vy4<7%$rmo1^SkHX z-|ut&p96K(Raaeg)m0Z_JDlG5>J!tMU()g-sDuD`sqfQ@{wcW+>&Z3v{V<(}+X2uP zG@kE>nE-!g9#mYhTLyBb_W*#IzPCcGt(Eb~DLN0gql6WHnMk076#$b8dr3nTV|^mU z+FH>TG&}E1SE4NeIn#T9VxhFjo=DCyJ~?Hl-KeG@cY98fiNDPoN1O2aJZAdd3cY$O ziR2tgSmE@yw}^M0qVtsq@vc)gR3)nFtToi#O-o=mK99_9Uy$swMq@xR!|yF~{mxyk zOuokc8`qd^D%an~AD!Ot{rPJ%;)4%AugJG+kfH8wJ6+Iqe6noDn)ceZk?9Gds>)B# z9Rgraq=n$+Apnj)+W~KS07zV%p?jc5gkRkV_g__wS<7A%e6ma`mm`(S5mi+HqN+-< zZxF^lV^5@o`AnME*WZmyPjH+L0AfvhsT2aL08-F(;ge-EmCM;S3&OHBQ*H@Msm9fE zIaEfbC)|brQ~@MkD3HnL?R->K9|4@bB34(k;ApjlY?4sVSpZU(&Jjg*8v;-TkQH6G z(@qH1$DiNdX#SBL24Fsu1|Waw9E&UE??UgEq2%E~SL3x>E4%PX5~*Cy^huH^7{;ao z^O-d7y#M7U`_+qI5d7^jQtLri0k{U~zkS=8-B7FFtY-218-a3{`a8{M((DI}xnEty zQPaJa)vW^YuYndO6JwjoEM$}Dr8OaY+^x-9vT2O3wE-|XcmaTB#|+jiOG2iB{_nLe N002ovPDHLkV1oY={2u@S literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-02.png b/game/resources/animated/hero/hero_run/adventurer-run-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3b74df0890213dc31ab88d93038a14e31daed2 GIT binary patch literal 963 zcmV;!13dhRP) z<(}{RpYNRWoqM57nKEU{lqpl@u0xdC;is?fXM5W=nQu#|ap7<|0qB19h@pNhg@?92 zhYqv?$mLW<41M)GiFksO-<+YRqa6TsQN_E%CjsUobA|_YLs6prAH){Z65#sG4e4vz z%$2|x0InJr!BK^&$?GJO3At`3>rgTwIebl<^{cw5>h}D$5lk2IaC^1hKK{fml&NX` zUYVNKGm~#OLcwd~%idlI;Hz!cZ3{_NY_humsM(#A4YlJ8olG%bjodPG8-;0lI@&q- zfu9#Y`-DUH{=&e`J#cZ*a2y2-xut2M(rT4wCq{MK-mN?IxxV<39iD>52lo*Hyvg5~ zB*vA%7`>rE&i4qQi}Niokm(g%xN0blg16s+?ru_=CILKdw{G{NbY)*Sm!a;pZc+32K|^sAEaX^cCx9*_7hq0QzKCGR&n{-O z&-29Oc=Ot|JHGvjN{dB=qfx9C6#^g}jp~6u`~2GkLw;IQVVr&aIQ#kuZ(8QZ`&;q2 z-FVz?>@8ah8dTFOyMJQkU$x=PTaW7PU}X!>?0+E}$feWbmE#{9_G7w`!BgiXK!@*X z-8OvUD8G&=0C;cxLAA}wWAA^@@QI`JzkAqFOrZdBA36{_`W^@Yg>T6taF67vAJ={pH@W?%q$#{aRDn-pij#6yD z@;7+Nz3ouqa7oPiQL)T?#UuuA+70S{AfS@n&4fe+Rv^+Y2DKI2|md)8fP7KvDWF lSsnQ=t7}Gb2L|)5<{u@>Infw4#AN^g002ovPDHLkV1mT5)A0ZR literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-03.png b/game/resources/animated/hero/hero_run/adventurer-run-03.png new file mode 100644 index 0000000000000000000000000000000000000000..a512930ec81d583aac03630d3d9fa7e4441facf0 GIT binary patch literal 1140 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 Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 007/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- .../condition/KeyReleasedCondition.cpp | 15 ++++ .../condition/KeyReleasedCondition.hpp | 18 ++++ .../condition/LastStateCondition.cpp | 13 +++ .../condition/LastStateCondition.hpp | 20 +++++ core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++ core/event/management/controller/Jump.cpp | 15 ++++ core/event/management/controller/Jump.hpp | 25 ++++++ core/event/management/controller/Run.cpp | 21 +++++ core/event/management/controller/Run.hpp | 29 +++++++ .../controller/statemachine/StateMachine.cpp | 5 ++ .../controller/statemachine/StateMachine.hpp | 3 + core/loader/LevelLoaderFromFile.cpp | 45 +++++----- core/loader/LevelLoaderFromFile.hpp | 4 + game/mobs/hero/Hero.cpp | 86 +++++++++++++++++++ game/mobs/hero/Hero.hpp | 23 +++++ 17 files changed, 327 insertions(+), 23 deletions(-) create mode 100644 core/event/management/condition/KeyReleasedCondition.cpp create mode 100644 core/event/management/condition/KeyReleasedCondition.hpp create mode 100644 core/event/management/condition/LastStateCondition.cpp create mode 100644 core/event/management/condition/LastStateCondition.hpp create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp create mode 100644 game/mobs/hero/Hero.cpp create mode 100644 game/mobs/hero/Hero.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b1ae6b4..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/KeyReleasedCondition.cpp b/core/event/management/condition/KeyReleasedCondition.cpp new file mode 100644 index 0000000..fd9df64 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.cpp @@ -0,0 +1,15 @@ +#include "KeyReleasedCondition.hpp" +#include +#include +std::unordered_set mad::core::KeyReleasedCondition::triggers() { + return {mad::core::Event::Type::KeyReleased}; +} +bool mad::core::KeyReleasedCondition::is_triggered_by(const mad::core::Event &event) { + const auto &keystroke = const_cast_to(event); + return keystroke.key_id == m_key_id; +} + +mad::core::KeyReleasedCondition::KeyReleasedCondition(const int m_key_id) : m_key_id(m_key_id){ +} +void mad::core::KeyReleasedCondition::on_start() { +} diff --git a/core/event/management/condition/KeyReleasedCondition.hpp b/core/event/management/condition/KeyReleasedCondition.hpp new file mode 100644 index 0000000..ec846c9 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_KEYRELEASEDCONDITION_HPP +#define MAD_KEYRELEASEDCONDITION_HPP + +#include "Condition.hpp" +namespace mad::core { + struct KeyReleasedCondition : Condition { + public: + explicit KeyReleasedCondition(int m_key_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + const int m_key_id; + }; +}// namespace mad::core + +#endif//MAD_KEYRELEASEDCONDITION_HPP diff --git a/core/event/management/condition/LastStateCondition.cpp b/core/event/management/condition/LastStateCondition.cpp new file mode 100644 index 0000000..a2fb453 --- /dev/null +++ b/core/event/management/condition/LastStateCondition.cpp @@ -0,0 +1,13 @@ +#include "LastStateCondition.hpp" + +bool mad::core::LastStateCondition::is_triggered_by(const mad::core::Event &event) { + return m_to_state_id == m_machine->get_previous_state_id(); +} +std::unordered_set mad::core::LastStateCondition::triggers() { + return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::Collision, mad::core::Event::Type::KeyHeld, mad::core::Event::Type::KeyReleased, mad::core::Event::Type::LevelPause, mad::core::Event::Type::Menu, mad::core::Event::Type::Movement, mad::core::Event::Type::Runner, mad::core::Event::Type::Visual, mad::core::Event::Type::WindowClose}; +} +void mad::core::LastStateCondition::on_start() { +} +mad::core::LastStateCondition::LastStateCondition(std::shared_ptr m_machine, mad::core::StateMachine::StateId m_to_state_id) : m_machine(m_machine), m_to_state_id(m_to_state_id){ + +} diff --git a/core/event/management/condition/LastStateCondition.hpp b/core/event/management/condition/LastStateCondition.hpp new file mode 100644 index 0000000..89ec58e --- /dev/null +++ b/core/event/management/condition/LastStateCondition.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_LASTSTATECONDITION_HPP +#define MAD_LASTSTATECONDITION_HPP + +#include "Condition.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +namespace mad::core { + struct LastStateCondition : Condition { + public: + LastStateCondition(std::shared_ptr m_machine, StateMachine::StateId m_to_state_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + std::shared_ptr m_machine; + StateMachine::StateId m_to_state_id; + }; +}// namespace mad::core + +#endif//MAD_LASTSTATECONDITION_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index b986148..ab5f66c 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -13,6 +13,7 @@ void mad::core::Transition::handle(const mad::core::Event &event) { if (!is_active || m_state_machine->has_made_transition) return; if (m_condition->is_triggered_by(event)) { m_state_machine->has_made_transition = true; + m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); for (auto &i : m_state_machine->m_transitions[current_state]) { @@ -41,6 +42,7 @@ mad::core::StateMachine::StateId mad::core::StateMachine::add_state(const std::s } void mad::core::StateMachine::set_initial_state(mad::core::StateMachine::StateId state_id) { m_current_state_id = state_id; + m_previous_state_id = state_id; for (auto &i : m_transitions[state_id]) { i->is_active = true; } @@ -52,3 +54,6 @@ void mad::core::StateMachine::add_transition(mad::core::StateMachine::StateId st } mad::core::StateMachine::StateMachine(std::shared_ptr m_dispatcher) : m_dispatcher(std::move(m_dispatcher)){ } +mad::core::StateMachine::StateId mad::core::StateMachine::get_previous_state_id() { + return m_previous_state_id; +} diff --git a/core/event/management/controller/statemachine/StateMachine.hpp b/core/event/management/controller/statemachine/StateMachine.hpp index 733e029..05e4791 100644 --- a/core/event/management/controller/statemachine/StateMachine.hpp +++ b/core/event/management/controller/statemachine/StateMachine.hpp @@ -21,9 +21,12 @@ namespace mad::core { void add_transition(StateId state_id_from, StateId state_id_to, std::shared_ptr transition_condition); void set_initial_state(StateId state_id); void control() override; + StateId get_previous_state_id(); + private: StateId m_current_state_id = -1; + StateId m_previous_state_id = -1; std::vector> m_states; std::vector>> m_transitions; std::shared_ptr m_dispatcher; diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 4b19898..9276a96 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,9 +1,10 @@ #include "LevelLoaderFromFile.hpp" -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" +#include <../../game/mobs/hero/Hero.hpp> +#include +#include +#include +#include +#include #include @@ -18,7 +19,7 @@ namespace mad::core { std::unique_ptr LevelLoaderFromFile::load(std::shared_ptr global_dispatcher, std::shared_ptr system_listener) { - auto level_dispatcher = std::make_shared(); + level_dispatcher = std::make_shared(); auto world = std::make_shared(*level_dispatcher); @@ -26,17 +27,22 @@ namespace mad::core { m_config_json["camera"]["position"]["y"]}; auto camera = std::make_shared(camera_position, world); + controllers = {std::make_shared( + camera)}; + + Entity::Id hero_id = create_world(world); camera->turn_on(*level_dispatcher, hero_id); level_dispatcher->registry(camera); - level_dispatcher->registry(std::make_shared(world, hero_id)); + //level_dispatcher->registry(std::make_shared(world, hero_id)); + /* std::vector> controllers { std::make_shared(camera) };*/ - ///State Machine + /*///State Machine struct C1 : mad::core::Controller { void control() override { //SPDLOG_DEBUG("controller 1"); @@ -56,7 +62,7 @@ namespace mad::core { machine->set_initial_state(0); std::vector> controllers{machine, std::make_shared( - camera)}; + camera)};*/ auto level_runner = std::make_unique( system_listener, @@ -65,8 +71,7 @@ namespace mad::core { global_dispatcher, level_dispatcher, world, - controllers - ); + controllers); level_dispatcher->registry(std::make_shared(*level_runner)); level_dispatcher->registry(std::make_shared(*level_runner)); @@ -82,7 +87,7 @@ namespace mad::core { Entity::Id hero_id = 0; std::string map_line; while (std::getline(m_level_map, map_line)) { - for (char object: map_line) { + for (char object : map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, @@ -99,9 +104,8 @@ namespace mad::core { break; } case Objects::Hero: { - hero_id = create_hero(world, - {current_position_x, - current_position_y}); + Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + hero_id = hero.get_hero_id(); break; } case Objects::Enemy1: { @@ -137,16 +141,14 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile) - }})); + StaticImage::TransformType::Tile)}})); Entity::Id square_id = world->create_physical_entity( 0, position, 0, image_storage, - is_stable - ); + is_stable); } Entity::Id LevelLoaderFromFile::create_hero(std::shared_ptr world, Vec2d position) { @@ -185,10 +187,9 @@ namespace mad::core { position, 0, image_storage, - false, false - ); + false, false); return hero_id; } -} \ No newline at end of file +}// namespace mad::core \ No newline at end of file diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index e12e665..46d2f52 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -115,6 +115,10 @@ namespace mad::core { std::ifstream m_level_map; + std::vector> controllers; + + std::shared_ptr level_dispatcher; + std::unordered_map m_objects = { {'.', Objects::Empty}, {'#', Objects::StableBlock}, diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp new file mode 100644 index 0000000..8407ce7 --- /dev/null +++ b/game/mobs/hero/Hero.cpp @@ -0,0 +1,86 @@ +#include "Hero.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/KeyReleasedCondition.hpp" +#include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["hero"]["source"]; + + std::shared_ptr image_storage; + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) + }, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }} + ) + ); + + hero_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + false, false + ); + + + ///State Machine + struct C1 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 1"); + }; + }; + struct C2 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 2"); + }; + }; + auto machine = std::make_shared( + std::shared_ptr(level_dispatcher)); + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(2, 0, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(2, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); + machine->set_initial_state(0); + controllers.push_back(machine); +} +mad::core::Entity::Id mad::core::Hero::get_hero_id() const { + return hero_id; +} diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp new file mode 100644 index 0000000..d8795df --- /dev/null +++ b/game/mobs/hero/Hero.hpp @@ -0,0 +1,23 @@ +#ifndef MAD_HERO_HPP +#define MAD_HERO_HPP + +#include "loader/LevelLoaderFromFile.hpp" +#include "world/LocalWorld.hpp" +#include +#include "world/entity/PhysicalEntity.hpp" +#include +namespace mad::core { + class Hero { + public: + Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers); + Entity::Id get_hero_id() const; + + private: + std::shared_ptr m_world; + Entity::Id hero_id; + std::shared_ptr level_dispatcher; + int last_pressed_key; + }; +}// namespace mad::core + +#endif//MAD_HERO_HPP From 6ddb7fb9f297477ea378f91f5e943c89ddc199e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 008/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- core/world/LocalWorld.cpp | 3 +++ core/world/LocalWorld.hpp | 2 ++ game/mobs/hero/Hero.cpp | 2 +- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index b65987c..d104bdc 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -93,3 +93,6 @@ mad::core::Entity::Id mad::core::LocalWorld::create_physical_entity(int z_ind, m mad::core::Entity &mad::core::LocalWorld::get_entity(mad::core::Entity::Id id) noexcept { return m_storage.get_entity(id); } +mad::core::EntityStorage &mad::core::LocalWorld::get_storage() { + return m_storage; +} diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 14c38a8..4f4d4c6 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -34,6 +34,8 @@ namespace mad::core { Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, bool is_fixed = false, bool is_rotated = true) override; + EntityStorage& get_storage(); + private: std::shared_ptr>> m_step_events_queue; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From b9f34fa8ca974ef8c3dbe1a780c168d731bdc40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 009/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Fall.cpp | 6 ++ core/event/management/controller/Fall.hpp | 17 +++ core/event/management/controller/FlyUp.cpp | 6 ++ core/event/management/controller/FlyUp.hpp | 18 ++++ .../management/controller/GroundMovement.cpp | 7 ++ .../management/controller/GroundMovement.hpp | 17 +++ core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ---- .../controller/{Jump.cpp => JumpImpulse.cpp} | 8 +- .../controller/{Jump.hpp => JumpImpulse.hpp} | 10 +- core/event/management/controller/Movement.cpp | 27 +++++ .../controller/{Run.hpp => Movement.hpp} | 18 ++-- core/event/management/controller/Run.cpp | 25 ----- .../event/management/controller/StartJump.cpp | 6 ++ .../event/management/controller/StartJump.hpp | 17 +++ core/visual/image/storage/ImageStorage.hpp | 5 +- core/world/LocalWorld.cpp | 3 + core/world/LocalWorld.hpp | 2 +- core/world/entity/PhysicalEntity.cpp | 10 +- core/world/entity/PhysicalEntity.hpp | 1 + game/mobs/hero/Hero.cpp | 98 ++++++++++++++++-- game/mobs/hero/Hero.hpp | 1 + .../hero/hero_fall/adventurer-fall-00.png | Bin 0 -> 1004 bytes .../hero/hero_fall/adventurer-fall-01.png | Bin 0 -> 999 bytes .../hero/hero_fly_up/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_idle/adventurer-idle-00.png | Bin 0 -> 1134 bytes .../hero/hero_idle/adventurer-idle-01.png | Bin 0 -> 1127 bytes .../hero/hero_idle/adventurer-idle-02.png | Bin 0 -> 1206 bytes .../hero/hero_idle/adventurer-idle-03.png | Bin 0 -> 1110 bytes .../hero/hero_jump/adventurer-jump-00.png | Bin 0 -> 1095 bytes .../hero/hero_jump/adventurer-jump-01.png | Bin 0 -> 1049 bytes .../hero/hero_jump/adventurer-jump-02.png | Bin 0 -> 1094 bytes .../hero/hero_jump/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_run/adventurer-run-00.png | Bin 0 -> 1073 bytes .../hero/hero_run/adventurer-run-01.png | Bin 0 -> 1043 bytes .../hero/hero_run/adventurer-run-02.png | Bin 0 -> 963 bytes .../hero/hero_run/adventurer-run-03.png | Bin 0 -> 1140 bytes .../hero/hero_run/adventurer-run-04.png | Bin 0 -> 1075 bytes .../hero/hero_run/adventurer-run-05.png | Bin 0 -> 859 bytes game/resources/levels/level_01/config.json | 53 ++++++++-- game/resources/levels/level_01/map | 2 +- 42 files changed, 292 insertions(+), 98 deletions(-) create mode 100644 core/event/management/controller/Fall.cpp create mode 100644 core/event/management/controller/Fall.hpp create mode 100644 core/event/management/controller/FlyUp.cpp create mode 100644 core/event/management/controller/FlyUp.hpp create mode 100644 core/event/management/controller/GroundMovement.cpp create mode 100644 core/event/management/controller/GroundMovement.hpp delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp rename core/event/management/controller/{Jump.cpp => JumpImpulse.cpp} (65%) rename core/event/management/controller/{Jump.hpp => JumpImpulse.hpp} (57%) create mode 100644 core/event/management/controller/Movement.cpp rename core/event/management/controller/{Run.hpp => Movement.hpp} (50%) delete mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/StartJump.cpp create mode 100644 core/event/management/controller/StartJump.hpp create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-00.png create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-01.png create mode 100644 game/resources/animated/hero/hero_fly_up/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-00.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-01.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-02.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-03.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-00.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-01.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-02.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-00.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-01.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-02.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-04.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-05.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Fall.cpp b/core/event/management/controller/Fall.cpp new file mode 100644 index 0000000..ed817e6 --- /dev/null +++ b/core/event/management/controller/Fall.cpp @@ -0,0 +1,6 @@ +#include "Fall.hpp" + +mad::core::Fall::Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fall; + Idle_animation = ImageStorage::TypeAction::Fall; +} diff --git a/core/event/management/controller/Fall.hpp b/core/event/management/controller/Fall.hpp new file mode 100644 index 0000000..4e8274d --- /dev/null +++ b/core/event/management/controller/Fall.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_FALL_HPP +#define MAD_FALL_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Fall : public Movement { + public: + Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FALL_HPP diff --git a/core/event/management/controller/FlyUp.cpp b/core/event/management/controller/FlyUp.cpp new file mode 100644 index 0000000..969d7e2 --- /dev/null +++ b/core/event/management/controller/FlyUp.cpp @@ -0,0 +1,6 @@ +#include "FlyUp.hpp" + +mad::core::FlyUp::FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fly_up; + Idle_animation = ImageStorage::TypeAction::Fly_up; +} diff --git a/core/event/management/controller/FlyUp.hpp b/core/event/management/controller/FlyUp.hpp new file mode 100644 index 0000000..e87bc4a --- /dev/null +++ b/core/event/management/controller/FlyUp.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_FLYUP_HPP +#define MAD_FLYUP_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class FlyUp : public Movement { + public: + FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FLYUP_HPP diff --git a/core/event/management/controller/GroundMovement.cpp b/core/event/management/controller/GroundMovement.cpp new file mode 100644 index 0000000..b8e127e --- /dev/null +++ b/core/event/management/controller/GroundMovement.cpp @@ -0,0 +1,7 @@ + +#include "GroundMovement.hpp" + +mad::core::GroundMovement::GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Run; + Idle_animation = ImageStorage::TypeAction::Idle; +} diff --git a/core/event/management/controller/GroundMovement.hpp b/core/event/management/controller/GroundMovement.hpp new file mode 100644 index 0000000..339fe34 --- /dev/null +++ b/core/event/management/controller/GroundMovement.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_GROUNDMOVEMENT_HPP +#define MAD_GROUNDMOVEMENT_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class GroundMovement : public Movement { + public: + GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_GROUNDMOVEMENT_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/JumpImpulse.cpp similarity index 65% rename from core/event/management/controller/Jump.cpp rename to core/event/management/controller/JumpImpulse.cpp index 9e5dd5a..6ffc28d 100644 --- a/core/event/management/controller/Jump.cpp +++ b/core/event/management/controller/JumpImpulse.cpp @@ -1,8 +1,8 @@ -#include "Jump.hpp" +#include "JumpImpulse.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +mad::core::JumpImpulse::JumpImpulse(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { } -void mad::core::Jump::control() { +void mad::core::JumpImpulse::control() { auto impulse = [](mad::core::Vec2d dir) { return mad::core::LambdaIntent( @@ -11,5 +11,5 @@ void mad::core::Jump::control() { }); }; - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -2000000.0f})); } diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/JumpImpulse.hpp similarity index 57% rename from core/event/management/controller/Jump.hpp rename to core/event/management/controller/JumpImpulse.hpp index 25d5cf1..5e69a29 100644 --- a/core/event/management/controller/Jump.hpp +++ b/core/event/management/controller/JumpImpulse.hpp @@ -1,15 +1,15 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP +#ifndef MAD_JUMPIMPULSE_HPP +#define MAD_JUMPIMPULSE_HPP #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Jump : public Controller { + class JumpImpulse : public Controller { public: - explicit Jump(std::shared_ptr world, Entity::Id entity_id); + explicit JumpImpulse(std::shared_ptr world, Entity::Id entity_id); void control() override; @@ -22,4 +22,4 @@ namespace mad::core { } -#endif//MAD_JUMP_HPP +#endif//MAD_JUMPIMPULSE_HPP diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp new file mode 100644 index 0000000..a580c78 --- /dev/null +++ b/core/event/management/controller/Movement.cpp @@ -0,0 +1,27 @@ +#include "Movement.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Movement::Movement(std::shared_ptr world, Entity::Id entity_id, mad::core::Movement::Direction dir, float velocity) : m_world(world), m_entity_id(entity_id), dir(dir), velocity(velocity){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); +} +void mad::core::Movement::control() { + auto set_horizontal_velocity = [](float vel) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).set_linear_horizontal_velocity(vel, event_dispatcher); + }); + }; + if(dir == Direction::Right || dir == Direction::Left){ + m_entity->set_action(Move_animation); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(velocity)); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(-velocity)); + } + } + else if(dir == Direction::Idle){ + m_entity->set_action(Idle_animation); + } + + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Movement.hpp similarity index 50% rename from core/event/management/controller/Run.hpp rename to core/event/management/controller/Movement.hpp index 07ed05c..2bac02d 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Movement.hpp @@ -1,18 +1,21 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP +#ifndef MAD_MOVEMENT_HPP +#define MAD_MOVEMENT_HPP + + #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Run : public Controller { + class Movement : public Controller { public: enum class Direction { Right, Left, + Idle, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Movement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); void control() override; @@ -21,9 +24,12 @@ namespace mad::core { Entity::Id m_entity_id; Direction dir; PhysicalEntity* m_entity; - + float velocity; + protected: + ImageStorage::TypeAction Move_animation; + ImageStorage::TypeAction Idle_animation; }; } -#endif//MAD_RUN_HPP +#endif//MAD_MOVEMENT_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/StartJump.cpp b/core/event/management/controller/StartJump.cpp new file mode 100644 index 0000000..c124a52 --- /dev/null +++ b/core/event/management/controller/StartJump.cpp @@ -0,0 +1,6 @@ +#include "StartJump.hpp" + +mad::core::StartJump::StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Jump; + Idle_animation = ImageStorage::TypeAction::Jump; +} diff --git a/core/event/management/controller/StartJump.hpp b/core/event/management/controller/StartJump.hpp new file mode 100644 index 0000000..ea4df13 --- /dev/null +++ b/core/event/management/controller/StartJump.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_STARTJUMP_HPP +#define MAD_STARTJUMP_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class StartJump : public Movement { + public: + StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_STARTJUMP_HPP diff --git a/core/visual/image/storage/ImageStorage.hpp b/core/visual/image/storage/ImageStorage.hpp index 5699096..d866bd0 100644 --- a/core/visual/image/storage/ImageStorage.hpp +++ b/core/visual/image/storage/ImageStorage.hpp @@ -13,7 +13,10 @@ namespace mad::core { enum class TypeAction { Idle, Run, - Attack + Attack, + Jump, + Fly_up, + Fall, }; explicit ImageStorage(std::unordered_map> actions); diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index d104bdc..efa14c6 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -54,6 +54,9 @@ void mad::core::LocalWorld::produce(mad::core::EventDispatcher &dispatcher) { for (Entity::Id entity_id : m_storage.extract(TrueFilter())) { if (auto physical_entity = cast_to_or_null(m_storage.get_entity(entity_id)); physical_entity != nullptr) { physical_entity->synchronize_position_with_viewable(); + if(abs(physical_entity->get_linear_velocity().get_y()) > 0.01){ + //SPDLOG_DEBUG("vel {}", physical_entity->get_linear_velocity().get_y()); + } } } diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 4f4d4c6..4cb88c3 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -22,7 +22,7 @@ namespace mad::core { class LocalWorld : public World { public: - explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 30.0f}); + explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 60.0f}); bool manipulate(const Filter &filter, const Intent &intent) override; diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 9b58177..6f94482 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,8 +37,10 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 0.3f; - fixtureDef.restitution = 0.2f; + fixtureDef.friction = 0.0f; + fixtureDef.restitution = 0.0f; + body->SetLinearDamping(0.0000000001); + body->SetAngularDamping(0); body->CreateFixture(&fixtureDef); body->SetTransform(body->GetPosition(), initial_rotation); @@ -69,6 +71,10 @@ void mad::core::PhysicalEntity::apply_force_to_center(mad::core::Vec2d force, ma void mad::core::PhysicalEntity::set_linear_velocity(mad::core::Vec2d velocity, mad::core::EventDispatcher &dispatcher) { body->SetLinearVelocity(velocity); } +void mad::core::PhysicalEntity::set_linear_horizontal_velocity(float velocity, mad::core::EventDispatcher &dispatcher) { + body->SetLinearVelocity({velocity, body->GetLinearVelocity().y}); +} + void mad::core::PhysicalEntity::apply_angular_impulse(float impulse, mad::core::EventDispatcher &dispatcher, bool awake) { body->ApplyAngularImpulse(impulse, awake); } diff --git a/core/world/entity/PhysicalEntity.hpp b/core/world/entity/PhysicalEntity.hpp index fff81c2..6c3e0fd 100644 --- a/core/world/entity/PhysicalEntity.hpp +++ b/core/world/entity/PhysicalEntity.hpp @@ -45,6 +45,7 @@ namespace mad::core { void apply_angular_impulse(float impulse, EventDispatcher &dispatcher, bool awake = true); void apply_torque(float torque, EventDispatcher &dispatcher, bool awake = true); void set_linear_velocity(Vec2d velocity, EventDispatcher &dispatcher); + void set_linear_horizontal_velocity(float velocity, EventDispatcher &dispatcher); void set_angular_velocity(float velocity, EventDispatcher &dispatcher); void set_linear_damping(float linear_damping, EventDispatcher &dispatcher); void set_angular_damping(float angular_damping, EventDispatcher &dispatcher); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core diff --git a/game/resources/animated/hero/hero_fall/adventurer-fall-00.png b/game/resources/animated/hero/hero_fall/adventurer-fall-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4b30fb90d8d77f591fa2c00b728f6fdcaa5c5b GIT binary patch literal 1004 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 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-00.png b/game/resources/animated/hero/hero_idle/adventurer-idle-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd528e863cf02b31c7cd6cc923034015a745f60 GIT binary patch literal 1134 zcmV-!1d;oRP)XYxd z%)~`q3?`ZwGQ&ccn#forX7!Td>ckZaLiyKW|4~Z0K3wjV%Cb%FX*7mUa?{h_J?H#> z-*e9IoO5BDZMNBFn|}eR7@dB2<}{55_p2LisYFsLmv;d0=u2-2_gN~uMotB8iwUFd#mtzN=4xA) zAxbo+g>+vGbF8_FbMFNJ_`}`Dp+!`H!Qd#nZ=9zuAmR2Mp)Vj&_4x7sX0ihuZma}A z$(*4MShLx9a6Utg)5*Zu9{kVxwD+HkajLRTeXR(|E^Pb#ampt>J@mb*^nS`@JPv@r zvJTJ$6dThc6Yl6_IuWN@cB;yJgmB;qrsra`{xV_+dU9X0QUB|k*GWC~jN$u@w_i0I z0w8Ecs%59TAwYu~rxVbE*QvGJ`B^IpJx@#}d$^;Mh4kjLVR2!C$#|T)4=w|mApNPm z@Ey~0F#s~zWi##z*z$~oJ36_YP4R$3E|`tbjbV=d8ezxl?-Eq{nQ|luS+!(uKm8m* zrJuzG?FMkL@u&a^8e0|;OW(%h*rh7-5ddS90hacZLeD#!+Du(|lL~to;NkgK-e)E{ z#_-Km9@%Gpg>Sis<<%9G`3RHoI4wOt&;kUNexl)!#L(yJQYN<^G*r1gTBAvA_iF3t z0${h-CoE64oFhvs={wrJ2O9pWlgSaX`l!~0+!^(5FYgyK$$rlOLRKFS*ZTpec6$g} zeWZ`QfI~V=Q0X_}dNZbWE&ZGTjKF52zfoZ?GnUo#T+Dc?+#YfR-9#oX6|@n7kaI*2 z=t|Fds=Rw~W^w>DFh<4t4h7m$1IP_@OIPeQs@_HfTNbjAOiHXTuh>sPW7nFE-ogod zF{iJ*m4bGs+!B*n73>)8MIik0cH;PBL{h7&EXyPkg@>hXt1B;+dIyGt`W61oK9es+ zmhBr&`e3P`iJ8geM7uTrJ@R*ItoNSe`>FF!5iVq}O{LwI*Apm$kezE;wPO9&yT4pw z%XzUgBwWZ+JkEGBMfxruP2h($07*qoM6N<$f|lkf AqW}N^ literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-01.png b/game/resources/animated/hero/hero_idle/adventurer-idle-01.png new file mode 100644 index 0000000000000000000000000000000000000000..230c1cb30f47fc1ae3db9e1f34429b345a4926dd GIT binary patch literal 1127 zcmV-t1ep7YP)ESc;_C9 zN~YPOF@}(l7a8lA02vurp5=gLRm^pN?Vjl0Cv3cj&Psl!Yu-+WQxzf z_?nL9Z2+i?D%)EE8o+#ft|W(Nn#kTxpH?ATq)a-;z~v|a*Qal20iTyEp=)$BZ$oh^ zj1GrUoC<(O2{NI~tbv+3nM^vTRmc|hcKQGa_`JqlT~rO-!m((WCbE*wNjjP4hwOaW z`!M0?l(8O;PH`o4%@~&oris{O3vR_G0kkyPH9*^ysvsPlLUAe_{4B^|R}USJx*6>1 zF-VDqkX$|AyPMXgYHesF!cF&i=8iqZWOe?G-hAU=k#79NRT}y}7XFS1samZ~)c}Ok zhw!hVQqWL)cSsAncVOXtrc#(FG~FvdPv=EukP7`~6b zdql(|h>M6$0-)AiL(H{;|HBIac&e(5%Xj)aeT#N`OaBZ)i0A|gQQ3WzQ1~LFc9j8_ zg8`R=-(G%=Q1~J<@mT=UnH3T40f8-wPGwg@4HS`Zx_mfYzM_5m4ZrG0z? zfTgh1yHZtwlV`YzKENoH5Ld90WHhmRW%xKx)vpNQ-!ibUMA zljWT+0T2pbH0!zurioNqZGWgf5!r)ddKIV3N9}qvAYaY0-+X{wYAsY3QoT$Q3C~Xy z%`0DjPikit>SY!eqRhl+i!Ok%Q+xiMEedR;%G}hiWYbvy8i?Uo*eC!?>+-@q&4JxQ z{0kwXlepA(lDoY3QU#oe>lt&aNcVZSL@c8b={src5dqUgVu=K)A3{dj%uQYAQd~n( z6jZhNM@mr?&cs#xTgs`-S1Vy(cj3AENarrBR;vc+M06jTq9_1lvso#4`Fo*$h4orG ztX8WKoxcm=L_D^?4suPIn6G&ugcI@KvBthyE2^rp)w+?oTdhc{s`7*_iMKq<+s}#X zv!Db-?6*=HK%2bGefBa&hJuU?1#wCl+T>*boMkzoEj*Nfh@+|sfPmLSt!=}+(~=YI zstCe~=vd8Wr5eYbMY0M@nKYS9mBe33h%6-%BvQ+~`pE@DcIw+vGPyNlzLFCgA>l-p t5(y@gDVG1_?{6}h!e+4ue^34w_#H}Ld7*XQd&mF)002ovPDHLkV1mdw8z%q& literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-02.png b/game/resources/animated/hero/hero_idle/adventurer-idle-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2668b590bc2ab2ffead9465e8f2538ae88cd34c8 GIT binary patch literal 1206 zcmV;n1WEgeP)t%mk;?vU!GyH0*Y1*|JHBF2?Ep!3V(Y$=@}%tAyU6o77fqMR6#M z-0+|{6abAhR6>SP1BIJqqKk1YTQMmjn21F-;Z!UVKy{^61GE<+*?4>tC=P|AUk}h%cZAyKo%Gcm z(MgGhkXpUiR?m*g0`2;+mwV2OOt-wmc){8poqX?Tl5X%+KNTIH3-1vjr`C?j0suUV z$0)rodwgb<{pHmJPxZsgrnUL6e#Ko-`lmLGLdebp`wr1|(M?6~cbd0$4^zPaW&PLm z`Tgb9`uM`=4I-~J>b_5W^sa~y#AIad6Dy6}(mHGR08r#Cq}XoP=P!)j(8n%W=I6Dc z&|}zevwNEk(^*lLB%2Bb@aHd4`spPAitTp&=Q{HvQ^5cL(dA`YPJV1O1V8{0fJW~v zEkS1FmjRsqK60B*Fyy(+h*hOK-$r-7jk|BX!;t4PbF)6Cf&sF#vb3jPe3gOG6~i$Y zDlKo*VZyN`a?KWCEfWp1^Nd&_+v85c zXJP~97h`zkVzzC07JwDMzD!%br$||w)WjRI;j9?SNTD@Pdsvoxyj6l!5&)Uiudz_` zCZ(Vu`5W8|30E;DG199bLsI)vYWB5ZMO4kK6J@Fg6 z2tb+4+^jEUjT0F2ou|}wfU6zt0Q%Digj|RT5?4Fgd936K?29n~D)3{Q4d{CF_vNuG zr=@dpPePnhp8p1hi16rP=;E2yC;N{X_gD0Bri0&($Q*oKHS4-OJt(QjqR_f0!@ z;+YSVkXX0tilT5Q4MYrEY#tnhb%EB@*FAEL*=#oIHU+|u-@=SXzc>9Ioqr19M9Onb z?6rhZRh2yRgG}X_kyKS>uO&=LW{eLG?h@)(IFX{9EX`)Ovr}H+Noxkf*9REBK7d1t zvQu6Fz>yIba^$W@T5fg#cS$itmIvk?rg*ws0cj+%5{pTNwoOU0Y*U6b9*(5NUs{OF zheCuR3p9UuNtb=`{Rq+cs{Vf|E;d8LiOh#WjE5sEM3??jXFMFiVloNulm7+&0QQ2K U4h?yP-v9sr07*qoM6N<$f=IDF&Hw-a literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-03.png b/game/resources/animated/hero/hero_idle/adventurer-idle-03.png new file mode 100644 index 0000000000000000000000000000000000000000..53207e8a2f1ed323478a1e16c27559eff02c46ba GIT binary patch literal 1110 zcmV-c1gZOpP)BW*kqGUHreDqK&gh)Q%4Wc(RPn0?Mv$^rB>Slz@cWE!eOWhbOWU%kSjcK7uN1{}-fQQ} z6T1jSqQ-bA66IX*qS3Av6$`PcW;~ir0qE+m3qU-Owi1d&(OeowKAK>xZ;;;mJ&g4Y z8lq$)Wv`w-@i4nP++ut(%pac9EWGh3)9%6=z4G#r4Yu*)=V={!S9*;|Ikk3oxB&=d zj?#3a@2~HBJe*8Q_!|Lt(@lL;ijrIB3K^_WDaQrcilC!UKo7@>ZH=>#PVZUL)N55RCwrCh{{yq}c>prmRT<%d3NsQOI7}+H z$`*^w5HTB{XL%_?-@q|~p;2b+I$_ldK;OV1!O$qnONEQG=fTIBxV%PpOXa0nc4~+F z`|)cY>a4Y5xOIoI%F9a;dVakIJ5&IYnVcb{H50?3TKJI$UU>6UV-7Nel;vT#zaPgP zb|QLQ)LCnJGb<^I~ZP+YC=agV*wD@zwQ*yafRP28j0k9CgVzi4Qia1mY$xIGFq?VLYF%?tp z<}_B(>vU3_(AlAr)ccxgQZ0sIv33C1){Q4N20*=gm-yOd?DNICJr`Q&~=?U%lctbXF<_*oqe_xzM34bKG`ERu5=;w zR+9kOqponb-NfYh1e46vuxfYUac ziD~?J=z~qAO)-9yX!;Qo1F=N|uA&lbf!(FJEO1%(3%bzpVPRc_KIk1@%>I&_+?=^N zbN+MAoS6$*vSi7UB}DrKD$J1^)>(^GZCt4JQ83kG^uPM?^ETds90k@u_&!t4u=}u zY5U0dZRv5B(lhW20D8X8V80jN*a-1>Oy0}izeQO_<`Rpds92N1@r112ZWk{dc@%(9 zUnu|{cPWvX2ztH_u;N_>$}(cpawybo0-$DxT>^66-ip`fPk-a}`O}%nw5vdwkke;} zc%o(#@4rzCz@LR*;eY#MSs%0F_4(2Bb&j6xqqnJ@+PXq|o7&T&RFI>}(NIepTb{N6 zoa`QZ9%JNNe69z`8NEr^F7W>mqPa@Y>J~WiAEebS_*LYItJivz%&(+t47Ic|5i!`T zyQFt&l%d)u(_@uAR|psePi?J984je@?!v8dI`$Qa{Q9FRLQp3Jkln-m#10-#+XsK^ z<8gwNOxp+;2EgBffDejXVlKJBd#B$q9fN5hLoIDg$0HQjb@}d67n+$)og+;x?L<3I z0jv|Xgv6WD681X?ycq;s3{>sEp5!s$H=ofWcP4Cb)7c=81PhhgOP%%p2Eh246O5lZ zK{$~FV7B8pvmM8Ql;9;yAB?8*Ik#{J@6;#(!=S|FS~c#}EC7TPNd~Q3fRr$&W}&XC zK^V8k8Q`+4_Uwa{nEzZMri6s=#8=stS9#KZ3wwrr=Qa-$p&$fqvf;p60-)Gg!Iz&L zW8liyY%VM^6N>38O1dNhhQaKTh-;l6vZ=HjS0ag1vyfZ!3;>g%AP;L6X2Zj>%-u{Z zJ|WJX?^4n^P2aULJ5lh*fz+x4ll~E0q{@o^PXVX`!hi)B^##;vcQ@9fTP&F-LB@VsOQ2bl-F`DEv94J)>-t-*T*#Y;8>n;$_S>RVE(9sH-c1Y0 zvmhdo2>WeO)zhjMV$(EfOD3dq>42 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-01.png b/game/resources/animated/hero/hero_jump/adventurer-jump-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b20e0343c77fa6ecb46aa2cfeccfa0f8699f6427 GIT binary patch literal 1049 zcmV+!1m^pRP)izazx1zV>AS_=w^KI)u_p$@kw8d z8Z_}?I+1`ebIQV8e1SL@rB)%5O*>i`mI9@=rF306K6KO;>(f0?+D~$mbI&>Vch2|z z&iVa*P@+VM5+zEMC{d!s{{^AS(D4qpG+PZKmCP{mZ6MeG!RZqm+`C8S&rQVQqFmbn zK+E&5DOrD;5-WhS+Da;!k!Gub;~nl?e6Y$cYPpWjx2G9fSCZsURGO5T6H6@Wh-qXgeND}8}r zZjLVyWZXNQYpXYN zp_$%3me*qJEYsvrV*>yS;Sej!*${k`5H-sd<{}XQ9)00(_QS6;I8L>Qmp_^2op;~X zyA6FpW_tTrO(nS7TrP(i8wvy%jb_o_^OTGao&hKjv&r?AcADC{Mbpu4j@+v+fa(?k zNZ-;8YTvsEfY&#M|Cb+xf9gjXlXJ5A>1@J_51wIS!_5T@q;+k*r7rgY~MT|%O%1c6w%=$Of{ zjk4|8SQ1U9nKIV{Sz$J-iMIXiB64#cFJtnKS9FQdC*;;z!MoQt2EbzQcT8L6-nY-g zLO29-zp?$1Hw8eoZ4Y05dJ^xYi&QzBdbXmwM9CF{n<6d`4p8Z;W7mdc?N%C_)r7J6 zF#s0BAsVbER-@Nst@{{>wFPnRvk@gBSa+?p8Hqwad9!~USPc3}Br?>P1<_<0CO-#Y zKM(~>z>UBKYTd__)mplY40UzMts!;OZnWAchr_bi7(EWbtLML0mJC5>W?zoS^EV^% z9)`mbP1FAIjizb*n?OD2I$9^MT!A89J<{nY#^dcA(u$rM zrAKKi%7s|0R$0Zm?6$;dyd7e%%_IPJ8`HQfh*&H}w~yB&|KhI)(S z=kKnv+myyB)?|-E5K3i~dq=sDXe5F!I7fUvB>>^H-BmC?8&BXg8`R(S{|bKrE6Hcb TLPIqs00000NkvXXu0mjfd%y9w literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-02.png b/game/resources/animated/hero/hero_jump/adventurer-jump-02.png new file mode 100644 index 0000000000000000000000000000000000000000..ba27779940e0644fb74d1bfdf8d863c973b2036d GIT binary patch literal 1094 zcmV-M1iAZ(P)9&_Hb*pLGr17@BNpIHcLz6VIq9Z$3eaQFaa_%|z ze1G5b`+d(j7b>Wrf(k154lQ`Zg1OY=G(7-If~C8q^Ti*J8+XY(D$?y9!1J5 zf5M|Xf+o2|nxC8J!%t4Iy?s-mzy01W034=W8mA>0$qB*jRfIp|Geg0(M4}S~F|!># zw1@6veDE2*(0nvC1ZWLy6FraJQ#NOnoX}Sz(Ch>t6kJ<)Y6-1m%=+HLBxa&?J^2DQ zkB8w)*|Pa85u)0vMC^)=r$#j+(TT$QNOXd;Bj-!Tc6RqN5*Z@cy4jqajg`%5iIC97 zdH@Fc?quigB_h!Yygo0_elSe9v$teya_Xu87>Nu~R~Il>&vt#V#OzH07w_(EQKL|imLx2|t`pb&Rl8hwYaG`g16x#W7Bag}WvKO9D zXdvo&lVuTlCSCTzS|S8s%dvhlGCd9tKLM-+4{-ChUjcA3*KT@f4|*mooOVaqeA0zn z=-$uFf`;Ga1z>&fL5$Ddp?Tjy0OpPzBD~=i9#2jIknpV$2L}3YnAehw_+4J}=F({1cM#WbSPG}q?KhtdfR_5@EjZPzQ0r8wb*cc2*;@J3*XzYF3@M8#t+a~0QR8r|3Qp6sRo`fuhN`M%->-@xMM&No0CSm) zsBt>Y8izxCb2N_8|=8zN{kOn~on7XZ4h|G!G>w#F9m zyRHkD&BmBZ}hywXp0V{x${B9%;Xm)|A;j+`08tteno6-d7{sy3UM%AF&ss)~SN6v{_-7K$M~ zBdKJP%X9P0XS2dE3`>JAhV+bFo}0&|REz0!hF8ygFMIk5D)_hY2che3yBE_uw*UYD M07*qoM6N<$f+g)C)c^nh literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-03.png b/game/resources/animated/hero/hero_jump/adventurer-jump-03.png new file mode 100644 index 0000000000000000000000000000000000000000..0458013c8dae7ecf137a009f0de9d2dc5fb7c074 GIT binary patch literal 1019 zcmVHJ^vVQpW(c}v>cx7okus_yS(ar3JEV;Dv^i{T*}CJ!)paNe35`SSfONF=l! zfW7aWCmQKi<8np@U@|#OD7;U}X4ATOYG%Z2X%Oj!JjvU?Z<()*PbP=)cmj$ZKEwCO zbgZ90WQm~5tDH#>bK#RtJ|3JQ?FmtyS|@kT(RcSbI!3=B?FrEp8z36#=0K~dYCWb} znYc1@oeQ6J^7;5-(w?Gf;@xf^;Nxl-P9-+XO^*CP`o^R#Zo`aB$NI?@msJx0-@G>s zZyp99=nnv}IC~9%k5(%| zgQ|^Wi_4m7RHD*^+h!)0-)J$@{$l{#TTFA$vBS`han%o-j`eRjr2tVj(s%Sl!ls8? z9zDk729a5B#A>w?A0Dk%hKi~;dwL}+9OfpLR|{pKnwQei-9=`-#B9N-StrZ#=2b~? zx$NZg`Tuuny)<;We7U8Nc4q@OAE2qmBNLi?=++(Sd^S3k&`4O#U%FF5pJ=u>7Tc)aNMsJ!I0LfnUS0%aqGb{ z%WG@GE7tgSbb{u_5^jrG>~K0r7fWJ~-MHU~n*FoC{mNd&ZfX=OYb7rJG^NG|Uw;8M p_r>7Qc&+H`sH2WL>Zs%K#Gfd5Tp^4i<(B{e002ovPDHLkV1llc@^t_J literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-00.png b/game/resources/animated/hero/hero_run/adventurer-run-00.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d7cc057f4e6efed4564cae0c022f961089639c GIT binary patch literal 1073 zcmV-11kU@3P)-L~*N`~w~w_wx-vWOaAj0Tr1#<;j-qKOzD_ka(^N1x1$ z&X}lV2_{Q)VF4#B!HhU@z*x40Ez6)V7<6!9m(sy)IX>LAw!&0yZ+Wrbm)@Rp`uqOA z=llEh^b~T)A%`4t$iX_qMiZX+;2^tqRmjw_h`u0vsvm&8jUQWz>&!g0^&zql;pC6) zJX`%F0Q#&><(?`Da5p?{d1Lcz%I`np*6j&d72L-8!K(nMMJiVYh6s(`VsSAd|K;Nk z#fA!bZGVu^@-%(Xt5gNIq0j2cxzuMX*lg|-ExsH?$kr~SC)Ak_N2Quh8qsEH@Zyge1)v9?%~&S7b$(z zgDb2ub|=g$m4ZV-fv>2HLqWkcQ7F2)&s*Zk%Gd93!(jks7Ilifssy-RI{?7G-8=dI z{b2xJetZwSWbWnAcQ>hPX%I!v9kIk|tB|z>oVj5NC^^=_NT{8O;Y-Q&k6q|7#XP{7 z8v~-LzuywKtvxceI7g|sP!@aDq=523fN@PrTeo#{DU;zT$^(Jqx=dk$V4#(ATw%W^(;IwIr58P~L=fN@Qupt)7J zVa z&){|!1JJt?GzVSgOUZ*>pZuj0=e-HB!?;aTo3(>5fvnv}T2D=<^+p1T@=Bopo)kCZ zZhFslXT-N5_mQ9Po0leC*Ma4lZ`x47VEEdbS*=-l{*;_B-_4(N6HDpRT34nkj4wxdQmg3?G zuQ`7Cx4w*dv*L)7pD#BB0=!dE#14OcTC$J0T>_xg<)E#*&lVAo1tBrRNPR16%lye? zzd3gWpVJ9hIKOOfcBi7qc}+tqiYWB^Y5KM^ZNBC7?{-s~ymkki*EB{KBDfrRgtR%k r!#@Ou!00000NkvXXu0mjf3}y^* literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-01.png b/game/resources/animated/hero/hero_run/adventurer-run-01.png new file mode 100644 index 0000000000000000000000000000000000000000..96d832012e63466c4cfc2b9e5b864f7af21b1e72 GIT binary patch literal 1043 zcmV+u1nm2XP)2%@jT z9`t2H%IuT4maPSmLF4|wS~9H8Qm|=8m&G(IH~o{`n_eH%dw08vy4<7%$rmo1^SkHX z-|ut&p96K(Raaeg)m0Z_JDlG5>J!tMU()g-sDuD`sqfQ@{wcW+>&Z3v{V<(}+X2uP zG@kE>nE-!g9#mYhTLyBb_W*#IzPCcGt(Eb~DLN0gql6WHnMk076#$b8dr3nTV|^mU z+FH>TG&}E1SE4NeIn#T9VxhFjo=DCyJ~?Hl-KeG@cY98fiNDPoN1O2aJZAdd3cY$O ziR2tgSmE@yw}^M0qVtsq@vc)gR3)nFtToi#O-o=mK99_9Uy$swMq@xR!|yF~{mxyk zOuokc8`qd^D%an~AD!Ot{rPJ%;)4%AugJG+kfH8wJ6+Iqe6noDn)ceZk?9Gds>)B# z9Rgraq=n$+Apnj)+W~KS07zV%p?jc5gkRkV_g__wS<7A%e6ma`mm`(S5mi+HqN+-< zZxF^lV^5@o`AnME*WZmyPjH+L0AfvhsT2aL08-F(;ge-EmCM;S3&OHBQ*H@Msm9fE zIaEfbC)|brQ~@MkD3HnL?R->K9|4@bB34(k;ApjlY?4sVSpZU(&Jjg*8v;-TkQH6G z(@qH1$DiNdX#SBL24Fsu1|Waw9E&UE??UgEq2%E~SL3x>E4%PX5~*Cy^huH^7{;ao z^O-d7y#M7U`_+qI5d7^jQtLri0k{U~zkS=8-B7FFtY-218-a3{`a8{M((DI}xnEty zQPaJa)vW^YuYndO6JwjoEM$}Dr8OaY+^x-9vT2O3wE-|XcmaTB#|+jiOG2iB{_nLe N002ovPDHLkV1oY={2u@S literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-02.png b/game/resources/animated/hero/hero_run/adventurer-run-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3b74df0890213dc31ab88d93038a14e31daed2 GIT binary patch literal 963 zcmV;!13dhRP) z<(}{RpYNRWoqM57nKEU{lqpl@u0xdC;is?fXM5W=nQu#|ap7<|0qB19h@pNhg@?92 zhYqv?$mLW<41M)GiFksO-<+YRqa6TsQN_E%CjsUobA|_YLs6prAH){Z65#sG4e4vz z%$2|x0InJr!BK^&$?GJO3At`3>rgTwIebl<^{cw5>h}D$5lk2IaC^1hKK{fml&NX` zUYVNKGm~#OLcwd~%idlI;Hz!cZ3{_NY_humsM(#A4YlJ8olG%bjodPG8-;0lI@&q- zfu9#Y`-DUH{=&e`J#cZ*a2y2-xut2M(rT4wCq{MK-mN?IxxV<39iD>52lo*Hyvg5~ zB*vA%7`>rE&i4qQi}Niokm(g%xN0blg16s+?ru_=CILKdw{G{NbY)*Sm!a;pZc+32K|^sAEaX^cCx9*_7hq0QzKCGR&n{-O z&-29Oc=Ot|JHGvjN{dB=qfx9C6#^g}jp~6u`~2GkLw;IQVVr&aIQ#kuZ(8QZ`&;q2 z-FVz?>@8ah8dTFOyMJQkU$x=PTaW7PU}X!>?0+E}$feWbmE#{9_G7w`!BgiXK!@*X z-8OvUD8G&=0C;cxLAA}wWAA^@@QI`JzkAqFOrZdBA36{_`W^@Yg>T6taF67vAJ={pH@W?%q$#{aRDn-pij#6yD z@;7+Nz3ouqa7oPiQL)T?#UuuA+70S{AfS@n&4fe+Rv^+Y2DKI2|md)8fP7KvDWF lSsnQ=t7}Gb2L|)5<{u@>Infw4#AN^g002ovPDHLkV1mT5)A0ZR literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-03.png b/game/resources/animated/hero/hero_run/adventurer-run-03.png new file mode 100644 index 0000000000000000000000000000000000000000..a512930ec81d583aac03630d3d9fa7e4441facf0 GIT binary patch literal 1140 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 Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 010/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++ core/event/management/controller/Jump.cpp | 15 ++++ core/event/management/controller/Jump.hpp | 25 ++++++ core/event/management/controller/Run.cpp | 21 +++++ core/event/management/controller/Run.hpp | 29 +++++++ core/loader/LevelLoaderFromFile.cpp | 37 +++++---- game/mobs/hero/Hero.cpp | 98 +++-------------------- game/mobs/hero/Hero.hpp | 1 - 10 files changed, 145 insertions(+), 109 deletions(-) create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e5e0a8a..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 9276a96..0b1443d 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -10,7 +10,8 @@ namespace mad::core { - LevelLoaderFromFile::LevelLoaderFromFile(const std::filesystem::path &path) : m_level_directory(path) { + LevelLoaderFromFile::LevelLoaderFromFile(const std::filesystem::path &path) : m_level_directory(path), + m_level_map(path / "map") { std::ifstream input_config(path / "config.json"); CHECK_THROW(input_config, FileDoesNotExist, "Config file does not exist"); CHECK_THROW(m_level_map, FileDoesNotExist, "Map file does not exist"); @@ -162,25 +163,23 @@ namespace mad::core { image_storage = std::make_shared( std::unordered_map>( {{ImageStorage::TypeAction::Idle, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], - m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) - }, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"])}, {ImageStorage::TypeAction::Run, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], - m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }} - ) - ); + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"])}})); hero_id = world->create_physical_entity( 0, diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index dcee27d..8407ce7 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,12 +5,9 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Fall.hpp" -#include "event/management/controller/FlyUp.hpp" -#include "event/management/controller/GroundMovement.hpp" -#include "event/management/controller/JumpImpulse.hpp" -#include "event/management/controller/Movement.hpp" -#include "event/management/controller/StartJump.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -39,36 +36,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }, - {ImageStorage::TypeAction::Jump, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) - }, - {ImageStorage::TypeAction::Fly_up, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) - }, - {ImageStorage::TypeAction::Fall, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], - m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -95,21 +62,10 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - - + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -119,43 +75,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - - machine->add_transition(3, 5, std::make_shared()); - machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - - float t = 1; - - machine->add_transition(4, 8, std::make_shared(t)); - machine->add_transition(5, 8, std::make_shared(t)); - machine->add_transition(6, 8, std::make_shared(t)); - - machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(7, 11, std::make_shared(t)); - machine->add_transition(8, 11, std::make_shared(t)); - machine->add_transition(9, 11, std::make_shared(t)); - - machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(10, 0, std::make_shared(t)); - machine->add_transition(11, 0, std::make_shared(t)); - machine->add_transition(12, 0, std::make_shared(t)); - - - - - - - + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index 70c3953..d8795df 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,7 +17,6 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; - float horizontal_velocity = 81; }; }// namespace mad::core From 773fbdaed9aea4d114cf69a85322de00f598d38f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 011/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- game/mobs/hero/Hero.cpp | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From 4aeac709efb4bb27fce4208b8cd1ba8ec7482a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 012/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ------ core/event/management/controller/Jump.cpp | 15 ---- core/event/management/controller/Jump.hpp | 25 ------ core/event/management/controller/Run.cpp | 25 ------ core/event/management/controller/Run.hpp | 29 ------- game/mobs/hero/Hero.cpp | 98 ++++++++++++++++++++--- game/mobs/hero/Hero.hpp | 1 + 9 files changed, 90 insertions(+), 136 deletions(-) delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp delete mode 100644 core/event/management/controller/Jump.cpp delete mode 100644 core/event/management/controller/Jump.hpp delete mode 100644 core/event/management/controller/Run.cpp delete mode 100644 core/event/management/controller/Run.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp deleted file mode 100644 index 9e5dd5a..0000000 --- a/core/event/management/controller/Jump.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "Jump.hpp" -#include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { -} -void mad::core::Jump::control() { - - auto impulse = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); - }); - }; - - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); -} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp deleted file mode 100644 index 25d5cf1..0000000 --- a/core/event/management/controller/Jump.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP - -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" -namespace mad::core { - - class Jump : public Controller { - public: - - explicit Jump(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - std::shared_ptr key; - - }; - -} - -#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp deleted file mode 100644 index 07ed05c..0000000 --- a/core/event/management/controller/Run.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" - -namespace mad::core { - - class Run : public Controller { - public: - enum class Direction { - Right, - Left, - }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - Direction dir; - PhysicalEntity* m_entity; - - }; - -} - -#endif//MAD_RUN_HPP diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core From 42a92ea1a00f701f0c66db9b741d5656cad7e2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:51:00 +0300 Subject: [PATCH 013/121] ? --- core/event/management/controller/Movement.cpp | 2 ++ .../image/animated/RenderableAnimatedSeveralFiles.cpp | 2 +- core/world/entity/PhysicalEntity.cpp | 2 +- game/mobs/hero/Hero.cpp | 7 +------ game/resources/levels/level_01/config.json | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp index a580c78..53d6cea 100644 --- a/core/event/management/controller/Movement.cpp +++ b/core/event/management/controller/Movement.cpp @@ -13,9 +13,11 @@ void mad::core::Movement::control() { if(dir == Direction::Right || dir == Direction::Left){ m_entity->set_action(Move_animation); if(dir == Direction::Right){ + m_entity->flip_over(Image::Orientation::Right); m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(velocity)); } else if(dir == Direction::Left){ + m_entity->flip_over(Image::Orientation::Left); m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(-velocity)); } } diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp index f53e098..7f63794 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp @@ -22,7 +22,7 @@ namespace mad::core { m_textures.push_back(texture); } - std::reverse(m_textures.begin(), m_textures.end()); + //std::reverse(m_textures.begin(), m_textures.end()); auto [texture_width, texture_height] = m_textures[0].getSize(); diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 6f94482..478df92 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,7 +37,7 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 0.0f; + fixtureDef.friction = 50.0f; fixtureDef.restitution = 0.0f; body->SetLinearDamping(0.0000000001); body->SetAngularDamping(0); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index dcee27d..dc26bfb 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -23,7 +23,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {{ImageStorage::TypeAction::Idle, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], - m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], @@ -33,7 +32,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Run, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], - m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], @@ -43,7 +41,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Jump, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], @@ -53,7 +50,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Fly_up, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], @@ -63,7 +59,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Fall, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], - m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], @@ -126,7 +121,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - float t = 1; + float t = 2; machine->add_transition(4, 8, std::make_shared(t)); machine->add_transition(5, 8, std::make_shared(t)); diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 29f0003..31d26c9 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -44,7 +44,7 @@ "type": "several_files", "width_scale": 1, "height_scale": 1, - "delta_time": 250, + "delta_time": 500, "size_width": 100, "size_height": 74, "count_files": 4 From 9492389c643de521bc0a210db1bcbe9e3a9ac912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 014/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- .../condition/KeyReleasedCondition.cpp | 15 ++++ .../condition/KeyReleasedCondition.hpp | 18 ++++ .../condition/LastStateCondition.cpp | 13 +++ .../condition/LastStateCondition.hpp | 20 +++++ core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++ core/event/management/controller/Jump.cpp | 15 ++++ core/event/management/controller/Jump.hpp | 25 ++++++ core/event/management/controller/Run.cpp | 21 +++++ core/event/management/controller/Run.hpp | 29 +++++++ .../controller/statemachine/StateMachine.cpp | 5 ++ .../controller/statemachine/StateMachine.hpp | 3 + core/loader/LevelLoaderFromFile.cpp | 45 +++++----- core/loader/LevelLoaderFromFile.hpp | 4 + game/mobs/hero/Hero.cpp | 86 +++++++++++++++++++ game/mobs/hero/Hero.hpp | 23 +++++ 17 files changed, 327 insertions(+), 23 deletions(-) create mode 100644 core/event/management/condition/KeyReleasedCondition.cpp create mode 100644 core/event/management/condition/KeyReleasedCondition.hpp create mode 100644 core/event/management/condition/LastStateCondition.cpp create mode 100644 core/event/management/condition/LastStateCondition.hpp create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp create mode 100644 game/mobs/hero/Hero.cpp create mode 100644 game/mobs/hero/Hero.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b1ae6b4..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/KeyReleasedCondition.cpp b/core/event/management/condition/KeyReleasedCondition.cpp new file mode 100644 index 0000000..fd9df64 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.cpp @@ -0,0 +1,15 @@ +#include "KeyReleasedCondition.hpp" +#include +#include +std::unordered_set mad::core::KeyReleasedCondition::triggers() { + return {mad::core::Event::Type::KeyReleased}; +} +bool mad::core::KeyReleasedCondition::is_triggered_by(const mad::core::Event &event) { + const auto &keystroke = const_cast_to(event); + return keystroke.key_id == m_key_id; +} + +mad::core::KeyReleasedCondition::KeyReleasedCondition(const int m_key_id) : m_key_id(m_key_id){ +} +void mad::core::KeyReleasedCondition::on_start() { +} diff --git a/core/event/management/condition/KeyReleasedCondition.hpp b/core/event/management/condition/KeyReleasedCondition.hpp new file mode 100644 index 0000000..ec846c9 --- /dev/null +++ b/core/event/management/condition/KeyReleasedCondition.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_KEYRELEASEDCONDITION_HPP +#define MAD_KEYRELEASEDCONDITION_HPP + +#include "Condition.hpp" +namespace mad::core { + struct KeyReleasedCondition : Condition { + public: + explicit KeyReleasedCondition(int m_key_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + const int m_key_id; + }; +}// namespace mad::core + +#endif//MAD_KEYRELEASEDCONDITION_HPP diff --git a/core/event/management/condition/LastStateCondition.cpp b/core/event/management/condition/LastStateCondition.cpp new file mode 100644 index 0000000..a2fb453 --- /dev/null +++ b/core/event/management/condition/LastStateCondition.cpp @@ -0,0 +1,13 @@ +#include "LastStateCondition.hpp" + +bool mad::core::LastStateCondition::is_triggered_by(const mad::core::Event &event) { + return m_to_state_id == m_machine->get_previous_state_id(); +} +std::unordered_set mad::core::LastStateCondition::triggers() { + return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::Collision, mad::core::Event::Type::KeyHeld, mad::core::Event::Type::KeyReleased, mad::core::Event::Type::LevelPause, mad::core::Event::Type::Menu, mad::core::Event::Type::Movement, mad::core::Event::Type::Runner, mad::core::Event::Type::Visual, mad::core::Event::Type::WindowClose}; +} +void mad::core::LastStateCondition::on_start() { +} +mad::core::LastStateCondition::LastStateCondition(std::shared_ptr m_machine, mad::core::StateMachine::StateId m_to_state_id) : m_machine(m_machine), m_to_state_id(m_to_state_id){ + +} diff --git a/core/event/management/condition/LastStateCondition.hpp b/core/event/management/condition/LastStateCondition.hpp new file mode 100644 index 0000000..89ec58e --- /dev/null +++ b/core/event/management/condition/LastStateCondition.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_LASTSTATECONDITION_HPP +#define MAD_LASTSTATECONDITION_HPP + +#include "Condition.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +namespace mad::core { + struct LastStateCondition : Condition { + public: + LastStateCondition(std::shared_ptr m_machine, StateMachine::StateId m_to_state_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + std::shared_ptr m_machine; + StateMachine::StateId m_to_state_id; + }; +}// namespace mad::core + +#endif//MAD_LASTSTATECONDITION_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index b986148..ab5f66c 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -13,6 +13,7 @@ void mad::core::Transition::handle(const mad::core::Event &event) { if (!is_active || m_state_machine->has_made_transition) return; if (m_condition->is_triggered_by(event)) { m_state_machine->has_made_transition = true; + m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); for (auto &i : m_state_machine->m_transitions[current_state]) { @@ -41,6 +42,7 @@ mad::core::StateMachine::StateId mad::core::StateMachine::add_state(const std::s } void mad::core::StateMachine::set_initial_state(mad::core::StateMachine::StateId state_id) { m_current_state_id = state_id; + m_previous_state_id = state_id; for (auto &i : m_transitions[state_id]) { i->is_active = true; } @@ -52,3 +54,6 @@ void mad::core::StateMachine::add_transition(mad::core::StateMachine::StateId st } mad::core::StateMachine::StateMachine(std::shared_ptr m_dispatcher) : m_dispatcher(std::move(m_dispatcher)){ } +mad::core::StateMachine::StateId mad::core::StateMachine::get_previous_state_id() { + return m_previous_state_id; +} diff --git a/core/event/management/controller/statemachine/StateMachine.hpp b/core/event/management/controller/statemachine/StateMachine.hpp index 733e029..05e4791 100644 --- a/core/event/management/controller/statemachine/StateMachine.hpp +++ b/core/event/management/controller/statemachine/StateMachine.hpp @@ -21,9 +21,12 @@ namespace mad::core { void add_transition(StateId state_id_from, StateId state_id_to, std::shared_ptr transition_condition); void set_initial_state(StateId state_id); void control() override; + StateId get_previous_state_id(); + private: StateId m_current_state_id = -1; + StateId m_previous_state_id = -1; std::vector> m_states; std::vector>> m_transitions; std::shared_ptr m_dispatcher; diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 4b19898..9276a96 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,9 +1,10 @@ #include "LevelLoaderFromFile.hpp" -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" +#include <../../game/mobs/hero/Hero.hpp> +#include +#include +#include +#include +#include #include @@ -18,7 +19,7 @@ namespace mad::core { std::unique_ptr LevelLoaderFromFile::load(std::shared_ptr global_dispatcher, std::shared_ptr system_listener) { - auto level_dispatcher = std::make_shared(); + level_dispatcher = std::make_shared(); auto world = std::make_shared(*level_dispatcher); @@ -26,17 +27,22 @@ namespace mad::core { m_config_json["camera"]["position"]["y"]}; auto camera = std::make_shared(camera_position, world); + controllers = {std::make_shared( + camera)}; + + Entity::Id hero_id = create_world(world); camera->turn_on(*level_dispatcher, hero_id); level_dispatcher->registry(camera); - level_dispatcher->registry(std::make_shared(world, hero_id)); + //level_dispatcher->registry(std::make_shared(world, hero_id)); + /* std::vector> controllers { std::make_shared(camera) };*/ - ///State Machine + /*///State Machine struct C1 : mad::core::Controller { void control() override { //SPDLOG_DEBUG("controller 1"); @@ -56,7 +62,7 @@ namespace mad::core { machine->set_initial_state(0); std::vector> controllers{machine, std::make_shared( - camera)}; + camera)};*/ auto level_runner = std::make_unique( system_listener, @@ -65,8 +71,7 @@ namespace mad::core { global_dispatcher, level_dispatcher, world, - controllers - ); + controllers); level_dispatcher->registry(std::make_shared(*level_runner)); level_dispatcher->registry(std::make_shared(*level_runner)); @@ -82,7 +87,7 @@ namespace mad::core { Entity::Id hero_id = 0; std::string map_line; while (std::getline(m_level_map, map_line)) { - for (char object: map_line) { + for (char object : map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, @@ -99,9 +104,8 @@ namespace mad::core { break; } case Objects::Hero: { - hero_id = create_hero(world, - {current_position_x, - current_position_y}); + Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + hero_id = hero.get_hero_id(); break; } case Objects::Enemy1: { @@ -137,16 +141,14 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile) - }})); + StaticImage::TransformType::Tile)}})); Entity::Id square_id = world->create_physical_entity( 0, position, 0, image_storage, - is_stable - ); + is_stable); } Entity::Id LevelLoaderFromFile::create_hero(std::shared_ptr world, Vec2d position) { @@ -185,10 +187,9 @@ namespace mad::core { position, 0, image_storage, - false, false - ); + false, false); return hero_id; } -} \ No newline at end of file +}// namespace mad::core \ No newline at end of file diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index e12e665..46d2f52 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -115,6 +115,10 @@ namespace mad::core { std::ifstream m_level_map; + std::vector> controllers; + + std::shared_ptr level_dispatcher; + std::unordered_map m_objects = { {'.', Objects::Empty}, {'#', Objects::StableBlock}, diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp new file mode 100644 index 0000000..8407ce7 --- /dev/null +++ b/game/mobs/hero/Hero.cpp @@ -0,0 +1,86 @@ +#include "Hero.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/KeyReleasedCondition.hpp" +#include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["hero"]["source"]; + + std::shared_ptr image_storage; + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) + }, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }} + ) + ); + + hero_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + false, false + ); + + + ///State Machine + struct C1 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 1"); + }; + }; + struct C2 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 2"); + }; + }; + auto machine = std::make_shared( + std::shared_ptr(level_dispatcher)); + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(2, 0, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(1, 2, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(2, 1, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); + machine->set_initial_state(0); + controllers.push_back(machine); +} +mad::core::Entity::Id mad::core::Hero::get_hero_id() const { + return hero_id; +} diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp new file mode 100644 index 0000000..d8795df --- /dev/null +++ b/game/mobs/hero/Hero.hpp @@ -0,0 +1,23 @@ +#ifndef MAD_HERO_HPP +#define MAD_HERO_HPP + +#include "loader/LevelLoaderFromFile.hpp" +#include "world/LocalWorld.hpp" +#include +#include "world/entity/PhysicalEntity.hpp" +#include +namespace mad::core { + class Hero { + public: + Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers); + Entity::Id get_hero_id() const; + + private: + std::shared_ptr m_world; + Entity::Id hero_id; + std::shared_ptr level_dispatcher; + int last_pressed_key; + }; +}// namespace mad::core + +#endif//MAD_HERO_HPP From 6def163dfb2e0e70958d0deaeba16cabb98745bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 015/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- core/world/LocalWorld.cpp | 3 +++ core/world/LocalWorld.hpp | 2 ++ game/mobs/hero/Hero.cpp | 2 +- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index b65987c..d104bdc 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -93,3 +93,6 @@ mad::core::Entity::Id mad::core::LocalWorld::create_physical_entity(int z_ind, m mad::core::Entity &mad::core::LocalWorld::get_entity(mad::core::Entity::Id id) noexcept { return m_storage.get_entity(id); } +mad::core::EntityStorage &mad::core::LocalWorld::get_storage() { + return m_storage; +} diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 14c38a8..4f4d4c6 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -34,6 +34,8 @@ namespace mad::core { Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, bool is_fixed = false, bool is_rotated = true) override; + EntityStorage& get_storage(); + private: std::shared_ptr>> m_step_events_queue; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From c5bcc881abad5e5eb08649ee414d002aee6affb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 016/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Fall.cpp | 6 ++ core/event/management/controller/Fall.hpp | 17 +++ core/event/management/controller/FlyUp.cpp | 6 ++ core/event/management/controller/FlyUp.hpp | 18 ++++ .../management/controller/GroundMovement.cpp | 7 ++ .../management/controller/GroundMovement.hpp | 17 +++ core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ---- .../controller/{Jump.cpp => JumpImpulse.cpp} | 8 +- .../controller/{Jump.hpp => JumpImpulse.hpp} | 10 +- core/event/management/controller/Movement.cpp | 27 +++++ .../controller/{Run.hpp => Movement.hpp} | 18 ++-- core/event/management/controller/Run.cpp | 25 ----- .../event/management/controller/StartJump.cpp | 6 ++ .../event/management/controller/StartJump.hpp | 17 +++ core/visual/image/storage/ImageStorage.hpp | 5 +- core/world/LocalWorld.cpp | 3 + core/world/LocalWorld.hpp | 2 +- core/world/entity/PhysicalEntity.cpp | 10 +- core/world/entity/PhysicalEntity.hpp | 1 + game/mobs/hero/Hero.cpp | 98 ++++++++++++++++-- game/mobs/hero/Hero.hpp | 1 + .../hero/hero_fall/adventurer-fall-00.png | Bin 0 -> 1004 bytes .../hero/hero_fall/adventurer-fall-01.png | Bin 0 -> 999 bytes .../hero/hero_fly_up/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_idle/adventurer-idle-00.png | Bin 0 -> 1134 bytes .../hero/hero_idle/adventurer-idle-01.png | Bin 0 -> 1127 bytes .../hero/hero_idle/adventurer-idle-02.png | Bin 0 -> 1206 bytes .../hero/hero_idle/adventurer-idle-03.png | Bin 0 -> 1110 bytes .../hero/hero_jump/adventurer-jump-00.png | Bin 0 -> 1095 bytes .../hero/hero_jump/adventurer-jump-01.png | Bin 0 -> 1049 bytes .../hero/hero_jump/adventurer-jump-02.png | Bin 0 -> 1094 bytes .../hero/hero_jump/adventurer-jump-03.png | Bin 0 -> 1019 bytes .../hero/hero_run/adventurer-run-00.png | Bin 0 -> 1073 bytes .../hero/hero_run/adventurer-run-01.png | Bin 0 -> 1043 bytes .../hero/hero_run/adventurer-run-02.png | Bin 0 -> 963 bytes .../hero/hero_run/adventurer-run-03.png | Bin 0 -> 1140 bytes .../hero/hero_run/adventurer-run-04.png | Bin 0 -> 1075 bytes .../hero/hero_run/adventurer-run-05.png | Bin 0 -> 859 bytes game/resources/levels/level_01/config.json | 53 ++++++++-- game/resources/levels/level_01/map | 2 +- 42 files changed, 292 insertions(+), 98 deletions(-) create mode 100644 core/event/management/controller/Fall.cpp create mode 100644 core/event/management/controller/Fall.hpp create mode 100644 core/event/management/controller/FlyUp.cpp create mode 100644 core/event/management/controller/FlyUp.hpp create mode 100644 core/event/management/controller/GroundMovement.cpp create mode 100644 core/event/management/controller/GroundMovement.hpp delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp rename core/event/management/controller/{Jump.cpp => JumpImpulse.cpp} (65%) rename core/event/management/controller/{Jump.hpp => JumpImpulse.hpp} (57%) create mode 100644 core/event/management/controller/Movement.cpp rename core/event/management/controller/{Run.hpp => Movement.hpp} (50%) delete mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/StartJump.cpp create mode 100644 core/event/management/controller/StartJump.hpp create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-00.png create mode 100644 game/resources/animated/hero/hero_fall/adventurer-fall-01.png create mode 100644 game/resources/animated/hero/hero_fly_up/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-00.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-01.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-02.png create mode 100644 game/resources/animated/hero/hero_idle/adventurer-idle-03.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-00.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-01.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-02.png create mode 100644 game/resources/animated/hero/hero_jump/adventurer-jump-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-00.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-01.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-02.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-03.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-04.png create mode 100644 game/resources/animated/hero/hero_run/adventurer-run-05.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Fall.cpp b/core/event/management/controller/Fall.cpp new file mode 100644 index 0000000..ed817e6 --- /dev/null +++ b/core/event/management/controller/Fall.cpp @@ -0,0 +1,6 @@ +#include "Fall.hpp" + +mad::core::Fall::Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fall; + Idle_animation = ImageStorage::TypeAction::Fall; +} diff --git a/core/event/management/controller/Fall.hpp b/core/event/management/controller/Fall.hpp new file mode 100644 index 0000000..4e8274d --- /dev/null +++ b/core/event/management/controller/Fall.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_FALL_HPP +#define MAD_FALL_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Fall : public Movement { + public: + Fall(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FALL_HPP diff --git a/core/event/management/controller/FlyUp.cpp b/core/event/management/controller/FlyUp.cpp new file mode 100644 index 0000000..969d7e2 --- /dev/null +++ b/core/event/management/controller/FlyUp.cpp @@ -0,0 +1,6 @@ +#include "FlyUp.hpp" + +mad::core::FlyUp::FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Fly_up; + Idle_animation = ImageStorage::TypeAction::Fly_up; +} diff --git a/core/event/management/controller/FlyUp.hpp b/core/event/management/controller/FlyUp.hpp new file mode 100644 index 0000000..e87bc4a --- /dev/null +++ b/core/event/management/controller/FlyUp.hpp @@ -0,0 +1,18 @@ +#ifndef MAD_FLYUP_HPP +#define MAD_FLYUP_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class FlyUp : public Movement { + public: + FlyUp(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_FLYUP_HPP diff --git a/core/event/management/controller/GroundMovement.cpp b/core/event/management/controller/GroundMovement.cpp new file mode 100644 index 0000000..b8e127e --- /dev/null +++ b/core/event/management/controller/GroundMovement.cpp @@ -0,0 +1,7 @@ + +#include "GroundMovement.hpp" + +mad::core::GroundMovement::GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Run; + Idle_animation = ImageStorage::TypeAction::Idle; +} diff --git a/core/event/management/controller/GroundMovement.hpp b/core/event/management/controller/GroundMovement.hpp new file mode 100644 index 0000000..339fe34 --- /dev/null +++ b/core/event/management/controller/GroundMovement.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_GROUNDMOVEMENT_HPP +#define MAD_GROUNDMOVEMENT_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class GroundMovement : public Movement { + public: + GroundMovement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_GROUNDMOVEMENT_HPP diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/JumpImpulse.cpp similarity index 65% rename from core/event/management/controller/Jump.cpp rename to core/event/management/controller/JumpImpulse.cpp index 9e5dd5a..6ffc28d 100644 --- a/core/event/management/controller/Jump.cpp +++ b/core/event/management/controller/JumpImpulse.cpp @@ -1,8 +1,8 @@ -#include "Jump.hpp" +#include "JumpImpulse.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +mad::core::JumpImpulse::JumpImpulse(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { } -void mad::core::Jump::control() { +void mad::core::JumpImpulse::control() { auto impulse = [](mad::core::Vec2d dir) { return mad::core::LambdaIntent( @@ -11,5 +11,5 @@ void mad::core::Jump::control() { }); }; - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -2000000.0f})); } diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/JumpImpulse.hpp similarity index 57% rename from core/event/management/controller/Jump.hpp rename to core/event/management/controller/JumpImpulse.hpp index 25d5cf1..5e69a29 100644 --- a/core/event/management/controller/Jump.hpp +++ b/core/event/management/controller/JumpImpulse.hpp @@ -1,15 +1,15 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP +#ifndef MAD_JUMPIMPULSE_HPP +#define MAD_JUMPIMPULSE_HPP #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Jump : public Controller { + class JumpImpulse : public Controller { public: - explicit Jump(std::shared_ptr world, Entity::Id entity_id); + explicit JumpImpulse(std::shared_ptr world, Entity::Id entity_id); void control() override; @@ -22,4 +22,4 @@ namespace mad::core { } -#endif//MAD_JUMP_HPP +#endif//MAD_JUMPIMPULSE_HPP diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp new file mode 100644 index 0000000..a580c78 --- /dev/null +++ b/core/event/management/controller/Movement.cpp @@ -0,0 +1,27 @@ +#include "Movement.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Movement::Movement(std::shared_ptr world, Entity::Id entity_id, mad::core::Movement::Direction dir, float velocity) : m_world(world), m_entity_id(entity_id), dir(dir), velocity(velocity){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); +} +void mad::core::Movement::control() { + auto set_horizontal_velocity = [](float vel) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).set_linear_horizontal_velocity(vel, event_dispatcher); + }); + }; + if(dir == Direction::Right || dir == Direction::Left){ + m_entity->set_action(Move_animation); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(velocity)); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(-velocity)); + } + } + else if(dir == Direction::Idle){ + m_entity->set_action(Idle_animation); + } + + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Movement.hpp similarity index 50% rename from core/event/management/controller/Run.hpp rename to core/event/management/controller/Movement.hpp index 07ed05c..2bac02d 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Movement.hpp @@ -1,18 +1,21 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP +#ifndef MAD_MOVEMENT_HPP +#define MAD_MOVEMENT_HPP + + #include "Controller.hpp" #include "world/LocalWorld.hpp" #include "world/World.hpp" namespace mad::core { - class Run : public Controller { + class Movement : public Controller { public: enum class Direction { Right, Left, + Idle, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Movement(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); void control() override; @@ -21,9 +24,12 @@ namespace mad::core { Entity::Id m_entity_id; Direction dir; PhysicalEntity* m_entity; - + float velocity; + protected: + ImageStorage::TypeAction Move_animation; + ImageStorage::TypeAction Idle_animation; }; } -#endif//MAD_RUN_HPP +#endif//MAD_MOVEMENT_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/StartJump.cpp b/core/event/management/controller/StartJump.cpp new file mode 100644 index 0000000..c124a52 --- /dev/null +++ b/core/event/management/controller/StartJump.cpp @@ -0,0 +1,6 @@ +#include "StartJump.hpp" + +mad::core::StartJump::StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Jump; + Idle_animation = ImageStorage::TypeAction::Jump; +} diff --git a/core/event/management/controller/StartJump.hpp b/core/event/management/controller/StartJump.hpp new file mode 100644 index 0000000..ea4df13 --- /dev/null +++ b/core/event/management/controller/StartJump.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_STARTJUMP_HPP +#define MAD_STARTJUMP_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class StartJump : public Movement { + public: + StartJump(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_STARTJUMP_HPP diff --git a/core/visual/image/storage/ImageStorage.hpp b/core/visual/image/storage/ImageStorage.hpp index 5699096..d866bd0 100644 --- a/core/visual/image/storage/ImageStorage.hpp +++ b/core/visual/image/storage/ImageStorage.hpp @@ -13,7 +13,10 @@ namespace mad::core { enum class TypeAction { Idle, Run, - Attack + Attack, + Jump, + Fly_up, + Fall, }; explicit ImageStorage(std::unordered_map> actions); diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index d104bdc..efa14c6 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -54,6 +54,9 @@ void mad::core::LocalWorld::produce(mad::core::EventDispatcher &dispatcher) { for (Entity::Id entity_id : m_storage.extract(TrueFilter())) { if (auto physical_entity = cast_to_or_null(m_storage.get_entity(entity_id)); physical_entity != nullptr) { physical_entity->synchronize_position_with_viewable(); + if(abs(physical_entity->get_linear_velocity().get_y()) > 0.01){ + //SPDLOG_DEBUG("vel {}", physical_entity->get_linear_velocity().get_y()); + } } } diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 4f4d4c6..4cb88c3 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -22,7 +22,7 @@ namespace mad::core { class LocalWorld : public World { public: - explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 30.0f}); + explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 60.0f}); bool manipulate(const Filter &filter, const Intent &intent) override; diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 9b58177..6f94482 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,8 +37,10 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 0.3f; - fixtureDef.restitution = 0.2f; + fixtureDef.friction = 0.0f; + fixtureDef.restitution = 0.0f; + body->SetLinearDamping(0.0000000001); + body->SetAngularDamping(0); body->CreateFixture(&fixtureDef); body->SetTransform(body->GetPosition(), initial_rotation); @@ -69,6 +71,10 @@ void mad::core::PhysicalEntity::apply_force_to_center(mad::core::Vec2d force, ma void mad::core::PhysicalEntity::set_linear_velocity(mad::core::Vec2d velocity, mad::core::EventDispatcher &dispatcher) { body->SetLinearVelocity(velocity); } +void mad::core::PhysicalEntity::set_linear_horizontal_velocity(float velocity, mad::core::EventDispatcher &dispatcher) { + body->SetLinearVelocity({velocity, body->GetLinearVelocity().y}); +} + void mad::core::PhysicalEntity::apply_angular_impulse(float impulse, mad::core::EventDispatcher &dispatcher, bool awake) { body->ApplyAngularImpulse(impulse, awake); } diff --git a/core/world/entity/PhysicalEntity.hpp b/core/world/entity/PhysicalEntity.hpp index fff81c2..6c3e0fd 100644 --- a/core/world/entity/PhysicalEntity.hpp +++ b/core/world/entity/PhysicalEntity.hpp @@ -45,6 +45,7 @@ namespace mad::core { void apply_angular_impulse(float impulse, EventDispatcher &dispatcher, bool awake = true); void apply_torque(float torque, EventDispatcher &dispatcher, bool awake = true); void set_linear_velocity(Vec2d velocity, EventDispatcher &dispatcher); + void set_linear_horizontal_velocity(float velocity, EventDispatcher &dispatcher); void set_angular_velocity(float velocity, EventDispatcher &dispatcher); void set_linear_damping(float linear_damping, EventDispatcher &dispatcher); void set_angular_damping(float angular_damping, EventDispatcher &dispatcher); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core diff --git a/game/resources/animated/hero/hero_fall/adventurer-fall-00.png b/game/resources/animated/hero/hero_fall/adventurer-fall-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4b30fb90d8d77f591fa2c00b728f6fdcaa5c5b GIT binary patch literal 1004 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 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-00.png b/game/resources/animated/hero/hero_idle/adventurer-idle-00.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd528e863cf02b31c7cd6cc923034015a745f60 GIT binary patch literal 1134 zcmV-!1d;oRP)XYxd z%)~`q3?`ZwGQ&ccn#forX7!Td>ckZaLiyKW|4~Z0K3wjV%Cb%FX*7mUa?{h_J?H#> z-*e9IoO5BDZMNBFn|}eR7@dB2<}{55_p2LisYFsLmv;d0=u2-2_gN~uMotB8iwUFd#mtzN=4xA) zAxbo+g>+vGbF8_FbMFNJ_`}`Dp+!`H!Qd#nZ=9zuAmR2Mp)Vj&_4x7sX0ihuZma}A z$(*4MShLx9a6Utg)5*Zu9{kVxwD+HkajLRTeXR(|E^Pb#ampt>J@mb*^nS`@JPv@r zvJTJ$6dThc6Yl6_IuWN@cB;yJgmB;qrsra`{xV_+dU9X0QUB|k*GWC~jN$u@w_i0I z0w8Ecs%59TAwYu~rxVbE*QvGJ`B^IpJx@#}d$^;Mh4kjLVR2!C$#|T)4=w|mApNPm z@Ey~0F#s~zWi##z*z$~oJ36_YP4R$3E|`tbjbV=d8ezxl?-Eq{nQ|luS+!(uKm8m* zrJuzG?FMkL@u&a^8e0|;OW(%h*rh7-5ddS90hacZLeD#!+Du(|lL~to;NkgK-e)E{ z#_-Km9@%Gpg>Sis<<%9G`3RHoI4wOt&;kUNexl)!#L(yJQYN<^G*r1gTBAvA_iF3t z0${h-CoE64oFhvs={wrJ2O9pWlgSaX`l!~0+!^(5FYgyK$$rlOLRKFS*ZTpec6$g} zeWZ`QfI~V=Q0X_}dNZbWE&ZGTjKF52zfoZ?GnUo#T+Dc?+#YfR-9#oX6|@n7kaI*2 z=t|Fds=Rw~W^w>DFh<4t4h7m$1IP_@OIPeQs@_HfTNbjAOiHXTuh>sPW7nFE-ogod zF{iJ*m4bGs+!B*n73>)8MIik0cH;PBL{h7&EXyPkg@>hXt1B;+dIyGt`W61oK9es+ zmhBr&`e3P`iJ8geM7uTrJ@R*ItoNSe`>FF!5iVq}O{LwI*Apm$kezE;wPO9&yT4pw z%XzUgBwWZ+JkEGBMfxruP2h($07*qoM6N<$f|lkf AqW}N^ literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-01.png b/game/resources/animated/hero/hero_idle/adventurer-idle-01.png new file mode 100644 index 0000000000000000000000000000000000000000..230c1cb30f47fc1ae3db9e1f34429b345a4926dd GIT binary patch literal 1127 zcmV-t1ep7YP)ESc;_C9 zN~YPOF@}(l7a8lA02vurp5=gLRm^pN?Vjl0Cv3cj&Psl!Yu-+WQxzf z_?nL9Z2+i?D%)EE8o+#ft|W(Nn#kTxpH?ATq)a-;z~v|a*Qal20iTyEp=)$BZ$oh^ zj1GrUoC<(O2{NI~tbv+3nM^vTRmc|hcKQGa_`JqlT~rO-!m((WCbE*wNjjP4hwOaW z`!M0?l(8O;PH`o4%@~&oris{O3vR_G0kkyPH9*^ysvsPlLUAe_{4B^|R}USJx*6>1 zF-VDqkX$|AyPMXgYHesF!cF&i=8iqZWOe?G-hAU=k#79NRT}y}7XFS1samZ~)c}Ok zhw!hVQqWL)cSsAncVOXtrc#(FG~FvdPv=EukP7`~6b zdql(|h>M6$0-)AiL(H{;|HBIac&e(5%Xj)aeT#N`OaBZ)i0A|gQQ3WzQ1~LFc9j8_ zg8`R=-(G%=Q1~J<@mT=UnH3T40f8-wPGwg@4HS`Zx_mfYzM_5m4ZrG0z? zfTgh1yHZtwlV`YzKENoH5Ld90WHhmRW%xKx)vpNQ-!ibUMA zljWT+0T2pbH0!zurioNqZGWgf5!r)ddKIV3N9}qvAYaY0-+X{wYAsY3QoT$Q3C~Xy z%`0DjPikit>SY!eqRhl+i!Ok%Q+xiMEedR;%G}hiWYbvy8i?Uo*eC!?>+-@q&4JxQ z{0kwXlepA(lDoY3QU#oe>lt&aNcVZSL@c8b={src5dqUgVu=K)A3{dj%uQYAQd~n( z6jZhNM@mr?&cs#xTgs`-S1Vy(cj3AENarrBR;vc+M06jTq9_1lvso#4`Fo*$h4orG ztX8WKoxcm=L_D^?4suPIn6G&ugcI@KvBthyE2^rp)w+?oTdhc{s`7*_iMKq<+s}#X zv!Db-?6*=HK%2bGefBa&hJuU?1#wCl+T>*boMkzoEj*Nfh@+|sfPmLSt!=}+(~=YI zstCe~=vd8Wr5eYbMY0M@nKYS9mBe33h%6-%BvQ+~`pE@DcIw+vGPyNlzLFCgA>l-p t5(y@gDVG1_?{6}h!e+4ue^34w_#H}Ld7*XQd&mF)002ovPDHLkV1mdw8z%q& literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-02.png b/game/resources/animated/hero/hero_idle/adventurer-idle-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2668b590bc2ab2ffead9465e8f2538ae88cd34c8 GIT binary patch literal 1206 zcmV;n1WEgeP)t%mk;?vU!GyH0*Y1*|JHBF2?Ep!3V(Y$=@}%tAyU6o77fqMR6#M z-0+|{6abAhR6>SP1BIJqqKk1YTQMmjn21F-;Z!UVKy{^61GE<+*?4>tC=P|AUk}h%cZAyKo%Gcm z(MgGhkXpUiR?m*g0`2;+mwV2OOt-wmc){8poqX?Tl5X%+KNTIH3-1vjr`C?j0suUV z$0)rodwgb<{pHmJPxZsgrnUL6e#Ko-`lmLGLdebp`wr1|(M?6~cbd0$4^zPaW&PLm z`Tgb9`uM`=4I-~J>b_5W^sa~y#AIad6Dy6}(mHGR08r#Cq}XoP=P!)j(8n%W=I6Dc z&|}zevwNEk(^*lLB%2Bb@aHd4`spPAitTp&=Q{HvQ^5cL(dA`YPJV1O1V8{0fJW~v zEkS1FmjRsqK60B*Fyy(+h*hOK-$r-7jk|BX!;t4PbF)6Cf&sF#vb3jPe3gOG6~i$Y zDlKo*VZyN`a?KWCEfWp1^Nd&_+v85c zXJP~97h`zkVzzC07JwDMzD!%br$||w)WjRI;j9?SNTD@Pdsvoxyj6l!5&)Uiudz_` zCZ(Vu`5W8|30E;DG199bLsI)vYWB5ZMO4kK6J@Fg6 z2tb+4+^jEUjT0F2ou|}wfU6zt0Q%Digj|RT5?4Fgd936K?29n~D)3{Q4d{CF_vNuG zr=@dpPePnhp8p1hi16rP=;E2yC;N{X_gD0Bri0&($Q*oKHS4-OJt(QjqR_f0!@ z;+YSVkXX0tilT5Q4MYrEY#tnhb%EB@*FAEL*=#oIHU+|u-@=SXzc>9Ioqr19M9Onb z?6rhZRh2yRgG}X_kyKS>uO&=LW{eLG?h@)(IFX{9EX`)Ovr}H+Noxkf*9REBK7d1t zvQu6Fz>yIba^$W@T5fg#cS$itmIvk?rg*ws0cj+%5{pTNwoOU0Y*U6b9*(5NUs{OF zheCuR3p9UuNtb=`{Rq+cs{Vf|E;d8LiOh#WjE5sEM3??jXFMFiVloNulm7+&0QQ2K U4h?yP-v9sr07*qoM6N<$f=IDF&Hw-a literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-03.png b/game/resources/animated/hero/hero_idle/adventurer-idle-03.png new file mode 100644 index 0000000000000000000000000000000000000000..53207e8a2f1ed323478a1e16c27559eff02c46ba GIT binary patch literal 1110 zcmV-c1gZOpP)BW*kqGUHreDqK&gh)Q%4Wc(RPn0?Mv$^rB>Slz@cWE!eOWhbOWU%kSjcK7uN1{}-fQQ} z6T1jSqQ-bA66IX*qS3Av6$`PcW;~ir0qE+m3qU-Owi1d&(OeowKAK>xZ;;;mJ&g4Y z8lq$)Wv`w-@i4nP++ut(%pac9EWGh3)9%6=z4G#r4Yu*)=V={!S9*;|Ikk3oxB&=d zj?#3a@2~HBJe*8Q_!|Lt(@lL;ijrIB3K^_WDaQrcilC!UKo7@>ZH=>#PVZUL)N55RCwrCh{{yq}c>prmRT<%d3NsQOI7}+H z$`*^w5HTB{XL%_?-@q|~p;2b+I$_ldK;OV1!O$qnONEQG=fTIBxV%PpOXa0nc4~+F z`|)cY>a4Y5xOIoI%F9a;dVakIJ5&IYnVcb{H50?3TKJI$UU>6UV-7Nel;vT#zaPgP zb|QLQ)LCnJGb<^I~ZP+YC=agV*wD@zwQ*yafRP28j0k9CgVzi4Qia1mY$xIGFq?VLYF%?tp z<}_B(>vU3_(AlAr)ccxgQZ0sIv33C1){Q4N20*=gm-yOd?DNICJr`Q&~=?U%lctbXF<_*oqe_xzM34bKG`ERu5=;w zR+9kOqponb-NfYh1e46vuxfYUac ziD~?J=z~qAO)-9yX!;Qo1F=N|uA&lbf!(FJEO1%(3%bzpVPRc_KIk1@%>I&_+?=^N zbN+MAoS6$*vSi7UB}DrKD$J1^)>(^GZCt4JQ83kG^uPM?^ETds90k@u_&!t4u=}u zY5U0dZRv5B(lhW20D8X8V80jN*a-1>Oy0}izeQO_<`Rpds92N1@r112ZWk{dc@%(9 zUnu|{cPWvX2ztH_u;N_>$}(cpawybo0-$DxT>^66-ip`fPk-a}`O}%nw5vdwkke;} zc%o(#@4rzCz@LR*;eY#MSs%0F_4(2Bb&j6xqqnJ@+PXq|o7&T&RFI>}(NIepTb{N6 zoa`QZ9%JNNe69z`8NEr^F7W>mqPa@Y>J~WiAEebS_*LYItJivz%&(+t47Ic|5i!`T zyQFt&l%d)u(_@uAR|psePi?J984je@?!v8dI`$Qa{Q9FRLQp3Jkln-m#10-#+XsK^ z<8gwNOxp+;2EgBffDejXVlKJBd#B$q9fN5hLoIDg$0HQjb@}d67n+$)og+;x?L<3I z0jv|Xgv6WD681X?ycq;s3{>sEp5!s$H=ofWcP4Cb)7c=81PhhgOP%%p2Eh246O5lZ zK{$~FV7B8pvmM8Ql;9;yAB?8*Ik#{J@6;#(!=S|FS~c#}EC7TPNd~Q3fRr$&W}&XC zK^V8k8Q`+4_Uwa{nEzZMri6s=#8=stS9#KZ3wwrr=Qa-$p&$fqvf;p60-)Gg!Iz&L zW8liyY%VM^6N>38O1dNhhQaKTh-;l6vZ=HjS0ag1vyfZ!3;>g%AP;L6X2Zj>%-u{Z zJ|WJX?^4n^P2aULJ5lh*fz+x4ll~E0q{@o^PXVX`!hi)B^##;vcQ@9fTP&F-LB@VsOQ2bl-F`DEv94J)>-t-*T*#Y;8>n;$_S>RVE(9sH-c1Y0 zvmhdo2>WeO)zhjMV$(EfOD3dq>42 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-01.png b/game/resources/animated/hero/hero_jump/adventurer-jump-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b20e0343c77fa6ecb46aa2cfeccfa0f8699f6427 GIT binary patch literal 1049 zcmV+!1m^pRP)izazx1zV>AS_=w^KI)u_p$@kw8d z8Z_}?I+1`ebIQV8e1SL@rB)%5O*>i`mI9@=rF306K6KO;>(f0?+D~$mbI&>Vch2|z z&iVa*P@+VM5+zEMC{d!s{{^AS(D4qpG+PZKmCP{mZ6MeG!RZqm+`C8S&rQVQqFmbn zK+E&5DOrD;5-WhS+Da;!k!Gub;~nl?e6Y$cYPpWjx2G9fSCZsURGO5T6H6@Wh-qXgeND}8}r zZjLVyWZXNQYpXYN zp_$%3me*qJEYsvrV*>yS;Sej!*${k`5H-sd<{}XQ9)00(_QS6;I8L>Qmp_^2op;~X zyA6FpW_tTrO(nS7TrP(i8wvy%jb_o_^OTGao&hKjv&r?AcADC{Mbpu4j@+v+fa(?k zNZ-;8YTvsEfY&#M|Cb+xf9gjXlXJ5A>1@J_51wIS!_5T@q;+k*r7rgY~MT|%O%1c6w%=$Of{ zjk4|8SQ1U9nKIV{Sz$J-iMIXiB64#cFJtnKS9FQdC*;;z!MoQt2EbzQcT8L6-nY-g zLO29-zp?$1Hw8eoZ4Y05dJ^xYi&QzBdbXmwM9CF{n<6d`4p8Z;W7mdc?N%C_)r7J6 zF#s0BAsVbER-@Nst@{{>wFPnRvk@gBSa+?p8Hqwad9!~USPc3}Br?>P1<_<0CO-#Y zKM(~>z>UBKYTd__)mplY40UzMts!;OZnWAchr_bi7(EWbtLML0mJC5>W?zoS^EV^% z9)`mbP1FAIjizb*n?OD2I$9^MT!A89J<{nY#^dcA(u$rM zrAKKi%7s|0R$0Zm?6$;dyd7e%%_IPJ8`HQfh*&H}w~yB&|KhI)(S z=kKnv+myyB)?|-E5K3i~dq=sDXe5F!I7fUvB>>^H-BmC?8&BXg8`R(S{|bKrE6Hcb TLPIqs00000NkvXXu0mjfd%y9w literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-02.png b/game/resources/animated/hero/hero_jump/adventurer-jump-02.png new file mode 100644 index 0000000000000000000000000000000000000000..ba27779940e0644fb74d1bfdf8d863c973b2036d GIT binary patch literal 1094 zcmV-M1iAZ(P)9&_Hb*pLGr17@BNpIHcLz6VIq9Z$3eaQFaa_%|z ze1G5b`+d(j7b>Wrf(k154lQ`Zg1OY=G(7-If~C8q^Ti*J8+XY(D$?y9!1J5 zf5M|Xf+o2|nxC8J!%t4Iy?s-mzy01W034=W8mA>0$qB*jRfIp|Geg0(M4}S~F|!># zw1@6veDE2*(0nvC1ZWLy6FraJQ#NOnoX}Sz(Ch>t6kJ<)Y6-1m%=+HLBxa&?J^2DQ zkB8w)*|Pa85u)0vMC^)=r$#j+(TT$QNOXd;Bj-!Tc6RqN5*Z@cy4jqajg`%5iIC97 zdH@Fc?quigB_h!Yygo0_elSe9v$teya_Xu87>Nu~R~Il>&vt#V#OzH07w_(EQKL|imLx2|t`pb&Rl8hwYaG`g16x#W7Bag}WvKO9D zXdvo&lVuTlCSCTzS|S8s%dvhlGCd9tKLM-+4{-ChUjcA3*KT@f4|*mooOVaqeA0zn z=-$uFf`;Ga1z>&fL5$Ddp?Tjy0OpPzBD~=i9#2jIknpV$2L}3YnAehw_+4J}=F({1cM#WbSPG}q?KhtdfR_5@EjZPzQ0r8wb*cc2*;@J3*XzYF3@M8#t+a~0QR8r|3Qp6sRo`fuhN`M%->-@xMM&No0CSm) zsBt>Y8izxCb2N_8|=8zN{kOn~on7XZ4h|G!G>w#F9m zyRHkD&BmBZ}hywXp0V{x${B9%;Xm)|A;j+`08tteno6-d7{sy3UM%AF&ss)~SN6v{_-7K$M~ zBdKJP%X9P0XS2dE3`>JAhV+bFo}0&|REz0!hF8ygFMIk5D)_hY2che3yBE_uw*UYD M07*qoM6N<$f+g)C)c^nh literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-03.png b/game/resources/animated/hero/hero_jump/adventurer-jump-03.png new file mode 100644 index 0000000000000000000000000000000000000000..0458013c8dae7ecf137a009f0de9d2dc5fb7c074 GIT binary patch literal 1019 zcmVHJ^vVQpW(c}v>cx7okus_yS(ar3JEV;Dv^i{T*}CJ!)paNe35`SSfONF=l! zfW7aWCmQKi<8np@U@|#OD7;U}X4ATOYG%Z2X%Oj!JjvU?Z<()*PbP=)cmj$ZKEwCO zbgZ90WQm~5tDH#>bK#RtJ|3JQ?FmtyS|@kT(RcSbI!3=B?FrEp8z36#=0K~dYCWb} znYc1@oeQ6J^7;5-(w?Gf;@xf^;Nxl-P9-+XO^*CP`o^R#Zo`aB$NI?@msJx0-@G>s zZyp99=nnv}IC~9%k5(%| zgQ|^Wi_4m7RHD*^+h!)0-)J$@{$l{#TTFA$vBS`han%o-j`eRjr2tVj(s%Sl!ls8? z9zDk729a5B#A>w?A0Dk%hKi~;dwL}+9OfpLR|{pKnwQei-9=`-#B9N-StrZ#=2b~? zx$NZg`Tuuny)<;We7U8Nc4q@OAE2qmBNLi?=++(Sd^S3k&`4O#U%FF5pJ=u>7Tc)aNMsJ!I0LfnUS0%aqGb{ z%WG@GE7tgSbb{u_5^jrG>~K0r7fWJ~-MHU~n*FoC{mNd&ZfX=OYb7rJG^NG|Uw;8M p_r>7Qc&+H`sH2WL>Zs%K#Gfd5Tp^4i<(B{e002ovPDHLkV1llc@^t_J literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-00.png b/game/resources/animated/hero/hero_run/adventurer-run-00.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d7cc057f4e6efed4564cae0c022f961089639c GIT binary patch literal 1073 zcmV-11kU@3P)-L~*N`~w~w_wx-vWOaAj0Tr1#<;j-qKOzD_ka(^N1x1$ z&X}lV2_{Q)VF4#B!HhU@z*x40Ez6)V7<6!9m(sy)IX>LAw!&0yZ+Wrbm)@Rp`uqOA z=llEh^b~T)A%`4t$iX_qMiZX+;2^tqRmjw_h`u0vsvm&8jUQWz>&!g0^&zql;pC6) zJX`%F0Q#&><(?`Da5p?{d1Lcz%I`np*6j&d72L-8!K(nMMJiVYh6s(`VsSAd|K;Nk z#fA!bZGVu^@-%(Xt5gNIq0j2cxzuMX*lg|-ExsH?$kr~SC)Ak_N2Quh8qsEH@Zyge1)v9?%~&S7b$(z zgDb2ub|=g$m4ZV-fv>2HLqWkcQ7F2)&s*Zk%Gd93!(jks7Ilifssy-RI{?7G-8=dI z{b2xJetZwSWbWnAcQ>hPX%I!v9kIk|tB|z>oVj5NC^^=_NT{8O;Y-Q&k6q|7#XP{7 z8v~-LzuywKtvxceI7g|sP!@aDq=523fN@PrTeo#{DU;zT$^(Jqx=dk$V4#(ATw%W^(;IwIr58P~L=fN@Qupt)7J zVa z&){|!1JJt?GzVSgOUZ*>pZuj0=e-HB!?;aTo3(>5fvnv}T2D=<^+p1T@=Bopo)kCZ zZhFslXT-N5_mQ9Po0leC*Ma4lZ`x47VEEdbS*=-l{*;_B-_4(N6HDpRT34nkj4wxdQmg3?G zuQ`7Cx4w*dv*L)7pD#BB0=!dE#14OcTC$J0T>_xg<)E#*&lVAo1tBrRNPR16%lye? zzd3gWpVJ9hIKOOfcBi7qc}+tqiYWB^Y5KM^ZNBC7?{-s~ymkki*EB{KBDfrRgtR%k r!#@Ou!00000NkvXXu0mjf3}y^* literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-01.png b/game/resources/animated/hero/hero_run/adventurer-run-01.png new file mode 100644 index 0000000000000000000000000000000000000000..96d832012e63466c4cfc2b9e5b864f7af21b1e72 GIT binary patch literal 1043 zcmV+u1nm2XP)2%@jT z9`t2H%IuT4maPSmLF4|wS~9H8Qm|=8m&G(IH~o{`n_eH%dw08vy4<7%$rmo1^SkHX z-|ut&p96K(Raaeg)m0Z_JDlG5>J!tMU()g-sDuD`sqfQ@{wcW+>&Z3v{V<(}+X2uP zG@kE>nE-!g9#mYhTLyBb_W*#IzPCcGt(Eb~DLN0gql6WHnMk076#$b8dr3nTV|^mU z+FH>TG&}E1SE4NeIn#T9VxhFjo=DCyJ~?Hl-KeG@cY98fiNDPoN1O2aJZAdd3cY$O ziR2tgSmE@yw}^M0qVtsq@vc)gR3)nFtToi#O-o=mK99_9Uy$swMq@xR!|yF~{mxyk zOuokc8`qd^D%an~AD!Ot{rPJ%;)4%AugJG+kfH8wJ6+Iqe6noDn)ceZk?9Gds>)B# z9Rgraq=n$+Apnj)+W~KS07zV%p?jc5gkRkV_g__wS<7A%e6ma`mm`(S5mi+HqN+-< zZxF^lV^5@o`AnME*WZmyPjH+L0AfvhsT2aL08-F(;ge-EmCM;S3&OHBQ*H@Msm9fE zIaEfbC)|brQ~@MkD3HnL?R->K9|4@bB34(k;ApjlY?4sVSpZU(&Jjg*8v;-TkQH6G z(@qH1$DiNdX#SBL24Fsu1|Waw9E&UE??UgEq2%E~SL3x>E4%PX5~*Cy^huH^7{;ao z^O-d7y#M7U`_+qI5d7^jQtLri0k{U~zkS=8-B7FFtY-218-a3{`a8{M((DI}xnEty zQPaJa)vW^YuYndO6JwjoEM$}Dr8OaY+^x-9vT2O3wE-|XcmaTB#|+jiOG2iB{_nLe N002ovPDHLkV1oY={2u@S literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-02.png b/game/resources/animated/hero/hero_run/adventurer-run-02.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3b74df0890213dc31ab88d93038a14e31daed2 GIT binary patch literal 963 zcmV;!13dhRP) z<(}{RpYNRWoqM57nKEU{lqpl@u0xdC;is?fXM5W=nQu#|ap7<|0qB19h@pNhg@?92 zhYqv?$mLW<41M)GiFksO-<+YRqa6TsQN_E%CjsUobA|_YLs6prAH){Z65#sG4e4vz z%$2|x0InJr!BK^&$?GJO3At`3>rgTwIebl<^{cw5>h}D$5lk2IaC^1hKK{fml&NX` zUYVNKGm~#OLcwd~%idlI;Hz!cZ3{_NY_humsM(#A4YlJ8olG%bjodPG8-;0lI@&q- zfu9#Y`-DUH{=&e`J#cZ*a2y2-xut2M(rT4wCq{MK-mN?IxxV<39iD>52lo*Hyvg5~ zB*vA%7`>rE&i4qQi}Niokm(g%xN0blg16s+?ru_=CILKdw{G{NbY)*Sm!a;pZc+32K|^sAEaX^cCx9*_7hq0QzKCGR&n{-O z&-29Oc=Ot|JHGvjN{dB=qfx9C6#^g}jp~6u`~2GkLw;IQVVr&aIQ#kuZ(8QZ`&;q2 z-FVz?>@8ah8dTFOyMJQkU$x=PTaW7PU}X!>?0+E}$feWbmE#{9_G7w`!BgiXK!@*X z-8OvUD8G&=0C;cxLAA}wWAA^@@QI`JzkAqFOrZdBA36{_`W^@Yg>T6taF67vAJ={pH@W?%q$#{aRDn-pij#6yD z@;7+Nz3ouqa7oPiQL)T?#UuuA+70S{AfS@n&4fe+Rv^+Y2DKI2|md)8fP7KvDWF lSsnQ=t7}Gb2L|)5<{u@>Infw4#AN^g002ovPDHLkV1mT5)A0ZR literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_run/adventurer-run-03.png b/game/resources/animated/hero/hero_run/adventurer-run-03.png new file mode 100644 index 0000000000000000000000000000000000000000..a512930ec81d583aac03630d3d9fa7e4441facf0 GIT binary patch literal 1140 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 Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 017/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++ core/event/management/controller/Jump.cpp | 15 ++++ core/event/management/controller/Jump.hpp | 25 ++++++ core/event/management/controller/Run.cpp | 21 +++++ core/event/management/controller/Run.hpp | 29 +++++++ core/loader/LevelLoaderFromFile.cpp | 37 +++++---- game/mobs/hero/Hero.cpp | 98 +++-------------------- game/mobs/hero/Hero.hpp | 1 - 10 files changed, 145 insertions(+), 109 deletions(-) create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e5e0a8a..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 9276a96..0b1443d 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -10,7 +10,8 @@ namespace mad::core { - LevelLoaderFromFile::LevelLoaderFromFile(const std::filesystem::path &path) : m_level_directory(path) { + LevelLoaderFromFile::LevelLoaderFromFile(const std::filesystem::path &path) : m_level_directory(path), + m_level_map(path / "map") { std::ifstream input_config(path / "config.json"); CHECK_THROW(input_config, FileDoesNotExist, "Config file does not exist"); CHECK_THROW(m_level_map, FileDoesNotExist, "Map file does not exist"); @@ -162,25 +163,23 @@ namespace mad::core { image_storage = std::make_shared( std::unordered_map>( {{ImageStorage::TypeAction::Idle, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], - m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) - }, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"])}, {ImageStorage::TypeAction::Run, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], - m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }} - ) - ); + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"])}})); hero_id = world->create_physical_entity( 0, diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index dcee27d..8407ce7 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,12 +5,9 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Fall.hpp" -#include "event/management/controller/FlyUp.hpp" -#include "event/management/controller/GroundMovement.hpp" -#include "event/management/controller/JumpImpulse.hpp" -#include "event/management/controller/Movement.hpp" -#include "event/management/controller/StartJump.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -39,36 +36,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }, - {ImageStorage::TypeAction::Jump, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) - }, - {ImageStorage::TypeAction::Fly_up, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) - }, - {ImageStorage::TypeAction::Fall, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], - m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -95,21 +62,10 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - - + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -119,43 +75,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - - machine->add_transition(3, 5, std::make_shared()); - machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - - float t = 1; - - machine->add_transition(4, 8, std::make_shared(t)); - machine->add_transition(5, 8, std::make_shared(t)); - machine->add_transition(6, 8, std::make_shared(t)); - - machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(7, 11, std::make_shared(t)); - machine->add_transition(8, 11, std::make_shared(t)); - machine->add_transition(9, 11, std::make_shared(t)); - - machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(10, 0, std::make_shared(t)); - machine->add_transition(11, 0, std::make_shared(t)); - machine->add_transition(12, 0, std::make_shared(t)); - - - - - - - + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index 70c3953..d8795df 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,7 +17,6 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; - float horizontal_velocity = 81; }; }// namespace mad::core From dbb1e769bf7e33ccc376aaf41321ecccaf6a1209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 018/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- game/mobs/hero/Hero.cpp | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From 863ee184a6ae73e1f6206660e4deaf2f10a64074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 019/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ------ core/event/management/controller/Jump.cpp | 15 ---- core/event/management/controller/Jump.hpp | 25 ------ core/event/management/controller/Run.cpp | 25 ------ core/event/management/controller/Run.hpp | 29 ------- game/mobs/hero/Hero.cpp | 98 ++++++++++++++++++++--- game/mobs/hero/Hero.hpp | 1 + 9 files changed, 90 insertions(+), 136 deletions(-) delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp delete mode 100644 core/event/management/controller/Jump.cpp delete mode 100644 core/event/management/controller/Jump.hpp delete mode 100644 core/event/management/controller/Run.cpp delete mode 100644 core/event/management/controller/Run.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp deleted file mode 100644 index 9e5dd5a..0000000 --- a/core/event/management/controller/Jump.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "Jump.hpp" -#include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { -} -void mad::core::Jump::control() { - - auto impulse = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); - }); - }; - - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); -} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp deleted file mode 100644 index 25d5cf1..0000000 --- a/core/event/management/controller/Jump.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP - -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" -namespace mad::core { - - class Jump : public Controller { - public: - - explicit Jump(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - std::shared_ptr key; - - }; - -} - -#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp deleted file mode 100644 index 07ed05c..0000000 --- a/core/event/management/controller/Run.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" - -namespace mad::core { - - class Run : public Controller { - public: - enum class Direction { - Right, - Left, - }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - Direction dir; - PhysicalEntity* m_entity; - - }; - -} - -#endif//MAD_RUN_HPP diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core From 8d5043b742b2f7c91f9dd183860a69c69f276397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 020/121] create Hero 2.0 --- core/event/management/controller/Idle.cpp | 6 +++++ core/event/management/controller/Idle.hpp | 20 ++++++++++++++++ core/event/management/controller/Jump.cpp | 15 ++++++++++++ core/event/management/controller/Jump.hpp | 25 +++++++++++++++++++ core/event/management/controller/Run.cpp | 21 ++++++++++++++++ core/event/management/controller/Run.hpp | 29 +++++++++++++++++++++++ 6 files changed, 116 insertions(+) create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP From c5ed894daf7ff80ac8aa97e6ffd572ca79a1c05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 021/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 +- core/event/management/controller/Idle.hpp | 7 +- core/event/management/controller/Run.cpp | 6 +- core/event/management/controller/Run.hpp | 6 +- game/mobs/hero/Hero.cpp | 89 ++--------------------- 5 files changed, 24 insertions(+), 90 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index dcee27d..c6ca448 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -39,36 +39,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }, - {ImageStorage::TypeAction::Jump, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) - }, - {ImageStorage::TypeAction::Fly_up, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) - }, - {ImageStorage::TypeAction::Fall, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], - m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], - m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -95,21 +65,10 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - - + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -119,43 +78,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - - machine->add_transition(3, 5, std::make_shared()); - machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - - float t = 1; - - machine->add_transition(4, 8, std::make_shared(t)); - machine->add_transition(5, 8, std::make_shared(t)); - machine->add_transition(6, 8, std::make_shared(t)); - - machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(7, 11, std::make_shared(t)); - machine->add_transition(8, 11, std::make_shared(t)); - machine->add_transition(9, 11, std::make_shared(t)); - - machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(10, 0, std::make_shared(t)); - machine->add_transition(11, 0, std::make_shared(t)); - machine->add_transition(12, 0, std::make_shared(t)); - - - - - - - + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); machine->set_initial_state(0); controllers.push_back(machine); } From b84ebde06f3d1344ffcda5f38ffebaff8eccf062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 022/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 8 --- core/event/management/controller/Idle.hpp | 23 --------- core/event/management/controller/Jump.cpp | 15 ------ core/event/management/controller/Jump.hpp | 25 ---------- core/event/management/controller/Run.cpp | 25 ---------- core/event/management/controller/Run.hpp | 29 ----------- game/mobs/hero/Hero.cpp | 59 ++++++++++++++++++++--- 7 files changed, 52 insertions(+), 132 deletions(-) delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp delete mode 100644 core/event/management/controller/Jump.cpp delete mode 100644 core/event/management/controller/Jump.hpp delete mode 100644 core/event/management/controller/Run.cpp delete mode 100644 core/event/management/controller/Run.hpp diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp deleted file mode 100644 index 9e5dd5a..0000000 --- a/core/event/management/controller/Jump.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "Jump.hpp" -#include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { -} -void mad::core::Jump::control() { - - auto impulse = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); - }); - }; - - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); -} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp deleted file mode 100644 index 25d5cf1..0000000 --- a/core/event/management/controller/Jump.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP - -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" -namespace mad::core { - - class Jump : public Controller { - public: - - explicit Jump(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - std::shared_ptr key; - - }; - -} - -#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp deleted file mode 100644 index 07ed05c..0000000 --- a/core/event/management/controller/Run.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" - -namespace mad::core { - - class Run : public Controller { - public: - enum class Direction { - Right, - Left, - }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - Direction dir; - PhysicalEntity* m_entity; - - }; - -} - -#endif//MAD_RUN_HPP diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index c6ca448..9385d06 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -65,10 +65,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -78,9 +89,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } From 6774b46aa9fc4b075fc2695e794de05a05904fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 21:35:29 +0300 Subject: [PATCH 023/121] create Hero 2.0 --- core/CMakeLists.txt | 2 +- core/event/management/controller/Idle.cpp | 6 ++ core/event/management/controller/Idle.hpp | 20 +++++++ core/event/management/controller/Jump.cpp | 15 +++++ core/event/management/controller/Jump.hpp | 25 +++++++++ core/event/management/controller/Run.cpp | 21 +++++++ core/event/management/controller/Run.hpp | 29 ++++++++++ core/loader/LevelLoaderFromFile.cpp | 20 +++---- game/mobs/hero/Hero.cpp | 68 ++++------------------- game/mobs/hero/Hero.hpp | 1 - 10 files changed, 136 insertions(+), 71 deletions(-) create mode 100644 core/event/management/controller/Idle.cpp create mode 100644 core/event/management/controller/Idle.hpp create mode 100644 core/event/management/controller/Jump.cpp create mode 100644 core/event/management/controller/Jump.hpp create mode 100644 core/event/management/controller/Run.cpp create mode 100644 core/event/management/controller/Run.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e5e0a8a..a8995e7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp new file mode 100644 index 0000000..f3ef8dd --- /dev/null +++ b/core/event/management/controller/Idle.cpp @@ -0,0 +1,6 @@ +#include "Idle.hpp" +mad::core::Idle::Idle() { +} +void mad::core::Idle::control() { + +} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/core/event/management/controller/Idle.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_IDLE_HPP +#define MAD_IDLE_HPP +#include "Controller.hpp" + +namespace mad::core { + + class Idle : public Controller { + public: + explicit Idle(); + + void control() override; + + private: + + }; + +} + + +#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp new file mode 100644 index 0000000..9e5dd5a --- /dev/null +++ b/core/event/management/controller/Jump.cpp @@ -0,0 +1,15 @@ +#include "Jump.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +} +void mad::core::Jump::control() { + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); +} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp new file mode 100644 index 0000000..25d5cf1 --- /dev/null +++ b/core/event/management/controller/Jump.hpp @@ -0,0 +1,25 @@ +#ifndef MAD_JUMP_HPP +#define MAD_JUMP_HPP + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" +namespace mad::core { + + class Jump : public Controller { + public: + + explicit Jump(std::shared_ptr world, Entity::Id entity_id); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + + }; + +} + +#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp new file mode 100644 index 0000000..3fe6107 --- /dev/null +++ b/core/event/management/controller/Run.cpp @@ -0,0 +1,21 @@ +#include "Run.hpp" +#include "world/intent/LambdaIntent.hpp" +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +} +void mad::core::Run::control() { + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + //SPDLOG_DEBUG("controller 2"); + if(dir == Direction::Right){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + else if(dir == Direction::Left){ + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + +} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp new file mode 100644 index 0000000..00c03e5 --- /dev/null +++ b/core/event/management/controller/Run.hpp @@ -0,0 +1,29 @@ +#ifndef MAD_RUN_HPP +#define MAD_RUN_HPP +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Run : public Controller { + public: + enum class Direction { + Right, + Left, + }; + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + + void control() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + std::shared_ptr key; + Direction dir; + + }; + +} + +#endif//MAD_RUN_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 0b1443d..9ce3747 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -28,10 +28,6 @@ namespace mad::core { m_config_json["camera"]["position"]["y"]}; auto camera = std::make_shared(camera_position, world); - controllers = {std::make_shared( - camera)}; - - Entity::Id hero_id = create_world(world); camera->turn_on(*level_dispatcher, hero_id); @@ -63,7 +59,7 @@ namespace mad::core { machine->set_initial_state(0); std::vector> controllers{machine, std::make_shared( - camera)};*/ + camera)}; auto level_runner = std::make_unique( system_listener, @@ -72,7 +68,8 @@ namespace mad::core { global_dispatcher, level_dispatcher, world, - controllers); + controllers + ); level_dispatcher->registry(std::make_shared(*level_runner)); level_dispatcher->registry(std::make_shared(*level_runner)); @@ -81,14 +78,13 @@ namespace mad::core { } Entity::Id LevelLoaderFromFile::create_world(std::shared_ptr world) { - m_level_map = std::ifstream(m_level_directory / "map"); float object_size = m_config_json["block"]; float current_position_x = object_size / 2; float current_position_y = object_size / 2; Entity::Id hero_id = 0; std::string map_line; while (std::getline(m_level_map, map_line)) { - for (char object : map_line) { + for (char object: map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, @@ -142,14 +138,16 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile)}})); + StaticImage::TransformType::Tile) + }})); Entity::Id square_id = world->create_physical_entity( 0, position, 0, image_storage, - is_stable); + is_stable + ); } Entity::Id LevelLoaderFromFile::create_hero(std::shared_ptr world, Vec2d position) { @@ -191,4 +189,4 @@ namespace mad::core { return hero_id; } -}// namespace mad::core \ No newline at end of file +} \ No newline at end of file diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 9385d06..8407ce7 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,12 +5,9 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Fall.hpp" -#include "event/management/controller/FlyUp.hpp" -#include "event/management/controller/GroundMovement.hpp" -#include "event/management/controller/JumpImpulse.hpp" -#include "event/management/controller/Movement.hpp" -#include "event/management/controller/StartJump.hpp" +#include "event/management/controller/Idle.hpp" +#include "event/management/controller/Jump.hpp" +#include "event/management/controller/Run.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -65,21 +62,10 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - - + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); + machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); + machine->add_state(std::make_shared(world, hero_id)); machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -89,43 +75,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - - machine->add_transition(3, 5, std::make_shared()); - machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - - float t = 1; - - machine->add_transition(4, 8, std::make_shared(t)); - machine->add_transition(5, 8, std::make_shared(t)); - machine->add_transition(6, 8, std::make_shared(t)); - - machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(7, 11, std::make_shared(t)); - machine->add_transition(8, 11, std::make_shared(t)); - machine->add_transition(9, 11, std::make_shared(t)); - - machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - - machine->add_transition(10, 0, std::make_shared(t)); - machine->add_transition(11, 0, std::make_shared(t)); - machine->add_transition(12, 0, std::make_shared(t)); - - - - - - - + machine->add_transition(3, 0, std::make_shared(machine, 0)); + machine->add_transition(3, 1, std::make_shared(machine, 1)); + machine->add_transition(3, 2, std::make_shared(machine, 2)); machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index 70c3953..d8795df 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,7 +17,6 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; - float horizontal_velocity = 81; }; }// namespace mad::core From 5e9695828d16ff5f44dba36ef7735b36594bad55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 14 May 2022 22:04:45 +0300 Subject: [PATCH 024/121] set animations in statemachine --- core/event/management/controller/Idle.cpp | 6 ++++-- core/event/management/controller/Idle.hpp | 7 +++++-- core/event/management/controller/Run.cpp | 6 +++++- core/event/management/controller/Run.hpp | 6 +++--- game/mobs/hero/Hero.cpp | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp index f3ef8dd..282c2ba 100644 --- a/core/event/management/controller/Idle.cpp +++ b/core/event/management/controller/Idle.cpp @@ -1,6 +1,8 @@ #include "Idle.hpp" -mad::core::Idle::Idle() { +mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } -void mad::core::Idle::control() { +void mad::core::Idle::control() { + m_entity->set_action(ImageStorage::TypeAction::Idle); } diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp index e7ea1ff..fa94200 100644 --- a/core/event/management/controller/Idle.hpp +++ b/core/event/management/controller/Idle.hpp @@ -1,17 +1,20 @@ #ifndef MAD_IDLE_HPP #define MAD_IDLE_HPP #include "Controller.hpp" +#include "world/LocalWorld.hpp" namespace mad::core { class Idle : public Controller { public: - explicit Idle(); + explicit Idle(std::shared_ptr world, Entity::Id entity_id); void control() override; private: - + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp index 3fe6107..c8cfd7b 100644 --- a/core/event/management/controller/Run.cpp +++ b/core/event/management/controller/Run.cpp @@ -1,6 +1,8 @@ #include "Run.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ +#include +mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } void mad::core::Run::control() { @@ -11,6 +13,7 @@ void mad::core::Run::control() { }); }; //SPDLOG_DEBUG("controller 2"); + m_entity->set_action(ImageStorage::TypeAction::Run); if(dir == Direction::Right){ m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); } @@ -18,4 +21,5 @@ void mad::core::Run::control() { m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); } + } diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp index 00c03e5..07ed05c 100644 --- a/core/event/management/controller/Run.hpp +++ b/core/event/management/controller/Run.hpp @@ -12,15 +12,15 @@ namespace mad::core { Right, Left, }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); + explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); void control() override; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id m_entity_id; - std::shared_ptr key; Direction dir; + PhysicalEntity* m_entity; }; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 8407ce7..379854a 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -62,7 +62,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared()); + machine->add_state(std::make_shared(world, hero_id)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); machine->add_state(std::make_shared(world, hero_id)); From 32ecd069026ae5ae9116b3febe615e50f87b99aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:01:08 +0300 Subject: [PATCH 025/121] set animations in statemachine --- core/CMakeLists.txt | 2 +- core/event/management/controller/Idle.cpp | 8 -- core/event/management/controller/Idle.hpp | 23 ------ core/event/management/controller/Jump.cpp | 15 ---- core/event/management/controller/Jump.hpp | 25 ------ core/event/management/controller/Run.cpp | 25 ------ core/event/management/controller/Run.hpp | 29 ------- game/mobs/hero/Hero.cpp | 98 ++++++++++++++++++++--- game/mobs/hero/Hero.hpp | 1 + 9 files changed, 90 insertions(+), 136 deletions(-) delete mode 100644 core/event/management/controller/Idle.cpp delete mode 100644 core/event/management/controller/Idle.hpp delete mode 100644 core/event/management/controller/Jump.cpp delete mode 100644 core/event/management/controller/Jump.hpp delete mode 100644 core/event/management/controller/Run.cpp delete mode 100644 core/event/management/controller/Run.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a8995e7..e5e0a8a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -82,7 +82,7 @@ set( visual/image/storage/ImageStorage.cpp visual/image/storage/ImageStorage.hpp visual/Renderable.hpp visual/Camera.cpp visual/Camera.hpp - event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/controller/Idle.hpp event/management/controller/Idle.cpp event/management/controller/Run.hpp event/management/controller/Run.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/Jump.hpp event/management/controller/Jump.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp) + event/management/condition/TrueCondition.hpp event/management/condition/TrueCondition.cpp event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Idle.cpp b/core/event/management/controller/Idle.cpp deleted file mode 100644 index 282c2ba..0000000 --- a/core/event/management/controller/Idle.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "Idle.hpp" -mad::core::Idle::Idle(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} - -void mad::core::Idle::control() { - m_entity->set_action(ImageStorage::TypeAction::Idle); -} diff --git a/core/event/management/controller/Idle.hpp b/core/event/management/controller/Idle.hpp deleted file mode 100644 index fa94200..0000000 --- a/core/event/management/controller/Idle.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MAD_IDLE_HPP -#define MAD_IDLE_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" - -namespace mad::core { - - class Idle : public Controller { - public: - explicit Idle(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - PhysicalEntity* m_entity; - }; - -} - - -#endif//MAD_IDLE_HPP diff --git a/core/event/management/controller/Jump.cpp b/core/event/management/controller/Jump.cpp deleted file mode 100644 index 9e5dd5a..0000000 --- a/core/event/management/controller/Jump.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "Jump.hpp" -#include "world/intent/LambdaIntent.hpp" -mad::core::Jump::Jump(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { -} -void mad::core::Jump::control() { - - auto impulse = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); - }); - }; - - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); -} diff --git a/core/event/management/controller/Jump.hpp b/core/event/management/controller/Jump.hpp deleted file mode 100644 index 25d5cf1..0000000 --- a/core/event/management/controller/Jump.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MAD_JUMP_HPP -#define MAD_JUMP_HPP - -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" -namespace mad::core { - - class Jump : public Controller { - public: - - explicit Jump(std::shared_ptr world, Entity::Id entity_id); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - std::shared_ptr key; - - }; - -} - -#endif//MAD_JUMP_HPP diff --git a/core/event/management/controller/Run.cpp b/core/event/management/controller/Run.cpp deleted file mode 100644 index c8cfd7b..0000000 --- a/core/event/management/controller/Run.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "Run.hpp" -#include "world/intent/LambdaIntent.hpp" -#include -mad::core::Run::Run(std::shared_ptr world, Entity::Id entity_id, Direction dir) : m_world(world), m_entity_id(entity_id), dir(dir){ - m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); -} -void mad::core::Run::control() { - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - //SPDLOG_DEBUG("controller 2"); - m_entity->set_action(ImageStorage::TypeAction::Run); - if(dir == Direction::Right){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - else if(dir == Direction::Left){ - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - - -} diff --git a/core/event/management/controller/Run.hpp b/core/event/management/controller/Run.hpp deleted file mode 100644 index 07ed05c..0000000 --- a/core/event/management/controller/Run.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef MAD_RUN_HPP -#define MAD_RUN_HPP -#include "Controller.hpp" -#include "world/LocalWorld.hpp" -#include "world/World.hpp" - -namespace mad::core { - - class Run : public Controller { - public: - enum class Direction { - Right, - Left, - }; - explicit Run(std::shared_ptr world, Entity::Id entity_id, Direction dir); - - void control() override; - - private: - std::shared_ptr m_world; - Entity::Id m_entity_id; - Direction dir; - PhysicalEntity* m_entity; - - }; - -} - -#endif//MAD_RUN_HPP diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 379854a..dcee27d 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,9 +5,12 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/Idle.hpp" -#include "event/management/controller/Jump.hpp" -#include "event/management/controller/Run.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_config_json, std::shared_ptr level_dispatcher, std::vector> &controllers) : level_dispatcher(level_dispatcher){ std::filesystem::path source(m_config_json["animated_resources"]); @@ -36,6 +39,36 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) + }, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) + }, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], + m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], + m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], + m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) }} ) ); @@ -62,10 +95,21 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Right)); - machine->add_state(std::make_shared(world, hero_id, Run::Direction::Left)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + + machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); @@ -75,9 +119,43 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(3, 0, std::make_shared(machine, 0)); - machine->add_transition(3, 1, std::make_shared(machine, 1)); - machine->add_transition(3, 2, std::make_shared(machine, 2)); + + machine->add_transition(3, 5, std::make_shared()); + machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); + + float t = 1; + + machine->add_transition(4, 8, std::make_shared(t)); + machine->add_transition(5, 8, std::make_shared(t)); + machine->add_transition(6, 8, std::make_shared(t)); + + machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(7, 11, std::make_shared(t)); + machine->add_transition(8, 11, std::make_shared(t)); + machine->add_transition(9, 11, std::make_shared(t)); + + machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(10, 0, std::make_shared(t)); + machine->add_transition(11, 0, std::make_shared(t)); + machine->add_transition(12, 0, std::make_shared(t)); + + + + + + + machine->set_initial_state(0); controllers.push_back(machine); } diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index d8795df..70c3953 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -17,6 +17,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; int last_pressed_key; + float horizontal_velocity = 81; }; }// namespace mad::core From 3860f6ad71eee85a08413fa9790176f9fe31f047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 17:51:00 +0300 Subject: [PATCH 026/121] ? --- core/event/management/controller/Movement.cpp | 2 ++ .../image/animated/RenderableAnimatedSeveralFiles.cpp | 2 +- core/world/entity/PhysicalEntity.cpp | 2 +- game/mobs/hero/Hero.cpp | 7 +------ game/resources/levels/level_01/config.json | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp index a580c78..53d6cea 100644 --- a/core/event/management/controller/Movement.cpp +++ b/core/event/management/controller/Movement.cpp @@ -13,9 +13,11 @@ void mad::core::Movement::control() { if(dir == Direction::Right || dir == Direction::Left){ m_entity->set_action(Move_animation); if(dir == Direction::Right){ + m_entity->flip_over(Image::Orientation::Right); m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(velocity)); } else if(dir == Direction::Left){ + m_entity->flip_over(Image::Orientation::Left); m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(-velocity)); } } diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp index f53e098..7f63794 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp @@ -22,7 +22,7 @@ namespace mad::core { m_textures.push_back(texture); } - std::reverse(m_textures.begin(), m_textures.end()); + //std::reverse(m_textures.begin(), m_textures.end()); auto [texture_width, texture_height] = m_textures[0].getSize(); diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 6f94482..478df92 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,7 +37,7 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 0.0f; + fixtureDef.friction = 50.0f; fixtureDef.restitution = 0.0f; body->SetLinearDamping(0.0000000001); body->SetAngularDamping(0); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index dcee27d..dc26bfb 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -23,7 +23,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {{ImageStorage::TypeAction::Idle, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], - m_config_json["hero"]["animated"]["actions"]["idle"]["count_files"], m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], @@ -33,7 +32,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Run, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], - m_config_json["hero"]["animated"]["actions"]["run"]["count_files"], m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], @@ -43,7 +41,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Jump, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - m_config_json["hero"]["animated"]["actions"]["jump"]["count_files"], m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], @@ -53,7 +50,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Fly_up, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["count_files"], m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], @@ -63,7 +59,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ {ImageStorage::TypeAction::Fall, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], - m_config_json["hero"]["animated"]["actions"]["fall"]["count_files"], m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], @@ -126,7 +121,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - float t = 1; + float t = 2; machine->add_transition(4, 8, std::make_shared(t)); machine->add_transition(5, 8, std::make_shared(t)); diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 29f0003..31d26c9 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -44,7 +44,7 @@ "type": "several_files", "width_scale": 1, "height_scale": 1, - "delta_time": 250, + "delta_time": 500, "size_width": 100, "size_height": 74, "count_files": 4 From 699b2cbec7f349ebcb879189e689e39acf6a8d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 15 May 2022 19:47:14 +0300 Subject: [PATCH 027/121] ? --- core/loader/LevelLoaderFromFile.cpp | 2 ++ .../animated/RenderableAnimatedSeveralFiles.cpp | 14 +++++++++----- game/resources/levels/level_01/config.json | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 1806a23..9471e94 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -65,6 +65,8 @@ namespace mad::core { std::make_shared( camera)};*/ + camera->set_zoom(0.2); + auto level_runner = std::make_unique( system_listener, std::make_unique(), diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp index 50fee8b..e7d2386 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp @@ -29,6 +29,8 @@ namespace mad::core { m_textures.push_back(texture); } + m_current_frame = m_textures.size(); + //std::reverse(m_textures.begin(), m_textures.end()); auto [texture_width, texture_height] = m_textures[0].getSize(); @@ -38,8 +40,8 @@ namespace mad::core { } void RenderableAnimatedSeveralFiles::render(sf::RenderWindow &window){ - if (m_clock.getElapsedTime().asMilliseconds() >= m_delta_time) { - update_frame(); + if (m_current_frame == m_textures.size()) { + m_current_frame = 0; m_clock.restart(); } @@ -61,13 +63,15 @@ namespace mad::core { render_sprite.setRotation(*m_rotation); window.draw(render_sprite); + + if (m_clock.getElapsedTime().asMilliseconds() >= m_delta_time) { + update_frame(); + m_clock.restart(); + } } void RenderableAnimatedSeveralFiles::update_frame() { m_current_frame += 1; - if (m_current_frame == m_textures.size()) { - m_current_frame = 0; - } } } diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 31d26c9..0ca99fe 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -1,7 +1,7 @@ { "name" : "level_01", "animated_resources" : "../../game/resources/animated/", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, From 7ba72f60b1e4cf33956ea688ebba793525d7dacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Mon, 16 May 2022 14:17:54 +0300 Subject: [PATCH 028/121] set normal jump animations --- core/CMakeLists.txt | 2 +- .../condition/EndAnimationCondition.cpp | 15 ++++++++++++ .../condition/EndAnimationCondition.hpp | 21 ++++++++++++++++ .../management/controller/JumpImpulse.cpp | 4 ++-- .../management/controller/JumpImpulse.hpp | 3 ++- core/event/management/controller/Movement.cpp | 4 ++-- core/loader/LevelLoaderFromFile.cpp | 4 ++-- core/world/entity/PhysicalEntity.cpp | 4 ++-- game/mobs/hero/Hero.cpp | 24 ++++++++++--------- game/mobs/hero/Hero.hpp | 4 ++-- game/resources/levels/level_01/config.json | 24 +++++++++---------- 11 files changed, 74 insertions(+), 35 deletions(-) create mode 100644 core/event/management/condition/EndAnimationCondition.cpp create mode 100644 core/event/management/condition/EndAnimationCondition.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 5144cc1..7f98b59 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -89,7 +89,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/EndAnimationCondition.cpp b/core/event/management/condition/EndAnimationCondition.cpp new file mode 100644 index 0000000..309397e --- /dev/null +++ b/core/event/management/condition/EndAnimationCondition.cpp @@ -0,0 +1,15 @@ +#include "EndAnimationCondition.hpp" +#include "common/Cast.hpp" +#include +mad::core::EndAnimationCondition::EndAnimationCondition(Entity::Id m_entity_id, ImageStorage::TypeAction m_type_action) : m_entity_id(m_entity_id), m_type_action(m_type_action){ +} +bool mad::core::EndAnimationCondition::is_triggered_by(const mad::core::Event &event) { + auto e = const_cast_to(event); + return m_entity_id == e.get_entity_id() && m_type_action == e.get_type_action(); +} +std::unordered_set mad::core::EndAnimationCondition::triggers() { + return {mad::core::Event::Type::EndOfRenderAction}; +} +void mad::core::EndAnimationCondition::on_start() { + +} diff --git a/core/event/management/condition/EndAnimationCondition.hpp b/core/event/management/condition/EndAnimationCondition.hpp new file mode 100644 index 0000000..cc930f5 --- /dev/null +++ b/core/event/management/condition/EndAnimationCondition.hpp @@ -0,0 +1,21 @@ +#ifndef MAD_ENDANIMATIONCONDITION_HPP +#define MAD_ENDANIMATIONCONDITION_HPP + +#include "Condition.hpp" +#include "visual/image/storage/ImageStorage.hpp" +#include "world/entity/Entity.hpp" +namespace mad::core { + struct EndAnimationCondition : Condition { + public: + explicit EndAnimationCondition(Entity::Id m_entity_id, ImageStorage::TypeAction m_type_action); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + Entity::Id m_entity_id; + ImageStorage::TypeAction m_type_action; + }; +}// namespace mad::core + +#endif//MAD_ENDANIMATIONCONDITION_HPP diff --git a/core/event/management/controller/JumpImpulse.cpp b/core/event/management/controller/JumpImpulse.cpp index 6ffc28d..8ef771f 100644 --- a/core/event/management/controller/JumpImpulse.cpp +++ b/core/event/management/controller/JumpImpulse.cpp @@ -1,6 +1,6 @@ #include "JumpImpulse.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::JumpImpulse::JumpImpulse(std::shared_ptr world, Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +mad::core::JumpImpulse::JumpImpulse(std::shared_ptr world, Entity::Id entity_id, float m_impulse) : m_world(world), m_entity_id(entity_id), m_impulse(m_impulse) { } void mad::core::JumpImpulse::control() { @@ -11,5 +11,5 @@ void mad::core::JumpImpulse::control() { }); }; - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -2000000.0f})); + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -m_impulse})); } diff --git a/core/event/management/controller/JumpImpulse.hpp b/core/event/management/controller/JumpImpulse.hpp index 5e69a29..4d3a654 100644 --- a/core/event/management/controller/JumpImpulse.hpp +++ b/core/event/management/controller/JumpImpulse.hpp @@ -9,7 +9,7 @@ namespace mad::core { class JumpImpulse : public Controller { public: - explicit JumpImpulse(std::shared_ptr world, Entity::Id entity_id); + explicit JumpImpulse(std::shared_ptr world, Entity::Id entity_id, float m_impulse); void control() override; @@ -17,6 +17,7 @@ namespace mad::core { std::shared_ptr m_world; Entity::Id m_entity_id; std::shared_ptr key; + float m_impulse; }; diff --git a/core/event/management/controller/Movement.cpp b/core/event/management/controller/Movement.cpp index 53d6cea..ec235af 100644 --- a/core/event/management/controller/Movement.cpp +++ b/core/event/management/controller/Movement.cpp @@ -24,6 +24,6 @@ void mad::core::Movement::control() { else if(dir == Direction::Idle){ m_entity->set_action(Idle_animation); } - - + float k = 0.8; + m_world->manipulate_entity_id(m_entity_id, set_horizontal_velocity(m_entity->get_linear_velocity().get_x() * k)); } diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 9471e94..186c146 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -65,7 +65,7 @@ namespace mad::core { std::make_shared( camera)};*/ - camera->set_zoom(0.2); + camera->set_zoom(0.07); auto level_runner = std::make_unique( system_listener, @@ -143,7 +143,7 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile)}})); + StaticImage::TransformType::Fit)}})); Entity::Id square_id = world->create_physical_entity( 0, diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 478df92..3021849 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -37,9 +37,9 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; - fixtureDef.friction = 50.0f; + fixtureDef.friction = 0.0f; fixtureDef.restitution = 0.0f; - body->SetLinearDamping(0.0000000001); + body->SetLinearDamping(0); body->SetAngularDamping(0); body->CreateFixture(&fixtureDef); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index dc26bfb..79cdb36 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -1,4 +1,5 @@ #include "Hero.hpp" +#include "event/management/condition/EndAnimationCondition.hpp" #include "event/management/condition/KeyDownCondition.hpp" #include "event/management/condition/KeyPressedCondition.hpp" #include "event/management/condition/KeyReleasedCondition.hpp" @@ -93,7 +94,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id)); + machine->add_state(std::make_shared(world, hero_id, m_impulse)); machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); @@ -121,29 +122,30 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - float t = 2; + float t1 = 0.1; + float t2 = 0.2; - machine->add_transition(4, 8, std::make_shared(t)); - machine->add_transition(5, 8, std::make_shared(t)); - machine->add_transition(6, 8, std::make_shared(t)); + machine->add_transition(4, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + machine->add_transition(5, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + machine->add_transition(6, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 11, std::make_shared(t)); - machine->add_transition(8, 11, std::make_shared(t)); - machine->add_transition(9, 11, std::make_shared(t)); + machine->add_transition(7, 11, std::make_shared(t1)); + machine->add_transition(8, 11, std::make_shared(t1)); + machine->add_transition(9, 11, std::make_shared(t1)); machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 0, std::make_shared(t)); - machine->add_transition(11, 0, std::make_shared(t)); - machine->add_transition(12, 0, std::make_shared(t)); + machine->add_transition(10, 0, std::make_shared(t2)); + machine->add_transition(11, 0, std::make_shared(t2)); + machine->add_transition(12, 0, std::make_shared(t2)); diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index 70c3953..6864a21 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -16,8 +16,8 @@ namespace mad::core { std::shared_ptr m_world; Entity::Id hero_id; std::shared_ptr level_dispatcher; - int last_pressed_key; - float horizontal_velocity = 81; + float horizontal_velocity = 20; + float m_impulse = 3000; }; }// namespace mad::core diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 0ca99fe..f4ac8eb 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -24,9 +24,9 @@ "type": "several_files", "width_scale": 1, "height_scale": 1, - "delta_time": 100, - "size_width": 100, - "size_height": 74, + "delta_time": 200, + "size_width": 10, + "size_height": 7.4, "count_files": 4 }, "run" : { @@ -35,8 +35,8 @@ "width_scale": 1, "height_scale": 1, "delta_time": 100, - "size_width": 100, - "size_height": 74, + "size_width": 10, + "size_height": 7.4, "count_files": 6 }, "jump" : { @@ -44,9 +44,9 @@ "type": "several_files", "width_scale": 1, "height_scale": 1, - "delta_time": 500, - "size_width": 100, - "size_height": 74, + "delta_time": 30, + "size_width": 10, + "size_height": 7.4, "count_files": 4 }, "fly_up" : { @@ -55,8 +55,8 @@ "width_scale": 1, "height_scale": 1, "delta_time": 100, - "size_width": 100, - "size_height": 74, + "size_width": 10, + "size_height": 7.4, "count_files": 1 }, "fall" : { @@ -65,8 +65,8 @@ "width_scale": 1, "height_scale": 1, "delta_time": 100, - "size_width": 100, - "size_height": 74, + "size_width": 10, + "size_height": 7.4, "count_files": 2 } } From 9a8c21758e830279a675884a905b20413f03294c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Mon, 16 May 2022 14:48:07 +0300 Subject: [PATCH 029/121] set normal jump animations --- core/CMakeLists.txt | 2 +- .../management/condition/FallCondition.cpp | 15 ++++++++++++ .../management/condition/FallCondition.hpp | 24 +++++++++++++++++++ game/mobs/hero/Hero.cpp | 7 +++--- game/mobs/hero/Hero.hpp | 3 ++- 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 core/event/management/condition/FallCondition.cpp create mode 100644 core/event/management/condition/FallCondition.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 7f98b59..f5e6511 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -89,7 +89,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/FallCondition.cpp b/core/event/management/condition/FallCondition.cpp new file mode 100644 index 0000000..235eb11 --- /dev/null +++ b/core/event/management/condition/FallCondition.cpp @@ -0,0 +1,15 @@ +#include "FallCondition.hpp" + + + +bool mad::core::FallCondition::is_triggered_by(const mad::core::Event &event) { + return m_entity->get_linear_velocity().get_y() >= 0; +} +std::unordered_set mad::core::FallCondition::triggers() { + return {mad::core::Event::Type::WorldUpdate}; +} +void mad::core::FallCondition::on_start() { +} +mad::core::FallCondition::FallCondition(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { + m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); +} diff --git a/core/event/management/condition/FallCondition.hpp b/core/event/management/condition/FallCondition.hpp new file mode 100644 index 0000000..905fe0b --- /dev/null +++ b/core/event/management/condition/FallCondition.hpp @@ -0,0 +1,24 @@ +#ifndef MAD_FALLCONDITION_HPP +#define MAD_FALLCONDITION_HPP + +#include "Condition.hpp" +#include "visual/image/storage/ImageStorage.hpp" +#include "world/LocalWorld.hpp" +#include "world/entity/Entity.hpp" +#include "world/entity/PhysicalEntity.hpp" +namespace mad::core { + struct FallCondition : Condition { + public: + explicit FallCondition(std::shared_ptr world, Entity::Id entity_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + std::shared_ptr m_world; + Entity::Id m_entity_id; + PhysicalEntity *m_entity; + }; +}// namespace mad::core + +#endif//MAD_FALLCONDITION_HPP diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 79cdb36..7627f90 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -1,5 +1,6 @@ #include "Hero.hpp" #include "event/management/condition/EndAnimationCondition.hpp" +#include "event/management/condition/FallCondition.hpp" #include "event/management/condition/KeyDownCondition.hpp" #include "event/management/condition/KeyPressedCondition.hpp" #include "event/management/condition/KeyReleasedCondition.hpp" @@ -134,9 +135,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 11, std::make_shared(t1)); - machine->add_transition(8, 11, std::make_shared(t1)); - machine->add_transition(9, 11, std::make_shared(t1)); + machine->add_transition(7, 11, std::make_shared(world, hero_id)); + machine->add_transition(8, 11, std::make_shared(world, hero_id)); + machine->add_transition(9, 11, std::make_shared(world, hero_id)); machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index 6864a21..ba1cc84 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -13,8 +13,9 @@ namespace mad::core { Entity::Id get_hero_id() const; private: - std::shared_ptr m_world; + std::shared_ptr m_world; Entity::Id hero_id; + std::shared_ptr m_entity; std::shared_ptr level_dispatcher; float horizontal_velocity = 20; float m_impulse = 3000; From 9ea45542f6d61e1d7225854e470e05f0eeabee7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Tue, 17 May 2022 18:39:53 +0300 Subject: [PATCH 030/121] debug --- core/event/management/controller/statemachine/StateMachine.cpp | 2 +- core/event/management/handler/CollisionHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index ab5f66c..96cc912 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -15,7 +15,7 @@ void mad::core::Transition::handle(const mad::core::Event &event) { m_state_machine->has_made_transition = true; m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; - SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); + //SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); for (auto &i : m_state_machine->m_transitions[current_state]) { i->is_active = false; } diff --git a/core/event/management/handler/CollisionHandler.cpp b/core/event/management/handler/CollisionHandler.cpp index 1c80ba1..569f9ab 100644 --- a/core/event/management/handler/CollisionHandler.cpp +++ b/core/event/management/handler/CollisionHandler.cpp @@ -14,7 +14,7 @@ void mad::core::CollisionHandler::handle(const mad::core::Event &event) { const auto &collision = const_cast_to(event); Entity::Id id_A = collision.first_object_id; Entity::Id id_B = collision.second_object_id; -// SPDLOG_INFO("handle collision {0} {1}", id_A, id_B); + SPDLOG_INFO("handle collision {0} {1}", id_A, id_B); } std::unordered_set mad::core::CollisionHandler::handled_types() { return {Event::Type::Collision}; From 7f893c06ec57d097d476797485307c05e960a04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Tue, 17 May 2022 19:42:55 +0300 Subject: [PATCH 031/121] add sensor to physicalEntity --- core/CMakeLists.txt | 2 +- core/event/Event.hpp | 3 ++- core/event/physics/Collision.cpp | 3 ++- core/event/physics/SensorCollision.cpp | 5 +++++ core/event/physics/SensorCollision.hpp | 15 +++++++++++++++ .../entity/ContactListener/ContactListener.hpp | 11 +++++++++-- core/world/entity/PhysicalEntity.cpp | 9 +++++++++ core/world/entity/PhysicalEntity.hpp | 2 ++ game/mobs/hero/Hero.cpp | 7 +++++-- game/mobs/hero/Hero.hpp | 2 -- 10 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 core/event/physics/SensorCollision.cpp create mode 100644 core/event/physics/SensorCollision.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index f5e6511..ce65621 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -89,7 +89,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/Event.hpp b/core/event/Event.hpp index c6d231a..ece2fec 100644 --- a/core/event/Event.hpp +++ b/core/event/Event.hpp @@ -17,7 +17,8 @@ namespace mad::core { LevelPause, Runner, WorldUpdate, - EndOfRenderAction + EndOfRenderAction, + SensorCollision }; explicit Event(Type new_type); diff --git a/core/event/physics/Collision.cpp b/core/event/physics/Collision.cpp index cc9d138..0484b0c 100644 --- a/core/event/physics/Collision.cpp +++ b/core/event/physics/Collision.cpp @@ -1,4 +1,5 @@ #include "Collision.hpp" +#include "spdlog/spdlog.h" mad::core::Collision::Collision(int new_first_object_id, int new_second_object_id) : Event(Event::Type::Collision), first_object_id(new_first_object_id), second_object_id(new_second_object_id) { - + SPDLOG_INFO("handle collision {0} {1}", first_object_id, second_object_id); } diff --git a/core/event/physics/SensorCollision.cpp b/core/event/physics/SensorCollision.cpp new file mode 100644 index 0000000..b8f0c33 --- /dev/null +++ b/core/event/physics/SensorCollision.cpp @@ -0,0 +1,5 @@ +#include "SensorCollision.hpp" +#include "spdlog/spdlog.h" +mad::core::SensorCollision::SensorCollision(int m_id) : Event(Event::Type::SensorCollision), m_id(m_id) { + SPDLOG_INFO("sensor {}", m_id); +} diff --git a/core/event/physics/SensorCollision.hpp b/core/event/physics/SensorCollision.hpp new file mode 100644 index 0000000..762bb90 --- /dev/null +++ b/core/event/physics/SensorCollision.hpp @@ -0,0 +1,15 @@ +#ifndef MAD_SENSORCOLLISION_HPP +#define MAD_SENSORCOLLISION_HPP + +#include "event/Event.hpp" +namespace mad::core { + + struct SensorCollision : public Event { + explicit SensorCollision(int m_id); + + const int m_id; + }; + +} + +#endif//MAD_SENSORCOLLISION_HPP diff --git a/core/world/entity/ContactListener/ContactListener.hpp b/core/world/entity/ContactListener/ContactListener.hpp index c4e0983..9a42504 100644 --- a/core/world/entity/ContactListener/ContactListener.hpp +++ b/core/world/entity/ContactListener/ContactListener.hpp @@ -1,15 +1,22 @@ #ifndef MAD_CONTACTLISTENER_HPP #define MAD_CONTACTLISTENER_HPP +#include "event/physics/SensorCollision.hpp" +#include "spdlog/spdlog.h" #include -#include #include #include +#include namespace mad::core{ class MyContactListener : public b2ContactListener { void BeginContact(b2Contact *contact) override { - + ///sensors + b2FixtureUserData fixture_data_A = contact->GetFixtureA()->GetUserData(); + b2FixtureUserData fixture_data_B = contact->GetFixtureB()->GetUserData(); + if(static_cast(fixture_data_A.pointer) != 0) dispatcher.dispatch(std::make_shared(fixture_data_A.pointer)); + if(static_cast(fixture_data_B.pointer) != 0) dispatcher.dispatch(std::make_shared(fixture_data_B.pointer)); + ///bodies b2BodyUserData dataA = contact->GetFixtureA()->GetBody()->GetUserData(); b2BodyUserData dataB = contact->GetFixtureB()->GetBody()->GetUserData(); //std::cout << "!!! " << dataA.pointer << "\n"; diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index 3021849..d62eb10 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -160,3 +160,12 @@ mad::core::Vec2d mad::core::PhysicalEntity::get_local_center() { mad::core::Vec2d mad::core::PhysicalEntity::get_world_center() { return {body->GetWorldCenter().x, body->GetWorldCenter().y}; } +void mad::core::PhysicalEntity::add_sensor(b2Vec2 offset, float x_size, float y_size) { + b2FixtureDef FixtureDef; + b2PolygonShape fixture; + fixture.SetAsBox(x_size, y_size, offset, 0); + FixtureDef.shape = &fixture; + FixtureDef.isSensor = true; + b2Fixture* footSensorFixture = body->CreateFixture(&FixtureDef); + footSensorFixture->GetUserData().pointer = m_id; +} diff --git a/core/world/entity/PhysicalEntity.hpp b/core/world/entity/PhysicalEntity.hpp index 6c3e0fd..14fcaff 100644 --- a/core/world/entity/PhysicalEntity.hpp +++ b/core/world/entity/PhysicalEntity.hpp @@ -79,6 +79,8 @@ namespace mad::core { void synchronize_position_with_viewable(); + void add_sensor(b2Vec2 offset, float x_size, float y_size); + private: b2Body *body; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 7627f90..6388f70 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -152,10 +152,13 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ - - machine->set_initial_state(0); controllers.push_back(machine); + + + /// add sensor + auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); + m_entity->add_sensor({0, 5}, 0.3, 0.3); } mad::core::Entity::Id mad::core::Hero::get_hero_id() const { return hero_id; diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index ba1cc84..988369e 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -13,9 +13,7 @@ namespace mad::core { Entity::Id get_hero_id() const; private: - std::shared_ptr m_world; Entity::Id hero_id; - std::shared_ptr m_entity; std::shared_ptr level_dispatcher; float horizontal_velocity = 20; float m_impulse = 3000; From 6df869fcde872ee966cff60790fc4b89a1c76445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Tue, 17 May 2022 19:51:40 +0300 Subject: [PATCH 032/121] finish jump state --- core/CMakeLists.txt | 2 +- .../management/condition/SensorCondition.cpp | 14 ++++++++++++++ .../management/condition/SensorCondition.hpp | 19 +++++++++++++++++++ game/mobs/hero/Hero.cpp | 9 +++++---- 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 core/event/management/condition/SensorCondition.cpp create mode 100644 core/event/management/condition/SensorCondition.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index ce65621..55f9bb2 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -89,7 +89,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/SensorCondition.cpp b/core/event/management/condition/SensorCondition.cpp new file mode 100644 index 0000000..24a25b1 --- /dev/null +++ b/core/event/management/condition/SensorCondition.cpp @@ -0,0 +1,14 @@ +#include "SensorCondition.hpp" +#include "common/Cast.hpp" +#include "event/physics/SensorCollision.hpp" +mad::core::SensorCondition::SensorCondition(Entity::Id m_entity_id) : m_entity_id(m_entity_id){ +} +bool mad::core::SensorCondition::is_triggered_by(const mad::core::Event &event) { + const auto &e = const_cast_to(event); + return e.m_id == m_entity_id; +} +std::unordered_set mad::core::SensorCondition::triggers() { + return {mad::core::Event::Type::SensorCollision}; +} +void mad::core::SensorCondition::on_start() { +} diff --git a/core/event/management/condition/SensorCondition.hpp b/core/event/management/condition/SensorCondition.hpp new file mode 100644 index 0000000..31ab53a --- /dev/null +++ b/core/event/management/condition/SensorCondition.hpp @@ -0,0 +1,19 @@ +#ifndef MAD_SENSORCONDITION_HPP +#define MAD_SENSORCONDITION_HPP +#include "Condition.hpp" +#include "world/entity/Entity.hpp" +namespace mad::core { + struct SensorCondition : Condition { + public: + explicit SensorCondition(Entity::Id m_entity_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + Entity::Id m_entity_id; + }; +}// namespace mad::core + + +#endif//MAD_SENSORCONDITION_HPP diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 6388f70..f8515cd 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -5,6 +5,7 @@ #include "event/management/condition/KeyPressedCondition.hpp" #include "event/management/condition/KeyReleasedCondition.hpp" #include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/SensorCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Fall.hpp" @@ -144,9 +145,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 0, std::make_shared(t2)); - machine->add_transition(11, 0, std::make_shared(t2)); - machine->add_transition(12, 0, std::make_shared(t2)); + machine->add_transition(10, 0, std::make_shared(hero_id)); + machine->add_transition(11, 0, std::make_shared(hero_id)); + machine->add_transition(12, 0, std::make_shared(hero_id)); @@ -158,7 +159,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ /// add sensor auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); - m_entity->add_sensor({0, 5}, 0.3, 0.3); + m_entity->add_sensor({0, 4}, 0.3, 0.05); } mad::core::Entity::Id mad::core::Hero::get_hero_id() const { return hero_id; From dba4e722ed0bcd3ee66489d64184148ac91c5ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 22 May 2022 14:50:22 +0300 Subject: [PATCH 033/121] merge main --- game/mobs/hero/Hero.cpp | 53 +++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index f8515cd..0e4173e 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -21,55 +21,52 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ std::shared_ptr image_storage; + float physical_size_width = m_config_json["hero"]["animated"]["size_width"]; + float physical_size_height = m_config_json["hero"]["animated"]["size_height"]; + float size_scale = m_config_json["hero"]["animated"]["size_scale"]; + float delta_x = m_config_json["hero"]["animated"]["delta_x"]; + float delta_y = m_config_json["hero"]["animated"]["delta_y"]; + + image_storage = std::make_shared( std::unordered_map>( {{ImageStorage::TypeAction::Idle, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["idle"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["idle"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["idle"]["height_scale"]) - }, + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, {ImageStorage::TypeAction::Run, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["run"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["run"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["run"]["height_scale"]) - }, + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, {ImageStorage::TypeAction::Jump, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["jump"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["jump"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["jump"]["height_scale"]) - }, + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, {ImageStorage::TypeAction::Fly_up, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fly_up"]["height_scale"]) - }, + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, {ImageStorage::TypeAction::Fall, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_width"], - m_config_json["hero"]["animated"]["actions"]["fall"]["size_height"], - m_config_json["hero"]["animated"]["actions"]["fall"]["width_scale"], - m_config_json["hero"]["animated"]["actions"]["fall"]["height_scale"]) - }} - ) - ); + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + } + )); hero_id = world->create_physical_entity( 0, @@ -124,8 +121,6 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - float t1 = 0.1; - float t2 = 0.2; machine->add_transition(4, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); machine->add_transition(5, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); From 6fc2b695c5f4ca18d1d62778afbd5384c046f4fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 22 May 2022 15:04:47 +0300 Subject: [PATCH 034/121] add animations --- .../hero_attack_1_beg/adventurer-attack1-00.png | Bin 0 -> 1159 bytes .../hero_attack_1_beg/adventurer-attack1-01.png | Bin 0 -> 1159 bytes .../hero_attack_1_beg/adventurer-attack1-02.png | Bin 0 -> 1118 bytes .../hero_attack_1_beg/adventurer-attack1-03.png | Bin 0 -> 1118 bytes .../hero_attack_1_beg/adventurer-attack1-04.png | Bin 0 -> 1257 bytes .../hero_attack_1_end/adventurer-attack1-02.png | Bin 0 -> 1257 bytes .../hero_attack_1_end/adventurer-attack1-03.png | Bin 0 -> 1244 bytes .../hero_attack_1_end/adventurer-attack1-04.png | Bin 0 -> 1244 bytes .../hero_attack_1_end/adventurer-attack1-05.png | Bin 0 -> 1141 bytes .../hero_attack_1_end/adventurer-attack1-06.png | Bin 0 -> 1141 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png create mode 100644 game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-01.png create mode 100644 game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-02.png create mode 100644 game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png create mode 100644 game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png create mode 100644 game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-02.png create mode 100644 game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-03.png create mode 100644 game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-04.png create mode 100644 game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-05.png create mode 100644 game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png b/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png new file mode 100644 index 0000000000000000000000000000000000000000..893cbe190193a8ad25fee0aa1683b257c7a4a37b GIT binary patch literal 1159 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 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png b/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d52cf581f2cf4312c9c1f47460494ae4759845 GIT binary patch literal 1118 zcmV-k1flzhP)F?+6cm8%Hoj4mU0O&A6x|B zzVk(XJl;Sc9Hu6e#Ow28Dl>8Q<_NBH9XOw>z;&)eD>uF97E!}1c)b0125xJ8zlvV4VLo&TwY!!5DruP zN(buX_bD071j1o@r^a9^HRfXHb*4eWRoz+Hw@A>{&cvdFKbCrBRcQ#1x1afY-F#>{ zPw&*2R!XbYxvYNi9@SS;hh3oa1FWQe3l*6}?rX100FSp{uLJM|C%gO3mpF?1^$T>{cXN(v0Pl6LAhrYR{fkl%b+OOr|d5c@6@RCFt#yl3oD_gus1!K(E8z zMF!mwg3EK*tv30S`y0+SwGmvN6M3J$qe*OMLv|f8vo=42lz+W>NGTCQAf=?pWI}+H zLg2{R5bguf*u&#@N1~#6IWGDLI{Bn0!2}@c3f4FLU1uJia96A zyKT*fBl0+jmZs9Q|3$0@Hloo~P(?ve6iDqs0SGCjNVy3votB>jR8<%G;*!)*L{sG%*_$A kYE0G?7fBB3lly5b(EtDd07*qoM6N<$g0y7|Hvj+t literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png b/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png new file mode 100644 index 0000000000000000000000000000000000000000..00f60010a843926ff8097d7eb6cbd75230e6711d GIT binary patch literal 1257 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 Hu0mjfyP6-N literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png b/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4983a5c9833fd646786bb684b34681fdf71f74 GIT binary patch literal 1141 zcmV-*1d98KP)uT1dNt*Z9<3*E)B&EahoKcW|;o*7C?>Xo9JKyK` zmK@l{E_U%O2o*|h`eU_2dDvrDqIWwmDbytu>e@C8dKENy0~C3AyUK==(;w54JfAO%OinU6-nHfYOINQ0$YJ+5u~PBR9kJ2(tJ8Fo(M_b*6AOz!G2oiupU^Fl&8=az_LEAlV6*n)b~z=0+vOy&mY}V( z4deBT%<0`g1<$?ie?Ivd-Enx>QkHI)6M(?t5&$8)3xI!chV&;T<00qc3iA{`5&YyIl15^b+=8)ooX49|=xPvyzBnZ??%mc!BD* z+?8ctM+X4Dxq15TU!t?i#ad($fNsx8-I1ZZA@;X*$e9OsS&l{lw0qDyhPTwt{&1O3 zFVC|US>)h>5l#gkDzU3Pw5q6jpcX;z7%QuxI@!#FyPUo9t!{hDhy0%0M_WGSZ?OMXdHYu2)=VlaOaM0`^rKql#bDAZjpiTf)-A-h-V4_ z3}%)AxMxl9)SMH8z8gyHEAvRUn5Rl&Uq?qBnRbgA*dTMS`6W%hYR+@|=iimsSLTs; zKD|lSdgj6=*`Xmfj-Fls%tm!>Ol8&5`bMKSs$pe%l)+J{SdN}v;>(Y;kW+!@R(>mxONmv4l%x^~f`32KUI-y@v`9Qh$MFB6 zKjD=Ti6oPPhX3wYdOBq$k=PIjft2+JEeW$#BBhe}Qby$C*;xQFdTg9hp@7L`(nwSx z8gfENsq73%=}(l=w~kOM6fm02n@DU0Rq3vb$Y;k#=_#c#HZ{rY`g+~FiYLUzqo8^L zIE*DF_H~EWmmeMjAe+hXDp`3gvR)TLQc5AEtd$9iD3Osy`KB#HsA$x?1wbc}uRb_R zKA*?j)FfLh7P7e<$GgE7M?^MS2SNzueEzz1C*C-O-B<$l&}S&<*@6aLL{g~~Hk(aG zV=;u3PzfP#JDj`b-*TPZP((;D6^oP=HAP)HQYaK;G#ODwJA9c`rqJR#;2c(FwbIs00000NkvXX Hu0mjfyP6-N literal 0 HcmV?d00001 From c7f7f64288e3a48319c74a90a1f278b81c11936b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 22 May 2022 15:12:39 +0300 Subject: [PATCH 035/121] add animations --- .../hero_attack_2_beg/adventurer-attack2-00.png | Bin 0 -> 1096 bytes .../hero_attack_2_beg/adventurer-attack2-01.png | Bin 0 -> 1083 bytes .../hero_attack_2_beg/adventurer-attack2-02.png | Bin 0 -> 1072 bytes .../hero_attack_2_beg/adventurer-attack2-03.png | Bin 0 -> 1052 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-01.png create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png b/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png new file mode 100644 index 0000000000000000000000000000000000000000..38e830110fb1255d924e4efd9e05a734ac942655 GIT binary patch literal 1096 zcmV-O1h@N%P) zn4n(FfkMS8qOjdeTT|Rv39Kw=S(~JrX`1F_r%Ahfy3Z} zf_!@NC7$egLRQ8;`1&)RKY7M*m>mWA=+)!gT)HI#{k;IFt15j1enM?S0QCEh00<*M z>U59r5S^P`=H}8Z>GyRqH9H4@z1hz7Yav`S=POT@+Ya!EGNwWA)8(K-Bo@W*>jc2> z>qK2uu{Ya+a%EgI=b1Io({PZ>L4`ze313I2oQ&Lq2}Pn1DMN)KQQ~)euyB^XoY7HIgLfw0GQ?l^WDk#xlgz4kY<8}`aac<_y`IN;<9h&N9+-A_W8Q2hfaua6qO*OU zUVBZtK*D3=D0ee>Y@7L}@w3mlXujg@EEu`1;&;Z@*F}(SD(UNcA#8;F0v#*e@ z){18pTn&vfw6dVZVyP4WPOC+OxZbc=`#oXFapKY?J+|9Q7sy5-M`&e%SSm$_+pR&| zul>D#TD+|QSWG*!E7Ap$&SkfaYwZM>2Sx!{PQ-CqE!2sf0nt0zwS7`WHNI z%>HMehQIM{VQXq)Bb&uzmSVRBx~-B^7iM((8?r^|4-7pJ+pK^nf2^(wK(ZiYw^hoL zL93W{>-EkmcnPN7)jy+>SmY-W>KT+7HkO^uR&;E%%pjQ#>J*oK8J4Eo6c O0000n){PWPsHhdBp`XWAyOa!Ms_#)zy zQW0OqM6tt(Zlm3cTWU%lmK9p8+t4;CF74XfG)a>#w>dtfxuaci$~_T;d?61x-240f zK74=Ya1yAhs;a80s;a6G|CQ13cNYObc!Q==BRcc(7y*Af00DnH>6J7tuL~$8GrB6^k74$8^(ph!lvSbxv9!E^ zzpY(P&Bx63sreY;=nMd(s{(J6pM70@WY<=e?Ga@lWr*gcJ@RVgJjc$AF*P5<<#qA; z*-6Hqd5zFOGu|dYE6ei$>~=P&vR4B#d-Bv4h(rBDBu>8sKsY)>>#xIH3JE@)aI&&I zuRIM7^Uq_Su_lK z1`aCsw4BItCL<{QuHdU(TSsR*jF6JT`nm)}&%i;hU;D+X{r%c1itK;-0Bpkiot*Xc z&Iq6oFVuB%jYCq(s+sv!PBWJ8t4=I6^cWA=DsA ztmTA|5}RQlibX3en6d=2p3loSM{sLwRhM=KjH%0&e002ovPDHLkV1mYE B3-ka0 literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png b/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png new file mode 100644 index 0000000000000000000000000000000000000000..18e53fceed59efac5db1c34812d2d44b61b482c8 GIT binary patch literal 1072 zcmV-01kd}4P)N;P#Nia_@M4;nI;1hsY8|6Z+KK5`PMe%0H6O1RP0pG%bu;G_6!L>Wc+YwB{Gapu z-*es*XwaZRg9Z&6AdXt#tt(e}X5_pa^j|<#6T;={X6S^~bREU?UwnwQl_mMz)FhGU z3@%rGcr)m?XjATW3mhsVMETojjQiHO;PWlS}4 z?fM#j?9Af#^#b7c^^)33;qW*BxW1f*Mf%26&xN1uV1@E=-g{~I(%$x z#sO%xJI#=-!myEwiO!BE_s`fA#!+@TmU zvUu?_0B48CS^H>gFNyuf1LrA}ngE#C+~%j_ec~w600U3h#fz6wcQss1t@7);bGnIn zdkTQ|78?Mel8=GidjL2KR`K>XA)__dr0zr#85LJktBh_e>tn0Qr2c(7n`b+lubQ)C zHGhv)p)MoSqobtrIiefOtR|Cq-R>$A?JYJvky9uAtb0eysrDbJI}t6PtGQolZ?Wk~ zSWk}wu(qD4SLU&)_x4+5VqY4fax7Hx(N#9k)!7ZJ_v(~-JnCBP)1#vj_6*o87LhL& zE5^iBr$-7Y(Nd{uAtC5$wuqF?PWanf#;UGC-L18o&kJXBv&a{VP`)5jogSG@rO2ey z2yyTlrEGRtDik>V!t-?(d>E!|7fy|wL9tjUJxHb|_O>>1nT)PG_rs57$O9(sejjDx zA!JVzygLyvOWwGV!NBl=v2t69%0~!spw*shSEMMFOfzH1$j7ga@nVl1A%v_Ht0)ST zi~l7wtD903MPxNipKC1?kcuLa=DhV9+x<#OU)wR+cl;QtssgZ>k>dBP(EC3U+@;}%AmcIdJvXopiJyhxd0000%RaRLgkl1L4!=sA;GRH7eTpb4+a@xHk|BwojNL~1668dG3G+Y{d zPJ<=U@aQ5-k$;HC*N7*iDMPNEmFdF;+&(iU1JU%&cR{UL5KPHIzyt#ZAUiOd0z^{^ zD6hHv8BmD8CX6QpL|KaYi zEsc#}NWG%^@wi=j8#M`~sD9d;+OoN{l_|?0ONkg5HX!H_THw0=Xg{pCYk%zLUO>T5 z`~EggemF+=SD$mrIZp5F5%~2BJMm_ftv7prXD6{lg8Arw>)HshyZ1a^Wf1Q#=k>m) z{=7=J10#xdxxjQTD*a`-|qoz)n0TQY|!Jkb^M+f8sg&v2f&aSEh_+v zDTw*7s`mx%TBU_X2qnkOeRdI!-U+~`7i+lZ?j7>sj$;CPjIL}S0D09~DHsW`=cS|# z=b=mT>_=}hA6AJ6FXM4I+0}iTmA*3ow1lfn&;U>NUDDf+-CrTHWdn+w5lwGQOaO?v zkuI*?Xk|J0v+g(^yv)|-M+G+n^7`5L*wvkU*#-K}Br^kqY8_%VpyE{q<$ll8c$Gn; zc}ozaC840|cl5&7wAKyC3$vdPljAr;Z!zHQ5PQO7a_QzR)7Z(atvu89A^=rmBSLjL zX?ESG2VEl`(PGKDH?-J|6>#1lS(bs=Hg|--hN^Xt`syu=thsqGK1F@?7OI{&E-GAY z_DbUgn#wrbLoDqE+> Date: Sun, 22 May 2022 15:19:12 +0300 Subject: [PATCH 036/121] add animations --- .../adventurer-attack2-000.png | Bin 0 -> 1096 bytes .../adventurer-attack2-02.png | Bin 1072 -> 1083 bytes .../adventurer-attack2-03.png | Bin 1052 -> 1072 bytes .../adventurer-attack2-04.png | Bin 0 -> 1072 bytes .../adventurer-attack2-05.png | Bin 0 -> 1052 bytes .../adventurer-attack2-03.png | Bin 0 -> 1052 bytes .../adventurer-attack2-04.png | Bin 0 -> 1173 bytes .../adventurer-attack2-05.png | Bin 0 -> 1173 bytes .../adventurer-attack2-06.png | Bin 0 -> 1202 bytes .../adventurer-attack2-07.png | Bin 0 -> 1202 bytes .../adventurer-attack3-00.png | Bin 0 -> 1107 bytes .../adventurer-attack3-01.png | Bin 0 -> 1107 bytes .../adventurer-attack3-02.png | Bin 0 -> 1044 bytes .../adventurer-attack3-03.png | Bin 0 -> 1044 bytes .../adventurer-attack3-04.png | Bin 0 -> 1083 bytes .../adventurer-attack3-02.png | Bin 0 -> 1083 bytes .../adventurer-attack3-03.png | Bin 0 -> 1077 bytes .../adventurer-attack3-04.png | Bin 0 -> 1077 bytes .../adventurer-attack3-05.png | Bin 0 -> 1092 bytes .../adventurer-attack3-06.png | Bin 0 -> 1092 bytes .../adventurer-attack3-07.png | Bin 0 -> 1065 bytes .../adventurer-attack3-08.png | Bin 0 -> 1065 bytes 22 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png create mode 100644 game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-05.png create mode 100644 game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-03.png create mode 100644 game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-04.png create mode 100644 game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-05.png create mode 100644 game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-06.png create mode 100644 game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png create mode 100644 game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png create mode 100644 game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-01.png create mode 100644 game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-02.png create mode 100644 game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-03.png create mode 100644 game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-04.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png create mode 100644 game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png b/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png new file mode 100644 index 0000000000000000000000000000000000000000..38e830110fb1255d924e4efd9e05a734ac942655 GIT binary patch literal 1096 zcmV-O1h@N%P) zn4n(FfkMS8qOjdeTT|Rv39Kw=S(~JrX`1F_r%Ahfy3Z} zf_!@NC7$egLRQ8;`1&)RKY7M*m>mWA=+)!gT)HI#{k;IFt15j1enM?S0QCEh00<*M z>U59r5S^P`=H}8Z>GyRqH9H4@z1hz7Yav`S=POT@+Ya!EGNwWA)8(K-Bo@W*>jc2> z>qK2uu{Ya+a%EgI=b1Io({PZ>L4`ze313I2oQ&Lq2}Pn1DMN)KQQ~)euyB^XoY7HIgLfw0GQ?l^WDk#xlgz4kY<8}`aac<_y`IN;<9h&N9+-A_W8Q2hfaua6qO*OU zUVBZtK*D3=D0ee>Y@7L}@w3mlXujg@EEu`1;&;Z@*F}(SD(UNcA#8;F0v#*e@ z){18pTn&vfw6dVZVyP4WPOC+OxZbc=`#oXFapKY?J+|9Q7sy5-M`&e%SSm$_+pR&| zul>D#TD+|QSWG*!E7Ap$&SkfaYwZM>2Sx!{PQ-CqE!2sf0nt0zwS7`WHNI z%>HMehQIM{VQXq)Bb&uzmSVRBx~-B^7iM((8?r^|4-7pJ+pK^nf2^(wK(ZiYw^hoL zL93W{>-EkmcnPN7)jy+>SmY-W>KT+7HkO^uR&;E%%pjQ#>J*oK8J4Eo6c O0000n){PWPsHhdBp`XWAyOa!Ms_#)zyQW0OqM6tt(Zlm3cTWU%lmK9p8+t4;CF74Xf zG)a>#w>dtfxuaci$~_T;d?61x-240fK74=Ya1yAhs;a80s(-4g5dW3Y@OKvhWH2y@ zt|vreV+(yx*p$^*S7`_R@Odu)cl1Yyj$M|;)r-I<1OtOo*Ars$rlAa`Vjy3<`7%D^ zNeSSqhrm;@pclIE@Bufm-OQ?32w$CSZT z1mx_(sHe>>@w zG%l|TC?zwxD&UV{_I33s^VO79q6D$Dynw&0T~5u%%=M}H7~$v)0Hdn{ZXU+Ph!MtC90`_@8I- z>mjmTFVGntBc4nGaO=Qf022fd@0@wts=X;Ci9G7^NPt8ALo9x9)Lfqp9ih$R0ZIVn zk%}$cQh$D=7cD$CP_2y=#?q;%*YL!x*LQPFXYzdIk#j5@N+A50dfBFDy!u*|__4VY})&OXAAbQ;zAC81ov|xR-f}#Eg z);5z6<&O~JfpmJ^niRz%r;mlKwg6ZJ`S_Ki9By?YgplQCHBE!f=5LHom{6LgiCi{o zzH2iKq^3#aLxcQBvbIO0q@%u8c068-u7B$Q%&tlCTTYns9}PzUGda;@lY|+G@mHCLk*x htKY5k|E>SM{sLwRhM=KjH%0&e002ovPDHLkV1iuj48Q;Y delta 1052 zcmV+%1mpX=2(So{BYy+;NklN;P#Nia_@M4;nI;1hsY8|6Z+KK5`PMe%0 zH6O1RP0pG%bu;G_6!L>Wc+YwB{Gapu-*es*XwaZRg9Z&6Ab*Zp;H@iHcxL3h9Q0p6 zRTIMH>SpMK)pQ-j^k004wUs6L-P9zJ=nO7bw^Y>xckUKU*D?Rn0H3~jiD&ztlKaP^ zKqNZDp#Os82s**^MAk!>(9#;8e|eL5Y>9YmiTSxG{y)R}Pm_nuuNTu3xtAVe>Ha6u z@9QNPSs*ZY5`Txs!TeklmuHEH*@9(EHFE9x8h`A};`j9e;P>^C+DhT@H~_f5oQCB| z2KtB0lm$#|t=nN0SxS&q&d6wdMIVpGR|rNHnAs6{I(!WD520mt{+ny$c35S7^FBUr zuUwAbWa8>AqVW|R9tW>qyF=*QYj`?*Y;DE?Xtg`dkbkYhu#t+1&WXA)__d zr0zr#85LJktBh_e>tn0Qr2c(7n`b+lubQ)CHGhv)p)MoSqobtrIiefOtR|Cq-R>$A z?JYJvky9uAtb0eysrDbJI}t6PtGQolZ?Wk~SbtBC1F*K9s8{B(srU9X`k7mdNChmS8W#S=ZPZPX55im>MxRJrY@PV;%TZzg? z2yvj*o@-a6D3wezW5~$Iua5Czj~yX|tQ4y#3Y3fgB{Zv>QWQmGHBFyuEfkQ7B9Z32 z^%~p#N=aYaG1+(g7^fK$p?TEpA!M3`j6P$Icp z4k0C~s_F$jZLhtEBf&6{V3>eYlE`F*kP>U5fGCxWl%QkC$ZjqtliS-^EEXX_Amt

l7sb diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png b/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png index 5e807d541e54607a38c45a33ad8a202e3f084019..18e53fceed59efac5db1c34812d2d44b61b482c8 100644 GIT binary patch delta 1051 zcmV+$1mydi2(So{B!BlwL_t(oh3%MKXj^3*#((cgvbJfHCMo>@)7Xnm%c@x?l-0(0 zv2IY%n-*m3%8Q{Ff(Y(P)C;HA-gsGWrGcr)m?XjATW3mhkwVx{9F{5XNic}f@MrKa_#yWf9%ZS_w@qc_w|z6O5yN00Jy%KhUG~H z`iIPv1x#$M+hG-1N|05~$Y^{;ACJaY2u2o|*%5d;d<^stp=Eadn``8DSY>_lK0a@+ zT#nyl;_5A;@f92%2d`hdL+IRVcshJ+ZN>p;wL8s_t$)I>k&21Vjwj^z;V(ElJkHN= zoC6>jS)k{)Nrqy-vb7mMvNXViHB!rj*X@RlBmnP!wor9`tKG?aSKl!zdjP|UR7~{w zUec3T?Z~0M{0d&To2||GgO>Vg+Nj*27&5YW@iG8shsRm_XlyTu{l^36DU_N3nAqIr zr{jI%D1Xub15en+iQv_8+J_5iOsqxnF8;vFS-zPk)aCu(qD4SLU&)_x4+5VqY4fax7Hx z(N#9k)!7ZJ_v(~-JnCBP)1#vj_6*o87LhL&E5^iBr$-7Y(Nd{uAtC5$wuqF?PWanf z#;UGC-L18o&kJXBv&a{VP`)5jogSG@rO2ey2yyTlrEGRtDik>V!t-?(d>E!|7fy|w zL4UDWC_PA~Cib>Aa+!>-JNLtnX2=63?tUL-;vr;D6TCYSFiYOJk-@<5fw6L1iONR^ zaiGIFS*uf2#P!7!0vn1EA~$Yh0(5^JG=D3y$qpkv6$ZZ0R2+uK+y79l|(oE zqMZBTC)8;l>a>r^D+;xaItj?oTyWiZi&-&E%!YvYuFpu1+r@9*YXCT!986wOP^W#w zV$odXiX~ZITK%1!(zAVc#(P(9sAAs^w<(~hrCAZZwSNjg#JvpwkK09LK7ymkk?c3L zjY@m3SdwLs`pO!ig#KPPdx3=o0O?;2>wPVajbKQnUf$8nZ?fC9HCrvhcho{6^yn(mh z?*VMpUUVF6(Brpt{GJ#Z;^PAcz>pa&D*%fri21Op_XX}+rG-WaCCANub`g%=3Bacp zYq;m`9rEFhV*+}Nu52FwdDU7e7zwcFrKAn#p?^#A>_=}hA6AJ6FXM4I+0}iTmA*3o zw1lfn&;U>NUDDf+-CrTHWdn+w5lwGQOaO?vkuI*?Xk|J0v+g(^yv)|-M+G+n^7`5L z*wvkU*#-K}Br^kqY8_%VpyE{q<$ll8c$Gn;c}ozaC840|cl5&7wAKyC3$vdPljAr; zZ+|i1?GSsyV{+-{Ez{V^t*t!M^&$XOVY%<#XwNtu7~%pMQct4Br7VONm{u>_X_BR%L|H8pVdm2Lkdd z8ttrO%X00k%o_siAHNybzA*r+8L~M6Ie!Ng{lltQ88Rp*1lR{L?Wv&;o|RGv4)+Y$ zG-J09t AZ2$lO diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png b/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png new file mode 100644 index 0000000000000000000000000000000000000000..18e53fceed59efac5db1c34812d2d44b61b482c8 GIT binary patch literal 1072 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 Q;s5{u07*qoM6N<$g1dA#-~a#s literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png b/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png new file mode 100644 index 0000000000000000000000000000000000000000..95b51a45b8c2cdfec45f7e65c084b5c416b94102 GIT binary patch literal 1202 zcmV;j1Wo&iP)sUuOw{{)l&(`7ir!36*U{n@)5CxJ&O-KwO5HvCIPmCrSUr2}%10nGN zAMnA5Ch|l!!UzT=1|lwMW=!Q6&u>?djNz2}~L z&iDH}zjM#Ig%Tx7lqgZ6M2Qk5{x7J9(aG2EZD!SD%Vl<1GM-S@>M8)9es`zgKFo$& zcmR@#BnOWkr=xu(0P%@9txvWIKrnE#D8V!pqmlbDa{Y$1Ih*JmyZ}J8y_(_kZakwS zOim`{K94^T55-8Evq?Y3C*pef>~o_OJ+&@vdV|r}O`_A20^kdWaeKVF8Mns^o}4MS z$4iHOWl{Pqijn%hTWAT45lf|r&Q*B*0Xkb1 zTb&B4eIZ+&ii@gN{dB6=uo2^PBqh`~%$LC*e*j?k_W}LZSYRAqU5ZAVjpm?6b5JAj zML&V7X9-+AOFA*3-d?lBummW=Ix=uME8p(@2!Qt|;(UMkJijhojJ?hYz|v68SYyb7 zFC4z3{}0ZcGb#c22Xo|1U!>qVY>m`a3YJtZY~hyy)g}tH=svte#5hD+4u?oht{supYesm zbUSQJjg258C{-9}pVca0(c3DPi2@^2DeaCuPt(FVx*0&WY@B!36v(GjSG}EdGKo?O zr4*W$8x9e{WHOPA$FWvd1IVea;w*%D^mXKx$ovn0R9aJ&7SkQ&cca^3LzF^95D_#@ z%a4dsw@;W%B+$yr7>UL(B?9VTcTZ7vzlIyx``QKoiH5@*4JkdPL_`-4xj#!3}bt(&$q27lgVH%FQ>+4LxN!dl{Yik+o#uU?|24sfs=KX1e!8Y zt3N7uI)>)RXd($f&73)Wc5L82wF{YRE>ok4q%>Dqg@^Pf$bW)A0Z%X1fT>ed Q;s5{u07*qoM6N<$g1dA#-~a#s literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png b/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png new file mode 100644 index 0000000000000000000000000000000000000000..99b6794bfb6bb3bb41d79dc9b09ef1c3eac45379 GIT binary patch literal 1107 zcmV-Z1g!gsP)*b&OxIs|mCr)KHtWkggR=n@HQllxiRdr3F(cB@d+_LLY31A%wnI z=?CqLFQqRfDI^iGBvC^#nppF-EEr;~R7Y(pt4>y3*L7EKA9P1eOXFsDEG_$oftfpZ z&N=`2pL6b=fdmprAb|uDNZ|hiv009O{`w>U^Ya00wiFo||Gv3ZkLB|#x1QL(C6?f# zflqr#x{@JnwiMLi-vF4Inu(izQ`{^)2I)$M?7Qn(N5Z3yP*ji)K-$(VG1=cVB7Ju~ z*fZ_A3LbTYl0AjkGwqb@DP($fPCmxOKfT%Vrj_}kCxDHS2HePSslpK&MB^xcpAdjBS@kZ^n2 zn3`0XnpC+|BFMYnM0b}Lk2-=!9RXq|0da1>M_wtAxsDXxtM9|@X#*f{qE58`@+v1Q zcF|FPRu;Yc6y053e0PS|J?m7Ibuk_7=!nX9Tx%pb#Vp3h0@CeiBX6P(fV7-LeDdrd zEg$zX<@YoCqnf54K8FRb^Ccd5$LTLA({255;K08}Ou-r{uuXDQvAfgU?~XQGJT3Nfm$x-tma3s9SN|i~Y?H z?vSKZA(zHQsjHG9wUvPBMG5d+VG+B7gZf-Y^(ivGY2e7DPgK`5P+imT#C{FiYjyTK z#5*}g_BMyS)^mYUS0%R_%h%2E1wsInH(uArx~lf!R1|`tka(xFbHn}&TiIWBWstqi zfp>CDl)5Up)^mXuYFhtps&ISSaC_S5s@exEH-KcTHLCP7bc+%p^Hsxf){==R5rMn? zGFQ(wt!=?k!;sW+y^Q;hQqp4Yqlfe5jz`(QN=D678gZ+nw?w`kU_bg1R%_o_`XBK){zqx#Q<`^za;tt z>xc+|p3CiV^=I@KqS%>g`b)0In**b&OxIs|mCr)KHtWkggR=n@HQllxiRdr3F(cB@d+_LLY31A%wnI z=?CqLFQqRfDI^iGBvC^#nppF-EEr;~R7Y(pt4>y3*L7EKA9P1eOXFsDEG_$oftfpZ z&N=`2pL6b=fdmprAb|uDNZ|hiv009O{`w>U^Ya00wiFo||Gv3ZkLB|#x1QL(C6?f# zflqr#x{@JnwiMLi-vF4Inu(izQ`{^)2I)$M?7Qn(N5Z3yP*ji)K-$(VG1=cVB7Ju~ z*fZ_A3LbTYl0AjkGwqb@DP($fPCmxOKfT%Vrj_}kCxDHS2HePSslpK&MB^xcpAdjBS@kZ^n2 zn3`0XnpC+|BFMYnM0b}Lk2-=!9RXq|0da1>M_wtAxsDXxtM9|@X#*f{qE58`@+v1Q zcF|FPRu;Yc6y053e0PS|J?m7Ibuk_7=!nX9Tx%pb#Vp3h0@CeiBX6P(fV7-LeDdrd zEg$zX<@YoCqnf54K8FRb^Ccd5$LTLA({255;K08}Ou-r{uuXDQvAfgU?~XQGJT3Nfm$x-tma3s9SN|i~Y?H z?vSKZA(zHQsjHG9wUvPBMG5d+VG+B7gZf-Y^(ivGY2e7DPgK`5P+imT#C{FiYjyTK z#5*}g_BMyS)^mYUS0%R_%h%2E1wsInH(uArx~lf!R1|`tka(xFbHn}&TiIWBWstqi zfp>CDl)5Up)^mXuYFhtps&ISSaC_S5s@exEH-KcTHLCP7bc+%p^Hsxf){==R5rMn? zGFQ(wt!=?k!;sW+y^Q;hQqp4Yqlfe5jz`(QN=D678gZ+nw?w`kU_bg1R%_o_`XBK){zqx#Q<`^za;tt z>xc+|p3CiV^=I@KqS%>g`b)0In*(c;4Wj#jepUo$(+jifXrn?jfuk%!!*A5viabHCS)PuNwQ4ih!1nw zOeC84qTyj-#(@zujJXG=41*TZh;d=dSX)s9cWHrA=!N40^wLJ+DDA<-^qbuDp4)qV z-}61+-}#+$A&V@s$Rdj@viSc%Y!%TDZKnW;M(1%joHG9W!WTW(Sk7Pmanteb=?pFv zgp6ql^&;tTIPu@P4ZzIZnT*A^Wh~M?P^cHlks)7_2%kT|W94N4Y%6f36@SZwj12j3 zZ+BZR`1}D5R_(>T-Oa(Oy@Y2Y@*W}n6-tE+j+*gH0(?LG3yHsRQSo*)QsOs zfSQ4MD0fv2jTGD`-8)B~55Vt}6P814!WCsl zly3*70pzuTPAbcfkgH9L8-t%qbEuO&$KM9vw@*&-NW@L$N4)^_wx6+F$+O$Vf@yBp z6{Y(~+?6qZ4<*GrW&W?-6go9#J5Dp(aT>r90Z{UI6#%8W&Vp%5r>1R~OW9egwx%fV z3IKueMMCp23Z2P=8}{{C_p_}n00a$#Qe7u#7?KTUjq*d|#N?l%viyh~^Y<{4_W)1g zPZBhIrPo>~)oJi3ORbvco~5~^fwLdHA0?^p}q4j@gJ_bN>uwPubcu7>>922b0 z{;C@(@hMsCCmRkh8nrPdopLb}0pR?ZuK+mFTxY#E^xgF&{&OA=d3HMsrYYlMn!Mis zG_~Y|j%994%^}3fI1&W_;aMJJYM>RwTsP5LA|5vADD(%C@=LZHpv{07Q;Gvva8QoBd?N0RY)OwbEV{A^-+@ zuVj>K%f1j3k!ca2cpuR;jaV#3{f?FPP$Vj*ghL6JGDqHf^?7VLITWrP1jT;Wk`gyS z(Hc2>ypF|K3@tZThSoMV@lMxu6?A|?M{+eyh71G$%q)@E`lU9Db?`SWSa>*~3DC{} O0000(c;4Wj#jepUo$(+jifXrn?jfuk%!!*A5viabHCS)PuNwQ4ih!1nw zOeC84qTyj-#(@zujJXG=41*TZh;d=dSX)s9cWHrA=!N40^wLJ+DDA<-^qbuDp4)qV z-}61+-}#+$A&V@s$Rdj@viSc%Y!%TDZKnW;M(1%joHG9W!WTW(Sk7Pmanteb=?pFv zgp6ql^&;tTIPu@P4ZzIZnT*A^Wh~M?P^cHlks)7_2%kT|W94N4Y%6f36@SZwj12j3 zZ+BZR`1}D5R_(>T-Oa(Oy@Y2Y@*W}n6-tE+j+*gH0(?LG3yHsRQSo*)QsOs zfSQ4MD0fv2jTGD`-8)B~55Vt}6P814!WCsl zly3*70pzuTPAbcfkgH9L8-t%qbEuO&$KM9vw@*&-NW@L$N4)^_wx6+F$+O$Vf@yBp z6{Y(~+?6qZ4<*GrW&W?-6go9#J5Dp(aT>r90Z{UI6#%8W&Vp%5r>1R~OW9egwx%fV z3IKueMMCp23Z2P=8}{{C_p_}n00a$#Qe7u#7?KTUjq*d|#N?l%viyh~^Y<{4_W)1g zPZBhIrPo>~)oJi3ORbvco~5~^fwLdHA0?^p}q4j@gJ_bN>uwPubcu7>>922b0 z{;C@(@hMsCCmRkh8nrPdopLb}0pR?ZuK+mFTxY#E^xgF&{&OA=d3HMsrYYlMn!Mis zG_~Y|j%994%^}3fI1&W_;aMJJYM>RwTsP5LA|5vADD(%C@=LZHpv{07Q;Gvva8QoBd?N0RY)OwbEV{A^-+@ zuVj>K%f1j3k!ca2cpuR;jaV#3{f?FPP$Vj*ghL6JGDqHf^?7VLITWrP1jT;Wk`gyS z(Hc2>ypF|K3@tZThSoMV@lMxu6?A|?M{+eyh71G$%q)@E`lU9Db?`SWSa>*~3DC{} O0000sy$P35}Z z_DVb9vtji**3_x`uoVhKW3n1Yfzkp&B2-R5{O|Tr(bXvf{N%eucdztB4`VJ1-Wm@8 zBjXbQXe)Hbq1RO(Z}!fr&uXExRU*l-%Nj(12(@=G{PBlevf*O&-qhR-H~#!RK}llF zWx-cpOWot$-2ckUys_~#_f9vk?UbMAKl&!A4-Hg8g^WNJvQ`E3*J+nqvJ|2$7V^F+!VYn9Q> zKSO1(nl)_P=pxhIL}$9y;8Q>LGF1-OFS-ay64y!+3x5T1FWCvTcMv@KEN(;plQZ z9rXjS|KKsT?KM|ebzTg)6IMfGMG`=?J--l+vlx!6tHx)8$8~MJ#YX_>`(#0wp8Z>a z(Is_@BFDrk>Y~5mC@!FA+aAH{sYRMRgIIm3T<_h^@JK%o-hP{qr1z69=SBz}h+*ic z0SuEX;koj;TLIYJ_AQ6EZl$=O0B2d5tjq^RUtE4A!NpnK^AEIjsCi0+1|?=v^XVV} zK{eF-!5_FPtx1EVfKd%;^`ieC*%FVlKMp}j!YzvG_kpD_rS{d`{Goks3n$*$r{>#r z=S%7QrvgwtXg4A`O=BP}kWPm>cc0I4zORtiHtZsY17T%_huhvV6)zJ+b5n)BM+XK& zY0Ij}EKoMe(5VSKyK(t74i!_AEf-*!MgtjM@l!6pCJ#vKEz{={Q#*UA6>S}q;K%IY zDyvtNr&_O*WkDbkj|(=dl>_g6nYR7jo9ZaBUc}OJT)wQV6hL_T{jamJpen1E#<6pM zG9ErhbUB_80^rq811v4aaTFE^p;+vK9P0je`UgDuc(sBxN2dS)002ovPDHLkV1ngm B{(}Gj literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png new file mode 100644 index 0000000000000000000000000000000000000000..40901e1942d5dbf03a82209d18ca82e6d1a0ee76 GIT binary patch literal 1083 zcmV-B1jPG^P)sy$P35}Z z_DVb9vtji**3_x`uoVhKW3n1Yfzkp&B2-R5{O|Tr(bXvf{N%eucdztB4`VJ1-Wm@8 zBjXbQXe)Hbq1RO(Z}!fr&uXExRU*l-%Nj(12(@=G{PBlevf*O&-qhR-H~#!RK}llF zWx-cpOWot$-2ckUys_~#_f9vk?UbMAKl&!A4-Hg8g^WNJvQ`E3*J+nqvJ|2$7V^F+!VYn9Q> zKSO1(nl)_P=pxhIL}$9y;8Q>LGF1-OFS-ay64y!+3x5T1FWCvTcMv@KEN(;plQZ z9rXjS|KKsT?KM|ebzTg)6IMfGMG`=?J--l+vlx!6tHx)8$8~MJ#YX_>`(#0wp8Z>a z(Is_@BFDrk>Y~5mC@!FA+aAH{sYRMRgIIm3T<_h^@JK%o-hP{qr1z69=SBz}h+*ic z0SuEX;koj;TLIYJ_AQ6EZl$=O0B2d5tjq^RUtE4A!NpnK^AEIjsCi0+1|?=v^XVV} zK{eF-!5_FPtx1EVfKd%;^`ieC*%FVlKMp}j!YzvG_kpD_rS{d`{Goks3n$*$r{>#r z=S%7QrvgwtXg4A`O=BP}kWPm>cc0I4zORtiHtZsY17T%_huhvV6)zJ+b5n)BM+XK& zY0Ij}EKoMe(5VSKyK(t74i!_AEf-*!MgtjM@l!6pCJ#vKEz{={Q#*UA6>S}q;K%IY zDyvtNr&_O*WkDbkj|(=dl>_g6nYR7jo9ZaBUc}OJT)wQV6hL_T{jamJpen1E#<6pM zG9ErhbUB_80^rq811v4aaTFE^p;+vK9P0je`UgDuc(sBxN2dS)002ovPDHLkV1ngm B{(}Gj literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png new file mode 100644 index 0000000000000000000000000000000000000000..22462fabeabb1255ecf93df51e73741fd7ce5fde GIT binary patch literal 1077 zcmV-51j_q~P)Z z#+ayRbbcX>2s3exZMqN6F(R4ND%;33C?ThX9Dhrp4>Qn0#CMv1hpe*mSLf+-vE0 z{eA$RC@6+KdH^iW4I(YWj{T7Xw@=92h0k65?Dd)U77C4@@O8r|YqnN0bg`LQXE{G! z?j+Y{qdCipJf*6ocqJ8xqRxx|lIcgbT6`G&za%o>MN-n*+p zfI1-w8TtI%lWg6*BjLH;KNzK_?^x0ttNt?nfi7gI8~0z6RO<_**Y79SW>a>4V%^Ps z>Pp+lOWx01MQ}%<)PR)IS(i<}4sY z0tq$HwqZ+BFmGTaA?}MW9a7@#e`b%Wj4UPu77>%0Dnu-nXfk|SE$0{VVWR;l@n?OiJP+l~43wLz3ecrs5eC zLZH*>5JDh?U@{cqhF%XKGp2lECXVV}vh2q%OCL9d4?e0uN{LPv-ywV09XwM@p0?# v%bF92M7bkHFM2~^nV(^jtkS>K{|)~EPnn19h4=`}00000NkvXXu0mjf)Gh^y literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png new file mode 100644 index 0000000000000000000000000000000000000000..22462fabeabb1255ecf93df51e73741fd7ce5fde GIT binary patch literal 1077 zcmV-51j_q~P)Z z#+ayRbbcX>2s3exZMqN6F(R4ND%;33C?ThX9Dhrp4>Qn0#CMv1hpe*mSLf+-vE0 z{eA$RC@6+KdH^iW4I(YWj{T7Xw@=92h0k65?Dd)U77C4@@O8r|YqnN0bg`LQXE{G! z?j+Y{qdCipJf*6ocqJ8xqRxx|lIcgbT6`G&za%o>MN-n*+p zfI1-w8TtI%lWg6*BjLH;KNzK_?^x0ttNt?nfi7gI8~0z6RO<_**Y79SW>a>4V%^Ps z>Pp+lOWx01MQ}%<)PR)IS(i<}4sY z0tq$HwqZ+BFmGTaA?}MW9a7@#e`b%Wj4UPu77>%0Dnu-nXfk|SE$0{VVWR;l@n?OiJP+l~43wLz3ecrs5eC zLZH*>5JDh?U@{cqhF%XKGp2lECXVV}vh2q%OCL9d4?e0uN{LPv-ywV09XwM@p0?# v%bF92M7bkHFM2~^nV(^jtkS>K{|)~EPnn19h4=`}00000NkvXXu0mjf)Gh^y literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png new file mode 100644 index 0000000000000000000000000000000000000000..ceedfdf3c36ed2ea58920000662bc6ace7fa3363 GIT binary patch literal 1092 zcmV-K1iSl*P) z?#vWTymA?4OBT0;Xk^J0WN~wVVcCp2DFaqM3iON5_IOcR=wQn){J~pTf6dSBEWz%7XX*Dgn%!A)ozXTuV`z}AD zF*n?GN&Vy9r*Sz;0O<1!f+r@b&ohYIUbeBw@4yhAiIQzr?kT-$We4=`0pRN&N|VOy z+bdwqi(^v(03%~w9vP3)#~|*iGLC-u3r$~s&Z`ey;l%BI(9xP6A=zd{4i3))@VDoD z%7!j;>^nDl8OLJ>lg4}#9()rX?D@{5{?49j)Lw6;-7SE}Y2OMbBDI3=E^872AlfhZ zk}?t(6{n;yb4|nPrHuUX*>Yd8%?7|ZhePZi8Ifo5RqXjrp8oweZcR=C@a(o7(2xN@ zZow9jm1D>L)KTq1E_P2b9f+V>Gw%F*B^`_2=0+J0CLXZq&?K{MwpD8a^k)ZTQPVMo zzIqqcY@~R?ln@gqwEqQW=4ORC%f#F7zokt`ys=dDcdZp~b7M;D09?-r5{XI)P}CH= z?1HC0pm@RrzzugDBV%3w9GeQLta(lxs4L%)fK>skIKBS0@V(8A6ttXPb&1vN%1gA5 zA9Bm-nT4eB{;aLkA3g#=$EjF>ztPf`7=L1$LDR*UWSpv)wbqFXdGElJsAgkAh-x;{ z6?IZR_a~~^h-vphVJInMa(D<^VUetI?WL#hdtPpANS_c$60?$Zh1KlJ6FVE~aWIF` zQn=>)TmI1`zc0P=W@292g>01S`dXqwfTBnx5@9A3LdMDjDJ4P(q?A~!v71~9As$w9 z6GBe5ow@%)K6!B;fB9#*63UQKMPb(OUv?mtUBrc%R2318Qjs|)TEG1<9U*9cYaKuG z3{pzA72uYeYQ`77Bo#(3whQo-Z8d7bx zc)(&wfDl5^)7edL*CiB1q0}rzy(vgkQ5f_G(jXy*ri=(FnO|I#KEEF!B|=Je=Nm=W z!~#8?-K*wb{pn|_>nrgDB5cmFP-@B6;ywvY84*&-n3#wFgaq-RSfID-(p_!B3yTTS z^N~o}4jWAw83={|P%|_6=-jU<*$5!pkRb+wA-OrnlC~Q8-|!E&Bz{)u#4m9G0000< KMNUMnLSTYE_WyVQ literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png new file mode 100644 index 0000000000000000000000000000000000000000..ceedfdf3c36ed2ea58920000662bc6ace7fa3363 GIT binary patch literal 1092 zcmV-K1iSl*P) z?#vWTymA?4OBT0;Xk^J0WN~wVVcCp2DFaqM3iON5_IOcR=wQn){J~pTf6dSBEWz%7XX*Dgn%!A)ozXTuV`z}AD zF*n?GN&Vy9r*Sz;0O<1!f+r@b&ohYIUbeBw@4yhAiIQzr?kT-$We4=`0pRN&N|VOy z+bdwqi(^v(03%~w9vP3)#~|*iGLC-u3r$~s&Z`ey;l%BI(9xP6A=zd{4i3))@VDoD z%7!j;>^nDl8OLJ>lg4}#9()rX?D@{5{?49j)Lw6;-7SE}Y2OMbBDI3=E^872AlfhZ zk}?t(6{n;yb4|nPrHuUX*>Yd8%?7|ZhePZi8Ifo5RqXjrp8oweZcR=C@a(o7(2xN@ zZow9jm1D>L)KTq1E_P2b9f+V>Gw%F*B^`_2=0+J0CLXZq&?K{MwpD8a^k)ZTQPVMo zzIqqcY@~R?ln@gqwEqQW=4ORC%f#F7zokt`ys=dDcdZp~b7M;D09?-r5{XI)P}CH= z?1HC0pm@RrzzugDBV%3w9GeQLta(lxs4L%)fK>skIKBS0@V(8A6ttXPb&1vN%1gA5 zA9Bm-nT4eB{;aLkA3g#=$EjF>ztPf`7=L1$LDR*UWSpv)wbqFXdGElJsAgkAh-x;{ z6?IZR_a~~^h-vphVJInMa(D<^VUetI?WL#hdtPpANS_c$60?$Zh1KlJ6FVE~aWIF` zQn=>)TmI1`zc0P=W@292g>01S`dXqwfTBnx5@9A3LdMDjDJ4P(q?A~!v71~9As$w9 z6GBe5ow@%)K6!B;fB9#*63UQKMPb(OUv?mtUBrc%R2318Qjs|)TEG1<9U*9cYaKuG z3{pzA72uYeYQ`77Bo#(3whQo-Z8d7bx zc)(&wfDl5^)7edL*CiB1q0}rzy(vgkQ5f_G(jXy*ri=(FnO|I#KEEF!B|=Je=Nm=W z!~#8?-K*wb{pn|_>nrgDB5cmFP-@B6;ywvY84*&-n3#wFgaq-RSfID-(p_!B3yTTS z^N~o}4jWAw83={|P%|_6=-jU<*$5!pkRb+wA-OrnlC~Q8-|!E&Bz{)u#4m9G0000< KMNUMnLSTYE_WyVQ literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png new file mode 100644 index 0000000000000000000000000000000000000000..1156b4ebb79073695165aae069d080cb8d1683d0 GIT binary patch literal 1065 zcmV+^1lIeBP)ee=!?NDi1yA45VvB)~><`*&%@n#lbeljmaFBGRtD#IHG z>cy}M-i;0vh7O8?$h5UZ=h8@vleyWX>&Mz8%Xhz$<3*aRukBoyH#m^|;N={ibDr}& z|8w5+0R;*aC{Un4fdT~z6ew_OkpCjcr-z(<7{d zSTx3oQ>SU$(Fi~!5TR*jvjUi%xssR3)bcUNjkt7qLN&YU=y#6-P+nEe$T<(*u}j3` zF?9p?bzwO(c=e{8!u~T%&RN$?VCv!pIsEz|gRR+Bmn|cK2<27f0EW6*Eb&B&QeC^L zS*dWgqlR|_(C2P9w7n9DD0%y+!R8tKA}hw@^?^4n%H#FXR@G=G|16eLT~oe^1pxl? zo?f?Ovz{&key_p)q01d zpluGBRltM&MN?|Wg-{eX}Zg*5>T5*YDxSTZzWw$nq)XsI1H+EXx8!L~!>HGCVMZrfF=|m2}#oq%;j* zIFbhmX-ut%D8<6kk_v>wh*F4B-0QT;fPWEp|KO_r=YIT&*3K5ZktAEn>}<7{nh9^f z)QX5wDlH}{fGCiSvdHkj&~<&{i%VJ23&~{O4jWS|G8T;i;3zKU{jYyrmyZCYmLeI8 j#?+QFd*1fQ|AxN-1T25EEA3Vz00000NkvXXu0mjfgw_&C literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png b/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png new file mode 100644 index 0000000000000000000000000000000000000000..1156b4ebb79073695165aae069d080cb8d1683d0 GIT binary patch literal 1065 zcmV+^1lIeBP)ee=!?NDi1yA45VvB)~><`*&%@n#lbeljmaFBGRtD#IHG z>cy}M-i;0vh7O8?$h5UZ=h8@vleyWX>&Mz8%Xhz$<3*aRukBoyH#m^|;N={ibDr}& z|8w5+0R;*aC{Un4fdT~z6ew_OkpCjcr-z(<7{d zSTx3oQ>SU$(Fi~!5TR*jvjUi%xssR3)bcUNjkt7qLN&YU=y#6-P+nEe$T<(*u}j3` zF?9p?bzwO(c=e{8!u~T%&RN$?VCv!pIsEz|gRR+Bmn|cK2<27f0EW6*Eb&B&QeC^L zS*dWgqlR|_(C2P9w7n9DD0%y+!R8tKA}hw@^?^4n%H#FXR@G=G|16eLT~oe^1pxl? zo?f?Ovz{&key_p)q01d zpluGBRltM&MN?|Wg-{eX}Zg*5>T5*YDxSTZzWw$nq)XsI1H+EXx8!L~!>HGCVMZrfF=|m2}#oq%;j* zIFbhmX-ut%D8<6kk_v>wh*F4B-0QT;fPWEp|KO_r=YIT&*3K5ZktAEn>}<7{nh9^f z)QX5wDlH}{fGCiSvdHkj&~<&{i%VJ23&~{O4jWS|G8T;i;3zKU{jYyrmyZCYmLeI8 j#?+QFd*1fQ|AxN-1T25EEA3Vz00000NkvXXu0mjfgw_&C literal 0 HcmV?d00001 From 34b75070aeb64c78fad79268c461ae4eeb2bb24a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Mon, 23 May 2022 00:43:20 +0300 Subject: [PATCH 037/121] find bug in anim --- core/CMakeLists.txt | 2 +- .../condition/EndAnimationCondition.cpp | 8 +- .../condition/EndAnimationCondition.hpp | 3 +- core/event/management/controller/Attack.cpp | 50 +++++ core/event/management/controller/Attack.hpp | 19 ++ .../controller/statemachine/StateMachine.cpp | 2 +- core/event/physics/Collision.cpp | 2 +- core/event/physics/SensorCollision.cpp | 2 +- core/loader/LevelLoaderFromFile.cpp | 2 +- .../RenderableAnimatedSeveralFiles.cpp | 9 +- .../RenderableAnimatedSeveralFiles.hpp | 2 + core/visual/image/static/RenderableStatic.cpp | 2 +- core/visual/image/storage/ImageStorage.hpp | 8 +- core/world/LocalWorld.hpp | 2 +- game/mobs/hero/Hero.cpp | 194 +++++++++++++----- game/mobs/hero/Hero.hpp | 2 +- game/resources/levels/level_01/config.json | 61 +++++- game/resources/levels/level_01/map | 2 +- 18 files changed, 299 insertions(+), 73 deletions(-) create mode 100644 core/event/management/controller/Attack.cpp create mode 100644 core/event/management/controller/Attack.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index efccaff..1b3e1a0 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -96,7 +96,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/EndAnimationCondition.cpp b/core/event/management/condition/EndAnimationCondition.cpp index 309397e..a7f09eb 100644 --- a/core/event/management/condition/EndAnimationCondition.cpp +++ b/core/event/management/condition/EndAnimationCondition.cpp @@ -1,10 +1,16 @@ #include "EndAnimationCondition.hpp" #include "common/Cast.hpp" +#include "spdlog/spdlog.h" #include -mad::core::EndAnimationCondition::EndAnimationCondition(Entity::Id m_entity_id, ImageStorage::TypeAction m_type_action) : m_entity_id(m_entity_id), m_type_action(m_type_action){ +mad::core::EndAnimationCondition::EndAnimationCondition(Entity::Id m_entity_id, ImageStorage::TypeAction m_type_action, int *stage) : m_entity_id(m_entity_id), m_type_action(m_type_action), stage(stage){ } bool mad::core::EndAnimationCondition::is_triggered_by(const mad::core::Event &event) { auto e = const_cast_to(event); + if(m_entity_id == e.get_entity_id() && m_type_action == e.get_type_action()){ + (*stage)++; + //SPDLOG_DEBUG("current attack_stage {}", *stage); + } + //SPDLOG_DEBUG("current attack_stage {}", *stage); return m_entity_id == e.get_entity_id() && m_type_action == e.get_type_action(); } std::unordered_set mad::core::EndAnimationCondition::triggers() { diff --git a/core/event/management/condition/EndAnimationCondition.hpp b/core/event/management/condition/EndAnimationCondition.hpp index cc930f5..0b9514c 100644 --- a/core/event/management/condition/EndAnimationCondition.hpp +++ b/core/event/management/condition/EndAnimationCondition.hpp @@ -7,7 +7,7 @@ namespace mad::core { struct EndAnimationCondition : Condition { public: - explicit EndAnimationCondition(Entity::Id m_entity_id, ImageStorage::TypeAction m_type_action); + explicit EndAnimationCondition(Entity::Id m_entity_id, ImageStorage::TypeAction m_type_action, int *stage = new int(0)); bool is_triggered_by(const mad::core::Event &event) override; std::unordered_set triggers() override; void on_start() override; @@ -15,6 +15,7 @@ namespace mad::core { private: Entity::Id m_entity_id; ImageStorage::TypeAction m_type_action; + int* stage; }; }// namespace mad::core diff --git a/core/event/management/controller/Attack.cpp b/core/event/management/controller/Attack.cpp new file mode 100644 index 0000000..f8d3a5b --- /dev/null +++ b/core/event/management/controller/Attack.cpp @@ -0,0 +1,50 @@ +#include "Attack.hpp" +mad::core::Attack::Attack(std::shared_ptr world, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), attack_stage(attack_stage){ + Move_animation = ImageStorage::TypeAction::Attack_1_beg; + Idle_animation = ImageStorage::TypeAction::Attack_1_beg; +} +void mad::core::Attack::control() { + Movement::control(); + if((*attack_stage) % 6 == 0){ + if(Move_animation != ImageStorage::TypeAction::Attack_1_beg){ + SPDLOG_DEBUG("changed to Attack_1_beg"); + } + Move_animation = ImageStorage::TypeAction::Attack_1_beg; + Idle_animation = ImageStorage::TypeAction::Attack_1_beg; + } + if((*attack_stage) % 6 == 1){ + if(Move_animation != ImageStorage::TypeAction::Attack_1_end){ + SPDLOG_DEBUG("changed to Attack_1_end"); + } + Move_animation = ImageStorage::TypeAction::Attack_1_end; + Idle_animation = ImageStorage::TypeAction::Attack_1_end; + } + if((*attack_stage) % 6 == 2){ + if(Move_animation != ImageStorage::TypeAction::Attack_2_beg){ + SPDLOG_DEBUG("changed to Attack_2_beg"); + } + Move_animation = ImageStorage::TypeAction::Attack_2_beg; + Idle_animation = ImageStorage::TypeAction::Attack_2_beg; + } + if((*attack_stage) % 6 == 3){ + if(Move_animation != ImageStorage::TypeAction::Attack_2_end){ + SPDLOG_DEBUG("changed to Attack_2_end"); + } + Move_animation = ImageStorage::TypeAction::Attack_2_end; + Idle_animation = ImageStorage::TypeAction::Attack_2_end; + } + if((*attack_stage) % 6 == 4){ + if(Move_animation != ImageStorage::TypeAction::Attack_3_beg){ + SPDLOG_DEBUG("changed to Attack_3_beg"); + } + Move_animation = ImageStorage::TypeAction::Attack_3_beg; + Idle_animation = ImageStorage::TypeAction::Attack_3_beg; + } + if((*attack_stage) % 6 == 5){ + if(Move_animation != ImageStorage::TypeAction::Attack_3_end){ + SPDLOG_DEBUG("changed to Attack_3_end"); + } + Move_animation = ImageStorage::TypeAction::Attack_3_end; + Idle_animation = ImageStorage::TypeAction::Attack_3_end; + } +} diff --git a/core/event/management/controller/Attack.hpp b/core/event/management/controller/Attack.hpp new file mode 100644 index 0000000..e278c3a --- /dev/null +++ b/core/event/management/controller/Attack.hpp @@ -0,0 +1,19 @@ +#ifndef MAD_ATTACK_HPP +#define MAD_ATTACK_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Attack : public Movement { + public: + Attack(std::shared_ptr world, Entity::Id entity_id, Direction dir, int* attack_stage, float velocity = 0); + void control() override; + int *attack_stage; + }; + +} + +#endif//MAD_ATTACK_HPP diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index 96cc912..ab5f66c 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -15,7 +15,7 @@ void mad::core::Transition::handle(const mad::core::Event &event) { m_state_machine->has_made_transition = true; m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; - //SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); + SPDLOG_DEBUG("current state {}", m_state_machine->m_current_state_id); for (auto &i : m_state_machine->m_transitions[current_state]) { i->is_active = false; } diff --git a/core/event/physics/Collision.cpp b/core/event/physics/Collision.cpp index 0484b0c..b932ed2 100644 --- a/core/event/physics/Collision.cpp +++ b/core/event/physics/Collision.cpp @@ -1,5 +1,5 @@ #include "Collision.hpp" #include "spdlog/spdlog.h" mad::core::Collision::Collision(int new_first_object_id, int new_second_object_id) : Event(Event::Type::Collision), first_object_id(new_first_object_id), second_object_id(new_second_object_id) { - SPDLOG_INFO("handle collision {0} {1}", first_object_id, second_object_id); + //SPDLOG_INFO("handle collision {0} {1}", first_object_id, second_object_id); } diff --git a/core/event/physics/SensorCollision.cpp b/core/event/physics/SensorCollision.cpp index b8f0c33..24ec6bb 100644 --- a/core/event/physics/SensorCollision.cpp +++ b/core/event/physics/SensorCollision.cpp @@ -1,5 +1,5 @@ #include "SensorCollision.hpp" #include "spdlog/spdlog.h" mad::core::SensorCollision::SensorCollision(int m_id) : Event(Event::Type::SensorCollision), m_id(m_id) { - SPDLOG_INFO("sensor {}", m_id); + //SPDLOG_INFO("sensor {}", m_id); } diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 97eb900..549dbc4 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -64,7 +64,7 @@ namespace mad::core { std::make_shared( camera)};*/ - camera->set_zoom(0.07); + camera->set_zoom(0.10); auto level_runner = std::make_unique( system_listener, diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp index 8e8868f..023891e 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp @@ -1,8 +1,9 @@ #include "RenderableAnimatedSeveralFiles.hpp" +#include "spdlog/spdlog.h" -#include #include #include +#include namespace mad::core { @@ -36,7 +37,7 @@ namespace mad::core { m_scale = {animated_image->get_size_scale(), animated_image->get_size_scale()}; - float outline = 1; + float outline = 0.2; m_physical_shape = sf::RectangleShape({animated_image->get_physical_width() - outline, animated_image->get_physical_height() - outline}); m_physical_shape.setOrigin((animated_image->get_physical_width() - outline) / 2, @@ -55,6 +56,10 @@ namespace mad::core { } sf::Sprite render_sprite; + if(m_current_frame != debug_prev_sprite_num){ + debug_prev_sprite_num = m_current_frame; + SPDLOG_DEBUG("current frame number {}", m_current_frame); + } render_sprite.setTexture(m_textures[m_current_frame]); if (*m_orientation == Image::Orientation::Left && m_scale.get_x() > 0 || diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp index cdde1a1..d8871ab 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp @@ -42,6 +42,8 @@ namespace mad::core { float m_delta_y; sf::RectangleShape m_physical_shape; + + int debug_prev_sprite_num = 0; }; } diff --git a/core/visual/image/static/RenderableStatic.cpp b/core/visual/image/static/RenderableStatic.cpp index 8884430..35b97d1 100644 --- a/core/visual/image/static/RenderableStatic.cpp +++ b/core/visual/image/static/RenderableStatic.cpp @@ -32,7 +32,7 @@ namespace mad::core { } } - float outline = 1; + float outline = 0.2; m_physical_shape = sf::RectangleShape({static_image->get_width() - outline, static_image->get_height() - outline}); m_physical_shape.setOrigin((static_image->get_width() - outline) / 2, (static_image->get_height() - outline) / 2); diff --git a/core/visual/image/storage/ImageStorage.hpp b/core/visual/image/storage/ImageStorage.hpp index d866bd0..59b4808 100644 --- a/core/visual/image/storage/ImageStorage.hpp +++ b/core/visual/image/storage/ImageStorage.hpp @@ -13,10 +13,16 @@ namespace mad::core { enum class TypeAction { Idle, Run, - Attack, + Attack_1_beg, + Attack_1_end, + Attack_2_beg, + Attack_2_end, + Attack_3_beg, + Attack_3_end, Jump, Fly_up, Fall, + }; explicit ImageStorage(std::unordered_map> actions); diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index 4cb88c3..c517b0e 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -22,7 +22,7 @@ namespace mad::core { class LocalWorld : public World { public: - explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 60.0f}); + explicit LocalWorld(EventDispatcher &event_dispatcher, Vec2d gravitation_scale = {0, 40.0f}); bool manipulate(const Filter &filter, const Intent &intent) override; diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 0e4173e..fca0b4b 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -8,6 +8,7 @@ #include "event/management/condition/SensorCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Attack.hpp" #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" #include "event/management/controller/GroundMovement.hpp" @@ -64,6 +65,48 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_1_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_1_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_1_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_1_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_2_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_2_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_2_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_2_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_2_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_2_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_3_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_3_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_3_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_3_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, delta_x, delta_y)} } )); @@ -90,59 +133,108 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ }; auto machine = std::make_shared( std::shared_ptr(level_dispatcher)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, m_impulse)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); - machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); - - - machine->add_transition(0, 1, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(0, 2, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(1, 0, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(2, 0, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(1, 2, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(2, 1, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(0, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(1, 3, std::make_shared(sf::Keyboard::Space)); - machine->add_transition(2, 3, std::make_shared(sf::Keyboard::Space)); - - machine->add_transition(3, 5, std::make_shared()); - machine->add_transition(5, 4, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(5, 6, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(4, 5, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(6, 5, std::make_shared(sf::Keyboard::Right)); - - - machine->add_transition(4, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); - machine->add_transition(5, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); - machine->add_transition(6, 8, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); - - machine->add_transition(8, 7, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(8, 9, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(7, 8, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(9, 8, std::make_shared(sf::Keyboard::Right)); + StateMachine::StateId ground_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + StateMachine::StateId jump_impulse = machine->add_state(std::make_shared(world, hero_id, m_impulse)); + StateMachine::StateId start_jump_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + StateMachine::StateId start_jump_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + StateMachine::StateId start_jump_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId fly_up_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + StateMachine::StateId fly_up_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + StateMachine::StateId fly_up_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId fall_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + StateMachine::StateId fall_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + StateMachine::StateId fall_right= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + int *attack_stage = new int(0); + StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); + + machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_idle, ground_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_right, ground_idle, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_left, ground_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_right, ground_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_left, ground_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_idle, jump_impulse, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(ground_right, jump_impulse, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(ground_left, jump_impulse, std::make_shared(sf::Keyboard::Space)); + + machine->add_transition(jump_impulse, start_jump_idle, std::make_shared()); + machine->add_transition(start_jump_idle, start_jump_left , std::make_shared(sf::Keyboard::Left)); + machine->add_transition(start_jump_idle, start_jump_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(start_jump_left , start_jump_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(start_jump_right, start_jump_idle, std::make_shared(sf::Keyboard::Right)); + + + machine->add_transition(start_jump_left , fly_up_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + machine->add_transition(start_jump_idle, fly_up_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + machine->add_transition(start_jump_right, fly_up_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + + machine->add_transition(fly_up_idle, fly_up_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fly_up_idle, fly_up_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(fly_up_left, fly_up_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fly_up_right, fly_up_idle, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(fly_up_left, fall_idle, std::make_shared(world, hero_id)); + machine->add_transition(fly_up_idle, fall_idle, std::make_shared(world, hero_id)); + machine->add_transition(fly_up_right, fall_idle, std::make_shared(world, hero_id)); + + machine->add_transition(fall_idle, fall_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fall_idle, fall_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(fall_left, fall_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fall_right, fall_idle, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(fall_left, ground_idle, std::make_shared(hero_id)); + machine->add_transition(fall_idle, ground_idle, std::make_shared(hero_id)); + machine->add_transition(fall_right, ground_idle, std::make_shared(hero_id)); + + + machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(start_jump_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(start_jump_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(start_jump_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fly_up_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fly_up_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fly_up_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fall_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fall_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fall_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + + machine->add_transition(attack_idle, attack_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(attack_left, attack_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(attack_idle, attack_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(attack_right, attack_idle, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + machine->add_transition(attack_left, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + machine->add_transition(attack_right, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + + machine->add_transition(attack_left, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(attack_right, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_beg, attack_stage)); + machine->add_transition(attack_left, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_beg, attack_stage)); + machine->add_transition(attack_right, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_beg, attack_stage)); + + machine->add_transition(attack_left, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_end, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_end, attack_stage)); + machine->add_transition(attack_right, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_end, attack_stage)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_beg, attack_stage)); + machine->add_transition(attack_left, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_beg, attack_stage)); + machine->add_transition(attack_right, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_beg, attack_stage)); + + machine->add_transition(attack_left, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_end, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_end, attack_stage)); + machine->add_transition(attack_right, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_end, attack_stage)); - machine->add_transition(7, 11, std::make_shared(world, hero_id)); - machine->add_transition(8, 11, std::make_shared(world, hero_id)); - machine->add_transition(9, 11, std::make_shared(world, hero_id)); - machine->add_transition(11, 10, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(11, 12, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 11, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(12, 11, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(10, 0, std::make_shared(hero_id)); - machine->add_transition(11, 0, std::make_shared(hero_id)); - machine->add_transition(12, 0, std::make_shared(hero_id)); @@ -154,7 +246,7 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ /// add sensor auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); - m_entity->add_sensor({0, 4}, 0.3, 0.05); + m_entity->add_sensor({0, 6}, 2.65, 0.05); } mad::core::Entity::Id mad::core::Hero::get_hero_id() const { return hero_id; diff --git a/game/mobs/hero/Hero.hpp b/game/mobs/hero/Hero.hpp index 988369e..11df06c 100644 --- a/game/mobs/hero/Hero.hpp +++ b/game/mobs/hero/Hero.hpp @@ -16,7 +16,7 @@ namespace mad::core { Entity::Id hero_id; std::shared_ptr level_dispatcher; float horizontal_velocity = 20; - float m_impulse = 3000; + float m_impulse = 2000; }; }// namespace mad::core diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 3f8bdfc..fcebda0 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -1,7 +1,7 @@ { "name" : "level_01", "animated_resources" : "../../game/resources/animated/", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, @@ -18,21 +18,66 @@ "hero" : { "source" : "hero", "animated" : { - "size_width": 30, - "size_height": 50, - "size_scale": 0.2, + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, "delta_x" : 0, - "delta_y" : 0, + "delta_y" : 3, "actions" : { "idle" : { - "source": "idle", + "source": "hero_idle", "type": "several_files", - "delta_time": 100 + "delta_time": 200000 }, "run" : { - "source": "run", + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", "type": "several_files", "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 2000 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 2000 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 2000 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 2000 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 2000 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 2000 } } } diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 6878e22..1d60380 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,5 +1,5 @@ @......H..#..# -....#.......## +...##.......## ...#.#......## ###########.## ............## From 458519dab3524ee1991122d08f211434bc7fd06d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Mon, 23 May 2022 11:07:21 +0300 Subject: [PATCH 038/121] add debug --- .../image/animated/RenderableAnimatedSeveralFiles.cpp | 7 ++++--- .../image/animated/RenderableAnimatedSeveralFiles.hpp | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp index 023891e..3f5e6e5 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp @@ -27,6 +27,7 @@ namespace mad::core { CHECK_THROW(texture.loadFromFile(file_name), FileDoesNotExist, "File with StaticImage doesn't exist"); m_textures.push_back(texture); + debug_m_textures_names.push_back(file_name); } m_current_frame = m_textures.size(); @@ -56,9 +57,9 @@ namespace mad::core { } sf::Sprite render_sprite; - if(m_current_frame != debug_prev_sprite_num){ - debug_prev_sprite_num = m_current_frame; - SPDLOG_DEBUG("current frame number {}", m_current_frame); + if(debug_prev_name != debug_m_textures_names[m_current_frame]){ + debug_prev_name = debug_m_textures_names[m_current_frame]; + SPDLOG_DEBUG("current frame name {}", debug_prev_name); } render_sprite.setTexture(m_textures[m_current_frame]); diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp index d8871ab..c4d28e1 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.hpp @@ -44,6 +44,10 @@ namespace mad::core { sf::RectangleShape m_physical_shape; int debug_prev_sprite_num = 0; + + std::vector debug_m_textures_names; + + std::string debug_prev_name; }; } From b63a238fd311872ccfbcd66babf7848a661f83c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Mon, 23 May 2022 12:09:57 +0300 Subject: [PATCH 039/121] multiple conditions in one transaction --- .../management/condition/FallCondition.cpp | 4 ++-- .../management/condition/FallCondition.hpp | 3 ++- .../controller/statemachine/StateMachine.cpp | 18 ++++++++++++++---- .../controller/statemachine/StateMachine.hpp | 3 ++- .../RenderableAnimatedSeveralFiles.cpp | 2 +- game/mobs/hero/Hero.cpp | 9 ++++++--- game/resources/levels/level_01/config.json | 12 ++++++------ game/resources/levels/level_01/map | 5 +++++ 8 files changed, 38 insertions(+), 18 deletions(-) diff --git a/core/event/management/condition/FallCondition.cpp b/core/event/management/condition/FallCondition.cpp index 235eb11..ce13ed6 100644 --- a/core/event/management/condition/FallCondition.cpp +++ b/core/event/management/condition/FallCondition.cpp @@ -3,13 +3,13 @@ bool mad::core::FallCondition::is_triggered_by(const mad::core::Event &event) { - return m_entity->get_linear_velocity().get_y() >= 0; + return m_entity->get_linear_velocity().get_y() >= vel; } std::unordered_set mad::core::FallCondition::triggers() { return {mad::core::Event::Type::WorldUpdate}; } void mad::core::FallCondition::on_start() { } -mad::core::FallCondition::FallCondition(std::shared_ptr world, mad::core::Entity::Id entity_id) : m_world(world), m_entity_id(entity_id) { +mad::core::FallCondition::FallCondition(std::shared_ptr world, mad::core::Entity::Id entity_id, float vel) : m_world(world), m_entity_id(entity_id), vel(vel) { m_entity = cast_to_or_null(m_world->get_storage().get_entity(m_entity_id)); } diff --git a/core/event/management/condition/FallCondition.hpp b/core/event/management/condition/FallCondition.hpp index 905fe0b..2c54d13 100644 --- a/core/event/management/condition/FallCondition.hpp +++ b/core/event/management/condition/FallCondition.hpp @@ -9,7 +9,7 @@ namespace mad::core { struct FallCondition : Condition { public: - explicit FallCondition(std::shared_ptr world, Entity::Id entity_id); + explicit FallCondition(std::shared_ptr world, Entity::Id entity_id, float vel); bool is_triggered_by(const mad::core::Event &event) override; std::unordered_set triggers() override; void on_start() override; @@ -18,6 +18,7 @@ namespace mad::core { std::shared_ptr m_world; Entity::Id m_entity_id; PhysicalEntity *m_entity; + float vel; }; }// namespace mad::core diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index ab5f66c..82ce146 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -7,11 +7,17 @@ std::unordered_set mad::core::Transition::handled_types() { - return m_condition->triggers(); + return m_conditions[0]->triggers(); } void mad::core::Transition::handle(const mad::core::Event &event) { if (!is_active || m_state_machine->has_made_transition) return; - if (m_condition->is_triggered_by(event)) { + bool flag = true; + for(auto &i : m_conditions){ + if(!i->is_triggered_by(event)){ + flag = false; + } + } + if (flag) { m_state_machine->has_made_transition = true; m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; m_state_machine->m_current_state_id = next_state; @@ -21,11 +27,15 @@ void mad::core::Transition::handle(const mad::core::Event &event) { } for (auto &i : m_state_machine->m_transitions[next_state]) { i->is_active = true; - i->m_condition->on_start(); + for(auto &el : i->m_conditions){ + el->on_start(); + } } } } -mad::core::Transition::Transition(mad::core::StateMachine *m_state_machine, mad::core::StateMachine::StateId current_state, mad::core::StateMachine::StateId next_state, std::shared_ptr m_condition) : m_state_machine(m_state_machine), current_state(current_state), next_state(next_state), m_condition(std::move(m_condition)) { +mad::core::Transition::Transition(mad::core::StateMachine *m_state_machine, mad::core::StateMachine::StateId current_state, mad::core::StateMachine::StateId next_state, std::shared_ptr m_condition) : m_state_machine(m_state_machine), current_state(current_state), next_state(next_state), m_conditions({std::move(m_condition)}) { +} +mad::core::Transition::Transition(mad::core::StateMachine *m_state_machine, mad::core::StateMachine::StateId current_state, mad::core::StateMachine::StateId next_state, std::vector> m_conditions) : m_state_machine(m_state_machine), current_state(current_state), next_state(next_state), m_conditions(m_conditions) { } diff --git a/core/event/management/controller/statemachine/StateMachine.hpp b/core/event/management/controller/statemachine/StateMachine.hpp index 05e4791..880728f 100644 --- a/core/event/management/controller/statemachine/StateMachine.hpp +++ b/core/event/management/controller/statemachine/StateMachine.hpp @@ -37,6 +37,7 @@ namespace mad::core { struct Transition : EventHandler { public: Transition(StateMachine *m_state_machine, StateMachine::StateId current_state, StateMachine::StateId next_state, std::shared_ptr m_condition); + Transition(StateMachine *m_state_machine, StateMachine::StateId current_state, StateMachine::StateId next_state, std::vector> m_conditions); std::unordered_set handled_types() override; void handle(const Event &event) override; bool is_active = false; @@ -45,7 +46,7 @@ namespace mad::core { StateMachine *m_state_machine; StateMachine::StateId current_state; StateMachine::StateId next_state; - std::shared_ptr m_condition; + std::vector> m_conditions; }; }// namespace mad::core diff --git a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp index 3f5e6e5..cb6353c 100644 --- a/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp +++ b/core/visual/image/animated/RenderableAnimatedSeveralFiles.cpp @@ -59,7 +59,7 @@ namespace mad::core { sf::Sprite render_sprite; if(debug_prev_name != debug_m_textures_names[m_current_frame]){ debug_prev_name = debug_m_textures_names[m_current_frame]; - SPDLOG_DEBUG("current frame name {}", debug_prev_name); + //SPDLOG_DEBUG("current frame name {}", debug_prev_name); } render_sprite.setTexture(m_textures[m_current_frame]); diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index fca0b4b..e146f67 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -177,9 +177,12 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(fly_up_left, fly_up_idle, std::make_shared(sf::Keyboard::Left)); machine->add_transition(fly_up_right, fly_up_idle, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(fly_up_left, fall_idle, std::make_shared(world, hero_id)); - machine->add_transition(fly_up_idle, fall_idle, std::make_shared(world, hero_id)); - machine->add_transition(fly_up_right, fall_idle, std::make_shared(world, hero_id)); + machine->add_transition(fly_up_left, fall_idle, std::make_shared(world, hero_id, 0)); + machine->add_transition(fly_up_idle, fall_idle, std::make_shared(world, hero_id, 0)); + machine->add_transition(fly_up_right, fall_idle, std::make_shared(world, hero_id, 0)); + machine->add_transition(ground_left, fall_idle, std::make_shared(world, hero_id, 3)); + machine->add_transition(ground_idle, fall_idle, std::make_shared(world, hero_id, 3)); + machine->add_transition(ground_right, fall_idle, std::make_shared(world, hero_id, 3)); machine->add_transition(fall_idle, fall_left, std::make_shared(sf::Keyboard::Left)); machine->add_transition(fall_idle, fall_right, std::make_shared(sf::Keyboard::Right)); diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index fcebda0..3181bec 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -52,32 +52,32 @@ "attack_1_beg" : { "source": "hero_attack_1_beg", "type": "several_files", - "delta_time": 2000 + "delta_time": 30 }, "attack_1_end" : { "source": "hero_attack_1_end", "type": "several_files", - "delta_time": 2000 + "delta_time": 30 }, "attack_2_beg" : { "source": "hero_attack_2_beg", "type": "several_files", - "delta_time": 2000 + "delta_time": 30 }, "attack_2_end" : { "source": "hero_attack_2_end", "type": "several_files", - "delta_time": 2000 + "delta_time": 30 }, "attack_3_beg" : { "source": "hero_attack_3_beg", "type": "several_files", - "delta_time": 2000 + "delta_time": 30 }, "attack_3_end" : { "source": "hero_attack_3_end", "type": "several_files", - "delta_time": 2000 + "delta_time": 30 } } } diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 1d60380..846bc16 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,4 +1,9 @@ @......H..#..# +.............. +.............. +.............. +.............. +.............. ...##.......## ...#.#......## ###########.## From 94aee0cd4702ddce2f8983a1a38bfedda526b371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Mon, 23 May 2022 15:03:53 +0300 Subject: [PATCH 040/121] multiple conditions in one transaction + add fall without jump --- core/CMakeLists.txt | 2 +- core/event/Event.hpp | 3 ++- core/event/management/condition/Condition.hpp | 2 ++ .../condition/SensorEndCondition.cpp | 24 +++++++++++++++++ .../condition/SensorEndCondition.hpp | 23 ++++++++++++++++ .../controller/statemachine/StateMachine.cpp | 27 ++++++++++++++++--- .../controller/statemachine/StateMachine.hpp | 5 +++- core/event/physics/SensorCollisionEnd.cpp | 3 +++ core/event/physics/SensorCollisionEnd.hpp | 16 +++++++++++ .../ContactListener/ContactListener.hpp | 15 +++++------ game/mobs/hero/Hero.cpp | 8 +++--- game/resources/levels/level_01/config.json | 2 +- 12 files changed, 110 insertions(+), 20 deletions(-) create mode 100644 core/event/management/condition/SensorEndCondition.cpp create mode 100644 core/event/management/condition/SensorEndCondition.hpp create mode 100644 core/event/physics/SensorCollisionEnd.cpp create mode 100644 core/event/physics/SensorCollisionEnd.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 1b3e1a0..db79e48 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -96,7 +96,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/Event.hpp b/core/event/Event.hpp index ece2fec..b8ba690 100644 --- a/core/event/Event.hpp +++ b/core/event/Event.hpp @@ -18,7 +18,8 @@ namespace mad::core { Runner, WorldUpdate, EndOfRenderAction, - SensorCollision + SensorCollision, + SensorCollisionEnd, }; explicit Event(Type new_type); diff --git a/core/event/management/condition/Condition.hpp b/core/event/management/condition/Condition.hpp index 8a5fa05..dd3904b 100644 --- a/core/event/management/condition/Condition.hpp +++ b/core/event/management/condition/Condition.hpp @@ -18,6 +18,8 @@ namespace mad::core { virtual void on_start() = 0; virtual ~Condition() = default; + + bool triggered; }; } diff --git a/core/event/management/condition/SensorEndCondition.cpp b/core/event/management/condition/SensorEndCondition.cpp new file mode 100644 index 0000000..3462a9e --- /dev/null +++ b/core/event/management/condition/SensorEndCondition.cpp @@ -0,0 +1,24 @@ + +#include "SensorEndCondition.hpp" +#include "common/Cast.hpp" +#include "event/physics/SensorCollisionEnd.hpp" +#include + +mad::core::SensorEndCondition::SensorEndCondition(Entity::Id m_entity_id, float delta_time) : m_entity_id(m_entity_id), m_dt(delta_time){ +} +bool mad::core::SensorEndCondition::is_triggered_by(const mad::core::Event &event) { + if(event.type == Event::Type::SensorCollisionEnd){ + const auto &e = const_cast_to(event); + if(e.m_id == m_entity_id){ + sf::Time time = clock.getElapsedTime(); + timerStart = time.asSeconds(); + } + } + return clock.getElapsedTime().asSeconds() - timerStart < m_dt; + +} +std::unordered_set mad::core::SensorEndCondition::triggers() { + return {mad::core::Event::Type::SensorCollisionEnd, mad::core::Event::Type::WorldUpdate}; +} +void mad::core::SensorEndCondition::on_start() { +} diff --git a/core/event/management/condition/SensorEndCondition.hpp b/core/event/management/condition/SensorEndCondition.hpp new file mode 100644 index 0000000..efc7c2c --- /dev/null +++ b/core/event/management/condition/SensorEndCondition.hpp @@ -0,0 +1,23 @@ +#ifndef MAD_SENSORENDCONDITION_HPP +#define MAD_SENSORENDCONDITION_HPP + +#include "Condition.hpp" +#include "world/entity/Entity.hpp" +#include +namespace mad::core { + struct SensorEndCondition : Condition { + public: + explicit SensorEndCondition(Entity::Id m_entity_id, float delta_time); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + Entity::Id m_entity_id; + sf::Clock clock; + float timerStart; + float m_dt; + }; +}// namespace mad::core + +#endif//MAD_SENSORENDCONDITION_HPP diff --git a/core/event/management/controller/statemachine/StateMachine.cpp b/core/event/management/controller/statemachine/StateMachine.cpp index 82ce146..d5bd2d1 100644 --- a/core/event/management/controller/statemachine/StateMachine.cpp +++ b/core/event/management/controller/statemachine/StateMachine.cpp @@ -7,16 +7,25 @@ std::unordered_set mad::core::Transition::handled_types() { - return m_conditions[0]->triggers(); + std::unordered_set res; + for(auto const &i : m_conditions){ + res.insert(i->triggers().begin(), i->triggers().end()); + } + return res; } void mad::core::Transition::handle(const mad::core::Event &event) { if (!is_active || m_state_machine->has_made_transition) return; - bool flag = true; for(auto &i : m_conditions){ - if(!i->is_triggered_by(event)){ - flag = false; + if(i->triggers().find(event.type) != i->triggers().end()){ + if(i->is_triggered_by(event)){ + i->triggered = true; + } } } + bool flag = true; + for(auto &i : m_conditions){ + flag &= i->triggered; + } if (flag) { m_state_machine->has_made_transition = true; m_state_machine->m_previous_state_id = m_state_machine->m_current_state_id; @@ -42,6 +51,11 @@ mad::core::Transition::Transition(mad::core::StateMachine *m_state_machine, mad: /// StateMachine void mad::core::StateMachine::control() { //SPDLOG_DEBUG("current state {}", m_current_state_id); + for(auto &i : m_transitions[m_current_state_id]){ + for(auto &j : i->m_conditions){ + j->triggered = false; + } + } has_made_transition = false; m_states[m_current_state_id]->control(); } @@ -62,6 +76,11 @@ void mad::core::StateMachine::add_transition(mad::core::StateMachine::StateId st m_transitions[state_id_from].push_back(transition); m_dispatcher->registry(transition); } +void mad::core::StateMachine::add_transition(mad::core::StateMachine::StateId state_id_from, mad::core::StateMachine::StateId state_id_to, std::vector> transition_conditions) { + auto transition = std::make_shared(this, state_id_from, state_id_to, transition_conditions); + m_transitions[state_id_from].push_back(transition); + m_dispatcher->registry(transition); +} mad::core::StateMachine::StateMachine(std::shared_ptr m_dispatcher) : m_dispatcher(std::move(m_dispatcher)){ } mad::core::StateMachine::StateId mad::core::StateMachine::get_previous_state_id() { diff --git a/core/event/management/controller/statemachine/StateMachine.hpp b/core/event/management/controller/statemachine/StateMachine.hpp index 880728f..e9629da 100644 --- a/core/event/management/controller/statemachine/StateMachine.hpp +++ b/core/event/management/controller/statemachine/StateMachine.hpp @@ -19,6 +19,7 @@ namespace mad::core { StateId add_state(const std::shared_ptr &state); void add_transition(StateId state_id_from, StateId state_id_to, std::shared_ptr transition_condition); + void add_transition(StateId state_id_from, StateId state_id_to, std::vector> transition_conditions); void set_initial_state(StateId state_id); void control() override; StateId get_previous_state_id(); @@ -35,18 +36,20 @@ namespace mad::core { }; struct Transition : EventHandler { + std::vector> m_conditions; + public: Transition(StateMachine *m_state_machine, StateMachine::StateId current_state, StateMachine::StateId next_state, std::shared_ptr m_condition); Transition(StateMachine *m_state_machine, StateMachine::StateId current_state, StateMachine::StateId next_state, std::vector> m_conditions); std::unordered_set handled_types() override; void handle(const Event &event) override; bool is_active = false; + int cnt = 0; private: StateMachine *m_state_machine; StateMachine::StateId current_state; StateMachine::StateId next_state; - std::vector> m_conditions; }; }// namespace mad::core diff --git a/core/event/physics/SensorCollisionEnd.cpp b/core/event/physics/SensorCollisionEnd.cpp new file mode 100644 index 0000000..7da112c --- /dev/null +++ b/core/event/physics/SensorCollisionEnd.cpp @@ -0,0 +1,3 @@ +#include "SensorCollisionEnd.hpp" +mad::core::SensorCollisionEnd::SensorCollisionEnd(int m_id) : Event(Event::Type::SensorCollisionEnd), m_id(m_id) { +} diff --git a/core/event/physics/SensorCollisionEnd.hpp b/core/event/physics/SensorCollisionEnd.hpp new file mode 100644 index 0000000..6b936b1 --- /dev/null +++ b/core/event/physics/SensorCollisionEnd.hpp @@ -0,0 +1,16 @@ +#ifndef MAD_SENSORCOLLISIONEND_HPP +#define MAD_SENSORCOLLISIONEND_HPP + +#include "event/Event.hpp" +namespace mad::core { + + struct SensorCollisionEnd : public Event { + explicit SensorCollisionEnd(int m_id); + + const int m_id; + }; + +} + + +#endif//MAD_SENSORCOLLISIONEND_HPP diff --git a/core/world/entity/ContactListener/ContactListener.hpp b/core/world/entity/ContactListener/ContactListener.hpp index 9a42504..113a443 100644 --- a/core/world/entity/ContactListener/ContactListener.hpp +++ b/core/world/entity/ContactListener/ContactListener.hpp @@ -2,6 +2,7 @@ #define MAD_CONTACTLISTENER_HPP #include "event/physics/SensorCollision.hpp" +#include "event/physics/SensorCollisionEnd.hpp" #include "spdlog/spdlog.h" #include #include @@ -31,15 +32,11 @@ namespace mad::core{ void EndContact(b2Contact* contact) override{ - /*//check if fixture A was a ball - void* bodyUserData = contact->GetFixtureA()->GetBody()->GetUserData(); - if ( bodyUserData ) - static_cast( bodyUserData )->endContact(); - - //check if fixture B was a ball - bodyUserData = contact->GetFixtureB()->GetBody()->GetUserData(); - if ( bodyUserData ) - static_cast( bodyUserData )->endContact();*/ + ///sensors + b2FixtureUserData fixture_data_A = contact->GetFixtureA()->GetUserData(); + b2FixtureUserData fixture_data_B = contact->GetFixtureB()->GetUserData(); + if(static_cast(fixture_data_A.pointer) != 0) dispatcher.dispatch(std::make_shared(fixture_data_A.pointer)); + if(static_cast(fixture_data_B.pointer) != 0) dispatcher.dispatch(std::make_shared(fixture_data_B.pointer)); } diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index e146f67..0440854 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -6,6 +6,7 @@ #include "event/management/condition/KeyReleasedCondition.hpp" #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/SensorCondition.hpp" +#include "event/management/condition/SensorEndCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" @@ -180,9 +181,10 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ machine->add_transition(fly_up_left, fall_idle, std::make_shared(world, hero_id, 0)); machine->add_transition(fly_up_idle, fall_idle, std::make_shared(world, hero_id, 0)); machine->add_transition(fly_up_right, fall_idle, std::make_shared(world, hero_id, 0)); - machine->add_transition(ground_left, fall_idle, std::make_shared(world, hero_id, 3)); - machine->add_transition(ground_idle, fall_idle, std::make_shared(world, hero_id, 3)); - machine->add_transition(ground_right, fall_idle, std::make_shared(world, hero_id, 3)); + + machine->add_transition(ground_left, fall_idle, std::vector>{std::make_shared(world, hero_id, 0.1), std::make_shared(hero_id, 0.2)}); + machine->add_transition(ground_idle, fall_idle, std::vector>{std::make_shared(world, hero_id, 0.1), std::make_shared(hero_id, 0.2)}); + machine->add_transition(ground_right, fall_idle, std::vector>{std::make_shared(world, hero_id, 0.1), std::make_shared(hero_id, 0.2)}); machine->add_transition(fall_idle, fall_left, std::make_shared(sf::Keyboard::Left)); machine->add_transition(fall_idle, fall_right, std::make_shared(sf::Keyboard::Right)); diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 3181bec..7189c6c 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -27,7 +27,7 @@ "idle" : { "source": "hero_idle", "type": "several_files", - "delta_time": 200000 + "delta_time": 200 }, "run" : { "source": "hero_run", From ce4ef0f03d72cb5faa21d4c1992a6133cd6597d6 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 28 May 2022 16:05:17 +0300 Subject: [PATCH 041/121] Add httplib.h in submodule, move resources, add network directory and cmake --- .gitmodules | 3 ++ CMakeLists.txt | 16 +++++++ core/loader/LevelLoaderFromFile.cpp | 4 +- deps/cpp-httplib | 1 + game/game_database_example.cpp | 4 +- game/game_with_default_loader_example.cpp | 2 +- network/CMakeLists.txt | 41 ++++++++++++++++++ network/client/client.cpp | 6 +++ network/server/server.cpp | 6 +++ .../animated/helicopter.png | Bin .../hero/idle/Chara - BlueIdle00000.png | Bin .../hero/idle/Chara - BlueIdle00001.png | Bin .../hero/idle/Chara - BlueIdle00002.png | Bin .../hero/idle/Chara - BlueIdle00003.png | Bin .../hero/idle/Chara - BlueIdle00004.png | Bin .../hero/idle/Chara - BlueIdle00005.png | Bin .../hero/idle/Chara - BlueIdle00006.png | Bin .../hero/idle/Chara - BlueIdle00007.png | Bin .../hero/idle/Chara - BlueIdle00008.png | Bin .../hero/idle/Chara - BlueIdle00009.png | Bin .../hero/idle/Chara - BlueIdle00010.png | Bin .../hero/idle/Chara - BlueIdle00011.png | Bin .../hero/idle/Chara - BlueIdle00012.png | Bin .../hero/idle/Chara - BlueIdle00013.png | Bin .../hero/idle/Chara - BlueIdle00014.png | Bin .../hero/idle/Chara - BlueIdle00015.png | Bin .../hero/idle/Chara - BlueIdle00016.png | Bin .../hero/idle/Chara - BlueIdle00017.png | Bin .../hero/idle/Chara - BlueIdle00018.png | Bin .../hero/idle/Chara - BlueIdle00019.png | Bin .../animated/hero/run/Chara_BlueWalk00000.png | Bin .../animated/hero/run/Chara_BlueWalk00001.png | Bin .../animated/hero/run/Chara_BlueWalk00002.png | Bin .../animated/hero/run/Chara_BlueWalk00003.png | Bin .../animated/hero/run/Chara_BlueWalk00004.png | Bin .../animated/hero/run/Chara_BlueWalk00005.png | Bin .../animated/hero/run/Chara_BlueWalk00006.png | Bin .../animated/hero/run/Chara_BlueWalk00007.png | Bin .../animated/hero/run/Chara_BlueWalk00008.png | Bin .../animated/hero/run/Chara_BlueWalk00009.png | Bin .../animated/hero/run/Chara_BlueWalk00010.png | Bin .../animated/hero/run/Chara_BlueWalk00011.png | Bin .../animated/hero/run/Chara_BlueWalk00012.png | Bin .../animated/hero/run/Chara_BlueWalk00013.png | Bin .../animated/hero/run/Chara_BlueWalk00014.png | Bin .../animated/hero/run/Chara_BlueWalk00015.png | Bin .../animated/hero/run/Chara_BlueWalk00016.png | Bin .../animated/hero/run/Chara_BlueWalk00017.png | Bin .../animated/hero/run/Chara_BlueWalk00018.png | Bin .../animated/hero/run/Chara_BlueWalk00019.png | Bin .../animated/runner_new.png | Bin .../levels/level_01/config.json | 2 +- .../levels/level_01/map | 0 .../levels/level_with_finish/config.json | 2 +- .../levels/level_with_finish/map | 0 .../resources => resources}/static/18plus.png | Bin .../resources => resources}/static/brick.png | Bin {game/resources => resources}/static/exit.png | Bin 58 files changed, 80 insertions(+), 7 deletions(-) create mode 160000 deps/cpp-httplib create mode 100644 network/CMakeLists.txt create mode 100644 network/client/client.cpp create mode 100644 network/server/server.cpp rename {game/resources => resources}/animated/helicopter.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00000.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00001.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00002.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00003.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00004.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00005.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00006.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00007.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00008.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00009.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00010.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00011.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00012.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00013.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00014.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00015.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00016.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00017.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00018.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00019.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00000.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00001.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00002.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00003.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00004.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00005.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00006.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00007.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00008.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00009.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00010.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00011.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00012.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00013.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00014.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00015.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00016.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00017.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00018.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00019.png (100%) rename {game/resources => resources}/animated/runner_new.png (100%) rename {game/resources => resources}/levels/level_01/config.json (92%) rename {game/resources => resources}/levels/level_01/map (100%) rename {game/resources => resources}/levels/level_with_finish/config.json (92%) rename {game/resources => resources}/levels/level_with_finish/map (100%) rename {game/resources => resources}/static/18plus.png (100%) rename {game/resources => resources}/static/brick.png (100%) rename {game/resources => resources}/static/exit.png (100%) diff --git a/.gitmodules b/.gitmodules index c319e98..952393c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "deps/libpqxx"] path = deps/libpqxx url = https://github.com/jtv/libpqxx +[submodule "deps/cpp-httplib"] + path = deps/cpp-httplib + url = https://github.com/yhirose/cpp-httplib diff --git a/CMakeLists.txt b/CMakeLists.txt index 928f804..1c50a15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,13 @@ add_subdirectory(${DIRECTORY_PQXX}) message(STATUS "PostgreSQL include: ${INCLUDE_PQXX}") message(STATUS "PostgreSQL library: ${LIBRARY_PQXX}") +# HTTP library +set(DIRECTORY_HTTP ${PROJECT_SOURCE_DIR}/deps/cpp-httplib) +set(INCLUDE_HTTP ${DIRECTORY_HTTP}) + +add_subdirectory(${DIRECTORY_HTTP}) +message(STATUS "HTTP include: ${INCLUDE_HTTP}") + # Core library set(DIRECTORY_CORE ${PROJECT_SOURCE_DIR}/core) set(INCLUDE_CORE ${DIRECTORY_CORE}) @@ -105,6 +112,15 @@ add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") +# Network binaries +set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) +set(EXECUTABLE_SERVER server) +set(EXECUTABLE_CLIENT client) + +add_subdirectory(${DIRECTORY_NETWORK}) +message(STATUS "Server executable: ${EXECUTABLE_SERVER}") +message(STATUS "Client executable ${EXECUTABLE_GAME_CLIENT}") + # Tests set(DIRECTORY_TEST ${PROJECT_SOURCE_DIR}/test) set(EXECUTABLE_TEST test) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 2201916..324c61a 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -133,7 +133,7 @@ namespace mad::core { void LevelLoaderFromFile::create_block(std::shared_ptr world, Vec2d position, float block_size, bool is_stable) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); if (is_stable) { source /= static_cast(m_config_json["texture"]["stable"]); } else { @@ -203,7 +203,7 @@ namespace mad::core { } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); source /= static_cast(m_config_json["texture"]["finish"]); auto image_storage = std::make_shared( diff --git a/deps/cpp-httplib b/deps/cpp-httplib new file mode 160000 index 0000000..df20c27 --- /dev/null +++ b/deps/cpp-httplib @@ -0,0 +1 @@ +Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index 48e0fe2..586b030 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -45,8 +45,8 @@ int main() { auto database_storage_driver = std::make_shared(database); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_with_finish"), - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/game/game_with_default_loader_example.cpp b/game/game_with_default_loader_example.cpp index 337426b..a285992 100644 --- a/game/game_with_default_loader_example.cpp +++ b/game/game_with_default_loader_example.cpp @@ -42,7 +42,7 @@ int main() { auto offline_storage_driver = std::make_shared(); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt new file mode 100644 index 0000000..35f74e8 --- /dev/null +++ b/network/CMakeLists.txt @@ -0,0 +1,41 @@ +function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) + message(STATUS "Network executable: '${EXECUTABLE_NETWORK_NAME}' is built with ${EXECUTABLE_SOURCES}") + + add_executable( + ${EXECUTABLE_NETWORK_NAME} + ${EXECUTABLE_SOURCES} + ${SOURCES_IMGUI} + ${SOURCES_IMGUI_SFML} + ) + + if (CMAKE_BUILD_TYPE MATCHES Debug) + target_compile_definitions(${EXECUTABLE_NETWORK_NAME} PUBLIC SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE) + message(STATUS "Enable debug logs for ${EXECUTABLE_NETWORK_NAME}") + endif() + + target_include_directories( + ${EXECUTABLE_NETWORK_NAME} PUBLIC + + ${PROJECT_SOURCE_DIR} + ${INCLUDE_SPDLOG} + ${INCLUDE_BOX2D} + ${INCLUDE_IMGUI} + ${INCLUDE_IMGUI_SFML} + ${INCLUDE_HTTP} + ) + + target_link_libraries( + ${EXECUTABLE_NETWORK_NAME} + + ${LIBRARY_SFML} + ${LIBRARY_CORE} + ${LIBRARY_SPDLOG} + ${LIBRARY_BOX2D} + ${LIBRARY_OPENGL} + ${LIBRARY_PQXX} + ) + +endfunction() + +network_executable(${EXECUTABLE_SERVER} server/server.cpp) +network_executable(${EXECUTABLE_CLIENT} client/client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp new file mode 100644 index 0000000..b4b83b3 --- /dev/null +++ b/network/client/client.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from client!" << '\n'; +} diff --git a/network/server/server.cpp b/network/server/server.cpp new file mode 100644 index 0000000..d60b858 --- /dev/null +++ b/network/server/server.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from server!" << '\n'; +} diff --git a/game/resources/animated/helicopter.png b/resources/animated/helicopter.png similarity index 100% rename from game/resources/animated/helicopter.png rename to resources/animated/helicopter.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00000.png b/resources/animated/hero/idle/Chara - BlueIdle00000.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00000.png rename to resources/animated/hero/idle/Chara - BlueIdle00000.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00001.png b/resources/animated/hero/idle/Chara - BlueIdle00001.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00001.png rename to resources/animated/hero/idle/Chara - BlueIdle00001.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00002.png b/resources/animated/hero/idle/Chara - BlueIdle00002.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00002.png rename to resources/animated/hero/idle/Chara - BlueIdle00002.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00003.png b/resources/animated/hero/idle/Chara - BlueIdle00003.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00003.png rename to resources/animated/hero/idle/Chara - BlueIdle00003.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00004.png b/resources/animated/hero/idle/Chara - BlueIdle00004.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00004.png rename to resources/animated/hero/idle/Chara - BlueIdle00004.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00005.png b/resources/animated/hero/idle/Chara - BlueIdle00005.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00005.png rename to resources/animated/hero/idle/Chara - BlueIdle00005.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00006.png b/resources/animated/hero/idle/Chara - BlueIdle00006.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00006.png rename to resources/animated/hero/idle/Chara - BlueIdle00006.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00007.png b/resources/animated/hero/idle/Chara - BlueIdle00007.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00007.png rename to resources/animated/hero/idle/Chara - BlueIdle00007.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00008.png b/resources/animated/hero/idle/Chara - BlueIdle00008.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00008.png rename to resources/animated/hero/idle/Chara - BlueIdle00008.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00009.png b/resources/animated/hero/idle/Chara - BlueIdle00009.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00009.png rename to resources/animated/hero/idle/Chara - BlueIdle00009.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00010.png b/resources/animated/hero/idle/Chara - BlueIdle00010.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00010.png rename to resources/animated/hero/idle/Chara - BlueIdle00010.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00011.png b/resources/animated/hero/idle/Chara - BlueIdle00011.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00011.png rename to resources/animated/hero/idle/Chara - BlueIdle00011.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00012.png b/resources/animated/hero/idle/Chara - BlueIdle00012.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00012.png rename to resources/animated/hero/idle/Chara - BlueIdle00012.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00013.png b/resources/animated/hero/idle/Chara - BlueIdle00013.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00013.png rename to resources/animated/hero/idle/Chara - BlueIdle00013.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00014.png b/resources/animated/hero/idle/Chara - BlueIdle00014.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00014.png rename to resources/animated/hero/idle/Chara - BlueIdle00014.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00015.png b/resources/animated/hero/idle/Chara - BlueIdle00015.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00015.png rename to resources/animated/hero/idle/Chara - BlueIdle00015.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00016.png b/resources/animated/hero/idle/Chara - BlueIdle00016.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00016.png rename to resources/animated/hero/idle/Chara - BlueIdle00016.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00017.png b/resources/animated/hero/idle/Chara - BlueIdle00017.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00017.png rename to resources/animated/hero/idle/Chara - BlueIdle00017.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00018.png b/resources/animated/hero/idle/Chara - BlueIdle00018.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00018.png rename to resources/animated/hero/idle/Chara - BlueIdle00018.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00019.png b/resources/animated/hero/idle/Chara - BlueIdle00019.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00019.png rename to resources/animated/hero/idle/Chara - BlueIdle00019.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00000.png b/resources/animated/hero/run/Chara_BlueWalk00000.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00000.png rename to resources/animated/hero/run/Chara_BlueWalk00000.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00001.png b/resources/animated/hero/run/Chara_BlueWalk00001.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00001.png rename to resources/animated/hero/run/Chara_BlueWalk00001.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00002.png b/resources/animated/hero/run/Chara_BlueWalk00002.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00002.png rename to resources/animated/hero/run/Chara_BlueWalk00002.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00003.png b/resources/animated/hero/run/Chara_BlueWalk00003.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00003.png rename to resources/animated/hero/run/Chara_BlueWalk00003.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00004.png b/resources/animated/hero/run/Chara_BlueWalk00004.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00004.png rename to resources/animated/hero/run/Chara_BlueWalk00004.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00005.png b/resources/animated/hero/run/Chara_BlueWalk00005.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00005.png rename to resources/animated/hero/run/Chara_BlueWalk00005.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00006.png b/resources/animated/hero/run/Chara_BlueWalk00006.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00006.png rename to resources/animated/hero/run/Chara_BlueWalk00006.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00007.png b/resources/animated/hero/run/Chara_BlueWalk00007.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00007.png rename to resources/animated/hero/run/Chara_BlueWalk00007.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00008.png b/resources/animated/hero/run/Chara_BlueWalk00008.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00008.png rename to resources/animated/hero/run/Chara_BlueWalk00008.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00009.png b/resources/animated/hero/run/Chara_BlueWalk00009.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00009.png rename to resources/animated/hero/run/Chara_BlueWalk00009.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00010.png b/resources/animated/hero/run/Chara_BlueWalk00010.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00010.png rename to resources/animated/hero/run/Chara_BlueWalk00010.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00011.png b/resources/animated/hero/run/Chara_BlueWalk00011.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00011.png rename to resources/animated/hero/run/Chara_BlueWalk00011.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00012.png b/resources/animated/hero/run/Chara_BlueWalk00012.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00012.png rename to resources/animated/hero/run/Chara_BlueWalk00012.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00013.png b/resources/animated/hero/run/Chara_BlueWalk00013.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00013.png rename to resources/animated/hero/run/Chara_BlueWalk00013.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00014.png b/resources/animated/hero/run/Chara_BlueWalk00014.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00014.png rename to resources/animated/hero/run/Chara_BlueWalk00014.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00015.png b/resources/animated/hero/run/Chara_BlueWalk00015.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00015.png rename to resources/animated/hero/run/Chara_BlueWalk00015.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00016.png b/resources/animated/hero/run/Chara_BlueWalk00016.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00016.png rename to resources/animated/hero/run/Chara_BlueWalk00016.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00017.png b/resources/animated/hero/run/Chara_BlueWalk00017.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00017.png rename to resources/animated/hero/run/Chara_BlueWalk00017.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00018.png b/resources/animated/hero/run/Chara_BlueWalk00018.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00018.png rename to resources/animated/hero/run/Chara_BlueWalk00018.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00019.png b/resources/animated/hero/run/Chara_BlueWalk00019.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00019.png rename to resources/animated/hero/run/Chara_BlueWalk00019.png diff --git a/game/resources/animated/runner_new.png b/resources/animated/runner_new.png similarity index 100% rename from game/resources/animated/runner_new.png rename to resources/animated/runner_new.png diff --git a/game/resources/levels/level_01/config.json b/resources/levels/level_01/config.json similarity index 92% rename from game/resources/levels/level_01/config.json rename to resources/levels/level_01/config.json index 4594a7c..e03da1a 100644 --- a/game/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -1,6 +1,6 @@ { "name" : "level_01", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_01/map b/resources/levels/level_01/map similarity index 100% rename from game/resources/levels/level_01/map rename to resources/levels/level_01/map diff --git a/game/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json similarity index 92% rename from game/resources/levels/level_with_finish/config.json rename to resources/levels/level_with_finish/config.json index 6482a2a..edfee15 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -1,6 +1,6 @@ { "name" : "level_with_finish", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_with_finish/map b/resources/levels/level_with_finish/map similarity index 100% rename from game/resources/levels/level_with_finish/map rename to resources/levels/level_with_finish/map diff --git a/game/resources/static/18plus.png b/resources/static/18plus.png similarity index 100% rename from game/resources/static/18plus.png rename to resources/static/18plus.png diff --git a/game/resources/static/brick.png b/resources/static/brick.png similarity index 100% rename from game/resources/static/brick.png rename to resources/static/brick.png diff --git a/game/resources/static/exit.png b/resources/static/exit.png similarity index 100% rename from game/resources/static/exit.png rename to resources/static/exit.png From 6ee5a4b04f9a7cf591f96d7c136578c97b1ae000 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 28 May 2022 16:05:17 +0300 Subject: [PATCH 042/121] Add httplib.h in submodule, move resources, add network directory and cmake --- .gitmodules | 3 ++ CMakeLists.txt | 16 +++++++ core/loader/LevelLoaderFromFile.cpp | 4 +- deps/cpp-httplib | 1 + game/game_database_example.cpp | 4 +- game/game_with_default_loader_example.cpp | 2 +- network/CMakeLists.txt | 41 ++++++++++++++++++ network/client/client.cpp | 6 +++ network/server/server.cpp | 6 +++ .../animated/helicopter.png | Bin .../hero/idle/Chara - BlueIdle00000.png | Bin .../hero/idle/Chara - BlueIdle00001.png | Bin .../hero/idle/Chara - BlueIdle00002.png | Bin .../hero/idle/Chara - BlueIdle00003.png | Bin .../hero/idle/Chara - BlueIdle00004.png | Bin .../hero/idle/Chara - BlueIdle00005.png | Bin .../hero/idle/Chara - BlueIdle00006.png | Bin .../hero/idle/Chara - BlueIdle00007.png | Bin .../hero/idle/Chara - BlueIdle00008.png | Bin .../hero/idle/Chara - BlueIdle00009.png | Bin .../hero/idle/Chara - BlueIdle00010.png | Bin .../hero/idle/Chara - BlueIdle00011.png | Bin .../hero/idle/Chara - BlueIdle00012.png | Bin .../hero/idle/Chara - BlueIdle00013.png | Bin .../hero/idle/Chara - BlueIdle00014.png | Bin .../hero/idle/Chara - BlueIdle00015.png | Bin .../hero/idle/Chara - BlueIdle00016.png | Bin .../hero/idle/Chara - BlueIdle00017.png | Bin .../hero/idle/Chara - BlueIdle00018.png | Bin .../hero/idle/Chara - BlueIdle00019.png | Bin .../animated/hero/run/Chara_BlueWalk00000.png | Bin .../animated/hero/run/Chara_BlueWalk00001.png | Bin .../animated/hero/run/Chara_BlueWalk00002.png | Bin .../animated/hero/run/Chara_BlueWalk00003.png | Bin .../animated/hero/run/Chara_BlueWalk00004.png | Bin .../animated/hero/run/Chara_BlueWalk00005.png | Bin .../animated/hero/run/Chara_BlueWalk00006.png | Bin .../animated/hero/run/Chara_BlueWalk00007.png | Bin .../animated/hero/run/Chara_BlueWalk00008.png | Bin .../animated/hero/run/Chara_BlueWalk00009.png | Bin .../animated/hero/run/Chara_BlueWalk00010.png | Bin .../animated/hero/run/Chara_BlueWalk00011.png | Bin .../animated/hero/run/Chara_BlueWalk00012.png | Bin .../animated/hero/run/Chara_BlueWalk00013.png | Bin .../animated/hero/run/Chara_BlueWalk00014.png | Bin .../animated/hero/run/Chara_BlueWalk00015.png | Bin .../animated/hero/run/Chara_BlueWalk00016.png | Bin .../animated/hero/run/Chara_BlueWalk00017.png | Bin .../animated/hero/run/Chara_BlueWalk00018.png | Bin .../animated/hero/run/Chara_BlueWalk00019.png | Bin .../animated/runner_new.png | Bin .../levels/level_01/config.json | 2 +- .../levels/level_01/map | 0 .../levels/level_with_finish/config.json | 2 +- .../levels/level_with_finish/map | 0 .../resources => resources}/static/18plus.png | Bin .../resources => resources}/static/brick.png | Bin {game/resources => resources}/static/exit.png | Bin 58 files changed, 80 insertions(+), 7 deletions(-) create mode 160000 deps/cpp-httplib create mode 100644 network/CMakeLists.txt create mode 100644 network/client/client.cpp create mode 100644 network/server/server.cpp rename {game/resources => resources}/animated/helicopter.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00000.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00001.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00002.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00003.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00004.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00005.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00006.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00007.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00008.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00009.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00010.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00011.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00012.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00013.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00014.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00015.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00016.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00017.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00018.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00019.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00000.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00001.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00002.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00003.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00004.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00005.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00006.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00007.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00008.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00009.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00010.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00011.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00012.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00013.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00014.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00015.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00016.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00017.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00018.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00019.png (100%) rename {game/resources => resources}/animated/runner_new.png (100%) rename {game/resources => resources}/levels/level_01/config.json (92%) rename {game/resources => resources}/levels/level_01/map (100%) rename {game/resources => resources}/levels/level_with_finish/config.json (92%) rename {game/resources => resources}/levels/level_with_finish/map (100%) rename {game/resources => resources}/static/18plus.png (100%) rename {game/resources => resources}/static/brick.png (100%) rename {game/resources => resources}/static/exit.png (100%) diff --git a/.gitmodules b/.gitmodules index c319e98..952393c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "deps/libpqxx"] path = deps/libpqxx url = https://github.com/jtv/libpqxx +[submodule "deps/cpp-httplib"] + path = deps/cpp-httplib + url = https://github.com/yhirose/cpp-httplib diff --git a/CMakeLists.txt b/CMakeLists.txt index 928f804..1c50a15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,13 @@ add_subdirectory(${DIRECTORY_PQXX}) message(STATUS "PostgreSQL include: ${INCLUDE_PQXX}") message(STATUS "PostgreSQL library: ${LIBRARY_PQXX}") +# HTTP library +set(DIRECTORY_HTTP ${PROJECT_SOURCE_DIR}/deps/cpp-httplib) +set(INCLUDE_HTTP ${DIRECTORY_HTTP}) + +add_subdirectory(${DIRECTORY_HTTP}) +message(STATUS "HTTP include: ${INCLUDE_HTTP}") + # Core library set(DIRECTORY_CORE ${PROJECT_SOURCE_DIR}/core) set(INCLUDE_CORE ${DIRECTORY_CORE}) @@ -105,6 +112,15 @@ add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") +# Network binaries +set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) +set(EXECUTABLE_SERVER server) +set(EXECUTABLE_CLIENT client) + +add_subdirectory(${DIRECTORY_NETWORK}) +message(STATUS "Server executable: ${EXECUTABLE_SERVER}") +message(STATUS "Client executable ${EXECUTABLE_GAME_CLIENT}") + # Tests set(DIRECTORY_TEST ${PROJECT_SOURCE_DIR}/test) set(EXECUTABLE_TEST test) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 2201916..324c61a 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -133,7 +133,7 @@ namespace mad::core { void LevelLoaderFromFile::create_block(std::shared_ptr world, Vec2d position, float block_size, bool is_stable) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); if (is_stable) { source /= static_cast(m_config_json["texture"]["stable"]); } else { @@ -203,7 +203,7 @@ namespace mad::core { } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); source /= static_cast(m_config_json["texture"]["finish"]); auto image_storage = std::make_shared( diff --git a/deps/cpp-httplib b/deps/cpp-httplib new file mode 160000 index 0000000..df20c27 --- /dev/null +++ b/deps/cpp-httplib @@ -0,0 +1 @@ +Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index 48e0fe2..586b030 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -45,8 +45,8 @@ int main() { auto database_storage_driver = std::make_shared(database); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_with_finish"), - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/game/game_with_default_loader_example.cpp b/game/game_with_default_loader_example.cpp index 337426b..a285992 100644 --- a/game/game_with_default_loader_example.cpp +++ b/game/game_with_default_loader_example.cpp @@ -42,7 +42,7 @@ int main() { auto offline_storage_driver = std::make_shared(); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt new file mode 100644 index 0000000..35f74e8 --- /dev/null +++ b/network/CMakeLists.txt @@ -0,0 +1,41 @@ +function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) + message(STATUS "Network executable: '${EXECUTABLE_NETWORK_NAME}' is built with ${EXECUTABLE_SOURCES}") + + add_executable( + ${EXECUTABLE_NETWORK_NAME} + ${EXECUTABLE_SOURCES} + ${SOURCES_IMGUI} + ${SOURCES_IMGUI_SFML} + ) + + if (CMAKE_BUILD_TYPE MATCHES Debug) + target_compile_definitions(${EXECUTABLE_NETWORK_NAME} PUBLIC SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE) + message(STATUS "Enable debug logs for ${EXECUTABLE_NETWORK_NAME}") + endif() + + target_include_directories( + ${EXECUTABLE_NETWORK_NAME} PUBLIC + + ${PROJECT_SOURCE_DIR} + ${INCLUDE_SPDLOG} + ${INCLUDE_BOX2D} + ${INCLUDE_IMGUI} + ${INCLUDE_IMGUI_SFML} + ${INCLUDE_HTTP} + ) + + target_link_libraries( + ${EXECUTABLE_NETWORK_NAME} + + ${LIBRARY_SFML} + ${LIBRARY_CORE} + ${LIBRARY_SPDLOG} + ${LIBRARY_BOX2D} + ${LIBRARY_OPENGL} + ${LIBRARY_PQXX} + ) + +endfunction() + +network_executable(${EXECUTABLE_SERVER} server/server.cpp) +network_executable(${EXECUTABLE_CLIENT} client/client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp new file mode 100644 index 0000000..b4b83b3 --- /dev/null +++ b/network/client/client.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from client!" << '\n'; +} diff --git a/network/server/server.cpp b/network/server/server.cpp new file mode 100644 index 0000000..d60b858 --- /dev/null +++ b/network/server/server.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from server!" << '\n'; +} diff --git a/game/resources/animated/helicopter.png b/resources/animated/helicopter.png similarity index 100% rename from game/resources/animated/helicopter.png rename to resources/animated/helicopter.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00000.png b/resources/animated/hero/idle/Chara - BlueIdle00000.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00000.png rename to resources/animated/hero/idle/Chara - BlueIdle00000.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00001.png b/resources/animated/hero/idle/Chara - BlueIdle00001.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00001.png rename to resources/animated/hero/idle/Chara - BlueIdle00001.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00002.png b/resources/animated/hero/idle/Chara - BlueIdle00002.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00002.png rename to resources/animated/hero/idle/Chara - BlueIdle00002.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00003.png b/resources/animated/hero/idle/Chara - BlueIdle00003.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00003.png rename to resources/animated/hero/idle/Chara - BlueIdle00003.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00004.png b/resources/animated/hero/idle/Chara - BlueIdle00004.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00004.png rename to resources/animated/hero/idle/Chara - BlueIdle00004.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00005.png b/resources/animated/hero/idle/Chara - BlueIdle00005.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00005.png rename to resources/animated/hero/idle/Chara - BlueIdle00005.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00006.png b/resources/animated/hero/idle/Chara - BlueIdle00006.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00006.png rename to resources/animated/hero/idle/Chara - BlueIdle00006.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00007.png b/resources/animated/hero/idle/Chara - BlueIdle00007.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00007.png rename to resources/animated/hero/idle/Chara - BlueIdle00007.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00008.png b/resources/animated/hero/idle/Chara - BlueIdle00008.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00008.png rename to resources/animated/hero/idle/Chara - BlueIdle00008.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00009.png b/resources/animated/hero/idle/Chara - BlueIdle00009.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00009.png rename to resources/animated/hero/idle/Chara - BlueIdle00009.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00010.png b/resources/animated/hero/idle/Chara - BlueIdle00010.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00010.png rename to resources/animated/hero/idle/Chara - BlueIdle00010.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00011.png b/resources/animated/hero/idle/Chara - BlueIdle00011.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00011.png rename to resources/animated/hero/idle/Chara - BlueIdle00011.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00012.png b/resources/animated/hero/idle/Chara - BlueIdle00012.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00012.png rename to resources/animated/hero/idle/Chara - BlueIdle00012.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00013.png b/resources/animated/hero/idle/Chara - BlueIdle00013.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00013.png rename to resources/animated/hero/idle/Chara - BlueIdle00013.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00014.png b/resources/animated/hero/idle/Chara - BlueIdle00014.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00014.png rename to resources/animated/hero/idle/Chara - BlueIdle00014.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00015.png b/resources/animated/hero/idle/Chara - BlueIdle00015.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00015.png rename to resources/animated/hero/idle/Chara - BlueIdle00015.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00016.png b/resources/animated/hero/idle/Chara - BlueIdle00016.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00016.png rename to resources/animated/hero/idle/Chara - BlueIdle00016.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00017.png b/resources/animated/hero/idle/Chara - BlueIdle00017.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00017.png rename to resources/animated/hero/idle/Chara - BlueIdle00017.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00018.png b/resources/animated/hero/idle/Chara - BlueIdle00018.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00018.png rename to resources/animated/hero/idle/Chara - BlueIdle00018.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00019.png b/resources/animated/hero/idle/Chara - BlueIdle00019.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00019.png rename to resources/animated/hero/idle/Chara - BlueIdle00019.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00000.png b/resources/animated/hero/run/Chara_BlueWalk00000.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00000.png rename to resources/animated/hero/run/Chara_BlueWalk00000.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00001.png b/resources/animated/hero/run/Chara_BlueWalk00001.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00001.png rename to resources/animated/hero/run/Chara_BlueWalk00001.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00002.png b/resources/animated/hero/run/Chara_BlueWalk00002.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00002.png rename to resources/animated/hero/run/Chara_BlueWalk00002.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00003.png b/resources/animated/hero/run/Chara_BlueWalk00003.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00003.png rename to resources/animated/hero/run/Chara_BlueWalk00003.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00004.png b/resources/animated/hero/run/Chara_BlueWalk00004.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00004.png rename to resources/animated/hero/run/Chara_BlueWalk00004.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00005.png b/resources/animated/hero/run/Chara_BlueWalk00005.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00005.png rename to resources/animated/hero/run/Chara_BlueWalk00005.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00006.png b/resources/animated/hero/run/Chara_BlueWalk00006.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00006.png rename to resources/animated/hero/run/Chara_BlueWalk00006.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00007.png b/resources/animated/hero/run/Chara_BlueWalk00007.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00007.png rename to resources/animated/hero/run/Chara_BlueWalk00007.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00008.png b/resources/animated/hero/run/Chara_BlueWalk00008.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00008.png rename to resources/animated/hero/run/Chara_BlueWalk00008.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00009.png b/resources/animated/hero/run/Chara_BlueWalk00009.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00009.png rename to resources/animated/hero/run/Chara_BlueWalk00009.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00010.png b/resources/animated/hero/run/Chara_BlueWalk00010.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00010.png rename to resources/animated/hero/run/Chara_BlueWalk00010.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00011.png b/resources/animated/hero/run/Chara_BlueWalk00011.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00011.png rename to resources/animated/hero/run/Chara_BlueWalk00011.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00012.png b/resources/animated/hero/run/Chara_BlueWalk00012.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00012.png rename to resources/animated/hero/run/Chara_BlueWalk00012.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00013.png b/resources/animated/hero/run/Chara_BlueWalk00013.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00013.png rename to resources/animated/hero/run/Chara_BlueWalk00013.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00014.png b/resources/animated/hero/run/Chara_BlueWalk00014.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00014.png rename to resources/animated/hero/run/Chara_BlueWalk00014.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00015.png b/resources/animated/hero/run/Chara_BlueWalk00015.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00015.png rename to resources/animated/hero/run/Chara_BlueWalk00015.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00016.png b/resources/animated/hero/run/Chara_BlueWalk00016.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00016.png rename to resources/animated/hero/run/Chara_BlueWalk00016.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00017.png b/resources/animated/hero/run/Chara_BlueWalk00017.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00017.png rename to resources/animated/hero/run/Chara_BlueWalk00017.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00018.png b/resources/animated/hero/run/Chara_BlueWalk00018.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00018.png rename to resources/animated/hero/run/Chara_BlueWalk00018.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00019.png b/resources/animated/hero/run/Chara_BlueWalk00019.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00019.png rename to resources/animated/hero/run/Chara_BlueWalk00019.png diff --git a/game/resources/animated/runner_new.png b/resources/animated/runner_new.png similarity index 100% rename from game/resources/animated/runner_new.png rename to resources/animated/runner_new.png diff --git a/game/resources/levels/level_01/config.json b/resources/levels/level_01/config.json similarity index 92% rename from game/resources/levels/level_01/config.json rename to resources/levels/level_01/config.json index 4594a7c..e03da1a 100644 --- a/game/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -1,6 +1,6 @@ { "name" : "level_01", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_01/map b/resources/levels/level_01/map similarity index 100% rename from game/resources/levels/level_01/map rename to resources/levels/level_01/map diff --git a/game/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json similarity index 92% rename from game/resources/levels/level_with_finish/config.json rename to resources/levels/level_with_finish/config.json index 6482a2a..edfee15 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -1,6 +1,6 @@ { "name" : "level_with_finish", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_with_finish/map b/resources/levels/level_with_finish/map similarity index 100% rename from game/resources/levels/level_with_finish/map rename to resources/levels/level_with_finish/map diff --git a/game/resources/static/18plus.png b/resources/static/18plus.png similarity index 100% rename from game/resources/static/18plus.png rename to resources/static/18plus.png diff --git a/game/resources/static/brick.png b/resources/static/brick.png similarity index 100% rename from game/resources/static/brick.png rename to resources/static/brick.png diff --git a/game/resources/static/exit.png b/resources/static/exit.png similarity index 100% rename from game/resources/static/exit.png rename to resources/static/exit.png From 6624759f321235f7eeabc408a4d88f8045d80e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 29 May 2022 13:55:00 +0300 Subject: [PATCH 043/121] make HeroStateMachine --- core/CMakeLists.txt | 2 +- .../statemachine/HeroStateMachine.cpp | 138 ++++++++++++++++++ .../statemachine/HeroStateMachine.hpp | 16 ++ core/loader/LevelLoaderFromFile.cpp | 86 ++++++++++- 4 files changed, 235 insertions(+), 7 deletions(-) create mode 100644 core/event/management/controller/statemachine/HeroStateMachine.cpp create mode 100644 core/event/management/controller/statemachine/HeroStateMachine.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index db79e48..743ade8 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -96,7 +96,7 @@ set( event/management/condition/KeyPressedCondition.hpp event/management/condition/KeyPressedCondition.cpp event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp new file mode 100644 index 0000000..45a8d8f --- /dev/null +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -0,0 +1,138 @@ +#include "HeroStateMachine.hpp" +#include "event/management/condition/EndAnimationCondition.hpp" +#include "event/management/condition/FallCondition.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/KeyReleasedCondition.hpp" +#include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/SensorCondition.hpp" +#include "event/management/condition/SensorEndCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Attack.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" + +mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, mad::core::Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity) : StateMachine(level_dispatcher){ + auto machine = this; + + + StateMachine::StateId ground_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + StateMachine::StateId jump_impulse = machine->add_state(std::make_shared(world, hero_id, m_impulse)); + StateMachine::StateId start_jump_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + StateMachine::StateId start_jump_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + StateMachine::StateId start_jump_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId fly_up_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 7 + StateMachine::StateId fly_up_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + StateMachine::StateId fly_up_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId fall_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); /// 10 + StateMachine::StateId fall_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); + StateMachine::StateId fall_right= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + int *attack_stage = new int(0); + StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); + + machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_idle, ground_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_right, ground_idle, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_left, ground_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_right, ground_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_left, ground_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_idle, jump_impulse, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(ground_right, jump_impulse, std::make_shared(sf::Keyboard::Space)); + machine->add_transition(ground_left, jump_impulse, std::make_shared(sf::Keyboard::Space)); + + machine->add_transition(jump_impulse, start_jump_idle, std::make_shared()); + machine->add_transition(start_jump_idle, start_jump_left , std::make_shared(sf::Keyboard::Left)); + machine->add_transition(start_jump_idle, start_jump_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(start_jump_left , start_jump_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(start_jump_right, start_jump_idle, std::make_shared(sf::Keyboard::Right)); + + + machine->add_transition(start_jump_left , fly_up_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + machine->add_transition(start_jump_idle, fly_up_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + machine->add_transition(start_jump_right, fly_up_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Jump)); + + machine->add_transition(fly_up_idle, fly_up_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fly_up_idle, fly_up_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(fly_up_left, fly_up_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fly_up_right, fly_up_idle, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(fly_up_left, fall_idle, std::make_shared(world, hero_id, 0)); + machine->add_transition(fly_up_idle, fall_idle, std::make_shared(world, hero_id, 0)); + machine->add_transition(fly_up_right, fall_idle, std::make_shared(world, hero_id, 0)); + + machine->add_transition(ground_left, fall_idle, std::vector>{std::make_shared(world, hero_id, 0.1), std::make_shared(hero_id, 0.2)}); + machine->add_transition(ground_idle, fall_idle, std::vector>{std::make_shared(world, hero_id, 0.1), std::make_shared(hero_id, 0.2)}); + machine->add_transition(ground_right, fall_idle, std::vector>{std::make_shared(world, hero_id, 0.1), std::make_shared(hero_id, 0.2)}); + + machine->add_transition(fall_idle, fall_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fall_idle, fall_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(fall_left, fall_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(fall_right, fall_idle, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(fall_left, ground_idle, std::make_shared(hero_id)); + machine->add_transition(fall_idle, ground_idle, std::make_shared(hero_id)); + machine->add_transition(fall_right, ground_idle, std::make_shared(hero_id)); + + + machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(start_jump_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(start_jump_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(start_jump_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fly_up_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fly_up_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fly_up_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fall_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fall_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(fall_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + + machine->add_transition(attack_idle, attack_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(attack_left, attack_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(attack_idle, attack_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(attack_right, attack_idle, std::make_shared(sf::Keyboard::Right)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + machine->add_transition(attack_left, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + machine->add_transition(attack_right, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + + machine->add_transition(attack_left, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(attack_right, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_beg, attack_stage)); + machine->add_transition(attack_left, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_beg, attack_stage)); + machine->add_transition(attack_right, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_beg, attack_stage)); + + machine->add_transition(attack_left, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_end, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_end, attack_stage)); + machine->add_transition(attack_right, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_2_end, attack_stage)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_beg, attack_stage)); + machine->add_transition(attack_left, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_beg, attack_stage)); + machine->add_transition(attack_right, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_beg, attack_stage)); + + machine->add_transition(attack_left, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_end, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_end, attack_stage)); + machine->add_transition(attack_right, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_3_end, attack_stage)); + + + + + + + + + machine->set_initial_state(0); + //controllers.push_back(machine); +} diff --git a/core/event/management/controller/statemachine/HeroStateMachine.hpp b/core/event/management/controller/statemachine/HeroStateMachine.hpp new file mode 100644 index 0000000..9b8b0f7 --- /dev/null +++ b/core/event/management/controller/statemachine/HeroStateMachine.hpp @@ -0,0 +1,16 @@ +#ifndef MAD_HEROSTATEMACHINE_HPP +#define MAD_HEROSTATEMACHINE_HPP + +#include "StateMachine.hpp" +#include "world/LocalWorld.hpp" +namespace mad::core{ + class HeroStateMachine : public StateMachine { + + public: + explicit HeroStateMachine(std::shared_ptr world, Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity); + }; +} + + + +#endif//MAD_HEROSTATEMACHINE_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 549dbc4..0ecc9ab 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,4 +1,5 @@ #include "LevelLoaderFromFile.hpp" +#include "event/management/controller/statemachine/HeroStateMachine.hpp" #include <../../game/mobs/hero/Hero.hpp> #include #include @@ -106,8 +107,8 @@ namespace mad::core { break; } case Objects::Hero: { - Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); - hero_id = hero.get_hero_id(); + // Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + hero_id = create_hero(world, {current_position_x, current_position_y}); break; } case Objects::Enemy1: { @@ -158,8 +159,6 @@ namespace mad::core { std::filesystem::path source(m_config_json["animated_resources"]); source /= m_config_json["hero"]["source"]; - Entity::Id hero_id = 0; - std::shared_ptr image_storage; float physical_size_width = m_config_json["hero"]["animated"]["size_width"]; @@ -184,9 +183,74 @@ namespace mad::core { m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], physical_size_width, physical_size_height, size_scale, - delta_x, delta_y)}})); + delta_x, delta_y)}, + {ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - hero_id = world->create_physical_entity( + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_1_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_1_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_1_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_1_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_2_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_2_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_2_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_2_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_2_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_2_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_3_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_3_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_3_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_3_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + } + )); + + Entity::Id hero_id = world->create_physical_entity( 0, position, 0, @@ -194,6 +258,16 @@ namespace mad::core { false, false ); + /// add sensor + auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); + m_entity->add_sensor({0, 6}, 2.65, 0.05); + + float m_impulse = 2000; + float horizontal_velocity = 20; + + auto machine = std::make_shared(world, position, hero_id, level_dispatcher, m_impulse, horizontal_velocity); + controllers.push_back(machine); + return hero_id; } From fe60003eb2eb892521004afb35abfae2df269540 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 19:06:49 +0300 Subject: [PATCH 044/121] Test for httplib --- test/CMakeLists.txt | 1 + test/deps/CMakeLists.txt | 2 + test/deps/network/client.cpp | 22 +++++ test/deps/network/server.cpp | 155 +++++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 test/deps/network/client.cpp create mode 100644 test/deps/network/server.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 07bb365..bc2aa5e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,6 +18,7 @@ function(test_executable EXECUTABLE_TEST_NAME EXECUTABLE_SOURCES) ${INCLUDE_IMGUI} ${INCLUDE_IMGUI_SFML} ${INCLUDE_PQXX} + ${INCLUDE_HTTP} ) target_link_libraries( diff --git a/test/deps/CMakeLists.txt b/test/deps/CMakeLists.txt index 3078da8..817960a 100644 --- a/test/deps/CMakeLists.txt +++ b/test/deps/CMakeLists.txt @@ -1,3 +1,5 @@ test_executable(test-box2d TestBox2d.cpp) test_executable(test-imgui TestImGui.cpp) test_executable(test-pqxx TestPQXX.cpp) +test_executable(test-server network/server.cpp) +test_executable(test-client network/client.cpp) diff --git a/test/deps/network/client.cpp b/test/deps/network/client.cpp new file mode 100644 index 0000000..198b44a --- /dev/null +++ b/test/deps/network/client.cpp @@ -0,0 +1,22 @@ +#include +#include + +int main() { + httplib::Client cli("localhost", 8080); + + auto res1 = cli.Post("/user/login", httplib::Params{ + {"username", "Denis"} + }); + std::cout << res1->status << ' ' << res1->body << '\n'; + + + auto res2 = cli.Post("/user/login", httplib::Params{ + {"username", "NoDenis"} + }); + std::cout << res2->status << ' ' << res2->body << '\n'; + + auto res3 = cli.Post("/user/login", httplib::Params{ + {"name", "Denis"} + }); + std::cout << res3->status << ' ' << res3->body << '\n'; +} diff --git a/test/deps/network/server.cpp b/test/deps/network/server.cpp new file mode 100644 index 0000000..e4038c3 --- /dev/null +++ b/test/deps/network/server.cpp @@ -0,0 +1,155 @@ +#include +#include +#include + +namespace mad::core { + class Database { + public: + Database(); + + bool is_user_exists(const std::string &username); + + void registry_user(const std::string &username); + + std::size_t get_id(const std::string &username); + + std::size_t get_progress(std::size_t id); + + std::size_t get_progress(const std::string &username); + + void increment_progress(std::size_t id); + + void increment_progress(const std::string &username); + + void reset_progress(std::size_t id); + + void reset_progress(const std::string &username); + + private: + pqxx::connection m_connector; + std::string m_query; + + }; +} + +namespace mad::core { + + Database::Database() : m_connector("dbname = test-network") { + try { + if (m_connector.is_open()) { + SPDLOG_DEBUG("Database mad opened successfully"); + } else { + SPDLOG_DEBUG("Can't open database mad"); + } + + pqxx::work w(m_connector); + + m_query = "CREATE TABLE IF NOT EXISTS users(" + "id SMALLINT PRIMARY KEY," + "name TEXT NOT NULL UNIQUE);"; + w.exec(m_query); + + m_query = "CREATE TABLE IF NOT EXISTS progress(" + "id SMALLINT PRIMARY KEY REFERENCES users (id)," + "levels_completed SMALLINT NOT NULL);"; + w.exec(m_query); + + w.commit(); + + SPDLOG_DEBUG("Tables created successfully"); + } catch (std::exception &exc) { + SPDLOG_INFO(exc.what()); + } + } + + bool Database::is_user_exists(const std::string &username) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; + pqxx::result rows_found = W.exec(m_query); + return !rows_found.empty(); + } + + void Database::registry_user(const std::string &username) { + pqxx::work W(m_connector); + + m_query = "SELECT id FROM users"; + pqxx::result total_rows = W.exec(m_query); + std::size_t id = total_rows.size(); + + m_query = "INSERT INTO users(id, name) VALUES(" + std::to_string(id) + ", '" + W.esc(username) + "');"; + W.exec(m_query); + + m_query = "INSERT INTO progress(id, levels_completed) VALUES(" + std::to_string(id) + ", 0);"; + W.exec(m_query); + + W.commit(); + } + + std::size_t Database::get_id(const std::string &username) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; + auto found_row = W.exec1(m_query); + return found_row["id"].as(); + } + + std::size_t Database::get_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM progress WHERE id = " + std::to_string(id) + ";"; + auto found_row = W.exec1(m_query); + return found_row["levels_completed"].as(); + } + + std::size_t Database::get_progress(const std::string &username) { + return get_progress(get_id(username)); + } + + void Database::increment_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "UPDATE progress " + "SET levels_completed = levels_completed + 1 " + "WHERE id = " + std::to_string(id) + ";"; + W.exec(m_query); + W.commit(); + } + + void Database::increment_progress(const std::string &username) { + increment_progress(get_id(username)); + } + + void Database::reset_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "UPDATE progress " + "SET levels_completed = 0 " + "WHERE id = " + std::to_string(id) + ";"; + W.exec(m_query); + W.commit(); + } + + void Database::reset_progress(const std::string &username) { + reset_progress(get_id(username)); + } +} + +int main() { + httplib::Server svr; + mad::core::Database db; + + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + + svr.listen("localhost", 8080); +} \ No newline at end of file From cf3727ac0ce0983b90d3bc4e222b30be8727a13b Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 20:01:02 +0300 Subject: [PATCH 045/121] Add simple client and server realisation --- CMakeLists.txt | 4 +- network/CMakeLists.txt | 4 +- network/client/client.cpp | 6 -- network/client/simple-client.cpp | 108 +++++++++++++++++++++++++++++++ network/server/server.cpp | 6 -- network/server/simple-server.cpp | 77 ++++++++++++++++++++++ 6 files changed, 189 insertions(+), 16 deletions(-) delete mode 100644 network/client/client.cpp create mode 100644 network/client/simple-client.cpp delete mode 100644 network/server/server.cpp create mode 100644 network/server/simple-server.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c50a15..01687c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,8 +114,8 @@ message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") # Network binaries set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) -set(EXECUTABLE_SERVER server) -set(EXECUTABLE_CLIENT client) +set(EXECUTABLE_SIMPLE_SERVER simple-server) +set(EXECUTABLE_SIMPLE_CLIENT simple-client) add_subdirectory(${DIRECTORY_NETWORK}) message(STATUS "Server executable: ${EXECUTABLE_SERVER}") diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt index 35f74e8..69e16eb 100644 --- a/network/CMakeLists.txt +++ b/network/CMakeLists.txt @@ -37,5 +37,5 @@ function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) endfunction() -network_executable(${EXECUTABLE_SERVER} server/server.cpp) -network_executable(${EXECUTABLE_CLIENT} client/client.cpp) +network_executable(${EXECUTABLE_SIMPLE_SERVER} server/simple-server.cpp) +network_executable(${EXECUTABLE_SIMPLE_CLIENT} client/simple-client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp deleted file mode 100644 index b4b83b3..0000000 --- a/network/client/client.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from client!" << '\n'; -} diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp new file mode 100644 index 0000000..26049c9 --- /dev/null +++ b/network/client/simple-client.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include

+#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mad::core { + + class NetworkClientStorageDriver : public ClientStorageDriver { + public: + explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { } + + bool log_in(const std::string &username) const override { + auto res = m_client.Post("/user/login", httplib::Params{ + {"username", username} + }); + SPDLOG_DEBUG("Login request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + if (res->status == 200) { + m_username = username; + } + return res->status == 200; + } + + bool sign_up(const std::string &username) override { + auto res = m_client.Post("/user/signup", httplib::Params{ + {"username", username} + }); + SPDLOG_DEBUG("Sign up request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + return res->status == 200; + } + + std::size_t get_progress() const override { + auto res = m_client.Post("/user/progress", httplib::Params{ + {"username", m_username} + }); + SPDLOG_DEBUG("Get progress request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + return std::stoi(res->body); + } + + void update_progress() override { + auto res = m_client.Post("/user/increment-progress", httplib::Params{ + {"username", m_username} + }); + SPDLOG_DEBUG("Update request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + } + + private: + mutable std::string m_username; + mutable httplib::Client m_client; + + }; + +} + +int main() { +#ifndef NDEBUG + auto log_level = spdlog::level::trace; +#else + auto log_level = spdlog::level::info; +#endif + spdlog::set_level(log_level); + + auto window = std::make_shared(sf::VideoMode(640, 480), "MAD"); + ImGui::SFML::Init(*window); + window->setFramerateLimit(120); + + auto global_dispatcher = std::make_shared(); + + auto system_listener = std::make_shared(window); + + std::vector> level_loaders{ + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") + }; + + auto network_storage_driver = std::make_shared(); + + auto game_runner = std::make_unique( + level_loaders, + global_dispatcher, + std::make_unique(), + std::make_unique(network_storage_driver), + system_listener, + network_storage_driver + ); + + global_dispatcher->registry(std::make_shared(*window)); + global_dispatcher->registry(std::make_shared(*game_runner)); + global_dispatcher->registry(std::make_shared(*game_runner, network_storage_driver)); + global_dispatcher->registry(std::make_shared(*game_runner)); + + game_runner->run(*window); + + ImGui::SFML::Shutdown(); +} diff --git a/network/server/server.cpp b/network/server/server.cpp deleted file mode 100644 index d60b858..0000000 --- a/network/server/server.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from server!" << '\n'; -} diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp new file mode 100644 index 0000000..5c85588 --- /dev/null +++ b/network/server/simple-server.cpp @@ -0,0 +1,77 @@ +#include + +#include +#include + +int main() { + httplib::Server svr; + mad::core::Database db; + + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 404; + res.body = "User already exists"; + } else { + db.registry_user(username); + res.status = 200; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = std::to_string(db.get_progress(username)); + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + db.increment_progress(username); + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.listen("localhost", 8080); +} From 2d1ea084e696f64ce55222ed94f0c5ea4703f964 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 11:56:34 +0300 Subject: [PATCH 046/121] Chain server and window --- network/client/simple-client.cpp | 5 +++- network/server/simple-server.cpp | 45 +++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp index 26049c9..d35f011 100644 --- a/network/client/simple-client.cpp +++ b/network/client/simple-client.cpp @@ -21,7 +21,10 @@ namespace mad::core { class NetworkClientStorageDriver : public ClientStorageDriver { public: - explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { } + explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { + auto res = m_client.Get("/connection"); + SPDLOG_DEBUG("Connection request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + } bool log_in(const std::string &username) const override { auto res = m_client.Post("/user/login", httplib::Params{ diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 5c85588..d51b1a6 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -2,11 +2,25 @@ #include #include +#include + +#include +#include + +#include +#include +#include + int main() { httplib::Server svr; mad::core::Database db; + svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + res.status = 200; + res.body = "Connected user port -- " + std::to_string(req.remote_port); + }); + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); @@ -73,5 +87,34 @@ int main() { } }); - svr.listen("localhost", 8080); + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + + sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); + ImGui::SFML::Init(window); + window.setFramerateLimit(120); + sf::Clock clock; + while (window.isOpen()) { + sf::Event event; + while (window.pollEvent(event)) { + ImGui::SFML::ProcessEvent(event); + + if (event.type == sf::Event::Closed) { + window.close(); + svr.stop(); + } + } + + ImGui::SFML::Update(window, clock.restart()); + + ImGui::Begin("Window"); + ImGui::Text("Hello"); + ImGui::End(); + + window.clear(); + ImGui::SFML::Render(window); + window.display(); + } + ImGui::SFML::Shutdown(); } From 20f95183c90a0dfb73c925158e256de60e37bb9a Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 12:42:20 +0300 Subject: [PATCH 047/121] Add server control buttons --- network/server/simple-server.cpp | 38 +++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index d51b1a6..2f1ae43 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -46,7 +46,7 @@ int main() { } else { db.registry_user(username); res.status = 200; - res.body = "User doesn\'t exists"; + res.body = "User " + username + " is registered"; } } else { res.status = 404; @@ -87,10 +87,6 @@ int main() { } }); - std::thread([&svr]() mutable { - svr.listen("localhost", 8080); - }).detach(); - sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); ImGui::SFML::Init(window); window.setFramerateLimit(120); @@ -102,14 +98,40 @@ int main() { if (event.type == sf::Event::Closed) { window.close(); - svr.stop(); + if (svr.is_running()) { + svr.stop(); + } } } ImGui::SFML::Update(window, clock.restart()); - ImGui::Begin("Window"); - ImGui::Text("Hello"); + ImGui::SetNextWindowSize(ImVec2(window.getSize().x, window.getSize().y)); + ImGui::SetNextWindowPos({0, 0}); + ImGui::Begin("Server util", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); + + + if (ImGui::Button("Start server")) { + if (!svr.is_running()) { + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + } + } + + if (ImGui::Button("Stop server")) { + if (svr.is_running()) { + svr.stop(); + } + } + + if (ImGui::Button("Quit")) { + window.close(); + if (svr.is_running()) { + svr.stop(); + } + } + ImGui::End(); window.clear(); From 04e24ce49bdd7a09997f66d086f3718bae882f63 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 15:59:14 +0300 Subject: [PATCH 048/121] Add server logs --- network/server/simple-server.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 2f1ae43..c8934f1 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -16,17 +17,22 @@ int main() { httplib::Server svr; mad::core::Database db; - svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + std::vector logs; + const char *log; + + svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { res.status = 200; res.body = "Connected user port -- " + std::to_string(req.remote_port); + logs.push_back(res.body); }); - svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; + logs.push_back("User " + std::to_string(req.remote_port) + " login as " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -37,12 +43,13 @@ int main() { } }); - svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 404; res.body = "User already exists"; + logs.push_back("Register new user " + username + " from port " + std::to_string(req.remote_port)); } else { db.registry_user(username); res.status = 200; @@ -54,12 +61,13 @@ int main() { } }); - svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = std::to_string(db.get_progress(username)); + logs.push_back("Send progress to user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -70,13 +78,14 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; db.increment_progress(username); + logs.push_back("Increment progress for user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -116,12 +125,14 @@ int main() { std::thread([&svr]() mutable { svr.listen("localhost", 8080); }).detach(); + logs.emplace_back("Server has started"); } } if (ImGui::Button("Stop server")) { if (svr.is_running()) { svr.stop(); + logs.emplace_back("Server has stopped"); } } @@ -132,6 +143,15 @@ int main() { } } + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); + for (int i = 0; i < logs.size(); ++i) { + ImGui::Text(logs[i].c_str(), i); + } + ImGui::EndChild(); + } + ImGui::End(); window.clear(); From 87dc43482903a2fa97ba4e310e3e9d9f0c2dba4c Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 16:32:47 +0300 Subject: [PATCH 049/121] Add mutex for logs and db --- network/server/simple-server.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index c8934f1..1fef0fe 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -1,9 +1,9 @@ #include -#include #include #include #include +#include #include #include @@ -17,16 +17,18 @@ int main() { httplib::Server svr; mad::core::Database db; + std::mutex locker; std::vector logs; - const char *log; - svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { + svr.Get("/connection", [&logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); res.status = 200; - res.body = "Connected user port -- " + std::to_string(req.remote_port); - logs.push_back(res.body); + res.body = "Connection successful"; + logs.push_back("Connected user port -- " + std::to_string(req.remote_port)); }); - svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -43,7 +45,8 @@ int main() { } }); - svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -61,7 +64,8 @@ int main() { } }); - svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -78,7 +82,8 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -144,6 +149,7 @@ int main() { } { + std::unique_lock lock(locker); ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); for (int i = 0; i < logs.size(); ++i) { From 84d2adf2166f92b973c216ac9e4919a859bb1996 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 28 May 2022 16:05:17 +0300 Subject: [PATCH 050/121] Add httplib.h in submodule, move resources, add network directory and cmake --- .gitmodules | 3 ++ CMakeLists.txt | 16 +++++++ core/loader/LevelLoaderFromFile.cpp | 4 +- deps/cpp-httplib | 1 + game/game_database_example.cpp | 4 +- game/game_with_default_loader_example.cpp | 2 +- network/CMakeLists.txt | 41 ++++++++++++++++++ network/client/client.cpp | 6 +++ network/server/server.cpp | 6 +++ .../animated/helicopter.png | Bin .../hero/idle/Chara - BlueIdle00000.png | Bin .../hero/idle/Chara - BlueIdle00001.png | Bin .../hero/idle/Chara - BlueIdle00002.png | Bin .../hero/idle/Chara - BlueIdle00003.png | Bin .../hero/idle/Chara - BlueIdle00004.png | Bin .../hero/idle/Chara - BlueIdle00005.png | Bin .../hero/idle/Chara - BlueIdle00006.png | Bin .../hero/idle/Chara - BlueIdle00007.png | Bin .../hero/idle/Chara - BlueIdle00008.png | Bin .../hero/idle/Chara - BlueIdle00009.png | Bin .../hero/idle/Chara - BlueIdle00010.png | Bin .../hero/idle/Chara - BlueIdle00011.png | Bin .../hero/idle/Chara - BlueIdle00012.png | Bin .../hero/idle/Chara - BlueIdle00013.png | Bin .../hero/idle/Chara - BlueIdle00014.png | Bin .../hero/idle/Chara - BlueIdle00015.png | Bin .../hero/idle/Chara - BlueIdle00016.png | Bin .../hero/idle/Chara - BlueIdle00017.png | Bin .../hero/idle/Chara - BlueIdle00018.png | Bin .../hero/idle/Chara - BlueIdle00019.png | Bin .../animated/hero/run/Chara_BlueWalk00000.png | Bin .../animated/hero/run/Chara_BlueWalk00001.png | Bin .../animated/hero/run/Chara_BlueWalk00002.png | Bin .../animated/hero/run/Chara_BlueWalk00003.png | Bin .../animated/hero/run/Chara_BlueWalk00004.png | Bin .../animated/hero/run/Chara_BlueWalk00005.png | Bin .../animated/hero/run/Chara_BlueWalk00006.png | Bin .../animated/hero/run/Chara_BlueWalk00007.png | Bin .../animated/hero/run/Chara_BlueWalk00008.png | Bin .../animated/hero/run/Chara_BlueWalk00009.png | Bin .../animated/hero/run/Chara_BlueWalk00010.png | Bin .../animated/hero/run/Chara_BlueWalk00011.png | Bin .../animated/hero/run/Chara_BlueWalk00012.png | Bin .../animated/hero/run/Chara_BlueWalk00013.png | Bin .../animated/hero/run/Chara_BlueWalk00014.png | Bin .../animated/hero/run/Chara_BlueWalk00015.png | Bin .../animated/hero/run/Chara_BlueWalk00016.png | Bin .../animated/hero/run/Chara_BlueWalk00017.png | Bin .../animated/hero/run/Chara_BlueWalk00018.png | Bin .../animated/hero/run/Chara_BlueWalk00019.png | Bin .../animated/runner_new.png | Bin .../levels/level_01/config.json | 2 +- .../levels/level_01/map | 0 .../levels/level_with_finish/config.json | 2 +- .../levels/level_with_finish/map | 0 .../resources => resources}/static/18plus.png | Bin .../resources => resources}/static/brick.png | Bin {game/resources => resources}/static/exit.png | Bin 58 files changed, 80 insertions(+), 7 deletions(-) create mode 160000 deps/cpp-httplib create mode 100644 network/CMakeLists.txt create mode 100644 network/client/client.cpp create mode 100644 network/server/server.cpp rename {game/resources => resources}/animated/helicopter.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00000.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00001.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00002.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00003.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00004.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00005.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00006.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00007.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00008.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00009.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00010.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00011.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00012.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00013.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00014.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00015.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00016.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00017.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00018.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00019.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00000.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00001.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00002.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00003.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00004.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00005.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00006.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00007.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00008.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00009.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00010.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00011.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00012.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00013.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00014.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00015.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00016.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00017.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00018.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00019.png (100%) rename {game/resources => resources}/animated/runner_new.png (100%) rename {game/resources => resources}/levels/level_01/config.json (92%) rename {game/resources => resources}/levels/level_01/map (100%) rename {game/resources => resources}/levels/level_with_finish/config.json (92%) rename {game/resources => resources}/levels/level_with_finish/map (100%) rename {game/resources => resources}/static/18plus.png (100%) rename {game/resources => resources}/static/brick.png (100%) rename {game/resources => resources}/static/exit.png (100%) diff --git a/.gitmodules b/.gitmodules index c319e98..952393c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "deps/libpqxx"] path = deps/libpqxx url = https://github.com/jtv/libpqxx +[submodule "deps/cpp-httplib"] + path = deps/cpp-httplib + url = https://github.com/yhirose/cpp-httplib diff --git a/CMakeLists.txt b/CMakeLists.txt index 928f804..1c50a15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,13 @@ add_subdirectory(${DIRECTORY_PQXX}) message(STATUS "PostgreSQL include: ${INCLUDE_PQXX}") message(STATUS "PostgreSQL library: ${LIBRARY_PQXX}") +# HTTP library +set(DIRECTORY_HTTP ${PROJECT_SOURCE_DIR}/deps/cpp-httplib) +set(INCLUDE_HTTP ${DIRECTORY_HTTP}) + +add_subdirectory(${DIRECTORY_HTTP}) +message(STATUS "HTTP include: ${INCLUDE_HTTP}") + # Core library set(DIRECTORY_CORE ${PROJECT_SOURCE_DIR}/core) set(INCLUDE_CORE ${DIRECTORY_CORE}) @@ -105,6 +112,15 @@ add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") +# Network binaries +set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) +set(EXECUTABLE_SERVER server) +set(EXECUTABLE_CLIENT client) + +add_subdirectory(${DIRECTORY_NETWORK}) +message(STATUS "Server executable: ${EXECUTABLE_SERVER}") +message(STATUS "Client executable ${EXECUTABLE_GAME_CLIENT}") + # Tests set(DIRECTORY_TEST ${PROJECT_SOURCE_DIR}/test) set(EXECUTABLE_TEST test) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 2201916..324c61a 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -133,7 +133,7 @@ namespace mad::core { void LevelLoaderFromFile::create_block(std::shared_ptr world, Vec2d position, float block_size, bool is_stable) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); if (is_stable) { source /= static_cast(m_config_json["texture"]["stable"]); } else { @@ -203,7 +203,7 @@ namespace mad::core { } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); source /= static_cast(m_config_json["texture"]["finish"]); auto image_storage = std::make_shared( diff --git a/deps/cpp-httplib b/deps/cpp-httplib new file mode 160000 index 0000000..df20c27 --- /dev/null +++ b/deps/cpp-httplib @@ -0,0 +1 @@ +Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index 48e0fe2..586b030 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -45,8 +45,8 @@ int main() { auto database_storage_driver = std::make_shared(database); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_with_finish"), - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/game/game_with_default_loader_example.cpp b/game/game_with_default_loader_example.cpp index 337426b..a285992 100644 --- a/game/game_with_default_loader_example.cpp +++ b/game/game_with_default_loader_example.cpp @@ -42,7 +42,7 @@ int main() { auto offline_storage_driver = std::make_shared(); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt new file mode 100644 index 0000000..35f74e8 --- /dev/null +++ b/network/CMakeLists.txt @@ -0,0 +1,41 @@ +function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) + message(STATUS "Network executable: '${EXECUTABLE_NETWORK_NAME}' is built with ${EXECUTABLE_SOURCES}") + + add_executable( + ${EXECUTABLE_NETWORK_NAME} + ${EXECUTABLE_SOURCES} + ${SOURCES_IMGUI} + ${SOURCES_IMGUI_SFML} + ) + + if (CMAKE_BUILD_TYPE MATCHES Debug) + target_compile_definitions(${EXECUTABLE_NETWORK_NAME} PUBLIC SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE) + message(STATUS "Enable debug logs for ${EXECUTABLE_NETWORK_NAME}") + endif() + + target_include_directories( + ${EXECUTABLE_NETWORK_NAME} PUBLIC + + ${PROJECT_SOURCE_DIR} + ${INCLUDE_SPDLOG} + ${INCLUDE_BOX2D} + ${INCLUDE_IMGUI} + ${INCLUDE_IMGUI_SFML} + ${INCLUDE_HTTP} + ) + + target_link_libraries( + ${EXECUTABLE_NETWORK_NAME} + + ${LIBRARY_SFML} + ${LIBRARY_CORE} + ${LIBRARY_SPDLOG} + ${LIBRARY_BOX2D} + ${LIBRARY_OPENGL} + ${LIBRARY_PQXX} + ) + +endfunction() + +network_executable(${EXECUTABLE_SERVER} server/server.cpp) +network_executable(${EXECUTABLE_CLIENT} client/client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp new file mode 100644 index 0000000..b4b83b3 --- /dev/null +++ b/network/client/client.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from client!" << '\n'; +} diff --git a/network/server/server.cpp b/network/server/server.cpp new file mode 100644 index 0000000..d60b858 --- /dev/null +++ b/network/server/server.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from server!" << '\n'; +} diff --git a/game/resources/animated/helicopter.png b/resources/animated/helicopter.png similarity index 100% rename from game/resources/animated/helicopter.png rename to resources/animated/helicopter.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00000.png b/resources/animated/hero/idle/Chara - BlueIdle00000.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00000.png rename to resources/animated/hero/idle/Chara - BlueIdle00000.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00001.png b/resources/animated/hero/idle/Chara - BlueIdle00001.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00001.png rename to resources/animated/hero/idle/Chara - BlueIdle00001.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00002.png b/resources/animated/hero/idle/Chara - BlueIdle00002.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00002.png rename to resources/animated/hero/idle/Chara - BlueIdle00002.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00003.png b/resources/animated/hero/idle/Chara - BlueIdle00003.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00003.png rename to resources/animated/hero/idle/Chara - BlueIdle00003.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00004.png b/resources/animated/hero/idle/Chara - BlueIdle00004.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00004.png rename to resources/animated/hero/idle/Chara - BlueIdle00004.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00005.png b/resources/animated/hero/idle/Chara - BlueIdle00005.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00005.png rename to resources/animated/hero/idle/Chara - BlueIdle00005.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00006.png b/resources/animated/hero/idle/Chara - BlueIdle00006.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00006.png rename to resources/animated/hero/idle/Chara - BlueIdle00006.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00007.png b/resources/animated/hero/idle/Chara - BlueIdle00007.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00007.png rename to resources/animated/hero/idle/Chara - BlueIdle00007.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00008.png b/resources/animated/hero/idle/Chara - BlueIdle00008.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00008.png rename to resources/animated/hero/idle/Chara - BlueIdle00008.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00009.png b/resources/animated/hero/idle/Chara - BlueIdle00009.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00009.png rename to resources/animated/hero/idle/Chara - BlueIdle00009.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00010.png b/resources/animated/hero/idle/Chara - BlueIdle00010.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00010.png rename to resources/animated/hero/idle/Chara - BlueIdle00010.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00011.png b/resources/animated/hero/idle/Chara - BlueIdle00011.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00011.png rename to resources/animated/hero/idle/Chara - BlueIdle00011.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00012.png b/resources/animated/hero/idle/Chara - BlueIdle00012.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00012.png rename to resources/animated/hero/idle/Chara - BlueIdle00012.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00013.png b/resources/animated/hero/idle/Chara - BlueIdle00013.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00013.png rename to resources/animated/hero/idle/Chara - BlueIdle00013.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00014.png b/resources/animated/hero/idle/Chara - BlueIdle00014.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00014.png rename to resources/animated/hero/idle/Chara - BlueIdle00014.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00015.png b/resources/animated/hero/idle/Chara - BlueIdle00015.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00015.png rename to resources/animated/hero/idle/Chara - BlueIdle00015.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00016.png b/resources/animated/hero/idle/Chara - BlueIdle00016.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00016.png rename to resources/animated/hero/idle/Chara - BlueIdle00016.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00017.png b/resources/animated/hero/idle/Chara - BlueIdle00017.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00017.png rename to resources/animated/hero/idle/Chara - BlueIdle00017.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00018.png b/resources/animated/hero/idle/Chara - BlueIdle00018.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00018.png rename to resources/animated/hero/idle/Chara - BlueIdle00018.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00019.png b/resources/animated/hero/idle/Chara - BlueIdle00019.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00019.png rename to resources/animated/hero/idle/Chara - BlueIdle00019.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00000.png b/resources/animated/hero/run/Chara_BlueWalk00000.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00000.png rename to resources/animated/hero/run/Chara_BlueWalk00000.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00001.png b/resources/animated/hero/run/Chara_BlueWalk00001.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00001.png rename to resources/animated/hero/run/Chara_BlueWalk00001.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00002.png b/resources/animated/hero/run/Chara_BlueWalk00002.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00002.png rename to resources/animated/hero/run/Chara_BlueWalk00002.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00003.png b/resources/animated/hero/run/Chara_BlueWalk00003.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00003.png rename to resources/animated/hero/run/Chara_BlueWalk00003.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00004.png b/resources/animated/hero/run/Chara_BlueWalk00004.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00004.png rename to resources/animated/hero/run/Chara_BlueWalk00004.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00005.png b/resources/animated/hero/run/Chara_BlueWalk00005.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00005.png rename to resources/animated/hero/run/Chara_BlueWalk00005.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00006.png b/resources/animated/hero/run/Chara_BlueWalk00006.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00006.png rename to resources/animated/hero/run/Chara_BlueWalk00006.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00007.png b/resources/animated/hero/run/Chara_BlueWalk00007.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00007.png rename to resources/animated/hero/run/Chara_BlueWalk00007.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00008.png b/resources/animated/hero/run/Chara_BlueWalk00008.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00008.png rename to resources/animated/hero/run/Chara_BlueWalk00008.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00009.png b/resources/animated/hero/run/Chara_BlueWalk00009.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00009.png rename to resources/animated/hero/run/Chara_BlueWalk00009.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00010.png b/resources/animated/hero/run/Chara_BlueWalk00010.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00010.png rename to resources/animated/hero/run/Chara_BlueWalk00010.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00011.png b/resources/animated/hero/run/Chara_BlueWalk00011.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00011.png rename to resources/animated/hero/run/Chara_BlueWalk00011.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00012.png b/resources/animated/hero/run/Chara_BlueWalk00012.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00012.png rename to resources/animated/hero/run/Chara_BlueWalk00012.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00013.png b/resources/animated/hero/run/Chara_BlueWalk00013.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00013.png rename to resources/animated/hero/run/Chara_BlueWalk00013.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00014.png b/resources/animated/hero/run/Chara_BlueWalk00014.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00014.png rename to resources/animated/hero/run/Chara_BlueWalk00014.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00015.png b/resources/animated/hero/run/Chara_BlueWalk00015.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00015.png rename to resources/animated/hero/run/Chara_BlueWalk00015.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00016.png b/resources/animated/hero/run/Chara_BlueWalk00016.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00016.png rename to resources/animated/hero/run/Chara_BlueWalk00016.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00017.png b/resources/animated/hero/run/Chara_BlueWalk00017.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00017.png rename to resources/animated/hero/run/Chara_BlueWalk00017.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00018.png b/resources/animated/hero/run/Chara_BlueWalk00018.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00018.png rename to resources/animated/hero/run/Chara_BlueWalk00018.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00019.png b/resources/animated/hero/run/Chara_BlueWalk00019.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00019.png rename to resources/animated/hero/run/Chara_BlueWalk00019.png diff --git a/game/resources/animated/runner_new.png b/resources/animated/runner_new.png similarity index 100% rename from game/resources/animated/runner_new.png rename to resources/animated/runner_new.png diff --git a/game/resources/levels/level_01/config.json b/resources/levels/level_01/config.json similarity index 92% rename from game/resources/levels/level_01/config.json rename to resources/levels/level_01/config.json index 4594a7c..e03da1a 100644 --- a/game/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -1,6 +1,6 @@ { "name" : "level_01", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_01/map b/resources/levels/level_01/map similarity index 100% rename from game/resources/levels/level_01/map rename to resources/levels/level_01/map diff --git a/game/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json similarity index 92% rename from game/resources/levels/level_with_finish/config.json rename to resources/levels/level_with_finish/config.json index 6482a2a..edfee15 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -1,6 +1,6 @@ { "name" : "level_with_finish", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_with_finish/map b/resources/levels/level_with_finish/map similarity index 100% rename from game/resources/levels/level_with_finish/map rename to resources/levels/level_with_finish/map diff --git a/game/resources/static/18plus.png b/resources/static/18plus.png similarity index 100% rename from game/resources/static/18plus.png rename to resources/static/18plus.png diff --git a/game/resources/static/brick.png b/resources/static/brick.png similarity index 100% rename from game/resources/static/brick.png rename to resources/static/brick.png diff --git a/game/resources/static/exit.png b/resources/static/exit.png similarity index 100% rename from game/resources/static/exit.png rename to resources/static/exit.png From 995cbe3b6cbd8e030d8fe067d876b92902ec81a9 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 19:06:49 +0300 Subject: [PATCH 051/121] Test for httplib --- test/CMakeLists.txt | 1 + test/deps/CMakeLists.txt | 2 + test/deps/network/client.cpp | 22 +++++ test/deps/network/server.cpp | 155 +++++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 test/deps/network/client.cpp create mode 100644 test/deps/network/server.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 07bb365..bc2aa5e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,6 +18,7 @@ function(test_executable EXECUTABLE_TEST_NAME EXECUTABLE_SOURCES) ${INCLUDE_IMGUI} ${INCLUDE_IMGUI_SFML} ${INCLUDE_PQXX} + ${INCLUDE_HTTP} ) target_link_libraries( diff --git a/test/deps/CMakeLists.txt b/test/deps/CMakeLists.txt index 3078da8..817960a 100644 --- a/test/deps/CMakeLists.txt +++ b/test/deps/CMakeLists.txt @@ -1,3 +1,5 @@ test_executable(test-box2d TestBox2d.cpp) test_executable(test-imgui TestImGui.cpp) test_executable(test-pqxx TestPQXX.cpp) +test_executable(test-server network/server.cpp) +test_executable(test-client network/client.cpp) diff --git a/test/deps/network/client.cpp b/test/deps/network/client.cpp new file mode 100644 index 0000000..198b44a --- /dev/null +++ b/test/deps/network/client.cpp @@ -0,0 +1,22 @@ +#include +#include + +int main() { + httplib::Client cli("localhost", 8080); + + auto res1 = cli.Post("/user/login", httplib::Params{ + {"username", "Denis"} + }); + std::cout << res1->status << ' ' << res1->body << '\n'; + + + auto res2 = cli.Post("/user/login", httplib::Params{ + {"username", "NoDenis"} + }); + std::cout << res2->status << ' ' << res2->body << '\n'; + + auto res3 = cli.Post("/user/login", httplib::Params{ + {"name", "Denis"} + }); + std::cout << res3->status << ' ' << res3->body << '\n'; +} diff --git a/test/deps/network/server.cpp b/test/deps/network/server.cpp new file mode 100644 index 0000000..e4038c3 --- /dev/null +++ b/test/deps/network/server.cpp @@ -0,0 +1,155 @@ +#include +#include +#include + +namespace mad::core { + class Database { + public: + Database(); + + bool is_user_exists(const std::string &username); + + void registry_user(const std::string &username); + + std::size_t get_id(const std::string &username); + + std::size_t get_progress(std::size_t id); + + std::size_t get_progress(const std::string &username); + + void increment_progress(std::size_t id); + + void increment_progress(const std::string &username); + + void reset_progress(std::size_t id); + + void reset_progress(const std::string &username); + + private: + pqxx::connection m_connector; + std::string m_query; + + }; +} + +namespace mad::core { + + Database::Database() : m_connector("dbname = test-network") { + try { + if (m_connector.is_open()) { + SPDLOG_DEBUG("Database mad opened successfully"); + } else { + SPDLOG_DEBUG("Can't open database mad"); + } + + pqxx::work w(m_connector); + + m_query = "CREATE TABLE IF NOT EXISTS users(" + "id SMALLINT PRIMARY KEY," + "name TEXT NOT NULL UNIQUE);"; + w.exec(m_query); + + m_query = "CREATE TABLE IF NOT EXISTS progress(" + "id SMALLINT PRIMARY KEY REFERENCES users (id)," + "levels_completed SMALLINT NOT NULL);"; + w.exec(m_query); + + w.commit(); + + SPDLOG_DEBUG("Tables created successfully"); + } catch (std::exception &exc) { + SPDLOG_INFO(exc.what()); + } + } + + bool Database::is_user_exists(const std::string &username) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; + pqxx::result rows_found = W.exec(m_query); + return !rows_found.empty(); + } + + void Database::registry_user(const std::string &username) { + pqxx::work W(m_connector); + + m_query = "SELECT id FROM users"; + pqxx::result total_rows = W.exec(m_query); + std::size_t id = total_rows.size(); + + m_query = "INSERT INTO users(id, name) VALUES(" + std::to_string(id) + ", '" + W.esc(username) + "');"; + W.exec(m_query); + + m_query = "INSERT INTO progress(id, levels_completed) VALUES(" + std::to_string(id) + ", 0);"; + W.exec(m_query); + + W.commit(); + } + + std::size_t Database::get_id(const std::string &username) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; + auto found_row = W.exec1(m_query); + return found_row["id"].as(); + } + + std::size_t Database::get_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM progress WHERE id = " + std::to_string(id) + ";"; + auto found_row = W.exec1(m_query); + return found_row["levels_completed"].as(); + } + + std::size_t Database::get_progress(const std::string &username) { + return get_progress(get_id(username)); + } + + void Database::increment_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "UPDATE progress " + "SET levels_completed = levels_completed + 1 " + "WHERE id = " + std::to_string(id) + ";"; + W.exec(m_query); + W.commit(); + } + + void Database::increment_progress(const std::string &username) { + increment_progress(get_id(username)); + } + + void Database::reset_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "UPDATE progress " + "SET levels_completed = 0 " + "WHERE id = " + std::to_string(id) + ";"; + W.exec(m_query); + W.commit(); + } + + void Database::reset_progress(const std::string &username) { + reset_progress(get_id(username)); + } +} + +int main() { + httplib::Server svr; + mad::core::Database db; + + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + + svr.listen("localhost", 8080); +} \ No newline at end of file From 72b1e90989879330ea2ba6309d460223351623ef Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 20:01:02 +0300 Subject: [PATCH 052/121] Add simple client and server realisation --- CMakeLists.txt | 4 +- network/CMakeLists.txt | 4 +- network/client/client.cpp | 6 -- network/client/simple-client.cpp | 108 +++++++++++++++++++++++++++++++ network/server/server.cpp | 6 -- network/server/simple-server.cpp | 77 ++++++++++++++++++++++ 6 files changed, 189 insertions(+), 16 deletions(-) delete mode 100644 network/client/client.cpp create mode 100644 network/client/simple-client.cpp delete mode 100644 network/server/server.cpp create mode 100644 network/server/simple-server.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c50a15..01687c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,8 +114,8 @@ message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") # Network binaries set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) -set(EXECUTABLE_SERVER server) -set(EXECUTABLE_CLIENT client) +set(EXECUTABLE_SIMPLE_SERVER simple-server) +set(EXECUTABLE_SIMPLE_CLIENT simple-client) add_subdirectory(${DIRECTORY_NETWORK}) message(STATUS "Server executable: ${EXECUTABLE_SERVER}") diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt index 35f74e8..69e16eb 100644 --- a/network/CMakeLists.txt +++ b/network/CMakeLists.txt @@ -37,5 +37,5 @@ function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) endfunction() -network_executable(${EXECUTABLE_SERVER} server/server.cpp) -network_executable(${EXECUTABLE_CLIENT} client/client.cpp) +network_executable(${EXECUTABLE_SIMPLE_SERVER} server/simple-server.cpp) +network_executable(${EXECUTABLE_SIMPLE_CLIENT} client/simple-client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp deleted file mode 100644 index b4b83b3..0000000 --- a/network/client/client.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from client!" << '\n'; -} diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp new file mode 100644 index 0000000..26049c9 --- /dev/null +++ b/network/client/simple-client.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mad::core { + + class NetworkClientStorageDriver : public ClientStorageDriver { + public: + explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { } + + bool log_in(const std::string &username) const override { + auto res = m_client.Post("/user/login", httplib::Params{ + {"username", username} + }); + SPDLOG_DEBUG("Login request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + if (res->status == 200) { + m_username = username; + } + return res->status == 200; + } + + bool sign_up(const std::string &username) override { + auto res = m_client.Post("/user/signup", httplib::Params{ + {"username", username} + }); + SPDLOG_DEBUG("Sign up request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + return res->status == 200; + } + + std::size_t get_progress() const override { + auto res = m_client.Post("/user/progress", httplib::Params{ + {"username", m_username} + }); + SPDLOG_DEBUG("Get progress request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + return std::stoi(res->body); + } + + void update_progress() override { + auto res = m_client.Post("/user/increment-progress", httplib::Params{ + {"username", m_username} + }); + SPDLOG_DEBUG("Update request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + } + + private: + mutable std::string m_username; + mutable httplib::Client m_client; + + }; + +} + +int main() { +#ifndef NDEBUG + auto log_level = spdlog::level::trace; +#else + auto log_level = spdlog::level::info; +#endif + spdlog::set_level(log_level); + + auto window = std::make_shared(sf::VideoMode(640, 480), "MAD"); + ImGui::SFML::Init(*window); + window->setFramerateLimit(120); + + auto global_dispatcher = std::make_shared(); + + auto system_listener = std::make_shared(window); + + std::vector> level_loaders{ + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") + }; + + auto network_storage_driver = std::make_shared(); + + auto game_runner = std::make_unique( + level_loaders, + global_dispatcher, + std::make_unique(), + std::make_unique(network_storage_driver), + system_listener, + network_storage_driver + ); + + global_dispatcher->registry(std::make_shared(*window)); + global_dispatcher->registry(std::make_shared(*game_runner)); + global_dispatcher->registry(std::make_shared(*game_runner, network_storage_driver)); + global_dispatcher->registry(std::make_shared(*game_runner)); + + game_runner->run(*window); + + ImGui::SFML::Shutdown(); +} diff --git a/network/server/server.cpp b/network/server/server.cpp deleted file mode 100644 index d60b858..0000000 --- a/network/server/server.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from server!" << '\n'; -} diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp new file mode 100644 index 0000000..5c85588 --- /dev/null +++ b/network/server/simple-server.cpp @@ -0,0 +1,77 @@ +#include + +#include +#include + +int main() { + httplib::Server svr; + mad::core::Database db; + + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 404; + res.body = "User already exists"; + } else { + db.registry_user(username); + res.status = 200; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = std::to_string(db.get_progress(username)); + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + db.increment_progress(username); + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.listen("localhost", 8080); +} From 9b3b98fa8b9c5a990898da0e256d43cdd213a9ae Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 11:56:34 +0300 Subject: [PATCH 053/121] Chain server and window --- network/client/simple-client.cpp | 5 +++- network/server/simple-server.cpp | 45 +++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp index 26049c9..d35f011 100644 --- a/network/client/simple-client.cpp +++ b/network/client/simple-client.cpp @@ -21,7 +21,10 @@ namespace mad::core { class NetworkClientStorageDriver : public ClientStorageDriver { public: - explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { } + explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { + auto res = m_client.Get("/connection"); + SPDLOG_DEBUG("Connection request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + } bool log_in(const std::string &username) const override { auto res = m_client.Post("/user/login", httplib::Params{ diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 5c85588..d51b1a6 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -2,11 +2,25 @@ #include #include +#include + +#include +#include + +#include +#include +#include + int main() { httplib::Server svr; mad::core::Database db; + svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + res.status = 200; + res.body = "Connected user port -- " + std::to_string(req.remote_port); + }); + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); @@ -73,5 +87,34 @@ int main() { } }); - svr.listen("localhost", 8080); + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + + sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); + ImGui::SFML::Init(window); + window.setFramerateLimit(120); + sf::Clock clock; + while (window.isOpen()) { + sf::Event event; + while (window.pollEvent(event)) { + ImGui::SFML::ProcessEvent(event); + + if (event.type == sf::Event::Closed) { + window.close(); + svr.stop(); + } + } + + ImGui::SFML::Update(window, clock.restart()); + + ImGui::Begin("Window"); + ImGui::Text("Hello"); + ImGui::End(); + + window.clear(); + ImGui::SFML::Render(window); + window.display(); + } + ImGui::SFML::Shutdown(); } From 205ff02f1f0e19f9fe482092accda9eefe664c17 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 12:42:20 +0300 Subject: [PATCH 054/121] Add server control buttons --- network/server/simple-server.cpp | 38 +++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index d51b1a6..2f1ae43 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -46,7 +46,7 @@ int main() { } else { db.registry_user(username); res.status = 200; - res.body = "User doesn\'t exists"; + res.body = "User " + username + " is registered"; } } else { res.status = 404; @@ -87,10 +87,6 @@ int main() { } }); - std::thread([&svr]() mutable { - svr.listen("localhost", 8080); - }).detach(); - sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); ImGui::SFML::Init(window); window.setFramerateLimit(120); @@ -102,14 +98,40 @@ int main() { if (event.type == sf::Event::Closed) { window.close(); - svr.stop(); + if (svr.is_running()) { + svr.stop(); + } } } ImGui::SFML::Update(window, clock.restart()); - ImGui::Begin("Window"); - ImGui::Text("Hello"); + ImGui::SetNextWindowSize(ImVec2(window.getSize().x, window.getSize().y)); + ImGui::SetNextWindowPos({0, 0}); + ImGui::Begin("Server util", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); + + + if (ImGui::Button("Start server")) { + if (!svr.is_running()) { + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + } + } + + if (ImGui::Button("Stop server")) { + if (svr.is_running()) { + svr.stop(); + } + } + + if (ImGui::Button("Quit")) { + window.close(); + if (svr.is_running()) { + svr.stop(); + } + } + ImGui::End(); window.clear(); From acc028ebb4b48585989858ca91ff9fd3b883deca Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 15:59:14 +0300 Subject: [PATCH 055/121] Add server logs --- network/server/simple-server.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 2f1ae43..c8934f1 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -16,17 +17,22 @@ int main() { httplib::Server svr; mad::core::Database db; - svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + std::vector logs; + const char *log; + + svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { res.status = 200; res.body = "Connected user port -- " + std::to_string(req.remote_port); + logs.push_back(res.body); }); - svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; + logs.push_back("User " + std::to_string(req.remote_port) + " login as " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -37,12 +43,13 @@ int main() { } }); - svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 404; res.body = "User already exists"; + logs.push_back("Register new user " + username + " from port " + std::to_string(req.remote_port)); } else { db.registry_user(username); res.status = 200; @@ -54,12 +61,13 @@ int main() { } }); - svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = std::to_string(db.get_progress(username)); + logs.push_back("Send progress to user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -70,13 +78,14 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; db.increment_progress(username); + logs.push_back("Increment progress for user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -116,12 +125,14 @@ int main() { std::thread([&svr]() mutable { svr.listen("localhost", 8080); }).detach(); + logs.emplace_back("Server has started"); } } if (ImGui::Button("Stop server")) { if (svr.is_running()) { svr.stop(); + logs.emplace_back("Server has stopped"); } } @@ -132,6 +143,15 @@ int main() { } } + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); + for (int i = 0; i < logs.size(); ++i) { + ImGui::Text(logs[i].c_str(), i); + } + ImGui::EndChild(); + } + ImGui::End(); window.clear(); From 2af56987bb6d04ffad18683d94d45883a3df3511 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 16:32:47 +0300 Subject: [PATCH 056/121] Add mutex for logs and db --- network/server/simple-server.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index c8934f1..1fef0fe 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -1,9 +1,9 @@ #include -#include #include #include #include +#include #include #include @@ -17,16 +17,18 @@ int main() { httplib::Server svr; mad::core::Database db; + std::mutex locker; std::vector logs; - const char *log; - svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { + svr.Get("/connection", [&logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); res.status = 200; - res.body = "Connected user port -- " + std::to_string(req.remote_port); - logs.push_back(res.body); + res.body = "Connection successful"; + logs.push_back("Connected user port -- " + std::to_string(req.remote_port)); }); - svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -43,7 +45,8 @@ int main() { } }); - svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -61,7 +64,8 @@ int main() { } }); - svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -78,7 +82,8 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -144,6 +149,7 @@ int main() { } { + std::unique_lock lock(locker); ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); for (int i = 0; i < logs.size(); ++i) { From fe12638dc0e31cd360cf00b413ef28fa09eb1493 Mon Sep 17 00:00:00 2001 From: denis Date: Mon, 30 May 2022 20:46:24 +0300 Subject: [PATCH 057/121] Provide rebase --- network/server/simple-server.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 1fef0fe..611561e 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -164,5 +164,6 @@ int main() { ImGui::SFML::Render(window); window.display(); } + ImGui::SFML::Shutdown(); } From 8560e00499f55533195c231c1ab7a9a3247e05da Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 28 May 2022 16:05:17 +0300 Subject: [PATCH 058/121] Add httplib.h in submodule, move resources, add network directory and cmake --- .gitmodules | 3 ++ CMakeLists.txt | 16 +++++++ core/loader/LevelLoaderFromFile.cpp | 4 +- deps/cpp-httplib | 1 + game/game_database_example.cpp | 4 +- game/game_with_default_loader_example.cpp | 2 +- network/CMakeLists.txt | 41 ++++++++++++++++++ network/client/client.cpp | 6 +++ network/server/server.cpp | 6 +++ .../animated/helicopter.png | Bin .../hero/idle/Chara - BlueIdle00000.png | Bin .../hero/idle/Chara - BlueIdle00001.png | Bin .../hero/idle/Chara - BlueIdle00002.png | Bin .../hero/idle/Chara - BlueIdle00003.png | Bin .../hero/idle/Chara - BlueIdle00004.png | Bin .../hero/idle/Chara - BlueIdle00005.png | Bin .../hero/idle/Chara - BlueIdle00006.png | Bin .../hero/idle/Chara - BlueIdle00007.png | Bin .../hero/idle/Chara - BlueIdle00008.png | Bin .../hero/idle/Chara - BlueIdle00009.png | Bin .../hero/idle/Chara - BlueIdle00010.png | Bin .../hero/idle/Chara - BlueIdle00011.png | Bin .../hero/idle/Chara - BlueIdle00012.png | Bin .../hero/idle/Chara - BlueIdle00013.png | Bin .../hero/idle/Chara - BlueIdle00014.png | Bin .../hero/idle/Chara - BlueIdle00015.png | Bin .../hero/idle/Chara - BlueIdle00016.png | Bin .../hero/idle/Chara - BlueIdle00017.png | Bin .../hero/idle/Chara - BlueIdle00018.png | Bin .../hero/idle/Chara - BlueIdle00019.png | Bin .../animated/hero/run/Chara_BlueWalk00000.png | Bin .../animated/hero/run/Chara_BlueWalk00001.png | Bin .../animated/hero/run/Chara_BlueWalk00002.png | Bin .../animated/hero/run/Chara_BlueWalk00003.png | Bin .../animated/hero/run/Chara_BlueWalk00004.png | Bin .../animated/hero/run/Chara_BlueWalk00005.png | Bin .../animated/hero/run/Chara_BlueWalk00006.png | Bin .../animated/hero/run/Chara_BlueWalk00007.png | Bin .../animated/hero/run/Chara_BlueWalk00008.png | Bin .../animated/hero/run/Chara_BlueWalk00009.png | Bin .../animated/hero/run/Chara_BlueWalk00010.png | Bin .../animated/hero/run/Chara_BlueWalk00011.png | Bin .../animated/hero/run/Chara_BlueWalk00012.png | Bin .../animated/hero/run/Chara_BlueWalk00013.png | Bin .../animated/hero/run/Chara_BlueWalk00014.png | Bin .../animated/hero/run/Chara_BlueWalk00015.png | Bin .../animated/hero/run/Chara_BlueWalk00016.png | Bin .../animated/hero/run/Chara_BlueWalk00017.png | Bin .../animated/hero/run/Chara_BlueWalk00018.png | Bin .../animated/hero/run/Chara_BlueWalk00019.png | Bin .../animated/runner_new.png | Bin .../levels/level_01/config.json | 2 +- .../levels/level_01/map | 0 .../levels/level_with_finish/config.json | 2 +- .../levels/level_with_finish/map | 0 .../resources => resources}/static/18plus.png | Bin .../resources => resources}/static/brick.png | Bin {game/resources => resources}/static/exit.png | Bin 58 files changed, 80 insertions(+), 7 deletions(-) create mode 160000 deps/cpp-httplib create mode 100644 network/CMakeLists.txt create mode 100644 network/client/client.cpp create mode 100644 network/server/server.cpp rename {game/resources => resources}/animated/helicopter.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00000.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00001.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00002.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00003.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00004.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00005.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00006.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00007.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00008.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00009.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00010.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00011.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00012.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00013.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00014.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00015.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00016.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00017.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00018.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00019.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00000.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00001.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00002.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00003.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00004.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00005.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00006.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00007.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00008.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00009.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00010.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00011.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00012.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00013.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00014.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00015.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00016.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00017.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00018.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00019.png (100%) rename {game/resources => resources}/animated/runner_new.png (100%) rename {game/resources => resources}/levels/level_01/config.json (93%) rename {game/resources => resources}/levels/level_01/map (100%) rename {game/resources => resources}/levels/level_with_finish/config.json (93%) rename {game/resources => resources}/levels/level_with_finish/map (100%) rename {game/resources => resources}/static/18plus.png (100%) rename {game/resources => resources}/static/brick.png (100%) rename {game/resources => resources}/static/exit.png (100%) diff --git a/.gitmodules b/.gitmodules index c319e98..952393c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "deps/libpqxx"] path = deps/libpqxx url = https://github.com/jtv/libpqxx +[submodule "deps/cpp-httplib"] + path = deps/cpp-httplib + url = https://github.com/yhirose/cpp-httplib diff --git a/CMakeLists.txt b/CMakeLists.txt index 928f804..1c50a15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,13 @@ add_subdirectory(${DIRECTORY_PQXX}) message(STATUS "PostgreSQL include: ${INCLUDE_PQXX}") message(STATUS "PostgreSQL library: ${LIBRARY_PQXX}") +# HTTP library +set(DIRECTORY_HTTP ${PROJECT_SOURCE_DIR}/deps/cpp-httplib) +set(INCLUDE_HTTP ${DIRECTORY_HTTP}) + +add_subdirectory(${DIRECTORY_HTTP}) +message(STATUS "HTTP include: ${INCLUDE_HTTP}") + # Core library set(DIRECTORY_CORE ${PROJECT_SOURCE_DIR}/core) set(INCLUDE_CORE ${DIRECTORY_CORE}) @@ -105,6 +112,15 @@ add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") +# Network binaries +set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) +set(EXECUTABLE_SERVER server) +set(EXECUTABLE_CLIENT client) + +add_subdirectory(${DIRECTORY_NETWORK}) +message(STATUS "Server executable: ${EXECUTABLE_SERVER}") +message(STATUS "Client executable ${EXECUTABLE_GAME_CLIENT}") + # Tests set(DIRECTORY_TEST ${PROJECT_SOURCE_DIR}/test) set(EXECUTABLE_TEST test) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 1909ea8..45bfe37 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -136,7 +136,7 @@ namespace mad::core { void LevelLoaderFromFile::create_block(std::shared_ptr world, Vec2d position, float block_size, bool is_stable) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); if (is_stable) { source /= static_cast(m_config_json["texture"]["stable"]); } else { @@ -206,7 +206,7 @@ namespace mad::core { } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { - std::filesystem::path source("../../game/resources/static/"); + std::filesystem::path source("../../resources/static/"); source /= static_cast(m_config_json["texture"]["finish"]); auto image_storage = std::make_shared( diff --git a/deps/cpp-httplib b/deps/cpp-httplib new file mode 160000 index 0000000..df20c27 --- /dev/null +++ b/deps/cpp-httplib @@ -0,0 +1 @@ +Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index 48e0fe2..586b030 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -45,8 +45,8 @@ int main() { auto database_storage_driver = std::make_shared(database); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_with_finish"), - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/game/game_with_default_loader_example.cpp b/game/game_with_default_loader_example.cpp index cce779a..37cafe8 100644 --- a/game/game_with_default_loader_example.cpp +++ b/game/game_with_default_loader_example.cpp @@ -42,7 +42,7 @@ int main() { auto offline_storage_driver = std::make_shared(); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt new file mode 100644 index 0000000..35f74e8 --- /dev/null +++ b/network/CMakeLists.txt @@ -0,0 +1,41 @@ +function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) + message(STATUS "Network executable: '${EXECUTABLE_NETWORK_NAME}' is built with ${EXECUTABLE_SOURCES}") + + add_executable( + ${EXECUTABLE_NETWORK_NAME} + ${EXECUTABLE_SOURCES} + ${SOURCES_IMGUI} + ${SOURCES_IMGUI_SFML} + ) + + if (CMAKE_BUILD_TYPE MATCHES Debug) + target_compile_definitions(${EXECUTABLE_NETWORK_NAME} PUBLIC SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE) + message(STATUS "Enable debug logs for ${EXECUTABLE_NETWORK_NAME}") + endif() + + target_include_directories( + ${EXECUTABLE_NETWORK_NAME} PUBLIC + + ${PROJECT_SOURCE_DIR} + ${INCLUDE_SPDLOG} + ${INCLUDE_BOX2D} + ${INCLUDE_IMGUI} + ${INCLUDE_IMGUI_SFML} + ${INCLUDE_HTTP} + ) + + target_link_libraries( + ${EXECUTABLE_NETWORK_NAME} + + ${LIBRARY_SFML} + ${LIBRARY_CORE} + ${LIBRARY_SPDLOG} + ${LIBRARY_BOX2D} + ${LIBRARY_OPENGL} + ${LIBRARY_PQXX} + ) + +endfunction() + +network_executable(${EXECUTABLE_SERVER} server/server.cpp) +network_executable(${EXECUTABLE_CLIENT} client/client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp new file mode 100644 index 0000000..b4b83b3 --- /dev/null +++ b/network/client/client.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from client!" << '\n'; +} diff --git a/network/server/server.cpp b/network/server/server.cpp new file mode 100644 index 0000000..d60b858 --- /dev/null +++ b/network/server/server.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from server!" << '\n'; +} diff --git a/game/resources/animated/helicopter.png b/resources/animated/helicopter.png similarity index 100% rename from game/resources/animated/helicopter.png rename to resources/animated/helicopter.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00000.png b/resources/animated/hero/idle/Chara - BlueIdle00000.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00000.png rename to resources/animated/hero/idle/Chara - BlueIdle00000.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00001.png b/resources/animated/hero/idle/Chara - BlueIdle00001.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00001.png rename to resources/animated/hero/idle/Chara - BlueIdle00001.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00002.png b/resources/animated/hero/idle/Chara - BlueIdle00002.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00002.png rename to resources/animated/hero/idle/Chara - BlueIdle00002.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00003.png b/resources/animated/hero/idle/Chara - BlueIdle00003.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00003.png rename to resources/animated/hero/idle/Chara - BlueIdle00003.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00004.png b/resources/animated/hero/idle/Chara - BlueIdle00004.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00004.png rename to resources/animated/hero/idle/Chara - BlueIdle00004.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00005.png b/resources/animated/hero/idle/Chara - BlueIdle00005.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00005.png rename to resources/animated/hero/idle/Chara - BlueIdle00005.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00006.png b/resources/animated/hero/idle/Chara - BlueIdle00006.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00006.png rename to resources/animated/hero/idle/Chara - BlueIdle00006.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00007.png b/resources/animated/hero/idle/Chara - BlueIdle00007.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00007.png rename to resources/animated/hero/idle/Chara - BlueIdle00007.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00008.png b/resources/animated/hero/idle/Chara - BlueIdle00008.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00008.png rename to resources/animated/hero/idle/Chara - BlueIdle00008.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00009.png b/resources/animated/hero/idle/Chara - BlueIdle00009.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00009.png rename to resources/animated/hero/idle/Chara - BlueIdle00009.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00010.png b/resources/animated/hero/idle/Chara - BlueIdle00010.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00010.png rename to resources/animated/hero/idle/Chara - BlueIdle00010.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00011.png b/resources/animated/hero/idle/Chara - BlueIdle00011.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00011.png rename to resources/animated/hero/idle/Chara - BlueIdle00011.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00012.png b/resources/animated/hero/idle/Chara - BlueIdle00012.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00012.png rename to resources/animated/hero/idle/Chara - BlueIdle00012.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00013.png b/resources/animated/hero/idle/Chara - BlueIdle00013.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00013.png rename to resources/animated/hero/idle/Chara - BlueIdle00013.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00014.png b/resources/animated/hero/idle/Chara - BlueIdle00014.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00014.png rename to resources/animated/hero/idle/Chara - BlueIdle00014.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00015.png b/resources/animated/hero/idle/Chara - BlueIdle00015.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00015.png rename to resources/animated/hero/idle/Chara - BlueIdle00015.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00016.png b/resources/animated/hero/idle/Chara - BlueIdle00016.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00016.png rename to resources/animated/hero/idle/Chara - BlueIdle00016.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00017.png b/resources/animated/hero/idle/Chara - BlueIdle00017.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00017.png rename to resources/animated/hero/idle/Chara - BlueIdle00017.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00018.png b/resources/animated/hero/idle/Chara - BlueIdle00018.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00018.png rename to resources/animated/hero/idle/Chara - BlueIdle00018.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00019.png b/resources/animated/hero/idle/Chara - BlueIdle00019.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00019.png rename to resources/animated/hero/idle/Chara - BlueIdle00019.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00000.png b/resources/animated/hero/run/Chara_BlueWalk00000.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00000.png rename to resources/animated/hero/run/Chara_BlueWalk00000.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00001.png b/resources/animated/hero/run/Chara_BlueWalk00001.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00001.png rename to resources/animated/hero/run/Chara_BlueWalk00001.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00002.png b/resources/animated/hero/run/Chara_BlueWalk00002.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00002.png rename to resources/animated/hero/run/Chara_BlueWalk00002.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00003.png b/resources/animated/hero/run/Chara_BlueWalk00003.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00003.png rename to resources/animated/hero/run/Chara_BlueWalk00003.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00004.png b/resources/animated/hero/run/Chara_BlueWalk00004.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00004.png rename to resources/animated/hero/run/Chara_BlueWalk00004.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00005.png b/resources/animated/hero/run/Chara_BlueWalk00005.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00005.png rename to resources/animated/hero/run/Chara_BlueWalk00005.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00006.png b/resources/animated/hero/run/Chara_BlueWalk00006.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00006.png rename to resources/animated/hero/run/Chara_BlueWalk00006.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00007.png b/resources/animated/hero/run/Chara_BlueWalk00007.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00007.png rename to resources/animated/hero/run/Chara_BlueWalk00007.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00008.png b/resources/animated/hero/run/Chara_BlueWalk00008.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00008.png rename to resources/animated/hero/run/Chara_BlueWalk00008.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00009.png b/resources/animated/hero/run/Chara_BlueWalk00009.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00009.png rename to resources/animated/hero/run/Chara_BlueWalk00009.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00010.png b/resources/animated/hero/run/Chara_BlueWalk00010.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00010.png rename to resources/animated/hero/run/Chara_BlueWalk00010.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00011.png b/resources/animated/hero/run/Chara_BlueWalk00011.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00011.png rename to resources/animated/hero/run/Chara_BlueWalk00011.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00012.png b/resources/animated/hero/run/Chara_BlueWalk00012.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00012.png rename to resources/animated/hero/run/Chara_BlueWalk00012.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00013.png b/resources/animated/hero/run/Chara_BlueWalk00013.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00013.png rename to resources/animated/hero/run/Chara_BlueWalk00013.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00014.png b/resources/animated/hero/run/Chara_BlueWalk00014.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00014.png rename to resources/animated/hero/run/Chara_BlueWalk00014.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00015.png b/resources/animated/hero/run/Chara_BlueWalk00015.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00015.png rename to resources/animated/hero/run/Chara_BlueWalk00015.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00016.png b/resources/animated/hero/run/Chara_BlueWalk00016.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00016.png rename to resources/animated/hero/run/Chara_BlueWalk00016.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00017.png b/resources/animated/hero/run/Chara_BlueWalk00017.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00017.png rename to resources/animated/hero/run/Chara_BlueWalk00017.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00018.png b/resources/animated/hero/run/Chara_BlueWalk00018.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00018.png rename to resources/animated/hero/run/Chara_BlueWalk00018.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00019.png b/resources/animated/hero/run/Chara_BlueWalk00019.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00019.png rename to resources/animated/hero/run/Chara_BlueWalk00019.png diff --git a/game/resources/animated/runner_new.png b/resources/animated/runner_new.png similarity index 100% rename from game/resources/animated/runner_new.png rename to resources/animated/runner_new.png diff --git a/game/resources/levels/level_01/config.json b/resources/levels/level_01/config.json similarity index 93% rename from game/resources/levels/level_01/config.json rename to resources/levels/level_01/config.json index 250584b..c9c4e6d 100644 --- a/game/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -1,6 +1,6 @@ { "name" : "level_01", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_01/map b/resources/levels/level_01/map similarity index 100% rename from game/resources/levels/level_01/map rename to resources/levels/level_01/map diff --git a/game/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json similarity index 93% rename from game/resources/levels/level_with_finish/config.json rename to resources/levels/level_with_finish/config.json index 4276712..4d9f9fb 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -1,6 +1,6 @@ { "name" : "level_with_finish", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 50.0, "camera": { "position" : { diff --git a/game/resources/levels/level_with_finish/map b/resources/levels/level_with_finish/map similarity index 100% rename from game/resources/levels/level_with_finish/map rename to resources/levels/level_with_finish/map diff --git a/game/resources/static/18plus.png b/resources/static/18plus.png similarity index 100% rename from game/resources/static/18plus.png rename to resources/static/18plus.png diff --git a/game/resources/static/brick.png b/resources/static/brick.png similarity index 100% rename from game/resources/static/brick.png rename to resources/static/brick.png diff --git a/game/resources/static/exit.png b/resources/static/exit.png similarity index 100% rename from game/resources/static/exit.png rename to resources/static/exit.png From 1f9e1fb90fbdd09c298adeee3e6ea899216705b3 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 19:06:49 +0300 Subject: [PATCH 059/121] Test for httplib --- test/CMakeLists.txt | 1 + test/deps/CMakeLists.txt | 2 + test/deps/network/client.cpp | 22 +++++ test/deps/network/server.cpp | 155 +++++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 test/deps/network/client.cpp create mode 100644 test/deps/network/server.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 07bb365..bc2aa5e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,6 +18,7 @@ function(test_executable EXECUTABLE_TEST_NAME EXECUTABLE_SOURCES) ${INCLUDE_IMGUI} ${INCLUDE_IMGUI_SFML} ${INCLUDE_PQXX} + ${INCLUDE_HTTP} ) target_link_libraries( diff --git a/test/deps/CMakeLists.txt b/test/deps/CMakeLists.txt index 3078da8..817960a 100644 --- a/test/deps/CMakeLists.txt +++ b/test/deps/CMakeLists.txt @@ -1,3 +1,5 @@ test_executable(test-box2d TestBox2d.cpp) test_executable(test-imgui TestImGui.cpp) test_executable(test-pqxx TestPQXX.cpp) +test_executable(test-server network/server.cpp) +test_executable(test-client network/client.cpp) diff --git a/test/deps/network/client.cpp b/test/deps/network/client.cpp new file mode 100644 index 0000000..198b44a --- /dev/null +++ b/test/deps/network/client.cpp @@ -0,0 +1,22 @@ +#include +#include + +int main() { + httplib::Client cli("localhost", 8080); + + auto res1 = cli.Post("/user/login", httplib::Params{ + {"username", "Denis"} + }); + std::cout << res1->status << ' ' << res1->body << '\n'; + + + auto res2 = cli.Post("/user/login", httplib::Params{ + {"username", "NoDenis"} + }); + std::cout << res2->status << ' ' << res2->body << '\n'; + + auto res3 = cli.Post("/user/login", httplib::Params{ + {"name", "Denis"} + }); + std::cout << res3->status << ' ' << res3->body << '\n'; +} diff --git a/test/deps/network/server.cpp b/test/deps/network/server.cpp new file mode 100644 index 0000000..e4038c3 --- /dev/null +++ b/test/deps/network/server.cpp @@ -0,0 +1,155 @@ +#include +#include +#include + +namespace mad::core { + class Database { + public: + Database(); + + bool is_user_exists(const std::string &username); + + void registry_user(const std::string &username); + + std::size_t get_id(const std::string &username); + + std::size_t get_progress(std::size_t id); + + std::size_t get_progress(const std::string &username); + + void increment_progress(std::size_t id); + + void increment_progress(const std::string &username); + + void reset_progress(std::size_t id); + + void reset_progress(const std::string &username); + + private: + pqxx::connection m_connector; + std::string m_query; + + }; +} + +namespace mad::core { + + Database::Database() : m_connector("dbname = test-network") { + try { + if (m_connector.is_open()) { + SPDLOG_DEBUG("Database mad opened successfully"); + } else { + SPDLOG_DEBUG("Can't open database mad"); + } + + pqxx::work w(m_connector); + + m_query = "CREATE TABLE IF NOT EXISTS users(" + "id SMALLINT PRIMARY KEY," + "name TEXT NOT NULL UNIQUE);"; + w.exec(m_query); + + m_query = "CREATE TABLE IF NOT EXISTS progress(" + "id SMALLINT PRIMARY KEY REFERENCES users (id)," + "levels_completed SMALLINT NOT NULL);"; + w.exec(m_query); + + w.commit(); + + SPDLOG_DEBUG("Tables created successfully"); + } catch (std::exception &exc) { + SPDLOG_INFO(exc.what()); + } + } + + bool Database::is_user_exists(const std::string &username) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; + pqxx::result rows_found = W.exec(m_query); + return !rows_found.empty(); + } + + void Database::registry_user(const std::string &username) { + pqxx::work W(m_connector); + + m_query = "SELECT id FROM users"; + pqxx::result total_rows = W.exec(m_query); + std::size_t id = total_rows.size(); + + m_query = "INSERT INTO users(id, name) VALUES(" + std::to_string(id) + ", '" + W.esc(username) + "');"; + W.exec(m_query); + + m_query = "INSERT INTO progress(id, levels_completed) VALUES(" + std::to_string(id) + ", 0);"; + W.exec(m_query); + + W.commit(); + } + + std::size_t Database::get_id(const std::string &username) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; + auto found_row = W.exec1(m_query); + return found_row["id"].as(); + } + + std::size_t Database::get_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM progress WHERE id = " + std::to_string(id) + ";"; + auto found_row = W.exec1(m_query); + return found_row["levels_completed"].as(); + } + + std::size_t Database::get_progress(const std::string &username) { + return get_progress(get_id(username)); + } + + void Database::increment_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "UPDATE progress " + "SET levels_completed = levels_completed + 1 " + "WHERE id = " + std::to_string(id) + ";"; + W.exec(m_query); + W.commit(); + } + + void Database::increment_progress(const std::string &username) { + increment_progress(get_id(username)); + } + + void Database::reset_progress(std::size_t id) { + pqxx::work W(m_connector); + m_query = "UPDATE progress " + "SET levels_completed = 0 " + "WHERE id = " + std::to_string(id) + ";"; + W.exec(m_query); + W.commit(); + } + + void Database::reset_progress(const std::string &username) { + reset_progress(get_id(username)); + } +} + +int main() { + httplib::Server svr; + mad::core::Database db; + + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + + svr.listen("localhost", 8080); +} \ No newline at end of file From cf8a92f5540dd6f211239861fb31ba13538bd22f Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 20:01:02 +0300 Subject: [PATCH 060/121] Add simple client and server realisation --- CMakeLists.txt | 4 +- network/CMakeLists.txt | 4 +- network/client/client.cpp | 6 -- network/client/simple-client.cpp | 108 +++++++++++++++++++++++++++++++ network/server/server.cpp | 6 -- network/server/simple-server.cpp | 77 ++++++++++++++++++++++ 6 files changed, 189 insertions(+), 16 deletions(-) delete mode 100644 network/client/client.cpp create mode 100644 network/client/simple-client.cpp delete mode 100644 network/server/server.cpp create mode 100644 network/server/simple-server.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c50a15..01687c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,8 +114,8 @@ message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") # Network binaries set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) -set(EXECUTABLE_SERVER server) -set(EXECUTABLE_CLIENT client) +set(EXECUTABLE_SIMPLE_SERVER simple-server) +set(EXECUTABLE_SIMPLE_CLIENT simple-client) add_subdirectory(${DIRECTORY_NETWORK}) message(STATUS "Server executable: ${EXECUTABLE_SERVER}") diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt index 35f74e8..69e16eb 100644 --- a/network/CMakeLists.txt +++ b/network/CMakeLists.txt @@ -37,5 +37,5 @@ function(network_executable EXECUTABLE_NETWORK_NAME EXECUTABLE_SOURCES) endfunction() -network_executable(${EXECUTABLE_SERVER} server/server.cpp) -network_executable(${EXECUTABLE_CLIENT} client/client.cpp) +network_executable(${EXECUTABLE_SIMPLE_SERVER} server/simple-server.cpp) +network_executable(${EXECUTABLE_SIMPLE_CLIENT} client/simple-client.cpp) diff --git a/network/client/client.cpp b/network/client/client.cpp deleted file mode 100644 index b4b83b3..0000000 --- a/network/client/client.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from client!" << '\n'; -} diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp new file mode 100644 index 0000000..26049c9 --- /dev/null +++ b/network/client/simple-client.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mad::core { + + class NetworkClientStorageDriver : public ClientStorageDriver { + public: + explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { } + + bool log_in(const std::string &username) const override { + auto res = m_client.Post("/user/login", httplib::Params{ + {"username", username} + }); + SPDLOG_DEBUG("Login request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + if (res->status == 200) { + m_username = username; + } + return res->status == 200; + } + + bool sign_up(const std::string &username) override { + auto res = m_client.Post("/user/signup", httplib::Params{ + {"username", username} + }); + SPDLOG_DEBUG("Sign up request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + return res->status == 200; + } + + std::size_t get_progress() const override { + auto res = m_client.Post("/user/progress", httplib::Params{ + {"username", m_username} + }); + SPDLOG_DEBUG("Get progress request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + return std::stoi(res->body); + } + + void update_progress() override { + auto res = m_client.Post("/user/increment-progress", httplib::Params{ + {"username", m_username} + }); + SPDLOG_DEBUG("Update request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + } + + private: + mutable std::string m_username; + mutable httplib::Client m_client; + + }; + +} + +int main() { +#ifndef NDEBUG + auto log_level = spdlog::level::trace; +#else + auto log_level = spdlog::level::info; +#endif + spdlog::set_level(log_level); + + auto window = std::make_shared(sf::VideoMode(640, 480), "MAD"); + ImGui::SFML::Init(*window); + window->setFramerateLimit(120); + + auto global_dispatcher = std::make_shared(); + + auto system_listener = std::make_shared(window); + + std::vector> level_loaders{ + std::make_shared("../../resources/levels/level_with_finish"), + std::make_shared("../../resources/levels/level_01") + }; + + auto network_storage_driver = std::make_shared(); + + auto game_runner = std::make_unique( + level_loaders, + global_dispatcher, + std::make_unique(), + std::make_unique(network_storage_driver), + system_listener, + network_storage_driver + ); + + global_dispatcher->registry(std::make_shared(*window)); + global_dispatcher->registry(std::make_shared(*game_runner)); + global_dispatcher->registry(std::make_shared(*game_runner, network_storage_driver)); + global_dispatcher->registry(std::make_shared(*game_runner)); + + game_runner->run(*window); + + ImGui::SFML::Shutdown(); +} diff --git a/network/server/server.cpp b/network/server/server.cpp deleted file mode 100644 index d60b858..0000000 --- a/network/server/server.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from server!" << '\n'; -} diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp new file mode 100644 index 0000000..5c85588 --- /dev/null +++ b/network/server/simple-server.cpp @@ -0,0 +1,77 @@ +#include + +#include +#include + +int main() { + httplib::Server svr; + mad::core::Database db; + + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 404; + res.body = "User already exists"; + } else { + db.registry_user(username); + res.status = 200; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = std::to_string(db.get_progress(username)); + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + if (req.has_param("username")) { + auto username = req.get_param_value("username"); + if (db.is_user_exists(username)) { + res.status = 200; + res.body = "OK"; + db.increment_progress(username); + } else { + res.status = 404; + res.body = "User doesn\'t exists"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } + }); + + svr.listen("localhost", 8080); +} From cb7cdac64555bef6c69266c3f3bf59e0e956ebf7 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 11:56:34 +0300 Subject: [PATCH 061/121] Chain server and window --- network/client/simple-client.cpp | 5 +++- network/server/simple-server.cpp | 45 +++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp index 26049c9..d35f011 100644 --- a/network/client/simple-client.cpp +++ b/network/client/simple-client.cpp @@ -21,7 +21,10 @@ namespace mad::core { class NetworkClientStorageDriver : public ClientStorageDriver { public: - explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { } + explicit NetworkClientStorageDriver() : m_client("localhost", 8080) { + auto res = m_client.Get("/connection"); + SPDLOG_DEBUG("Connection request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); + } bool log_in(const std::string &username) const override { auto res = m_client.Post("/user/login", httplib::Params{ diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 5c85588..d51b1a6 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -2,11 +2,25 @@ #include #include +#include + +#include +#include + +#include +#include +#include + int main() { httplib::Server svr; mad::core::Database db; + svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + res.status = 200; + res.body = "Connected user port -- " + std::to_string(req.remote_port); + }); + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); @@ -73,5 +87,34 @@ int main() { } }); - svr.listen("localhost", 8080); + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + + sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); + ImGui::SFML::Init(window); + window.setFramerateLimit(120); + sf::Clock clock; + while (window.isOpen()) { + sf::Event event; + while (window.pollEvent(event)) { + ImGui::SFML::ProcessEvent(event); + + if (event.type == sf::Event::Closed) { + window.close(); + svr.stop(); + } + } + + ImGui::SFML::Update(window, clock.restart()); + + ImGui::Begin("Window"); + ImGui::Text("Hello"); + ImGui::End(); + + window.clear(); + ImGui::SFML::Render(window); + window.display(); + } + ImGui::SFML::Shutdown(); } From 7a9ec4af71d7e4820b76586d9d1844c789dc5778 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 12:42:20 +0300 Subject: [PATCH 062/121] Add server control buttons --- network/server/simple-server.cpp | 38 +++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index d51b1a6..2f1ae43 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -46,7 +46,7 @@ int main() { } else { db.registry_user(username); res.status = 200; - res.body = "User doesn\'t exists"; + res.body = "User " + username + " is registered"; } } else { res.status = 404; @@ -87,10 +87,6 @@ int main() { } }); - std::thread([&svr]() mutable { - svr.listen("localhost", 8080); - }).detach(); - sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); ImGui::SFML::Init(window); window.setFramerateLimit(120); @@ -102,14 +98,40 @@ int main() { if (event.type == sf::Event::Closed) { window.close(); - svr.stop(); + if (svr.is_running()) { + svr.stop(); + } } } ImGui::SFML::Update(window, clock.restart()); - ImGui::Begin("Window"); - ImGui::Text("Hello"); + ImGui::SetNextWindowSize(ImVec2(window.getSize().x, window.getSize().y)); + ImGui::SetNextWindowPos({0, 0}); + ImGui::Begin("Server util", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); + + + if (ImGui::Button("Start server")) { + if (!svr.is_running()) { + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + } + } + + if (ImGui::Button("Stop server")) { + if (svr.is_running()) { + svr.stop(); + } + } + + if (ImGui::Button("Quit")) { + window.close(); + if (svr.is_running()) { + svr.stop(); + } + } + ImGui::End(); window.clear(); From 3e4ee47c4a62056c097e7008a23fa39e2599db84 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 15:59:14 +0300 Subject: [PATCH 063/121] Add server logs --- network/server/simple-server.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 2f1ae43..c8934f1 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -16,17 +17,22 @@ int main() { httplib::Server svr; mad::core::Database db; - svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + std::vector logs; + const char *log; + + svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { res.status = 200; res.body = "Connected user port -- " + std::to_string(req.remote_port); + logs.push_back(res.body); }); - svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; + logs.push_back("User " + std::to_string(req.remote_port) + " login as " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -37,12 +43,13 @@ int main() { } }); - svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 404; res.body = "User already exists"; + logs.push_back("Register new user " + username + " from port " + std::to_string(req.remote_port)); } else { db.registry_user(username); res.status = 200; @@ -54,12 +61,13 @@ int main() { } }); - svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = std::to_string(db.get_progress(username)); + logs.push_back("Send progress to user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -70,13 +78,14 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; db.increment_progress(username); + logs.push_back("Increment progress for user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -116,12 +125,14 @@ int main() { std::thread([&svr]() mutable { svr.listen("localhost", 8080); }).detach(); + logs.emplace_back("Server has started"); } } if (ImGui::Button("Stop server")) { if (svr.is_running()) { svr.stop(); + logs.emplace_back("Server has stopped"); } } @@ -132,6 +143,15 @@ int main() { } } + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); + for (int i = 0; i < logs.size(); ++i) { + ImGui::Text(logs[i].c_str(), i); + } + ImGui::EndChild(); + } + ImGui::End(); window.clear(); From 4c81fe7772506e9b5504b3e16315560ac463736b Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 16:32:47 +0300 Subject: [PATCH 064/121] Add mutex for logs and db --- network/server/simple-server.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index c8934f1..1fef0fe 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -1,9 +1,9 @@ #include -#include #include #include #include +#include #include #include @@ -17,16 +17,18 @@ int main() { httplib::Server svr; mad::core::Database db; + std::mutex locker; std::vector logs; - const char *log; - svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { + svr.Get("/connection", [&logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); res.status = 200; - res.body = "Connected user port -- " + std::to_string(req.remote_port); - logs.push_back(res.body); + res.body = "Connection successful"; + logs.push_back("Connected user port -- " + std::to_string(req.remote_port)); }); - svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -43,7 +45,8 @@ int main() { } }); - svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -61,7 +64,8 @@ int main() { } }); - svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -78,7 +82,8 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -144,6 +149,7 @@ int main() { } { + std::unique_lock lock(locker); ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); for (int i = 0; i < logs.size(); ++i) { From 9ab7131a9214d2770dae718d7d867f8fd04067ae Mon Sep 17 00:00:00 2001 From: denis Date: Mon, 30 May 2022 20:46:24 +0300 Subject: [PATCH 065/121] Provide rebase --- network/server/simple-server.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 1fef0fe..611561e 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -164,5 +164,6 @@ int main() { ImGui::SFML::Render(window); window.display(); } + ImGui::SFML::Shutdown(); } From 7a893839825c4858d8693c8b43c1c5245a36dd80 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 28 May 2022 16:05:17 +0300 Subject: [PATCH 066/121] Add httplib.h in submodule, move resources, add network directory and cmake --- CMakeLists.txt | 9 --------- network/client/client.cpp | 6 ++++++ network/server/server.cpp | 6 ++++++ 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 network/client/client.cpp create mode 100644 network/server/server.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 01687c8..be9e12e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,15 +112,6 @@ add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") -# Network binaries -set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) -set(EXECUTABLE_SIMPLE_SERVER simple-server) -set(EXECUTABLE_SIMPLE_CLIENT simple-client) - -add_subdirectory(${DIRECTORY_NETWORK}) -message(STATUS "Server executable: ${EXECUTABLE_SERVER}") -message(STATUS "Client executable ${EXECUTABLE_GAME_CLIENT}") - # Tests set(DIRECTORY_TEST ${PROJECT_SOURCE_DIR}/test) set(EXECUTABLE_TEST test) diff --git a/network/client/client.cpp b/network/client/client.cpp new file mode 100644 index 0000000..b4b83b3 --- /dev/null +++ b/network/client/client.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from client!" << '\n'; +} diff --git a/network/server/server.cpp b/network/server/server.cpp new file mode 100644 index 0000000..d60b858 --- /dev/null +++ b/network/server/server.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "Hello from server!" << '\n'; +} From 9aaded5f8570c2b0ea2e915b1d4f2a045fd1a757 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 28 May 2022 16:05:17 +0300 Subject: [PATCH 067/121] Add httplib.h in submodule, move resources, add network directory and cmake --- CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index be9e12e..1c50a15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,15 @@ add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") +# Network binaries +set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) +set(EXECUTABLE_SERVER server) +set(EXECUTABLE_CLIENT client) + +add_subdirectory(${DIRECTORY_NETWORK}) +message(STATUS "Server executable: ${EXECUTABLE_SERVER}") +message(STATUS "Client executable ${EXECUTABLE_GAME_CLIENT}") + # Tests set(DIRECTORY_TEST ${PROJECT_SOURCE_DIR}/test) set(EXECUTABLE_TEST test) From 0a95808eadbb7b69f822ddabc1829375345802b1 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 29 May 2022 20:01:02 +0300 Subject: [PATCH 068/121] Add simple client and server realisation --- CMakeLists.txt | 4 ++-- network/client/client.cpp | 6 ------ network/server/server.cpp | 6 ------ 3 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 network/client/client.cpp delete mode 100644 network/server/server.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c50a15..01687c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,8 +114,8 @@ message(STATUS "Game-runner executable ${EXECUTABLE_GAME_RUNNER}") # Network binaries set(DIRECTORY_NETWORK ${PROJECT_SOURCE_DIR}/network) -set(EXECUTABLE_SERVER server) -set(EXECUTABLE_CLIENT client) +set(EXECUTABLE_SIMPLE_SERVER simple-server) +set(EXECUTABLE_SIMPLE_CLIENT simple-client) add_subdirectory(${DIRECTORY_NETWORK}) message(STATUS "Server executable: ${EXECUTABLE_SERVER}") diff --git a/network/client/client.cpp b/network/client/client.cpp deleted file mode 100644 index b4b83b3..0000000 --- a/network/client/client.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from client!" << '\n'; -} diff --git a/network/server/server.cpp b/network/server/server.cpp deleted file mode 100644 index d60b858..0000000 --- a/network/server/server.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - std::cout << "Hello from server!" << '\n'; -} From 35b01e902be6bde96662b09d02cada15d9ce1868 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 12:42:20 +0300 Subject: [PATCH 069/121] Add server control buttons --- network/server/simple-server.cpp | 41 ++++++-------------------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 611561e..2f1ae43 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -1,9 +1,8 @@ #include +#include #include #include -#include -#include #include #include @@ -17,24 +16,17 @@ int main() { httplib::Server svr; mad::core::Database db; - std::mutex locker; - std::vector logs; - - svr.Get("/connection", [&logs, &locker](const httplib::Request &req, httplib::Response &res) { - std::unique_lock lock(locker); + svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { res.status = 200; - res.body = "Connection successful"; - logs.push_back("Connected user port -- " + std::to_string(req.remote_port)); + res.body = "Connected user port -- " + std::to_string(req.remote_port); }); - svr.Post("/user/login", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { - std::unique_lock lock(locker); + svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; - logs.push_back("User " + std::to_string(req.remote_port) + " login as " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -45,14 +37,12 @@ int main() { } }); - svr.Post("/user/signup", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { - std::unique_lock lock(locker); + svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 404; res.body = "User already exists"; - logs.push_back("Register new user " + username + " from port " + std::to_string(req.remote_port)); } else { db.registry_user(username); res.status = 200; @@ -64,14 +54,12 @@ int main() { } }); - svr.Post("/user/progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { - std::unique_lock lock(locker); + svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = std::to_string(db.get_progress(username)); - logs.push_back("Send progress to user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -82,15 +70,13 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { - std::unique_lock lock(locker); + svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; db.increment_progress(username); - logs.push_back("Increment progress for user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -130,14 +116,12 @@ int main() { std::thread([&svr]() mutable { svr.listen("localhost", 8080); }).detach(); - logs.emplace_back("Server has started"); } } if (ImGui::Button("Stop server")) { if (svr.is_running()) { svr.stop(); - logs.emplace_back("Server has stopped"); } } @@ -148,22 +132,11 @@ int main() { } } - { - std::unique_lock lock(locker); - ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; - ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); - for (int i = 0; i < logs.size(); ++i) { - ImGui::Text(logs[i].c_str(), i); - } - ImGui::EndChild(); - } - ImGui::End(); window.clear(); ImGui::SFML::Render(window); window.display(); } - ImGui::SFML::Shutdown(); } From 765788e6eaf292185ba76e9a7026da6f3977fc9f Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 15:59:14 +0300 Subject: [PATCH 070/121] Add server logs --- network/server/simple-server.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 2f1ae43..c8934f1 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -16,17 +17,22 @@ int main() { httplib::Server svr; mad::core::Database db; - svr.Get("/connection", [](const httplib::Request &req, httplib::Response &res) { + std::vector logs; + const char *log; + + svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { res.status = 200; res.body = "Connected user port -- " + std::to_string(req.remote_port); + logs.push_back(res.body); }); - svr.Post("/user/login", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; + logs.push_back("User " + std::to_string(req.remote_port) + " login as " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -37,12 +43,13 @@ int main() { } }); - svr.Post("/user/signup", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 404; res.body = "User already exists"; + logs.push_back("Register new user " + username + " from port " + std::to_string(req.remote_port)); } else { db.registry_user(username); res.status = 200; @@ -54,12 +61,13 @@ int main() { } }); - svr.Post("/user/progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = std::to_string(db.get_progress(username)); + logs.push_back("Send progress to user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -70,13 +78,14 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { res.status = 200; res.body = "OK"; db.increment_progress(username); + logs.push_back("Increment progress for user " + username); } else { res.status = 404; res.body = "User doesn\'t exists"; @@ -116,12 +125,14 @@ int main() { std::thread([&svr]() mutable { svr.listen("localhost", 8080); }).detach(); + logs.emplace_back("Server has started"); } } if (ImGui::Button("Stop server")) { if (svr.is_running()) { svr.stop(); + logs.emplace_back("Server has stopped"); } } @@ -132,6 +143,15 @@ int main() { } } + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); + for (int i = 0; i < logs.size(); ++i) { + ImGui::Text(logs[i].c_str(), i); + } + ImGui::EndChild(); + } + ImGui::End(); window.clear(); From 7021ea2169902bcc57a55fce1708762fb908b74c Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Mon, 30 May 2022 16:32:47 +0300 Subject: [PATCH 071/121] Add mutex for logs and db --- network/server/simple-server.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index c8934f1..1fef0fe 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -1,9 +1,9 @@ #include -#include #include #include #include +#include #include #include @@ -17,16 +17,18 @@ int main() { httplib::Server svr; mad::core::Database db; + std::mutex locker; std::vector logs; - const char *log; - svr.Get("/connection", [&logs](const httplib::Request &req, httplib::Response &res) { + svr.Get("/connection", [&logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); res.status = 200; - res.body = "Connected user port -- " + std::to_string(req.remote_port); - logs.push_back(res.body); + res.body = "Connection successful"; + logs.push_back("Connected user port -- " + std::to_string(req.remote_port)); }); - svr.Post("/user/login", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/login", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -43,7 +45,8 @@ int main() { } }); - svr.Post("/user/signup", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/signup", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -61,7 +64,8 @@ int main() { } }); - svr.Post("/user/progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -78,7 +82,8 @@ int main() { } }); - svr.Post("/user/increment-progress", [&db, &logs](const httplib::Request &req, httplib::Response &res) { + svr.Post("/user/increment-progress", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); if (req.has_param("username")) { auto username = req.get_param_value("username"); if (db.is_user_exists(username)) { @@ -144,6 +149,7 @@ int main() { } { + std::unique_lock lock(locker); ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); for (int i = 0; i < logs.size(); ++i) { From 69c2c455a6a16ffd4ffa68c194b6948b30134a9d Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Wed, 1 Jun 2022 13:34:17 +0300 Subject: [PATCH 072/121] Implement LevelLoaderFromServer --- CMakeLists.txt | 1 + core/CMakeLists.txt | 1 + core/loader/LevelLoaderFromServer.cpp | 250 ++++++++++++++++++ core/loader/LevelLoaderFromServer.hpp | 142 ++++++++++ game/CMakeLists.txt | 2 +- game/game_loader_from_server_example.cpp | 71 +++++ resources/levels/level_01/config.json | 1 + .../levels/level_with_finish/config.json | 1 + 8 files changed, 468 insertions(+), 1 deletion(-) create mode 100644 core/loader/LevelLoaderFromServer.cpp create mode 100644 core/loader/LevelLoaderFromServer.hpp create mode 100644 game/game_loader_from_server_example.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 01687c8..b76a67f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,7 @@ set(DIRECTORY_GAME ${PROJECT_SOURCE_DIR}/game) set(EXECUTABLE_GAME example) set(EXECUTABLE_GAME_RUNNER game_runner_example) set(EXECUTABLE_GAME_DATABASE game_database_example) +set(EXECUTABLE_LOADER_FROM_SERVER game_loader_from_server_example) add_subdirectory(${DIRECTORY_GAME}) message(STATUS "Game executable: ${EXECUTABLE_GAME}") diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 1d87b87..a3599f0 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -78,6 +78,7 @@ set( runner/GameRunner.hpp runner/GameRunner.cpp loader/LevelLoader.hpp loader/LevelLoaderFromFile.cpp loader/LevelLoaderFromFile.hpp + loader/LevelLoaderFromServer.hpp loader/LevelLoaderFromServer.cpp visual/image/Image.hpp visual/image/static/RenderableStatic.cpp visual/image/static/RenderableStatic.hpp diff --git a/core/loader/LevelLoaderFromServer.cpp b/core/loader/LevelLoaderFromServer.cpp new file mode 100644 index 0000000..0cfd1ee --- /dev/null +++ b/core/loader/LevelLoaderFromServer.cpp @@ -0,0 +1,250 @@ +#include "LevelLoaderFromServer.hpp" + +#include +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" + +#include + +namespace mad::core { + + LevelLoaderFromServer::LevelLoaderFromServer(std::string map, json config) : m_level_map(std::move(map)), m_config_json(std::move(config)) { } + + std::unique_ptr LevelLoaderFromServer::load(std::shared_ptr global_dispatcher, + std::shared_ptr system_listener) { + auto level_dispatcher = std::make_shared(); + + auto world = std::make_shared(*level_dispatcher); + + Vec2d camera_position = {m_config_json["camera"]["position"]["x"], + m_config_json["camera"]["position"]["y"]}; + auto camera = std::make_shared(camera_position, world); + + auto keys = create_world(world); + + camera->turn_on(*level_dispatcher, keys[LevelLoaderFromServer::IdKeys::Hero]); + level_dispatcher->registry(camera); + level_dispatcher->registry(std::make_shared(world, keys[LevelLoaderFromServer::IdKeys::Hero])); + + /* std::vector> controllers { + std::make_shared(camera) + };*/ + + ///State Machine + struct C1 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 1"); + }; + }; + struct C2 : mad::core::Controller { + void control() override { + //SPDLOG_DEBUG("controller 2"); + }; + }; + auto machine = std::make_shared( + std::shared_ptr(level_dispatcher)); + machine->add_state(std::make_shared()); + machine->add_state(std::make_shared()); + machine->add_transition(0, 1, std::make_shared(1)); + machine->add_transition(1, 0, std::make_shared(2)); + machine->set_initial_state(0); + std::vector> controllers{machine, + std::make_shared( + camera)}; + + auto level_runner = std::make_unique( + system_listener, + std::make_unique(), + camera, + global_dispatcher, + level_dispatcher, + world, + controllers + ); + + level_dispatcher->registry(std::make_shared(*level_runner, std::make_shared(keys[LevelLoaderFromServer::IdKeys::Hero], keys[LevelLoaderFromServer::IdKeys::FinishBlock]))); + level_dispatcher->registry(std::make_shared(*level_runner)); + + return level_runner; + } + + std::unordered_map LevelLoaderFromServer::create_world(std::shared_ptr world) { + float object_size = m_config_json["block"]; + float current_position_x = object_size / 2; + float current_position_y = object_size / 2; + std::size_t width = m_config_json["width"]; + std::unordered_map keys; + + create_background(world); + + for (std::size_t i = 0; i < m_level_map.size();) { + for (std::size_t j = 0; j < width; ++j, ++i) { + char object = m_level_map[i]; + switch (m_objects[object]) { + case Objects::UnstableBlock: { + create_block(world, + {current_position_x, + current_position_y}, + object_size, false); + break; + } + case Objects::StableBlock: { + create_block(world, + {current_position_x, + current_position_y}, + object_size, true); + break; + } + case Objects::FinishBlock: { + keys[LevelLoaderFromServer::IdKeys::FinishBlock] = create_finish_block( + world, + {current_position_x, current_position_y}, + object_size); + break; + } + case Objects::Hero: { + keys[LevelLoaderFromServer::IdKeys::Hero] = create_hero(world, + {current_position_x, + current_position_y}); + break; + } + case Objects::Enemy1: { + break; + } + case Objects::Enemy2: { + break; + } + case Objects::Empty: { + break; + } + } + current_position_x += object_size; + } + current_position_y += object_size; + current_position_x = object_size / 2; + } + return keys; + } + + void LevelLoaderFromServer::create_block(std::shared_ptr world, + Vec2d position, float block_size, bool is_stable) { + + std::filesystem::path source("../../resources/static/"); + if (is_stable) { + source /= static_cast(m_config_json["texture"]["stable"]); + } else { + source /= static_cast(m_config_json["texture"]["unstable"]); + } + + auto image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared(source, block_size, + block_size, + StaticImage::TransformType::Tile) + }})); + + Entity::Id square_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + is_stable + ); + } + + Entity::Id LevelLoaderFromServer::create_hero(std::shared_ptr world, Vec2d position) { + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["hero"]["source"]; + + Entity::Id hero_id = 0; + + std::shared_ptr image_storage; + + float physical_size_width = m_config_json["hero"]["animated"]["size_width"]; + float physical_size_height = m_config_json["hero"]["animated"]["size_height"]; + float size_scale = m_config_json["hero"]["animated"]["size_scale"]; + float delta_x = m_config_json["hero"]["animated"]["delta_x"]; + float delta_y = m_config_json["hero"]["animated"]["delta_y"]; + + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y) + }, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y) + }} + ) + ); + + hero_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + false, false + ); + + return hero_id; + } + + Entity::Id LevelLoaderFromServer::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { + std::filesystem::path source("../../resources/static/"); + source /= static_cast(m_config_json["texture"]["finish"]); + + auto image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared(source, block_size, + block_size, + StaticImage::TransformType::Fit) + }})); + + return world->create_physical_entity( + 0, + position, + 0, + image_storage, + true + ); + } + + void LevelLoaderFromServer::create_background(std::shared_ptr world) { + std::filesystem::path source(m_config_json["background"]["source"]); + + std::shared_ptr image_storage; + std::vector parallax_ratios = m_config_json["background"]["parallax_ratios"]; + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source, + parallax_ratios, + m_config_json["background"]["scale"] + ) + }} + ) + ); + world->create_viewable_entity( + -1, + {0, 0}, + 0, + image_storage + ); + } + +} \ No newline at end of file diff --git a/core/loader/LevelLoaderFromServer.hpp b/core/loader/LevelLoaderFromServer.hpp new file mode 100644 index 0000000..04e310a --- /dev/null +++ b/core/loader/LevelLoaderFromServer.hpp @@ -0,0 +1,142 @@ +#ifndef MAD_LEVELLOADERFROMSERVER_HPP +#define MAD_LEVELLOADERFROMSERVER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include + +using json = nlohmann::json; + + +namespace mad::core { + + class ArrowController : public mad::core::EventHandler { + public: + explicit ArrowController(std::shared_ptr world, + mad::core::Entity::Id entity_id) + : m_world(std::move(world)), + m_entity_id(entity_id) {} + + void handle(const mad::core::Event &event) override { + //SPDLOG_INFO("handle arrow event"); + + auto make_move_intent = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).move(dir); + }); + }; + + auto impulse = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); + }); + }; + + auto force = [](mad::core::Vec2d dir) { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); + }); + }; + + if (event.type == mad::core::Event::Type::KeyPressed) { + const auto &keystroke = mad::core::const_cast_to(event); + if (keystroke.key_id == sf::Keyboard::Key::Space) { + m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); + } + } else if (event.type == mad::core::Event::Type::KeyHeld) { + const auto &keystroke = mad::core::const_cast_to(event); + if (keystroke.key_id == sf::Keyboard::Key::Right) { + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); + } + if (keystroke.key_id == sf::Keyboard::Key::Left) { + m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); + } + } + } + + std::unordered_set handled_types() override { + return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::KeyHeld}; + } + + private: + std::shared_ptr m_world; + mad::core::Entity::Id m_entity_id; + }; + + class LevelLoaderFromServer : public LevelLoader { + private: + enum class IdKeys { + Hero, + FinishBlock, + }; + + public: + explicit LevelLoaderFromServer(std::string map, json config); + + std::unique_ptr load( + std::shared_ptr global_dispatcher, + std::shared_ptr system_listener) override; + + std::unordered_map create_world(std::shared_ptr world); + + void create_block(std::shared_ptr world, Vec2d position, + float block_size, bool is_stable); + + Entity::Id create_hero(std::shared_ptr world, Vec2d position); + + void create_background(std::shared_ptr world); + + Entity::Id create_finish_block(std::shared_ptr world, Vec2d position, float block_size); + + private: + enum class Objects { + UnstableBlock, + StableBlock, + FinishBlock, + Hero, + Enemy1, + Enemy2, + Empty + }; + + json m_config_json; + + std::string m_level_map; + + std::unordered_map m_objects = { + {'.', Objects::Empty}, + {'#', Objects::StableBlock}, + {'@', Objects::UnstableBlock}, + {'F', Objects::FinishBlock}, + {'H', Objects::Hero}, + {'Z', Objects::Enemy1}, + {'E', Objects::Enemy2} + }; + + }; + +} + +#endif//MAD_LEVELLOADERFROMSERVER_HPP diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 1bbf356..80ef2dc 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -37,6 +37,6 @@ function(game_executable EXECUTABLE_GAME_NAME EXECUTABLE_SOURCES) endfunction() game_executable(${EXECUTABLE_GAME} example.cpp) -#game_executable(${EXECUTABLE_GAME_RUNNER} game_runner_example.cpp) +game_executable(${EXECUTABLE_LOADER_FROM_SERVER} game_loader_from_server_example.cpp) game_executable(${EXECUTABLE_GAME_RUNNER} game_with_default_loader_example.cpp) game_executable(${EXECUTABLE_GAME_DATABASE} game_database_example.cpp) diff --git a/game/game_loader_from_server_example.cpp b/game/game_loader_from_server_example.cpp new file mode 100644 index 0000000..0d42e9d --- /dev/null +++ b/game/game_loader_from_server_example.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +int main() { +#ifndef NDEBUG + auto log_level = spdlog::level::trace; +#else + auto log_level = spdlog::level::info; +#endif + spdlog::set_level(log_level); + + auto window = std::make_shared(sf::VideoMode(640, 480), "MAD"); + ImGui::SFML::Init(*window); + window->setFramerateLimit(120); + + auto global_dispatcher = std::make_shared(); + + auto system_listener = std::make_shared(window); + + auto database = std::make_shared(); + auto database_storage_driver = std::make_shared(database); + + std::string level_map; + json level_config; + + std::ifstream input_config("../../resources/levels/level_with_finish/config.json"); + input_config >> level_config; + std::ifstream map_file("../../resources/levels/level_with_finish/map"); + std::string map_line; + while (std::getline(map_file, map_line)) { + level_map += map_line; + } + + std::vector> level_loaders{ + std::make_shared(level_map, level_config) + }; + + auto game_runner = std::make_unique( + level_loaders, + global_dispatcher, + std::make_unique(), + std::make_unique(database_storage_driver), + system_listener, + database_storage_driver + ); + + global_dispatcher->registry(std::make_shared(*window)); + global_dispatcher->registry(std::make_shared(*game_runner)); + global_dispatcher->registry(std::make_shared(*game_runner, database_storage_driver)); + global_dispatcher->registry(std::make_shared(*game_runner)); + + game_runner->run(*window); + + ImGui::SFML::Shutdown(); +} diff --git a/resources/levels/level_01/config.json b/resources/levels/level_01/config.json index c9c4e6d..d3d1309 100644 --- a/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -1,6 +1,7 @@ { "name" : "level_01", "animated_resources" : "../../resources/animated/", + "width" : 14, "block" : 50.0, "camera": { "position" : { diff --git a/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json index 4d9f9fb..de9320e 100644 --- a/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -1,6 +1,7 @@ { "name" : "level_with_finish", "animated_resources" : "../../resources/animated/", + "width" : 18, "block" : 50.0, "camera": { "position" : { From b25cacda40a3df15eeba7f07c67781c10b7e3458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Wed, 1 Jun 2022 22:05:10 +0300 Subject: [PATCH 073/121] add slime files --- core/loader/LevelLoaderFromFile.cpp | 65 ++++++++++++++++++ core/loader/LevelLoaderFromFile.hpp | 2 + .../enemy/enemy_attack_beg/slime-attack-0.png | Bin 0 -> 356 bytes .../enemy/enemy_attack_beg/slime-attack-1.png | Bin 0 -> 354 bytes .../enemy/enemy_attack_beg/slime-attack-2.png | Bin 0 -> 477 bytes .../enemy/enemy_attack_beg/slime-attack-3.png | Bin 0 -> 442 bytes .../enemy/enemy_attack_end/slime-attack-4.png | Bin 0 -> 355 bytes .../enemy/enemy_idle/slime-idle-0.png | Bin 0 -> 385 bytes .../enemy/enemy_idle/slime-idle-1.png | Bin 0 -> 387 bytes .../enemy/enemy_idle/slime-idle-2.png | Bin 0 -> 359 bytes .../enemy/enemy_idle/slime-idle-3.png | Bin 0 -> 372 bytes .../animated/enemy/enemy_run/slime-move-0.png | Bin 0 -> 310 bytes .../animated/enemy/enemy_run/slime-move-1.png | Bin 0 -> 327 bytes .../animated/enemy/enemy_run/slime-move-2.png | Bin 0 -> 333 bytes .../animated/enemy/enemy_run/slime-move-3.png | Bin 0 -> 320 bytes game/resources/levels/level_01/config.json | 32 +++++++++ game/resources/levels/level_01/map | 2 +- 17 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png create mode 100644 game/resources/animated/enemy/enemy_attack_beg/slime-attack-1.png create mode 100644 game/resources/animated/enemy/enemy_attack_beg/slime-attack-2.png create mode 100644 game/resources/animated/enemy/enemy_attack_beg/slime-attack-3.png create mode 100644 game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png create mode 100644 game/resources/animated/enemy/enemy_idle/slime-idle-0.png create mode 100644 game/resources/animated/enemy/enemy_idle/slime-idle-1.png create mode 100644 game/resources/animated/enemy/enemy_idle/slime-idle-2.png create mode 100644 game/resources/animated/enemy/enemy_idle/slime-idle-3.png create mode 100644 game/resources/animated/enemy/enemy_run/slime-move-0.png create mode 100644 game/resources/animated/enemy/enemy_run/slime-move-1.png create mode 100644 game/resources/animated/enemy/enemy_run/slime-move-2.png create mode 100644 game/resources/animated/enemy/enemy_run/slime-move-3.png diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 0ecc9ab..9bedeb6 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -112,6 +112,7 @@ namespace mad::core { break; } case Objects::Enemy1: { + create_mob(world, {current_position_x, current_position_y}); break; } case Objects::Enemy2: { @@ -271,4 +272,68 @@ namespace mad::core { return hero_id; } + + void LevelLoaderFromFile::create_mob(std::shared_ptr world, Vec2d position) { + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["enemy"]["source"]; + + std::shared_ptr image_storage; + + float physical_size_width = m_config_json["enemy"]["animated"]["size_width"]; + float physical_size_height = m_config_json["enemy"]["animated"]["size_height"]; + float size_scale = m_config_json["enemy"]["animated"]["size_scale"]; + float delta_x = m_config_json["enemy"]["animated"]["delta_x"]; + float delta_y = m_config_json["enemy"]["animated"]["delta_y"]; + + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["idle"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["idle"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["run"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["run"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_beg, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["attack_beg"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["attack_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_end, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["attack_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + } + )); + + Entity::Id enemy_id = world->create_physical_entity( + 0, + position, + 0, + image_storage, + false, false + ); + + + float m_impulse = 2000; + float horizontal_velocity = 20; + + auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); + controllers.push_back(machine); + + } + }// namespace mad::core \ No newline at end of file diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index 46d2f52..613566c 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -99,6 +99,8 @@ namespace mad::core { Entity::Id create_hero(std::shared_ptr world, Vec2d position); + void create_mob(std::shared_ptr world, Vec2d position); + private: enum class Objects { UnstableBlock, diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png b/game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c4d39bf7389ccee65c2443bb4f627654712308 GIT binary patch literal 356 zcmV-q0h|7bP)X1^@s6P!BAT0003iNkl1t~!NECXD7D2u&`Fo#(A~i?tN%a{gJUO$ir_zR4Ne_`i$iw{f&Kxp#SS5( zba60FU%YF3$pyhK_bh?q?t9;RzwZJLhr{7;?3hN~1LNr`x7~Ywd{9|`udZ-3$%?hb zEGE3X;K*wNaQl=J3_N6?YSv`NDuMBIl}D3|#Vpp=Mf@%M=IVO5aqj+ZSeOx_u&ZfS zCSVdzmvaE4IKb%P5rD(qnX!Ip0w!_QfDL}DQy2*bp4JZQ831@`e*o~AB=qT7pZhf% z6QQS3YCyexx}5WzymH#!r~hRyUPZIiK-g`l{k!o`{v^I_7Pcl3jNWrV>%HIV)av^> zG6zy$Uc*KLs<=3ouUe$8u<0cf(X1^@s6P!BAT0003gNkl1vcB@<{;(Ll-mKvieR#OzYR9CGLxl4Z@*GL7ON%vK_rnF;(zn(zmfm8_zv zTrd;s)Rlvj<_ZazdtATt?s@ON??9u`Xf&D=W9++dI$!0g|MuPHPS4rC;$W5muv~=r zqahcq1^~Br&j6T~T^e>fOsyN3&R2Ob%UCYLq9){@*&h#&FQw~D%f=rKi_idp-!%Xl zhsXt0a>01=T3T1Sfhu{L#41|=>$Y?pkHK||zS}fv&j7%C`x}6tD58g>ylx#fB)|g{ zhfqF!n#8HVt9ccC-`f!{Scj#qp?nU@F2<-ICzU@-p5fsNjqmR+mw+sMxo zN`_FD%1PxG)D@;ljC*sxQ5Vm!2q47ALIgND|L;|H>|Fzf{Qv*}07*qoM6N<$f^-I- A?EnA( literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-2.png b/game/resources/animated/enemy/enemy_attack_beg/slime-attack-2.png new file mode 100644 index 0000000000000000000000000000000000000000..716ff73ddbe20434f52982e86b91bc9695265710 GIT binary patch literal 477 zcmV<30V4j1P)X1^@s6P!BAT0004`NklTQ8qY;XSwb|C#~($wPe~VGbT|607#R7 zjZG(G-1NKLd=h0GY!#R#fI&RVNtAJ>i{`ua8UWz*?3#^vM_mp^7lNClYyOgb;IiH2 z#!brx05lx;3#hJ@1WQ0=P9-wu=gi+HaJ7;U)&Kz9@4Ny4-iAXQzyScEu?WPpY@|s5 z0#`Y|MsJF{pH9XI@1Ex7?~Za25rnS30Xj{Cem?-XGWS<9ud3SOgNEb6v}~A`jpv8H zLGM>lngsBAqtafo1VEE`yuC00uxso19L1|j^fRa+H~`XV3M-aEn3jz=^tB~! zki8IxK0D)a=vM+LlMsOJ_@^qK23ZP1fKBSx0aQIf3P3tdgGRP@*k;kKdL%0YP!-LK zg{Z3{u&55C{{pW!%4OBQ&J={z?)64_ngrZ#MSsaET1<}i90s6jnd_FU>1|w}rt;Lw Tn7Xc900000NkvXXu0mjfU2W7A literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-3.png b/game/resources/animated/enemy/enemy_attack_beg/slime-attack-3.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6ca49d3d63c791b143c0a6849118af28c8b5ce GIT binary patch literal 442 zcmV;r0Y(0aP)X1^@s6P!BAT0004jNklZ0F3GUyg?(YX$Sm{B@M1P41i2{%>4j+%U#~P-1FS~-U~D|G&KB2`rahX&c)a|X_X0^c97DyX$QX| z4gee3z`^N5%G?A1VBbGN)eVHc0|sMZ7LMDS%32HnK|j+RBnE(+<+mcch=|AZ7t5&P1*aRo#GCM=>jP#LLKa0kbqk z)eXEpT_~b(`=}$0Rm6)*A!UGBnqt~PN~1UEflS0vZ>c~Paxaq{hQ9M%j=B3fh-U%d kZz1;xYpJY2SzG=&U*>7jxj>IFhyVZp07*qoM6N<$g0b(#ga7~l literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png b/game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png new file mode 100644 index 0000000000000000000000000000000000000000..025a6609a73c1f27a3c7b951b627a6108774a9ae GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n^SFfeL)x;Tb-bS5WAur5vz>1hfy zxWuSzcanGc{(tJ%A20;x?MXY#z-`wZ{-*xy0U-GB;*l5|5VTGAmpA%SW^SO-X=He( z`fvZj9a|V(=kM5J()1>0-n2F24S8BZu4Jix%oTjHMJ%gh4=yHn>IfIv-M?Zkt>rrX`@ zQ(&2qz>{)+f6cE6iMNkE=9zzf?&1?gNlyF^8;n@pENkU=xU}w&^sViC$RIJ{^7ll6 z>C@6d*x>7_WhV;0m|QSTv~za3&OBuk>tRL%cZGJgO^Gksgt9I58Yb!{=-KSe)$-z4 w@SHD*aaViT6itI93kKVY49)~Ti2?=&>3vP%YnzpXfq}>1>FVdQ&MBb@07%b=o&W#< literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-0.png b/game/resources/animated/enemy/enemy_idle/slime-idle-0.png new file mode 100644 index 0000000000000000000000000000000000000000..237a1e016cec2b8c05d1af5396c4412f936d4c7e GIT binary patch literal 385 zcmV-{0e=38P)X1^@s6P!BAT0003>qihrUX>YX1^@s6P!BAT0003>Nkl!`^#YTL<6*PzsAU}XVP)0$NsS`!w2ed9-L^KrXv1BP9KsdsMJ%4=qwZ@SH zfaCfAeq7)L3{B+fDFitHl3e5zd4}y~C9mmr{@&Ug!uxde9INQyjzN9bmIKx{r17dLlgj1}Mo zAspA2UELL2Ba%(1CUXOab4VB7Hk|eZ*b*ND^@|{{Kqps+3RP6kQQt*e&yfyLg92zQ hN@nx-C<+nxXb002ovPDHLkV1f_-pS%D7 literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-2.png b/game/resources/animated/enemy/enemy_idle/slime-idle-2.png new file mode 100644 index 0000000000000000000000000000000000000000..34383a0857343cb9bb743577a7a93b8703874d1b GIT binary patch literal 359 zcmV-t0hs=YP)X1^@s6P!BAT0003lNkl9hLXIHH0mwdHvHvy0ql;S@7#J8BX0#?V+T z<*?|$XDGTFWIjwDT@5@0aK#Y=1EdhaCr=K*S3J`d008R3fHZ%HQs@8x002ovPDHLk FV1i^FjV1s9 literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-3.png b/game/resources/animated/enemy/enemy_idle/slime-idle-3.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4ac77d0741a9eb36bd660b8971d62dbe984b06 GIT binary patch literal 372 zcmV-)0gL{LP)X1^@s6P!BAT0003yNklYU6vlrBH|NqpjM4`%Q+)`@pqr!4Iye<4ac&WO1E)g93c1;i9Hgv=ea z4&`2M<30J)fG+uM$+;)rch7fkprN6mq2Zs|s7NgOd5+7F>P0a#_Ha;!u5_)@IN5f}%iu8H|9btv8{_T=u3& z-}se_=`>Hc4wK=P))gbjic8nXtY_Dl&#LZv{@NzB6DcEDork>oCP=^LKj#ObZGp3; S$CEbz0000w(bec z8}{_C3G=(pe$HJ_T0%nLDf2lSFO9E3TpUyROPCpi1hfy zxWuTulr6{N?^k=hoeaTwP0xhiGQ@~!b{ZM7s9ibubMIYV9uUy}w!iH{Dp$o@g%=Dn zjv6q_$KE+~00;uYCUhiPGBYzb@7Q7kq?nuM?BkE&nXeqd5qZxv(XQ>s>E-+zqxdE_ zH|R?69b_xm#WVlu5vC^>4v2D9I5V)7owiF%0D=qFAE#%WmXuKFYqew&PdKF3@#gn* ze|e*v+ZA(CPIt0K$TD~rYAFQugrzUpd8js!^MCk VyTxKAbAbWG;OXk;vd$@?2>^9Ic@F>p literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_run/slime-move-2.png b/game/resources/animated/enemy/enemy_run/slime-move-2.png new file mode 100644 index 0000000000000000000000000000000000000000..327fb4a6d180c46e3436db660f8e24e6a86eaa40 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n^SFffXEx;Tb-bS5WAur5vz>1hfy zxWuTuk;{C}zhCmRcTCa{KD_t({|&D=4W6oH*u}A)n6~c5|5=Sd@bKbMT^;L3W9-~-w0ekXaC@BbIS@xSREr<4z$UOKmZ<(_4rlb(=}ATWIz zh)S4n`Fmsc!(x^&PN!+Y%oAjr&NJ#9k=PdfjguJ&n(uY)cZocApyAC0T^_+${(p~) zScJ_SQ||At`86T&_OZt*k$zkUUNJ~C{9NR8rzeM-!&Nel{lKG%(-@XBPY5Gdzq1PefOUOz+htVboFyt=akR{0G4`#SpWb4 literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_run/slime-move-3.png b/game/resources/animated/enemy/enemy_run/slime-move-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ef83926146124e119908295a611c728d1e5f4184 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n^SFfg)vx;Tb-bS5WAur5vz>1hfy z;9`?75L%pZ_~rWl8#}c-jSTNp|K)eKIWT3mM)5~0hMSi}f5#ge0D;Y}9j%Q(uyBpS zL`Tmlor(qv`CR?;%b8F1B_2%u+4Xn*Louc1>HhLbTjzk3Wgn_x0|Cog`I@pt3_RBb zH_eey(9`XIG(j|#%fgv4n?s@b?k0Z;5cuNvNA*+@8(T_yo}z@5&kLp#`|5vwQ9Qh@ z_qgY#IUx-X86+BhE^@lllXJMU(`XJ~!%^k6jBbxQUQ~UU-^e)WX@_sg4TeqZA5`7e ztTbNq`e6N+7=`8Un@!UfL^t{JRynzpah!X@$juqWSQ9yU9RtI`fD}J7%Vj_o1B0il KpUXO@geCycvwHOa literal 0 HcmV?d00001 diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 7189c6c..c97e902 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -81,5 +81,37 @@ } } } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 + } + } + } } } \ No newline at end of file diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 846bc16..f3b1c65 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -8,4 +8,4 @@ ...#.#......## ###########.## ............## -............## \ No newline at end of file +............##= \ No newline at end of file From 0b95b65ab05f3ac88d2189409797b779161c0318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Wed, 1 Jun 2022 22:32:57 +0300 Subject: [PATCH 074/121] merge main --- core/loader/LevelLoaderFromFile.cpp | 79 +++++++--------- .../levels/level_with_finish/config.json | 93 +++++++++++++++++-- 2 files changed, 116 insertions(+), 56 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index eca17a7..1c4a9e3 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,17 +1,17 @@ #include "LevelLoaderFromFile.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/statemachine/HeroStateMachine.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" #include <../../game/mobs/hero/Hero.hpp> +#include #include #include #include #include #include -#include -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" #include @@ -33,8 +33,7 @@ namespace mad::core { Vec2d camera_position = {m_config_json["camera"]["position"]["x"], m_config_json["camera"]["position"]["y"]}; float camera_smoothness = m_config_json["camera"]["smoothness"]; - Camera::FollowType camera_type = m_config_json["camera"]["follow_type"] == "forward" ? - Camera::FollowType::Forward : Camera::FollowType::Backward; + Camera::FollowType camera_type = m_config_json["camera"]["follow_type"] == "forward" ? Camera::FollowType::Forward : Camera::FollowType::Backward; float minimal_distance = m_config_json["camera"]["minimal_distance"]; auto camera = std::make_shared(camera_position, world, true); @@ -43,7 +42,7 @@ namespace mad::core { camera)}; - Entity::Id hero_id = create_world(world); + //Entity::Id hero_id = create_world(world); auto keys = create_world(world); camera->turn_on(*level_dispatcher, keys[LevelLoaderFromFile::IdKeys::Hero], camera_smoothness, camera_type, minimal_distance); @@ -76,7 +75,7 @@ namespace mad::core { std::make_shared( camera)};*/ - camera->set_zoom(0.10); + camera->set_zoom(0.15); auto level_runner = std::make_unique( system_listener, @@ -105,7 +104,7 @@ namespace mad::core { create_background(world); while (std::getline(m_level_map, map_line)) { - for (char object: map_line) { + for (char object : map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, @@ -129,7 +128,7 @@ namespace mad::core { break; } case Objects::Hero: { - // Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + // Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); hero_id = create_hero(world, {current_position_x, current_position_y}); break; } @@ -174,8 +173,7 @@ namespace mad::core { position, 0, image_storage, - is_stable - ); + is_stable); } Entity::Id LevelLoaderFromFile::create_hero(std::shared_ptr world, Vec2d position) { @@ -195,7 +193,14 @@ namespace mad::core { image_storage = std::make_shared( std::unordered_map>( - {{ImageStorage::TypeAction::Idle, + {{ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Idle, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], @@ -209,13 +214,6 @@ namespace mad::core { m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], physical_size_width, physical_size_height, size_scale, delta_x, delta_y)}, - {ImageStorage::TypeAction::Jump, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], - - m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], - physical_size_width, physical_size_height, size_scale, - delta_x, delta_y)}, {ImageStorage::TypeAction::Fly_up, std::make_shared( source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], @@ -271,17 +269,14 @@ namespace mad::core { m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["delta_time"], physical_size_width, physical_size_height, size_scale, - delta_x, delta_y)} - } - )); + delta_x, delta_y)}})); - Entity::Id hero_id = world->create_physical_entity( + hero_id = world->create_physical_entity( 0, position, 0, image_storage, - false, false - ); + false, false); /// add sensor auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); @@ -339,17 +334,14 @@ namespace mad::core { m_config_json["hero"]["animated"]["actions"]["attack_end"]["delta_time"], physical_size_width, physical_size_height, size_scale, - delta_x, delta_y)} - } - )); + delta_x, delta_y)}})); Entity::Id enemy_id = world->create_physical_entity( 0, position, 0, image_storage, - false, false - ); + false, false); float m_impulse = 2000; @@ -357,10 +349,7 @@ namespace mad::core { auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); controllers.push_back(machine); - } - -}// namespace mad::core Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { std::filesystem::path source("../../game/resources/static/"); source /= static_cast(m_config_json["texture"]["finish"]); @@ -370,16 +359,14 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Fit) - }})); + StaticImage::TransformType::Fit)}})); return world->create_physical_entity( 0, position, 0, image_storage, - true - ); + true); } void LevelLoaderFromFile::create_background(std::shared_ptr world) { @@ -394,17 +381,13 @@ namespace mad::core { std::make_shared( source, parallax_ratios, - m_config_json["background"]["scale"] - ) - }} - ) - ); + m_config_json["background"]["scale"])}})); world->create_viewable_entity( -1, {0, 0}, 0, - image_storage - ); + image_storage); } -} \ No newline at end of file + +}// namespace mad::core diff --git a/game/resources/levels/level_with_finish/config.json b/game/resources/levels/level_with_finish/config.json index a3b8ce0..391e191 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/game/resources/levels/level_with_finish/config.json @@ -1,7 +1,7 @@ { "name" : "level_with_finish", "animated_resources" : "../../game/resources/animated/", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, @@ -26,21 +26,98 @@ "hero" : { "source" : "hero", "animated" : { - "size_width": 30, - "size_height": 50, - "size_scale": 0.2, + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, "delta_x" : 0, - "delta_y" : 0, + "delta_y" : 3, "actions" : { "idle" : { - "source": "idle", + "source": "hero_idle", "type": "several_files", - "delta_time": 100 + "delta_time": 200 }, "run" : { - "source": "run", + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", "type": "several_files", "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 } } } From f2a3d804404218e506d56ea96ce18f160fbe2d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Wed, 1 Jun 2022 22:39:10 +0300 Subject: [PATCH 075/121] merge main --- core/loader/LevelLoaderFromFile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 1c4a9e3..fbe8805 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -130,6 +130,7 @@ namespace mad::core { case Objects::Hero: { // Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); hero_id = create_hero(world, {current_position_x, current_position_y}); + keys[LevelLoaderFromFile::IdKeys::Hero] = hero_id; break; } case Objects::Enemy1: { From 5e34de20e47318d64de15981eeefe64861d8bdc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Wed, 1 Jun 2022 22:41:46 +0300 Subject: [PATCH 076/121] merge main --- core/loader/LevelLoaderFromFile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index fbe8805..e7d1307 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -75,7 +75,7 @@ namespace mad::core { std::make_shared( camera)};*/ - camera->set_zoom(0.15); + camera->set_zoom(0.1); auto level_runner = std::make_unique( system_listener, From 1cda33bb76e9e6f7d9136a36ef221ec931b2332a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Wed, 1 Jun 2022 22:46:30 +0300 Subject: [PATCH 077/121] merge main --- core/loader/LevelLoaderFromFile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index e7d1307..7a0a898 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -77,6 +77,7 @@ namespace mad::core { camera->set_zoom(0.1); + auto level_runner = std::make_unique( system_listener, std::make_unique(), From fd5ec30da0416043a2fc55725ee3572c9759e18a Mon Sep 17 00:00:00 2001 From: Mirong1707 <31445859+Mirong1707@users.noreply.github.com> Date: Wed, 1 Jun 2022 22:49:17 +0300 Subject: [PATCH 078/121] Update build_and_run_tests.yml --- .github/workflows/build_and_run_tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_run_tests.yml b/.github/workflows/build_and_run_tests.yml index 5c2592d..1ca2c07 100644 --- a/.github/workflows/build_and_run_tests.yml +++ b/.github/workflows/build_and_run_tests.yml @@ -4,9 +4,9 @@ name: CI on: push: - branches: [ main ] + branches: [ main, release_branch ] pull_request: - branches: [ main ] + branches: [ main, release_branch ] jobs: From f254c40e8b2c4233d2cd7cd21494980a3124b6b0 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Thu, 2 Jun 2022 11:45:08 +0300 Subject: [PATCH 079/121] Merge graphics and fix zoom --- core/loader/LevelLoaderFromFile.cpp | 9 ++++++--- game/resources/levels/level_01/config.json | 2 +- game/resources/levels/level_02/config.json | 2 +- game/resources/levels/level_03/config.json | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 97ff52d..83c412e 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -21,7 +21,7 @@ namespace mad::core { std::unique_ptr LevelLoaderFromFile::load(std::shared_ptr global_dispatcher, std::shared_ptr system_listener) { - auto level_dispatcher = std::make_shared(); + level_dispatcher = std::make_shared(); auto world = std::make_shared(*level_dispatcher); @@ -31,6 +31,7 @@ namespace mad::core { Camera::FollowType camera_type = m_config_json["camera"]["follow_type"] == "forward" ? Camera::FollowType::Forward : Camera::FollowType::Backward; float minimal_distance = m_config_json["camera"]["minimal_distance"]; + float zoom = m_config_json["camera"]["zoom"]; auto camera = std::make_shared(camera_position, world, true); @@ -71,7 +72,7 @@ namespace mad::core { std::make_shared( camera)};*/ - camera->set_zoom(0.1); + camera->set_zoom(zoom); auto level_runner = std::make_unique( @@ -261,6 +262,7 @@ namespace mad::core { break; } } + decoration_scale *= static_cast(m_config_json["camera"]["zoom"]); auto image_storage = std::make_shared( std::unordered_map>( @@ -481,7 +483,8 @@ namespace mad::core { std::make_shared( source, parallax_ratios, - m_config_json["background"]["scale"])}})); + static_cast(m_config_json["background"]["scale"]) * + static_cast(m_config_json["camera"]["zoom"]))}})); world->create_viewable_entity( -1, {0, 0}, diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index cfe8e08..1c9d472 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -11,7 +11,7 @@ }, "angle": 15.0, "smoothness": 0.1, - "zoom": 10.5, + "zoom": 0.1, "follow_type" : "forward", "minimal_distance" : 3.0 }, diff --git a/game/resources/levels/level_02/config.json b/game/resources/levels/level_02/config.json index 0c7db93..3a9c0dd 100644 --- a/game/resources/levels/level_02/config.json +++ b/game/resources/levels/level_02/config.json @@ -11,7 +11,7 @@ }, "angle": 15.0, "smoothness": 0.1, - "zoom": 10.5, + "zoom": 0.1, "follow_type" : "forward", "minimal_distance" : 3.0 }, diff --git a/game/resources/levels/level_03/config.json b/game/resources/levels/level_03/config.json index 2abaa77..c752380 100644 --- a/game/resources/levels/level_03/config.json +++ b/game/resources/levels/level_03/config.json @@ -11,7 +11,7 @@ }, "angle": 15.0, "smoothness": 0.1, - "zoom": 10.5, + "zoom": 0.1, "follow_type" : "forward", "minimal_distance" : 3.0 }, From 5c1b1585ef3d193f19417516e1fdb2380fc4bb66 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Thu, 2 Jun 2022 15:26:17 +0300 Subject: [PATCH 080/121] Add parameter of distance over hero in config --- core/loader/LevelLoaderFromFile.cpp | 4 +++- core/visual/Camera.cpp | 12 ++++++++++-- core/visual/Camera.hpp | 6 +++++- game/resources/levels/level_01/config.json | 3 ++- game/resources/levels/level_02/config.json | 3 ++- game/resources/levels/level_03/config.json | 3 ++- game/resources/levels/level_with_finish/config.json | 3 ++- 7 files changed, 26 insertions(+), 8 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 83c412e..e9452f3 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -32,6 +32,7 @@ namespace mad::core { Camera::FollowType::Forward : Camera::FollowType::Backward; float minimal_distance = m_config_json["camera"]["minimal_distance"]; float zoom = m_config_json["camera"]["zoom"]; + float part_of_window = m_config_json["camera"]["part_of_window"]; auto camera = std::make_shared(camera_position, world, true); @@ -42,7 +43,8 @@ namespace mad::core { //Entity::Id hero_id = create_world(world); auto keys = create_world(world); - camera->turn_on(*level_dispatcher, keys[LevelLoaderFromFile::IdKeys::Hero], camera_smoothness, camera_type, minimal_distance); + camera->turn_on(*level_dispatcher, keys[LevelLoaderFromFile::IdKeys::Hero], camera_smoothness, + camera_type, minimal_distance, part_of_window); level_dispatcher->registry(camera); //level_dispatcher->registry(std::make_shared(world, keys[LevelLoaderFromFile::IdKeys::Hero])); diff --git a/core/visual/Camera.cpp b/core/visual/Camera.cpp index 6afcdf0..0289054 100644 --- a/core/visual/Camera.cpp +++ b/core/visual/Camera.cpp @@ -8,11 +8,12 @@ namespace mad::core { void Camera::turn_on(EventDispatcher &event_dispatcher, Entity::Id chased_id, float smoothness, - FollowType type, float minimal_distance) { + FollowType type, float minimal_distance, float part_of_window) { m_smoothness = smoothness; m_chased_object = chased_id; m_type = type; m_minimal_distant = minimal_distance; + m_part_of_window = part_of_window; auto start_appearance = [](Entity &entity, EventDispatcher &event_dispatcher) { const_cast_to(entity).appear(event_dispatcher); }; @@ -20,6 +21,11 @@ namespace mad::core { } bool Camera::render(sf::RenderWindow &window) { + if (m_distance_over_hero == 0) { + m_distance_over_hero = -static_cast(window.getSize().y * m_part_of_window); + *m_position += Vec2d{0, m_distance_over_hero}; + m_view.setCenter(*m_position); + } auto end_of_render = [](Entity &entity, EventDispatcher &event_dispatcher) { const_cast_to(entity).end_of_render_action(event_dispatcher); }; @@ -143,9 +149,10 @@ namespace mad::core { Vec2d position = entity.get_image_position(); if (!m_last_position.has_value()) { m_last_position = position; - *m_position = position; + *m_position = position + Vec2d{0, m_distance_over_hero}; m_view.setCenter(*m_position); } + *m_position -= Vec2d{0, m_distance_over_hero}; switch (m_type) { case FollowType::Forward: { float move_x; @@ -184,6 +191,7 @@ namespace mad::core { break; } } + *m_position += Vec2d{0, m_distance_over_hero}; m_last_position = position; } } diff --git a/core/visual/Camera.hpp b/core/visual/Camera.hpp index 6e8d78d..6dba8de 100644 --- a/core/visual/Camera.hpp +++ b/core/visual/Camera.hpp @@ -52,7 +52,7 @@ namespace mad::core { explicit Camera(Vec2d initial_position, std::shared_ptr world, bool is_debug_mode = false); void turn_on(EventDispatcher &event_dispatcher, Entity::Id chased_id, float smoothness, - FollowType type = FollowType::Forward, float minimal_distance = 1); + FollowType type = FollowType::Forward, float minimal_distance = 1, float part_of_window = 0); bool render(sf::RenderWindow &window) override; @@ -97,6 +97,10 @@ namespace mad::core { bool m_is_debug_mode; + float m_distance_over_hero = 0; + + float m_part_of_window; + sf::RectangleShape get_physical_shape() noexcept override; }; diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 1c9d472..2b39144 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -13,7 +13,8 @@ "smoothness": 0.1, "zoom": 0.1, "follow_type" : "forward", - "minimal_distance" : 3.0 + "minimal_distance" : 3.0, + "part_of_window" : 0.02 }, "background" : { "source" : "../../game/resources/background/background_01", diff --git a/game/resources/levels/level_02/config.json b/game/resources/levels/level_02/config.json index 3a9c0dd..ac5f95a 100644 --- a/game/resources/levels/level_02/config.json +++ b/game/resources/levels/level_02/config.json @@ -13,7 +13,8 @@ "smoothness": 0.1, "zoom": 0.1, "follow_type" : "forward", - "minimal_distance" : 3.0 + "minimal_distance" : 3.0, + "part_of_window" : 0.02 }, "background" : { "source" : "../../game/resources/background/background_02", diff --git a/game/resources/levels/level_03/config.json b/game/resources/levels/level_03/config.json index c752380..5bd8160 100644 --- a/game/resources/levels/level_03/config.json +++ b/game/resources/levels/level_03/config.json @@ -13,7 +13,8 @@ "smoothness": 0.1, "zoom": 0.1, "follow_type" : "forward", - "minimal_distance" : 3.0 + "minimal_distance" : 3.0, + "part_of_window" : 0.02 }, "background" : { "source" : "../../game/resources/background/background_03", diff --git a/game/resources/levels/level_with_finish/config.json b/game/resources/levels/level_with_finish/config.json index 3b9900e..6237115 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/game/resources/levels/level_with_finish/config.json @@ -12,7 +12,8 @@ "smoothness": 0.6, "zoom": 10.5, "follow_type" : "forward", - "minimal_distance" : 3.0 + "minimal_distance" : 3.0, + "part_of_window" : 0.02 }, "background" : { "source" : "../../game/resources/background/background_02", From b347cdada262cb15901841b5e1193e33a820ee69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Thu, 2 Jun 2022 15:53:06 +0300 Subject: [PATCH 081/121] add enemy to map --- core/loader/LevelLoaderFromFile.cpp | 8 ++++---- game/resources/levels/level_01/map | 6 +++--- game/resources/levels/level_with_finish/map | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 7a0a898..32da2d5 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -135,10 +135,10 @@ namespace mad::core { break; } case Objects::Enemy1: { - create_mob(world, {current_position_x, current_position_y}); break; } case Objects::Enemy2: { + create_mob(world, {current_position_x, current_position_y}); break; } case Objects::Empty: { @@ -334,7 +334,7 @@ namespace mad::core { std::make_shared( source / m_config_json["enemy"]["animated"]["actions"]["attack_end"]["source"], - m_config_json["hero"]["animated"]["actions"]["attack_end"]["delta_time"], + m_config_json["enemy"]["animated"]["actions"]["attack_end"]["delta_time"], physical_size_width, physical_size_height, size_scale, delta_x, delta_y)}})); @@ -349,8 +349,8 @@ namespace mad::core { float m_impulse = 2000; float horizontal_velocity = 20; - auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); - controllers.push_back(machine); + //auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); + //controllers.push_back(machine); } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { std::filesystem::path source("../../game/resources/static/"); diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 82266f0..817e94c 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,9 +1,9 @@ -@...F..H..#..# -.............. -.............. +@......H..#..# .............. .............. +.........E.... .............. +...F.......... ...##.......## ...#.#......## ###########.## diff --git a/game/resources/levels/level_with_finish/map b/game/resources/levels/level_with_finish/map index d02509d..ca30743 100644 --- a/game/resources/levels/level_with_finish/map +++ b/game/resources/levels/level_with_finish/map @@ -1,5 +1,5 @@ #................# -#.H..............# +#.H..E...........# #....#...........# #...##.#...#....F# ########..###..### \ No newline at end of file From 5be62ebbf4aacd209a75dc4fb56b447aff467f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Thu, 2 Jun 2022 16:36:14 +0300 Subject: [PATCH 082/121] create enemy StateMachine --- core/CMakeLists.txt | 2 +- .../management/controller/EnemyAttack.cpp | 22 +++++++ .../management/controller/EnemyAttack.hpp | 21 +++++++ .../statemachine/EnemyStateMachine.cpp | 57 +++++++++++++++++++ .../statemachine/EnemyStateMachine.hpp | 15 +++++ core/loader/LevelLoaderFromFile.cpp | 13 +++-- core/world/LocalWorld.cpp | 4 +- core/world/LocalWorld.hpp | 2 +- core/world/World.hpp | 2 +- core/world/entity/EntityStorage.cpp | 4 +- core/world/entity/EntityStorage.hpp | 2 +- core/world/entity/PhysicalEntity.cpp | 17 +++++- core/world/entity/PhysicalEntity.hpp | 3 +- game/resources/levels/level_01/map | 4 +- game/resources/levels/level_with_finish/map | 2 +- 15 files changed, 151 insertions(+), 19 deletions(-) create mode 100644 core/event/management/controller/EnemyAttack.cpp create mode 100644 core/event/management/controller/EnemyAttack.hpp create mode 100644 core/event/management/controller/statemachine/EnemyStateMachine.cpp create mode 100644 core/event/management/controller/statemachine/EnemyStateMachine.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a076dfa..ba8c08c 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -103,7 +103,7 @@ set( event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/management/condition/CollisionCondition.hpp event/management/condition/CollisionCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/EnemyAttack.cpp b/core/event/management/controller/EnemyAttack.cpp new file mode 100644 index 0000000..17a6753 --- /dev/null +++ b/core/event/management/controller/EnemyAttack.cpp @@ -0,0 +1,22 @@ +#include "EnemyAttack.hpp" +mad::core::EnemyAttack::EnemyAttack(std::shared_ptr world, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), attack_stage(attack_stage){ + Move_animation = ImageStorage::TypeAction::Attack_1_beg; + Idle_animation = ImageStorage::TypeAction::Attack_1_beg; +} +void mad::core::EnemyAttack::control() { + Movement::control(); + if((*attack_stage) % 2 == 0){ + if(Move_animation != ImageStorage::TypeAction::Attack_1_beg){ + SPDLOG_DEBUG("changed to Attack_1_beg"); + } + Move_animation = ImageStorage::TypeAction::Attack_1_beg; + Idle_animation = ImageStorage::TypeAction::Attack_1_beg; + } + if((*attack_stage) % 2 == 1){ + if(Move_animation != ImageStorage::TypeAction::Attack_1_end){ + SPDLOG_DEBUG("changed to Attack_1_end"); + } + Move_animation = ImageStorage::TypeAction::Attack_1_end; + Idle_animation = ImageStorage::TypeAction::Attack_1_end; + } +} diff --git a/core/event/management/controller/EnemyAttack.hpp b/core/event/management/controller/EnemyAttack.hpp new file mode 100644 index 0000000..a056739 --- /dev/null +++ b/core/event/management/controller/EnemyAttack.hpp @@ -0,0 +1,21 @@ +#ifndef MAD_ENEMYATTACK_HPP +#define MAD_ENEMYATTACK_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class EnemyAttack : public Movement { + public: + EnemyAttack(std::shared_ptr world, Entity::Id entity_id, Direction dir, int* attack_stage, float velocity = 0); + void control() override; + int *attack_stage; + }; + +} + + +#endif//MAD_ENEMYATTACK_HPP diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.cpp b/core/event/management/controller/statemachine/EnemyStateMachine.cpp new file mode 100644 index 0000000..6f5e6de --- /dev/null +++ b/core/event/management/controller/statemachine/EnemyStateMachine.cpp @@ -0,0 +1,57 @@ +#include "EnemyStateMachine.hpp" +#include "event/management/condition/EndAnimationCondition.hpp" +#include "event/management/condition/FallCondition.hpp" +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/KeyReleasedCondition.hpp" +#include "event/management/condition/LastStateCondition.hpp" +#include "event/management/condition/SensorCondition.hpp" +#include "event/management/condition/SensorEndCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/Attack.hpp" +#include "event/management/controller/Fall.hpp" +#include "event/management/controller/FlyUp.hpp" +#include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/JumpImpulse.hpp" +#include "event/management/controller/Movement.hpp" +#include "event/management/controller/StartJump.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" + +mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr world, mad::core::Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity) : StateMachine(level_dispatcher){ + auto machine = this; + + + StateMachine::StateId ground_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); + StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + int *attack_stage = new int(0); + StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + + machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_idle, ground_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_right, ground_idle, std::make_shared(sf::Keyboard::Right)); + machine->add_transition(ground_left, ground_idle, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_right, ground_left, std::make_shared(sf::Keyboard::Left)); + machine->add_transition(ground_left, ground_right, std::make_shared(sf::Keyboard::Right)); + + + machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + + + + + + + + + + + machine->set_initial_state(0); + //controllers.push_back(machine); +} diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.hpp b/core/event/management/controller/statemachine/EnemyStateMachine.hpp new file mode 100644 index 0000000..bc3b91a --- /dev/null +++ b/core/event/management/controller/statemachine/EnemyStateMachine.hpp @@ -0,0 +1,15 @@ +#ifndef MAD_ENEMYSTATEMACHINE_HPP +#define MAD_ENEMYSTATEMACHINE_HPP + +#include "StateMachine.hpp" +#include "world/LocalWorld.hpp" +namespace mad::core{ + class EnemyStateMachine : public StateMachine { + + public: + explicit EnemyStateMachine(std::shared_ptr world, Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity); + }; +} + + +#endif//MAD_ENEMYSTATEMACHINE_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index dfe0b3a..25c18b2 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,12 +1,13 @@ #include "LevelLoaderFromFile.hpp" -#include #include "event/management/condition/KeyDownCondition.hpp" #include "event/management/condition/KeyPressedCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/statemachine/EnemyStateMachine.hpp" #include "event/management/controller/statemachine/HeroStateMachine.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" #include <../../game/mobs/hero/Hero.hpp> +#include #include @@ -381,7 +382,8 @@ namespace mad::core { position, 0, image_storage, - false, false); + false, false, + 0x0004, 0x0002); /// add sensor auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); @@ -446,14 +448,15 @@ namespace mad::core { position, 0, image_storage, - false, false); + false, false, + 0x0004, 0x0002); float m_impulse = 2000; float horizontal_velocity = 20; - //auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); - //controllers.push_back(machine); + auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); + controllers.push_back(machine); } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { std::filesystem::path source(m_config_json["static_resources"]); diff --git a/core/world/LocalWorld.cpp b/core/world/LocalWorld.cpp index efa14c6..ffac6fa 100644 --- a/core/world/LocalWorld.cpp +++ b/core/world/LocalWorld.cpp @@ -88,9 +88,9 @@ mad::core::Entity::Id mad::core::LocalWorld::create_viewable_entity(int z_ind, m return m_storage.create_viewable_entity(z_ind, initial_position, initial_rotation, image_storage); } mad::core::Entity::Id mad::core::LocalWorld::create_physical_entity(int z_ind, mad::core::Vec2d initial_position, float initial_rotation, - std::shared_ptr image_storage, bool is_fixed, bool is_rotated) { + std::shared_ptr image_storage, bool is_fixed, bool is_rotated, uint16 categoryBits, uint16 maskBits) { return m_storage.create_physical_entity(z_ind, initial_position, initial_rotation, image_storage, - m_physical_world, is_fixed, is_rotated); + m_physical_world, is_fixed, is_rotated, categoryBits, maskBits); } mad::core::Entity &mad::core::LocalWorld::get_entity(mad::core::Entity::Id id) noexcept { diff --git a/core/world/LocalWorld.hpp b/core/world/LocalWorld.hpp index c517b0e..3f64ea6 100644 --- a/core/world/LocalWorld.hpp +++ b/core/world/LocalWorld.hpp @@ -33,7 +33,7 @@ namespace mad::core { Entity::Id create_viewable_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage) override; Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, - bool is_fixed = false, bool is_rotated = true) override; + bool is_fixed = false, bool is_rotated = true, uint16 categoryBits = 0x0006, uint16 maskBits = 0x0006) override; EntityStorage& get_storage(); diff --git a/core/world/World.hpp b/core/world/World.hpp index 230d808..5e50119 100644 --- a/core/world/World.hpp +++ b/core/world/World.hpp @@ -36,7 +36,7 @@ namespace mad::core { virtual Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, - bool is_fixed, bool is_rotated) = 0; + bool is_fixed, bool is_rotated, uint16 categoryBits = 0x0002, uint16 maskBits = 0x0002) = 0; }; }// namespace mad::core diff --git a/core/world/entity/EntityStorage.cpp b/core/world/entity/EntityStorage.cpp index 2253dc2..dddecf3 100644 --- a/core/world/entity/EntityStorage.cpp +++ b/core/world/entity/EntityStorage.cpp @@ -36,11 +36,11 @@ namespace mad::core { } Entity::Id EntityStorage::create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, - b2World &physicalWorld, bool is_fixed, bool is_rotated) { + b2World &physicalWorld, bool is_fixed, bool is_rotated, uint16 categoryBits, uint16 maskBits) { auto new_entity_id = static_cast(m_map_entities.size()); m_list_ids.push_back(new_entity_id); m_map_entities[new_entity_id] = std::make_unique(new_entity_id, z_ind, initial_position, initial_rotation, - image_storage, physicalWorld, is_fixed, is_rotated); + image_storage, physicalWorld, is_fixed, is_rotated, categoryBits, maskBits); return new_entity_id; } diff --git a/core/world/entity/EntityStorage.hpp b/core/world/entity/EntityStorage.hpp index 476597d..e373e44 100644 --- a/core/world/entity/EntityStorage.hpp +++ b/core/world/entity/EntityStorage.hpp @@ -31,7 +31,7 @@ namespace mad::core { Entity::Id create_viewable_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage); Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, - b2World &physicalWorld, bool is_fixed, bool is_rotated); + b2World &physicalWorld, bool is_fixed, bool is_rotated, uint16 categoryBits, uint16 maskBits); private: std::unordered_map> m_map_entities; diff --git a/core/world/entity/PhysicalEntity.cpp b/core/world/entity/PhysicalEntity.cpp index d62eb10..a5f1c24 100644 --- a/core/world/entity/PhysicalEntity.cpp +++ b/core/world/entity/PhysicalEntity.cpp @@ -8,7 +8,7 @@ #include mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, - b2World &physicalWorld, bool is_fixed, bool is_rotated) + b2World &physicalWorld, bool is_fixed, bool is_rotated, uint16 categoryBits, uint16 maskBits) : ViewableEntity(id, z_ind, initial_position, initial_rotation, image_storage) { //rect.setOrigin(300, 50); @@ -16,10 +16,19 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init if(is_fixed) { b2BodyDef fixedBodyDef; + //fixtureDef.filter.categoryBits = categoryBits; + //fixtureDef.filter.maskBits = maskBits; fixedBodyDef.position.Set(initial_position.get_x(), initial_position.get_y()); body = physicalWorld.CreateBody(&fixedBodyDef); b2PolygonShape groundBox = (image_storage->get_action(ImageStorage::TypeAction::Idle))->as_fixture(); - body->CreateFixture(&groundBox, 0.0f); + + b2FixtureDef fixtureDef; + fixtureDef.filter.categoryBits = categoryBits; + fixtureDef.filter.maskBits = maskBits; + fixtureDef.shape = &groundBox; + fixtureDef.density = 0.0f; + + body->CreateFixture(&fixtureDef); body->SetTransform(body->GetPosition(), initial_rotation); } else @@ -35,6 +44,8 @@ mad::core::PhysicalEntity::PhysicalEntity(std::int32_t id, int z_ind, Vec2d init } b2FixtureDef fixtureDef; + fixtureDef.filter.categoryBits = categoryBits; + fixtureDef.filter.maskBits = maskBits; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; fixtureDef.friction = 0.0f; @@ -162,6 +173,8 @@ mad::core::Vec2d mad::core::PhysicalEntity::get_world_center() { } void mad::core::PhysicalEntity::add_sensor(b2Vec2 offset, float x_size, float y_size) { b2FixtureDef FixtureDef; + FixtureDef.filter.categoryBits = 0x0006; + FixtureDef.filter.maskBits = 0x0006; b2PolygonShape fixture; fixture.SetAsBox(x_size, y_size, offset, 0); FixtureDef.shape = &fixture; diff --git a/core/world/entity/PhysicalEntity.hpp b/core/world/entity/PhysicalEntity.hpp index 14fcaff..fa45145 100644 --- a/core/world/entity/PhysicalEntity.hpp +++ b/core/world/entity/PhysicalEntity.hpp @@ -33,7 +33,8 @@ namespace mad::core { public: explicit PhysicalEntity(Id id, int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, - b2World &physicalWorld, bool is_fixed, bool is_rotated); + b2World &physicalWorld, bool is_fixed, bool is_rotated, + uint16 categoryBits, uint16 maskBits); void accept(World &world, const Intent &intent, EventDispatcher &dispatcher) override; diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 27eb06e..6f47b97 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,7 +1,7 @@ -@......H..#..#...................... +@......HE.#..#...................... .................................... .................................... -...........E.....................F.. +.................................F.. .......&.....*...................... .....[__________].....+...[]........ .....############.........##........ diff --git a/game/resources/levels/level_with_finish/map b/game/resources/levels/level_with_finish/map index ca30743..613bf7f 100644 --- a/game/resources/levels/level_with_finish/map +++ b/game/resources/levels/level_with_finish/map @@ -1,5 +1,5 @@ #................# -#.H..E...........# +#.HE.............# #....#...........# #...##.#...#....F# ########..###..### \ No newline at end of file From 01058925a18c3118af280237da931cbeaf4dfc5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Thu, 2 Jun 2022 17:06:09 +0300 Subject: [PATCH 083/121] reverse sprites --- .../statemachine/EnemyStateMachine.cpp | 15 +++++++-------- core/loader/LevelLoaderFromFile.cpp | 4 ++-- core/runner/LevelRunner.cpp | 1 + .../enemy/enemy_attack_beg/slime-attack-0.png | Bin 356 -> 250 bytes .../enemy/enemy_attack_beg/slime-attack-1.png | Bin 354 -> 261 bytes .../enemy/enemy_attack_beg/slime-attack-2.png | Bin 477 -> 323 bytes .../enemy/enemy_attack_beg/slime-attack-3.png | Bin 442 -> 300 bytes .../enemy/enemy_attack_end/slime-attack-4.png | Bin 355 -> 252 bytes .../animated/enemy/enemy_idle/slime-idle-0.png | Bin 385 -> 280 bytes .../animated/enemy/enemy_idle/slime-idle-1.png | Bin 387 -> 285 bytes .../animated/enemy/enemy_idle/slime-idle-2.png | Bin 359 -> 270 bytes .../animated/enemy/enemy_idle/slime-idle-3.png | Bin 372 -> 270 bytes .../animated/enemy/enemy_run/slime-move-0.png | Bin 310 -> 242 bytes .../animated/enemy/enemy_run/slime-move-1.png | Bin 327 -> 244 bytes .../animated/enemy/enemy_run/slime-move-2.png | Bin 333 -> 255 bytes .../animated/enemy/enemy_run/slime-move-3.png | Bin 320 -> 239 bytes 16 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.cpp b/core/event/management/controller/statemachine/EnemyStateMachine.cpp index 6f5e6de..eb713da 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.cpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.cpp @@ -10,6 +10,7 @@ #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" +#include "event/management/controller/EnemyAttack.hpp" #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" #include "event/management/controller/GroundMovement.hpp" @@ -23,18 +24,16 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl StateMachine::StateId ground_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId ground_idle1 = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); int *attack_stage = new int(0); - StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); - - machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(ground_idle, ground_left, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(ground_right, ground_idle, std::make_shared(sf::Keyboard::Right)); - machine->add_transition(ground_left, ground_idle, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(ground_right, ground_left, std::make_shared(sf::Keyboard::Left)); - machine->add_transition(ground_left, ground_right, std::make_shared(sf::Keyboard::Right)); + StateMachine::StateId attack_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + machine->add_transition(ground_idle, ground_right, std::make_shared(1 + rand() % 2)); + machine->add_transition(ground_right, ground_idle1, std::make_shared(1 + rand() % 2)); + machine->add_transition(ground_idle1, ground_left, std::make_shared(1 + rand() % 2)); + machine->add_transition(ground_left, ground_idle, std::make_shared(1 + rand() % 2)); machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); machine->add_transition(ground_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 25c18b2..14277fe 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -444,7 +444,7 @@ namespace mad::core { delta_x, delta_y)}})); Entity::Id enemy_id = world->create_physical_entity( - 0, + 2, position, 0, image_storage, @@ -453,7 +453,7 @@ namespace mad::core { float m_impulse = 2000; - float horizontal_velocity = 20; + float horizontal_velocity = 5.5f; auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); controllers.push_back(machine); diff --git a/core/runner/LevelRunner.cpp b/core/runner/LevelRunner.cpp index ca01554..fb3e711 100644 --- a/core/runner/LevelRunner.cpp +++ b/core/runner/LevelRunner.cpp @@ -41,6 +41,7 @@ namespace mad::core { controller->control(); } m_camera->render(window); + //m_world->produce(*m_level_event_dispatcher); } window.display(); } diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png b/game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png index b0c4d39bf7389ccee65c2443bb4f627654712308..78b9be13b456933d682dad22d47ee536650317bf 100644 GIT binary patch delta 223 zcmV<503iS50{Q`vBYyx1a7bBm001r{001r{0eGc9b^rhXtVu*cR7gu>U>F6XU=)mk zQ7{UI0@!f+>wjV~A+v}E$c9FAJwRb!dhi{LL42#|DPS=err06a3{!R}#lRqOWJe%l zm|jA5VFkzzfEkF*0We3v97q*Mz=D{N#n>>q1ITg&%yL4OVOYa2+}!?ut*8Lw0dWA# z5vw)rQ9=Y{CLw#_02cRzEFuPzZ8@c(fbM(bY)Z5PV4*;cLy#>;_7FiwpgVxp7^g$% Z4FIh7DWVdBlGFeI002ovPDHLkV1h^rR}cUI delta 330 zcmV-Q0k!`60ptRZBYy!aNkl1t~!NECXD7D2u&`Fo#(A~i?tN%a{ zgJUO$ir_zR4Ne_`i$iw{f&Kxp#SS5(ba60FU%YF3$pyhK_bh?q?t9;RzwZJLhr{7; z?3hN~1LNr`x7~Ywd{9|`udZ-3$%?hbEGE3X;K*wNaQl=J41YXipK8`*#wvmFbd^Vw zjKwV0)lpxeX@3ClnI!b-S)cng8xx_YQEEWFeY%|UoV;?{-lzX%FJ48n)Iiv6 zsQtU~PyQsnZ9^8eCJ>C?b3p68-|E!r`#LfQQeR%fMgpq1IF_$kq^_{(B^1*r!vDqk c|6phQ0IjxpWv~qyj{pDw07*qoM6N<$f(5~(7XSbN diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-1.png b/game/resources/animated/enemy/enemy_attack_beg/slime-attack-1.png index bc0d17fade0ea9f678de5b414f94c628794cde1c..9998355051b426d2ea74a28c089c0174c5a6130d 100644 GIT binary patch delta 234 zcmVU>F6XU=)mk zQ7{SyGuUwY>wjV~A+v}E$c9=)Pl01)hf*-U^x!)f!{j5n9)K~$4uKg2GYr{MbPSS5 zb_5K=^b)cQD?oMty039L0^I>*I|8JESc}myx&z2^1k7?mmSbVVFWlVzf32th;{kC1 z%n_?K?NLGmWF{ed;Q$u*ge)QklWaK%ASXUT77(%=<^bd@O2~dNK+XlQ&>+V_$c{kv k7(vINJAl?0r$gus0A~UqPStfYIsgCw07*qoM6N<$f_*|(jsO4v delta 328 zcmV-O0k{5z0^$OYBYy!YNkl1vcB@<{;(Ll-mKvieR#OzYR9CGLx zl4Z@*GL7ON%vK_rnF;(zn(zmfm8_zvTrd;s)Rlvj<_ZazdtATt?s@ON??9u`Xf&D= zW9++dI$!0g|MuPHPS4rC;$W5muv~=rqahcq1^~Br&j6T~U4I&OJ4~$`n9f&uFw0mj z!lEYRpV=P|k1wU`Ov}a}4U5nKf!{R%8i&XQRdT_2@>*I~x`8Trn#3ww0PD7N9FM_u zi@w`5YR>?`d;1%JpD3b-qr7e%HYC6U6o*hgeVW9)MIT(X&*}ZD%XgtP1A*T)I*wO- zKbe;Y$>qH&Z$V%%{>p)k-kX+PtMA*$&l5_9P?pL`n5Px>FN%byDvS%pVRh}kx+u6ukJH6B*A5}C4T^?Vvq|^>6t|&0FQyC z1V5dhNLb;azU$icO*6DuK!c?u9{c0yL}*jv`jiUrX2Wv?@E+~(Z*CUIfzvy<0?zmN zH5m@K3IHBEW)m365s)IGy%=wl5_n1=#+zhS0vc>}0{8*q9(x+oM;`xN2@dC vz?_Bz%o6yQLLxPoR=K50NP(rBl=)}AA&!!3(&gyA00000NkvXXu0mjfXQqP` delta 452 zcmV;#0XzP~0^I|UBYy#;NklT zQ8qY;XSwb|C#~($wPe~VGbT|607#R7jZG(G-1NKLd=h0GY=0G)C4fOZ%Sn`Rri|#bWlkkB=jY7dCvdfr z5Y_+y-0!>s0N#c}9KZnpp|J?Wv}~kF00LJzzeaD0yPr-ZeS zt4j1Us3151(rF4SmO_}8jX3nRA*jkAmJ*P?5QjcH<8kO$0w|LZfbRIGDxL;e3PONQ z>em5OJwXaUI!%K{ws+WO(XDzUD+5p!&5MPot0J(d4n3s*0#f5|FZOpf*(2B2!0>z1tPZCszG^3=}1FQm&BYyx1a7bBm001r{001r{0eGc9b^rhX-bqA3R7gu>U>F6XU=)mk z;RrUI{`w!8MrYF;fGmsXdhj1aBeP+0g!B^yV1{GEAPcRcr=ZXJ2Qb&vIuQI=!N@8n{1vxo|QdSRT77zh9W Yg?Hkw%iYLV01E&B07*qoM6N<$f`{yB>i_@% delta 417 zcmV;S0bc&B0=ff`BYy#bNklZ0F3GUyg?(YX$S zm{B@M1P41i2{%>4j+%U#~P-1FS~-U~D| zG&KB2`rahX&c)a|X_X0^c97DyX$QX|4gee3z`^N5%G?A1V1M5~Le&j~z5@nhVHS?t zo61@Y06^$F0Kmm5X8W^s>+)RM&)h^Zw~85Vpzlri&9g>`I2z;bwu}9(S>;a7ZiLki zpOKlL7-=orP$WJ|rWx^>Su)JrB$t&kq!MIrEQ%AOWQwcn?t(q@@`)zOvcZE?0y6Qk z`wjs37!GmxsedoKNRI8DJw8`;1I*G24e%0(;&C*_;Q6hxIGsU+zEj%Dk}J~=($IIL zpX(rI0VvKyt_@Y)fLKQ{D|N)n$aMj;G)2`7ygpqhqHz1DBaKzWi%KD7fLWSi+CfUA zH|T*(#8GdlKoxQ?lN^S=^IeX)`#Okc0pM>T_XumLtQtUBTmCs;=4sNoK#wqp00000 LNkvXXu0mjf7^}qj diff --git a/game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png b/game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png index 025a6609a73c1f27a3c7b951b627a6108774a9ae..44887089275a05758e790f2c5d2f24355616a62d 100644 GIT binary patch delta 225 zcmV<703QG20{j7xBYyx1a7bBm001r{001r{0eGc9b^rhXu1Q2eR7gu>U>F6XU=)mk zQ7{UK1RG9&{ZB3?WHw#^GsG%-3LGmtl%ime{G|uq!8C{uQy09(XbE5r b7;pdp8@_^9t%D*H00000NkvXXu0mjfqSA*m diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-0.png b/game/resources/animated/enemy/enemy_idle/slime-idle-0.png index 237a1e016cec2b8c05d1af5396c4412f936d4c7e..52864bfe8ba611a3921bb077a2be3bd2b3b3f207 100644 GIT binary patch delta 253 zcmV|X>};7}nbxC2@q= zz&_C}5UypIwqPS4(@@P%uNwbr0aOizXj`vs!;AZOIY`vEFvPfMNwpno08PffEz@=+ zg!T%m=ITJvZCcGyzl(S^N1lLMc~!!-jJEhTYMP3Fq95v^l!%lxH@pA<002ovPDHLk FV1j=!qeuV% diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-1.png b/game/resources/animated/enemy/enemy_idle/slime-idle-1.png index 4b4ad8df3822c619e65bd538769b1349a8d866ac..80fc4a365c97362253f45dff18e45bb374243f87 100644 GIT binary patch delta 258 zcmV+d0sa1i1DyhpBYyx1a7bBm001r{001r{0eGc9b^rhX&q+iU>F6XU=)mk zQ9vY!=z8#f!|AUCF(GqE1|W+;*eZGoP7G6n>_|f95(L-`Rdy(aV-Ww+gYR&0Yz`r0 z2VQ_|7|f^04#4FIWK6ar2w9BH5imY_)R5%}nC18^#)eZZ)atN{_WXGU83|A!`^#YTL<6*PzsAU}XVP)0$N zsS`!w2ed9-L^KrXv1BP9KsdsMv$}^8ViXW3RXu-v`nAT91AycD0DfHH1Po2&>L~;{0Fqqf6nTd2W+kub zcK+VlJEQ}GToia2e*geJ(-c>`fYZGP$MxX_VXF%#HU)}2!*lwI>+$GdauY}a>gfUC z!MOx>-AIZ&gJMVMW_v(vJ{A`@cVvte-~}NZ*Oy)06U>F6XU=)mk zQ9uOPaQf?iVlW|d$O16Kt)i!(U}W)#t_NUDbw|JqhFPfWP>O;6>J#MLdZT0K#2oZYudv@ zgYFJM$1q0_vJV4L!vVKneiPItU1^^c-efowqJ1zhK002ovPDHLkV1mMrT}uD} delta 333 zcmV-T0kZy%0_OsdBYy!dNkl9hLXIHH0mwdHvHvy0ql;S@7#J8B zX0#?V+ro5G9U)rGtpB2UrU)oVfs519DX0 za}0V8L02oM??!`>8!#MzZZRzYvO{o20lMX|=)h+vx*B9YOdeegJOpsX5d#CH5Wy!; f4!~DD(-i;!>cW6De}_`&00000NkvXXu0mjfIundm diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-3.png b/game/resources/animated/enemy/enemy_idle/slime-idle-3.png index fb4ac77d0741a9eb36bd660b8971d62dbe984b06..505bb3be2aabef401f9d4ef82814da6fcbca555b 100644 GIT binary patch delta 243 zcmVU>F6XU=)mk zQ83uShSOjFW5bsoe8(yd!i3Bu3Pf~002>CQL0H+L6a~W^VHG_Ej6rIV)l=jcm|-9c zvjE)zFh_uBm>OgZa||K7FaR+YW5ZN)1k7?m7GlF+D=NTvz-$}gfMc>AY>m3pfn0#mXqy!Y^fhx3diS2WZx6*2wav>iivUvvLfU% t0GW+!7$FOBIf7^hP>KneiPItU1^|~8aZwC%FuVW&002ovPDHLkV1hR@R!IN= delta 346 zcmV-g0j2(q0`vlqBYy!qNklYU6vlrBH|NqpjM4`%Q+)`@pqr!4Iye<4 zac&WO1E)g93c1;i9Hgv=ea4&`2M<30J)fG+uM$+;)rch7fkprN6mq2Zs| zs5PCHg})I5zkMrmBh#Pq+?~;g!}EBgl$N*T}4A*O(CbbhOBUqh>y!s|czve&Z2cd0&v!%zAHvj+t07*qoM6N<$f*xC~O8@`> diff --git a/game/resources/animated/enemy/enemy_run/slime-move-0.png b/game/resources/animated/enemy/enemy_run/slime-move-0.png index f4d545180a14622a11e404af890ed3b53a5783d2..f3df2ff3aa791e34c722cc2677521f93577f0c04 100644 GIT binary patch delta 214 zcmV;{04e{r0`dWnB!3BTNLh0L04^f{04^f|c%?sf0001_Nkl=P;PXAZ!&q1&om`M|T8F4YFei z*?|`jvKSkNsYiDVA-k{wm;(q|N)tzrYdH*mt*97S2dvh#M^6b2ka>jcgab+~N5&*O z0Hzo{9Hq)$07*qoM6N<$f*iO{lK=n! delta 283 zcmV+$0p$Mj0k#5=B!B%$L_t(YiDO_G1*2dTjDk@x(g7nSnm3&O`X85EfGIaoX0woM zk&-AALtsK3oZs8sz`(%3z_4QfYq%a_9D!E>%;FXMUo$+qxP^g%fq|i{AQ8iI7!a41 zXJBApV35=Ifs3suQ^0EnR>=*gzy3$I6b4>CeTdI2tPUaM0DmTGTTZH43c6ypOC_PTvR4M=l!}7!c(H&OAye h^->B5l@D|S02C4)b|Zu&mTCY1002ovPDHLkV1m<&a&!Oy diff --git a/game/resources/animated/enemy/enemy_run/slime-move-1.png b/game/resources/animated/enemy/enemy_run/slime-move-1.png index 440c9f5d48f619d4ab74af12983873d7b75708ae..c932b386f8a67c5b97d0166936471d0342f152ef 100644 GIT binary patch delta 217 zcmV;~04D#(0`vipBYyx1a7bBm001r{001r{0eGc9b^rhXrb$FWR7gu>U>F6XU=)mk zQ7{UK02@w!{f`S1(n~Rj=z8!UgkcscJCwrlr3c?>>oAz*AZ!&q1&om$fb0mEJi3Dk z*?||}vl!hGAR49?8I$b@Vl79 z1B1AU>F6XU=)mk zQ7{UK02@w!{f`Y_dhi{qI0zFmlV}jp_254U!wgn-C`G|AM_5Hq0b_La6gdWF7zo2G zKz9Jl5g;0-1{uQ~L&z?yfRM%5Fx4CZvz(BH*znhi3NRip2VH>hYE65T5CNG-$W9ah z(m==(V)1}FfT9qfh9i)(CLudf0I6vJTk1zI8wlBn0$>h6&Wgx}5wZ}Q7$G~s0J-p? e1tw%a-2njn4J5Xq3;*f>0000C4s2t^rQ2f*TymH?*%kW(=wz|<=nuROs-h$|F`%?*z(Zo%sroDM+G zf^zykC}QXigDhEstOi{VHh_^eBDx-6Epn*^2$hU<2LNvAXk^#B{J;PJ002ovPDHLk FV1nUUg2ey; diff --git a/game/resources/animated/enemy/enemy_run/slime-move-3.png b/game/resources/animated/enemy/enemy_run/slime-move-3.png index ef83926146124e119908295a611c728d1e5f4184..f10ceddb99746159c781c817e868e5b62ce42c5b 100644 GIT binary patch delta 212 zcmV;_04x8%0`CEkBYyx1a7bBm001r{001r{0eGc9b^rhXp-DtRR7gu>U>F6XU=)mk zQ7{UI64-G1>wk27>A`mlF&HLf9#H_B!O9M$C>Z7ltLQ0U9MSavjH%)nm|-9cvjE)z zFh_uBm>OgZa||K7FaR+YW5ZN)1k7?m7GlF+D=NTvz#IU=t4%fSQ9=Y{9w9qX07wHN zONhk->Hv~M06pfR1EIwkhhMJ$zp+!h)5!2n^GNcp^AI@iVhr24pcXc)I$ztaD0e0s#9?dN%+7 From 6e90660b9f01424c7c8a1d068be9183c6aedd92b Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Thu, 2 Jun 2022 17:27:24 +0300 Subject: [PATCH 084/121] Level-table in database --- core/database/database/Database.cpp | 21 +++++++++++++++++++++ core/database/database/Database.hpp | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/core/database/database/Database.cpp b/core/database/database/Database.cpp index 98eb45c..403f25d 100644 --- a/core/database/database/Database.cpp +++ b/core/database/database/Database.cpp @@ -25,6 +25,11 @@ namespace mad::core { "levels_completed SMALLINT NOT NULL);"; w.exec(m_query); + m_query = "CREATE TABLE IF NOT EXISTS levels(" + "id SERIAL PRIMARY KEY," + "name TEXT NOT NULL UNIQUE);"; + w.exec(m_query); + w.commit(); SPDLOG_DEBUG("Tables created successfully"); @@ -56,6 +61,15 @@ namespace mad::core { W.commit(); } + void Database::append_level(const std::string &levelname) { + pqxx::work W(m_connector); + + m_query = "INSERT INTO levels(name) VALUES('" + levelname + "');"; + W.exec(m_query); + + W.commit(); + } + std::size_t Database::get_id(const std::string &username) { pqxx::work W(m_connector); m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; @@ -99,4 +113,11 @@ namespace mad::core { void Database::reset_progress(const std::string &username) { reset_progress(get_id(username)); } + + std::string Database::get_levelname(std::size_t id) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM levels WHERE id = " + std::to_string(id) + ";"; + auto found_row = W.exec1(m_query); + return found_row["name"].as(); + } } diff --git a/core/database/database/Database.hpp b/core/database/database/Database.hpp index 5db0168..dcc2833 100644 --- a/core/database/database/Database.hpp +++ b/core/database/database/Database.hpp @@ -15,11 +15,15 @@ namespace mad::core { void registry_user(const std::string &username); + void append_level(const std::string &levelname); + std::size_t get_id(const std::string &username); std::size_t get_progress(std::size_t id); std::size_t get_progress(const std::string &username); + std::string get_levelname(std::size_t id); + void increment_progress(std::size_t id); void increment_progress(const std::string &username); From 21f7631dcd4070a89364ebdd30d156587ecb76b6 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Thu, 2 Jun 2022 19:22:33 +0300 Subject: [PATCH 085/121] Fix Attack --- core/event/management/controller/Attack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/event/management/controller/Attack.cpp b/core/event/management/controller/Attack.cpp index f8d3a5b..d8dfbc7 100644 --- a/core/event/management/controller/Attack.cpp +++ b/core/event/management/controller/Attack.cpp @@ -4,7 +4,6 @@ mad::core::Attack::Attack(std::shared_ptr world, mad::cor Idle_animation = ImageStorage::TypeAction::Attack_1_beg; } void mad::core::Attack::control() { - Movement::control(); if((*attack_stage) % 6 == 0){ if(Move_animation != ImageStorage::TypeAction::Attack_1_beg){ SPDLOG_DEBUG("changed to Attack_1_beg"); @@ -47,4 +46,5 @@ void mad::core::Attack::control() { Move_animation = ImageStorage::TypeAction::Attack_3_end; Idle_animation = ImageStorage::TypeAction::Attack_3_end; } + Movement::control(); } From 6f710e2a1f0b835537c96ee620b4dbd625e4b36e Mon Sep 17 00:00:00 2001 From: denis Date: Fri, 3 Jun 2022 00:19:01 +0300 Subject: [PATCH 086/121] Load levels from server --- core/database/database/Database.cpp | 9 +++- core/database/database/Database.hpp | 3 ++ core/loader/LevelLoaderFromFile.cpp | 7 +-- network/client/simple-client.cpp | 26 +++++++--- network/server/simple-server.cpp | 45 +++++++++++++++++- .../background/background_01.png | Bin .../background/background_02.png | Bin .../background/background_03.png | Bin .../background/background_04.png | Bin .../background/background_05.png | Bin resources/levels/level_01/config.json | 2 +- .../levels/level_with_finish/config.json | 2 +- 12 files changed, 79 insertions(+), 15 deletions(-) rename {game/resources => resources}/background/background_01.png (100%) rename {game/resources => resources}/background/background_02.png (100%) rename {game/resources => resources}/background/background_03.png (100%) rename {game/resources => resources}/background/background_04.png (100%) rename {game/resources => resources}/background/background_05.png (100%) diff --git a/core/database/database/Database.cpp b/core/database/database/Database.cpp index 403f25d..5bac71f 100644 --- a/core/database/database/Database.cpp +++ b/core/database/database/Database.cpp @@ -48,7 +48,7 @@ namespace mad::core { void Database::registry_user(const std::string &username) { pqxx::work W(m_connector); - m_query = "SELECT id FROM users"; + m_query = "SELECT id FROM users;"; pqxx::result total_rows = W.exec(m_query); std::size_t id = total_rows.size(); @@ -120,4 +120,11 @@ namespace mad::core { auto found_row = W.exec1(m_query); return found_row["name"].as(); } + + std::size_t Database::get_levels_total() { + pqxx::work W(m_connector); + m_query = "SELECT id FROM levels;"; + auto total_rows = W.exec(m_query); + return total_rows.size(); + } } diff --git a/core/database/database/Database.hpp b/core/database/database/Database.hpp index dcc2833..b41c16d 100644 --- a/core/database/database/Database.hpp +++ b/core/database/database/Database.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace mad::core { @@ -24,6 +25,8 @@ namespace mad::core { std::string get_levelname(std::size_t id); + std::size_t get_levels_total(); + void increment_progress(std::size_t id); void increment_progress(const std::string &username); diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 45bfe37..460f637 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -1,10 +1,7 @@ #include "LevelLoaderFromFile.hpp" #include -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" +#include +#include #include diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp index d35f011..a7977b3 100644 --- a/network/client/simple-client.cpp +++ b/network/client/simple-client.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -60,6 +60,23 @@ namespace mad::core { SPDLOG_DEBUG("Update request result:\n\tStatus: " + std::to_string(res->status) + "\n\tMessage: " + res->body); } + std::vector> get_levels() { + auto res = m_client.Get("/level/total"); + std::size_t level_count = std::stoi(res->body); + std::vector> loaders; + for (std::size_t i = 1; i <= level_count; ++i) { + auto res1 = m_client.Post("/level/load", httplib::Params{ + {"number", std::to_string(i)} + }); + json config; + std::stringstream ss; + ss << res1->body; + ss >> config; + loaders.push_back(std::make_shared(config["map"], config)); + } + return loaders; + } + private: mutable std::string m_username; mutable httplib::Client m_client; @@ -84,13 +101,10 @@ int main() { auto system_listener = std::make_shared(window); - std::vector> level_loaders{ - std::make_shared("../../resources/levels/level_with_finish"), - std::make_shared("../../resources/levels/level_01") - }; - auto network_storage_driver = std::make_shared(); + std::vector> level_loaders = network_storage_driver->get_levels(); + auto game_runner = std::make_unique( level_loaders, global_dispatcher, diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 1fef0fe..d8ff77c 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include @@ -12,10 +14,15 @@ #include #include +#include + +using json = nlohmann::json; + int main() { httplib::Server svr; mad::core::Database db; + std::filesystem::path levels_directory = "../../resources/levels"; std::mutex locker; std::vector logs; @@ -24,7 +31,43 @@ int main() { std::unique_lock lock(locker); res.status = 200; res.body = "Connection successful"; - logs.push_back("Connected user port -- " + std::to_string(req.remote_port)); + logs.push_back("Connected user port " + std::to_string(req.remote_port)); + }); + + svr.Get("/level/total", [&logs, &locker, &db](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); + res.status = 200; + res.body = std::to_string(db.get_levels_total()); + logs.push_back("Send total level counter to port " + std::to_string(req.remote_port)); + }); + + svr.Post("/level/load", [&logs, &locker, &db, &levels_directory](const httplib::Request &req, httplib::Response &res) { + std::unique_lock lock(locker); + if (req.has_param("number")) { + auto number = std::stoi(req.get_param_value("number")); + if (number <= db.get_levels_total()) { + auto levelname = db.get_levelname(number); + auto cur_level_directory = levels_directory / levelname; + std::ifstream input_config(cur_level_directory / "config.json"); + std::ifstream input_map(cur_level_directory / "map"); + json config; + std::string map, map_line; + input_config >> config; + while (input_map >> map_line) { + map += map_line; + } + config["map"] = map; + res.status = 200; + res.body = to_string(config); + logs.push_back("Send level " + levelname + " to port " + std::to_string(req.remote_port)); + } else { + res.status = 404; + res.body = "Invalid number of level"; + } + } else { + res.status = 404; + res.body = "Invalid params of request"; + } }); svr.Post("/user/login", [&db, &logs, &locker](const httplib::Request &req, httplib::Response &res) { diff --git a/game/resources/background/background_01.png b/resources/background/background_01.png similarity index 100% rename from game/resources/background/background_01.png rename to resources/background/background_01.png diff --git a/game/resources/background/background_02.png b/resources/background/background_02.png similarity index 100% rename from game/resources/background/background_02.png rename to resources/background/background_02.png diff --git a/game/resources/background/background_03.png b/resources/background/background_03.png similarity index 100% rename from game/resources/background/background_03.png rename to resources/background/background_03.png diff --git a/game/resources/background/background_04.png b/resources/background/background_04.png similarity index 100% rename from game/resources/background/background_04.png rename to resources/background/background_04.png diff --git a/game/resources/background/background_05.png b/resources/background/background_05.png similarity index 100% rename from game/resources/background/background_05.png rename to resources/background/background_05.png diff --git a/resources/levels/level_01/config.json b/resources/levels/level_01/config.json index d3d1309..d6ff91f 100644 --- a/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -13,7 +13,7 @@ "zoom": 10.5 }, "background" : { - "source" : "../../game/resources/background", + "source" : "../../resources/background", "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75], "scale" : 2.8 }, diff --git a/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json index de9320e..c0f4a17 100644 --- a/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -13,7 +13,7 @@ "zoom": 10.5 }, "background" : { - "source" : "../../game/resources/background", + "source" : "../../resources/background", "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75], "scale" : 2.8 }, From 7cef2f07a4f4c3d882e959f6333cf12067d11199 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Fri, 3 Jun 2022 18:42:47 +0300 Subject: [PATCH 087/121] something --- core/loader/LevelLoaderFromServer.cpp | 7 ++--- network/server/simple-server.cpp | 37 +++++++++++++++------------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/loader/LevelLoaderFromServer.cpp b/core/loader/LevelLoaderFromServer.cpp index 0cfd1ee..7b143c1 100644 --- a/core/loader/LevelLoaderFromServer.cpp +++ b/core/loader/LevelLoaderFromServer.cpp @@ -1,11 +1,8 @@ #include "LevelLoaderFromServer.hpp" #include -#include "event/management/condition/KeyDownCondition.hpp" -#include "event/management/condition/KeyPressedCondition.hpp" -#include "event/management/condition/TimerCondition.hpp" -#include "event/management/condition/TrueCondition.hpp" -#include "event/management/controller/statemachine/StateMachine.hpp" +#include +#include #include diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index d8ff77c..54e80f3 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -167,28 +167,31 @@ int main() { ImGui::SetNextWindowPos({0, 0}); ImGui::Begin("Server util", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); - - if (ImGui::Button("Start server")) { - if (!svr.is_running()) { - std::thread([&svr]() mutable { - svr.listen("localhost", 8080); - }).detach(); - logs.emplace_back("Server has started"); + { + ImGui::BeginChild("Tool buttons", ImVec2(ImGui::GetContentRegionAvail().x * 0.3f, 80), true); + if (ImGui::Button("Start server")) { + if (!svr.is_running()) { + std::thread([&svr]() mutable { + svr.listen("localhost", 8080); + }).detach(); + logs.emplace_back("Server has started"); + } } - } - if (ImGui::Button("Stop server")) { - if (svr.is_running()) { - svr.stop(); - logs.emplace_back("Server has stopped"); + if (ImGui::Button("Stop server")) { + if (svr.is_running()) { + svr.stop(); + logs.emplace_back("Server has stopped"); + } } - } - if (ImGui::Button("Quit")) { - window.close(); - if (svr.is_running()) { - svr.stop(); + if (ImGui::Button("Quit")) { + window.close(); + if (svr.is_running()) { + svr.stop(); + } } + ImGui::EndChild(); } { From 7d466e6913cffcbb58c2ce2ae7eb6ded465e9138 Mon Sep 17 00:00:00 2001 From: denis Date: Fri, 3 Jun 2022 19:50:49 +0300 Subject: [PATCH 088/121] Input levelname --- core/database/database/Database.cpp | 7 +++++++ core/database/database/Database.hpp | 8 +++++--- network/server/simple-server.cpp | 22 ++++++++++++++++++++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/core/database/database/Database.cpp b/core/database/database/Database.cpp index 5bac71f..8009717 100644 --- a/core/database/database/Database.cpp +++ b/core/database/database/Database.cpp @@ -45,6 +45,13 @@ namespace mad::core { return !rows_found.empty(); } + bool Database::is_level_exists(const std::string &levelname) { + pqxx::work W(m_connector); + m_query = "SELECT * FROM levels WHERE name = '" + W.esc(levelname) + "';"; + pqxx::result rows_found = W.exec(m_query); + return !rows_found.empty(); + } + void Database::registry_user(const std::string &username) { pqxx::work W(m_connector); diff --git a/core/database/database/Database.hpp b/core/database/database/Database.hpp index b41c16d..d1fb612 100644 --- a/core/database/database/Database.hpp +++ b/core/database/database/Database.hpp @@ -14,9 +14,7 @@ namespace mad::core { bool is_user_exists(const std::string &username); - void registry_user(const std::string &username); - - void append_level(const std::string &levelname); + bool is_level_exists(const std::string &levelname); std::size_t get_id(const std::string &username); @@ -27,6 +25,10 @@ namespace mad::core { std::size_t get_levels_total(); + void registry_user(const std::string &username); + + void append_level(const std::string &levelname); + void increment_progress(std::size_t id); void increment_progress(const std::string &username); diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 54e80f3..060d06b 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -147,6 +147,7 @@ int main() { sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); ImGui::SFML::Init(window); window.setFramerateLimit(120); + char input_levelname[255] = ""; sf::Clock clock; while (window.isOpen()) { sf::Event event; @@ -168,7 +169,9 @@ int main() { ImGui::Begin("Server util", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); { - ImGui::BeginChild("Tool buttons", ImVec2(ImGui::GetContentRegionAvail().x * 0.3f, 80), true); + std::unique_lock lock(locker); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + ImGui::BeginChild("Tool buttons", ImVec2(ImGui::GetContentRegionAvail().x * 0.3f, 82), true, window_flags); if (ImGui::Button("Start server")) { if (!svr.is_running()) { std::thread([&svr]() mutable { @@ -194,10 +197,25 @@ int main() { ImGui::EndChild(); } + ImGui::SameLine(); + { + std::unique_lock lock(locker); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + ImGui::BeginChild("Input levelname", ImVec2(ImGui::GetContentRegionAvail().x, 82), true, window_flags); + ImGui::InputText("##", input_levelname, 255); + ImGui::Text("new level name"); + if (ImGui::Button("Enter")) { + if (!std::string(input_levelname).empty()) { + + } + } + ImGui::EndChild(); + } + { std::unique_lock lock(locker); ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; - ImGui::BeginChild("Child", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); + ImGui::BeginChild("Logs", ImVec2(ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y), true, window_flags); for (int i = 0; i < logs.size(); ++i) { ImGui::Text(logs[i].c_str(), i); } From 39d234d750d86c6998426906a3524756cbfc1123 Mon Sep 17 00:00:00 2001 From: MhlvDenis Date: Sat, 4 Jun 2022 12:49:15 +0300 Subject: [PATCH 089/121] Input levelname frontend --- network/server/simple-server.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 060d06b..13210a0 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -147,7 +147,8 @@ int main() { sf::RenderWindow window(sf::VideoMode(640, 480), "MAD Server"); ImGui::SFML::Init(window); window.setFramerateLimit(120); - char input_levelname[255] = ""; + char input_levelname[255] = "\0"; + std::string text_hint = "new level name"; sf::Clock clock; while (window.isOpen()) { sf::Event event; @@ -203,10 +204,15 @@ int main() { ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; ImGui::BeginChild("Input levelname", ImVec2(ImGui::GetContentRegionAvail().x, 82), true, window_flags); ImGui::InputText("##", input_levelname, 255); - ImGui::Text("new level name"); + ImGui::Text(text_hint.c_str()); if (ImGui::Button("Enter")) { if (!std::string(input_levelname).empty()) { - + if (!db.is_level_exists(input_levelname)) { + db.append_level(input_levelname); + text_hint = "new level name"; + } else { + text_hint = "level name is already used"; + } } } ImGui::EndChild(); From bd08179dc4f87bc52acf8c85ad271af58414c182 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sat, 4 Jun 2022 13:09:14 +0300 Subject: [PATCH 090/121] Fix window size --- core/loader/LevelLoaderFromFile.cpp | 5 ++--- core/visual/Camera.cpp | 10 +++++++--- core/visual/Camera.hpp | 2 ++ .../image/background/BackgroundImage.cpp | 9 ++------- .../image/background/BackgroundImage.hpp | 6 +----- .../image/background/RenderableBackground.cpp | 8 +++++--- .../image/background/RenderableBackground.hpp | 6 +++--- game/game_database_example.cpp | 2 +- game/resources/animated/helicopter.png | Bin 66431 -> 0 bytes game/resources/animated/runner_new.png | Bin 180558 -> 0 bytes game/resources/levels/level_01/config.json | 5 ++--- game/resources/levels/level_02/config.json | 3 +-- game/resources/levels/level_03/config.json | 3 +-- .../levels/level_with_finish/config.json | 3 +-- 14 files changed, 28 insertions(+), 34 deletions(-) delete mode 100644 game/resources/animated/helicopter.png delete mode 100644 game/resources/animated/runner_new.png diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 14277fe..675a405 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -488,9 +488,8 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared( source, - parallax_ratios, - static_cast(m_config_json["background"]["scale"]) * - static_cast(m_config_json["camera"]["zoom"]))}})); + parallax_ratios) + }})); world->create_viewable_entity( -1, {0, 0}, diff --git a/core/visual/Camera.cpp b/core/visual/Camera.cpp index 0289054..f73bb7e 100644 --- a/core/visual/Camera.cpp +++ b/core/visual/Camera.cpp @@ -22,7 +22,9 @@ namespace mad::core { bool Camera::render(sf::RenderWindow &window) { if (m_distance_over_hero == 0) { - m_distance_over_hero = -static_cast(window.getSize().y * m_part_of_window); + m_view.setSize(static_cast(window.getSize().x) * *m_zoom, static_cast(window.getSize().y) * *m_zoom); + std::cout << window.getView().getViewport().height << '\n'; + m_distance_over_hero = -static_cast(window.getView().getSize().y) * m_part_of_window * *m_zoom; *m_position += Vec2d{0, m_distance_over_hero}; m_view.setCenter(*m_position); } @@ -108,7 +110,8 @@ namespace mad::core { pointer_cast_to(image); RenderableBackground renderable_background(background_image, m_position, - positional_appearance.get_rotation()); + positional_appearance.get_rotation(), + m_zoom); insert_renderable_to_scene({positional_appearance.get_z_index(), RenderableWithId(std::make_shared(renderable_background), @@ -139,7 +142,7 @@ namespace mad::core { Camera::Camera(Vec2d initial_position, std::shared_ptr world, bool is_debug_mode) : m_position(std::make_shared(initial_position)), m_world(std::move(world)), - m_view(initial_position, {640, 480}), + m_view(initial_position, {0, 0}), m_is_debug_mode(is_debug_mode) { } @@ -210,6 +213,7 @@ namespace mad::core { } void Camera::set_zoom(float zoom) { + *m_zoom = zoom; m_view.zoom(zoom); } diff --git a/core/visual/Camera.hpp b/core/visual/Camera.hpp index 6dba8de..7aed993 100644 --- a/core/visual/Camera.hpp +++ b/core/visual/Camera.hpp @@ -91,6 +91,8 @@ namespace mad::core { float m_smoothness; + std::shared_ptr m_zoom = std::make_shared(1.0); + FollowType m_type; float m_minimal_distant; diff --git a/core/visual/image/background/BackgroundImage.cpp b/core/visual/image/background/BackgroundImage.cpp index 13e5786..1b3e388 100644 --- a/core/visual/image/background/BackgroundImage.cpp +++ b/core/visual/image/background/BackgroundImage.cpp @@ -5,9 +5,9 @@ namespace mad::core { - BackgroundImage::BackgroundImage(std::filesystem::path path, std::vector parallax_ratios, float scale) + BackgroundImage::BackgroundImage(std::filesystem::path path, std::vector parallax_ratios) : Image(Image::Type::Background), m_path(std::move(path)), - m_parallax_ratios(std::move(parallax_ratios)), m_scale(scale) { + m_parallax_ratios(std::move(parallax_ratios)) { } std::filesystem::path BackgroundImage::get_path() const noexcept { @@ -22,10 +22,5 @@ namespace mad::core { return {}; } - float BackgroundImage::get_scale() const noexcept { - return m_scale; - } - - } diff --git a/core/visual/image/background/BackgroundImage.hpp b/core/visual/image/background/BackgroundImage.hpp index 88b5bbb..ceb78c0 100644 --- a/core/visual/image/background/BackgroundImage.hpp +++ b/core/visual/image/background/BackgroundImage.hpp @@ -10,21 +10,17 @@ namespace mad::core { class BackgroundImage : public Image { public: - BackgroundImage(std::filesystem::path path, std::vector parallax_ratios, float scale); + BackgroundImage(std::filesystem::path path, std::vector parallax_ratios); [[nodiscard]] std::filesystem::path get_path() const noexcept; [[nodiscard]] std::vector get_parallax_ratios() const noexcept; - [[nodiscard]] float get_scale() const noexcept; - b2PolygonShape as_fixture() override; private: std::filesystem::path m_path; std::vector m_parallax_ratios; - - float m_scale; }; } diff --git a/core/visual/image/background/RenderableBackground.cpp b/core/visual/image/background/RenderableBackground.cpp index 65c91e5..9599acd 100644 --- a/core/visual/image/background/RenderableBackground.cpp +++ b/core/visual/image/background/RenderableBackground.cpp @@ -7,11 +7,11 @@ namespace mad::core { RenderableBackground::RenderableBackground(const std::shared_ptr &background, std::shared_ptr position, - std::shared_ptr rotation) : + std::shared_ptr rotation, std::shared_ptr zoom) : m_camera_position(std::move(position)), m_rotation(std::move(rotation)), m_parallax_ratios(background->get_parallax_ratios()), m_last_camera_position(*m_camera_position), - m_scale({background->get_scale(), background->get_scale()}) { + m_zoom(std::move(zoom)) { is_active = background->is_active; std::set sorted_files; @@ -34,7 +34,8 @@ namespace mad::core { sf::Sprite background; background.setTexture(m_layers[i]); float ratio = m_parallax_ratios[i]; - background.setScale(m_scale); + float scale = static_cast(window.getSize().y) / background.getLocalBounds().height * *m_zoom; + background.setScale({scale, scale}); if (m_layers_positions.size() == i) { m_layers_positions.push_back(*m_camera_position); background.setPosition(m_layers_positions[i]); @@ -44,6 +45,7 @@ namespace mad::core { m_layers_positions[i] += {(*m_camera_position - m_last_camera_position).get_x() * ratio, (*m_camera_position - m_layers_positions[i]).get_y()}; background.setTextureRect({0, 0, static_cast(background.getLocalBounds().width) * 100, static_cast(background.getLocalBounds().height)}); background.setOrigin(background.getLocalBounds().width / 2, background.getLocalBounds().height / 2); //static_cast(window.getSize().y) / 2); + window.draw(background); } m_last_camera_position = *m_camera_position; diff --git a/core/visual/image/background/RenderableBackground.hpp b/core/visual/image/background/RenderableBackground.hpp index df95e9c..2e6f38b 100644 --- a/core/visual/image/background/RenderableBackground.hpp +++ b/core/visual/image/background/RenderableBackground.hpp @@ -13,8 +13,8 @@ namespace mad::core { class RenderableBackground : public Renderable { public: - RenderableBackground(const std::shared_ptr &background, - std::shared_ptr position, std::shared_ptr rotation); + RenderableBackground(const std::shared_ptr &background, std::shared_ptr position, + std::shared_ptr rotation, std::shared_ptr zoom); bool render(sf::RenderWindow &window) override; @@ -31,7 +31,7 @@ namespace mad::core { std::shared_ptr m_rotation; - Vec2d m_scale = {1, 1}; + std::shared_ptr m_zoom; std::vector m_parallax_ratios; }; diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index 54699f6..d9e42da 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -33,7 +33,7 @@ int main() { #endif spdlog::set_level(log_level); - auto window = std::make_shared(sf::VideoMode(640, 480), "MAD"); + auto window = std::make_shared(sf::VideoMode(), "MAD", sf::Style::Fullscreen); ImGui::SFML::Init(*window); window->setFramerateLimit(120); diff --git a/game/resources/animated/helicopter.png b/game/resources/animated/helicopter.png deleted file mode 100644 index 4d43f8c06854261f85201678da1342b232578c96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66431 zcmbTe1yfv27cD%v1b252?k>UINpRQT9^BoX;10pvEie!qg1ZHGcev+yzq&u*yHrtA z90pGJ>F&MPUTf`%R8f*fMkGK4fk4QzG7@Sa5JVXW1o;gf7PvArKtBS!K)ZaA)qn@S zeBjL@fS(P$G`_j28GDd9Iy+cc+nSTP{%|xW6H`%P1A*W(cjc5PQZ3pP=AbIayh`p_8OUTlh5SWT^F_CDFg>h-L%~B5+85a`Uu4LL zA?Z_C5XjLWp_9-cOEXYVjQX%`_4e$wllCYoThH9~Ure>WYa68MSC5W9_~!m-65#OI zpS1DtbD0!+AVPzOh71%X`~UxP>!9Jg4iQME$Od6ayHrZFl>J=uzyFobij#n;XK_hKK?)O0sNQLJ+GOs+TiN+Gua#fXH z-6Y-2Yy%QSGe(?L&s(S#>K4E4Vql>N6un_Bd|dgNV7r+MxEWG^j>kxl){t`y;5}HZ zqI>0_G&J zB~dIvD%Ux*i@KI~`LS?tLpc(8-XICTv$JX6bBE~BUv^e>fg29+-8HwKq7k@G$;};Jo`{T1k$wcXhB0Ck6 zsC{}&pX=csL6YTKGcc8Pl^z$ybcwQ-P|*QZX~`KM|TU|8FOu8BAdqWk1 zCG-0pCXod4G3V%ds5%s0Y;z)3sjnoR?vR+e8{ft) zoEtHTqjBJ$ae76jS4tMo`gO3rwkTF>xoqHOVipZTNina|-C^BdvIM z{xFDuB{t_fU8)`##6^Ji4IewR#t*h5hyDj8U40tGs|cA3qokyL0Ugv+K=O!wsfHNG zg+n(vHMUnF^4c*#tSfoa4Zrp?$Yl!7Knj`^;cuQ0UGGTziv3}ft^=(jqTJ&#JO(NY zFe)gL{FFg)uNTVifli|23G2hY=-W2^k^JCFT#`$yLh%t6isk3$D~vkozjRiV)9JBY{Uq$T8_6CN50f?Np_ zBEh_sO;Cx~({gT}i)@VDrWvtv?~qXeU&=hlwq<=XBXIyzxMelR%AGjSXp3x6mJB2( zf3Mb1M7Qk@heCYLS=8Ut&`=z=K0U`+MbqyT9npme1Szpz@rdOAg5ERn?`m2!Q0#<~ z!H<)-kX5j(;}0bJc%BN=a14bO1~eq95MBgmQT0ZS3aVd$%w{e2?(OBjD&!xRX4+LD z`<)`uXahk@&8qnqf=~i7k)ES6pWlSLuHX(aR!XsD zUCE*}@j958*0D~PX^GLohLGUu`ISE|f~b$MPjkdgpA4_fl}ahIZ}jukpjTXuw?@4t3|R%M^5qTrIXHm+h+l_++r6GO+d|8|p_e@Bv{ETUC{ zBEvu^QXhMLPNW6ZNJS*)=k1_EmsdNSy4O#LvdSpt;7MV?^A|RsclY&maL_ne1_CfIbaBRtq`(VlSQINfNbmyS2n z%43kUVn)xSh-xV@HDvU#B2$?6UHs*fQ3I+7LzuSrx>l8 z`wgS`PeaV&?oRHDAM>CrYyQz_t-4gEnEzsjqU1V8*^mY8*kV;tn=9!AGf!ef2pc73 zi_q3Xky=H9`IA{bJeb8W9;5q#p^oh+`4fiNr?qI4ej0nFTV+ID15U2FnK_kktupbV zd9Z|B(F{#`LOEO_1x5oSxhzJaV}uG_2%~IBP!4T2HvHer8e#q(Nsa89?%UtRO1C4| z^RFk(t?;m&ddn_4m5T?3Ym6T-Yk?FxLAkpEeU!jc&!r(kL`Mnz`!?pvGU{NCU6(z1 zbBh3NE%r4JvssiY;VymiJ&8ORj@mT|+t6>q(C`rzCpwg{w)(*4o}Ar=nz{&qtPm_j5OMT%0D2Ix1z3 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�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 bEjo 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 Gi2Pu>0K4FK_-c_Y*KvsjQv2Y@3oAxf zRL=5IX=mpqCdIijb8xLL_gwY5Un4WHtk|X74%98Vc@_WbRRMw;L;4B$X%v@9*N+q} zlg4T8%_LOTyj&(qix)hb$d`E~)*GWR^V{;2ARQS*c$`^=Imp>C_k7XU*Z;&K!$BXj zT!z3cz3dE-)r-s^l+K;*xS1jx4!aJTj~704=epl2f(#cK&!>!}q@V{cl-)9d52@VR zQ?ZnVnZnN=*p;ZFO<=sAGvJTTzj+bJFp!6v?2r6{+6>;Xf%pk3-Us;J+PFV{=7^NS zu6mBks-UC#t+5!`m~10J5dJ(pU-?>>PM)ZBytw2l(wI<^s6>Zr;{P92Fkn5s1usR_ zrGAge6YXYYC#jR3C9Y=eUZJ^X9R|%HWu!3F4~0#xg=)EXAnDd{ztY*&CDQ0_54-`@ zFL$}GyMpUiQYD`#Puawrvt{)$b}^FP<pIo8Gq4ISa|RYH%mBW{l3j(B7jrd

) zN5@mrmCxuf?TP7sr${o;(CF$lLkjre3sgZk<4Pd1PZqq--%8+gy!3?r1FJ=nO7 zk@N!#l~t&E-paInCci@IBL>AGWN2&~DqeRgaz|@RR!%rUxnPAI=$CeEXYOUwAZ}uv zt!|SRa|@_Rd0!tL{G#e~wBBiDJZhpvFy~)6UuEw3VasT;Wlq^G} zr)qoe=rdF?L|IMQu^}7G!}aJGn!$VkP)j{PWf7{8V4ik>Kz2jC0klj^AZ$i$tVE#q z-e>~E0e^eCy1QDYeJB>QGBN5`y3~pm?;Co;Dj7}S_h#^b`E7RF^HFM4dtu*1yFy=w zh;%C<5`=-vJHxFxhh^(ooGd66DO5Z(H#3vZiJE4%t7^pbLJ@%8 zG>k8}Ae+PG^4^?H_Ii>lCB@jU)&vcagUnY&m+f@V+0-B*14V<))-1nUn?o$=%zt4q zBJva7;KyxmKPv+17EFj(i@fn3&3BI?Sj|go-10oQ2Bp&Kb0-IDVggyltJu%yy$v?v zMBP?dk}=dZ+vF*r;p#i$^LW~8>RDApNve2@*z~!?Q)+Psu0?1qC87YmK{0#z-&)E{ z;kCY$Vx)*Yh15plPX=(S@?+D9-{Hf-miR!|fo{}A@zkAHCxGWvG`Qy(ZD`6RC7m?2 z?n*hAXpURFB_N@NB%)W9ffApJa*b5Wt)gBrY31f!O_IuXV^$WC#&38e(?U55mH$Xmk1uLn|$Lln4#ICSvV?e)RXe-hcOsjp8Er?JI!~BBU9+ z($ywiE4>xJ7zM=)Vy%AuA26&%{Sdu9g;TWgT50t|KIMis?jZD6G(25Y5UQzhE zT=7*;i382`B5OYxJ$NmbN3b%4vx8C*IR>%r70~J)eOJ#`%xo~?=r>}oZ$L*-_rQ_I zD2Oo9&J6{Oka=B>noIo!ncJh3+pmU-C;>oPr6pJRB8pHV8TwNa4_F927rtit)kIai z&hY3@16oJ}`LvI<&upt*)P{Z+blTx2x5zMjib~OF%KpL_R`Ogt@x0KezMl@Er&6~y9I{QfDL2!I3fPHR$<%QSf zH;{hJ0gd-uP&C;6;rdX-QRKpO<;51Bbl;8wTW)O8$tj3!|JS+6!OtA8xiAU`O~ej} zEaPjGjoSfwJM|97GWW&oc|W1Ch-VS0Ih{rfovPxyW~5XD#kdn3=U&K!RiAtgH@jr9 zUH65!hM|?Mty}~WEv$dB&31-)?yTodBz5yt7AK-9G9n;+5h>HPslBw5jHXMTLtULU zQH-IGv_IZgBvI$91+qqYOq8z2a3xZ$JXJJ*v|!4IWr1GE>0y!m20&ntUYi$6qak{d zxGW~8;o+&>e5<`)_32WlYL|~$9f#?U^v~+dIVG=IQoH3_vL{tw#svXA>~H+H6+<*h zy$TTT7-6uxw{DAHBkvfl$L|u;ei6DWG1SoF$@(>sDD2s&$nkFU(|ALg>F}}fB-nIi zG!dMrh2h?&CY3YHF3WkU$KKbjomXWa^qAP>iadJ0lW`*p9+8j984#z0m`|hoFNaYZ z;OAp~ml4aHD0NxIi*fC6xfDX-5v!oVAd|lx$l=Mskxkz-(2*;eh7ZD?VwGJ@Hm~m` z*b#`XHJfxP`6Eh9gM9OgzoaWELNYBp^YuNs|PU993kvR5d=1H+Pw`m z`?RvU3cD!*a2~+xP}n@3fB6f!Z5q5uKliey6S^WJ@u7u?{xUdPmy6~8cTt=$D7{&d z%k#2WFUHodr`aK%4?of|0dp5(S&jb(YIp%W?${R*Z<>;OWymio-~FJBQjt&I3*iAN zhlG9-ImH~Gm=KZAMiuY@4saO1+J)QS|U{)g4CoetEH{Ac= z;{$f34+_)Q`qPj0sRY8Rp}&*jsGSen=AoOHmtDgo_BPC&L43DxG{FDEWDDVLQe@$czByjttWty)Ql zBWW4%ek7stR*#r~Dxr$lr{P!ccp@PFb$oKX%esy~luiiYDl*<}i^Ns@^&Rh%J$!iDdU zK1NV^VHV!$$$d)S$T|dS1k-Zh63j=VpmK0Hj>O<1hA$yS5>ZpQWq$?7Vs8HJ^>HLV z;0E8_-TmFTI(463Hosjq&jX|+G#_|^g1_L47iBnuw2pPpy!4%(W6^dp!6h;{ANoGr zRuj2hLV^}wpKS*px7~U?skrY?tk&2{-E@iNrtSpGkj}_l^B|l6D=HsK*LshyPM608 z*{Lg&ZfEiHF3Bs40~U*yXHqNrciaQ%=y_u8$I7PCK+^M_-Jj=y>yEh+U-!OEr2r6R4A z6Gy7D4cp_{<^-01LMgU=#JLIjANA84F zvDm=lX(D9YHPeg7yzEjW`ZSBrjgP2yS@by;B3BE?7nSdmmk>Sr0WokiLA-EK2wNyF z{XmO*qu)Uzpgm%pGI^p-(f~4&`;zYNHIBBW8ca{_@Je*gVD1a;oD+|tzXid~i&d76 z#_ryyE#Pu0M*Wl1Uy}z5Zh}LbsEYSwF1NJ|nTh=)PGt9kxE5bEOjac=_p*arf^&NI zF>)3kMRBiia*z1|P`T9Yi$(G~L`R|Rayyn7{@Z5~G4R82x_pau;-#vI?+uWD%0Q7I zpHI@C*0!wIPw)i0ukdafL_!g72(6g9L=YnPeNd!Lge9$aiYl81`-6=-?y;dqvY5Y( z9W3};?<41VqdRT^NQZewh?oBzXTL%stOm=!35&wVnz!Eh}pfC zB}{$(h6ki8(n!$}uH(#x(klxfq%2-Ghz>Jk_<0cWu~zG1Z$&SS7stwEVd}(BDHl4> zPXx4@&Fh(Xq_lgCLcsBNOxN>5Ioo7)(&RJ_XP$BEPn!Ula{3Sw0@t7YsjOkoX2)G| z*so#c7{}f$qW!1Gb-f^IY3aSh{O`Ebl*6nnY3RFHeN`Cw<^f=)?^3&iu#66#A=vgr z1mpm{-b&)xA$aT3I@m289e-kr(d$3!t53Blv@u)ON!eyd=VP=7`{L!GD^Pc>-=heOG zukn=D4)_5o4O>QlWY8GYB!U5NA6inYtU@U~rVfhFNyA7qZ;%j1`aqR>P2oUM@5@cy z3S`1Kj`7h{RA@*l=FIkclx_90;C%&*^*f6Phb(p_V+Y<)9p9o%WDYD}J;^{oL z>I@BEL58fFy+2sFHkN0{ljOzyE|jZ)2UI6|i$LDIt7Bn!4=p07IYK8vHz+3v1F&YR zsi<>2*MmpOn{4G=hCIu`lw~rQPP&fll=YyDacbM35LZ94WEak14IjRGmn`_A?RQPDCBIpgF zV1$fZ{})Mbhr69ttkYYW7utn1$f$6tF}j{<>N0YPSWT+#a5NGQ3c^9MzALQQZnVZ0 zDJXWokL@LD-qPTnA13R{a2N&<>U7eBwy8YQRvG5QpPm}$=HBNABgy<)m8boc$N=^V ztUjHB_XQKOIBeQbb(0N#GKNGV6B-P~iWcV`@Erp`yU}M`tTm7%WfAn?FIL(&B9ou( z)2xa0QVQ4EHZ~n~{5Y zjx0DxDAD)|3vIugxOncM5WjQw2nmBkB1l)SMw>lJR@D}0zXJ=0Zv&xPdGUe5h=eCw ziZNv=v(`iGUTPgfPW(7YxCO9R2j};Z16_hpdc4@Mn8*%Rl$4(QJ%Y_g3$2<2?Cn*p z7Q^o_)9Iu1baftO%a0e6V7htSPU^4O;{;yXZ*N!a2{2Fw!tRkUmOQY%GjyF3Tl|3u zr0^aSh!l98UHU#3@Ta;P-e-LCn<4#?9^S9dcQGSZi8Q#QG)CEctg-)OiYg2PO(?wx zA8$Du3y!{sK#p(P!UphgP-y&ID0qNDHA2F^YNZhKp;Z{BH1{&?#QFQFmz~4$6ncdE zA2Q4aLqgsCJ}AQ5?fpJ6i2j5voRP!|nKK4v95jFq!GX^qdEcXCdDI1kjuZ2|@Q^zU zjT!f;dJa1lqfrIN8o7#EY^zGG^45KLjUYSZ_UyBz;nQgzT|nC$J1WIFI)Wf*_W;C| z+~w-4FUm6L#1j4t{ZT7bBR*@n_0v-KZD}-Pafc#Y)`dGy!}F3?2XPL?2(?S%W++lF zj7L><@__Ec$D;wkKoKa4sZ93yhuhOCxeS1qPLml*jgW(WdA>=$Z#uxM=1IIxjlJ!6 zIwAs_j^tCopuN;n+#cH#B7*0+gTb8;F$8|WRJ&iZGvot52;yKMdyZ{Dts?{SnV81G zUTH0$(&*Eo8r?4&pJqN4=}INoJ97zaV)k{JPZOU?2t1&}dkE=anlhE4HQaKh*(`Ov z^T1=(wZ;>Q{l%e_iuxBRthwEGvqu+wmltDKR8a%En+}?rvMX0lp6&~LKMcdnS*RAq z62;7@^W6FAY>`ACYCJ^Ky3Ar=kB9B}F!dbxW@t zctYX)+K7+Dqc-D7#z6KBnT1tfC{e(AZ7}FVm4NJ~6oZ|CodJRkwf2%nB;327HZ!B? z0T)&AF%#xem;~xM%kaNyNQfh7+9zPDs2#t$k*k)b6S$Q;uLSG${$YY#g*I<%FP5uV-3b5H0>WE5dwhiXeau? zE&!&nmbUF1_l(|m#b1_DmLmSPi9EnjKzJi4x4;5Hd>GF3dRn7wPNQrXk57FBSbZP% zYs#kvgE;SzB>J|Ar@IoKe%^LoS*xq3QgThDvkrXP%HeV@b=+~ap#sNw+Sylr5i*?0 zY}7mgu_t1Fu{M!H2*uWaGGLEqmHa!>VzH$ls@b-eA+mczRi!4LDT>1sTuY!-BP-ve z%n;I--w;4ooK8n!E$iroG1!R#Yn(Zybu_zbpqp&k zvzO}|>VA@CW+J*>Y$}!6*o>S0^q4^FWZjXZ6&5R$*S9gp2Ko!WzYoO!RxWfR3b* zYmoXRi8YLD+9aXneRS}gC-n%yJGph9wgsw~KP5GKUzsRAyWe#lt_(b;S*6L_Ez}Bl z=eZr%NYGdsNp8w3-*aKdhwWaCVJh$nL2p3ZTA+4ju4Vn+K2FgSd;Z>RrXhvT?qe?` zUX*?V%M;#%twpQ`07*ewM^!Iz^xeI|ukhz|0i5wWW^gK>w7KKke@ z&;WNnb*YHl0IbJ_!}x5+6H5x7wWHoLy_k43_5WI?T+r>sMN~&}y=|AJX7U z>CaM5>xoFip}UJDC$Z9r!pJ9!LeSmsw_+-(n2kX~R6>)?nkY^%9tE$q^}>?dq!Wy* z=9Jd2K2wmW>YsRFX2a^E3c$*yoMh|ff8nopcid$kcAu12UxofJtd_cvNbz&p;j?RH z0DIOCGgnNMa!
B&?532{ArVgs9Qvbmg_#iFn?j82vsnrYd>YE5PsVY(UFCh-T{ z8Zqslr?yNfB+eVLT;5fqc|ff-x|$RB!3!EAsQ$TNyS*^K05@{H-%nNT&=okE__q}h$eyzB z4#mKh6SbPJ7Pdvh)!}xYhK-vjMlX#)%Sb1)OHq^9=1+5 z39bSi!wMNWy#XFVUMX1R`QBy}L`C+LLR1&3-C(w^&kZGMllA$H~8E;sqptJCWALa$C`BF$XET$`gx;qiGx-ltsgJ& zOwSt?d(tUA^q|+8x~@#6)Zw!uMMg{s7CQF|p^u zhDI|8vC7G^?#EoSne@CoSQq`?jzKwrp_ePn_b~G!)YU0Z!nChH`rG>`G?z`LG)0N| zBi7+3B@Xr7D1J-hVp4blq(_*GRX^pA+hK)9b5*vL5`>sBRfeL}WI za_fpG_+LrxBr*7XQI_rhy7y}HXMYg@6Y1oOxl8#?{+Wx3Qu?8JO z6W(xJ;p-maE07+irH9C;&fG;ll`e?x_Zyb)Z*VVoeWw*F8PsiazSbsQx)4Hxe&S+e z12^B4Aj%QQ`TsHX6>L#GPPn_o(v7rqh;)~fbc3XHcXzX-bV_#!(%s?GAl+Tk-3@Zr z-~T@Mx%(0J%$b?D=CCm^GB(VzPJU|~VfqA#GO9tm_}muww)P^aOdj|G0I{+(Pn(~* zSH8}_YA0E_pjqKLIidpk0R}^PErt(TWID0ZJT-%xUZ#1BN9eG#!(-RG$}mqu;7#wR z6rd}IPW8I6A1W|NT#`)3t=WV!=pCGelWMQh(dsJmTJ%Ebuk6>@??g-bnU53D!J_(T z)QG;k9?PwTvL`gtXb$uu__gkiW({gB(9fxyD$kw~L|Na;xhFbYp%B#(T3^Qi)VW^3 zwbb+rQ}@)QtxXCW)i4Tt^S?^UoeXf;=&~dF#89~K+vLWZ&ROnfTyoYkiu@oVMHH8n zn$q!1WeoRil|LcxLaGV6|5Pd>0>$VwyC9Tm{$ZI=>=K}=g zoZNS!-mbn}$0zH3eWG2r-ns>xSBwm;(a>)Pz)(?{};I#5G?L6O^B?8@#~Gcgfg}g3nBV zG&sH*zK|4{Q~a>Feu{l?%}jEN5KD$XFQIb5RB16cKzzm#`Dn0o9()+V)~MgKZmcB| zCDaqUg@&N@2llv_dm&!bCOlXBPY+%U^=(ORb|H?#tJ|tFz+o586WDWc#cV8+L!%8~ zS*$#1VPRn4*iA{Gl3M0gw{43tBnQ&Y)vaFLD7Lg|1D^F9nNa*pL#bD0LY^Xl*z*J<%ShK!G(&nGM3s8B(QhcsasfUtmMDM zIKRr_0?bi^S>PUcKFK$DdgT!?`m)|Rssjek`muLdH7# z%R2kSXM7;ZLKdjc9bRl0W3LRlmJ|rHKdsXjiuZu9YHx?fbsyK-;HGEAcs}3EC^03X zd9Hbx3HntSQOdxA3CZ06kaY$4ivcx%g00(nv0T{Aci6C_j52t2ZM&D4^2ThlO;mNf za}y<8(u{!w9Z@D?i{>1@r z7goRXcHhW$cmR7aqvxwtrQGJy=}oS8A0|YYrO^S20iNb4@Xo?rPGPcBt&v3UTB`=J|oG_>j{dUlfTin-c+!u}|=?rs>e}#Tx!AO|1 za^Ub2lC!lDmmSjC!7i*+wu_*Vg9;dQT~5=kzE-H5!c3=)RM3$w+2GP?qB!Zy@y{z) zMVaZR)0RQTmpHps)cmg`b&5+Q^p5&t8#T&~3uxk_1XoKRSA%*a=ap+;V0y894V0A) zNt!c@zY>=EEH+9NiKZ?7A}-HUhKGa1s;kzWuI5dO(^~hqETIMB$*~fu+`n z1B)^wyO4{Z0f;KT*1yfzp0U>p(E*E2T{&xIWA_q)S_P)C^V1TJk;C&~uJAGVRFmih zH(%&;VN0fBcjKVe1ml}ecog6Tic;zj;)@dS#qIsYPvfq)M+%( z6Ff^Fx~XTlN1&+$Zy%3ty}P*&L_#IU2RjuVuQx^wJ~!|4yVe+ffQnW;yEsFXdB2P{ z3R&2>pPaX0%`dtFxW~TBrS+jCc?CvLh1Ebbm2r#=`>xRb?xHP0Km#t^4Dxx2>X8H% zGz0WtC_)Xym5L(#&^sS#iY0Hfv-4#P#(2L4zyY4KdkSfJ`}=$d7s=+?Y`0?0j)$lw zX6~3O9&jF(_#2oxV5)y8;K?z=NRhmY#RBod6+=di z!)+Vqt1Hd94Ex}EzPGx!5v-=oK-<>Fh&4P~H08&3Hy_pfe$MNk8t7l?Be)^Yzj4~V zaEeg6Nvq2qBmBS~%40_!xQi0&-8VeJu&_|#&t)Wy&7=tJolCkO)M9yf&!p4j>YCQ+ z&p5~3>}r)@Sb-hP)oUMbYq{Rh>dLWsJt3UhHidrh-O_8FO5(8$u?)Nd{Al1gPESLv z52reaBEUlQ2#>lv_t>a_tqO&PDKF0VYaTw_j;Ndf7!%BB-KgagA<@kHpmCzn=><6z zSP>uMJX>SyjN|LVb&>4AEv46Ps+hK*T3f$?$ga6l>(H2@JiDpBL;qgtSVCRr3Gc)0 zztfG@%D8AO~F9tu$G2yYh4Xa!dP6#45Q=_H$IqL_N$AD2IBPm(wr{`Qo`(A-$+|bx82WDumU207HQEc`Jf+yeWDoA`n2Xujl zN-XBq1Kiv6V7o5vQNj6%MNFz%qWP<)%Yq;hKbD}xYzLoL5WP2)lJrC!;4r%TP4C4E zz@&?6D559|{dx^A>qTJ#zG=5LcKQ?pH|82ZKS#9Px&R94o=4_Mzui*2JaJlM9!`eO zN~12C0clz69osGLyPM%w#D5<&8WVSF7=rJO?g%H+cqjYjL*YKRKr{$4JFlm)p0b4f zE?ME73njD=sXeXYwHvKv+&r7@*Q|FE_j7#4$p<4|6$;y&!T041hp~Wj3#AepFRs`9 zPgf)?a&+s4++)PNlmoYSI9mMNa(OHA&;~_2z!%t#ys6%wT*110@B?!oGC>E+r9cMg zm*wfibF(d7%T=T4V|Ux*R2-pI*u&oi{WOEBobl&ExG-je6DXPsgJEUqyh(I2XtbV- z-hfpgU=!^OpdDiqy$q9<4-uA_d0fmK($wui&DQ@(lY@+bs z<#(d*9R9H%@mKOL*v~S)hj8w9z+E=4Li(f**S*mq^1B0xzi^dwt7#+rzuNtc0AN14~TLuLc} z3wp7-P3$hqZ+d0DwM*3>U`6yPVDrq@ZZjNf#{fSMhXKRa+5}72v-)H!MDDuC%yz;3 zg(oKuy*K|V7*7*sx*OA6{BW#Va;$!goFyBZxw2#$%^_<{IBUQi*C_FlO9g%N9nUlV z(85nMK=se#bKFti7`l4!P>^?@X26HSg-GigZHn%kmX_gxc~ri;MGN1AM?^z@hsP0Ut~`#1-BOd_XGNUvyzh@|K9^!1pf z%6q&q5K(?3Qzf0#jQKI*Wp3H*Z7W!}_JI29A$fvR;n*%H(L`&-EAj|&fn$r`;D|{87?(m0 zCty2#Niju+su#=>}(-JKPQ^ygr6jSc~oB-}7X5rV&Ym;cVVw8lbG$7edjc zix+u9AJ6yJ^aMOr!1>2I6_df6!T3RDVcjm@r3>JuSwTu%^IinUv8t^NM&X%3^Y~AW zz47d0?^UrsA!{JCD-7Sb^`wGMr^QqjYbdTnwz<)UGF_!%)Hq8p1N%N#n}Wss*GE5m zN=cn1Ku*=d9?H+%V#hy8;BE?iQX8i-@OFLL^oNfUysq~My>=(_#g;Q2x~zOR+T3h3 z!S|YR#jStnfB*chLVBIoewB@8b#+>En`Tgn0Y>bk?og|DLt8G&rqaQI6o z=+Sxrcy|c%4M9TIYTq!z%@r56;Ud%5IayiuK>Epwpe@9?(lR>0_|E;@(d^t{h}E3N zQ^vl+du#8vxN{wn`M#U8k^7lsD@%sK=eU@K9;c47J-R!feskJ85Yjh0@yNVVaeJ^G zax}qYDF4wPEsOgR+7*|*(OOOomaYfNF_sdg+~N(TT%oloGd$W@gI^hE+7Gio&Bv3{ znmD$BFAOGghNp-4C8PcCIKI}ydd|6np~8#dS*fTo-eBGLb{?Fjk0RkNq+^SK1LJVc zAV3?Msw(4zW~aBC+!zci9H`PBz+zDE>X5yOxD%9*(3-k`S4;#Hlh7i-N_8)q6wb_ zWi2BIi~9>I;D+3nnfs}Zx5F>zZja;MS}A97^8f}35V8>OwHb&YPiuq7t3_-BMB9-; zM!(U=#w}jg68pntCV!k8Vy7xZF5`2Y=35q;Y!}=qk4#c>Kds1;6sMTJM_IeIC{rY= zZF2A@q8ejNOaH4<(jyjG@Uwe^FW#@#J4b1m!+L{HiX}0Y1<~eH2Drw_+)BWXWKvT; zVk@wRL9e&APQDd8!TX(paj>4dZnd^!s)>EV;f2uiNj>MUPfrJhH_y8xsV@KM z;ZR2yI`Rv3ZcgK+OP2mz=XtV&&_C_04Z~_Mk3b zw*ub-^nF3KFn|6m!(ies6f2C-&2&>enP4jSbebiSqgwQdPD48!(<8k3?E{ft0x{${ zxRO2xsGk#l#Xc-2l~Sy{W*@&*^CKiiDxskVh5*eORUd_O_8lAZ8CUiHijIaMQqdFM zGrtz@x&al*hcZImDqlDRb{1*2AO61QvT?bxnUsy@b8&vSxkQt!V8CDB5!dI+=Jmv* zB{TJ?B-&D9j34md^OT1~dXYy7scGQSJQc(2;;jvz*cu3^%JUV^=|_=PvERv~c#g?) z%2jIGU0Q8(u_Uw`;tZhDuFDY4RVdIK=||!CQC7Mqp5HTTy#1BO9sNtZH`?Gh+TWpn{f+Lf4)Vjj86_3RJ;A*8Q z8nQrE+lGgMJQ}RXSl38kbwbNvx8qa;|8)PDz{c(zrMP-{k7_~k30V0BfzXW0Se#l3t(x3C2vA%IF0+4xX+J6~!;VyDT4t) z9xJdN9q23&ohevAX8cOC!veScsl@*9&0`rIu%9yc1OOF*Ipg#I$ z*t3p=dG8@CBtt_nDa?|~Bbmuth7a$=mnUqi^6h4EY(~{eG4r#v&qJ)C)-B*L#@jUA zrx2Pb(YhKfR>&+O+R$q!s&M&OO1H63KB964+?`%|TO=jP>lVg}}*>-ns3 z!vsDsK(CyR2EHPh&>FC6HjOGDfX|MnD6utF@HD-{8AE%az1*kGb$A~WiUP{|d3;Ou zxn#LXl4FTaBVO`tG_9SH%uv-wM)sHQtLX3O3b9zEie$zNwjh1O0JmF;)4OwK6>#da zA40F!|Hkh6s5qGbdg##F4sX~AimQ=IG?)Va=N`?C4~{LTyA=9Iw>4bLwSt7oDWU?X znGq_gpHMdEEhV&SjZho9k2G41B|AMuvN|bSd=U6<;*7-su>Moq-W-Jt#5T0F3yJK*1n@A(~0z5O-wd_r|G zs6Qq$*Y`@zyRQZ({!mLOpFkqW#X(g)+$j+JKWJHLUyQmLs`ws|F)GeblPO9o(>bE8 znm2)@%Xbg?cp6M5xZ@2u*K%pzzLBxb+8i1prU(qR__+B*E1Ow7!6HQ~^Lp@?vrsCq2h{)QFR!Q&DanVYBW|1;z{u;yI`p!ylbU7stkK4M%r>Yw4b%U&%2UP zyZ%zjyyVzxQcPS!XaY%BaUp#Bnn8KJVy^DlWRCtSk=W9y`BzB4)5cg41bkd zWQKsP-*sUbi;N+V`5Ll)d*=ZCE0M;mTA*AML*4)mIWi}k1Q?$k-5+zYqIbn;!H7R( zVB2uo5;!JPh4r=L_FL>7T54p*Vx3#Qrsu{yUz2H|Bb>aqDZs%D&ZevY1CZvJKmQ?~ z_P`$Yq+lNG#i@ISuSj-w084K2!jb-g)k}g5a6`x*W8ZAVKAPt>X1`NZ-SzZ4kuF}f z1}VPB>eyuEz)Tbb!?56fo5Sv{4q(aE>ABTXaUi}mYFKQeyJJB^2}e=2++-rJ0`#p( zk0*=8T)lTeD>A!S{NnsNA}f#j+t%)Aw)6|wW3k5QYOI*kpz2T-HCyUddKR527B%Yr zwcaYsiZe?f4G8zSURUJ_Mu}T-HFCR9Kxra|XO^+S3CV#~XW~hVBh7XxA=&DhD z{u4|F*Whg@TAd{gsTDjJFOD-1`7 z%ssy-emqdWzsDK}6+!u=uYVB1KcO_2?)Bu(KCATgF?Ih(!G(P;MYTs+bst{nv#0u) z(g|#b;yFH@Ct!4h;kTmQxQ_4%Bq*8t$>N}+c=P1#-0`U7f5Jo`sxVU3A-QPU>1z`d$f zFNoE+0MU8pxDofh=VWIyjnP19-zH8K`McedrFuLWdQK%{X1=D?oP@y)3evt^H}-UN zG7*EnVaf6Ui59&U$L?FfZbM-Of|~Ar(lAL>OHnjq<1Hlq4%8Zj>P&~k;7x_Zhd~|! zj$w^$Vs_+_z3BO-$_yf>Ysnp=*o6C1s1swfRd{aXaXoEzdS8%;DH6z9Y>`5;X!gae z#lF@z@Ko~d8tSFjy6Ru7HDP-E)4HF-u^aV6?sfBvwR2XJSzF`Zhbu3OtKVeI#X2Ns zz&|~kZfC2lv!g@?Q2{updPYJ_LS#t=3`u~F-v{cz4lIyo3H#cOVZ%ajgumc2d|w|L zZr?k%j(oE<0fwZEnAR5|+uHYZmqGIP#4U(LEWiiKxbRjG#DRPfD6&D?hl|(N#wz~Y z-K5s$7f$hod}aJ0p!YZSkHoL`v@Pm^|C1ZT#=Pd4YS3fm@ag7PsSr{U)SD54a?-f% z4?NuLpv=m5t3e(m$29n%k*@tU@_bc#SkGG7S2C8cfj|9`JMLGX6qyqMgQ@%nCd-vy zU|soi7!4F4ZDFMslmHYaSN1Y^E}5*)@{y*wREunZ;A`wL{=OY)lK-*lJea+bP17DB zxWZ8p#cEU$wJMaY&@{3(TR?@~ndnTwCd7<2 zx)*|4+_cTNf3MI2H$LGB;js|ah4!)O6wgHsNZTQ(t)2psSuDGxrW6(Po zLxHJ+xlC#B<|s&LDXXu6v+_2ha$p7SiR`YuvZn_(e^o0K7dz{@}X| z2+*zCU|2p}vn%OCNYW{$p^@ta|Fp)BP>##uM!OrhPC`2aZeyEX2ommaNg;bk-@y%n zck&8IpxN<8G10WeqxPb*H6pfRiLn2Sw(}IAf`E&M_vLi$a(ghdDWc~c0d+SWfGtmz z5!>FjhVm^D%+H`AQNoD*D&zUT-Umsa-M#(XtI2}yB_?kSYWt8 zsG1dxT8ei*n$E#Anub8?3HBFs-jUW!dH-ix(ScE)cTvn6_>>0FW^I&}xk^KnzA{i@ znQ++}O2mcemkjYsJvPSUFV4k`F3AT>BS&uT@nnsYCG zLJ*tgzn+1*wsANfHkOwKQ`#bt1+^v~6Fag)hxOgn{$u;&%?Rr7mtpYO8IyyK7e@r7jN+OUo zri!qT@ulT+&x>h?Y+uiXCZI)(Puqt@2xsa251L+x85I=nQ zz^cEpiltGrms)b#O|-{82HO!|edTQ5Q!WDMS%149%=XUV=SY}XCHr)R0wvJuy6x^F zkhSrJT>ft!7A?5ha@w_g2WFT))KrdK(E>s2I8%m;Gqe7?5UH);ou@SPc0)$pmJ&6L zm;_W)7}9l#`t5~D4*LZdhcG;AcF9`$^$Ghcc{+v&5ux<`;rxJl8T!+j+F+C7d#mv@ z9)}!yi%(Fy4yT3Tb z&zZ7maFOFBB}Q})6g|Np)y7Ym@V)1M1H221aUT?TBBndlx)DMdx+8(C&hNB+O#0;t zaJ@g~QY%(imz$;e4E+?20H?y_9*#1e`6R&XcrG$7e6NOb0Qw#9?jYzkR7u(Yu9%-X zhw3usj9hQ$Vo{ivZ)ODu9=v0m{^!lOyT`~y=kxkZ{eIJ4RPef?395Fdd`472n`j7D zgPqyxg!24FjO`L8iIzD12sfsHRZ8*?u}CGOo)mm*x*XgKnDhm8!f2{o(pnUD@Sw(59aL@{FMU#kbkKly^or!^J4H1Gjt z)1C5c`a`sJ;ycMKV&3_|L`zksu_B-itCX}DXS;9BX)RLC#q#c}Yw~>g3R5P;#IDrm z{w!q`h7bg3Wo(A30+K$rbDBShVZP3tWS@7kT4Ay>iWW9{=(F23U0L(*XBUb80tPOl z|6FYSk+>ho&HvyX-=~iKCPmvkoyICb(V9qA)8e}HQ-1jRZs98fnJ1xs81jMfha1+Z zwO+vU0LnL15P!7BftNJF344wCR!=Bx4TwJjV59GSNVDBl!6*!F_3e1~&qQ~pBgsVk zbfpDFtH6sZaHT5bK;gTk<%(877pKd1TSpFy2WqXqP}uBe_e}KSC#rg*1f)%-oLcZ+ zLd74v;x`=;)FtwJ!`aMJ{;9!c-M0CX&eGtoNYo3L(H)urH3HTdQSy;uz>atI=)mhw zxQ6(9(}u6bGDSy_MTs+KSohkmAuqL_^U``f6f&~9ghIY8^cHy~qT`->=@!w?5Bc$< zmUhphrpD7mi|&8$CyHlot--CM2e&NDLNtr|I~!3Z=z>xI_AUoFpneny3N>-D5`jq7 z!nfX!3##$wgS2hViPQvt8L1k1<)_jrNQM}A=`L8JC-YR$*46+vmIITG@UC{wWJRUx zG?z{vM9Saup)VqNCkvh8G;+uIL8{l{hio{9<23ttvkCB#phbx)_ePWH@Gv@ncr2-)?5{A%_ix(x(Ta(9qV4-nw-RLC}oFBEU;3j`Y-1u^`2`x&7>l z<4=MP1X(eH2iBN?o62F7X1V$OuyR%S&W$a5-V6`Z-$92IjTzH{dG{Go*iAd3H`3f= zKL(dLp1o|D`>V_lZ&u6NmpZ+>Kb-Kr=sA&Hax0MBTBahC2kz z@o5s=2G-OxvVH&vs_O{b5S=CqG%dV6uNr3bvo={ARmZGxuuQ#No>+W{kmc7)os+>} z?EBY!*&N-Vv&zC!EDmo8lFmWKeD%*-;s5X?QKtqB*n_!x0zJi!_r{ZA5aJNQnq;n@ z0etm)?_swZ4%OO)r)i##RH433=I!EnO$B5=1Rbf_ItZ$FS|9^o2@k-dQ4Co zJl_NXm-8;Za*qep6(<_Q%OGTY3dBvZmx=7}Tg})j{gJ1MFb{O~t3eN1lyv3JcZhr^ zPhiMJy{S!$(3Ni~p%S8AKWyTy6RCM%(RDeiKeLZGQ@EPNcwxFx{{FBRoAk8|GuL@ zhHYLwY1Yq5bX*q*ZvAO7PNpMPZAJESKym8utBXLHbc?vFu8v)bLu;M&5PEm%#s|Ph zJ2phG0bUrU1K0}m4ke>zFP^SA{F;-DCNM%d^M`iw8z-p9%>Ih1183QG(bzJMUYPo$ zjg*C~cQ}%skn^ott=Xk#4Fu7tvlWE5ws!l#B?tn=x{kFK#YAAO+O7-Inv;gX_`b)k z_$8Ki`Oko7%R2814R3x1c5p4`4a?x*2(PfbkbtWHLGJ zwKN(`%H}If3$6ZNJt1_y`P-~U2(H0H$*SUGrxZUT zfUq5JzD(J(YZ&vA(|P2R zFVs!bfGg(cmkjJMzBc8_he7Ox$wS3~ld9_}!=9&A`16;`X4;g?`oYrfZT-1{1|{{8 zXzYf!Y;MH$axr8=@%+myHJZCy^un2pG~2O-JMHm>eq+BmcJb#->%(b~9-Loo)ziX# zZr&J%LwJb|`FP9#ybM%JK-rX7?_o120`!v#-Lz^Y5UZ zgc>KNtpM~_@d#7cxi(u#5N@!y$0Qz(D_*cy5{X^^wpAjIRUaDtkOevkbj%F4wG{R)9<6*)n+X zcYi)>Kerq=dBf+z$iZP(e;_3a@>N`v3F~#YnJ*j$H_K$qS+bSbNkQ9Vy*&cFvrXzP zJH|~$6YFT=7wZRv`G3Z{V=Z?Aj-Kv*WAB*;N4jxm5i0}Vp@+#o~=dK@}I347b`G1qg7|OxA(NYs!JVs3? z{IqJBc#a@H+EjAO1vBxd>F|U(Q~RRY6F17Me1<@nh2sY>!+CO~UJd3OiTf2am<$Tn zn$IzfuI8a58;OmXT=ey_r2UBDEzbR(yA$E|_%BzOLt{W>U>7;xQnL9&}O=Z)WIDtyPs&P?E^iSr%9tB7~XS=xBHXSK)7hH z>(;|^{DPBF&17Li-=*7ZwZX=;B^n8@@=BXqIcKwcCO6ZE8XN!3dI3%-DO1UDdr&&o_}9_fV6cfft0BklI(O_V8^iTc2?chYvCFR)64IhKmkR;#r0 z?}=Yij4$t>N0${6G-BZFMdNV&gpgbykvT}f@5yzhmZ@CK|1E?=I(QZ0fFD6#eFAdS z{O;uG9_R4GXT){m`jl$HU5E@29vJ&1-(8UqS5*Ys)vQPg2NH8A*!(&Lz&jn^u{mg{ zQ>_3|H^=PP)~PS!XS(VyUnl*u3(zmRuKMiP**<*qDwOTvt*%f-_ z#Fj&E@Fs`8qtVp{ZZ^CJlO8WgHGgqrokT16=k)p7p;|1@hL*AgghbDG5Oww#h?~dm zaryf(D+tsJg%Y*WL;c`T-5v?BP8k-sm>t|g_DBK|lqT&6t5cc5Mnb=QgWaq)sR~uO zuW;l$tC@2R?6cO>FOx*w9~9Rs>*moK`|g14g~lB(DVPr>Z?U#};Q#eF7(7ianK?T3 z^T<)13c5)CZvaV0^4FJS1V(%w-8{$5VXz+SZk`~%wUh5_Yw&DH$jpbjsPmiQdBm-A zGaei{#4uXJw(cxA2E|LD?oB374c=z~ixHeTC9*pn4Kh9H68`oVn}ZDxFw|}9Xm>vD z(^#3=gaayY3(}RvhR06E&mO&|{u)TZk&0U|S$P0^cf8szE|o_zjk;E zJu$*=Ebue>0&tMWMd+tyKHR@JmtmZ5Ms7Oh&(d_QEJ1nVPdr?N!%-UOfhB+g56HYt zGb#TJ44kUTYubMSTyxe=!NfDbdQO>|nP<4@IDg5i1%iz*pzAjJRXQI`R*X1SgQy+C z2Qbgm{wu+}G9Oz#&^He~uqYCLfN|WzpZv7{oz4m;=%k1= z0mudIVcgCG{ZaVz5TAodil^7vQdK?Rx7EW4|w~q#91Y6#0&!0jd|tb?c?o z1aes#w_<&>z4MLkW>`T5pkUt%99p7NpnlSK>Ac)Y2SxD&Y&zyTX*)++Irah8`30ZT zcWaJjuY;v^DsOOq7xzCe%^WUsw0}ADcH2OYXxMXH|E&UbJoX>l zD(<8xlQHm3SOoxI^`vdUYM@g12fK>_OLris+7^?__PMjzf%&r7{=jAYs8gxgk)yRR zo~-#||7JA5JGecP0RIykbJl;2OWEm1{nxl7w5ng-bZrvsU_7+BU#~B0ss*26cV<5r zN#NPy@-T_Bc$+;BnW|}7)I{k#g)mI)otrn`xrZ?YN;(CqbG|?sQ_Kto|3Tl9i?k7a6j36`@3o7KP)V1^ZIm)2gbk8XT!H5Ul%X8t$Q#J$)b9>alzH%zSF{mY!LFTg*az0vn1j#+L3_ z0hDQx3Q&c1su3Uw4mqtJb**CD`4kISttYsB^)9UVUV#4TyeuxK8T-ab(98CRrp`I> zIJ9g?jdgWH?4f3WOE_tJ9BJLu$}IWL^4#6epS1!_OE=25U!Copf^} zt6gR#?uO^0mF8$1l+#S?eV%sljH7f%@lG8eRH3Nh$*F2_4T1) z5`eZ*3Y4Xlh?i_4LJ}E3fyE$aNoxt56|etBGxatotYlZD0A1_J(D);+_+Eg=OtFHXj5wPYK0zm~ z^A{Y6+dozTGhMvhI}F(9#`2OGak~M|cF6BR|K=G~BbNcJzvEu%=5b>mgvm}zG!AZ5 z&coS%Y#c%8n|N}TFxm4Sir}Lb;&G&LUiC7yd3XM_l!@v}E&|KSmar%8p@AbP!zm)V0)ax)sOt z*FCoY$~I^6xtr_veXV~D9MUp#Q!&y4@c=^78me>~3Q2R&5Tm^Cw_Z+cbk4Gzi!_of z&a*6IxJSLZg2o2#u>C$blVln=R%WhDB8t1gWq4U&hl&|wl=4y_Con46TL{AlP0?1{ z)1>IH;L6twSKN7kQ;=I%e;HMn8dD_7>eYmT-a4(y)qSX)7@#%;N~{zjYFGR#2Ok7i z4+@n2aTC-ys!n#YF)$$`kvD)1;JlT0CTcBPR>Ehy$ciK4@_1$T8wxNdmt0{z`$g+@ zJ~dJ$&xO=4n7 z>{q>64tJXu+jh2DikS%mK3SUMx{Ag|3`g4Pa;Ty#HXa+g zY^u!WFODH+G#c>BbWgg{W^fO8HZ+h({yiJwAF^PQAPUtF0Mwirc-Ke$)NcoeTMlbv zvZ`tv9P0$kl{vU;l$P3n(C}q+XjTpJF%S5*#F5mI%5u_>Rt6HNiExL!Cx+g4dPf*< zg8=b_#}bdg?}MHqLQ~%R`+UAY>T|;ObPJUy6y5?JJ#CU`h&g>CHiU8{HEZ`1fINSO zrg8c6{stGF8EJQ&M*79rVLu8md(KWbL@B15kDZ2@&{;91R^*f0n-|ii+@rU3K%-=h z%Ysj`8!O#@0@~J_8@fKcMH6rTOl!hE>yC887$5zt=*Wrz>jJsGH{I9r{udR42v4j$ zp*|;COKhQIg-*TgD|P(c*cfUCnx?@fb1P$;$qScwKZwY&;G3#YH?ujdzCifOyu;#_ zR??;GMI2QByV<0^uO$i{y;39BTj(#@BM;kNP?lt(C4zDQUNSnWU5p1B<**^H&mW?iq!O|el_dt5( zw?!P9&nWl`7elu-C#~?`0@}AKV#et_yv+|4t zpf!6LuieTO0sD=${+#$LV4X%TB@IkSJ5^&jMXAJ}5zqiM>m_8>{IhG2HEuT4(Xt!O zwv&-Cx*NSyL8N`GuJZw+Q`ky!5%kwSTmSWkxh%lE&ju9~+RZwc--tNq+7uQgYII)5 z{Q|*M@P8`<&8xvhfc!EYa3bD%MTXTxtJUL8_$llUME3pqz|3C^@wt%YDa6(Q;O?Yg z*LO-e4~;V8MKU;2>G(oTb}N$J>@K9`dK@|Stg+|Y*Lxx}u6246|g?9maNO!DV%n>Ag{}tcC_u4K%wxcjNv z|3@DNae^)aE}9=sUa2YJ-LVPtj6(%Cmy8^m)HbqA^j@uZ{ug-J#fj3rHjOzC-%9~! zHQe$q%ZPpc(ExH}RFj1fTEDKH0mA{1%@T0QMZ z!>0AOUHss0TDl}=6%aD9yXfMWq93|yFV=Yo6y)chFs7{C4ve3LN=)~)Xh<%)uvwAB#4eYw zpx##yBR!~?TfWLL11^lT$_(Jyy5UjtF^H@Cub#?pK^kwrtG5|0>$>+L*TlJ0LJNVN z%k6dN9N}#AX`2OVxZVr|VxR8?)F@Fc#`hb(!YNGr^=4U@T!jI9F^s(L^uC?u_c)VZ z`b&Tq*obm14$V?hHJqH-&Rp;B4=^-NSl3`USTK&M_o35|1G&yEhDhhc4EyPV6HI~!81C%Uf&I$Dt`N6d>9TEps+r28 zwfZ==TV_h4jM*4X7BJ>6u!1;*NZMFN_Y#JQftrli3g}xYO@; zy7S8;rfn#q_bEMejYb1&^0;?e*K`akWA*AE(2Rr)vpR)7mh+MT#9W}EA3QI560(5j z+x~b{q4+nr;u5`I4Vnwd_zw8JKk{`L81!4$7z#DvFUpkrS_Gt_y}0*ZFQ$b&!w6+U zLmwF$VU%Ob@WDn$E&lrRc)w<#_pY#J=VYCX2>o#?uBkK%f3^MbTf<@$NTYszH9LOu zI!=4+EYoQwRnUmqW0^7^OA|XUm(&9J;J{;Ck2E zQW~|Mz9_xa!@Mho253XO7ERJzdmAX_V$lxvBQsjH`Ul#yIU&Sp31Gkdo{nb?9^nrv z67kI-x&K}~`TaqK?M24lB_PhJArycLV5e=U9uAxAsBu)^&vI49yyxIbzh*`4Z)>?a z6>3c)b|o}+1R84hfAyvxLRnK_scyCs{gfOQm~&ReH>_rGf4Xh;rJl0{kOm9Uf^+xM zlVjmC4P*U~SZM`|$c%R-v9=ETQ(i0!&1ak*`FLMOw6k+(@!^_fLQa8qEtWy|7|tuV zpbU8)?zvfle6Z+vg_rE=sdVz%K*%Hdu>K92x;P;J`ia(Do`pX0_%XsZil8u-gi*l}4jTjARa?E0gMx$Ga@iBmM+xl4zM zA2V+VpqvK|PMw$M*+w}{{@e9>ms}&o$zWLHO=QASQ}_j&3dUV*!_+`wt!?v}bA8j( za2*+AkXrD^BY3%YA1HDiG#^ax$1qW+#k1FP^&-&0urcyR3iGk>^)z3+ep2F#?g!7d zs;&T`Z{t87ECfW5I5mW3sMkjD(HrROaVR49%-V&2l2VG1T~tj$M<->oRQH1$YNN4( zUQb?LZnQxI<7Z@U8J|yWsIOVveE>Q9v1Eu7L5(o1IH19}khF<6<+bT8(lOYujfQ)K z2XwG!>#_VFrrt6v>hAj<9#R?!>F(~3ln&|c?(RkyBm|_pK|nw{m1dCc?w0PBhUcT+ z-~aP_$-LmYX3sw7?7jBdYq49{lj^CJvqG0gcOJdT33Szfw>#m2lm*+o@)^JqFvh(g zkXMD`AI1|~l9j0O-hy!ae11pbPVy51(%mH4%5R@-2$Umo4fD=?J$wi14Ri@Q%_5!U zR>_=ZRr&9C&}2T-#MnGxV`pLM{nN|}fp1Fo@E(7fEk!4H0}B?`Dp(QlNK@8?DQ{-6 zmn6tVzh2sD^CQGj3humpxi@yjM!5ZWdvUiu{Jxsx?rz&1x&L7s*>VcXQkgB2s+5m& z_wIx;B1lP7TM5a^_2UwE&JP}X@cdwswWn$JVEM;IcCa)A^-&E|5IS==z; zCWB_1Z%sa;ZN1H~;~3GOeCX>~g{nO<-g<`a3Tw=CW(cIIz4!RpdGpAlvg@h93}FEX zWEpe;ImVk}V($fMzE@_6ouXU7AU@&N2MD303!?ypfA&xH_DOlsM<<+0dVK#2HiI+J z51zpOiM7+;SbM!gKXcR-)_LG|$@-LzIExv3lto$tfAAP=*G*v|MrZsUj941h$WYnG zykjZrSfD@yg5rNi0W2C};)r9O3kz0RD~lAbW_npOXZ*;!X?PXhTVp`tt`qv3fL5k+ zGP2*+{a20=j>3~&f>u`rE6{=>>0lETGAWymQtKHdaVu|lHb{4ESw`j?$@`U3^tT~o zeEZwrw>_Ry2t9{u26BN6r$s(4EZE(j`Bb(GXJW#f4&*t5%SQ;c6%s&uQTyp7*QaSR z>ArA2=Msd1TxY!OXR4?rYO~(ct>TrPk=(99dP1Di+BKte)_EFs<8*s-t8H#_ zdMPw%t$-ljvWGF5HIMZ4kxCHT_uXLx!;4UMY4RQl+oODzyPh&>1GgSv1L2DyD9+(_ z`>;L0z{{Ke1@C{)$FIx9M4 z!nQ?Vs}HmiUqe*eli^WjW86r9{Gy{N5j1%2Jo)wT&F~11QEy>pv;JBw5k^tfaIQEw zf}{eA2_7!Z*Gao2qEeeu7G*;|z9^x0Paa_hWUtX|;Y(mK)AUA$f9d4VI2{gYeTG3# z`*GA-A?($)eMFt-Zud<}FvE=Kh=;=Q@Rt0h5Q68q&oB07?M;_A6 zu$yt9aP-pFeqJU+082mN1sG`tBbLGlpPpMr8^Z9n1Z`!*6(rREAeH|*EL?}?T%@Vo z0hVdznr%)=!JlOD;ofYRL;E^ma!rbW0GkI;=Yk5QbQmWl8<4H76mP02nA7lW&SeL5 zuW3d;0st?xBH`K^&Q_=o4p?~M9CpOor25vN@W(VZf|=e!rn$npP_6U5^OP0h)T~|V zjT(NKHA>?1*{IHFZpKWK~xQSalDIbl=Ne6-mn9kF6WfM%9rwFdo z5SBac;Fzj|Hlf~XEm6~!D;$%7#}53(VNPu=njt_Vvv=u;+UAX!f?}6n&3p#n+7uaP zpc7y18bhK{atRH_k8$WR-+-aVnUs~xRq~M_i_NTvfX`V@HEJY?%xx?%|6{vRI{#E- z?C7|j=r2Uf7v}cB*07?vTR=cJLQp;|CD(3toau0J#A>|JKiYGxT^#;9Jzow&Fzb@ zbsY~aAsv~xJjs-v9ze51#9OY-*Z14})|R62uuSy%+X@HV>@o(}>oYl=h%i?A_lurS zbD4rN6!>^jCUo1K-RA@mEfkNdbpL<(iA&kt*ofq*26Bp`5m|k-1}Yg9dPk%SRN_YT zf)c3vCiW($6_do55wi$m1R6;&ZX+G)AqWhpp!3a5y1|(Bkf1@#DguhLU}nwE9eF zolfMP5@#AvkNbre(TZxdv8`BNY^N(cy*p7Z`RQh!NL|X!1mUkV~`c5l|dtywI zpYUJ^7J9x**%#0k!(rY=ugZ<|UV}-L@dnk?v7FUvxN{MJ^ITiBq^f{bb6~bqBOc`j ztvYboETsWu{04G}y6ylO4oDdz#A4U74X}uogI_9$%Uj$#RJig2`ooluEyEhVfUvNx zWzq65h^3|zy48s^mI=bhVVx%08EH|5!Uliy0}Ib3P4`tT2XhOlF$)T;qO5y$V=@f@ z5SD*5xo=u z=icm!pO{0ppsTWvh>qF&3D72`f)KxW;!Mg{$&*D$lPKd&`YqnAvqct^gSHV8YH(*X z1i@4quy?;mYA;IuK5(6vM>v{g@d6)BMmy)<_%4HV-V1OQbWuOETcK60&wX7hW4a(^ zGn=%l0AG%dE}Xy=#j?Dv=A<9}dH+dtb2a;OOf%rr{eZ6fK5xLW6>2`gf0-zP0(p>i6=vGL2If^jYLMn zXHiw1VjRc36EA+Uc{i(DouR*w1HhCDrRdcl`)_N?5zHHkU&+lpSWLz`3?FuNY>p=( zpUXy;w}XU=6`8rFFJLm+vz1XIhoPwabhqyg^tJVX>Zlx)A#L1`*1)rY_d5iHCwSxZ z6Q;`5*3YJcIs4N!bx;>6NMxs?rrMYh5xhSJ-8F;QG)UH0Mq@@q+XTk5KDL6nt-;(B z{g|WL4eKn=f+U5JdHuMedVfzpWvZOwdR<@Mf`cByH8KwjZ zM`6O&8d1P4Hl6tCQ=M>cw)e~Dn~Wf0YrBh6cC)9kbiUMC@~%%&)fp`_{e^sHvIeKY zJ4YVOR5XF5K@*7B;_huLmCnP? zbw3SbyeLdCG|#n^TXJHy8C7}h0X|J|p|}aW&lioJHm??J1hs9bRf!@wQ;dznaIV?K_?YCPcR$S(*renN)h=cQwv&Su67SD}BhPKUT${-8VmHe+ zM2#}((c1a*5~V#3iX&?Ls8Anr`zdHrwN?SN|LRd7(?2&ei%N*3=ylv%ZD4;FJ`i_b zfeY>|%pI*&YVHBiEw{$23ecXE6&C&8fEQD3a{B8!DrSAH?7u?mjdEGI%bTQsD3}x# z)CJ=VLVVC6_8bdo9%EcNV(=`>i(9o#<8C`15Yl8L*>a#$i>0@Z$ZX_^U zvB1MSB!!Re$DJw~W_$8)bS!yG52~Y5`PpL^Mb^QnlAo@pE7axo+^N}#35}O}KEMP`QV=Wob_450)4e-ApK!)dDDL-S9SDIVI} zkAry?RgShfgS69wz*wR9drwg!A-weC<{93}E{0n%%?~)56n)Vk#AOTiKYis;3iEeF zBgU|4C^Cs|0qK+*`s_(=e5?i&TL%~7(fdVY!2wBin8Z6`a=YX7~Q>(uUn z$S`PGAr9(E9X%b7In`r&ez8cVTl>EI$u@}N>e+ijw@R>ucE$suE=)G?^Zr$Ti_5WP z2CJ&7DietHmpPV~Gdvj^UNbPW0GTN-iJTIyS9=eGLmA7=esh&br$HJ@c6h^PeRxoe zKY-&ZAsK0K-l#D9@?!QN$ivY>#o}zT8eM^x_6rLJySGJWdg)5c&$ZJ3_j2-KI!Q^ozNMss$&Z?-Vs%|V4Q>Iqs@M^uqN)Gu;Aj8a(cTYz|#8MkZ1B=%; z_RK18L?>83o@o3<5S&OB#!w@w_Se?7EsTfL0Z|suNYeVQyVgd`?L~Q#Jw*5Lt6>%& zMbRf$8>`aIO<_NNgCY6Yy6R_>ac_VEsQaV#q<0M74MnhOBw;vwf?`T!-X9NMNLhVN zwreTerlGEZ#r&;CT1Gkb+qzB*m{3!VvhG%iE)G&GE*(H_oiRD4AOuzHy=WT-y)*6; zx>va%E?iNqYfEhHQd_AgpnNZD3;(ye|0hLE55`p($F&BV6Qqxq67aUZa!Tsu#NYWj z9L|kvod>FCO5=$NTnfht1O5 z>*c-2_3%M`lWvD4rGjQ!04-J8yB`NzZbaSOy5m&>GgN09w0Oi+>50=lgPs`baPRwf zt=xM3CDArMNlJUM7TOb(tB@@7%(-E~9V_hJU+AuVjNg2t0lTt5Vg2dvRqCx{OD!Ny z$aT)4?i^35J8*FX_l^w{Pu%Hd+1$0gSisg&xIrjX7^l~^wvR-|Hf02KNP5(waZ^4! zTdC``JeIYOQFaLfW6Ab5LkZ8TMCzhjOe2j2Srv4R8Izb4Vd z7?-bH{JqGpw)~T#O4MYM4Reo(muzZk>PoUxV9^)Q-2yBGY!xzjxSv*-3484_i{Mhq z^Ym`^r{dwvB;XZ>c9T4IBo6G7gmW^_G9GGc;XTlS zwcgNqHo-wDIHs}Jp2j;FkMDi;x!*oSS4CAU7XiX&y@)3+9s690pb7}e{3z*_2Kms2 zBrcGO2QIlk3mz?zlT$QjI1yj7`&5z0CVzw+M`AIR2U?D6OUzdEh${Pl_**yPd^bK# z=xkj>)k76{GY#m3(hoSUpS08r{@I|U?79{JI6P%#=#tAYBI7rXufKH2;kT`d{_xWX z1}+@L|0SDNw!vR{Vr?*QwnB(p26x;5o3YSEqh5TOQi{_-nLTp;MA9KzZ7#vOg=)fV zfi!xbd1!-e^+6WqYz(nLJsL58+Uh4URU&56T@NqD@uCp?$ipJeqJkOGySFH4*D0eW?h6R!!%{@r9Wrkv(si^k8{&w z^jAgUifQD9pz1fVkobXo|LEdYDoj~*c+fo^w4Y$Bx zz*^w>rJ_c<${3UoQcnnmuEpwWFw(1(TeMH(Pt=K-#4uLxjP6qGz<`fQeu#3|#*1tb z=4~PyIK`RF-{5IW4{muBbNEIh{uf?ZTV&uYWBgYD{h_OrQIoCj^21a~fd?ps1_w%o zoIb*i47GoF;HN1AMgaVk8g+Y9#j*QB-=q?Lt^`9f#*I44d||>Z4!JBY_J=ULpMaJf zTLpA7c{yYWHB(AF>{Ie)1|n`+6}6R>t>xR|%h#obAWlCk?{Wg|Ip_@+6O)T;h#nkq zpnT&SB~lkPLXx$n7GHnRT9_>cB!e(`MtB7i=PJ^nIlcCeR9bB!{xCv6`$stwebO-QV!SRQF46`&TamJP68FXS)t_EC#5- zy^p@as3Rm<@-PQcGBw^`>LLUa%WuPPJ9nE2nTv0 zIHVx|XcP8U@#=54k4+9aodz;uqOOs=J}YgG{DDVGv5+-@E%Xm%$}R|ZNe;*BgJ}Ov z*h!F6Q6*>5epE{fgZ9si!CXN}Ny$p%Vc;IL7ITI1Ic+{<5r0997ZHg9wp|2kEaK*O zVq_*Yeh}g~4CTnWy7F{1q$Pse8Mrn$*JBdPY zSM&19?RXtJmqUBsbL%DAPn2(W+`eJOu|Yi7WrQyJa*jVhT@?YFhp%1Gtf_Ru@T6cd z#iV`xrK?)asxD=JCAab=%O)}w%55@%%@=Q$zhq2yVw*8;f-5PQyp5La1b`9wx z+8s-DX@jxa{&45-+_Y)rWUfr?jIs4}5$eud+}x4#O{b2=;(U|_W%VD@3t}Amg=&7g zsbPjSrk6R*DA*O-gIAla8M{S;w%mqs(wPTsXG)8^zlF{)!{(~2rTgxR#miI9r=IlWkCw)n%?CBDXaST zB^j*PRfp*1xyaP6^>YRPLOZ@p_qsGRW?A-Ah|qeBS+cQZd(=d zU1!P?yIL}emR~LW&J9P^E$F(87muvMVA()8nnzXp^HwHfz(Jesoo%zK!fNUZ^*hqO zxz_n@_{TW{Jf46ZcE=w1P%GuS-`>O)DGLU{!bi)C`aP|qOoO=iekh29)W2;gK04~mkQtQMt&sV3$& z<$|-fQp}Wu(gRgE0u$@s$BR`COZCCFM!$UW99~(XKny@EAVB>0Ku*Wg-z{`)D5pSA z$1A7d!WYJn~4aWJ>cJB^JxwT)~ zVfM%n8jxLyMH0!gG;gL`?S~+=X&MJ9`!+=tP&&h8Ff<0AZ|sO-8FJMT!MKDHqy)k0 zuFU*55C$z{+;wKK!D{z4z+gxtfe8eiJU&uo!N34x;3z|lQRSyZpeYwN%|hq}8uUM& zAHG(QWe%dmhyhTVt0Ur&Y+q!o!_s#f;Q3C;fdJht0$yXA*9{cXvZH=WI!zI*ZhX_b;gi;|U7n1a6|1g=jnho!ELRYWl}K6NYPGZo$R3^HJp8CLyH zljw^XuZRA-oX{cgN}c1dv+H4DT@{XW+1~$BOC|w^(R}?~-?XE0PiFZ&m9XWh>}SB) zB`b@l&rOh>TrrbV@Gam9CrrdwS7?;=zMv|)ZB)t}6hZ{7Om$bQT(uLx?h$tdvAZ2k zBN0R`sA@}RNu?fCV|CNylQ1&84tL-53cO3Bur79 zuC+7QrONl_dxcUQ+UcIl)?xWKY;PcC_q38xWw70iZ$AMeKj3dnW8)&lA3i^Hewc@9 zH#&bQ4hhBMb1kH&uLhfOB|vMY#cT6aEQw(aO-c%{d)`muV>c3W+S-dinDh1KPIR>r z9$z!-C5=NCDHAB6rDzto>lC6yxU>>!QwSF|;<-L5!^QEx6Us_mTL1|bo8nJX{?I6b zmV6`nm-}isnz>Ka&W3+Z-D`(>@YSw~TjB80s?0f9qdfQ3RT~79zN|D?%AWUK!0V&M z8u{wGL>v`k%Y{ZNtiulJo1DeQ8mxL4KXlvc%MW38<4ZfD^KY&%prK7jXu)j5(~5^j zM%MmgR44||e8pRqc6x}Q$C76}@ZkMnbN+>FGPJkSy4$;UryAyJWXP=43+Y^arm)aF zECV{+iUD4|ODrGWz?Vh2zc4Si@G5nQZ#kcnjE0+klfVm9Q^!4m2x&DNd~o`nm%&NaX+eK{INfSfe=P47jWWK>ZENi(CY$9 z&$=x;+}7%HN?QvLsHMhca0St<3lCF(wF=TnZC17G_Iu=(+@9*n2*9rGFEIKrlZ?_F z3aLYn7mxdtrY@dk92YV#1(_E?nK8eC85UB!;D_PE8R{K_$_9KrcHg5V3HE6@Vc31m3)j^0#13K;WHIRAwjHK0)hO`fu>;_IE( zR@Hv$RvQQHhQKKo)z_Fn1LU^)VFvNa@nSPIN z6QNrdmJVM%l;0RM@YUbxO_|brA4myMvIC@$o{R0Fukx$V(EYH;XE{2#nCI6Amzg6X zvY$MOf%*i|{1QBCp^dRS@3|>^>6OqP#xSFPOny^eU%3tZ5b*I!I4Cd%hKK zm|p<-$icm`Dkt@GQ2w5+1v4*wpK7b*!S5h53cM{@jnKnI{s|a zXQJ}v1090UjH-sgXZEiYu^kq2$~H7XDK`Fs%HQ%gl+|vOy*P*9s#08Vi8SnZ`KhJ%ocOm$txd| zG*7x=veU);hPxZb)InN}s#oMcn8k7cj^o?@Zy+D>zw|@kjee#t&HStpjh9LnD71Fa zm_RGSv-}0}hxh`!r=%Fxq=W?Ju3}zTbUOz(H8mxKPX(8sI{?D3zN(I4&cMTyREqX? zuxGWJ9T8_#t2fF~bTjb7+&mGb0qsOKD+5=Hq;iHA@2wloBKY}~3j6YheS#qBhk_1cQ#<&*yts!|kkh|7N^ z3|@NobcE7tkArD)I9ZtdC3R!d3)7VvuhZ2W%-KTOM8OLF2q>~wMf4obG-bL(I!5y2 zvq?*JPJmL`Y$d7OOnbo0O85F_t10@+ma{axh=MQhfv>=zTT2Cyk+VPEgzCaNe`E0RG7 zk4|z_l8XpKotAPwHuKF#Oc`|gJAGhrH+6~<=`7&MHf*-A{iO~b%jpb49wusb*G+E; z;TM`QZ~b0Z?byG5($($G+%r6HR{-1*<$8Hlg!F3lbf|gB|4n2Ma`WTu908d%eMLny ze32X9ScwN^syEnx9xmW6OPQF&a?8CoN&mJB8XSdaPTiwYW!NT2&4fqlu-eLJ9G9xl z+v0I(2_5VmEe7V?^rf{uEFQ#~J82qN{CrbnYb5Nn7Ji&z#$i#)p&JH_&oGKwRk~X= z%o31M^(nm&z(@hBdDY5{Ov(U`z!2c}rn|{iP4Jn6Goe0#X2zh?K%%Xci&ygvrvO7G z)tv?9%T2_v0s9{Z+eY0sfW!1z%B$*oXHaYLT#@z5lcl*%E3k~s-8RdT{l4KsRt<%$ zM5REgD0fatc2>%*SH>D)+b!J6Da~nAIZWoStTgq!%f-f#HQEdjKifUC%X5H@*|{a z_)AnancvdT5VUr8>kYr%Bzoz>cTFSjLqP@HfKN-?yeiskPfHDEJWi`}cm2BC)wMKE zuaBLcW^dY9@!K%hzX~RW>#I>eFqr$A>D$N-6lq)UV6Ia`(2FxvKSs(;^rn0ehnU0FE-tN;-EoHF0x#EeTD|#~mzU916YiiMWvJG@ zsLANaE%8BqWXgt|7|dDTFCRxv%S;&W3Fk8;6^`=1cFj+69(dm*GnOE?mD3F=KG^#; zdoCZ>vw!FbQfXXvo{+>19fmS`I?$3li6`|km3EKAZ6aG$Mg3gdBA>CtrXMUyxsD=L zH>0n)HE8nmRT6%yt*|KTm~;V~eR+kuT$4vjoG8y_@I9btgaJ2ofqiq4U_jBOnh7(Hc^msejPmqih!x#VzZx*+^PDsA zs%i7PS&Y#c&3%^}jmJ)54n@f`_GZC;xu2-(wxmix8bpLgCZgn~Zx^$8H!a3X1Ko-p zLv0WAftJ@#1u4V-wo+keM&cDSKAHUG^iA^oz19s(g)*(_eZhQ90{pjN+#vQkZr)Ss*s?q&qs#xUBiXOIr4|e%dO4Xp)tPL z5rsoJg2K7tiMUdTaHa~o9VM*rZgza!p~MMckT5*qm+2)!&BX^ZDX-eq zb1ZqYXf9%rc%WBWQLa5HAfc9Y?21RQs+u4rwTLI0PBHLEefOB4b3z1Mz#+V1?1 zjwgqu(~kRtvQYT7MwiWx_3vI`NbgBWf>VET{km<6=k&gDP%}%kSXG8%ZT6q3Qrg2u zcM0GL(2td+j46VlOUTyCdTf7vXx`?JkZ;6`$}P;}q0grW*~Vqjp2x#E7z{!)da4<( zAVlIfbWvm}s~Z09DwLaB+7HFC5({z%RK&2dk&!|DI^SALUSYYU8TLD$(O~Q?T z+cfc2d);jJ{bK7O-=3uOXXI@`lPh=IT?Gi&7A_Z1zGaSxA z(HL)yqn%JhQbX*hUpO2F)uFsGgdUBhW>X6GL6Pn-t$PW{sB$oy)qM7ZFHYFZxhxTf-~6BX!}lt<7aBvomKQBzpk$C&z%srQNF%-&6`?_A^BJGd_=ut zCj%x+bD@E;6X(cubv}|TEpBe0S6UIJsT? zcQ0PfHt=`g4+lv$_FZ3%xKQSF8(lElXD4{>t7`pYNLI7#d1%&#EOBtFdsMYf-?OYa zYszAjx#=DF=E%&6Ljm^@k58dC;FrTWKo~c{2nS^t`PTCc?Q8Gb|E@vaJNd+x!!T|g z@r>Dc%8`3VqMz%R*UO=rtJvf|9`5cEus$BlBhiGs9M4%lX)1xReiAzG#)7`0F!Vo{ z^gLS^{T)pDDB`}yN8cDX9!GcX2j$F`V^AKIAUC1F%K+V~UV_l*syd46T#pXtC0!r& z`W4{0oF_Il_lXyscfFEiZ!ejgRpFH~71mkULpF{<(J5T?fR^7v>0Pu+uz}DlGd_(7 zI|){{p<;_1FY}lMvxjKh`3J!@u3_<(ZQrheFBgE6f0ySCB}?0ts!NIa{n9y$wflBK zi=%I9hhCuhhwpJl^n>Ufy^Kxlm|%yc5*{dfj9q3udgvXgOkRVL%B2epn90SS#Ti^A z&LUkjFzT*trBnO*QRvZ5_K(QZru$OnU!cqm)|b@44}2GLCA%qoK~(}vIKrgcE>=ZK zB+3RHRCf3>?aNjkD~bO?jJHEDWfCYWI}m5{zx0hvOHE2iS_EfUuF`YNFl~)RM_g5v z#oY2iWLb) zL%CBLKjJ{Fk|>wmUl*-&Hz4*FC6-|=%=QGNJ|W*S^q2eB00oOTXGr~J))$lRAjwh~ z!{-{=l-FlfiT31uY}(a~(sBhx=r2rYP-Mtpl|Z~_KBzW1%SP>-CHE)Pv-uRurjo?I zj{aUr#pV;uD#PP>|C;aLXHmpfb|&7xO#gI-nP<_dR|hS9X4Pi}GmF^0HMV>6<79Ef zvGtke_l#W?Zme6+wvnk(;~plI7kM8*!SmZ8Qgb{anPLv8dd8b7QshNRtXFa0I?*ED zqUiS`8b>Kvq|a4WNa(zlhl(wZ8ue_?jlW?7?gCM8Duq;2uls4mw@MO@XcrwEQdn=q zGgWAL`Cm5UUr;flR!Thl^jg3yaIJ}oEa6+HHe1>LJ|uPY(mp;-n~Bccqx^?VHRLdP zh;u%5em9PufMs(XZLa?$tnc-04{HE9=0a@16{Tk%u~$e4kEXBxqTdx$>~W!*B-jf9 zhc0s(qhK*3BhDGO;Aiudn2t^Qw@vxyb{^qMYdCKVEZQri4@SV#F2l2qdhOTXSS=mQ zUxT!Al*M^qisXe+=lk@Ersr-UUqEiH|7B@Y_;+ucVa>+Ns0N8%zu)zs{;V)li5*s$ zI4XV4Crdls_!I-LMyEd8a)MWF1_lNxcAgupk{H2DPX13kP>w$g9=M?#JFa>ZpqCB3 zJNePVw46o!W57QY&FZOU)<-UDImh09KE7R4_~mund~SJnR~fh3!63tIjmhpRPcryv zUOf?IAfva!W}M*F7<9ADtNQ;U4BymCl?*JXy~8HhTpg{wBl~yfnqrPI2Tkl#=xGN# z@`G?i^qUG4pW00n6il-g3-5YGoeQ(QY_D!^>HwA8>MH+jMiVSlOe|y8ykWo`$qCW# z=5)>J;Swxz5MDI0_p2a-&j4nn8{y2-*`?O7?YXRROKg7BKvoMk5y}(%qpe~D=Zu2p zS`mf+?O-8Acx6o#s5Q3C&K&l%)}XGMe#aTN##0507wS?jtz4LM?z`LJ+Dj*GulJWF zYdBx>a}X!{zR!zvY4qs@daP%z5T<5Jic?zF7Sx_Gzd_yG!uS@8YwfWOCSwMaQIKQR zTC)LoiLvS|c*(<#1#|s(7WJ+atRu!$k-U|fw-%eJyL54Q%x^RoP;5z+-Rn=57dy^x z-zn=gxHfnz@~*j;J?hV?jLJm&i=BE5&hU`paVvc7C=%UmFOQd%s=@}!DEN4@!5I%^ zMGjbk&F>ihs&b!*zT%+wHDrVbhs-9ZTpU)Tdsx*L7u~YoBi^HBg_X%xL3v^DmH({sm+e;le-!vBvX{nG?ZzGOdfBDk>X=Z zqW3Gii0QUSMS;5q>4q32L~jf=8YPSsu5@kK36B(E@Z5=)-C_4_ON;|+1oC`x!4FPn z>x(G^9}^F}i3K=X&o>v2ZDd+eP>eTq4~Y(tA`eNY8L7y0o!=CFg%ixugzwl~6JU(J zx3Dh)?uLwTKIvYZLg~YS8-nZiN@mE9L(bdaOG2rl(QFwTd7NBSY7koHHo4AnhSNRZ zTTU_@#OAc_bp^JgrblS8Wk=Wp(eMao3Aho961TdrIDEeXIfr2pvyXbvjcyx-%u_Q4 z?rp^R@0DUbFHcm6Isz-~?kQr~$BW99C<WNOzJ+Sv zFfBBv`84G(a^z~Lt>bY%-_7n2+{#6409aG2THl$p+m~3*e6X`9;rVdDrPdA_r%UCb zfrEn+-HF}+vF1D7M@2Dx+|wOGfE*@7&m5Gty1Z)LLz^9$eUDVT@bJn%W_cRQ_sc@r z$JIL8rd#jYec|8!94AJP1u1=oBz-e}jCsiXTA2id4yS#4?T7pOF7>}n+_7bEp0)-O zN19vpA8_-&H#SO$=*o-s^n0_fdq76wuTEM&?`%g_wh|w%93dlr406t)jcsW7KESeDZQA(}&J=~9Ky|!(5nswnjXB4i zE_#>Vi-N+pNga+qL+iepAHRVY!Gnx)><&67*SJGKx!!unhHVY~cx>&2TfB$X$Cyj}9^Ro|c#4NtUbAHv=>qvD zWF_AIzJ7mJ%EtexU{g_eUFCA5{+k*x%&I)Y$35R6z;m=>UMYG%_PtX#=;mmD26{cl z<{D->QWbsZrkTiTdSYQ8`;20}wKAi|0I1~|2YH1~2*=|;o3*F+Zsu9sFjQd}OXTkm z^5yQW!zJ=um~aU5ChxwXJtS&gjxRSOf?aq*y=c=ByT}jB|IEAv!sYKvWf`;}Oo5k= zCrdtm7GDj2)^r7d7@IS2ZNgOg8pOB7&Ee$;TCq*s#&%23G4lQ7aq-(!U$1`+*Qk@1 zfs|#=AF>DND=qT$+FZ-LfieVIa8P2Z`|qK9RnK)xd#xYT#zBrnYPSWMbfO2H1>q5g z8Ck)^bum0_QgCfdR6OoG#^T@Jv2yQ+A-8HNL@N~aRU=v(Yp6ga&8yfl@DL4gWU)aZ z2M8?@gZ43zIqiWOvf?pBmqpvQu{V4Fb+}VLg^pdiD(nPzYCEx)=33Xg@BMR>UroY3Hwd-!j) z`9Ei^E6UvD)eo7nKa(*8aAKa}*fy;M8kGZ!fGu{o+%@qEaEc};DixG&Ej%Y$6dsFC zJ1)qvUIodvdZ;rLCFKmk_$8_5?t&b>_LI(K|JVu6`i&Q3d zB`aMR)?Av#gzCiGQ6o)yJ&r z3l!ho3ImZGk=a({ne9&)jyeZW#C|gxGbx0+A`=+;W1N`c!P+55%E$|$)*F=s2L8)s z%d1bn74fc=p_05Ia-lJZ?}_887;|nyKv zXZl!jJAyJIf9-eM$8tw-lxunNOQ@>DP=wHAKemypZ4pvJh&hKz(o`OT~uDnIcH(=5BMA8=azA z^z;;^y$^~82J$l^vq)zN|2h&n*O6*xFt2{FTr*d%O#(0Ve?_$6PoJ>}K^T;tpFsew zRh~yyuMQ(sI+Ob;h_ILWSRU#uZ9FD}%|uK;5xf3=YYWjBn-OB?&hARgDU=#FJtHd}|#e8+F(x-dGwS z-KMZ*r${+z%o&CR;g>_rgXheAs{E7^rCm@>nNKIkoxZSsZVQCqzS;V)D{a}ow1`)q za}r}3?3Rm?r|^lbl@V@1T;H{d3Z^WUA8Xup%un_$0%PsY05y+AUq z3eR9cF4cUV=BbPjW^tSIIsx94@|F0HlM}~2LhfRAd4~CM3q1PPNUHVWvKU_*%0?0f zFnouwO}4-&+@a5-g0PNe_5t(8Nr{R|RjiADl+Nidjh5%W?mcB{)JU@K%XIG&aqyhB z-osYMO}bjyLN~ib{^zM*&C7(8`!KnJp8mh7w5DkcI|9i-K2W60IXAs*V{l<^jP(y0 z*Bi`pCr$`v;{^KR_0>5po84mrJCQr5c09JYL=0x))TGt|6~yB~=oQD#n^Suw!BbCw zPabnez;VMI5|2Py_ZESCA;nUjUQw1v5G$17d+>l9Pwd-x zt386L?Y9egOJj&!o}~>D3i$lz!0itDiuuLGpA-O#F&EdLHUi5Q69%*| zEba@v$S0+kxconGPK3X6_u93H^04@=+vSvypAz2qMmtVU zjEIhr5)Yydo_gB!N}^x9b@W>MeI9SA!#O7#Wo?7u5tQR+9s%!xWV3}(w~P#~_RsCP z5#Tly&%?TDKCDDWRs{K&gu9=%-PA5Qwv1f(Rdzi4PKbVLE*LiaK46nIjiNWv)FwK` z!}8@Z&i5{4b#wZtr0au@Fet$;k3Bp4U!`YSeb@U2?JWPCIzvd2fxFjc6-)TP%9wT{ z$&P^DWE;Q8RXj*0PXQ>qWzCA(M=Lptb)uB`KOEH*MohV z9RX_feN{hZH@VXqibMw8>M{&fA-JmUVViAjB=+5$%~^}({S}%gw!nqAXCdu^jW+DJ zn%v0sVVKrM-IjO5ZI)hHvyET+^fWR?gdfrahXdDB6^^##k}*VAaer?kLRuURD`ze{ zjDnh9Ojgn}n6HW%2N}CJ6se4H7oWzv)GrlnWNkzOB-!ml{N=}|Q36r$FY>2Y5?BJ< zFY`aMWI+*95w^cPoz_|9_=FMjyN3&%L14)HilFpIg>LkDV#KXAmfT*ugt!6<(MU^= zjp{sR$xseHI!!iJzsyM`q^goQfdd>ez*oEp<*oLOT`{q3fZ|_C=bA8VNt^w>fQd(D z1NuJw0v<^gWyMW1c8$N5n?X553@N(@s5*YW7M-2@tN}@*p4_!;fQsI0+mtLcM+heD z)Mo%Aob}q6xrxEECab=3C<&K@$|qUgJJcesIf*g$C0mIkb0^USTTV_4%R`nNiv*d`p@AR%r) zoUJeey!lMbd`2aoYcfS-t~#N%u}bMV3egtLWCmT#q!&Q=%9_aq6a`vHz_|<_=Iav& z9#i}t-@xR(-nRVT>JR4PBACHFFI4^xKdoad2T^{SzheKOC zN#0o1ZV7DgyBK~azo#%8-(OvpH8o#4J=F*_Gm|<t^mn>~x2fxHl+w&W&ob3Aoy{r!dIp1!bGI(wfEUXzH-usp$*LF((zh_tMqfIJq zVYVO)k5cfylq9ALyica&oRc6F8rNH>vJK^kN^{s8Qjuzd5XK!)HYilAlc--~-RsNz z=dC-Oj4xw`4B#-5^_i;;O`F$y)=9ieX8cmQ3LL@>Im3HbR4&A=0m)+qh z7%ss>1373Sj&T+a^@?M6>L^x3>kg^WW8Q+9besw!5-N|Y_wQv(H+a<+_HU|U5H6kp zq{`&C1$76gu3owMK{3Cet;?lSREwDZ)SUU)858wj!#-!y<`w=M_YtX0@4y9%)EZ&| z&ydjiA8P?Ed%xh;XG~as?HA`-zI#58g+uT}^1p68?(1yPqv{fAb^$>up0| z>w2ihlr7rGVNi(eFO-o9MGVUvMfVPSTI5($f>@Sh637gBrPj0YhR7Kh8K$v*>oR~T z^m6wbNALQ~Nd&wfX~IO#5n|yOsNhjtH~=G{M~QL;2+rPW=;TRn|23DRddl84$>~0* zwPSlnVb0~CeF#{*tZ*?Xo=sg}z9#UctG-N`1dP%jNbBgb#VUK=uyo5_8D-NMe0Go3pZ(Q6jh%tE(@LE(OIr?=C5=4b>{9=bGJ6S1?S53>R z-EoM+0OmkHV=!obaa=+)jHB+&r>)3>2h@^`p)GF2Ljh@BI zaqh|FSAv82{dX(a7+W9qdIhJR1PL4r+9=Up(N4?~Xmeg@H!MdK?;_FqK*tskWJ2Ae zXtLIIbmUg()P;T6W;8-v3i=#l05Jru?B)ipV*Wl^>sb4}OOByJ*GaFD^NFGfcxjiC zhCVHo*SE0CQo$&5>6Q4{u}w*Q+w)YK17bX=5s}*0?QZOBX5b}u!x~qkdKWd-mTZpH zG4jjfzo}^Fz*jxPVbA79yu>IC=*}I~9ofzcI7v}wJ{*HCm&0G1W(Bszu_TgrI^`eI zNFmum13fGmxkD^Edw+{21Lohobn_CXZcNB!OQ0>SZ=gXGNSQ44k#cW?f{Jch4~^$m z^>&^9QR$^?sNaXi#%D2Jy`@tmpEjL+^+l*@bNA_jYRJ4t&G%7|&&09qt2`{~rMQyU zadYLxcRc%>80*m{CkwV|kIC?b1d30dI08@S6*1(eZF4^Iu9WeF#nA-ycu{w-aC z4gR=NkYE#mpRJFgpqc6JDJ>sI`BZQQelr!jL|LS?b#|-|>jDv6C%r|~e8)8S)Bmtq9QPm{@D}M!9WvVz|CT0V3Tq!!! z<28JCuBR3^ZhF5{O*7#D=Pc4+xZASTE%ZwG7|!Bc9k+B5=z6MYv0(`P2OmC&#SedO z32#2~dlpoc9@kHg>{e^=NB-dLJf7#LJ@EH>fqwH|NV`_A@LGo&90_El%HV3Nc0RQt zE*#ad82b-p01G)Aou6_bw|Erv(c0Qts>?JTn2}8VBQ(;3aDjqNE)kuWb4@vd0;ckW z_k{Y~6te}pyCTN2F7n&-#?4L%>P`KZ`E=00KUVv;uP>RDD69__K0Tw%?clad9R8Et zNC=I$3mr!0pV~+Uf1}q(vmhGIR%coV{$!cz(yUYeHF{Y@y%OF>TvEPr!dYI;V(x~; zS87ooaWboU3!|T6DuHgum~UI0Ssyc^@*(nRza1y`Sj0}*s}GmR);|db{_3}Kb`46AZ)=bE zc69@yu!Tg44#y&4%sctxDyDW`4-zr9^nq>N4NT+#%VtC}Kz@$IHQ#pb(G)RyKNr*9QLA!1dH{vp*8jP{cTTq>MB^3qAUm z2&Up57;bo(;TTsjTdsBF?X&075bvkde>Fl;L=rg{H9YK|3(fPH<`H!uO!7v;lBL5G zQsDil!5ifRKEX~+{GiIx`cSQs>zlFKB;fZzQ|FGU+}W^Emv8s+!A3W|Zp-K>n1q%g zpHodw3nM~7#I9{DBnpBJGPvbm7H{~2TufwLsVoaZn+}cyhc{UIod)NrD>OR1bKgE` z3v8f3yPHKJt<>#6lMCwX#0?|xn+s);xUQ2(|+5sp6@Z!czZ*w7^{&jB|OQb_R45!hW=h_=sAKbn$`#m@! z=JU?CZv28TyK1+`N16O74tm_LgES(-Yuj?W*X`IVbj!mWl*41B4Gj%rl{9vY@ceE% zs(5L!vAE?3TJ=n>XWEU`+EdpQDQR>hRjQ25>#5kE+>* z6B7g1XwXM{gWBTsSmHWg?WZ;f1JJhB+s87s!P!K+)a^h*fcOF2LUWtK9pCQyD^nfl zs?(H$!_-)j+Q5o+F%BG^rnMPHPI>SQhH7i$Xod}ZjVUrha#0y73&3q4{}yK?7hBOvi?o5}LmR20C zTh@K9TKID)F%G;HKUlfXHppKv*AWq1`ZLes0Kkf0FiD z>8>Pj)v-AfEh{e$jVQ^V5p?DE>H58GJeTz*Mt2di(6=ooZpH^1p3w^+PoU!8;sn1o zSs&0o$)v(=?W$BG4dj4p=n>Z_-7E-UD+yj7XIamo7;3xq2ND^756M_XV24FG{G>x{ zA9(laJD#K-FC2IGkQ$gLZKRYScjH*Ex0nI{o}(ipJNuXXyMePqR3%SKpQ=CgEzfwo z>Z>tC&W&XQ>eTptj8q&)DYJw$#-_MO&2xP4Vv_#^mUjRa-nBp<4 zqSjQ0!|<}&eyjuy&+Y#cqZ+n98p_wNj@anFpT&O#(+!wgo|g~o`uEK)P8Z<)fPHtH z*gH=>>kd4m?oakqcF6ukgEp70XH2x`l=n@kPYX##y96l~C!a&;!veE?ikGcvW}r|c z3G|D_gsC3G7mxObrNBl4N)UQUeek5kar{`^FR5SOyf^kzhxrUB@CK@D&#DMw zyKyJb5-IJ&Qr&u2OL*Z{^QtRmcu=2QIhTN(dX~U2?AIx zB|+eY=0{b>1u}NnO43(j@D|f!!z5K)5Tk6SoDx(ENJIXsEJY^P;dWx!{91o=tRa?j z~DpF44k;}2jwoEyq`qe8ou8f-hT^J=}k;yVw;%Iji< z0ujbv68$qOJtH8-B~i`502RzEUx`qmRF>}c13!`8_9e$-&Bm`|(Hyn;hhW>)`tOHR za}o5$yB*6|A)W(dBXlB&7xR|)#tt&49f}E-ZYC66a;pRo?JxXyi~qcYW7bj?f7aGV zsMI^4{Bn-|r35~+wj%ag_ng)TemAZMPt4vm+j(ZQ>BtF&{M zp=ZRlB|%#vAyg(noBI{5x3s+6@9DtUAgptC&FzmtoRaNb+p<(Hv5(B$m#S3*CS)rv zy{rU&O%Xjk0$kN^-49e>1!Ldqmk);gX4c%Y$Y?Th$n#|58g^XAWHXw2dpOy@?wGIT zaTL}mIe&}U&+6oig8!Qo!2mRib#{&sg;u`&kjk*HpiDE zPu)ublkHmdbX+Je{a3at5p?`w&&0t1-sDSa0@3Jz=mVakZRi`-<{h`+JPG_ z+k1ID==V~rKV`Jre$W6Qgs2MD;|LMQ|Hfy8Kr(esh+Xem~eUOGv+| zbNcHE|G$C|#N0&4_QBh(@rA~ClJ1BD0)?@vg6{Rt1!GqL=i^=5yGyw(>fsB;KL@RS z)VJMsrk^;Sjw&!uZiqR;MPT0nZgmDnP3NOTe`xyAZ$mdRIwAc91?EjY71XD=olGME zaYiRs@{f;782|Y5^eqA2m!&xC2gRT$vHZphn7{b(a`A}I5aob}YV-}6)&IFoag$l^mOmE@gQXMDQzE7^po+w_!iiOr1?|7Deu%oN>ov1bN&oAao z53?u;yC+bLz;1{YxH-?McjNs48a7Qd$huXu@hpEmo5;`|r`H@=-QgJ{cR(s^Ms9u< zKoduEh4;}o4{55Bx$IkRO0H9~s{#v5@0--Ec$WJmcpkRd;0`a3^m`C?g6Ij^nHaAi zcxyBYh%Kkdq|i4{DlOc*%u*O2vT59le13C5!wYW@M9X}~g@1{n*w-xdTP&qs=g=TB zL*Gp%MRIc>^vc&$;+b!IZP_PYUMvCahx&>XfEdkptiC7ltQx$TPWO*9RO_q<;L15~ z2|zeW;0zcVk zO76tj=o!T zpw{xCi3`R;pISXsCsvn4zz+j1EkOhwyR%Y!KYy%0^IhH#V~c5sIU}SY?3hG{Acx`f z-;t{2alYWFJ$P~zd(gE>YMl{~9E=udJs)&_9ZNDXCE3l-sNC$@74!4N-ua}cQ>Qr( zCV+z~=5H_dHiZpI6|C^k(SV()WWqX7_862+!N`wxkQGi;g;p;GEYq1n)s)_ja6S0T zA}B^S3#;#^JEhfnihuB`;cGHJhc`9(DS1nqKy7@ka9Uai&l#GiM~T-Gxa(>q?&P}g z6XuF>Q3jXi>TH!H93x6l|08B2<)G5`b`o0)z}EnE9&;D7P?&6~vNr4PsXb@W#!=qQ zfB?Z@-_{13v45#^qCDkk@ckct3q_v`px4LvX58j0Z=7OF@ z-22)e@_fV{g|a(Bov|)>PSrz1*9n3;)IDI-f zf6(bM`a=xW<(kx0_i~RNaeOy3=v7|!jY_lmLX+1R+c1{K)Qa#gX^y}Z%noX40k8w& zJFtAa*#iBhJ)y?EFSPh7y^+VwPFs`yRrGQ3Hc`uby8y5nVP)v-6dn6jSXL-Iwkl;L zd?XQ6CcYu4=Cc;dTdg%?9{~4Rl0CKu=Z{x+Ftqh+?9vZqG}wNOBPXI&c3-Pm;%D=1 z88EzbFGwE*X!31H-L3?``s)yVGD$T3HU}K0Y8%dVd(03`gys@eyz+~g=l-wVjL)+F zPUfH}+=_#r?bDOS$eRzH+m=!a!v7zoi<1N6xG=f4t3&D{CQZx1jI(&>?p;gK*T~ty z{wcAm$B0CAJL;f#6)Zw^C2r$lAd?JMIxoMCsR56HUPRH`ZY%LnTGh*78b}jjElQlD z{U2tnr&`qY({Yfgos1Y!NZ6u+P7Wsy1dJ}@9GYKV0K%t8w_W-wU{CWr87OQ|$DJWD z)b~Bj3c87n%fCIxVg|Cz(A^EaNPBZix=)tVJqOY=0x_aFSy@Kek>OwWVknU39gVLn&& ze2uN3#__Y8)ZY+s$gFe9(SQwOVmyu13cCCT*=Kw(KrE|*f}aQyb1-44bq%3K3tE!- zr&hxq_=AQGH6Hc<)Q5M&MkN~EZ6l@>HC(3Kp_96C+@=EJ@D7=}`1SJdcv7dWP&vNP zW$6Zlz9YDd_--ZXqs)<*S+P(1lZSzWv^R@*GBO2F)D;lt^hST1NI)=dkoMs95!XDe zwV@NGO6`-S-549rZTF{!HB4lj$ZpaA)Ihz5Xiy^$POSR;g0it{rF1_^Mqm3>_qHI# zIeBi0ee3=-#?+Cg$a=ezGu3exBWYz;^Z~bW_WSm<6)~KSj?6O8tkqe;iZDL0N#uo7 z*O?oZ=a~zGr=^_k0sy)Ml9Rd5o=HRJ)FZd9Gnjb3n0#&k1~#M<<)tO~XflLAiud+n z%Vr?d*5r_l7@3JaybC~O(>+7{zXD^jqhRO!PR~oRPS#RaH#e%D-#pM)ag5?Pe9V;_ImKG@cNZM7O^BZ@(feyRotdU6Bn+a(jgVd?9;XFttOeb!1st27 z*ZCu=qddP8;oyZh(@;?Ydf^3W2P%y!)*}Y}#{#d~i5)7`9gY@nA?`0llBraKXE4vlUJzESwk-H0wwRQxO~iI6i^Y=)mK#m|YyB{I--o z!#|`Du!ke>b?{c#(&pXC!Fid-5bt(fjeIEqWmmPmFDunq+ma(@bd;x3{MptGYYvP% z#x@3u5>t(Ag_IR{ItR$Ig$gvNWqa}ldi@zUVGF5U^OT?o6t}dz> zlMBeyJTm8a^r!v5-L5l2{;vR`91B?P8`~}`+gFDA)p~tWR8!J|KYIR%MF#T;Kv4Tn zUmHTYAR*0SRlmyzh4CP3^{g0`WDn6Vr2+%-xRoT$5ofFD0x`%ZZ<|6n2Z@1&rC^ME zn1}q)&G~IJJ+7>Nb~R$%%!wkqEk86A3(gFG(S8p~-(1E+=@gW+?P|P(^jnX>hDqL< zb0#{ULG78hN`U*)<>TCgfrWusH_!vAcW~brHol`Tz6=?W2d!;7zkq}*Gq)H`K}g*+ zIRLMdb0rk(NM|#}y}eE-Eei>Rff1JoOX@5~4gS*lJ&gb-W#AtTq2(7??wCFc`3F`B4yj?rmb&j*&nn4g%eJj->x+3F%M{%3L0Q*C$n8Kg*8FulVwQ07I z#=IWVW<_i}yE^Wwk1$Gn!~X4@>Pp%BjQ%z-ZY2|vzvw;K6EBaOYmAIq?^HxgRf18K z)ZRQwqpc!iSdZvlv?-p^?MV;sPr#<94}Xqx(VhX|+bG=%?yY&uv_1-zkbP!yI391z zBZ9|j@S@7Hy%|sqwWTiCQ&jfziWqOrvitqnsH;a1S8~6nui|n0NnwVDIK&zVc^JL& zPnn*a6&9NqjO)G=39Sw}{MO3pT0zeSCLXf*$vlv8O9%z=*nwA=`l{p(M?E3P0?~sZ z3hQR18ynt2h2Vi573u+sXmgfd*^EKFnB)=2M4d`53RR!G?KRb|O*&O$l4Nn+k>QAB zhhMQZ57~IzjeDnNc>JV!#D3%C@|J z)ss(&|E&vKszgemJqMUb2FNNp#*yNNKwGj&fODIYk9D&zL-f6O(_GSsPo?AD+zc$qP^(zx3z~apDk)c)`4; z&$T22?-L~Ytj-OU0g4jQt2oa@&BoI*v;`1VkdVg@pU5hUG&+*L^sFLba}4Xy4NgOb zU&XkfECq%qvoh3cFAbb);9u8J1MTAAyzmRAPx}w3w4D`{=Rk8|XT3k$(AzW}7e=_~ zT}Dl8!2(Li4wD!BY1Xg58GeJibPl7{Z@G+Vg{rzU9NxxEsrjG42U&#A0+j^fC6_h* z-U~<1s6S&Kzn#9zl~f@SvT=$cG^tJ)nAT9Ent^|B(bkt?K96;_sCsV>#Ati=VkTkmX}WnK z%Ig3#qoq#qJh&#`zRb;WQJPv2#jq`SqvSH8)`Hz}?Z7-b%Ym=|YumwcpI(=Od5^>p zQLrF1JNN|R=RGm_N4~SQ@{gdu5Z&P9R!kq`oJHemjLDTk87VsrXt|#I+|v+g6?>k@ z^Dp0<#7vUayV)^qHFKfsBVY=G{{ziSCAG$~Hlje+-UG!)k3}Jn=r8CT+lUhRkY+po%9no%w4U(R-jVFg!X!O{nCLpRj1u4{(# zWZ3{f-n`kBRVE>>X`stC3Wc!Y_{zewu#1H#9TY6FqVUG_F_fw(3b;~SxnIPz#GA6v zFkGt7udEh?2MGj^Vot+v^VtyB=#4UzZCTtD4gU#S*U>br=;8^M8$uRuoInTS$1Ce9 zj0ozQ1U^yEdHt^ytX{U)6qTc8QyiS&5Z1AwJ(j9Vb8bRdP5%uu@Fm7m{GD@5^}jA~ zU|cQ9!7N`;$eVF{A@eM{rr>dyuYDI3M4t!GW7a-8K`RLZ0fj}zdYTJu0SfX@u;>p< zv$%rJ&N8Jkm4jLfF$gx*ja#m*J~^Z|c%3O*ysA4|oaO?Q`)aar=(9w9tD%{wIa}j< z(W&~junGvvNWw7I8fMIeHfLY0W+uA8^K~`n+Qt)+s8nihI~ntEFK~)Pg_^F!Nf`Wh zKJOeVC#p!$Lg>E+_OK*ph!$vt?>~>zI4-iR*QUhda`Hx^w6h0gan~khz4gJdUzFKi zKJwwq#CWEDvC>2&$PrbCrbS}y^ zAVTU|WJ%BO@Ufm+W8XJZqtb+6iDk}npPkR(QSG5Nnod&!qG5Bx8#1Q@g??4(k4%kh zO#L!b3TaQBmo!F|N7j%OkA`5F;|ip{CbBbiO30*f4AJi>GIUc(;Ig?$-xFS` zYq3Y7Mn8(Fm%+s@aeK)4_$|;1IZz->TjcY9c9Y3Y>J}v(W6b_VYZtlbg##mlv$YLV zyH&f@mfMw6-9`)d%1M1>HTBKkMZvE3h6U5?r84Gy>KM8p^J=3s@M~K_2a=P|n=Gwy zd|b&vyY09=18OQJruTLfOf=okDOAu`$b&f}*ymR6al6lVi}Iin{2#Efrq-q}ry-#I zx#BIuL2pA+jC)>e z)|)=f$C_F^^XXM=%Ziw9EUMhAkata_C5WB>i|+ZiaDv`oWDlF-hQ`s=u%jC#8<`5D z$z`@en$3*?iw$>3ZK4t{lh|3ptkq(Zj zEMNOXz9rSieK-5OLFnHwOO^NAkURh8ry`ouF0b>MwAGmbwt1k)buPu>UXIU(XQF(q zGAD0>iT?jA8912`h`VuQHPwi93rjxNWZrHegD{jLQTuNv^SlO#SSAi8m}r!(_zKA- z-8iXB9abh@K}^iI-tESDk2gor<3tG<0Vtm(6xZ4kHBG0VtSznUop*>hm_zuQ`Pv`JxdA54o=*k% z3&SZt`axLIY{SPZG9M*Y&|T;I3bUHvS5=iUxSYp}Qu?EeV6>v%fzamQrchI@%CMDk zSgmD2&NU77uKrAksG(?n1n~Nej;u!Odw~lvt$dbToB_}JZhnz z7nu4+5dr~(3?MucLbXDVRx!}+vn>!B=$)n3)ce{7LEV_@g>mmyw$9hyqT&2bDO9*g zGWS0q;+A#kUff4{u#4uB)#UWEyvoUWM{{?5nWJTq59GGcqjd#C{4{spE_68=MKsT~ zqD=#iNmzcoJ>aK+8u$*YI=7s@>~NxJy^CV2QdzI@c7G`5x@;3 zfWCca!YfE5&lnTin|0Vtjz!5q!$P?~R_hJ@M5UsqlQ7y?nKHdqr4E7P`T~d^zPR_V)7~Nq)zmqn zZAt*RX=fB)E&|3j<)PtARION(2gE~hX9`(z{$bx}kJ>;uU00j3I|$ne&-05{{PE}( zyJrI%cK0dDJE=LOajq+5a3mTUQCmIL^tKlyv^y8pC-3@fi0-bkbni%W4tOq|z^`ba z_+yW=jGpCk^&hz!kqON|g1Ia(9?WflKCy9UbzS9kYC3!c@fu+dZfwyna7p`0<$U@^YHPFL9zzK$GLX{@e@aa9zaCxr@)ngG%r zZ2Znpe8Lp0d0I_B%XH9*B-Yt#_H6QYBL$o*7C&0mvOn4{jg+Vcw*hH~?qhuWgzoA8 z9To|6a{Ww)3~?VBaO2y>T6*}q!QH9U7F@>MuJt%)-yqB%!l^2|kSD!3;Nm)HOyE_W zAt)B3G~|ww)E;*Ru0kS5`pYq--UOlHl!O-UX`e47UWfakGHoPHdfueo9H!S+3(` z7&%t9c^GcBe}@r-8!FJ^LNfz9)x1qMYUi)%%JC1{Nfic$PSPgI_HN{W;m#6V=8SCO zvCxw%VGhtm^nNQbhYP`6;eTjFmhZB|KAtXMYD0`Jt_YVc#Q}|!U>+6gWTfVDMO#T} zBz0m!9&bHV_yhYPTs+BT_2*NMaP)!KuWgGouHZG}#`?>;^}HDdiGIk#(lEAE|20AlTDc1G*4hKIP#f|b>3 zJjtrr(b}I+Y&Cu&Wl94jZbpI($1Tg(1iKG2#MT;ycY`(UsZE3u?`61DYREZ`^h!zuHw@fK8%+i_Kx{I$|$Y->=M#FHPSD*t(Owy_xG#xHdxrMKsEG?@yb$=&U_GXG70c7Ui$i$;`jQ-0jkcjYcWsHS7er4VG7gt0 zx+!Q%;Myl#N>!NgF8Ix-Bj|2JpYX0sOXqEi1^a>qPeUN=4d7>^z8Q1641Gws zb*RE+A2}up5mL3{U%EwwmUykX*F6kFTA71>)V{O!r-dP@GNg5nWCiyE)J2$LfZc0~ zz3HBj{4sVao2##P495?a2Jm&I>RHWLENN0rzj0v-=cr^Gaz-|4_f#Z=Glw(xAuMB# zfplZgUfF4WD5vMJ(KPqUhOk?h@DRn=vkcX3g`*aBmdd)2nlKJiP~y9PpOGVU=Dh6V zCRiDsMm~QTqT%-Yb8PqJqnXP81rTCe&JfA*FqxF?P)fy_-;Pw9(S~$@o#{~sJ8^9` zB>%plM!HoT2rw>9TuTKdDfd~W(T>JVxEoh@X~BMuWx`)prIii`(K_nt9Wy1oYs*G= z`5C+EG+x|?!dpM=C=l~FYZ0}bM)-Biz?x}@tUa}I*R9#8sg2!~e^Y9R;^~tb&r)uC zWm>Z~8{-6AC8k2HeSf+9z3v-&1y&=JI&JAvrPep&+n{=gmNB&~T5E|#d8r+C zK7xWKj);P1r_8d5r$DJN#3?)sMw5+@ja-xpS`TsFChf-G(p)AycpHkwxySZJlyV>H2vtd%ME>h4XJ~R>K}3MY&s@4sM&LJ} z7ToUs{wheomZ9bR`LHkH?GS+4_3Q_lJZV@u-mn)tTZ;i)FPrcS)r(Eu$=> zPl*`)Ijd3W$_pAsr|JjiO3`Q^jomA}fuRvVR@*9|D-{*cTo38otTKuJeWU+gsxaD+ znTPT*ks}tlojG3ac1*v>rzuv-r_vNGGNC~Ah1az}Vb-Y&ZTnc45IQ2r&s4JfZ5)hZ z#s9+Fyo&xOEnPLW%QH|?`xVZ}-?&$#5#P?5Tb9({DuEesS@W|M@i*w5 zdese_tk^t%H%vdR0JTO0KAgQ-2YS2$99w-IGv{_pk}N0Bji&E_OfTzA!3%T(Ffuv*)}qOpEI<90!Y)}Xw{h>oO}*6@h%NI(I1 zx5P3+S=;=z8*luX3reYPp(U&cG03BW11XgNzC%BGq}J=h+f(RH2*FjtaWx*areYErBVfyE8+{v!M^}u(5$SGaMTVYmx1iuK3$UU32i(9LF&4B3bk!=TzO! zBKIz>5O()hpYbAjSMt08thJ+S+O}ccpBh0Q;>IbIP>8Ao+e;`t+j^iYCb(m=gHjfh zv9XQQP#^fc$NXCG{$1Cq?n$6M&+>LhZMCCWP#8hvJNyk#v&Y)V=K{7wwuR2BQe^ z(Yu!ynKa+B;Hl-%H~w%_?cKlH(s3|SZEktILUhQYIp%uOjFRy>8y)P$`sqbsjsuI< zG!4@4qJOL{kAY>F1JMGQtX#!|*#8|(OQ36&gJmC5jLhhGq2;;2PSlw6X^h%ckV}$! zv!g)(lU}!xNsj@>ezNm?)*M8Ofu*9_u8GnBH*~xGy%-fGuKt$|fLp~X_V*1!1Aak4 z>mnI1_GM+?Pgc*V zsetG;`GRam&_A%`lkSgRWEdlVwgvfIb<&ljp_3$q!12z#CCDJRja?w6LIa1V8A+bk zK{~BC=cLkMi2d*AC85K1ziq;1UZ*UaQDtyWf9ovKy%G^hKsl_xqu+{6IUK5E{?rk2 zUY{pzLPG;MRU#_^M%E$1vKU7a0}IP>^);@s&`SNiU#x%NzEAD@5&@Teb3emi_aE%Z zaT;!qM*{}I>QAX$1$Ee@?z~w~eY;x_IFFu|Mc;N{&mBKL;u)6+^7Gn(?GTX=I};UD z_ne^Beqjtnz+@$Oy#aj!-QVuuqSW0(6&$nZ-!a|WM_ zldd)d!-j~YP~)(mD>B~I2=@x_6C8Aj zg|7%OMYufZ2hl&RUrZN;ovq>4^L%6ytS&cE;|5?;v?#o_yF%mXYgc)_G{MM-68z+D zau@uHnT;=fo3#TyhqX&xTjgCSc=5~d3?>X5rueZvKX(#OU7wUYaJdl4fyMa<7pB%w zv*I_%3a^WNrmL%346fIzu4YK`=7svK_d&wjPB?({S%a2l-4Rwo`4*(5-4PdLw>ELi z(eqI%XBM(quvte-NIN z&M^F=UXD@m^_ zNdhZ;r6zMNCxcme*VBB;DPsl2oyJmMc>$SV%62#b#H9Tig_&G7W6-3Hm81W@?O9PY zEhcEIn;|0~>LWRZxa(&Ee=3uWhbSY)dR6zTjf3X%al@J0wyTPoS_rVcLP10qXse;d z)4Q*cFZAU7Ar+FkKPi{FYVA+F+nM4zX=U?!dZRoGyK$;SdIOpD?w9Y|-Ul-?N|gYe z6Obdl-5b}D__l`sJHKByR;%I|(oZ+IDQX9!YKsK@k~baBbk}x%#Zpa1JC)GCa0RBdIG25RA@DUHdL1Na!A~iR!foKIsY5V{*sb;)OziR4M5mYnq~zt#5%Md8ub0ILOVX7UWy#d_2FN)u(}jZ1!crs; zi0i+$n^IS)f*lp+e4PM*&z3*mnB(0+V6URuKy&uREL&4toXv*B?m zWE%Q2ZI1rnwjdW1C@|L(?6a)dG$~!D&ZIH0d1S%ywqyAh2Q}DH z&`RW;ZZS-61AS3aSoBle2ji%rR_LElENJQ+nsF#nTq$<2?!Q@q>9^w$H_c(L{|l6= z8h&d52M0$iPj1RS>wcz()gQgmO*Ou)_jQ2{rQ<0vhfFv13JP&kx#GLFAq9&T*A*x8zR#avRz%@a=(o8c#`V;c1_iSb*79e zj7`TQmDAssuNr)C;2Ya!0+e;_)sM1?pNn-N?*QBp+77^C7_#n&O1<6l=AJFCu{kff z=y*Ryu-#*3X@QjEVmNp>bh-1u^aEp|9$g^>DRp(Fe(X>F*<4GvprEg$=J&h_S=>~I zZ!hW2atwjOO$Ti7?w_QO*L>%XI&%<%E&l_*a2J(PFlSg`h+40H^ROrGs$Sg|aNIaV zUp<|_%BMWo#fFQx{i^QZ5GQ)A(l7R&ir_kx}}vrn+N{UINM}qc4jDhR?(X7H+?+r@0ah4MhZtI zy`1e6HsK{&=koq+4sHVbBa@$}O(M)d!4)|nbGyqu0dzIN*-L(p{Bt;;3P$X$Kt&p| zuePM;JFgxPH~FJ4tD~&wM_*?eB5ZGg4jN(VXoNPWjTdzV9XdbBsR`{>B-Qt&cDt~V zlTRSdLz9z3Z{09~9TLX}eQ!q&i#RKW=gPwFsSxL%JKt@SqGnb9vGwUl?-26rL?E7_ zwlgaNb-1e1oV4-|pK~@_JNv8xaHb^bLMSu8{D;%dfcL5*c7H}_ob`D$!xvKL4KL4= zgS}=x&BWu_}1hdX-{ozqHo+Txi6nEyLmQp4G_NK)qTGQ&!@fjD>4Io z^I84$*>=fme_69hY0wQaJzgVoMQFMx#zFm%G*?+~9SrM-CT4QAtcGpGx?;l~z8`Bc z8P{&l4Bv$8@qvaE7%`hap!$vSR@X1!s22WBA;son%b3=%6dsph9NNhaM`>T*r4Sw# z%>b?HtIp0}=TzX!5e~CQmsh5ylWxT=Fq^4O(fUsb*Dz)4B~B~MC8UaT|;>$J}nj&R%zC7+<@&!6O3EP zg||z`N{i=k?@BRW674r!|L!xH-UH=ibBKj3mNhnNCn@mRfN?v8Jg0lgKO#~gfN}HI zz25q8474nP7yuc8O$xwB+s5|GEf`OfZ=hV!=lVCIB+NEK$h9=|ALVQ77B@cNl(^iV zf)huqXZYk}=_dm3st3Inn;Fvf;6x=$NJZPccHua7uEJkVxBQ1N3xbq;cQUqjDOBWs z?P9{$${gN-Uy^T9Lkw@Yv4Y&sGMI6fC=N7Rw0z`{uAO8Y&5o0i>!w%vG9$&&WlA^D zA6t|!MHF$+a97*A%CU{ceo)}LwaEVD(YG9!ygel_0_vDw&MT{F=@`Wd97=)(FL5Z| z9ooULg;o$9{n{DWSIO8J^FfLwW!WEuv@?AB^3It8=0z#hnvKk& zP^_A(%=@*R*Gay6i)zH3k&IE4ZSnlDOWTW24@_^ELSWGIIr;xzF-@cW#^=Ab&s(1h z5#zPdxPd9t&yv6te?v2K_kdSTwF z3wz2*(7FD&@T8S^v?F9wGXVyZF~h5oh2IOE>C zj1uAe9&i}J8DbmK%l?J@j7r%9kr{tc!1s1ia&OKc$=5q&MurU|9igqN&*9kym&f zH#laZ`jlWOEDBvT_o!19Dt|WIe?;|slq?wC!^zv{^9CLLC%DE*%QPO+5SQw3xUg2U1kZbBcdT^;8iMFtD6}c1@7l4Hhxuwqb~-KZgNyg zRl$fPKjf){r6-pD>}MfOFk^?Jt!_B%KvV+Gr}K!xHyM$Ns|Yjt-UV1hEszWQHZ<{x zCzhfP+Z`r*@Jn~G5bwUt(X}X_SsrYLgGamM5wf?gkKU*hFIXwkpi<#Q5=3dBtH>kU zq`QHouPC^dQreO@6y)PX#=jN$k1l7Id6+d2A}6M>^dG_wS*FXrNEMDEmS@#Xb%^bl z5jaFpEfBfy6zaUd(Y(&@%3=?k#}}nu*>b3}w-mlhX@f>SaH_iw^8{TYz3Oc`_`k90ErVQj1GPWagB&YA+(p;Ed)*MaY5bB8AEe z?i0Z_BQb(&6`q);n@p#Et`;G&d==7%ZV<0!rKafr8XEQ0KW|m>UlB#{s2M&kR*882 zyq(n~YJ~grVO#EZ#SmpB^He)flPck1T$lr3(|_2+=`!kA1Gmyix^B@hb!zUO5r-6| zbr;b;q4RW-0=5j!I8;wa4fxq#nww(?l^1(qUN@c_NpVm=P+m;oQnWP=Qgo&|E2We8 zWw{a|&gEg+mmm)nj0`0(ovl2G&7R5=NvW-xqgEC=rpLYgGUctj45S|IA|)pTLN0GjzWRrs95p_9e;HwrAzkhbZGI2q(eGb!+yWr@SI0VZWM5W#%pbI9Fj$JJ zoF-@KJ6--Y5UGSThdWY1uI0hGHLP4^cVZpU)GanP_@#Rf_S@cpRh@zH$WE^V;3UTn zR{Mc>Cyr!!ao!lgZMH(x6(NXQV%AM&ra;Mvza!?qKRPp|FvuQ=eRf-VNV(-p#EKnZ^(>>q zdLCZ`mN_7X zT1_TFqD`tIMPB!nblrx+@IYE#c2o_$Nhmn1NYc_}(R;@PIvMb;H31@_jn@hP~ zXsXnSG-rW4rLi`*%ZBxn`*3>w!%K@8a3>yu)KzIMET@+GX(jF*6G#D_L%|6!{_^hn zM-tIwJ%ta7X!!)2sOUHbd^-HmgItb|8KNby(je>vLYg;`yLNys<@r^LKRM(O!Qo1O z<$uo&Ajz&*X-ZxsV#0Szm`FB$+ju>_?{G;^&MA6=%lNo8OS@%!j@kYaftfL=|F5<0 zjB2Xs{tY0g6ahg20Ra^dkRlL}-W3I;OONzoC{h!8lOoa;>4u{8Cfy_;f^_K;dT60* zK#HMrPk5jIyVi5py)QB-oKe%b^l3I)B)H)sxoZ$41vWdvLKJ; z*7Ul1@J?8|NM}!c=FLr=a$pM2#@cZ0%-WcNq~i7KJT*MgFOoGT8yS>H##>*JE^VrGEiT zIK2=fv6r%CmEq<_*HN}st~%vG07z?*T`cF0jvgJgPm{0Eo@eUt-Xj1JK`MkmAISAA zB{L4wj~JU{#<$8U56{kMNNW8<&35}zwNa9R?s;~kxunPLr5%Gu{u-byjG-|Z*3H%H z&8@A9QaRlX<8z}!iCz%ry|mxiw1hq{$vag^a&d%NSg*f3HrT-Y{@IfGNlM6;siXFK z)URp7{PHg%%YNv0Mn9^=<0_$EsAgMfuO&-0mMDrASFN{WBLW;9Wxr|5MkIq*y~mqS zq9B;UbO!~bq<-DG!|R32(nC_T3i;Lxts4WSgpWJ+sIc{2qE{6h$Rk>HA8un)_X*+TT=e%&1k{2$6>}Q^q`4s%a9HH5K88 z+Z>Je`I?Ijnn((JX{YeLnl)3h;Mg>6wPIeMQ!l{U22*uO-9?sUztg|_E*?j#601Cm z;Hg|pJk2WfqQDtg_TwB4j#KwS@fK+%O~d^1v9l9SgR@>l9--$!YJHl&dHiuu_lL*Jv*jKFQJdk z%~7{}D(1BP_obo$Dslrb|C&2Z8aR=Z<lb~K$ zdiYrUUC5T5FI(Lj%UBrr`Y5;=0MQ`^!N6;^CI2_7kX2qE-2vBYjgi+xf(!0myEl5!EO7zUmqIP502B2!`!uXc)+R#j1Dyg z>&{#gi5%3*r%70cu={`~+z(|1z#9itLKK(<4JDC4Y>D0!H7|jzp4L>UgAM8!y_a~4 z7O>UN;P2sOlu_B(!Pkf+`^&c@2qY(8gtBftU~AqirT5wl3aFVi_zfJ-W6sLl3xtkf zYdXLV$wLO|y6G4d!edhB(Qj4#X`m1BtNIr zqEdPW0-l`fn>(a;w9GW`brqN*#(%W!e{)Lmg9JC-Zm^;RB-3$GH7Ns`ayye!nG{QP z{ZM;@D&R{lo2S~l6gaLT&%>|sa+i+Iod*q849CsR;x=ISko~`@a=#ATRwBf$M`Y50 z<0orU82#_I@LE{Hm3k^M3y;f7RcYpn<+4}!#|AqXBZrGF8aw5hVAsOQ`tRsJZEEV7 zZ90mgi7cMPP=$HHWY#7*TQZA7jAYQVe7z-xJN{Q~M{~jjR>De+mQAsnWwjLv?AuV| zR3sQx79sK+ODjd9L_N# z!dC>kMW>QHhg*ro#!0y2<;6c_ zQjfsTOkg`bRfN~TRfr7t5Vfl)2drO67Poe-H<4(_D;CR9LsHv%LQ zZV%_K4>JbDZ|p)(eqcj{R@pPNeKsWyQLrz?lf)d$l^~>mwuMS55uGdZ^B|u9w8qIV zekVhyTUbRD$z!!Fx zFyQ#TrGmp)I;3QkICU+<@wGZGWq-P<{N(=o!V;M(ZH_hX65u8z*vt7ET2dT@i(LoQ zZe2`gXmarX&Syl!wxYfkp1VX-C%>xdxTP$tgc2kSzOY#TZb^f$;IruS;4u<0{wF zOO(T9yt&j&?bLD=LcrHwh|;u2;EQNRdE)u5WiG(uMhi8r z94<=UkUq!ILVUOW;8IMkIq#`(O4k@Zp}*HGft4yv*EI< z&QHKP5FykVL%{xcEosbKcibZ}-b=jy(LVb1rMi+IsW8!`^H| zd)P!}_T2?P1(>~Mxg5G}vC1C?mNb;<+&=^G!%AGe1xKkERX|%l8)Jd)Ruy))DUeQr z`1|#`hVOYlPJA4g`8}886=hGcj)PI>pRfK^Nxw<0;aSW8IcmjIFy*f1El7S|Ojry* z>3v40FDz&UkX&`R^aWdX2=7o^@I$2JuL43E(JG6E#|KT{DlNRmj` z+9PeJ6EzWA-<8IGhLZc&g{rBO$o+cvRs{7?zB|(< z&iGes^}Z1tyUI0HrQ9ILd703D^Qq}h+SUU15f+>#TXL?Ga(Bc)r-m5dhN{JsR~{UC zCxAbZVK<*|xDPg&4NzR6WjZ?ra$ZWfex4Wz>rjJRQ2I%-p=>Iwh>y=mHUWz>ng?GH zE12-O<^$&L@RRe2|0F?cERoi_DXWQxq~5u4x2TA?31eBS!92X!ZP|QBVrd6dIfMqh z-Bi)&r1g*0m!D%6^np3^3t>T-|X zDj&V}!Badb=*eyaaMc9s^A-3Hf7a~h=z6=LXZ!1_n)4KzuKya?aq1eM%U_pByBdUZgu%?5Lq5j z&fq#nCv;e7Xr`3hw|jaXdK^MKbfsLohO6GbO3M-2cVA*KKZ9yw_k)Lo;mCMhj49r= z0w?QbN}~bHwg;H)P_3y3>mInuHnR5uJb|5(7A~kciqUCO+yV+6_iivGD+jz#ZDtZ& z8m4+mvbi6x=UdLM@l#de#0A(9Iuvxx`FUeJ`-|Rms9zj<-2RUwiC*;Sva!_v!WBO9 zxe~CFM&+zIx(@(cvmEsyG@;}}>7*dFv$C3smQM4LcoN0iwdC7(qi9}xd#OLaXq24_ zB}D^{g81|a0483_-^W7}9A?F6<-u|Gz;Y$?zMXTrO$*flcnMnd2?}W^%x3@#%l| z%GjYrxqB=7F?tD!EAEplRennOqe?mQNX-mCVlZ8={;0~^Sjo6?YB*82w&&CIUzQA> zVLrsiww;eqF&B(BqWL;cZTcRJJ{Pnp6)5D(&R*ce0j$uyX+P*7UaDh~rGN8rqokJS zcv+Mpp^_ZP)<4%ihh*5!rKjaDyFvJGB576Qjc$dR_kpdi*o;m`N43fXI*1&KWqaP~ z&11AH`9O$`YlTcpQaMwWx*vtE&qcU_>Ws$|?Kz0wPtYs#Ffv-2w`Q?*? z*R9qk&UGWRG~7c~f!S-E`?l!$tAKt?uSSe$j>)I?CGE96E@XfuE`LAi&wDz1tup-j z;S>?5j(To}UwHi)J`3BS#eJisDGy3Tvc=kCXS@#C8l*`Fv||{Uk>#`11|~GBOq+Nu zhmP&Czl9GWcILm+nkrb~WiFifHj~Asf73tpkqdH(VKPVmJF|pbN#$#S{%#sl^drP2 z36rC!sW9Zl&HRnzuvXvrWex!x7`Kp2W%)p?Lk7`EMdCZ8HLG|81t_?78Sc;CV#Z4% zm*z2fM~Chem$6EcZUMA#=}M>x18^}ATBEVFa_p_m1efBM2oDN!HOeKK)##f;o)($b zjrK!dj!dgJu(oBslXO>|tBqx>7dqc&aw9zqTaL69z+_kg?Y^;Z(&Mw8gKrX-hh|?} z7m+~rEUzYQ^jz1=NYb2EY8a!~R_^eW|6K`4S^>wLnv#D2a9`G>T|})?4(BD6s>oZ5 zIi2=(@YwI)b5Z5SV2{B*HsV2He@>42=Kx6)g`XZP_BH)UYNYrpw3z8Y>1*r2d|<@+ z=wUR=n}vWtTR3p`OQ40*H2R12f;HE>bXi|LSw()#i54>2NjO@%F_oR!#^asRUc#cH zIo{5=E6kXkHz{3G}JL0V4qJpIXRpFWu)?Z z2YTBfcIl72R!hhid{6euiZKpGoYo(GMcHra64&HU7NJq?w6%6B&#R9YQ0faJ&d4F1 z)Ns;HRK;*yejXy9rgt8`K$`6ro4%jMZ;`JsA^XgiVl$PaE=r+!jk4{F)XK%Lswi?u z(SSR0*!OVV@b|&aj_Cqkc#_bMtM47L&d9asBtWXo!qB9-F!G)C>lN*}2#2jSNd^~-_)Z3<)qA2_K^CX!2>X?wm;5_AbAe~7Jk)y)KU^`U ze^)9#c?U$?Ha`9%CFrX+y}R|zHWok8&7AU)dyEI;V}#nlqx|sc^L1)-`?^U9h`53h|g+eR@n?D@19oix8&#osBtdyjGFqrjceT}KZO%G0@n zN>*G_NreYv5%Y0}XFJkT4fnE}Q1&@uKer;>jK5a+`^=n*XKo#omnuV{8lQ@G?c-Ls zen<2**K}}KtlX4iv6-^n%sLUp(0D&Hb0h40LhkfK-?UJ1ZVjg;5n7dne_VioLQ@^w z%-{E8f3Llul941t^vBniSTz(1FhJx*jNSjvb>D8wl{9nrEu4yov#7i-;i2&r8||w0 zHTC3|196xanXyTKdmdEfpXH_#$Q3?*8qXrTy+wKnE$)D8GEXoQAcus^J@{5b2d`ub zAH>16$Ll@`bNF^XLbfSR5Au~Seeu1;TJN?_(@A@!5B1j}*?!M;rmDKYq{VRh?}u-D z=A%2io?vv;@WU>Le|nBaOAUm-HB+3k^G)d8^?i>1jY8E3a=7rZF=rpya3TA1%U=_Nk+;2MlND&C0vb@oce@& zb#B535I4;X<^)qDLZ3i)c`DH&%muKe?crr-K|xRDQLV+Rp$*G+qo*~b%+^<%N4-suR?Ax%+e<80SW`il(7?Fh4hybwC$i0U zYlGjv9Qy_qX3+9S___y4x{*8o&fHuqEM{8eC zQrs_xv`~RS;?C+WA04?rvZVgGpNv7rot82Bl|CkEECu)> z=lu7i`ImUyagEhGQSRlQxC-GRjm zvoG{6^!qrpj=zlkx;RngW)_@=O`+;s)SP{LAH*>}^!#v#kT3L4C-4H&&5`J4QsIOf z;eS4JOEU%1&y*SMW_Qy3^8@4Sp|E1Is>BZE4vPR>Uei$2P|E7m>NBs(E1`t2|9K^~ zISb7TuJ7z_83!#^SN&-FrVKh2N8Sj09^C@tpoe$H{X=fYIpLcNHYFld`?g#co~yGq z9W0QXzYLMV07Cy?nsdSu*#MyLf17juA<~=p-T&4Q*9Un1)%^b%Aav~QdDomQ0{y%BcbEVE^#3?O3j=|JCQ@UIUBqpUIG4w2PgN_F HEyMm7E-zH< diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 2b39144..01b2fdd 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -14,12 +14,11 @@ "zoom": 0.1, "follow_type" : "forward", "minimal_distance" : 3.0, - "part_of_window" : 0.02 + "part_of_window" : 0.25 }, "background" : { "source" : "../../game/resources/background/background_01", - "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65], - "scale" : 0.45 + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65] }, "texture" : { "unstable_block" : "unstable_block.png", diff --git a/game/resources/levels/level_02/config.json b/game/resources/levels/level_02/config.json index ac5f95a..7525a80 100644 --- a/game/resources/levels/level_02/config.json +++ b/game/resources/levels/level_02/config.json @@ -18,8 +18,7 @@ }, "background" : { "source" : "../../game/resources/background/background_02", - "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6], - "scale" : 0.45 + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6] }, "texture" : { "unstable_block" : "unstable_block.png", diff --git a/game/resources/levels/level_03/config.json b/game/resources/levels/level_03/config.json index 5bd8160..9eaed39 100644 --- a/game/resources/levels/level_03/config.json +++ b/game/resources/levels/level_03/config.json @@ -18,8 +18,7 @@ }, "background" : { "source" : "../../game/resources/background/background_03", - "parallax_ratios" : [0.95, 0.9, 0.85, 0.8], - "scale" : 2.75 + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8] }, "texture" : { "unstable_block" : "unstable_block.png", diff --git a/game/resources/levels/level_with_finish/config.json b/game/resources/levels/level_with_finish/config.json index 6237115..3dd6a60 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/game/resources/levels/level_with_finish/config.json @@ -17,8 +17,7 @@ }, "background" : { "source" : "../../game/resources/background/background_02", - "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75], - "scale" : 3 + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75] }, "texture" : { "ground_block" : "brick.png", From a97dec0f51e4969ee5e08b503df39c21270b95bd Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sat, 4 Jun 2022 13:21:36 +0300 Subject: [PATCH 091/121] Add hero parameters --- game/resources/levels/level_01/config.json | 1 - game/resources/levels/level_01/map | 2 +- game/resources/levels/level_02/config.json | 96 +++++++++++++++++++--- game/resources/levels/level_03/config.json | 94 +++++++++++++++++++-- 4 files changed, 172 insertions(+), 21 deletions(-) diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 01b2fdd..8d156f2 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -9,7 +9,6 @@ "x" : 10.0, "y" : 10.0 }, - "angle": 15.0, "smoothness": 0.1, "zoom": 0.1, "follow_type" : "forward", diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 6f47b97..050b198 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,7 +1,7 @@ @......HE.#..#...................... .................................... .................................... -.................................F.. +..................F................. .......&.....*...................... .....[__________].....+...[]........ .....############.........##........ diff --git a/game/resources/levels/level_02/config.json b/game/resources/levels/level_02/config.json index 7525a80..2dc4180 100644 --- a/game/resources/levels/level_02/config.json +++ b/game/resources/levels/level_02/config.json @@ -3,18 +3,17 @@ "animated_resources" : "../../game/resources/animated/", "static_resources" : "../../game/resources/static/block_01", "decoration_resources" : "../../game/resources/decoration/decoration_01", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, "y" : 10.0 }, - "angle": 15.0, "smoothness": 0.1, "zoom": 0.1, "follow_type" : "forward", "minimal_distance" : 3.0, - "part_of_window" : 0.02 + "part_of_window" : 0.25 }, "background" : { "source" : "../../game/resources/background/background_02", @@ -46,21 +45,98 @@ "hero" : { "source" : "hero", "animated" : { - "size_width": 30, - "size_height": 50, - "size_scale": 0.2, + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, "delta_x" : 0, - "delta_y" : 0, + "delta_y" : 3, "actions" : { "idle" : { - "source": "idle", + "source": "hero_idle", "type": "several_files", - "delta_time": 100 + "delta_time": 200 }, "run" : { - "source": "run", + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", "type": "several_files", "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 } } } diff --git a/game/resources/levels/level_03/config.json b/game/resources/levels/level_03/config.json index 9eaed39..2302a6b 100644 --- a/game/resources/levels/level_03/config.json +++ b/game/resources/levels/level_03/config.json @@ -3,13 +3,12 @@ "animated_resources" : "../../game/resources/animated/", "static_resources" : "../../game/resources/static/block_03", "decoration_resources" : "../../game/resources/decoration/decoration_03", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, "y" : 10.0 }, - "angle": 15.0, "smoothness": 0.1, "zoom": 0.1, "follow_type" : "forward", @@ -46,21 +45,98 @@ "hero" : { "source" : "hero", "animated" : { - "size_width": 30, - "size_height": 50, - "size_scale": 0.2, + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, "delta_x" : 0, - "delta_y" : 0, + "delta_y" : 3, "actions" : { "idle" : { - "source": "idle", + "source": "hero_idle", "type": "several_files", - "delta_time": 100 + "delta_time": 200 }, "run" : { - "source": "run", + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", "type": "several_files", "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 } } } From 5ed0f067b45ea99f6adaa41303c6d58ec3038fd7 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sat, 4 Jun 2022 13:36:18 +0300 Subject: [PATCH 092/121] Fix view size --- core/visual/Camera.cpp | 3 +-- game/resources/levels/level_02/config.json | 2 +- game/resources/levels/level_02/map | 2 +- game/resources/levels/level_03/config.json | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/visual/Camera.cpp b/core/visual/Camera.cpp index f73bb7e..5ffc851 100644 --- a/core/visual/Camera.cpp +++ b/core/visual/Camera.cpp @@ -23,8 +23,7 @@ namespace mad::core { bool Camera::render(sf::RenderWindow &window) { if (m_distance_over_hero == 0) { m_view.setSize(static_cast(window.getSize().x) * *m_zoom, static_cast(window.getSize().y) * *m_zoom); - std::cout << window.getView().getViewport().height << '\n'; - m_distance_over_hero = -static_cast(window.getView().getSize().y) * m_part_of_window * *m_zoom; + m_distance_over_hero = -static_cast(window.getSize().y) * m_part_of_window * *m_zoom; *m_position += Vec2d{0, m_distance_over_hero}; m_view.setCenter(*m_position); } diff --git a/game/resources/levels/level_02/config.json b/game/resources/levels/level_02/config.json index 2dc4180..4b55321 100644 --- a/game/resources/levels/level_02/config.json +++ b/game/resources/levels/level_02/config.json @@ -1,5 +1,5 @@ { - "name" : "level_01", + "name" : "level_02", "animated_resources" : "../../game/resources/animated/", "static_resources" : "../../game/resources/static/block_01", "decoration_resources" : "../../game/resources/decoration/decoration_01", diff --git a/game/resources/levels/level_02/map b/game/resources/levels/level_02/map index 02896b6..d94ecd4 100644 --- a/game/resources/levels/level_02/map +++ b/game/resources/levels/level_02/map @@ -1,7 +1,7 @@ @......H..#..#...................... .................................... .................................... -.................................F.. +...................F................ .......&.....*...................... .....[__________].....+...[]........ .....############.........##........ diff --git a/game/resources/levels/level_03/config.json b/game/resources/levels/level_03/config.json index 2302a6b..03dd172 100644 --- a/game/resources/levels/level_03/config.json +++ b/game/resources/levels/level_03/config.json @@ -1,5 +1,5 @@ { - "name" : "level_01", + "name" : "level_03", "animated_resources" : "../../game/resources/animated/", "static_resources" : "../../game/resources/static/block_03", "decoration_resources" : "../../game/resources/decoration/decoration_03", @@ -13,7 +13,7 @@ "zoom": 0.1, "follow_type" : "forward", "minimal_distance" : 3.0, - "part_of_window" : 0.02 + "part_of_window" : 0.25 }, "background" : { "source" : "../../game/resources/background/background_03", From 5056e88f54593a74c35834bf0405492342ab00fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 4 Jun 2022 13:39:01 +0300 Subject: [PATCH 093/121] add destroy object --- core/CMakeLists.txt | 2 +- core/event/management/controller/Destroy.cpp | 6 + core/event/management/controller/Destroy.hpp | 21 ++++ core/event/management/controller/Die.cpp | 5 + core/event/management/controller/Die.hpp | 17 +++ .../statemachine/EnemyStateMachine.cpp | 11 ++ .../statemachine/EnemyStateMachine.hpp | 2 + .../statemachine/HeroStateMachine.hpp | 7 +- core/loader/LevelLoaderFromFile.cpp | 17 ++- core/visual/image/storage/ImageStorage.hpp | 3 +- core/world/entity/EntityStorage.cpp | 7 +- core/world/entity/EntityStorage.hpp | 11 +- .../animated/enemy/enemy_die/slime-die-0.png | Bin 0 -> 282 bytes .../animated/enemy/enemy_die/slime-die-1.png | Bin 0 -> 301 bytes .../animated/enemy/enemy_die/slime-die-2.png | Bin 0 -> 221 bytes .../animated/enemy/enemy_die/slime-die-3.png | Bin 0 -> 137 bytes .../enemy/enemy_hurt/slime-hurt-0.png | Bin 0 -> 292 bytes .../enemy/enemy_hurt/slime-hurt-1.png | Bin 0 -> 288 bytes .../enemy/enemy_hurt/slime-hurt-2.png | Bin 0 -> 291 bytes .../enemy/enemy_hurt/slime-hurt-3.png | Bin 0 -> 285 bytes game/resources/levels/level_01/config.json | 12 +- game/resources/levels/level_01/map | 4 +- game/resources/levels/level_02/config.json | 103 ++++++++++++++++-- game/resources/levels/level_02/map | 6 +- game/resources/levels/level_03/config.json | 103 ++++++++++++++++-- game/resources/levels/level_03/map | 6 +- 26 files changed, 307 insertions(+), 36 deletions(-) create mode 100644 core/event/management/controller/Destroy.cpp create mode 100644 core/event/management/controller/Destroy.hpp create mode 100644 core/event/management/controller/Die.cpp create mode 100644 core/event/management/controller/Die.hpp create mode 100644 game/resources/animated/enemy/enemy_die/slime-die-0.png create mode 100644 game/resources/animated/enemy/enemy_die/slime-die-1.png create mode 100644 game/resources/animated/enemy/enemy_die/slime-die-2.png create mode 100644 game/resources/animated/enemy/enemy_die/slime-die-3.png create mode 100644 game/resources/animated/enemy/enemy_hurt/slime-hurt-0.png create mode 100644 game/resources/animated/enemy/enemy_hurt/slime-hurt-1.png create mode 100644 game/resources/animated/enemy/enemy_hurt/slime-hurt-2.png create mode 100644 game/resources/animated/enemy/enemy_hurt/slime-hurt-3.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index ba8c08c..00f3d57 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -103,7 +103,7 @@ set( event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/management/condition/CollisionCondition.hpp event/management/condition/CollisionCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/controller/Destroy.cpp b/core/event/management/controller/Destroy.cpp new file mode 100644 index 0000000..011726a --- /dev/null +++ b/core/event/management/controller/Destroy.cpp @@ -0,0 +1,6 @@ +#include "Destroy.hpp" +mad::core::Destroy::Destroy(std::shared_ptr world, mad::core::Entity::Id entity_id) { + //world->get_storage().destroy_physical_entity(entity_id); +} +void mad::core::Destroy::control() { +} diff --git a/core/event/management/controller/Destroy.hpp b/core/event/management/controller/Destroy.hpp new file mode 100644 index 0000000..8941a22 --- /dev/null +++ b/core/event/management/controller/Destroy.hpp @@ -0,0 +1,21 @@ +#ifndef MAD_DESTROY_HPP +#define MAD_DESTROY_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Destroy : public Controller { + public: + Destroy(std::shared_ptr world, Entity::Id entity_id); + void control() override; + }; + +} + + + +#endif//MAD_DESTROY_HPP diff --git a/core/event/management/controller/Die.cpp b/core/event/management/controller/Die.cpp new file mode 100644 index 0000000..0f129f9 --- /dev/null +++ b/core/event/management/controller/Die.cpp @@ -0,0 +1,5 @@ +#include "Die.hpp" +mad::core::Die::Die(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Die; + Idle_animation = ImageStorage::TypeAction::Die; +} \ No newline at end of file diff --git a/core/event/management/controller/Die.hpp b/core/event/management/controller/Die.hpp new file mode 100644 index 0000000..e0d8ea6 --- /dev/null +++ b/core/event/management/controller/Die.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_DIE_HPP +#define MAD_DIE_HPP + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Die : public Movement { + public: + Die(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + +#endif//MAD_DIE_HPP diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.cpp b/core/event/management/controller/statemachine/EnemyStateMachine.cpp index eb713da..05d87de 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.cpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.cpp @@ -10,6 +10,8 @@ #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" +#include "event/management/controller/Destroy.hpp" +#include "event/management/controller/Die.hpp" #include "event/management/controller/EnemyAttack.hpp" #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" @@ -27,6 +29,9 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl StateMachine::StateId ground_idle1 = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); + StateMachine::StateId die_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId destroy = machine->add_state(std::make_shared(world, hero_id)); + int *attack_stage = new int(0); StateMachine::StateId attack_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); @@ -43,7 +48,13 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(ground_idle, die_idle, std::make_shared(sf::Keyboard::E)); + machine->add_transition(ground_left, die_idle, std::make_shared(sf::Keyboard::E)); + machine->add_transition(ground_right, die_idle, std::make_shared(sf::Keyboard::E)); + machine->add_transition(attack_idle, die_idle, std::make_shared(sf::Keyboard::E)); + + machine->add_transition(die_idle, destroy, std::make_shared(hero_id, ImageStorage::TypeAction::Die)); diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.hpp b/core/event/management/controller/statemachine/EnemyStateMachine.hpp index bc3b91a..f5767ab 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.hpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.hpp @@ -8,6 +8,8 @@ namespace mad::core{ public: explicit EnemyStateMachine(std::shared_ptr world, Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity); + private: + float health = 30; }; } diff --git a/core/event/management/controller/statemachine/HeroStateMachine.hpp b/core/event/management/controller/statemachine/HeroStateMachine.hpp index 9b8b0f7..98a12cc 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.hpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.hpp @@ -3,14 +3,17 @@ #include "StateMachine.hpp" #include "world/LocalWorld.hpp" -namespace mad::core{ +namespace mad::core { class HeroStateMachine : public StateMachine { public: explicit HeroStateMachine(std::shared_ptr world, Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity); + private: + float health = 30; + }; -} +}// namespace mad::core #endif//MAD_HEROSTATEMACHINE_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 14277fe..8bfaec1 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -441,7 +441,22 @@ namespace mad::core { m_config_json["enemy"]["animated"]["actions"]["attack_end"]["delta_time"], physical_size_width, physical_size_height, size_scale, - delta_x, delta_y)}})); + delta_x, delta_y)}, + {ImageStorage::TypeAction::Die, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["die"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["die"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Hurt, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["hurt"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["hurt"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + })); Entity::Id enemy_id = world->create_physical_entity( 2, diff --git a/core/visual/image/storage/ImageStorage.hpp b/core/visual/image/storage/ImageStorage.hpp index 59b4808..95abea7 100644 --- a/core/visual/image/storage/ImageStorage.hpp +++ b/core/visual/image/storage/ImageStorage.hpp @@ -22,7 +22,8 @@ namespace mad::core { Jump, Fly_up, Fall, - + Die, + Hurt, }; explicit ImageStorage(std::unordered_map> actions); diff --git a/core/world/entity/EntityStorage.cpp b/core/world/entity/EntityStorage.cpp index dddecf3..426031e 100644 --- a/core/world/entity/EntityStorage.cpp +++ b/core/world/entity/EntityStorage.cpp @@ -5,7 +5,7 @@ #include #include #include "EntityStorage.hpp" - +#include "algorithm" namespace mad::core { @@ -44,4 +44,9 @@ namespace mad::core { return new_entity_id; } + void EntityStorage::destroy_physical_entity(Entity::Id entity_id) { + m_list_ids.erase(std::remove(m_list_ids.begin(), m_list_ids.end(), entity_id), m_list_ids.end()); + m_map_entities[entity_id] = nullptr; + } + }// namespace mad::core diff --git a/core/world/entity/EntityStorage.hpp b/core/world/entity/EntityStorage.hpp index e373e44..321068a 100644 --- a/core/world/entity/EntityStorage.hpp +++ b/core/world/entity/EntityStorage.hpp @@ -3,19 +3,19 @@ #include "Entity.hpp" -#include #include +#include #include #include #include #include "EntityStorage.hpp" +#include "PhysicalEntity.hpp" #include "ViewableEntity.hpp" #include "visual/image/shape/Shape.hpp" -#include "PhysicalEntity.hpp" -#include #include +#include namespace mad::core { class Image; @@ -32,6 +32,7 @@ namespace mad::core { Entity::Id create_viewable_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage); Entity::Id create_physical_entity(int z_ind, Vec2d initial_position, float initial_rotation, std::shared_ptr image_storage, b2World &physicalWorld, bool is_fixed, bool is_rotated, uint16 categoryBits, uint16 maskBits); + void destroy_physical_entity(Entity::Id entity_id); private: std::unordered_map> m_map_entities; @@ -39,7 +40,7 @@ namespace mad::core { std::vector m_list_ids; }; -} +}// namespace mad::core -#endif //MAD_CORE_WORLD_ENTITY_ENTITYSTORAGE_HPP +#endif//MAD_CORE_WORLD_ENTITY_ENTITYSTORAGE_HPP diff --git a/game/resources/animated/enemy/enemy_die/slime-die-0.png b/game/resources/animated/enemy/enemy_die/slime-die-0.png new file mode 100644 index 0000000000000000000000000000000000000000..812039b4114ce7936b315a08afa88f50a67c0cb9 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n@%Db50q$YKTtJ!KGPtXOJa1{6Hw z>EamT;r({XX-+0b0T*>~|78zc4-51hRE-+5Uh`1D)G4=j5xO3N$afFL1ww@kn6U zl2k^a)ctw;ZprR`&TwMRS2kykmVh&T3Mp>$7%ps5Y+-M3P1~{ev|)8*{_bF)qji%V zGk&hqX)w1>b8dKH{2}+po(#*|+TR}hh)EamT;r({fM&3gKJT9BLMYS&+knlKjQ0PjI<6$|SgF-8t{~T3(efrzXh=9M7@2Gsd zyLoP=6cGHH*f;(8p?wQi&6@Jd`)q#a@xO-KlkV4Tv5pmAxs}1n$L7IQCdb3i3iKQ^ z5*0ML7BVt4mQUFyysV9%?NIS{&WB%de_yceAd! z&b2@H``V!YVJw1;E|b%3XW1}l`gA(=|0`c(_f|61+?BzKVf7p5MFm_7-k%C;@tv!PC{xWt~$(696PGc{2b2 literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_die/slime-die-2.png b/game/resources/animated/enemy/enemy_die/slime-die-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8d503d30f4db4fd8e96a6906683222721dd1555f GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n@%Db50q$YKTtJ!KGPtXOJa1{Cb~ zba4#v@J>#UU|pOb($f@Zz~y$(gGDfw|KH@L35Q><|6wY``N4`IcG7}uPnNKY!T*|V zn2f{^JD(7`vPt5mj6n3wgv7ZT=!QwM1rhP#)kFoSK2A<+VO@-@>CmI$! zJ<)YRRH%qyT?^;sZn;$!XPYDYc!eJelr+3iTy)m4Om*pu36&PIj`<7>4_(+xm>R@y Q0iDL+>FVdQ&MBb@04u{tS^xk5 literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_die/slime-die-3.png b/game/resources/animated/enemy/enemy_die/slime-die-3.png new file mode 100644 index 0000000000000000000000000000000000000000..28c5e57de3a237b659691deb09df8f0ebb085e9f GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n@%Db50q$YKTtJ!KGPtXOJa1{AdR zba4#v@J>#UU|pOb($f@Zz~y#O1I$^_*s+fN|Jp^%7bHxO;1Isle$L&TT{1ainVH(P dn6^eXhNhefnK_&OKL8rT;OXk;vd$@?2>=0ZC9VJf literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_hurt/slime-hurt-0.png b/game/resources/animated/enemy/enemy_hurt/slime-hurt-0.png new file mode 100644 index 0000000000000000000000000000000000000000..ff97e7062cf8f23014924995a533671928fc218f GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n@%Db50q$YKTtJ!KGPtXOJa1{A#J z>EamT;r({fM&3gXJg%F$MYS(DOqHB4gIUu!U^6Rk^^)YKDLMjyaz>ZjkJ-)Fmk7K& zxvqHU=lV^TN_*WFUo6Km4fTDUOO=h#I@a7c3j(H zdaH`7W~sIkn7ZylVvbZ)Vo@;(}-Ap475iOGKA zg7&!1sg)9sgeLOd`E3__En4+qXX1^@s6P!BAT00009a7bBm001r{ z001r{0eGc9b^rhX(n&-?R7gwhlCcfKFc3wv3l%HSK$RJgm;)&@P_qRMd!%E6lvyC6 zG&-bq)N19>2BNoU>nH-sn>wPhsk<-?CYNsEY@EamT;hmfy!MZp>q^Bv+Aml*X<@o=~$vH(kzD(kspu44O9@Fs`eT<#1CAJ4%I!t0b zVIa{ax#CR#*YW9cHSEbH?TMG&Pw1^-xT!GX;R!y5#0d`#+z%YNAlt0Fs^DhlB98e- zU-TV#$`I4%u#J7T1@oDr8nMTR;(~HIBBNIr37VikV@OO6{h1&x0g^9%S%z^>bP0l+XkKqyKO6 literal 0 HcmV?d00001 diff --git a/game/resources/animated/enemy/enemy_hurt/slime-hurt-3.png b/game/resources/animated/enemy/enemy_hurt/slime-hurt-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f01c35cbafa62c372e0c74e30a184a17852dbb5a GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E$!3HD)_;n@%Db50q$YKTtJ!KGPtXOJa1{6H+ z>EamT;hmfy!MZp>q^Bv+K;%H%<@o=~$vH(kzD(kspu44O9@Fs`eT<#1CAJ4%I!t0b zVIa{ax#CR#*YW9cHSEbH?TMG&Pw1^-xT!GX;R!y5#0d`#+z%YNAnQDh*Dk$ek|2%eac!hS$U z&75n4CBrjCr?O^7)sOvohG&YN9PtoXkZ$W`SX8E_rE)=Z@o$#92~N`<7YSVCTOcBA fB)r`D1uuiVXW5m;CA+JDUSsfd^>bP0l+XkKKMG}X literal 0 HcmV?d00001 diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 2b39144..ec861e3 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -115,7 +115,7 @@ "source" : "enemy", "animated" : { "size_width": 5.5, - "size_height": 9, + "size_height": 5, "size_scale": 0.3, "delta_x" : 0, "delta_y" : 3, @@ -139,6 +139,16 @@ "source": "enemy_attack_end", "type": "several_files", "delta_time": 30 + }, + "hurt" : { + "source": "enemy_hurt", + "type": "several_files", + "delta_time": 30 + }, + "die" : { + "source": "enemy_die", + "type": "several_files", + "delta_time": 30 } } } diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 6f47b97..148527c 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,8 +1,8 @@ @......HE.#..#...................... .................................... .................................... -.................................F.. +.................................... .......&.....*...................... -.....[__________].....+...[]........ +.....[__________]..+..+...[]..F..... .....############.........##........ [__]......................##........ \ No newline at end of file diff --git a/game/resources/levels/level_02/config.json b/game/resources/levels/level_02/config.json index ac5f95a..c658838 100644 --- a/game/resources/levels/level_02/config.json +++ b/game/resources/levels/level_02/config.json @@ -3,7 +3,7 @@ "animated_resources" : "../../game/resources/animated/", "static_resources" : "../../game/resources/static/block_01", "decoration_resources" : "../../game/resources/decoration/decoration_01", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, @@ -47,21 +47,108 @@ "hero" : { "source" : "hero", "animated" : { - "size_width": 30, - "size_height": 50, - "size_scale": 0.2, + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, "delta_x" : 0, - "delta_y" : 0, + "delta_y" : 3, "actions" : { "idle" : { - "source": "idle", + "source": "hero_idle", "type": "several_files", - "delta_time": 100 + "delta_time": 200 }, "run" : { - "source": "run", + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", "type": "several_files", "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 5, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "enemy_hurt", + "type": "several_files", + "delta_time": 30 + }, + "die" : { + "source": "enemy_die", + "type": "several_files", + "delta_time": 30 } } } diff --git a/game/resources/levels/level_02/map b/game/resources/levels/level_02/map index 02896b6..148527c 100644 --- a/game/resources/levels/level_02/map +++ b/game/resources/levels/level_02/map @@ -1,8 +1,8 @@ -@......H..#..#...................... +@......HE.#..#...................... +.................................... .................................... .................................... -.................................F.. .......&.....*...................... -.....[__________].....+...[]........ +.....[__________]..+..+...[]..F..... .....############.........##........ [__]......................##........ \ No newline at end of file diff --git a/game/resources/levels/level_03/config.json b/game/resources/levels/level_03/config.json index 5bd8160..f54a1eb 100644 --- a/game/resources/levels/level_03/config.json +++ b/game/resources/levels/level_03/config.json @@ -3,7 +3,7 @@ "animated_resources" : "../../game/resources/animated/", "static_resources" : "../../game/resources/static/block_03", "decoration_resources" : "../../game/resources/decoration/decoration_03", - "block" : 50.0, + "block" : 10.0, "camera": { "position" : { "x" : 10.0, @@ -47,21 +47,108 @@ "hero" : { "source" : "hero", "animated" : { - "size_width": 30, - "size_height": 50, - "size_scale": 0.2, + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, "delta_x" : 0, - "delta_y" : 0, + "delta_y" : 3, "actions" : { "idle" : { - "source": "idle", + "source": "hero_idle", "type": "several_files", - "delta_time": 100 + "delta_time": 200 }, "run" : { - "source": "run", + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", "type": "several_files", "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 5, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "enemy_hurt", + "type": "several_files", + "delta_time": 30 + }, + "die" : { + "source": "enemy_die", + "type": "several_files", + "delta_time": 30 } } } diff --git a/game/resources/levels/level_03/map b/game/resources/levels/level_03/map index 02896b6..148527c 100644 --- a/game/resources/levels/level_03/map +++ b/game/resources/levels/level_03/map @@ -1,8 +1,8 @@ -@......H..#..#...................... +@......HE.#..#...................... +.................................... .................................... .................................... -.................................F.. .......&.....*...................... -.....[__________].....+...[]........ +.....[__________]..+..+...[]..F..... .....############.........##........ [__]......................##........ \ No newline at end of file From 4b81d4337718ca766271ad96a8743bb3a4048a95 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sat, 4 Jun 2022 13:45:55 +0300 Subject: [PATCH 094/121] Fix config --- game/resources/levels/level_01/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index 8d156f2..fe9495e 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -9,10 +9,10 @@ "x" : 10.0, "y" : 10.0 }, - "smoothness": 0.1, + "smoothness": 0.05, "zoom": 0.1, "follow_type" : "forward", - "minimal_distance" : 3.0, + "minimal_distance" : 7.0, "part_of_window" : 0.25 }, "background" : { From d7c1d7467119b15620da8b1ad5d74b5ae042d9b2 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sat, 4 Jun 2022 15:22:31 +0300 Subject: [PATCH 095/121] Add tiles --- .../decoration/decoration_01/arrow.png | Bin 0 -> 18642 bytes .../decoration/decoration_01/gross.png | Bin 0 -> 9882 bytes .../decoration/decoration_01/head.png | Bin 0 -> 42503 bytes .../decoration/decoration_01/stone.png | Bin 1041 -> 0 bytes .../decoration/decoration_01/tree.png | Bin 2008 -> 0 bytes game/resources/levels/level_01/config.json | 14 ++++++++++---- game/resources/levels/level_01/map | 18 ++++++++++-------- .../resources/static/block_01/begin_block.png | Bin 1126 -> 4728 bytes game/resources/static/block_01/end_block.png | Bin 1149 -> 4014 bytes .../static/block_01/ground_block.png | Bin 1048 -> 4912 bytes .../static/block_01/middle_block.png | Bin 1134 -> 4912 bytes .../static/block_01/separate_block.png | Bin 1952 -> 3347 bytes .../static/block_01/unstable_block.png | Bin 38517 -> 41739 bytes 13 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 game/resources/decoration/decoration_01/arrow.png create mode 100644 game/resources/decoration/decoration_01/gross.png create mode 100644 game/resources/decoration/decoration_01/head.png delete mode 100644 game/resources/decoration/decoration_01/stone.png delete mode 100644 game/resources/decoration/decoration_01/tree.png diff --git a/game/resources/decoration/decoration_01/arrow.png b/game/resources/decoration/decoration_01/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8e35818ed5d8e2a1e1d6689f11668c5e13a59507 GIT binary patch literal 18642 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 literal 0 HcmV?d00001 diff --git a/game/resources/decoration/decoration_01/gross.png b/game/resources/decoration/decoration_01/gross.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd9a1479f9624852384a041ab221ee1ae242762 GIT binary patch literal 9882 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 BC)EG| diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index f990202..c088a37 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -30,16 +30,22 @@ }, "decoration" : { "decoration_01" : { - "source" : "tree.png", + "source" : "arrow.png", "scale" : 1, "delta_x" : 0, - "delta_y" : 5 + "delta_y" : 0 }, "decoration_02" : { - "source" : "stone.png", + "source" : "head.png", "scale" : 1, "delta_x" : 0, - "delta_y" : -20 + "delta_y" : 0 + }, + "decoration_03" : { + "source" : "gross.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : 0 } }, "hero" : { diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 148527c..106ee41 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,8 +1,10 @@ -@......HE.#..#...................... -.................................... -.................................... -.................................... -.......&.....*...................... -.....[__________]..+..+...[]..F..... -.....############.........##........ -[__]......................##........ \ No newline at end of file +......H...........................................................E.............................................................................................................................................................................................................................................. +......................................................[______________]........................................................................................................................................................................................................................................................ +..................................................+.................................................................._.......................................................................................................................................................................................... +............E.................................+...........................................E..........................._.......................................................................................................................................................................................... +[_________________]................E.......+.............................[____________________]......................_.................................................................................................................................................................................................................................. +......................[_________________].............................................................................._........................ +................................................................................................[_______________________... +..............................................................................................+ +...........................................................................................+.............................. +........................................................................................F.................................. \ No newline at end of file diff --git a/game/resources/static/block_01/begin_block.png b/game/resources/static/block_01/begin_block.png index 393774b559d5ef915ea9e561974e12c96c1eff1c..9036972212c38ca3ef2680dcd490877a4980dc6b 100644 GIT binary patch literal 4728 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 diff --git a/game/resources/static/block_01/end_block.png b/game/resources/static/block_01/end_block.png index 3c4d21012268e3ba8f879fcf122c8f0fa8edb4d6..c570171c0794c4273b08b7b3194e1fb866ab8fea 100644 GIT binary patch literal 4014 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 U?7CoXS^xk507*qoM6N<$f@#*AaR2}S literal 1149 zcmaJ>O>EO<78DDM(gWH5?{VO+x^Y>H}YcP&L7gcy|IfNmz~|1VvpfvzR#J#m?n ztu!p_U86Sa9qlftql0QfquaNGHdiD92E+<*jUm$!-6XxBE0Vdl&C*~2f(MiI$E1pK z4@e^$f;bb4s2tA&L16eTaY5i)L6qa8EJto3!fz4df*9Qj7B8Aav$cLPFJ%{FkyVl| zV{C~mTd7o-N{m7F0Lv#52~Q&$jSxh{88NZqMog!rrXWE_wRH>Y$ON9EQbNNxNs~-J zmS9**vZk|mOys~=SFu>0;k=S+Kw17e)G(IN4$i|*`F>H@DU4W<%|izb+bU^Xe~TB& z64N$RFtQ5>4b@Jur;IRi%E$ugUIA>}qnjG4IGYymvMlCI2P>uub5fEf3XHC6Vmc=A ziF6{B%5pKD&m^|Rg-k~1j7f1J+sSj;8dpNkWmW&Tg;&z+ZdS|IgCZEKM zoRliK_eyK>J+E(d_}y0z8(Jp&XD3fIuCyM!zWH1p4`)_)1)HqN`9S!puk@}sH#r+P zzP5CHV)KN4xbke%uLqi2^r_}uT<_mLi@HO77YH9=0w)K2{~ilg-^@G$_iu+(oag<4 zM@QSy6`#NLswD)+ru+6+pU(RG8fPZXjPICVAAa`VFV|+CoZay4x>HZ!^{Mc0v98cX zaV`E6%)PvId3Uhs#qH4VKUj0`W5E=@em8iu;b-mGKWEmgf85B8b3t%!_4#$xZ>C0; z|JB?&U7ik{?mqnXTF3G}-%tL%6Jx$$vRZBE7;B)?H;1-f*w=i>`yu2q-O`25z9Sz1 DTf}(j diff --git a/game/resources/static/block_01/ground_block.png b/game/resources/static/block_01/ground_block.png index 3f450fe5d29084416358d77148f1d3ff76a7ad69..d956cf869ed1c7bd415e96f222d1419096a1a3f1 100644 GIT binary patch literal 4912 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 diff --git a/game/resources/static/block_01/middle_block.png b/game/resources/static/block_01/middle_block.png index 75c533c3101cf9051f9e157b830a015105bf9e22..d956cf869ed1c7bd415e96f222d1419096a1a3f1 100644 GIT binary patch literal 4912 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 diff --git a/game/resources/static/block_01/separate_block.png b/game/resources/static/block_01/separate_block.png index b3d6a029c482c522b6be1e596d3911a1fecff880..a955ed8b32f96787c8f7ed2af509376a22da610c 100644 GIT binary patch literal 3347 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 literal 1952 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 X-q;(1QDQF`3h+^qQ-56{^Ct8^vZ69u literal 38517 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 Date: Sat, 4 Jun 2022 15:43:46 +0300 Subject: [PATCH 096/121] add kill enemy --- core/CMakeLists.txt | 2 +- core/common/FVec2D.cpp | 2 + core/common/FVec2D.hpp | 1 - core/event/Event.hpp | 1 + core/event/management/condition/Counter.cpp | 11 ++++ core/event/management/condition/Counter.hpp | 20 +++++++ .../condition/TakeDamageCondition.cpp | 19 +++++++ .../condition/TakeDamageCondition.hpp | 22 ++++++++ core/event/management/controller/Attack.cpp | 17 +++++- core/event/management/controller/Attack.hpp | 7 ++- .../management/controller/DealDamage.cpp | 14 +++++ .../management/controller/DealDamage.hpp | 26 +++++++++ core/event/management/controller/Destroy.cpp | 12 ++++- core/event/management/controller/Destroy.hpp | 4 ++ core/event/management/controller/Hurt.cpp | 5 ++ core/event/management/controller/Hurt.hpp | 21 ++++++++ .../statemachine/EnemyStateMachine.cpp | 23 +++++++- .../statemachine/HeroStateMachine.cpp | 9 ++-- core/event/physics/TakeDamage.cpp | 5 ++ core/event/physics/TakeDamage.hpp | 19 +++++++ core/loader/LevelLoaderFromFile.hpp | 54 ------------------- core/world/entity/EntityStorage.cpp | 30 +++++++++-- core/world/entity/EntityStorage.hpp | 2 +- core/world/filter/Filter.hpp | 5 +- core/world/filter/RadiusFilter.hpp | 35 ++++++++++++ game/mobs/hero/Hero.cpp | 6 +-- game/resources/levels/level_01/config.json | 8 +-- 27 files changed, 302 insertions(+), 78 deletions(-) create mode 100644 core/event/management/condition/Counter.cpp create mode 100644 core/event/management/condition/Counter.hpp create mode 100644 core/event/management/condition/TakeDamageCondition.cpp create mode 100644 core/event/management/condition/TakeDamageCondition.hpp create mode 100644 core/event/management/controller/DealDamage.cpp create mode 100644 core/event/management/controller/DealDamage.hpp create mode 100644 core/event/management/controller/Hurt.cpp create mode 100644 core/event/management/controller/Hurt.hpp create mode 100644 core/event/physics/TakeDamage.cpp create mode 100644 core/event/physics/TakeDamage.hpp create mode 100644 core/world/filter/RadiusFilter.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 00f3d57..72f3d47 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -103,7 +103,7 @@ set( event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/management/condition/CollisionCondition.hpp event/management/condition/CollisionCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/common/FVec2D.cpp b/core/common/FVec2D.cpp index db3689d..46925cb 100644 --- a/core/common/FVec2D.cpp +++ b/core/common/FVec2D.cpp @@ -51,4 +51,6 @@ namespace mad::core { Vec2d operator*(float k, Vec2d v) { return v *= k; } + + } diff --git a/core/common/FVec2D.hpp b/core/common/FVec2D.hpp index 0a3ee2b..0418226 100644 --- a/core/common/FVec2D.hpp +++ b/core/common/FVec2D.hpp @@ -14,7 +14,6 @@ namespace mad::core { operator sf::Vector2() const; - [[nodiscard]] float get_x() const noexcept; [[nodiscard]] float get_y() const noexcept; diff --git a/core/event/Event.hpp b/core/event/Event.hpp index b8ba690..6214713 100644 --- a/core/event/Event.hpp +++ b/core/event/Event.hpp @@ -20,6 +20,7 @@ namespace mad::core { EndOfRenderAction, SensorCollision, SensorCollisionEnd, + TakeDamage, }; explicit Event(Type new_type); diff --git a/core/event/management/condition/Counter.cpp b/core/event/management/condition/Counter.cpp new file mode 100644 index 0000000..0b8c5a2 --- /dev/null +++ b/core/event/management/condition/Counter.cpp @@ -0,0 +1,11 @@ +#include "Counter.hpp" +mad::core::Counter::Counter(int *c, int mx) : c(c), mx(mx){ +} +bool mad::core::Counter::is_triggered_by(const mad::core::Event &event) { + return *c >= mx; +} +std::unordered_set mad::core::Counter::triggers() { + return {Event::Type::WorldUpdate}; +} +void mad::core::Counter::on_start() { +} diff --git a/core/event/management/condition/Counter.hpp b/core/event/management/condition/Counter.hpp new file mode 100644 index 0000000..2a6c5ae --- /dev/null +++ b/core/event/management/condition/Counter.hpp @@ -0,0 +1,20 @@ +#ifndef MAD_COUNTER_HPP +#define MAD_COUNTER_HPP + +#include "Condition.hpp" +namespace mad::core { + struct Counter : Condition { + public: + Counter(int *c, int mx); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + int *c; + int mx; + }; +}// namespace mad::core + + +#endif//MAD_COUNTER_HPP diff --git a/core/event/management/condition/TakeDamageCondition.cpp b/core/event/management/condition/TakeDamageCondition.cpp new file mode 100644 index 0000000..48955b6 --- /dev/null +++ b/core/event/management/condition/TakeDamageCondition.cpp @@ -0,0 +1,19 @@ +#include "TakeDamageCondition.hpp" +#include "common/Cast.hpp" +#include "event/physics/TakeDamage.hpp" +mad::core::TakeDamageCondition::TakeDamageCondition(Entity::Id m_entity_id) : m_entity_id(m_entity_id) { +} +bool mad::core::TakeDamageCondition::is_triggered_by(const mad::core::Event &event) { + if(event.type == Event::Type::TakeDamage){ + const auto &e = const_cast_to(event); + if(e.entity_id == m_entity_id){ + return true; + } + } + return false; +} +std::unordered_set mad::core::TakeDamageCondition::triggers() { + return {mad::core::Event::Type::TakeDamage}; +} +void mad::core::TakeDamageCondition::on_start() { +} diff --git a/core/event/management/condition/TakeDamageCondition.hpp b/core/event/management/condition/TakeDamageCondition.hpp new file mode 100644 index 0000000..22bd041 --- /dev/null +++ b/core/event/management/condition/TakeDamageCondition.hpp @@ -0,0 +1,22 @@ +#ifndef MAD_TAKEDAMAGECONDITION_HPP +#define MAD_TAKEDAMAGECONDITION_HPP + +#include "Condition.hpp" +#include "world/entity/Entity.hpp" +#include +namespace mad::core { + struct TakeDamageCondition : Condition { + public: + explicit TakeDamageCondition(Entity::Id m_entity_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + Entity::Id m_entity_id; + + }; +}// namespace mad::core + + +#endif//MAD_TAKEDAMAGECONDITION_HPP diff --git a/core/event/management/controller/Attack.cpp b/core/event/management/controller/Attack.cpp index d8dfbc7..7a54dee 100644 --- a/core/event/management/controller/Attack.cpp +++ b/core/event/management/controller/Attack.cpp @@ -1,7 +1,10 @@ #include "Attack.hpp" -mad::core::Attack::Attack(std::shared_ptr world, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), attack_stage(attack_stage){ +#include "event/physics/TakeDamage.hpp" +#include "world/filter/RadiusFilter.hpp" +mad::core::Attack::Attack(std::shared_ptr world, std::shared_ptr level_dispatcher, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), world(world), level_dispatcher(level_dispatcher), entity_id(entity_id), attack_stage(attack_stage){ Move_animation = ImageStorage::TypeAction::Attack_1_beg; Idle_animation = ImageStorage::TypeAction::Attack_1_beg; + m_entity = cast_to_or_null(world->get_storage().get_entity(entity_id)); } void mad::core::Attack::control() { if((*attack_stage) % 6 == 0){ @@ -15,6 +18,9 @@ void mad::core::Attack::control() { if(Move_animation != ImageStorage::TypeAction::Attack_1_end){ SPDLOG_DEBUG("changed to Attack_1_end"); } + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { + level_dispatcher->dispatch(std::make_shared(id)); + } Move_animation = ImageStorage::TypeAction::Attack_1_end; Idle_animation = ImageStorage::TypeAction::Attack_1_end; } @@ -29,6 +35,9 @@ void mad::core::Attack::control() { if(Move_animation != ImageStorage::TypeAction::Attack_2_end){ SPDLOG_DEBUG("changed to Attack_2_end"); } + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { + level_dispatcher->dispatch(std::make_shared(id)); + } Move_animation = ImageStorage::TypeAction::Attack_2_end; Idle_animation = ImageStorage::TypeAction::Attack_2_end; } @@ -36,6 +45,9 @@ void mad::core::Attack::control() { if(Move_animation != ImageStorage::TypeAction::Attack_3_beg){ SPDLOG_DEBUG("changed to Attack_3_beg"); } + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { + level_dispatcher->dispatch(std::make_shared(id)); + } Move_animation = ImageStorage::TypeAction::Attack_3_beg; Idle_animation = ImageStorage::TypeAction::Attack_3_beg; } @@ -43,6 +55,9 @@ void mad::core::Attack::control() { if(Move_animation != ImageStorage::TypeAction::Attack_3_end){ SPDLOG_DEBUG("changed to Attack_3_end"); } + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { + level_dispatcher->dispatch(std::make_shared(id)); + } Move_animation = ImageStorage::TypeAction::Attack_3_end; Idle_animation = ImageStorage::TypeAction::Attack_3_end; } diff --git a/core/event/management/controller/Attack.hpp b/core/event/management/controller/Attack.hpp index e278c3a..f6ded2a 100644 --- a/core/event/management/controller/Attack.hpp +++ b/core/event/management/controller/Attack.hpp @@ -9,9 +9,14 @@ namespace mad::core { class Attack : public Movement { public: - Attack(std::shared_ptr world, Entity::Id entity_id, Direction dir, int* attack_stage, float velocity = 0); + Attack(std::shared_ptr world, std::shared_ptr level_dispatcher, Entity::Id entity_id, Direction dir, int* attack_stage, float velocity = 0); void control() override; int *attack_stage; + private: + std::shared_ptr world; + Entity::Id entity_id; + PhysicalEntity* m_entity; + std::shared_ptr level_dispatcher; }; } diff --git a/core/event/management/controller/DealDamage.cpp b/core/event/management/controller/DealDamage.cpp new file mode 100644 index 0000000..8c26051 --- /dev/null +++ b/core/event/management/controller/DealDamage.cpp @@ -0,0 +1,14 @@ + +#include "DealDamage.hpp" +#include "event/physics/TakeDamage.hpp" +#include "world/filter/RadiusFilter.hpp" + +mad::core::DealDamage::DealDamage(std::shared_ptr world, Entity::Id entity_id, std::shared_ptr level_dispatcher) : world(world), entity_id(entity_id), level_dispatcher(level_dispatcher) { + m_entity = cast_to_or_null(world->get_storage().get_entity(entity_id)); +} +void mad::core::DealDamage::control() { + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { + level_dispatcher->dispatch(std::make_shared(id)); + } + +} diff --git a/core/event/management/controller/DealDamage.hpp b/core/event/management/controller/DealDamage.hpp new file mode 100644 index 0000000..acde1ab --- /dev/null +++ b/core/event/management/controller/DealDamage.hpp @@ -0,0 +1,26 @@ +#ifndef MAD_DEALDAMAGE_HPP +#define MAD_DEALDAMAGE_HPP + + +#include "Controller.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class DealDamage : public Controller { + public: + explicit DealDamage(std::shared_ptr world, Entity::Id entity_id, std::shared_ptr level_dispatcher); + + void control() override; + private: + std::shared_ptr world; + Entity::Id entity_id; + PhysicalEntity* m_entity; + std::shared_ptr level_dispatcher; + }; + +} + + +#endif//MAD_DEALDAMAGE_HPP diff --git a/core/event/management/controller/Destroy.cpp b/core/event/management/controller/Destroy.cpp index 011726a..77e5b0a 100644 --- a/core/event/management/controller/Destroy.cpp +++ b/core/event/management/controller/Destroy.cpp @@ -1,6 +1,14 @@ #include "Destroy.hpp" -mad::core::Destroy::Destroy(std::shared_ptr world, mad::core::Entity::Id entity_id) { - //world->get_storage().destroy_physical_entity(entity_id); +#include "world/intent/LambdaIntent.hpp" +mad::core::Destroy::Destroy(std::shared_ptr world, mad::core::Entity::Id entity_id) : world(world), entity_id(entity_id) { + m_entity = cast_to_or_null(world->get_storage().get_entity(entity_id)); } void mad::core::Destroy::control() { + auto set_position = []() { + return mad::core::LambdaIntent( + [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { + mad::core::cast_to(entity).set_image_position({-10000, -10000}); + }); + }; + world->manipulate_entity_id(entity_id, set_position()); } diff --git a/core/event/management/controller/Destroy.hpp b/core/event/management/controller/Destroy.hpp index 8941a22..ee82307 100644 --- a/core/event/management/controller/Destroy.hpp +++ b/core/event/management/controller/Destroy.hpp @@ -12,6 +12,10 @@ namespace mad::core { public: Destroy(std::shared_ptr world, Entity::Id entity_id); void control() override; + private: + std::shared_ptr world; + Entity::Id entity_id; + PhysicalEntity* m_entity; }; } diff --git a/core/event/management/controller/Hurt.cpp b/core/event/management/controller/Hurt.cpp new file mode 100644 index 0000000..3ae477a --- /dev/null +++ b/core/event/management/controller/Hurt.cpp @@ -0,0 +1,5 @@ +#include "Hurt.hpp" +mad::core::Hurt::Hurt(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity) : Movement(world, entity_id, dir, velocity) { + Move_animation = ImageStorage::TypeAction::Hurt; + Idle_animation = ImageStorage::TypeAction::Hurt; +} \ No newline at end of file diff --git a/core/event/management/controller/Hurt.hpp b/core/event/management/controller/Hurt.hpp new file mode 100644 index 0000000..a37e0e1 --- /dev/null +++ b/core/event/management/controller/Hurt.hpp @@ -0,0 +1,21 @@ +#ifndef MAD_HURT_HPP +#define MAD_HURT_HPP + + +#include "Movement.hpp" +#include "world/LocalWorld.hpp" +#include "world/World.hpp" + +namespace mad::core { + + class Hurt : public Movement { + public: + Hurt(std::shared_ptr world, Entity::Id entity_id, Direction dir, float velocity = 0); + }; + +} + + + + +#endif//MAD_HURT_HPP diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.cpp b/core/event/management/controller/statemachine/EnemyStateMachine.cpp index 05d87de..46b153c 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.cpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.cpp @@ -1,4 +1,5 @@ #include "EnemyStateMachine.hpp" +#include "event/management/condition/Counter.hpp" #include "event/management/condition/EndAnimationCondition.hpp" #include "event/management/condition/FallCondition.hpp" #include "event/management/condition/KeyDownCondition.hpp" @@ -7,6 +8,7 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/SensorCondition.hpp" #include "event/management/condition/SensorEndCondition.hpp" +#include "event/management/condition/TakeDamageCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" @@ -16,6 +18,7 @@ #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" #include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/Hurt.hpp" #include "event/management/controller/JumpImpulse.hpp" #include "event/management/controller/Movement.hpp" #include "event/management/controller/StartJump.hpp" @@ -30,6 +33,7 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); StateMachine::StateId die_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId hurt_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId destroy = machine->add_state(std::make_shared(world, hero_id)); int *attack_stage = new int(0); @@ -40,9 +44,9 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl machine->add_transition(ground_idle1, ground_left, std::make_shared(1 + rand() % 2)); machine->add_transition(ground_left, ground_idle, std::make_shared(1 + rand() % 2)); - machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); + /*machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); machine->add_transition(ground_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); - machine->add_transition(ground_right, attack_idle, std::make_shared(sf::Keyboard::Q)); + machine->add_transition(ground_right, attack_idle, std::make_shared(sf::Keyboard::Q));*/ machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); @@ -53,6 +57,20 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl machine->add_transition(ground_right, die_idle, std::make_shared(sf::Keyboard::E)); machine->add_transition(attack_idle, die_idle, std::make_shared(sf::Keyboard::E)); + machine->add_transition(ground_idle, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_left, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_right, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(attack_idle, hurt_idle, std::make_shared(hero_id)); + + int *attack_count= new int(0); + + machine->add_transition(hurt_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Hurt, attack_count)); + + machine->add_transition(ground_idle, die_idle, std::make_shared(attack_count, 3)); + machine->add_transition(ground_left, die_idle, std::make_shared(attack_count, 3)); + machine->add_transition(ground_right, die_idle, std::make_shared(attack_count, 3)); + + machine->add_transition(die_idle, destroy, std::make_shared(hero_id, ImageStorage::TypeAction::Die)); @@ -62,6 +80,7 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl + machine->set_initial_state(0); //controllers.push_back(machine); } diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp index 45a8d8f..3bf990f 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.cpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -10,6 +10,7 @@ #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" +#include "event/management/controller/DealDamage.hpp" #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" #include "event/management/controller/GroundMovement.hpp" @@ -36,9 +37,11 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, StateMachine::StateId fall_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); StateMachine::StateId fall_right= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); int *attack_stage = new int(0); - StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); - StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); - StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); + StateMachine::StateId deal_damage = machine->add_state(std::make_shared(world, hero_id, level_dispatcher)); + machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); machine->add_transition(ground_idle, ground_left, std::make_shared(sf::Keyboard::Left)); diff --git a/core/event/physics/TakeDamage.cpp b/core/event/physics/TakeDamage.cpp new file mode 100644 index 0000000..bcda05c --- /dev/null +++ b/core/event/physics/TakeDamage.cpp @@ -0,0 +1,5 @@ +#include "TakeDamage.hpp" + +mad::core::TakeDamage::TakeDamage(int entity_id) : Event(Event::Type::TakeDamage), entity_id(entity_id) { + //SPDLOG_INFO("handle collision {0} {1}", first_object_id, second_object_id); +} diff --git a/core/event/physics/TakeDamage.hpp b/core/event/physics/TakeDamage.hpp new file mode 100644 index 0000000..c0a0b33 --- /dev/null +++ b/core/event/physics/TakeDamage.hpp @@ -0,0 +1,19 @@ +#ifndef MAD_TAKEDAMAGE_HPP +#define MAD_TAKEDAMAGE_HPP + +#include + + +namespace mad::core { + + struct TakeDamage : public Event { + explicit TakeDamage(int entity_id); + + const int entity_id; + }; + +} + + + +#endif//MAD_TAKEDAMAGE_HPP diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index 28399a2..8ae9ab6 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -29,61 +29,7 @@ using json = nlohmann::json; namespace mad::core { - class ArrowController : public mad::core::EventHandler { - public: - explicit ArrowController(std::shared_ptr world, - mad::core::Entity::Id entity_id) - : m_world(std::move(world)), - m_entity_id(entity_id) {} - - void handle(const mad::core::Event &event) override { - //SPDLOG_INFO("handle arrow event"); - - auto make_move_intent = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).move(dir); - }); - }; - - auto impulse = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); - }); - }; - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - - if (event.type == mad::core::Event::Type::KeyPressed) { - const auto &keystroke = mad::core::const_cast_to(event); - if (keystroke.key_id == sf::Keyboard::Key::Space) { - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); - } - } else if (event.type == mad::core::Event::Type::KeyHeld) { - const auto &keystroke = mad::core::const_cast_to(event); - if (keystroke.key_id == sf::Keyboard::Key::Right) { - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - if (keystroke.key_id == sf::Keyboard::Key::Left) { - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - } - } - - std::unordered_set handled_types() override { - return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::KeyHeld}; - } - private: - std::shared_ptr m_world; - mad::core::Entity::Id m_entity_id; - }; class LevelLoaderFromFile : public LevelLoader { diff --git a/core/world/entity/EntityStorage.cpp b/core/world/entity/EntityStorage.cpp index 426031e..b75c3b7 100644 --- a/core/world/entity/EntityStorage.cpp +++ b/core/world/entity/EntityStorage.cpp @@ -1,15 +1,22 @@ +#include "EntityStorage.hpp" +#include "algorithm" +#include "world/filter/RadiusFilter.hpp" +#include "world/filter/TrueFilter.hpp" #include #include -#include #include -#include "EntityStorage.hpp" -#include "algorithm" +#include + + namespace mad::core { + float dist_sq(const Vec2d &v1, const Vec2d &v2) { + return (v1.get_x() - v2.get_x()) * (v1.get_x() - v2.get_x()) + (v1.get_y() - v2.get_y()) * (v1.get_y() - v2.get_y()); + } - std::vector EntityStorage::extract(const Filter &filter) const { + std::vector EntityStorage::extract(const Filter &filter) { switch (filter.type) { case Filter::Type::Id: { IdFilter id_filter = const_cast_to(filter); @@ -19,6 +26,20 @@ namespace mad::core { case Filter::Type::True: { return m_list_ids; } + + case Filter::Type::Radius: { + std::vector arr; + + RadiusFilter radius_filter = const_cast_to(filter); + for (Entity::Id entity_id : extract(TrueFilter())) { + if (auto physical_entity = cast_to_or_null(get_entity(entity_id))) { + if (dist_sq(physical_entity->get_position(), radius_filter.get_filter_point()) < radius_filter.get_filter_radius_sq()) { + arr.push_back(entity_id); + } + } + } + return arr; + } } } @@ -49,4 +70,5 @@ namespace mad::core { m_map_entities[entity_id] = nullptr; } + }// namespace mad::core diff --git a/core/world/entity/EntityStorage.hpp b/core/world/entity/EntityStorage.hpp index 321068a..61aa90c 100644 --- a/core/world/entity/EntityStorage.hpp +++ b/core/world/entity/EntityStorage.hpp @@ -25,7 +25,7 @@ namespace mad::core { class EntityStorage { public: - [[nodiscard]] std::vector extract(const Filter &filter) const; + [[nodiscard]] std::vector extract(const Filter &filter) ; Entity &get_entity(Entity::Id id); diff --git a/core/world/filter/Filter.hpp b/core/world/filter/Filter.hpp index 5454c94..7b3fdb1 100644 --- a/core/world/filter/Filter.hpp +++ b/core/world/filter/Filter.hpp @@ -12,7 +12,10 @@ namespace mad::core { struct Filter { enum class Type { Id, - True + True, + EntityTag, + Radius, + TagRadius }; explicit Filter(Type new_type) : type(new_type) { diff --git a/core/world/filter/RadiusFilter.hpp b/core/world/filter/RadiusFilter.hpp new file mode 100644 index 0000000..5018410 --- /dev/null +++ b/core/world/filter/RadiusFilter.hpp @@ -0,0 +1,35 @@ + +#ifndef MAD_RADIUSFILTER_HPP +#define MAD_RADIUSFILTER_HPP + +#include "Filter.hpp" +#include "common/FVec2D.hpp" + +namespace mad::core { + + struct RadiusFilter : Filter { + explicit RadiusFilter(Vec2d p, float r) : Filter(Filter::Type::Radius), p(p), r(r) { + } + + [[nodiscard]] float get_filter_radius() const noexcept { + return r; + } + + [[nodiscard]] float get_filter_radius_sq() const noexcept { + return r * r; + } + + [[nodiscard]] Vec2d get_filter_point() const noexcept { + return p; + } + + private: + Vec2d p; + float r; + + }; + +} + + +#endif//MAD_RADIUSFILTER_HPP \ No newline at end of file diff --git a/game/mobs/hero/Hero.cpp b/game/mobs/hero/Hero.cpp index 0440854..62eb89f 100644 --- a/game/mobs/hero/Hero.cpp +++ b/game/mobs/hero/Hero.cpp @@ -148,9 +148,9 @@ mad::core::Hero::Hero(std::shared_ptr world, Vec2d position, json m_ StateMachine::StateId fall_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); StateMachine::StateId fall_right= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); int *attack_stage = new int(0); - StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); - StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); - StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); machine->add_transition(ground_idle, ground_left, std::make_shared(sf::Keyboard::Left)); diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index c088a37..74af5dc 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -137,22 +137,22 @@ "attack_beg" : { "source": "enemy_attack_beg", "type": "several_files", - "delta_time": 30 + "delta_time": 100 }, "attack_end" : { "source": "enemy_attack_end", "type": "several_files", - "delta_time": 30 + "delta_time": 100 }, "hurt" : { "source": "enemy_hurt", "type": "several_files", - "delta_time": 30 + "delta_time": 100 }, "die" : { "source": "enemy_die", "type": "several_files", - "delta_time": 30 + "delta_time": 100 } } } From e1e38ae37e3b987b7d4a9a21bbdd1ab86d02a1ee Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sat, 4 Jun 2022 16:22:21 +0300 Subject: [PATCH 097/121] Add tiles --- core/loader/LevelLoaderFromFile.cpp | 14 ++++++++++++++ core/loader/LevelLoaderFromFile.hpp | 2 ++ game/resources/levels/level_01/config.json | 4 ++-- .../static/block_01/ground_block.png | Bin 4912 -> 38970 bytes 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 83bda3a..68c61e2 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -163,6 +163,13 @@ namespace mad::core { m_objects[object]); break; } + case Objects::Decoration3: { + create_decoration(world, + {current_position_x, + current_position_y}, + m_objects[object]); + break; + } case Objects::FinishBlock: { keys[LevelLoaderFromFile::IdKeys::FinishBlock] = create_finish_block( world, @@ -265,6 +272,13 @@ namespace mad::core { delta_y = m_config_json["decoration"]["decoration_02"]["delta_y"]; break; } + case Objects::Decoration3 : { + source /= m_config_json["decoration"]["decoration_03"]["source"]; + decoration_scale = m_config_json["decoration"]["decoration_03"]["scale"]; + delta_x = m_config_json["decoration"]["decoration_03"]["delta_x"]; + delta_y = m_config_json["decoration"]["decoration_03"]["delta_y"]; + break; + } } decoration_scale *= static_cast(m_config_json["camera"]["zoom"]); diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index 28399a2..a756f89 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -129,6 +129,7 @@ namespace mad::core { SeparateBlock, Decoration1, Decoration2, + Decoration3, Hero, Enemy1, Enemy2, @@ -156,6 +157,7 @@ namespace mad::core { {'+', Objects::SeparateBlock}, {'*', Objects::Decoration1}, {'&', Objects::Decoration2}, + {'^', Objects::Decoration3}, {'H', Objects::Hero}, {'Z', Objects::Enemy1}, {'E', Objects::Enemy2} diff --git a/game/resources/levels/level_01/config.json b/game/resources/levels/level_01/config.json index c088a37..91b2e43 100644 --- a/game/resources/levels/level_01/config.json +++ b/game/resources/levels/level_01/config.json @@ -33,13 +33,13 @@ "source" : "arrow.png", "scale" : 1, "delta_x" : 0, - "delta_y" : 0 + "delta_y" : 20 }, "decoration_02" : { "source" : "head.png", "scale" : 1, "delta_x" : 0, - "delta_y" : 0 + "delta_y" : 90 }, "decoration_03" : { "source" : "gross.png", diff --git a/game/resources/static/block_01/ground_block.png b/game/resources/static/block_01/ground_block.png index d956cf869ed1c7bd415e96f222d1419096a1a3f1..099f23b3779d1b59a23865dbdb1df7bc6c6af60a 100644 GIT binary patch literal 38970 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 QTLkz|Ps>QNTHQYKKQY*8RsaA1 literal 4912 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 iA=FmV;wJb11Q-B(&~_5}cJ2!R0000 Date: Sat, 4 Jun 2022 16:22:47 +0300 Subject: [PATCH 098/121] Add tiles --- game/resources/levels/level_01/map | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/game/resources/levels/level_01/map b/game/resources/levels/level_01/map index 106ee41..41fed00 100644 --- a/game/resources/levels/level_01/map +++ b/game/resources/levels/level_01/map @@ -1,10 +1,11 @@ -......H...........................................................E.............................................................................................................................................................................................................................................. -......................................................[______________]........................................................................................................................................................................................................................................................ -..................................................+.................................................................._.......................................................................................................................................................................................... -............E.................................+...........................................E..........................._.......................................................................................................................................................................................... -[_________________]................E.......+.............................[____________________]......................_.................................................................................................................................................................................................................................. -......................[_________________].............................................................................._........................ +......H...............................................*...........E............................................................................................................................................................................................................................................... +....................................................[______________].............................................................................................................................................................................................................................................. +.................................................+....................................................................._.......................................................................................................................................................................................... +.*..^.......E.................................+................................^..........E............................_.......................................................................................................................................................................................... +[_________________]........&...^...E..^....+...........................[____________________].........................._.......................................................................................................................................................................................... +......................[_________________]........................................................................^....._........................ ................................................................................................[_______________________... ..............................................................................................+ -...........................................................................................+.............................. -........................................................................................F.................................. \ No newline at end of file +............................................................................................+............................. +........................................................................................F.................................. +............................................................................................................................................................................ From 33ef74092bcb599c7fa5a3026504f75a6e9103cd Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 4 Jun 2022 16:52:33 +0300 Subject: [PATCH 099/121] Input levelname with checking --- network/server/simple-server.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index 13210a0..cc77ab4 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -207,12 +207,21 @@ int main() { ImGui::Text(text_hint.c_str()); if (ImGui::Button("Enter")) { if (!std::string(input_levelname).empty()) { - if (!db.is_level_exists(input_levelname)) { - db.append_level(input_levelname); - text_hint = "new level name"; + std::filesystem::path level_container = levels_directory / input_levelname; + if (std::filesystem::is_directory(level_container) && + std::filesystem::exists(level_container / "config.json") && + std::filesystem::exists(level_container / "map")) { + if (!db.is_level_exists(input_levelname)) { + db.append_level(input_levelname); + text_hint = "new level name"; + } else { + text_hint = "level name is already used"; + } } else { - text_hint = "level name is already used"; + text_hint = "wrong directory format"; } + } else { + text_hint = "string is empty"; } } ImGui::EndChild(); From 0afeaa15044614f71598ea958bf84fc547606b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 4 Jun 2022 18:16:59 +0300 Subject: [PATCH 100/121] add enemy --- core/CMakeLists.txt | 2 +- .../condition/EnemyAttackCondition.cpp | 20 ++++++++ .../condition/EnemyAttackCondition.hpp | 27 ++++++++++ core/event/management/controller/Attack.cpp | 46 +++++++++++------- .../management/controller/EnemyAttack.cpp | 11 ++++- .../management/controller/EnemyAttack.hpp | 7 ++- .../statemachine/EnemyStateMachine.cpp | 29 ++++++----- .../statemachine/EnemyStateMachine.hpp | 2 +- .../statemachine/HeroStateMachine.cpp | 19 ++++++++ core/loader/LevelLoaderFromFile.cpp | 16 ++++-- core/loader/LevelLoaderFromFile.hpp | 2 + .../hero/hero_hurt/adventurer-hurt-00.png | Bin 0 -> 1118 bytes .../hero/hero_hurt/adventurer-hurt-01.png | Bin 0 -> 1101 bytes .../hero/hero_hurt/adventurer-hurt-02.png | Bin 0 -> 1072 bytes game/resources/levels/level_01/config.json | 5 ++ game/resources/levels/level_01/map | 2 +- game/resources/levels/level_02/config.json | 5 ++ game/resources/levels/level_03/config.json | 5 ++ 18 files changed, 161 insertions(+), 37 deletions(-) create mode 100644 core/event/management/condition/EnemyAttackCondition.cpp create mode 100644 core/event/management/condition/EnemyAttackCondition.hpp create mode 100644 game/resources/animated/hero/hero_hurt/adventurer-hurt-00.png create mode 100644 game/resources/animated/hero/hero_hurt/adventurer-hurt-01.png create mode 100644 game/resources/animated/hero/hero_hurt/adventurer-hurt-02.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 72f3d47..c4e4a3e 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -103,7 +103,7 @@ set( event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/management/condition/CollisionCondition.hpp event/management/condition/CollisionCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp event/management/condition/EnemyAttackCondition.hpp event/management/condition/EnemyAttackCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/EnemyAttackCondition.cpp b/core/event/management/condition/EnemyAttackCondition.cpp new file mode 100644 index 0000000..6e05449 --- /dev/null +++ b/core/event/management/condition/EnemyAttackCondition.cpp @@ -0,0 +1,20 @@ +#include "EnemyAttackCondition.hpp" +#include "world/filter/RadiusFilter.hpp" +mad::core::EnemyAttackCondition::EnemyAttackCondition(std::shared_ptr world, Entity::Id hero_id, Entity::Id enemy_id) : world(world), hero_id(hero_id), enemy_id(enemy_id) { + hero_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); + enemy_entity = cast_to_or_null(world->get_storage().get_entity(enemy_id)); + +} +std::unordered_set mad::core::EnemyAttackCondition::triggers() { + return {Event::Type::WorldUpdate}; +} +bool mad::core::EnemyAttackCondition::is_triggered_by(const mad::core::Event &event) { + for(auto id : world->get_storage().extract(RadiusFilter(hero_entity->get_position(), 6.0f))){ + if(id == enemy_id){ + return true; + } + } + return false; +} +void mad::core::EnemyAttackCondition::on_start() { +} diff --git a/core/event/management/condition/EnemyAttackCondition.hpp b/core/event/management/condition/EnemyAttackCondition.hpp new file mode 100644 index 0000000..131a4ba --- /dev/null +++ b/core/event/management/condition/EnemyAttackCondition.hpp @@ -0,0 +1,27 @@ +#ifndef MAD_ENEMYATTACKCONDITION_HPP +#define MAD_ENEMYATTACKCONDITION_HPP + +#include "Condition.hpp" +#include "world/LocalWorld.hpp" +#include "world/entity/Entity.hpp" +#include +namespace mad::core { + struct EnemyAttackCondition : Condition { + public: + EnemyAttackCondition(std::shared_ptr world, Entity::Id hero_id, Entity::Id enemy_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + Entity::Id hero_id; + Entity::Id enemy_id; + PhysicalEntity* hero_entity; + PhysicalEntity* enemy_entity; + std::shared_ptr world; + + }; +}// namespace mad::core + + +#endif//MAD_ENEMYATTACKCONDITION_HPP diff --git a/core/event/management/controller/Attack.cpp b/core/event/management/controller/Attack.cpp index 7a54dee..e3eff90 100644 --- a/core/event/management/controller/Attack.cpp +++ b/core/event/management/controller/Attack.cpp @@ -1,62 +1,72 @@ #include "Attack.hpp" #include "event/physics/TakeDamage.hpp" #include "world/filter/RadiusFilter.hpp" -mad::core::Attack::Attack(std::shared_ptr world, std::shared_ptr level_dispatcher, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), world(world), level_dispatcher(level_dispatcher), entity_id(entity_id), attack_stage(attack_stage){ +mad::core::Attack::Attack(std::shared_ptr world, std::shared_ptr level_dispatcher, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int *attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), world(world), level_dispatcher(level_dispatcher), entity_id(entity_id), attack_stage(attack_stage) { Move_animation = ImageStorage::TypeAction::Attack_1_beg; Idle_animation = ImageStorage::TypeAction::Attack_1_beg; m_entity = cast_to_or_null(world->get_storage().get_entity(entity_id)); } void mad::core::Attack::control() { - if((*attack_stage) % 6 == 0){ - if(Move_animation != ImageStorage::TypeAction::Attack_1_beg){ + if ((*attack_stage) % 6 == 0) { + if (Move_animation != ImageStorage::TypeAction::Attack_1_beg) { SPDLOG_DEBUG("changed to Attack_1_beg"); } Move_animation = ImageStorage::TypeAction::Attack_1_beg; Idle_animation = ImageStorage::TypeAction::Attack_1_beg; } - if((*attack_stage) % 6 == 1){ - if(Move_animation != ImageStorage::TypeAction::Attack_1_end){ + if ((*attack_stage) % 6 == 1) { + if (Move_animation != ImageStorage::TypeAction::Attack_1_end) { SPDLOG_DEBUG("changed to Attack_1_end"); } for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { - level_dispatcher->dispatch(std::make_shared(id)); + if (id != entity_id) { + level_dispatcher->dispatch(std::make_shared(id)); + } } Move_animation = ImageStorage::TypeAction::Attack_1_end; Idle_animation = ImageStorage::TypeAction::Attack_1_end; } - if((*attack_stage) % 6 == 2){ - if(Move_animation != ImageStorage::TypeAction::Attack_2_beg){ - SPDLOG_DEBUG("changed to Attack_2_beg"); + if ((*attack_stage) % 6 == 2) { + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { + if (id != entity_id) { + level_dispatcher->dispatch(std::make_shared(id)); + } } Move_animation = ImageStorage::TypeAction::Attack_2_beg; Idle_animation = ImageStorage::TypeAction::Attack_2_beg; } - if((*attack_stage) % 6 == 3){ - if(Move_animation != ImageStorage::TypeAction::Attack_2_end){ + if ((*attack_stage) % 6 == 3) { + if (Move_animation != ImageStorage::TypeAction::Attack_2_end) { SPDLOG_DEBUG("changed to Attack_2_end"); } for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { - level_dispatcher->dispatch(std::make_shared(id)); + if (id != entity_id) { + level_dispatcher->dispatch(std::make_shared(id)); + } } Move_animation = ImageStorage::TypeAction::Attack_2_end; Idle_animation = ImageStorage::TypeAction::Attack_2_end; } - if((*attack_stage) % 6 == 4){ - if(Move_animation != ImageStorage::TypeAction::Attack_3_beg){ + if ((*attack_stage) % 6 == 4) { + if (Move_animation != ImageStorage::TypeAction::Attack_3_beg) { SPDLOG_DEBUG("changed to Attack_3_beg"); } for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { - level_dispatcher->dispatch(std::make_shared(id)); + if (id != entity_id) { + level_dispatcher->dispatch(std::make_shared(id)); + } } Move_animation = ImageStorage::TypeAction::Attack_3_beg; Idle_animation = ImageStorage::TypeAction::Attack_3_beg; } - if((*attack_stage) % 6 == 5){ - if(Move_animation != ImageStorage::TypeAction::Attack_3_end){ + if ((*attack_stage) % 6 == 5) { + if (Move_animation != ImageStorage::TypeAction::Attack_3_end) { SPDLOG_DEBUG("changed to Attack_3_end"); } for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 10.0f))) { - level_dispatcher->dispatch(std::make_shared(id)); + if (id != entity_id) { + level_dispatcher->dispatch(std::make_shared(id)); + } } Move_animation = ImageStorage::TypeAction::Attack_3_end; Idle_animation = ImageStorage::TypeAction::Attack_3_end; diff --git a/core/event/management/controller/EnemyAttack.cpp b/core/event/management/controller/EnemyAttack.cpp index 17a6753..a27ac44 100644 --- a/core/event/management/controller/EnemyAttack.cpp +++ b/core/event/management/controller/EnemyAttack.cpp @@ -1,7 +1,10 @@ #include "EnemyAttack.hpp" -mad::core::EnemyAttack::EnemyAttack(std::shared_ptr world, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), attack_stage(attack_stage){ +#include "event/physics/TakeDamage.hpp" +#include "world/filter/RadiusFilter.hpp" +mad::core::EnemyAttack::EnemyAttack(std::shared_ptr world, std::shared_ptr level_dispatcher, mad::core::Entity::Id entity_id, mad::core::Movement::Direction dir, int* attack_stage, float velocity) : Movement(world, entity_id, dir, velocity), world(world), level_dispatcher(level_dispatcher), entity_id(entity_id), attack_stage(attack_stage){ Move_animation = ImageStorage::TypeAction::Attack_1_beg; Idle_animation = ImageStorage::TypeAction::Attack_1_beg; + m_entity = cast_to_or_null(world->get_storage().get_entity(entity_id)); } void mad::core::EnemyAttack::control() { Movement::control(); @@ -9,6 +12,12 @@ void mad::core::EnemyAttack::control() { if(Move_animation != ImageStorage::TypeAction::Attack_1_beg){ SPDLOG_DEBUG("changed to Attack_1_beg"); } + for (auto id : world->get_storage().extract(RadiusFilter(m_entity->get_position(), 6.0f))) { + if(id != entity_id){ + level_dispatcher->dispatch(std::make_shared(id)); + + } + } Move_animation = ImageStorage::TypeAction::Attack_1_beg; Idle_animation = ImageStorage::TypeAction::Attack_1_beg; } diff --git a/core/event/management/controller/EnemyAttack.hpp b/core/event/management/controller/EnemyAttack.hpp index a056739..dda7038 100644 --- a/core/event/management/controller/EnemyAttack.hpp +++ b/core/event/management/controller/EnemyAttack.hpp @@ -10,9 +10,14 @@ namespace mad::core { class EnemyAttack : public Movement { public: - EnemyAttack(std::shared_ptr world, Entity::Id entity_id, Direction dir, int* attack_stage, float velocity = 0); + EnemyAttack(std::shared_ptr world, std::shared_ptr level_dispatcher, Entity::Id entity_id, Direction dir, int* attack_stage, float velocity = 0); void control() override; int *attack_stage; + private: + std::shared_ptr world; + Entity::Id entity_id; + PhysicalEntity* m_entity; + std::shared_ptr level_dispatcher; }; } diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.cpp b/core/event/management/controller/statemachine/EnemyStateMachine.cpp index 46b153c..e4927c2 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.cpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.cpp @@ -1,6 +1,7 @@ #include "EnemyStateMachine.hpp" #include "event/management/condition/Counter.hpp" #include "event/management/condition/EndAnimationCondition.hpp" +#include "event/management/condition/EnemyAttackCondition.hpp" #include "event/management/condition/FallCondition.hpp" #include "event/management/condition/KeyDownCondition.hpp" #include "event/management/condition/KeyPressedCondition.hpp" @@ -24,12 +25,13 @@ #include "event/management/controller/StartJump.hpp" #include "event/management/controller/statemachine/StateMachine.hpp" -mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr world, mad::core::Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity) : StateMachine(level_dispatcher){ +mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr world, mad::core::Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity, int real_hero_id) : StateMachine(level_dispatcher){ auto machine = this; StateMachine::StateId ground_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId ground_idle1 = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId ground_idle2 = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId ground_right = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); StateMachine::StateId die_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); @@ -37,27 +39,28 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl StateMachine::StateId destroy = machine->add_state(std::make_shared(world, hero_id)); int *attack_stage = new int(0); - StateMachine::StateId attack_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); + StateMachine::StateId attack_idle = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); machine->add_transition(ground_idle, ground_right, std::make_shared(1 + rand() % 2)); machine->add_transition(ground_right, ground_idle1, std::make_shared(1 + rand() % 2)); machine->add_transition(ground_idle1, ground_left, std::make_shared(1 + rand() % 2)); machine->add_transition(ground_left, ground_idle, std::make_shared(1 + rand() % 2)); - /*machine->add_transition(ground_left, attack_idle, std::make_shared(sf::Keyboard::Q)); - machine->add_transition(ground_idle, attack_idle, std::make_shared(sf::Keyboard::Q)); - machine->add_transition(ground_right, attack_idle, std::make_shared(sf::Keyboard::Q));*/ + machine->add_transition(ground_left, attack_idle, std::make_shared(world, hero_id, real_hero_id)); + machine->add_transition(ground_idle, attack_idle, std::make_shared(world, hero_id, real_hero_id)); + machine->add_transition(ground_idle1, attack_idle, std::make_shared(world, hero_id, real_hero_id)); - machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); - machine->add_transition(attack_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(ground_right, attack_idle, std::make_shared(world, hero_id, real_hero_id)); + machine->add_transition(attack_idle, attack_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_beg, attack_stage)); + machine->add_transition(attack_idle, ground_idle2, std::make_shared(hero_id, ImageStorage::TypeAction::Attack_1_end, attack_stage)); + machine->add_transition(ground_idle2, ground_idle, std::make_shared(0.7)); - machine->add_transition(ground_idle, die_idle, std::make_shared(sf::Keyboard::E)); - machine->add_transition(ground_left, die_idle, std::make_shared(sf::Keyboard::E)); - machine->add_transition(ground_right, die_idle, std::make_shared(sf::Keyboard::E)); - machine->add_transition(attack_idle, die_idle, std::make_shared(sf::Keyboard::E)); machine->add_transition(ground_idle, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_idle2, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_idle1, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_left, hurt_idle, std::make_shared(hero_id)); machine->add_transition(ground_right, hurt_idle, std::make_shared(hero_id)); machine->add_transition(attack_idle, hurt_idle, std::make_shared(hero_id)); @@ -67,6 +70,10 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl machine->add_transition(hurt_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Hurt, attack_count)); machine->add_transition(ground_idle, die_idle, std::make_shared(attack_count, 3)); + machine->add_transition(ground_idle1, die_idle, std::make_shared(attack_count, 3)); + + machine->add_transition(ground_idle2, die_idle, std::make_shared(attack_count, 3)); + machine->add_transition(ground_left, die_idle, std::make_shared(attack_count, 3)); machine->add_transition(ground_right, die_idle, std::make_shared(attack_count, 3)); diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.hpp b/core/event/management/controller/statemachine/EnemyStateMachine.hpp index f5767ab..bd4759a 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.hpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.hpp @@ -7,7 +7,7 @@ namespace mad::core{ class EnemyStateMachine : public StateMachine { public: - explicit EnemyStateMachine(std::shared_ptr world, Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity); + explicit EnemyStateMachine(std::shared_ptr world, Vec2d position, int hero_id, std::shared_ptr level_dispatcher, float m_impulse, float horizontal_velocity, int real_hero_id); private: float health = 30; }; diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp index 3bf990f..99a8bff 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.cpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -7,6 +7,7 @@ #include "event/management/condition/LastStateCondition.hpp" #include "event/management/condition/SensorCondition.hpp" #include "event/management/condition/SensorEndCondition.hpp" +#include "event/management/condition/TakeDamageCondition.hpp" #include "event/management/condition/TimerCondition.hpp" #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" @@ -14,6 +15,7 @@ #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" #include "event/management/controller/GroundMovement.hpp" +#include "event/management/controller/Hurt.hpp" #include "event/management/controller/JumpImpulse.hpp" #include "event/management/controller/Movement.hpp" #include "event/management/controller/StartJump.hpp" @@ -41,6 +43,23 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); StateMachine::StateId deal_damage = machine->add_state(std::make_shared(world, hero_id, level_dispatcher)); + StateMachine::StateId hurt_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + + machine->add_transition(ground_idle, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_left, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(ground_right, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(attack_idle, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(attack_left, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(attack_right, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(fall_idle, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(fall_left, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(fall_right, hurt_idle, std::make_shared(hero_id)); + machine->add_transition(hurt_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Hurt)); + + + + + machine->add_transition(ground_idle, ground_right, std::make_shared(sf::Keyboard::Right)); diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 83bda3a..474db4f 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -173,7 +173,7 @@ namespace mad::core { case Objects::Hero: { // Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); hero_id = create_hero(world, {current_position_x, current_position_y}); - keys[LevelLoaderFromFile::IdKeys::Hero] = hero_id; + r_hero_id = keys[LevelLoaderFromFile::IdKeys::Hero] = hero_id; break; } case Objects::Enemy1: { @@ -375,7 +375,15 @@ namespace mad::core { m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["delta_time"], physical_size_width, physical_size_height, size_scale, - delta_x, delta_y)}})); + delta_x, delta_y)}, + {ImageStorage::TypeAction::Hurt, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["hurt"]["source"], + + m_config_json["hero"]["animated"]["actions"]["hurt"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + })); hero_id = world->create_physical_entity( 2, @@ -469,8 +477,10 @@ namespace mad::core { float m_impulse = 2000; float horizontal_velocity = 5.5f; + auto m_entity = cast_to_or_null(world->get_storage().get_entity(enemy_id)); + m_entity->add_sensor({6, 0}, 2.65, 0.05); - auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity); + auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity, r_hero_id); controllers.push_back(machine); } Entity::Id LevelLoaderFromFile::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { diff --git a/core/loader/LevelLoaderFromFile.hpp b/core/loader/LevelLoaderFromFile.hpp index 8ae9ab6..22edcd9 100644 --- a/core/loader/LevelLoaderFromFile.hpp +++ b/core/loader/LevelLoaderFromFile.hpp @@ -106,6 +106,8 @@ namespace mad::core { {'Z', Objects::Enemy1}, {'E', Objects::Enemy2} }; + + int r_hero_id; }; } diff --git a/game/resources/animated/hero/hero_hurt/adventurer-hurt-00.png b/game/resources/animated/hero/hero_hurt/adventurer-hurt-00.png new file mode 100644 index 0000000000000000000000000000000000000000..8efaf111fb64f4e9971bf099aa19dbb48b690598 GIT binary patch literal 1118 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 Date: Sat, 4 Jun 2022 18:27:28 +0300 Subject: [PATCH 101/121] add enemy --- core/CMakeLists.txt | 2 +- core/event/Event.hpp | 1 + .../statemachine/HeroStateMachine.cpp | 18 +++++++++++++++++- core/event/physics/Death.cpp | 3 +++ core/event/physics/Death.hpp | 17 +++++++++++++++++ core/loader/LevelLoaderFromFile.cpp | 7 +++++++ .../hero/hero_die/adventurer-die-00.png | Bin 0 -> 1118 bytes .../hero/hero_die/adventurer-die-01.png | Bin 0 -> 1101 bytes .../hero/hero_die/adventurer-die-02.png | Bin 0 -> 1092 bytes .../hero/hero_die/adventurer-die-03.png | Bin 0 -> 992 bytes .../hero/hero_die/adventurer-die-04.png | Bin 0 -> 775 bytes .../hero/hero_die/adventurer-die-05.png | Bin 0 -> 728 bytes .../hero/hero_die/adventurer-die-06.png | Bin 0 -> 775 bytes game/resources/levels/level_01/config.json | 5 +++++ game/resources/levels/level_02/config.json | 5 +++++ game/resources/levels/level_03/config.json | 5 +++++ 16 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 core/event/physics/Death.cpp create mode 100644 core/event/physics/Death.hpp create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-00.png create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-01.png create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-02.png create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-03.png create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-04.png create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-05.png create mode 100644 game/resources/animated/hero/hero_die/adventurer-die-06.png diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index c4e4a3e..27ad6ad 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -103,7 +103,7 @@ set( event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/management/condition/CollisionCondition.hpp event/management/condition/CollisionCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp event/management/condition/EnemyAttackCondition.hpp event/management/condition/EnemyAttackCondition.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp event/management/condition/EnemyAttackCondition.hpp event/management/condition/EnemyAttackCondition.cpp event/physics/Death.hpp event/physics/Death.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/Event.hpp b/core/event/Event.hpp index 6214713..10fdf9f 100644 --- a/core/event/Event.hpp +++ b/core/event/Event.hpp @@ -21,6 +21,7 @@ namespace mad::core { SensorCollision, SensorCollisionEnd, TakeDamage, + Death, }; explicit Event(Type new_type); diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp index 99a8bff..5eb9b7f 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.cpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -1,4 +1,5 @@ #include "HeroStateMachine.hpp" +#include "event/management/condition/Counter.hpp" #include "event/management/condition/EndAnimationCondition.hpp" #include "event/management/condition/FallCondition.hpp" #include "event/management/condition/KeyDownCondition.hpp" @@ -12,6 +13,8 @@ #include "event/management/condition/TrueCondition.hpp" #include "event/management/controller/Attack.hpp" #include "event/management/controller/DealDamage.hpp" +#include "event/management/controller/Destroy.hpp" +#include "event/management/controller/Die.hpp" #include "event/management/controller/Fall.hpp" #include "event/management/controller/FlyUp.hpp" #include "event/management/controller/GroundMovement.hpp" @@ -39,11 +42,15 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, StateMachine::StateId fall_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle, horizontal_velocity)); StateMachine::StateId fall_right= machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Right, horizontal_velocity)); int *attack_stage = new int(0); + int *attack_count= new int(0); StateMachine::StateId attack_left = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Left, attack_stage, horizontal_velocity)); StateMachine::StateId attack_idle= machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); StateMachine::StateId attack_right = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Right, attack_stage, horizontal_velocity)); StateMachine::StateId deal_damage = machine->add_state(std::make_shared(world, hero_id, level_dispatcher)); StateMachine::StateId hurt_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId die_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); + StateMachine::StateId destroy = machine->add_state(std::make_shared(world, hero_id)); + machine->add_transition(ground_idle, hurt_idle, std::make_shared(hero_id)); machine->add_transition(ground_left, hurt_idle, std::make_shared(hero_id)); @@ -54,7 +61,16 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, machine->add_transition(fall_idle, hurt_idle, std::make_shared(hero_id)); machine->add_transition(fall_left, hurt_idle, std::make_shared(hero_id)); machine->add_transition(fall_right, hurt_idle, std::make_shared(hero_id)); - machine->add_transition(hurt_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Hurt)); + machine->add_transition(hurt_idle, ground_idle, std::make_shared(hero_id, ImageStorage::TypeAction::Hurt, attack_count)); + + machine->add_transition(ground_idle, die_idle, std::make_shared(attack_count, 5)); + machine->add_transition(ground_left, die_idle, std::make_shared(attack_count, 5)); + machine->add_transition(ground_right, die_idle, std::make_shared(attack_count, 5)); + + + + machine->add_transition(die_idle, destroy, std::make_shared(hero_id, ImageStorage::TypeAction::Die)); + diff --git a/core/event/physics/Death.cpp b/core/event/physics/Death.cpp new file mode 100644 index 0000000..bc3d6d2 --- /dev/null +++ b/core/event/physics/Death.cpp @@ -0,0 +1,3 @@ +#include "Death.hpp" +mad::core::Death::Death(int entity_id) : Event(Event::Type::Death), entity_id(entity_id) { +} diff --git a/core/event/physics/Death.hpp b/core/event/physics/Death.hpp new file mode 100644 index 0000000..ee74d70 --- /dev/null +++ b/core/event/physics/Death.hpp @@ -0,0 +1,17 @@ +#ifndef MAD_DEATH_HPP +#define MAD_DEATH_HPP + +#include "event/Event.hpp" +namespace mad::core { + + struct Death : public Event { + explicit Death(int entity_id); + + const int entity_id; + }; + +} + + + +#endif//MAD_DEATH_HPP diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 0e2b6c8..216d8c9 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -396,6 +396,13 @@ namespace mad::core { m_config_json["hero"]["animated"]["actions"]["hurt"]["delta_time"], physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Die, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["die"]["source"], + + m_config_json["hero"]["animated"]["actions"]["die"]["delta_time"], + physical_size_width, physical_size_height, size_scale, delta_x, delta_y)} })); diff --git a/game/resources/animated/hero/hero_die/adventurer-die-00.png b/game/resources/animated/hero/hero_die/adventurer-die-00.png new file mode 100644 index 0000000000000000000000000000000000000000..8efaf111fb64f4e9971bf099aa19dbb48b690598 GIT binary patch literal 1118 zcmV-k1flzhP)u8*Pl5#C&MXYtAlG-zBXrt2y3`{NW`z4=3;Q z{NDfbBqvZ*QAHJ1R8d70Rn%@t?ADFHJNp3#-gsT+#uBl(sI*oA&~@g#(tIYRcgs;C zp5V&08@StD0K`^e?C)rk0861oiNQ%eIzg#=TRx+g(^|t=yaRVXd_SNOHR2 z`>Tt{Opq35vjphtw!Ji{rmXU()Yj5$yv9~yMm+aDz^EsJ%mfiyy&Url?Kqz@M;@F! z&FtzT(T$`8828T^Fh2hr__I(x{~YexY`cwmB7~L$v^bmPm}iK$yWc0Y9N1CYDe2V* zCr=YeC9suMO5f59kHTS`c01!GQQYk=+Fa#%`@jC-4g(i{6`|z-j=H8i2uEELeciT~ zuAxK)#6m2L!%}TPB>D$g_x(lGBA9y|;^>LvRMs{cS9OIHE0r!~5K2JKzS)VjtU?Y? zPqMnc4!~`FlUnyXIK20;B_&M{H%Zn#CK;Z`R9Y^auf9g2sz;7_hG=a$Ml?Dv8XKHD zh5!XKvYd=jXR!j{wA*nF+4p9)7kyDGY2TOpO7>DEJQ_SLab?B z1wnv>6uRSr*28W7PY6Z=ySSqudMNc0clwA-`S7vG9k^hh&;#-;lFr3KMLMX^yM?J0I{IV62m#_EnUi(D|U1Ule6|VZ5g_Zy){2g)H z?EusSbZP>+;mVPZJ~#GweYg1dv#+@6?E?_2i^Dj2uPDi1up`Nh4dJxg<~Yj{X)evsvS3A;=sxmpp((eO^0QX1EBhu!8T0;btYc=2%;-8D zhk8_}Rd?1}j>iSrQ!SUv|8*$$3?!r^ok~eSbR6no^0z-!rC0aI>R@jdJOO#0ELByk zCzAj)lp#86G`_q#t|Y&b)@pZmKNAx|K=wfiA;i|&P-l%MMJB_!0k?`0)PNkUEk_6; zw+hxY4e|kmrfFg=kuW}E(siV!N#qMn{LfM{BQ~?fseReAQX~@Lc1((e4UsnkPh1mq zCW*UR%Gr1VXH7Li5r`5;>P?#nDTzcPn9XMKmX&7)**osRJMO_F=^?a*!VZOXgi@zNSy%*Q7#f&Ml(@}oUhKkl_T_^J{gT}hOG z(Mv}0H%QE zz-3rW01$uY2YAW`z%O+}!sl(+0#WB~*tWkCkflrtx6=iH*D&~KGE7@bD*!Qf7B2>| zM1s-jahNXNbMV6L5QqJ{ww;5L9&tNea&&qeuTe}GU@ksyosYS*TzQ}wuVLUd3=UrS z7L^d72xM|`MtBXwIzF&^jfMC;bMbl1{U=yn$pgg&z;o^s#)2d4^&KY~n^6J*ia-ji z0a(@8tfSAq!tuARu)EH~gU^3vK^)mLgwQ-nAV5)%tmgBSmz7z^)w2bE0Go;+r<$7N->b3gfK0uQKjwesi??5({_*qd%fCT+ z=0k4MC7Nq~q^^5dg*~u?o5qRqeM}6$&)Q-DPlJQd9NDZwxJn zTNMz+VG+PlQGt|_)s+?6Dy0q`8Ufwa}w5kkm~gf&frO#pzjfUI(qtrU;;pVyk%F3v zn5Idi%Py12B-w0M*zI=F>0%26KqwF-6bN#ES&nEb&E5(p`CLv(pDL+HKA)F~EfxX_`zWn+ytUfdXx9@1?Yb<3ra{+#JSxh>7X<(sSE$ zf4|>%&!2m5AxDlJIdbI4kt4@iA=Wy<$NOL9(VB;4_IG+DD)L)zNmglbz0dS*nCjiy6KLQEr3>T*loZ|Vn8UUE8InJp6EIXR^ z5SX1beLs+FEE-{j!2?o7XJ4{87T8j-Q z06cl@dkO;2Wh8bzaDWF3<{0�Z<|VCP!qw%_g%2(xi*)>*@gD&_^S1aXSRM`0x{r zeTTlGqkDwf3iFFRjVY1YXjA}yeO?j(eO(M|O41<_qV6j@|=5Lb+@2qAFh z=V#7oaV=16SyYl=naGx6J3%`t? z8IQ!+TU`V|C=}wSh!nTuf}zV-GX3t1nkd(jY%8$Hv8YZ(VS$Pg)QpI(>r}ezG876C zi^YW9ZWj$MR!9JN2L|yD46@l4#~+EZDbGnF9#^vAC>fDNA|Zp}Fq)=`SS-fTbA$Ko zZzPu&xR7dI+m(#SSX4&}K_Z!4RU(a3vx>2(j@@ci_6NlOfjioM literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_die/adventurer-die-03.png b/game/resources/animated/hero/hero_die/adventurer-die-03.png new file mode 100644 index 0000000000000000000000000000000000000000..5e26bded6503702edc22b09ce118ed0d8be683e3 GIT binary patch literal 992 zcmV<610Vc}P)egPv{ly9N(Jkfj=G0Q9U^|9sEGKYzQ}aUFMJWU zH^Gk=A1s?F>|r?F3e&agkYP(fL72>Tbp3It_ix%CU;dZzn7f+PtHC6 z-#Iz|dlM*Arc9YKWy+K(Q|AAItmR~%y!;s3@7${LV@5P4KL0uZx?g&$=xaMlOKo)+ zF@xb_$LZ^610Z@ON_%HW0W2=em$ayw4f*|JF8+R5g_;@}oBSC7e~q7?CZ?E~zKCfW z>L$ZiWKBgvO^w!T^h(r<=eLVxO+}_=E)}$MJCh$T7TXW|FZ-Tl&b$ghgST2uE&c|8 zmPi0_#+Rh8qm59TyI|ahpa00=Z_gK!9OlI>odAp+JVNM+762+6 zHcRJ@dw}9aO5Tw}U0pYU6PXkxc9y9SP1qq zTbtnQ=2n7%0Kq^2V{nLgGQqnC-Y;o>J9Y%FpOYG&PrMZs42_KN@t0p)@s7|=CZ|ra zVR1hIpPg)_J^3pO!CnA1)-_Of$KB%f`e_c{1wemK_1cQ8#KDJmsJY4rU3(8(64&ZZ z(0E(LO~>~4RIe(xTlTEgv+Dt>JaM>I#pJ1Pc(CKozDt)=D~^49Z~dwl_?C&NY?iax zCU8MLaAI<~f}NQhL`0}?xy0dg^2`gbS;gYHM;`k3Zis(JM_&(4mkUkPRKhg>((m#4 z5D}I#8EIKxYl#dW{i^7EY~PWdo%gep$&gMamCNI?;z||XZW5-6%i~cPi!yxt`;zCi zT|_B`?r>x^T_+ijBeJ~6nx?6xr6o<*brPnjM1%ohbZnyMS!Nlk|6Qkq6a(h!nhM8!LO+GJX zB4JCxvGt5h#|#=P{h0AM?;JaK!_P%hDZCC{relU`UguM+@t+|7Y5o9|mOz@n_**Ts4(fJ7onFZi0Gk*gd*s{ha!R?qL-iu zpL$S2dkR)0;$&cW&1i0>Y`47T?T@;}^>A*uz{>3=5%+ny0OiWBn zOiWBnOiWBnOiTcTjZF6B@_F{|ZqioA;%ZFTDwYFq=+dpce|vLbTU#ITSezHH25`38 z0Z`{vTG|{MKtv7~^iVe$u)n|N%hy@W(NK?j{38HjrO1TGOJMp7i9}rc!}8yII z%@F`yA}oiPoY8w`awUGYTG8Z{@!IMdZQs#T0^G0j=%%_Dj zC#v$wS+tYA$MGP4l`PUF0#6Yg@(&P#qJu#YL6_)QP>1MX zL|#Hrh(xy`B};ML-CWjLchT8d*Pqj2*+C)uvC~AzeBfnX-uIdJdB5|WXWjt|3kwSi z3kwSi3kwSii(Q57UnYBe<1&qhYqhOos*<$r6^a2kas5`#Yv&u=+Ml5&Ri3@-$J1O7 zfD%_|Xlc>_V)DG9hnn{n_V?S&e4Epn+!YM@Cjb!21jffCg0nNEQmXcg+kc9wj!brS zGrKg;;%Z6*P~0T|G`TBK;tE2U0I;o}E2cRz+11U9x*Dyrj%2-FsK>hZ6}@uMgGh z(*+IrCvaA`ZEGFvt^Z}QYYQm_0GB8N5Rs#}M3KtaCY7;G;dM_5V5Z7s*! z3?($>92xBBq`YXK_WJ7>s@Df(ggC>)G^7OGnJhO)M-A`86i1S4X{1;{7x8gIqGsU( zr4Bpc{b_~|)!`CFT%w4>ZntfH6?4TDA?jLMKNBKyl!ldQ7MIub1~6Wv@UFIzSo;NS zc_oceF{TI!ClZ7c2_kZoc{xg{!w$fBK{cfgJ2e{-TYk$$AS2XKP^cX}bKX!+Q$N2~ zd+q_?mj-y!*9%PX8Gu!-bNwZ8hl`#&&$Hng25R=7{-R_N1cA5dVm<{!_@w~={hBLg z39)4h-7gLBps#n^q@rX#&4M84F@_TwUf~DaztXOK*$7a+RLU{$I!n$s1cLoL#-Bc! zsh3!M-FE5hft+%hRwK20s+e*e0R{o6a-Z8VHZ-@I?Ha0+UBP#>Cji5SxJKXr0000< KMNUMnLSTY2?L{sC literal 0 HcmV?d00001 diff --git a/game/resources/animated/hero/hero_die/adventurer-die-06.png b/game/resources/animated/hero/hero_die/adventurer-die-06.png new file mode 100644 index 0000000000000000000000000000000000000000..13da129f722aeac841d0751e8d86360cfd8d900d GIT binary patch literal 775 zcmV+i1Ni)jP)*Ts4(fJ7onFZi0Gk*gd*s{ha!R?qL-iu zpL$S2dkR)0;$&cW&1i0>Y`47T?T@;}^>A*uz{>3=5%+ny0OiWBn zOiWBnOiWBnOiTcTjZF6B@_F{|ZqioA;%ZFTDwYFq=+dpce|vLbTU#ITSezHH25`38 z0Z`{vTG|{MKtv7~^iVe$u)n|N%hy@W(NK?j{38HjrO1TGOJMp7i9}rc!}8yII z%@F`yA}oiPoY8w`awUGYTG8Z{@!IMdZQs#T0^G0j=%%_Dj zC#v$wS+tYA$ Date: Sat, 4 Jun 2022 18:34:15 +0300 Subject: [PATCH 102/121] Add unstable --- game/resources/static/18plus.png | Bin 15045 -> 0 bytes .../static/block_01/unstable_block.png | Bin 41739 -> 650 bytes .../static/block_03/unstable_block.png | Bin 38517 -> 650 bytes game/resources/static/brick.png | Bin 38517 -> 0 bytes game/resources/static/exit.png | Bin 461657 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 game/resources/static/18plus.png delete mode 100644 game/resources/static/brick.png delete mode 100644 game/resources/static/exit.png diff --git a/game/resources/static/18plus.png b/game/resources/static/18plus.png deleted file mode 100644 index e627de0888eaee0be228598e22b1530275da86eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15045 zcmajG1yqz#+b&E?cXvn+-QC^YFvNgJcSy)chcwbDT|-I7kOE3~gLFtr2*MfP`o6RN z^RAx-i<#%ScJF)Nb?q2!O(iUJa&$O2I4l)qd0jX-c);I3R20~gfZ&fluzzIU3dY`g zZuZ`O)}A0Z89O%{5Uq-fwF5{OWNjDVF$xlggF`%U)Hn7v)=(F6s8>ryn1uo2LU8kBErK-#U1CIbaA5uK-tXYkv+`FNS~DAP@4g z^>lRic64*4{ad58jhm0R1U;;${~Usg`+ur+_4?N|!6uB$-`bsvhm-s7kp2O*v;7aw z-N)1UAC24Da)F#dE+AKLFBq2RKUml-X=wZh{{O7j#pOR}FK=DY|BUVbiT2VDa0hYe zg1p>(JZ)i%Y|rqwTkfKAo*-*)H&1;xH|KxPxb_=2Z#SldV;hpMvks_Zhl^@ z{|gV2xAq1}(8Fe5fP-6vgGX4Ohfh>MSd>SAom)VZkNclc4L3VS`+)y1lwXvaN0e9O z|ANAn-p<E=TFkF^kW{O^4c{;&1@tE}CB?~BNPEz1S#4AatjaKO^ zv~;a4H}()cHa0pom#w(4kiOBs_>i7D^wNA0(MSgy9uLn>1{W7s8xI*Ng9sPba4(JT z)izVsYrdmU11;?|q?D}utVM}me}eL7q2E3q_{`UzbcfWdexM~BaHXZgQ@%np_$968 zJ2j~=qC&166T*>C{)dl^xVx6JrA;bWU$TWjVMJu^s^a00uknZvTX&pObfT;`{S39M z%n0YHj`j&&qk~qEF4-M~a4_RU^}7KZO~FO9PHm(G&tD_qiq$^ZBPQ_X1T*&7yVLg+I%mVn05}qvz z5TrP)J@Y=RqkhX_EO?J9Y6hzp+!ld3LwAN`%VbPSf@)kSJ|P_gx3`nrnI{rb6{A4w zO?+4{3;N^771iI?WUP1fGaU5Bvf*3pWV8;Ct zi=4AA<0me(F-5zj??MTmLk!fK9Q^QvxyWSq z?+XZ86v%irhpA*sBXv!G?1aLbKB)l81n!!jH#fx2(MV zi*6!u6~E{{imhWgsKNS@p0zGbM1GA`J|I?F5RS?l6&Zu0k9@28_f_mSY3eFJyL)E& zn3B23GPv{6em%Szd=a?03&fH`NcBx*A>6n~iPA6W2wM0Q+KKnYtQ?4>%EJvRgR0um zXDNuLIQv$@HZ-Y$XFe}jP;(*J!@zRXDiFhpYoT$V-=Q|Vn zTkK@`D@HZKQNKgwYmg|k^HyZZ=_N}>w72jGth`@svA*i69=X4_g47aB`XC0|(zSM- zA;<0Pds*~h;#bEFH6v3rML0k0H%re*li{14E>Xl1t}=>Z;K2HrMkt(;x~;4VHf-mmBx0AX)`mBI zxSGPpe*^b3Y`;ty7EnUVjL<)Nw+6%K|9_fLeMch)-oy zqUbK@jOy^`xBEi%D~I(C_k}taR0DqC_SN|s+RN?Ph1)91%R=qN%N0hD)C*?bpr$ZG z(^c52({W%OYDO_Qz0`55{@O%j2KVw(U|^)i3b=$I(c7az}%3n7R527sYSEU&ee`o zXIQ({b4cH2`h{P9Op|n{#g_wpp(gD7@mvQI*n-K7cuL!Qm|J#|qW~eqtHIQ8Qnj*^ zq{?T%CF?UO$6j+;>09p*So>s&PJ(6t*k;&fGj2ggW;ZGZ4x!)sokoMagypH{84MPC ziJ`HLz-ewsEp>Da+i(!={AaW^BTF>D)i2Q{!vuQ>@n}y^pmFWKvsJh4)n-=W&ahdo zO~ru$6MADE{2FzQ9~$F9@c6cZDOE-|9%ri*-`DH%E^jo2Klp<{MZi(~T`o&!{`_x= zbWd|X>8G;+U?OX1u{F?0^x?>xl*UQ3Je@tN?W7K)8JjA8y8t)*ZibuZWt=Oy_f7Kj z4FR)_Y*VF#bg_UU61yx|!N!L@?_SCK@M9&N)%AXK=Qhfq-zn-Hkx}$crZRM<^s5;J z?x7&mRotgp)2 z(S=S>?tagX=vr*5{GCQ#72Gwv&32bZwnB zV$N{C-`=}AP0L8#n$N$q8|xAYq3AjgUV&P~?r$Z;4n|5BH^&kFt`;59Y{u`q+P#v6 zeAv3?oS97jC^s|30+CsbO|pGOs4l;ib1a$+`JAFoQu+1GcD7c$N4^Ys;^|6dW(b8M zbOtd>p~<@8*B;Rug9riSD1s%aW+)VOz=Q6fe97Rgqg9fRYzBkZ9O~Q94;Px*Nasp4 zWbeq%xUWiSi)=ks{pBI5v=kLbh=w!P8e(KZaj6G&o$zLA(AR^ z-7Pa!9Zw^oA)=5z{s~|DaL2m;kt(i>jIZWNK(b`@RAb7g7j=PE+fE>jzQ*VjSdqKH zxZU%Z#O+>~d}kiL{f1qPqTP0w*6-#G!}kOQvh?B;oM_-5PD83+ecDr320=S@-Na~j zn~C?X>w{(yn_qMIUbUAf(!IoS0Rob3- z**1RW=Rq30o8IV6o%eW#MC^4R&7bFu6l#!Wt#fQvZ77;hRd&Z|j_|Mp=|!W` z(QXPqg&KPjE_JlFE4=~8s4w?O2LT6 zRJTUdN4DJ|pJ%KaLss7TqiejWEW*|$>BFvplm$7t=K3pheX6f$cQkQdDT!lkV9&xNR+E zaEp=ar$sNHt`*yPhAwB7kFWTF=^%!hVrJA54rW7dBZ3Be{r4_OF4G9f8L7F!Yh~Q^ zwV2hwX>ABjw=o-88jr)T(fvEm?*oFM_nZYwexp;3dIQF%J+b%jf9VoJ7 zzwEmlNyOL=M_T3`-hxwcjPzy7nvvc7W{|l+{vq^9uEq)i7%2!u7pZ44>nweLQy5^d z#mvY65N$uGr8mqCO1w5f1E*V4*qa&pVE%Zuq5pUM{H34Z4copB+wVg^Fh1l11C}C} zGnUJUN^OaOD+s)^NNN}?m1@5*z9BORzv_f(>;_*bF@&Q@qsgT@8oR45=QCCrsv(Ly zRt==sVmAI*P?uX4Lg75?ygJ3dH<2)S%w-a0!DWx6ScXc>eDSvSw}M6?hUxZM>re;s zs;Bc5?e0g?qMgb!VYu8)q_2r@!ws61^#dAqV!xU1>f@ebt_rVqfafaFZ{m)VAS@IE z*Hu>XN(tnO5B`;30ZUY0JihpR2|x}Ae6&9h3E{1C2KKSm5g= z9}^igL(x8!k~z(>*-{LA!Y*Sl?sO5|1KcCnX6`$JYph-PuZo#%_jI<4o0C^cs#+P5ME`f7TS3p8#!p_&qn!x*D}#x-+TxP3zp^KT*fgc z@`cVI3ZSH~^Bulj)*XstK-KAuX>wyB`h(p3Itc88S|L9@zpiSP3DZSy7t{gzxSHL` zsahg9VY;Pi9O*zJ1j-&3k>$EPFKls%cdD4e5Kmz*(LKst2{%Of94z2e2cVIJ))vKf-g}pQC5GiAgzs)op_5WC z@xhO`)-TV0gx$B`x-7XoJv|FgM8&;>@$vDsD|H$5s|~T{tBsWY{Qfm9jn7(z2TDHQ z)yPB7tII<83_>#O;lfsdJV|S5Ok*E#yzBC|La1=tWgXIMw zvFYqa!z|OxMJ+v6_~)5$ut+cdJs| z-kz;C0HFx+G*Z+#f-bz_^mEwuvl6jfT#q&GV63J2-%8X;J9QGpUekZpv_%-??Qx zwFJ3dnL2bLPi)|KYf4H=e8{`4uvhYJ^dk6Q#|Q9Yy{}0)bQ#Bvm5W;-pI^>}$K5Xs z4a7uyoQ(DcW0zZ;NP1qLA9Y`PR?iH7iV+eM+ng>nyjlIiVHxtU2ZFhy@`{h2HWAFL?Y{=v(;8EY#Pa$wf0N%g+iGR@uQ)1K@hD5 zH`ab15I$f-OqtEEy$W1PFRs%4cAjmV?D%-T8mmFnb2qy2;H#G9D;(;0lP3F^#=%Ip zd3M$Ys|K(EDXARW-TjzJeSQk4GlRn{@*w}+MCL#vJ{cJqDK`+Vv9U2t%E(gYV1Ap2nYOkOEvUw27*k$zopa3g8R8J#~!En9t;Mz?S@d z$S|IFw`dibaJLz1H8=Du={w{~yIlh|;P=&c{rETonqG_vZLWj>uanQrnaPKvfp(4x%r6?tkH%-LJ-^rJ|89*HNjt?AiM<2JNE zTWPtU41Km8bFhF7Z8%j-lOQ!S(|G6Hg9&BBbwKNWBjnNLTP6>~ZWJNqI;TnFpm7Ra zCdMQAW3CjsS=002khxA2O2xwvHX2_Te_&;a>8p;_=CBgQgy=urwPvm41T%N*egzE% zrAmp^iryff2Agl0ZyY=V_tK5xC6DH-7s-Z>h2*@1-J!@NTOV*FxxcJ7znP}rz22IC zurKXEBcc56*-WPXgHS<-j5wvfVUkr^7JuqW9WNs#PGP;)EQi1*Wy{@A-7@-X0w2=F zWN!FJFUiXT$U#jU#auKWAr z0Vpr2#r>z0(OELjy*60&ibJSPfrG78#xQl(@@l?+51bQ8ZQnN>{QPi0QQv^-Ahq=; zph({Ey!*~l*~SMy|J{zb8Nf2vUWC-29Z#yXTXT9HCxaMpD{>`qA2cmVgk2m-BKBIJ zr{B}c6V05&!fwpr5HT#g_~vlBaC0(C#;x;AaCRa};pDr}ro6ei`BZ`R(3!U3 z`{0kkTJX=@v$L3kP+)wT2}|~ zK=goH2?1Syq1JF<``^fkqh13g!4`53bYhc{nYl!TwAIP|p&s~2BACmtR~OiIXq+dQP9P z#{T=DjXIdbwZpuwaAO?Lu&w&>b7?8^FUb&8+%Y{xD8A&Ws8`%2^NJitGEd6Is2ztdzYT-!4-p`0Ekd6zm>>Tn^*xntC zA&}{=r(ab`N-ohxFQuiivx*mt2xGH^ht7npjQQxpqD}hsuE!2nv#;mx@*}*IGgDIV z=iUV%`nNqMyeM+#`fUUhvu!t1T*=%jAanDN`RGFQ%`}gkm$(6%W-vwmqf)m*jxt0_ z>;5WLsQPt(wS`#Q;|y2tlg(*6fMl3g8%nIuDjDTwXSVK#BW}EzI4b+F zjW6&eamftQzZEB=eK&`y)}F?@U9ka8+z&`DHgV^W)f8|hT530G77Mj^T|$bR z9dr+iY4n^BIoRsQ;38CLDC9zs$t&JEzPl{a%_H0$J5cUdIjl(|$!lHU$MLkla^uYx za?3wD7%Y}@U27}+eR*76j~!^K3CZPJDDE3Ono6j;(Pp0nV43C0OthjpL{>i`A#zRZ zzDbFK+Vk2BMi*X>`~6%q$;VZcg)EVjY)=0CBdsy=+^6}bG`39CX`c5FS`qGhJ_dfw zt1y&u!;q)T5e>7QzAPmx|LusvjnzUKMDurNEuJzAaF4}$VQUZMSQu3NO!}H+^jX*< z3tIsNQPhDfhj&`J!qduBRBs(09cRnP49eTlb-3LvIa#Ig%p_IhpjF~g1_lZWB>f|K zej734oESX|sFNZd9a%7=DdV9V;4K%0Ex>f~fy(k~rCR0#%4kG9Pr+Q6-A71D+DR_$ zT{>FnhwDZ!m!Vj?8sPrg1?+4cfT=3mUC`v$uPm2-0YqZVD?c8pV3q`Feb4W=Q&|lD zB51u*tgI@WcBc<^21az+3M~pH*a24rzR$lGd&!H320DR84PLiVXar2839|$4Kdi|y z=(uL~UM59$MMkNWY>PfSNRIY}A|Xy z0Q1e~i4&@{w?&Az4x=$VFLoBSw{0rd`q9euLjL?(+#3bP|9*X>kI&_#?S`$^|0nwL zuJ>h~w92E!K7D&731+$&@Z!g!L3Ib1_0n>^7uk%6F=A++=8}e_hY|+GodaNpV}fb) zQ@CEVMZxE-Ds&7(qP;ouFmK`p6t4bV)rrGIz#Y~sEZT1YOeqE?F8;`&%5RXYkR%=&**SLHj z6yx*SR|l9jvm75ltB*HBUxM3dcT&q!`oN`Y3?v%58;X>gm!7aAntZRzP)XztugT+w z;?4QyW~TGz7ndA!+DjGNviHd2mFDMPgB0XVdV)kmy$|1C{up8Zl$_4c1G8XlZ%>y! ziw2p0m_X7fLLFUONtMI5B!auX?~l-g>fcg^{`qCJ7V>yDe1$<*7CiGqyU{OKvmptU zJMiX>9O^esG6HOW0nu|BNL+$M`O5t3#<`mVXE)2t-wOUt*GNU zLq+UGU(FNx9Aw+@MtHy4e-*R7Xot9tgP#%*g6OH?8LH9m1$7S)tZsO_N<_4l?NLc=hWrq%QMMl$YX88;#54= z)YEd8VLSm|WD1iKOO93*z461?uaAouUuRHex1*1zm1wZ4P!&A9&sOGfdp}Z%kuQ_Q zei(PZJm)bFh$4Wy63o%w4rm>reuo)H!jE`}o&TA~u66eIEMP#CgCi zq@di5Od-?Fz>``TqaevqGq-M#_|a~xG_?OfKVwZBR0IH9uDu)Zu_XRANS_6{O`w zvpfb~2$U|BK72;OEJ$piA>Z14y^lZz^(kV-bPYzA-0u9;XF>UN|GAK}I{R zVsFTwEldx_U;Pmnd$OyW%s8I0c6)P0-0W(A!I~ZbU@#VzVId}(&?4gWUzW>*1-gD? zYTg_e>`r%boGD`!h<}xn{e{FnII`YbJX@$8d zK-piqeL_Wx1cL|7ayg_dJFGNJkLXh~_Z*4WNkw->x=~nCILj* z&G=?;Frgsup4N>#$RHPZOL%+jJYSXGK+Q(j_FM$CD%jnMWvKZu<}urSh$+NW)@TDM#lk zbQnHQ3cnt=?kBc*kjs4~fcOd{Lk=nexDUEGUt`U%K`62ZZAmyJFH!ebzF~`M3%$ua zO+wXzgZ3y(lDT-3a|<8x`?4>qthUCLW=dD&1g^XK$*T@rKN(cCy!x)1#ZYk+7Xtjm zkl;+thK*6Gt9t17+5#uQB_;7^O%Lk2h1~a$V?A1QNGXtYC(e#aOiQxbP?PG(tTnbY z6Su{Ee^PskIldiFnWNu^=s1aUO^wUO5Hfc$bYp7wahPa9xjpUVvsDP58c&$^L4iO0 zqcW0UPa`nmx4hoi^6Cl+Rst_lwYCiO>d#Y?I4ggc_7x9L*CGF0M0shLg2!T=1zm8Y z9kl?>t<3FEMIx~#5#YB>y9Aaf8N}_{z9ADA&1Zo3T;WLs0j1Oadv?-6VUVP^5cADp$`v{qE!z0x4J`So?7n<^oD! z^(0UX*~oql{B;bP*!<%_%wcM0x*fZ-HF^uPOLURcf-cm-Ek{Do;&cmbVd4BIeKtA>Ews+XGQN_TMs-4(jjUMP}=4h28Ud0rbVavXz#N_+cDOs6LccZw{+v=>M*lg z0vWyHxctp*CAf6=z8d(Qydf8NTejT3Z$P##+m?8?TubPfB3mX3n`&2fb@48isOA@& zZ#LK94w@`2d;!^jtmWFn{g1>PUBix ztj68sk}-|2AUgi-;q*Y-_Ui#;sC)x` zf$gTAAtVJ+3vJ#kaqqfFT2(j#)5v7s2H*bjcGZnS?)#$UyITD$$yT?`k1*$y3MSzF zQZEl$wz|uh!a0K+t!wz6^HkefVF-`8bmo={?Lz=qf{=bY?A2hb z?AA^kmtd^Q1wKO4mgmLN#;(sX&*=*v(b~N|LC7+ z8FW()#gl!iUP|uK$kB$_#Tcidtp(q$AI?{Q0!_ZaELA}yHB>pEwB&G4*^WEJ80yKw zW<0zUcxltXLa^05+6CBd9OrDZ3m1mjwn=>2sK<|_$XaTXY{p7(8%sXs^Aq}Sc&BDA zWfr(z&sVJ1`;)BFKb#fD+9*mVbc)3+~h!^ zhNK^HZT>xrPw5t8ILYmZ@r`x^Ebg#hy;g~=_9@mU3-wd<%WkR`_nRr&y@^`C^NmPj z70;fFe#z1lpvXAA@qC!YZ`MaYeOW0Fga8cU=!h)LNku2Q1%g{ zT2l~!B3hA%e4}u^H#D@yyd57$^1jfyGY0Nd?NkrFVR!D&htQeQol&^DA`*~88+$xu zO!(t@;<3o??k@28=|R~40ytGL-R5BnB9X2$Yn_O06COhw8Qzn^Fes1=#)NhqS5?a^ z&@2C}&=D@v_Jk*2U(Z2_=Sl^-AndRJe&}|k8=UUKve9xwB3^|N#w_~6V&*(i><8+3 zqVu>7r>D+(GXodIMc0#3G!pM_lY3NEjkd^#P?D3YPU2=w5~^b9oBKlM}ffzwiW(c zeefk7C_2wVA)w10tg$tJgFszf{3^rR*tt1h3M%_7&w{yB>&7Nu7awBY^JWN`O)~Ks?NYDw08ziwJ z5+#07RRql50^FM+C2$DXC3U$X0lfE{dEKBc!}2pyvnRRUvW$QxW%ZA=U4m z?48u}VTFf71{kG-@Psg2&mb%a94sdz$;H`JK_(}wc`9W2fYId30n2*FMxggs3VB|k z-C`k=8Dv;-rUDHx2u&^QBH~ho-hDByq{ThOh}{?zDo^vMZ)Av;y5gGWO5$l3wnjkb z;~O%K$czl`yFf;!Q9SB1GbQ_^mTm%xCA@sKch2T@K=1eD-(XBvW=*5*t>Y62uf4C7 z0V1xUS9tnF#F_DlGb0U|z=r5caDB0m3x0BPOZ?C)Yhu7YTpybEZAA#Qjoa?$QUlAk z3E~qX8z&ZJ!O1W6Z??DBWP$43ZkVc&>?Hr$@m0e%_W(Y7TEB0k4M4gtkzl)P=f_yy z$_~6cd1XjuTOWRuTt=IJi4ud`1Z4xvYy+A(9$P209YdbXOc@HD+vWjLenSw>Qi1HDiYa>LiQ6^kMu<6d8`7)mq?df7mN9= zNt`E!G#peFNJ^OP%~dvN_}6)tEx!zeff#arX>K6-77Pk6>{DjRO}@c76!lb$m)__K zuvrJ!0(0zFBkP=3I?R=#r_))%3b9!wS?=_B6hGY7W7k?Yz<+HK&wr=>*uP~qI(uU0 z0C|+&H@r6Oto01LCgD!lHSd1Ahjd{pm}h9EgtJ2yFZvdJZnx3a#keEdLZU+_A3 zEA_^6O%-KpwQHIC{S%|wAO%vXH3i5Flw%-4Ov}L?TsPzmRYkegBfW2&$1DQwsqS_? z@uC~n;@9KOHS08L3@DBo8bt8}WmQS9_8qr{m#N+}^SC!A)YuckvPDHtaa{dA+Yvi- zV9}EIJ}2%^FV8p+*9T_X-h9_#y>kfaT3*MfBg@1FOGh~D8hr(r?W44sT^9&JCyQ~P zP~S!qEz_@lRv3)Udro$bHh{&Dirn2r!0IzZF2as4F$V=C)A)0^?2QW5ga&jC*##)! zwav}M6RDFZ6PL(rXLHTP4TFB?A3Y}}*$3q4-VR8AtO4l5AGguG!9PYhsE{{S$9GR7 zypyaZ$D}}?r1&b|h3mMqzjRxpU-z-NpuC^e&^i&KnS%C|6MkY?O|E7Bc&i-r+i|eP zi8=puIF;>D|2S85kJQCvjVe6nVmuNjF-eU#ZNxKfxsq~A6<)hptK!a7QS|wWfw(HF zmA+Lo%N)8IiRLyE*1RbbVsH2(jtKpw%M8m`dT0j)anRd)vuI5e@10R*5Je)c;L?|+ zVE~iiw=LypgF*TlJ^I?#BOFO*P>H90b>twOoZUb(kgY2@>kg%=XT6Mce+p9h?(?&; zJaY9L8P;r zhC3f{`j-pC{7c=*&3DsIP{>Q$yvHTEC*2W943LX;D-GiIg*IP3Mf8YsF-VPYDw6q~ zwJ5i}gbezfFj2ETNh0lDU6v?Tn(sFA-z#&k%xb$k5=Is4WH@cv2R_J0c=2Gsa_q`& z=aR26DOt4eY$-#~GsWyNJ(Us-+k=8C3p3r_$uH_Fum2`tz9<_p=H_fQ$xge^5j`6a-amxR z?O5NxT(jlGC@6jKxVik6-q-;bz@#>7SzJUu5pWn`{M{zZA4 z)yjpOEIx5Zcr6~4a}AL|MdN@(F$-olvxUYU=x4cJxUg*bh4v5f7%+mYK&WIFp96hj zcF0XdUhgrCp}P7NK2F0605(8}?pTf?3?GMyM)7>uza&+o-Er%}^H}eYiAyBei~jsS zWIhnUV5-~lU8vR8we!~SaEIkiq&;5E460#axxe+%Yth)zAH{*5{?Zof7=>S0%r91|3z8s z_`fKNuNUIzo`1lJ>d*hObs)mPtKmf@ZZMhMNpZ~8co8b2DZfOLP_j@wnSw4oGa%t< zoGn?O-u+OH%}HRMQL_P2y2~+INSU*B5jdUeQrpAX9_>EHVC3`KInN;d zWUmkJbTJ#$`N1!Q5Z}!CFrHELezkS8ztvH%#%~lHw6&kzk#EM-0Ha#!LSh5C7_F-(7l%M{7BCSu zl#O0)_F2YiN2OtaFT#?u?O!xlrtO{X__{KUGe&Kx=QpQ&?6gH!!7mc%hV^BkH=`{t z40^in#nen47{NsFP#a!>GmpRkEWt5Ta>KuAsAlebQO^ZbVlJZ}!+-NH33MAh!51zY zl(>}%6ba>lJ-<$BjTgC6x>Rg_`FYm$7Y@lHjZ;Ex8u@Eqb;q52eK#ohfjc~wX#4FP z>O>?~0-LmW)_IK?$;3)a36mW_{W(u;d$VUflk$L#@7XFO?EIjhh(?5-q}Ka>bd*M8 z;g_H67d$+`HBvRp%v%jEuZqzUUV^C93DcH%v>;+mCDZI=k@NyZ&z`_qPmr+kX)`)e zVLBHM2VIye8TA{&A*e~3^T2u3#B}2Sra#lgd<;2EO1{f2*zhQufN`JYD*TJrdf&BT zp2+?{3eY{*(;JKivMQozCvwh+ucqM;gl{RAH&`vc4GYiw0<~_fPD6JtdG`Q%ZMqrz z9i3;43BP*5mw??2omdY;I1|fUEvjV5H-glbDS?xdv0=q=gv;Tv{B2fW9-&J@nEEir zZR965@pOc)I8I5k9)?lsPf@8|#9G{n zU=~zg8>|RJk|D71P&|-Fyk4PyJ`1~`glTdNxq4urCt0L#59VMtT$S2-g8WgYP{I_- ze1?7^W2C6O^}$gvxVAZq6SKK|TaLhP-WTD0U$oQ%rYxh_|54c&Zk%7uh8E>5bNLy*p#43Q!gNOX57{G3YIp9)gzvy&=AJ#HV0s17_|t?DO&rS_%3z zgu0Z=FdY9%6o^@e91{D^1utrcgro|U2waMn8VmJ=fk4E{b!DIL5jI{;MJm?ZXR!l4 zZ-1N?;Ul~-mbox8PM|T2YX^G^Ac~4TAi^Sg)KyEPj#)0++68tapubfE8Kbeg+Ua}PZlC@IaOZ-L1UfO=-4?L2Y@Wkl0F`Aj_HeqPPihxZpm_avu8Tyqk)-_^EYgLRai(t*B7hpQ6IT0IH7 zlO#Y7@uKPj0W7_(S7)5`2Dbvae*b(aVew}CHN-1wNjHuIyGn$SgsflqDTB~}zjPt@ zV-8V_F>+4Okoj-RoI@WuomFGFCv6O279%SpH3+=I-nX|+{vrsYs3*r^1?`vghV#4{ z?vlY9pIYT`#9LN154s~(B3}p2BUG9p!Fq=>^i8Hn#YZ>#Iu@yh{Er!ajGRG;LZJcl zd;}Ux;byyi%)Oj_NlUn_Fk(VUI^!gWb>utU>!O9Bo}`9{3*CA_CWQm}nUxUza-I8o Ou~bDtQ@&0X2>w3~N#kDt diff --git a/game/resources/static/block_01/unstable_block.png b/game/resources/static/block_01/unstable_block.png index 369db62f6039327877e9c0c197105c8b9902c2d2..b9b10549d4bd86f7461082a2ed8b5fa9af4a520c 100644 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Po3?xrFN1X&xEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBC}9xb6XN>n%Bsi5XWTu| zdtpuX>x;{G21sKVxIz)mPr)@d{`!LyM=2V+hA}-?Ik=n;dvpFGO_l@LHH8aPDOJ zwjg|y=!b<3JFJ;YJvgJ7*4}81{Bpp4@1K(@C97twvNNBqy_HLr!Jw3r>%|MFPCp-| zoh~!39c;3>w{LsWO{PcjoHwr?+QYTZT4(CQl1TU4UCSi5y*VV4FZS#4Q@+3d`d`iz z(a%Wvbwd9StC5(KQ02WJD}e5CNsaJK^YvxW0AeI7R1_tH@j0~V) zWdw;WV1mgqF)Uz4ut5sBe{5|9QmQ4c5hW>!C8<`)MX5lF!N|bKNY}tj*T5vi(Adhv z%*x1A+rYrez~GskA25QDH00)|WTsW()-XN!+h3ptL68lp6`5&P&iOg{MZpD$$*By6 z{Ii)nfs#USNmrl>|FpE?)Di|Gvta2(sX$o?xNJaXMQTojOJ;6rUU6oA9)qc&(Kfvu acQDmNqNveUj9dj&!{F)a=d#Wzp$P!rcFH0E literal 41739 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 X-q;(1QDQF`3h+^qQ-56{^Ct8^vZ69u diff --git a/game/resources/static/block_03/unstable_block.png b/game/resources/static/block_03/unstable_block.png index f65c6f1cf3032260569cd8f0c2d4c9fbd97df4e3..b9b10549d4bd86f7461082a2ed8b5fa9af4a520c 100644 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Po3?xrFN1X&xEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBC}9xb6XN>n%Bsi5XWTu| zdtpuX>x;{G21sKVxIz)mPr)@d{`!LyM=2V+hA}-?Ik=n;dvpFGO_l@LHH8aPDOJ zwjg|y=!b<3JFJ;YJvgJ7*4}81{Bpp4@1K(@C97twvNNBqy_HLr!Jw3r>%|MFPCp-| zoh~!39c;3>w{LsWO{PcjoHwr?+QYTZT4(CQl1TU4UCSi5y*VV4FZS#4Q@+3d`d`iz z(a%Wvbwd9StC5(KQ02WJD}e5CNsaJK^YvxW0AeI7R1_tH@j0~V) zWdw;WV1mgqF)Uz4ut5sBe{5|9QmQ4c5hW>!C8<`)MX5lF!N|bKNY}tj*T5vi(Adhv z%*x1A+rYrez~GskA25QDH00)|WTsW()-XN!+h3ptL68lp6`5&P&iOg{MZpD$$*By6 z{Ii)nfs#USNmrl>|FpE?)Di|Gvta2(sX$o?xNJaXMQTojOJ;6rUU6oA9)qc&(Kfvu acQDmNqNveUj9dj&!{F)a=d#Wzp$P!rcFH0E literal 38517 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 z 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Ğ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%0AWEVG`uxprhN8Uq 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�$3mrc<@4!uQE?<>N=Ym{GnkApYA;KajkIPu^s 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 From 77c145cfc7de6301f86955ad2e60b084c30bd2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sat, 4 Jun 2022 18:49:27 +0300 Subject: [PATCH 103/121] fall death --- core/CMakeLists.txt | 2 +- .../condition/FallDownCondition.cpp | 13 +++++++++++ .../condition/FallDownCondition.hpp | 22 +++++++++++++++++++ .../statemachine/HeroStateMachine.cpp | 5 +++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 core/event/management/condition/FallDownCondition.cpp create mode 100644 core/event/management/condition/FallDownCondition.hpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 27ad6ad..d7b223a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -103,7 +103,7 @@ set( event/management/condition/KeyDownCondition.hpp event/management/condition/KeyDownCondition.cpp event/management/condition/TimerCondition.hpp event/management/condition/TimerCondition.cpp event/management/condition/CollisionCondition.hpp event/management/condition/CollisionCondition.cpp - event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp event/management/condition/EnemyAttackCondition.hpp event/management/condition/EnemyAttackCondition.cpp event/physics/Death.hpp event/physics/Death.cpp) + event/WorldUpdate.hpp event/WorldUpdate.cpp ../game/mobs/hero/Hero.hpp ../game/mobs/hero/Hero.cpp event/management/condition/KeyReleasedCondition.hpp event/management/condition/KeyReleasedCondition.cpp event/management/controller/JumpImpulse.hpp event/management/controller/JumpImpulse.cpp event/management/condition/LastStateCondition.hpp event/management/condition/LastStateCondition.cpp event/management/controller/Movement.hpp event/management/controller/Movement.cpp event/management/controller/StartJump.hpp event/management/controller/StartJump.cpp event/management/controller/FlyUp.hpp event/management/controller/FlyUp.cpp event/management/controller/Fall.hpp event/management/controller/Fall.cpp event/management/controller/GroundMovement.hpp event/management/controller/GroundMovement.cpp event/management/condition/EndAnimationCondition.hpp event/management/condition/EndAnimationCondition.cpp event/management/condition/FallCondition.hpp event/management/condition/FallCondition.cpp event/physics/SensorCollision.hpp event/physics/SensorCollision.cpp event/management/condition/SensorCondition.hpp event/management/condition/SensorCondition.cpp event/management/controller/Attack.cpp event/management/controller/Attack.hpp event/physics/SensorCollisionEnd.hpp event/physics/SensorCollisionEnd.cpp event/management/condition/SensorEndCondition.hpp event/management/condition/SensorEndCondition.cpp event/management/controller/statemachine/HeroStateMachine.hpp event/management/controller/statemachine/HeroStateMachine.cpp event/management/controller/statemachine/EnemyStateMachine.hpp event/management/controller/statemachine/EnemyStateMachine.cpp event/management/controller/EnemyAttack.hpp event/management/controller/EnemyAttack.cpp event/management/controller/Die.hpp event/management/controller/Die.cpp event/management/controller/Destroy.hpp event/management/controller/Destroy.cpp world/filter/RadiusFilter.hpp event/management/controller/DealDamage.hpp event/management/controller/DealDamage.cpp event/physics/TakeDamage.hpp event/physics/TakeDamage.cpp event/management/condition/TakeDamageCondition.hpp event/management/condition/TakeDamageCondition.cpp event/management/controller/Hurt.hpp event/management/controller/Hurt.cpp event/management/condition/Counter.hpp event/management/condition/Counter.cpp event/management/condition/EnemyAttackCondition.hpp event/management/condition/EnemyAttackCondition.cpp event/physics/Death.hpp event/physics/Death.cpp event/management/condition/FallDownCondition.hpp event/management/condition/FallDownCondition.cpp) add_library( ${LIBRARY_CORE} STATIC diff --git a/core/event/management/condition/FallDownCondition.cpp b/core/event/management/condition/FallDownCondition.cpp new file mode 100644 index 0000000..f2b28d6 --- /dev/null +++ b/core/event/management/condition/FallDownCondition.cpp @@ -0,0 +1,13 @@ +#include "FallDownCondition.hpp" +mad::core::FallDownCondition::FallDownCondition(std::shared_ptr world, Entity::Id m_entity_id) : m_entity_id(m_entity_id){ + enemy_entity = cast_to_or_null(world->get_storage().get_entity(m_entity_id)); +} +std::unordered_set mad::core::FallDownCondition::triggers() { + return {Event::Type::WorldUpdate}; +} +bool mad::core::FallDownCondition::is_triggered_by(const mad::core::Event &event) { + if(enemy_entity->get_position().get_y() > 250) return true; + return false; +} +void mad::core::FallDownCondition::on_start() { +} diff --git a/core/event/management/condition/FallDownCondition.hpp b/core/event/management/condition/FallDownCondition.hpp new file mode 100644 index 0000000..5d44271 --- /dev/null +++ b/core/event/management/condition/FallDownCondition.hpp @@ -0,0 +1,22 @@ +#ifndef MAD_FALLDOWNCONDITION_HPP +#define MAD_FALLDOWNCONDITION_HPP +#include "Condition.hpp" +#include "world/LocalWorld.hpp" +#include "world/entity/Entity.hpp" +#include "world/entity/PhysicalEntity.hpp" +#include +namespace mad::core { + struct FallDownCondition : Condition { + public: + explicit FallDownCondition(std::shared_ptr world, Entity::Id m_entity_id); + bool is_triggered_by(const mad::core::Event &event) override; + std::unordered_set triggers() override; + void on_start() override; + + private: + Entity::Id m_entity_id; + PhysicalEntity* enemy_entity; + + }; +}// namespace mad::core +#endif//MAD_FALLDOWNCONDITION_HPP diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp index 5eb9b7f..3fc0675 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.cpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -2,6 +2,7 @@ #include "event/management/condition/Counter.hpp" #include "event/management/condition/EndAnimationCondition.hpp" #include "event/management/condition/FallCondition.hpp" +#include "event/management/condition/FallDownCondition.hpp" #include "event/management/condition/KeyDownCondition.hpp" #include "event/management/condition/KeyPressedCondition.hpp" #include "event/management/condition/KeyReleasedCondition.hpp" @@ -67,6 +68,10 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, machine->add_transition(ground_left, die_idle, std::make_shared(attack_count, 5)); machine->add_transition(ground_right, die_idle, std::make_shared(attack_count, 5)); + machine->add_transition(fall_idle, die_idle, std::make_shared(world, hero_id)); + machine->add_transition(fall_left, die_idle, std::make_shared(world, hero_id)); + machine->add_transition(fall_right, die_idle, std::make_shared(world, hero_id)); + machine->add_transition(die_idle, destroy, std::make_shared(hero_id, ImageStorage::TypeAction::Die)); From e4ea0205115d40cd74105a61cfedaa75888b8904 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 4 Jun 2022 21:52:23 +0300 Subject: [PATCH 104/121] Move resources --- game/game_database_example.cpp | 8 ++++---- game/game_runner_example.cpp | 2 +- game/game_with_default_loader_example.cpp | 2 +- .../enemy/enemy_attack_beg/slime-attack-0.png | Bin .../enemy/enemy_attack_beg/slime-attack-1.png | Bin .../enemy/enemy_attack_beg/slime-attack-2.png | Bin .../enemy/enemy_attack_beg/slime-attack-3.png | Bin .../enemy/enemy_attack_end/slime-attack-4.png | Bin .../animated/enemy/enemy_die/slime-die-0.png | Bin .../animated/enemy/enemy_die/slime-die-1.png | Bin .../animated/enemy/enemy_die/slime-die-2.png | Bin .../animated/enemy/enemy_die/slime-die-3.png | Bin .../animated/enemy/enemy_hurt/slime-hurt-0.png | Bin .../animated/enemy/enemy_hurt/slime-hurt-1.png | Bin .../animated/enemy/enemy_hurt/slime-hurt-2.png | Bin .../animated/enemy/enemy_hurt/slime-hurt-3.png | Bin .../animated/enemy/enemy_idle/slime-idle-0.png | Bin .../animated/enemy/enemy_idle/slime-idle-1.png | Bin .../animated/enemy/enemy_idle/slime-idle-2.png | Bin .../animated/enemy/enemy_idle/slime-idle-3.png | Bin .../animated/enemy/enemy_run/slime-move-0.png | Bin .../animated/enemy/enemy_run/slime-move-1.png | Bin .../animated/enemy/enemy_run/slime-move-2.png | Bin .../animated/enemy/enemy_run/slime-move-3.png | Bin .../hero_attack_1_beg/adventurer-attack1-00.png | Bin .../hero_attack_1_beg/adventurer-attack1-01.png | Bin .../hero_attack_1_beg/adventurer-attack1-02.png | Bin .../hero_attack_1_beg/adventurer-attack1-03.png | Bin .../hero_attack_1_beg/adventurer-attack1-04.png | Bin .../hero_attack_1_end/adventurer-attack1-02.png | Bin .../hero_attack_1_end/adventurer-attack1-03.png | Bin .../hero_attack_1_end/adventurer-attack1-04.png | Bin .../hero_attack_1_end/adventurer-attack1-05.png | Bin .../hero_attack_1_end/adventurer-attack1-06.png | Bin .../hero_attack_2_beg/adventurer-attack2-00.png | Bin .../hero_attack_2_beg/adventurer-attack2-000.png | Bin .../hero_attack_2_beg/adventurer-attack2-01.png | Bin .../hero_attack_2_beg/adventurer-attack2-02.png | Bin .../hero_attack_2_beg/adventurer-attack2-03.png | Bin .../hero_attack_2_beg/adventurer-attack2-04.png | Bin .../hero_attack_2_beg/adventurer-attack2-05.png | Bin .../hero_attack_2_end/adventurer-attack2-03.png | Bin .../hero_attack_2_end/adventurer-attack2-04.png | Bin .../hero_attack_2_end/adventurer-attack2-05.png | Bin .../hero_attack_2_end/adventurer-attack2-06.png | Bin .../hero_attack_2_end/adventurer-attack2-07.png | Bin .../hero_attack_3_beg/adventurer-attack3-00.png | Bin .../hero_attack_3_beg/adventurer-attack3-01.png | Bin .../hero_attack_3_beg/adventurer-attack3-02.png | Bin .../hero_attack_3_beg/adventurer-attack3-03.png | Bin .../hero_attack_3_beg/adventurer-attack3-04.png | Bin .../hero_attack_3_end/adventurer-attack3-02.png | Bin .../hero_attack_3_end/adventurer-attack3-03.png | Bin .../hero_attack_3_end/adventurer-attack3-04.png | Bin .../hero_attack_3_end/adventurer-attack3-05.png | Bin .../hero_attack_3_end/adventurer-attack3-06.png | Bin .../hero_attack_3_end/adventurer-attack3-07.png | Bin .../hero_attack_3_end/adventurer-attack3-08.png | Bin .../animated/hero/hero_die/adventurer-die-00.png | Bin .../animated/hero/hero_die/adventurer-die-01.png | Bin .../animated/hero/hero_die/adventurer-die-02.png | Bin .../animated/hero/hero_die/adventurer-die-03.png | Bin .../animated/hero/hero_die/adventurer-die-04.png | Bin .../animated/hero/hero_die/adventurer-die-05.png | Bin .../animated/hero/hero_die/adventurer-die-06.png | Bin .../animated/hero/hero_fall/adventurer-fall-00.png | Bin .../animated/hero/hero_fall/adventurer-fall-01.png | Bin .../hero/hero_fly_up/adventurer-jump-03.png | Bin .../animated/hero/hero_hurt/adventurer-hurt-00.png | Bin .../animated/hero/hero_hurt/adventurer-hurt-01.png | Bin .../animated/hero/hero_hurt/adventurer-hurt-02.png | Bin .../animated/hero/hero_idle/adventurer-idle-00.png | Bin .../animated/hero/hero_idle/adventurer-idle-01.png | Bin .../animated/hero/hero_idle/adventurer-idle-02.png | Bin .../animated/hero/hero_idle/adventurer-idle-03.png | Bin .../animated/hero/hero_jump/adventurer-jump-00.png | Bin .../animated/hero/hero_jump/adventurer-jump-01.png | Bin .../animated/hero/hero_jump/adventurer-jump-02.png | Bin .../animated/hero/hero_jump/adventurer-jump-03.png | Bin .../animated/hero/hero_run/adventurer-run-00.png | Bin .../animated/hero/hero_run/adventurer-run-01.png | Bin .../animated/hero/hero_run/adventurer-run-02.png | Bin .../animated/hero/hero_run/adventurer-run-03.png | Bin .../animated/hero/hero_run/adventurer-run-04.png | Bin .../animated/hero/hero_run/adventurer-run-05.png | Bin .../animated/hero/idle/Chara - BlueIdle00000.png | Bin .../animated/hero/idle/Chara - BlueIdle00001.png | Bin .../animated/hero/idle/Chara - BlueIdle00002.png | Bin .../animated/hero/idle/Chara - BlueIdle00003.png | Bin .../animated/hero/idle/Chara - BlueIdle00004.png | Bin .../animated/hero/idle/Chara - BlueIdle00005.png | Bin .../animated/hero/idle/Chara - BlueIdle00006.png | Bin .../animated/hero/idle/Chara - BlueIdle00007.png | Bin .../animated/hero/idle/Chara - BlueIdle00008.png | Bin .../animated/hero/idle/Chara - BlueIdle00009.png | Bin .../animated/hero/idle/Chara - BlueIdle00010.png | Bin .../animated/hero/idle/Chara - BlueIdle00011.png | Bin .../animated/hero/idle/Chara - BlueIdle00012.png | Bin .../animated/hero/idle/Chara - BlueIdle00013.png | Bin .../animated/hero/idle/Chara - BlueIdle00014.png | Bin .../animated/hero/idle/Chara - BlueIdle00015.png | Bin .../animated/hero/idle/Chara - BlueIdle00016.png | Bin .../animated/hero/idle/Chara - BlueIdle00017.png | Bin .../animated/hero/idle/Chara - BlueIdle00018.png | Bin .../animated/hero/idle/Chara - BlueIdle00019.png | Bin .../animated/hero/run/Chara_BlueWalk00000.png | Bin .../animated/hero/run/Chara_BlueWalk00001.png | Bin .../animated/hero/run/Chara_BlueWalk00002.png | Bin .../animated/hero/run/Chara_BlueWalk00003.png | Bin .../animated/hero/run/Chara_BlueWalk00004.png | Bin .../animated/hero/run/Chara_BlueWalk00005.png | Bin .../animated/hero/run/Chara_BlueWalk00006.png | Bin .../animated/hero/run/Chara_BlueWalk00007.png | Bin .../animated/hero/run/Chara_BlueWalk00008.png | Bin .../animated/hero/run/Chara_BlueWalk00009.png | Bin .../animated/hero/run/Chara_BlueWalk00010.png | Bin .../animated/hero/run/Chara_BlueWalk00011.png | Bin .../animated/hero/run/Chara_BlueWalk00012.png | Bin .../animated/hero/run/Chara_BlueWalk00013.png | Bin .../animated/hero/run/Chara_BlueWalk00014.png | Bin .../animated/hero/run/Chara_BlueWalk00015.png | Bin .../animated/hero/run/Chara_BlueWalk00016.png | Bin .../animated/hero/run/Chara_BlueWalk00017.png | Bin .../animated/hero/run/Chara_BlueWalk00018.png | Bin .../animated/hero/run/Chara_BlueWalk00019.png | Bin .../background/background_01/background_01.png | Bin .../background/background_01/background_02.png | Bin .../background/background_01/background_03.png | Bin .../background/background_01/background_04.png | Bin .../background/background_01/background_05.png | Bin .../background/background_01/background_06.png | Bin .../background/background_01/background_07.png | Bin .../background/background_02/background_01.png | Bin .../background/background_02/background_02.png | Bin .../background/background_02/background_03.png | Bin .../background/background_02/background_04.png | Bin .../background/background_02/background_05.png | Bin .../background/background_02/background_06.png | Bin .../background/background_02/background_07.png | Bin .../background/background_02/background_08.png | Bin .../background/background_03/background_01.png | Bin .../background/background_03/background_02.png | Bin .../background/background_03/background_03.png | Bin .../background/background_03/background_04.png | Bin .../background_with_finish/background_01.png | Bin .../background_with_finish/background_02.png | Bin .../background_with_finish/background_03.png | Bin .../background_with_finish/background_04.png | Bin .../background_with_finish/background_05.png | Bin .../config_background/config_background_01 | 0 .../config_background/config_background_02 | 0 .../config_background/config_background_03 | 0 .../config_background/config_background_with_finish | 0 .../config_decoration/config_decoration_01 | 0 .../config_decoration/config_decoration_02 | 0 .../config_decoration/config_decoration_03 | 0 .../decoration/decoration_01/arrow.png | Bin .../decoration/decoration_01/gross.png | Bin .../decoration/decoration_01/head.png | Bin .../decoration/decoration_03/stone.png | Bin .../decoration/decoration_03/tree.png | Bin .../levels/level_01/config.json | 8 ++++---- {game/resources => resources}/levels/level_01/map | 0 .../levels/level_02/config.json | 8 ++++---- {game/resources => resources}/levels/level_02/map | 0 .../levels/level_03/config.json | 8 ++++---- {game/resources => resources}/levels/level_03/map | 0 .../levels/level_with_finish/config.json | 6 +++--- .../levels/level_with_finish/map | 0 .../static/block_01/begin_block.png | Bin .../static/block_01/end_block.png | Bin .../static/block_01/finish_block.png | Bin .../static/block_01/ground_block.png | Bin .../static/block_01/middle_block.png | Bin .../static/block_01/separate_block.png | Bin .../static/block_01/unstable_block.png | Bin .../static/block_03/begin_block.png | Bin .../static/block_03/end_block.png | Bin .../static/block_03/finish_block.png | Bin .../static/block_03/ground_block.png | Bin .../static/block_03/middle_block.png | Bin .../static/block_03/separate_block.png | Bin .../static/block_03/unstable_block.png | Bin 183 files changed, 21 insertions(+), 21 deletions(-) rename {game/resources => resources}/animated/enemy/enemy_attack_beg/slime-attack-0.png (100%) rename {game/resources => resources}/animated/enemy/enemy_attack_beg/slime-attack-1.png (100%) rename {game/resources => resources}/animated/enemy/enemy_attack_beg/slime-attack-2.png (100%) rename {game/resources => resources}/animated/enemy/enemy_attack_beg/slime-attack-3.png (100%) rename {game/resources => resources}/animated/enemy/enemy_attack_end/slime-attack-4.png (100%) rename {game/resources => resources}/animated/enemy/enemy_die/slime-die-0.png (100%) rename {game/resources => resources}/animated/enemy/enemy_die/slime-die-1.png (100%) rename {game/resources => resources}/animated/enemy/enemy_die/slime-die-2.png (100%) rename {game/resources => resources}/animated/enemy/enemy_die/slime-die-3.png (100%) rename {game/resources => resources}/animated/enemy/enemy_hurt/slime-hurt-0.png (100%) rename {game/resources => resources}/animated/enemy/enemy_hurt/slime-hurt-1.png (100%) rename {game/resources => resources}/animated/enemy/enemy_hurt/slime-hurt-2.png (100%) rename {game/resources => resources}/animated/enemy/enemy_hurt/slime-hurt-3.png (100%) rename {game/resources => resources}/animated/enemy/enemy_idle/slime-idle-0.png (100%) rename {game/resources => resources}/animated/enemy/enemy_idle/slime-idle-1.png (100%) rename {game/resources => resources}/animated/enemy/enemy_idle/slime-idle-2.png (100%) rename {game/resources => resources}/animated/enemy/enemy_idle/slime-idle-3.png (100%) rename {game/resources => resources}/animated/enemy/enemy_run/slime-move-0.png (100%) rename {game/resources => resources}/animated/enemy/enemy_run/slime-move-1.png (100%) rename {game/resources => resources}/animated/enemy/enemy_run/slime-move-2.png (100%) rename {game/resources => resources}/animated/enemy/enemy_run/slime-move-3.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_beg/adventurer-attack1-01.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_beg/adventurer-attack1-02.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_end/adventurer-attack1-02.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_end/adventurer-attack1-03.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_end/adventurer-attack1-04.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_end/adventurer-attack1-05.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_1_end/adventurer-attack1-06.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-01.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_beg/adventurer-attack2-05.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_end/adventurer-attack2-03.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_end/adventurer-attack2-04.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_end/adventurer-attack2-05.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_end/adventurer-attack2-06.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_2_end/adventurer-attack2-07.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_beg/adventurer-attack3-01.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_beg/adventurer-attack3-02.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_beg/adventurer-attack3-03.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_beg/adventurer-attack3-04.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-02.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-03.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-04.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-05.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-06.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-07.png (100%) rename {game/resources => resources}/animated/hero/hero_attack_3_end/adventurer-attack3-08.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-00.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-01.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-02.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-03.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-04.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-05.png (100%) rename {game/resources => resources}/animated/hero/hero_die/adventurer-die-06.png (100%) rename {game/resources => resources}/animated/hero/hero_fall/adventurer-fall-00.png (100%) rename {game/resources => resources}/animated/hero/hero_fall/adventurer-fall-01.png (100%) rename {game/resources => resources}/animated/hero/hero_fly_up/adventurer-jump-03.png (100%) rename {game/resources => resources}/animated/hero/hero_hurt/adventurer-hurt-00.png (100%) rename {game/resources => resources}/animated/hero/hero_hurt/adventurer-hurt-01.png (100%) rename {game/resources => resources}/animated/hero/hero_hurt/adventurer-hurt-02.png (100%) rename {game/resources => resources}/animated/hero/hero_idle/adventurer-idle-00.png (100%) rename {game/resources => resources}/animated/hero/hero_idle/adventurer-idle-01.png (100%) rename {game/resources => resources}/animated/hero/hero_idle/adventurer-idle-02.png (100%) rename {game/resources => resources}/animated/hero/hero_idle/adventurer-idle-03.png (100%) rename {game/resources => resources}/animated/hero/hero_jump/adventurer-jump-00.png (100%) rename {game/resources => resources}/animated/hero/hero_jump/adventurer-jump-01.png (100%) rename {game/resources => resources}/animated/hero/hero_jump/adventurer-jump-02.png (100%) rename {game/resources => resources}/animated/hero/hero_jump/adventurer-jump-03.png (100%) rename {game/resources => resources}/animated/hero/hero_run/adventurer-run-00.png (100%) rename {game/resources => resources}/animated/hero/hero_run/adventurer-run-01.png (100%) rename {game/resources => resources}/animated/hero/hero_run/adventurer-run-02.png (100%) rename {game/resources => resources}/animated/hero/hero_run/adventurer-run-03.png (100%) rename {game/resources => resources}/animated/hero/hero_run/adventurer-run-04.png (100%) rename {game/resources => resources}/animated/hero/hero_run/adventurer-run-05.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00000.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00001.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00002.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00003.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00004.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00005.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00006.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00007.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00008.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00009.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00010.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00011.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00012.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00013.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00014.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00015.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00016.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00017.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00018.png (100%) rename {game/resources => resources}/animated/hero/idle/Chara - BlueIdle00019.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00000.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00001.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00002.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00003.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00004.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00005.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00006.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00007.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00008.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00009.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00010.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00011.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00012.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00013.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00014.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00015.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00016.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00017.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00018.png (100%) rename {game/resources => resources}/animated/hero/run/Chara_BlueWalk00019.png (100%) rename {game/resources => resources}/background/background_01/background_01.png (100%) rename {game/resources => resources}/background/background_01/background_02.png (100%) rename {game/resources => resources}/background/background_01/background_03.png (100%) rename {game/resources => resources}/background/background_01/background_04.png (100%) rename {game/resources => resources}/background/background_01/background_05.png (100%) rename {game/resources => resources}/background/background_01/background_06.png (100%) rename {game/resources => resources}/background/background_01/background_07.png (100%) rename {game/resources => resources}/background/background_02/background_01.png (100%) rename {game/resources => resources}/background/background_02/background_02.png (100%) rename {game/resources => resources}/background/background_02/background_03.png (100%) rename {game/resources => resources}/background/background_02/background_04.png (100%) rename {game/resources => resources}/background/background_02/background_05.png (100%) rename {game/resources => resources}/background/background_02/background_06.png (100%) rename {game/resources => resources}/background/background_02/background_07.png (100%) rename {game/resources => resources}/background/background_02/background_08.png (100%) rename {game/resources => resources}/background/background_03/background_01.png (100%) rename {game/resources => resources}/background/background_03/background_02.png (100%) rename {game/resources => resources}/background/background_03/background_03.png (100%) rename {game/resources => resources}/background/background_03/background_04.png (100%) rename {game/resources => resources}/background/background_with_finish/background_01.png (100%) rename {game/resources => resources}/background/background_with_finish/background_02.png (100%) rename {game/resources => resources}/background/background_with_finish/background_03.png (100%) rename {game/resources => resources}/background/background_with_finish/background_04.png (100%) rename {game/resources => resources}/background/background_with_finish/background_05.png (100%) rename {game/resources => resources}/background/config_background/config_background_01 (100%) rename {game/resources => resources}/background/config_background/config_background_02 (100%) rename {game/resources => resources}/background/config_background/config_background_03 (100%) rename {game/resources => resources}/background/config_background/config_background_with_finish (100%) rename {game/resources => resources}/decoration/config_decoration/config_decoration_01 (100%) rename {game/resources => resources}/decoration/config_decoration/config_decoration_02 (100%) rename {game/resources => resources}/decoration/config_decoration/config_decoration_03 (100%) rename {game/resources => resources}/decoration/decoration_01/arrow.png (100%) rename {game/resources => resources}/decoration/decoration_01/gross.png (100%) rename {game/resources => resources}/decoration/decoration_01/head.png (100%) rename {game/resources => resources}/decoration/decoration_03/stone.png (100%) rename {game/resources => resources}/decoration/decoration_03/tree.png (100%) rename {game/resources => resources}/levels/level_01/config.json (93%) rename {game/resources => resources}/levels/level_01/map (100%) rename {game/resources => resources}/levels/level_02/config.json (93%) rename {game/resources => resources}/levels/level_02/map (100%) rename {game/resources => resources}/levels/level_03/config.json (93%) rename {game/resources => resources}/levels/level_03/map (100%) rename {game/resources => resources}/levels/level_with_finish/config.json (94%) rename {game/resources => resources}/levels/level_with_finish/map (100%) rename {game/resources => resources}/static/block_01/begin_block.png (100%) rename {game/resources => resources}/static/block_01/end_block.png (100%) rename {game/resources => resources}/static/block_01/finish_block.png (100%) rename {game/resources => resources}/static/block_01/ground_block.png (100%) rename {game/resources => resources}/static/block_01/middle_block.png (100%) rename {game/resources => resources}/static/block_01/separate_block.png (100%) rename {game/resources => resources}/static/block_01/unstable_block.png (100%) rename {game/resources => resources}/static/block_03/begin_block.png (100%) rename {game/resources => resources}/static/block_03/end_block.png (100%) rename {game/resources => resources}/static/block_03/finish_block.png (100%) rename {game/resources => resources}/static/block_03/ground_block.png (100%) rename {game/resources => resources}/static/block_03/middle_block.png (100%) rename {game/resources => resources}/static/block_03/separate_block.png (100%) rename {game/resources => resources}/static/block_03/unstable_block.png (100%) diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index d9e42da..0066163 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -45,10 +45,10 @@ int main() { auto database_storage_driver = std::make_shared(database); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_01"), - std::make_shared("../../game/resources/levels/level_02"), - std::make_shared("../../game/resources/levels/level_03"), - std::make_shared("../../game/resources/levels/level_with_finish") + std::make_shared("../../resources/levels/level_01"), + std::make_shared("../../resources/levels/level_02"), + std::make_shared("../../resources/levels/level_03"), + std::make_shared("../../resources/levels/level_with_finish") }; auto game_runner = std::make_unique( diff --git a/game/game_runner_example.cpp b/game/game_runner_example.cpp index 0613968..09ff347 100644 --- a/game/game_runner_example.cpp +++ b/game/game_runner_example.cpp @@ -103,7 +103,7 @@ class ExampleLevelLoader : public mad::core::LevelLoader { 0, mad::core::Vec2d{0.0f, 0.0f}, 0, - std::make_shared("../../game/resources/static/brick.png", 50, 50, + std::make_shared("../../resources/static/brick.png", 50, 50, mad::core::StaticImage::TransformType::Tile)); mad::core::Entity::Id square_id_2 = world->create_physical_entity( diff --git a/game/game_with_default_loader_example.cpp b/game/game_with_default_loader_example.cpp index cce779a..37cafe8 100644 --- a/game/game_with_default_loader_example.cpp +++ b/game/game_with_default_loader_example.cpp @@ -42,7 +42,7 @@ int main() { auto offline_storage_driver = std::make_shared(); std::vector> level_loaders{ - std::make_shared("../../game/resources/levels/level_01") + std::make_shared("../../resources/levels/level_01") }; auto game_runner = std::make_unique( diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png b/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png similarity index 100% rename from game/resources/animated/enemy/enemy_attack_beg/slime-attack-0.png rename to resources/animated/enemy/enemy_attack_beg/slime-attack-0.png diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-1.png b/resources/animated/enemy/enemy_attack_beg/slime-attack-1.png similarity index 100% rename from game/resources/animated/enemy/enemy_attack_beg/slime-attack-1.png rename to resources/animated/enemy/enemy_attack_beg/slime-attack-1.png diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-2.png b/resources/animated/enemy/enemy_attack_beg/slime-attack-2.png similarity index 100% rename from game/resources/animated/enemy/enemy_attack_beg/slime-attack-2.png rename to resources/animated/enemy/enemy_attack_beg/slime-attack-2.png diff --git a/game/resources/animated/enemy/enemy_attack_beg/slime-attack-3.png b/resources/animated/enemy/enemy_attack_beg/slime-attack-3.png similarity index 100% rename from game/resources/animated/enemy/enemy_attack_beg/slime-attack-3.png rename to resources/animated/enemy/enemy_attack_beg/slime-attack-3.png diff --git a/game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png b/resources/animated/enemy/enemy_attack_end/slime-attack-4.png similarity index 100% rename from game/resources/animated/enemy/enemy_attack_end/slime-attack-4.png rename to resources/animated/enemy/enemy_attack_end/slime-attack-4.png diff --git a/game/resources/animated/enemy/enemy_die/slime-die-0.png b/resources/animated/enemy/enemy_die/slime-die-0.png similarity index 100% rename from game/resources/animated/enemy/enemy_die/slime-die-0.png rename to resources/animated/enemy/enemy_die/slime-die-0.png diff --git a/game/resources/animated/enemy/enemy_die/slime-die-1.png b/resources/animated/enemy/enemy_die/slime-die-1.png similarity index 100% rename from game/resources/animated/enemy/enemy_die/slime-die-1.png rename to resources/animated/enemy/enemy_die/slime-die-1.png diff --git a/game/resources/animated/enemy/enemy_die/slime-die-2.png b/resources/animated/enemy/enemy_die/slime-die-2.png similarity index 100% rename from game/resources/animated/enemy/enemy_die/slime-die-2.png rename to resources/animated/enemy/enemy_die/slime-die-2.png diff --git a/game/resources/animated/enemy/enemy_die/slime-die-3.png b/resources/animated/enemy/enemy_die/slime-die-3.png similarity index 100% rename from game/resources/animated/enemy/enemy_die/slime-die-3.png rename to resources/animated/enemy/enemy_die/slime-die-3.png diff --git a/game/resources/animated/enemy/enemy_hurt/slime-hurt-0.png b/resources/animated/enemy/enemy_hurt/slime-hurt-0.png similarity index 100% rename from game/resources/animated/enemy/enemy_hurt/slime-hurt-0.png rename to resources/animated/enemy/enemy_hurt/slime-hurt-0.png diff --git a/game/resources/animated/enemy/enemy_hurt/slime-hurt-1.png b/resources/animated/enemy/enemy_hurt/slime-hurt-1.png similarity index 100% rename from game/resources/animated/enemy/enemy_hurt/slime-hurt-1.png rename to resources/animated/enemy/enemy_hurt/slime-hurt-1.png diff --git a/game/resources/animated/enemy/enemy_hurt/slime-hurt-2.png b/resources/animated/enemy/enemy_hurt/slime-hurt-2.png similarity index 100% rename from game/resources/animated/enemy/enemy_hurt/slime-hurt-2.png rename to resources/animated/enemy/enemy_hurt/slime-hurt-2.png diff --git a/game/resources/animated/enemy/enemy_hurt/slime-hurt-3.png b/resources/animated/enemy/enemy_hurt/slime-hurt-3.png similarity index 100% rename from game/resources/animated/enemy/enemy_hurt/slime-hurt-3.png rename to resources/animated/enemy/enemy_hurt/slime-hurt-3.png diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-0.png b/resources/animated/enemy/enemy_idle/slime-idle-0.png similarity index 100% rename from game/resources/animated/enemy/enemy_idle/slime-idle-0.png rename to resources/animated/enemy/enemy_idle/slime-idle-0.png diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-1.png b/resources/animated/enemy/enemy_idle/slime-idle-1.png similarity index 100% rename from game/resources/animated/enemy/enemy_idle/slime-idle-1.png rename to resources/animated/enemy/enemy_idle/slime-idle-1.png diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-2.png b/resources/animated/enemy/enemy_idle/slime-idle-2.png similarity index 100% rename from game/resources/animated/enemy/enemy_idle/slime-idle-2.png rename to resources/animated/enemy/enemy_idle/slime-idle-2.png diff --git a/game/resources/animated/enemy/enemy_idle/slime-idle-3.png b/resources/animated/enemy/enemy_idle/slime-idle-3.png similarity index 100% rename from game/resources/animated/enemy/enemy_idle/slime-idle-3.png rename to resources/animated/enemy/enemy_idle/slime-idle-3.png diff --git a/game/resources/animated/enemy/enemy_run/slime-move-0.png b/resources/animated/enemy/enemy_run/slime-move-0.png similarity index 100% rename from game/resources/animated/enemy/enemy_run/slime-move-0.png rename to resources/animated/enemy/enemy_run/slime-move-0.png diff --git a/game/resources/animated/enemy/enemy_run/slime-move-1.png b/resources/animated/enemy/enemy_run/slime-move-1.png similarity index 100% rename from game/resources/animated/enemy/enemy_run/slime-move-1.png rename to resources/animated/enemy/enemy_run/slime-move-1.png diff --git a/game/resources/animated/enemy/enemy_run/slime-move-2.png b/resources/animated/enemy/enemy_run/slime-move-2.png similarity index 100% rename from game/resources/animated/enemy/enemy_run/slime-move-2.png rename to resources/animated/enemy/enemy_run/slime-move-2.png diff --git a/game/resources/animated/enemy/enemy_run/slime-move-3.png b/resources/animated/enemy/enemy_run/slime-move-3.png similarity index 100% rename from game/resources/animated/enemy/enemy_run/slime-move-3.png rename to resources/animated/enemy/enemy_run/slime-move-3.png diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png b/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png rename to resources/animated/hero/hero_attack_1_beg/adventurer-attack1-00.png diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-01.png b/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-01.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-01.png rename to resources/animated/hero/hero_attack_1_beg/adventurer-attack1-01.png diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-02.png b/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-02.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-02.png rename to resources/animated/hero/hero_attack_1_beg/adventurer-attack1-02.png diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png b/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png rename to resources/animated/hero/hero_attack_1_beg/adventurer-attack1-03.png diff --git a/game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png b/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png rename to resources/animated/hero/hero_attack_1_beg/adventurer-attack1-04.png diff --git a/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-02.png b/resources/animated/hero/hero_attack_1_end/adventurer-attack1-02.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-02.png rename to resources/animated/hero/hero_attack_1_end/adventurer-attack1-02.png diff --git a/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-03.png b/resources/animated/hero/hero_attack_1_end/adventurer-attack1-03.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-03.png rename to resources/animated/hero/hero_attack_1_end/adventurer-attack1-03.png diff --git a/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-04.png b/resources/animated/hero/hero_attack_1_end/adventurer-attack1-04.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-04.png rename to resources/animated/hero/hero_attack_1_end/adventurer-attack1-04.png diff --git a/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-05.png b/resources/animated/hero/hero_attack_1_end/adventurer-attack1-05.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-05.png rename to resources/animated/hero/hero_attack_1_end/adventurer-attack1-05.png diff --git a/game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png b/resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png similarity index 100% rename from game/resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png rename to resources/animated/hero/hero_attack_1_end/adventurer-attack1-06.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-00.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-000.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-01.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-01.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-01.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-01.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-02.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-03.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-04.png diff --git a/game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-05.png b/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-05.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_beg/adventurer-attack2-05.png rename to resources/animated/hero/hero_attack_2_beg/adventurer-attack2-05.png diff --git a/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-03.png b/resources/animated/hero/hero_attack_2_end/adventurer-attack2-03.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-03.png rename to resources/animated/hero/hero_attack_2_end/adventurer-attack2-03.png diff --git a/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-04.png b/resources/animated/hero/hero_attack_2_end/adventurer-attack2-04.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-04.png rename to resources/animated/hero/hero_attack_2_end/adventurer-attack2-04.png diff --git a/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-05.png b/resources/animated/hero/hero_attack_2_end/adventurer-attack2-05.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-05.png rename to resources/animated/hero/hero_attack_2_end/adventurer-attack2-05.png diff --git a/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-06.png b/resources/animated/hero/hero_attack_2_end/adventurer-attack2-06.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-06.png rename to resources/animated/hero/hero_attack_2_end/adventurer-attack2-06.png diff --git a/game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png b/resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png similarity index 100% rename from game/resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png rename to resources/animated/hero/hero_attack_2_end/adventurer-attack2-07.png diff --git a/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png b/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png rename to resources/animated/hero/hero_attack_3_beg/adventurer-attack3-00.png diff --git a/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-01.png b/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-01.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-01.png rename to resources/animated/hero/hero_attack_3_beg/adventurer-attack3-01.png diff --git a/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-02.png b/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-02.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-02.png rename to resources/animated/hero/hero_attack_3_beg/adventurer-attack3-02.png diff --git a/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-03.png b/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-03.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-03.png rename to resources/animated/hero/hero_attack_3_beg/adventurer-attack3-03.png diff --git a/game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-04.png b/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-04.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_beg/adventurer-attack3-04.png rename to resources/animated/hero/hero_attack_3_beg/adventurer-attack3-04.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-02.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-03.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-04.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-05.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-06.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-07.png diff --git a/game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png b/resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png similarity index 100% rename from game/resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png rename to resources/animated/hero/hero_attack_3_end/adventurer-attack3-08.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-00.png b/resources/animated/hero/hero_die/adventurer-die-00.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-00.png rename to resources/animated/hero/hero_die/adventurer-die-00.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-01.png b/resources/animated/hero/hero_die/adventurer-die-01.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-01.png rename to resources/animated/hero/hero_die/adventurer-die-01.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-02.png b/resources/animated/hero/hero_die/adventurer-die-02.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-02.png rename to resources/animated/hero/hero_die/adventurer-die-02.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-03.png b/resources/animated/hero/hero_die/adventurer-die-03.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-03.png rename to resources/animated/hero/hero_die/adventurer-die-03.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-04.png b/resources/animated/hero/hero_die/adventurer-die-04.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-04.png rename to resources/animated/hero/hero_die/adventurer-die-04.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-05.png b/resources/animated/hero/hero_die/adventurer-die-05.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-05.png rename to resources/animated/hero/hero_die/adventurer-die-05.png diff --git a/game/resources/animated/hero/hero_die/adventurer-die-06.png b/resources/animated/hero/hero_die/adventurer-die-06.png similarity index 100% rename from game/resources/animated/hero/hero_die/adventurer-die-06.png rename to resources/animated/hero/hero_die/adventurer-die-06.png diff --git a/game/resources/animated/hero/hero_fall/adventurer-fall-00.png b/resources/animated/hero/hero_fall/adventurer-fall-00.png similarity index 100% rename from game/resources/animated/hero/hero_fall/adventurer-fall-00.png rename to resources/animated/hero/hero_fall/adventurer-fall-00.png diff --git a/game/resources/animated/hero/hero_fall/adventurer-fall-01.png b/resources/animated/hero/hero_fall/adventurer-fall-01.png similarity index 100% rename from game/resources/animated/hero/hero_fall/adventurer-fall-01.png rename to resources/animated/hero/hero_fall/adventurer-fall-01.png diff --git a/game/resources/animated/hero/hero_fly_up/adventurer-jump-03.png b/resources/animated/hero/hero_fly_up/adventurer-jump-03.png similarity index 100% rename from game/resources/animated/hero/hero_fly_up/adventurer-jump-03.png rename to resources/animated/hero/hero_fly_up/adventurer-jump-03.png diff --git a/game/resources/animated/hero/hero_hurt/adventurer-hurt-00.png b/resources/animated/hero/hero_hurt/adventurer-hurt-00.png similarity index 100% rename from game/resources/animated/hero/hero_hurt/adventurer-hurt-00.png rename to resources/animated/hero/hero_hurt/adventurer-hurt-00.png diff --git a/game/resources/animated/hero/hero_hurt/adventurer-hurt-01.png b/resources/animated/hero/hero_hurt/adventurer-hurt-01.png similarity index 100% rename from game/resources/animated/hero/hero_hurt/adventurer-hurt-01.png rename to resources/animated/hero/hero_hurt/adventurer-hurt-01.png diff --git a/game/resources/animated/hero/hero_hurt/adventurer-hurt-02.png b/resources/animated/hero/hero_hurt/adventurer-hurt-02.png similarity index 100% rename from game/resources/animated/hero/hero_hurt/adventurer-hurt-02.png rename to resources/animated/hero/hero_hurt/adventurer-hurt-02.png diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-00.png b/resources/animated/hero/hero_idle/adventurer-idle-00.png similarity index 100% rename from game/resources/animated/hero/hero_idle/adventurer-idle-00.png rename to resources/animated/hero/hero_idle/adventurer-idle-00.png diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-01.png b/resources/animated/hero/hero_idle/adventurer-idle-01.png similarity index 100% rename from game/resources/animated/hero/hero_idle/adventurer-idle-01.png rename to resources/animated/hero/hero_idle/adventurer-idle-01.png diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-02.png b/resources/animated/hero/hero_idle/adventurer-idle-02.png similarity index 100% rename from game/resources/animated/hero/hero_idle/adventurer-idle-02.png rename to resources/animated/hero/hero_idle/adventurer-idle-02.png diff --git a/game/resources/animated/hero/hero_idle/adventurer-idle-03.png b/resources/animated/hero/hero_idle/adventurer-idle-03.png similarity index 100% rename from game/resources/animated/hero/hero_idle/adventurer-idle-03.png rename to resources/animated/hero/hero_idle/adventurer-idle-03.png diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-00.png b/resources/animated/hero/hero_jump/adventurer-jump-00.png similarity index 100% rename from game/resources/animated/hero/hero_jump/adventurer-jump-00.png rename to resources/animated/hero/hero_jump/adventurer-jump-00.png diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-01.png b/resources/animated/hero/hero_jump/adventurer-jump-01.png similarity index 100% rename from game/resources/animated/hero/hero_jump/adventurer-jump-01.png rename to resources/animated/hero/hero_jump/adventurer-jump-01.png diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-02.png b/resources/animated/hero/hero_jump/adventurer-jump-02.png similarity index 100% rename from game/resources/animated/hero/hero_jump/adventurer-jump-02.png rename to resources/animated/hero/hero_jump/adventurer-jump-02.png diff --git a/game/resources/animated/hero/hero_jump/adventurer-jump-03.png b/resources/animated/hero/hero_jump/adventurer-jump-03.png similarity index 100% rename from game/resources/animated/hero/hero_jump/adventurer-jump-03.png rename to resources/animated/hero/hero_jump/adventurer-jump-03.png diff --git a/game/resources/animated/hero/hero_run/adventurer-run-00.png b/resources/animated/hero/hero_run/adventurer-run-00.png similarity index 100% rename from game/resources/animated/hero/hero_run/adventurer-run-00.png rename to resources/animated/hero/hero_run/adventurer-run-00.png diff --git a/game/resources/animated/hero/hero_run/adventurer-run-01.png b/resources/animated/hero/hero_run/adventurer-run-01.png similarity index 100% rename from game/resources/animated/hero/hero_run/adventurer-run-01.png rename to resources/animated/hero/hero_run/adventurer-run-01.png diff --git a/game/resources/animated/hero/hero_run/adventurer-run-02.png b/resources/animated/hero/hero_run/adventurer-run-02.png similarity index 100% rename from game/resources/animated/hero/hero_run/adventurer-run-02.png rename to resources/animated/hero/hero_run/adventurer-run-02.png diff --git a/game/resources/animated/hero/hero_run/adventurer-run-03.png b/resources/animated/hero/hero_run/adventurer-run-03.png similarity index 100% rename from game/resources/animated/hero/hero_run/adventurer-run-03.png rename to resources/animated/hero/hero_run/adventurer-run-03.png diff --git a/game/resources/animated/hero/hero_run/adventurer-run-04.png b/resources/animated/hero/hero_run/adventurer-run-04.png similarity index 100% rename from game/resources/animated/hero/hero_run/adventurer-run-04.png rename to resources/animated/hero/hero_run/adventurer-run-04.png diff --git a/game/resources/animated/hero/hero_run/adventurer-run-05.png b/resources/animated/hero/hero_run/adventurer-run-05.png similarity index 100% rename from game/resources/animated/hero/hero_run/adventurer-run-05.png rename to resources/animated/hero/hero_run/adventurer-run-05.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00000.png b/resources/animated/hero/idle/Chara - BlueIdle00000.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00000.png rename to resources/animated/hero/idle/Chara - BlueIdle00000.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00001.png b/resources/animated/hero/idle/Chara - BlueIdle00001.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00001.png rename to resources/animated/hero/idle/Chara - BlueIdle00001.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00002.png b/resources/animated/hero/idle/Chara - BlueIdle00002.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00002.png rename to resources/animated/hero/idle/Chara - BlueIdle00002.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00003.png b/resources/animated/hero/idle/Chara - BlueIdle00003.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00003.png rename to resources/animated/hero/idle/Chara - BlueIdle00003.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00004.png b/resources/animated/hero/idle/Chara - BlueIdle00004.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00004.png rename to resources/animated/hero/idle/Chara - BlueIdle00004.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00005.png b/resources/animated/hero/idle/Chara - BlueIdle00005.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00005.png rename to resources/animated/hero/idle/Chara - BlueIdle00005.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00006.png b/resources/animated/hero/idle/Chara - BlueIdle00006.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00006.png rename to resources/animated/hero/idle/Chara - BlueIdle00006.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00007.png b/resources/animated/hero/idle/Chara - BlueIdle00007.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00007.png rename to resources/animated/hero/idle/Chara - BlueIdle00007.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00008.png b/resources/animated/hero/idle/Chara - BlueIdle00008.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00008.png rename to resources/animated/hero/idle/Chara - BlueIdle00008.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00009.png b/resources/animated/hero/idle/Chara - BlueIdle00009.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00009.png rename to resources/animated/hero/idle/Chara - BlueIdle00009.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00010.png b/resources/animated/hero/idle/Chara - BlueIdle00010.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00010.png rename to resources/animated/hero/idle/Chara - BlueIdle00010.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00011.png b/resources/animated/hero/idle/Chara - BlueIdle00011.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00011.png rename to resources/animated/hero/idle/Chara - BlueIdle00011.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00012.png b/resources/animated/hero/idle/Chara - BlueIdle00012.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00012.png rename to resources/animated/hero/idle/Chara - BlueIdle00012.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00013.png b/resources/animated/hero/idle/Chara - BlueIdle00013.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00013.png rename to resources/animated/hero/idle/Chara - BlueIdle00013.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00014.png b/resources/animated/hero/idle/Chara - BlueIdle00014.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00014.png rename to resources/animated/hero/idle/Chara - BlueIdle00014.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00015.png b/resources/animated/hero/idle/Chara - BlueIdle00015.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00015.png rename to resources/animated/hero/idle/Chara - BlueIdle00015.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00016.png b/resources/animated/hero/idle/Chara - BlueIdle00016.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00016.png rename to resources/animated/hero/idle/Chara - BlueIdle00016.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00017.png b/resources/animated/hero/idle/Chara - BlueIdle00017.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00017.png rename to resources/animated/hero/idle/Chara - BlueIdle00017.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00018.png b/resources/animated/hero/idle/Chara - BlueIdle00018.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00018.png rename to resources/animated/hero/idle/Chara - BlueIdle00018.png diff --git a/game/resources/animated/hero/idle/Chara - BlueIdle00019.png b/resources/animated/hero/idle/Chara - BlueIdle00019.png similarity index 100% rename from game/resources/animated/hero/idle/Chara - BlueIdle00019.png rename to resources/animated/hero/idle/Chara - BlueIdle00019.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00000.png b/resources/animated/hero/run/Chara_BlueWalk00000.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00000.png rename to resources/animated/hero/run/Chara_BlueWalk00000.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00001.png b/resources/animated/hero/run/Chara_BlueWalk00001.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00001.png rename to resources/animated/hero/run/Chara_BlueWalk00001.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00002.png b/resources/animated/hero/run/Chara_BlueWalk00002.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00002.png rename to resources/animated/hero/run/Chara_BlueWalk00002.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00003.png b/resources/animated/hero/run/Chara_BlueWalk00003.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00003.png rename to resources/animated/hero/run/Chara_BlueWalk00003.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00004.png b/resources/animated/hero/run/Chara_BlueWalk00004.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00004.png rename to resources/animated/hero/run/Chara_BlueWalk00004.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00005.png b/resources/animated/hero/run/Chara_BlueWalk00005.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00005.png rename to resources/animated/hero/run/Chara_BlueWalk00005.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00006.png b/resources/animated/hero/run/Chara_BlueWalk00006.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00006.png rename to resources/animated/hero/run/Chara_BlueWalk00006.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00007.png b/resources/animated/hero/run/Chara_BlueWalk00007.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00007.png rename to resources/animated/hero/run/Chara_BlueWalk00007.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00008.png b/resources/animated/hero/run/Chara_BlueWalk00008.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00008.png rename to resources/animated/hero/run/Chara_BlueWalk00008.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00009.png b/resources/animated/hero/run/Chara_BlueWalk00009.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00009.png rename to resources/animated/hero/run/Chara_BlueWalk00009.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00010.png b/resources/animated/hero/run/Chara_BlueWalk00010.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00010.png rename to resources/animated/hero/run/Chara_BlueWalk00010.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00011.png b/resources/animated/hero/run/Chara_BlueWalk00011.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00011.png rename to resources/animated/hero/run/Chara_BlueWalk00011.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00012.png b/resources/animated/hero/run/Chara_BlueWalk00012.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00012.png rename to resources/animated/hero/run/Chara_BlueWalk00012.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00013.png b/resources/animated/hero/run/Chara_BlueWalk00013.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00013.png rename to resources/animated/hero/run/Chara_BlueWalk00013.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00014.png b/resources/animated/hero/run/Chara_BlueWalk00014.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00014.png rename to resources/animated/hero/run/Chara_BlueWalk00014.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00015.png b/resources/animated/hero/run/Chara_BlueWalk00015.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00015.png rename to resources/animated/hero/run/Chara_BlueWalk00015.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00016.png b/resources/animated/hero/run/Chara_BlueWalk00016.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00016.png rename to resources/animated/hero/run/Chara_BlueWalk00016.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00017.png b/resources/animated/hero/run/Chara_BlueWalk00017.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00017.png rename to resources/animated/hero/run/Chara_BlueWalk00017.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00018.png b/resources/animated/hero/run/Chara_BlueWalk00018.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00018.png rename to resources/animated/hero/run/Chara_BlueWalk00018.png diff --git a/game/resources/animated/hero/run/Chara_BlueWalk00019.png b/resources/animated/hero/run/Chara_BlueWalk00019.png similarity index 100% rename from game/resources/animated/hero/run/Chara_BlueWalk00019.png rename to resources/animated/hero/run/Chara_BlueWalk00019.png diff --git a/game/resources/background/background_01/background_01.png b/resources/background/background_01/background_01.png similarity index 100% rename from game/resources/background/background_01/background_01.png rename to resources/background/background_01/background_01.png diff --git a/game/resources/background/background_01/background_02.png b/resources/background/background_01/background_02.png similarity index 100% rename from game/resources/background/background_01/background_02.png rename to resources/background/background_01/background_02.png diff --git a/game/resources/background/background_01/background_03.png b/resources/background/background_01/background_03.png similarity index 100% rename from game/resources/background/background_01/background_03.png rename to resources/background/background_01/background_03.png diff --git a/game/resources/background/background_01/background_04.png b/resources/background/background_01/background_04.png similarity index 100% rename from game/resources/background/background_01/background_04.png rename to resources/background/background_01/background_04.png diff --git a/game/resources/background/background_01/background_05.png b/resources/background/background_01/background_05.png similarity index 100% rename from game/resources/background/background_01/background_05.png rename to resources/background/background_01/background_05.png diff --git a/game/resources/background/background_01/background_06.png b/resources/background/background_01/background_06.png similarity index 100% rename from game/resources/background/background_01/background_06.png rename to resources/background/background_01/background_06.png diff --git a/game/resources/background/background_01/background_07.png b/resources/background/background_01/background_07.png similarity index 100% rename from game/resources/background/background_01/background_07.png rename to resources/background/background_01/background_07.png diff --git a/game/resources/background/background_02/background_01.png b/resources/background/background_02/background_01.png similarity index 100% rename from game/resources/background/background_02/background_01.png rename to resources/background/background_02/background_01.png diff --git a/game/resources/background/background_02/background_02.png b/resources/background/background_02/background_02.png similarity index 100% rename from game/resources/background/background_02/background_02.png rename to resources/background/background_02/background_02.png diff --git a/game/resources/background/background_02/background_03.png b/resources/background/background_02/background_03.png similarity index 100% rename from game/resources/background/background_02/background_03.png rename to resources/background/background_02/background_03.png diff --git a/game/resources/background/background_02/background_04.png b/resources/background/background_02/background_04.png similarity index 100% rename from game/resources/background/background_02/background_04.png rename to resources/background/background_02/background_04.png diff --git a/game/resources/background/background_02/background_05.png b/resources/background/background_02/background_05.png similarity index 100% rename from game/resources/background/background_02/background_05.png rename to resources/background/background_02/background_05.png diff --git a/game/resources/background/background_02/background_06.png b/resources/background/background_02/background_06.png similarity index 100% rename from game/resources/background/background_02/background_06.png rename to resources/background/background_02/background_06.png diff --git a/game/resources/background/background_02/background_07.png b/resources/background/background_02/background_07.png similarity index 100% rename from game/resources/background/background_02/background_07.png rename to resources/background/background_02/background_07.png diff --git a/game/resources/background/background_02/background_08.png b/resources/background/background_02/background_08.png similarity index 100% rename from game/resources/background/background_02/background_08.png rename to resources/background/background_02/background_08.png diff --git a/game/resources/background/background_03/background_01.png b/resources/background/background_03/background_01.png similarity index 100% rename from game/resources/background/background_03/background_01.png rename to resources/background/background_03/background_01.png diff --git a/game/resources/background/background_03/background_02.png b/resources/background/background_03/background_02.png similarity index 100% rename from game/resources/background/background_03/background_02.png rename to resources/background/background_03/background_02.png diff --git a/game/resources/background/background_03/background_03.png b/resources/background/background_03/background_03.png similarity index 100% rename from game/resources/background/background_03/background_03.png rename to resources/background/background_03/background_03.png diff --git a/game/resources/background/background_03/background_04.png b/resources/background/background_03/background_04.png similarity index 100% rename from game/resources/background/background_03/background_04.png rename to resources/background/background_03/background_04.png diff --git a/game/resources/background/background_with_finish/background_01.png b/resources/background/background_with_finish/background_01.png similarity index 100% rename from game/resources/background/background_with_finish/background_01.png rename to resources/background/background_with_finish/background_01.png diff --git a/game/resources/background/background_with_finish/background_02.png b/resources/background/background_with_finish/background_02.png similarity index 100% rename from game/resources/background/background_with_finish/background_02.png rename to resources/background/background_with_finish/background_02.png diff --git a/game/resources/background/background_with_finish/background_03.png b/resources/background/background_with_finish/background_03.png similarity index 100% rename from game/resources/background/background_with_finish/background_03.png rename to resources/background/background_with_finish/background_03.png diff --git a/game/resources/background/background_with_finish/background_04.png b/resources/background/background_with_finish/background_04.png similarity index 100% rename from game/resources/background/background_with_finish/background_04.png rename to resources/background/background_with_finish/background_04.png diff --git a/game/resources/background/background_with_finish/background_05.png b/resources/background/background_with_finish/background_05.png similarity index 100% rename from game/resources/background/background_with_finish/background_05.png rename to resources/background/background_with_finish/background_05.png diff --git a/game/resources/background/config_background/config_background_01 b/resources/background/config_background/config_background_01 similarity index 100% rename from game/resources/background/config_background/config_background_01 rename to resources/background/config_background/config_background_01 diff --git a/game/resources/background/config_background/config_background_02 b/resources/background/config_background/config_background_02 similarity index 100% rename from game/resources/background/config_background/config_background_02 rename to resources/background/config_background/config_background_02 diff --git a/game/resources/background/config_background/config_background_03 b/resources/background/config_background/config_background_03 similarity index 100% rename from game/resources/background/config_background/config_background_03 rename to resources/background/config_background/config_background_03 diff --git a/game/resources/background/config_background/config_background_with_finish b/resources/background/config_background/config_background_with_finish similarity index 100% rename from game/resources/background/config_background/config_background_with_finish rename to resources/background/config_background/config_background_with_finish diff --git a/game/resources/decoration/config_decoration/config_decoration_01 b/resources/decoration/config_decoration/config_decoration_01 similarity index 100% rename from game/resources/decoration/config_decoration/config_decoration_01 rename to resources/decoration/config_decoration/config_decoration_01 diff --git a/game/resources/decoration/config_decoration/config_decoration_02 b/resources/decoration/config_decoration/config_decoration_02 similarity index 100% rename from game/resources/decoration/config_decoration/config_decoration_02 rename to resources/decoration/config_decoration/config_decoration_02 diff --git a/game/resources/decoration/config_decoration/config_decoration_03 b/resources/decoration/config_decoration/config_decoration_03 similarity index 100% rename from game/resources/decoration/config_decoration/config_decoration_03 rename to resources/decoration/config_decoration/config_decoration_03 diff --git a/game/resources/decoration/decoration_01/arrow.png b/resources/decoration/decoration_01/arrow.png similarity index 100% rename from game/resources/decoration/decoration_01/arrow.png rename to resources/decoration/decoration_01/arrow.png diff --git a/game/resources/decoration/decoration_01/gross.png b/resources/decoration/decoration_01/gross.png similarity index 100% rename from game/resources/decoration/decoration_01/gross.png rename to resources/decoration/decoration_01/gross.png diff --git a/game/resources/decoration/decoration_01/head.png b/resources/decoration/decoration_01/head.png similarity index 100% rename from game/resources/decoration/decoration_01/head.png rename to resources/decoration/decoration_01/head.png diff --git a/game/resources/decoration/decoration_03/stone.png b/resources/decoration/decoration_03/stone.png similarity index 100% rename from game/resources/decoration/decoration_03/stone.png rename to resources/decoration/decoration_03/stone.png diff --git a/game/resources/decoration/decoration_03/tree.png b/resources/decoration/decoration_03/tree.png similarity index 100% rename from game/resources/decoration/decoration_03/tree.png rename to resources/decoration/decoration_03/tree.png diff --git a/game/resources/levels/level_01/config.json b/resources/levels/level_01/config.json similarity index 93% rename from game/resources/levels/level_01/config.json rename to resources/levels/level_01/config.json index 0e09c0a..e6c7b3d 100644 --- a/game/resources/levels/level_01/config.json +++ b/resources/levels/level_01/config.json @@ -1,9 +1,9 @@ { "name" : "level_01", - "animated_resources" : "../../game/resources/animated/", + "animated_resources" : "../../resources/animated/", "block" : 10.0, - "static_resources" : "../../game/resources/static/block_01", - "decoration_resources" : "../../game/resources/decoration/decoration_01", + "static_resources" : "../../resources/static/block_01", + "decoration_resources" : "../../resources/decoration/decoration_01", "camera": { "position" : { "x" : 10.0, @@ -16,7 +16,7 @@ "part_of_window" : 0.25 }, "background" : { - "source" : "../../game/resources/background/background_01", + "source" : "../../resources/background/background_01", "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65] }, "texture" : { diff --git a/game/resources/levels/level_01/map b/resources/levels/level_01/map similarity index 100% rename from game/resources/levels/level_01/map rename to resources/levels/level_01/map diff --git a/game/resources/levels/level_02/config.json b/resources/levels/level_02/config.json similarity index 93% rename from game/resources/levels/level_02/config.json rename to resources/levels/level_02/config.json index 621417d..16d86e2 100644 --- a/game/resources/levels/level_02/config.json +++ b/resources/levels/level_02/config.json @@ -1,8 +1,8 @@ { "name" : "level_02", - "animated_resources" : "../../game/resources/animated/", - "static_resources" : "../../game/resources/static/block_01", - "decoration_resources" : "../../game/resources/decoration/decoration_01", + "animated_resources" : "../../resources/animated/", + "static_resources" : "../../resources/static/block_01", + "decoration_resources" : "../../resources/decoration/decoration_01", "block" : 10.0, "camera": { "position" : { @@ -16,7 +16,7 @@ "part_of_window" : 0.25 }, "background" : { - "source" : "../../game/resources/background/background_02", + "source" : "../../resources/background/background_02", "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6] }, "texture" : { diff --git a/game/resources/levels/level_02/map b/resources/levels/level_02/map similarity index 100% rename from game/resources/levels/level_02/map rename to resources/levels/level_02/map diff --git a/game/resources/levels/level_03/config.json b/resources/levels/level_03/config.json similarity index 93% rename from game/resources/levels/level_03/config.json rename to resources/levels/level_03/config.json index d92f97d..5ebd481 100644 --- a/game/resources/levels/level_03/config.json +++ b/resources/levels/level_03/config.json @@ -1,8 +1,8 @@ { "name" : "level_03", - "animated_resources" : "../../game/resources/animated/", - "static_resources" : "../../game/resources/static/block_03", - "decoration_resources" : "../../game/resources/decoration/decoration_03", + "animated_resources" : "../../resources/animated/", + "static_resources" : "../../resources/static/block_03", + "decoration_resources" : "../../resources/decoration/decoration_03", "block" : 10.0, "camera": { "position" : { @@ -16,7 +16,7 @@ "part_of_window" : 0.25 }, "background" : { - "source" : "../../game/resources/background/background_03", + "source" : "../../resources/background/background_03", "parallax_ratios" : [0.95, 0.9, 0.85, 0.8] }, "texture" : { diff --git a/game/resources/levels/level_03/map b/resources/levels/level_03/map similarity index 100% rename from game/resources/levels/level_03/map rename to resources/levels/level_03/map diff --git a/game/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json similarity index 94% rename from game/resources/levels/level_with_finish/config.json rename to resources/levels/level_with_finish/config.json index 3dd6a60..eb16d6e 100644 --- a/game/resources/levels/level_with_finish/config.json +++ b/resources/levels/level_with_finish/config.json @@ -1,7 +1,7 @@ { "name" : "level_with_finish", - "animated_resources" : "../../game/resources/animated/", - "static_resources" : "../../game/resources/static/", + "animated_resources" : "../../resources/animated/", + "static_resources" : "../../resources/static/", "block" : 10.0, "camera": { "position" : { @@ -16,7 +16,7 @@ "part_of_window" : 0.02 }, "background" : { - "source" : "../../game/resources/background/background_02", + "source" : "../../resources/background/background_02", "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75] }, "texture" : { diff --git a/game/resources/levels/level_with_finish/map b/resources/levels/level_with_finish/map similarity index 100% rename from game/resources/levels/level_with_finish/map rename to resources/levels/level_with_finish/map diff --git a/game/resources/static/block_01/begin_block.png b/resources/static/block_01/begin_block.png similarity index 100% rename from game/resources/static/block_01/begin_block.png rename to resources/static/block_01/begin_block.png diff --git a/game/resources/static/block_01/end_block.png b/resources/static/block_01/end_block.png similarity index 100% rename from game/resources/static/block_01/end_block.png rename to resources/static/block_01/end_block.png diff --git a/game/resources/static/block_01/finish_block.png b/resources/static/block_01/finish_block.png similarity index 100% rename from game/resources/static/block_01/finish_block.png rename to resources/static/block_01/finish_block.png diff --git a/game/resources/static/block_01/ground_block.png b/resources/static/block_01/ground_block.png similarity index 100% rename from game/resources/static/block_01/ground_block.png rename to resources/static/block_01/ground_block.png diff --git a/game/resources/static/block_01/middle_block.png b/resources/static/block_01/middle_block.png similarity index 100% rename from game/resources/static/block_01/middle_block.png rename to resources/static/block_01/middle_block.png diff --git a/game/resources/static/block_01/separate_block.png b/resources/static/block_01/separate_block.png similarity index 100% rename from game/resources/static/block_01/separate_block.png rename to resources/static/block_01/separate_block.png diff --git a/game/resources/static/block_01/unstable_block.png b/resources/static/block_01/unstable_block.png similarity index 100% rename from game/resources/static/block_01/unstable_block.png rename to resources/static/block_01/unstable_block.png diff --git a/game/resources/static/block_03/begin_block.png b/resources/static/block_03/begin_block.png similarity index 100% rename from game/resources/static/block_03/begin_block.png rename to resources/static/block_03/begin_block.png diff --git a/game/resources/static/block_03/end_block.png b/resources/static/block_03/end_block.png similarity index 100% rename from game/resources/static/block_03/end_block.png rename to resources/static/block_03/end_block.png diff --git a/game/resources/static/block_03/finish_block.png b/resources/static/block_03/finish_block.png similarity index 100% rename from game/resources/static/block_03/finish_block.png rename to resources/static/block_03/finish_block.png diff --git a/game/resources/static/block_03/ground_block.png b/resources/static/block_03/ground_block.png similarity index 100% rename from game/resources/static/block_03/ground_block.png rename to resources/static/block_03/ground_block.png diff --git a/game/resources/static/block_03/middle_block.png b/resources/static/block_03/middle_block.png similarity index 100% rename from game/resources/static/block_03/middle_block.png rename to resources/static/block_03/middle_block.png diff --git a/game/resources/static/block_03/separate_block.png b/resources/static/block_03/separate_block.png similarity index 100% rename from game/resources/static/block_03/separate_block.png rename to resources/static/block_03/separate_block.png diff --git a/game/resources/static/block_03/unstable_block.png b/resources/static/block_03/unstable_block.png similarity index 100% rename from game/resources/static/block_03/unstable_block.png rename to resources/static/block_03/unstable_block.png From bd1f2d2851391f767efde2abbcd0217003c650dc Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 4 Jun 2022 22:56:32 +0300 Subject: [PATCH 105/121] Merge server and release --- core/loader/LevelLoaderFromServer.cpp | 432 +++++++++++++++--- core/loader/LevelLoaderFromServer.hpp | 92 ++-- network/client/simple-client.cpp | 12 +- network/server/simple-server.cpp | 6 +- resources/levels/level_01/config.json | 170 +++++++ resources/levels/level_01/map | 11 + .../levels/level_with_finish/config.json | 126 +++++ 7 files changed, 712 insertions(+), 137 deletions(-) create mode 100644 resources/levels/level_01/config.json create mode 100644 resources/levels/level_01/map create mode 100644 resources/levels/level_with_finish/config.json diff --git a/core/loader/LevelLoaderFromServer.cpp b/core/loader/LevelLoaderFromServer.cpp index 7b143c1..65eb708 100644 --- a/core/loader/LevelLoaderFromServer.cpp +++ b/core/loader/LevelLoaderFromServer.cpp @@ -1,8 +1,13 @@ #include "LevelLoaderFromServer.hpp" - +#include "event/management/condition/KeyDownCondition.hpp" +#include "event/management/condition/KeyPressedCondition.hpp" +#include "event/management/condition/TimerCondition.hpp" +#include "event/management/condition/TrueCondition.hpp" +#include "event/management/controller/statemachine/EnemyStateMachine.hpp" +#include "event/management/controller/statemachine/HeroStateMachine.hpp" +#include "event/management/controller/statemachine/StateMachine.hpp" +#include <../../game/mobs/hero/Hero.hpp> #include -#include -#include #include @@ -12,33 +17,46 @@ namespace mad::core { std::unique_ptr LevelLoaderFromServer::load(std::shared_ptr global_dispatcher, std::shared_ptr system_listener) { - auto level_dispatcher = std::make_shared(); + level_dispatcher = std::make_shared(); auto world = std::make_shared(*level_dispatcher); Vec2d camera_position = {m_config_json["camera"]["position"]["x"], m_config_json["camera"]["position"]["y"]}; - auto camera = std::make_shared(camera_position, world); + float camera_smoothness = m_config_json["camera"]["smoothness"]; + Camera::FollowType camera_type = m_config_json["camera"]["follow_type"] == "forward" ? + Camera::FollowType::Forward : Camera::FollowType::Backward; + float minimal_distance = m_config_json["camera"]["minimal_distance"]; + float zoom = m_config_json["camera"]["zoom"]; + float part_of_window = m_config_json["camera"]["part_of_window"]; + + auto camera = std::make_shared(camera_position, world, true); + + controllers = {std::make_shared( + camera)}; + + //Entity::Id hero_id = create_world(world); auto keys = create_world(world); - camera->turn_on(*level_dispatcher, keys[LevelLoaderFromServer::IdKeys::Hero]); + camera->turn_on(*level_dispatcher, keys[LevelLoaderFromServer::IdKeys::Hero], camera_smoothness, + camera_type, minimal_distance, part_of_window); level_dispatcher->registry(camera); - level_dispatcher->registry(std::make_shared(world, keys[LevelLoaderFromServer::IdKeys::Hero])); + //level_dispatcher->registry(std::make_shared(world, keys[LevelLoaderFromServer::IdKeys::Hero])); /* std::vector> controllers { std::make_shared(camera) };*/ - ///State Machine + /*///State Machine struct C1 : mad::core::Controller { void control() override { - //SPDLOG_DEBUG("controller 1"); + //SPDLOG_DEBUG("controller 1"); }; }; struct C2 : mad::core::Controller { void control() override { - //SPDLOG_DEBUG("controller 2"); + //SPDLOG_DEBUG("controller 2"); }; }; auto machine = std::make_shared( @@ -50,7 +68,10 @@ namespace mad::core { machine->set_initial_state(0); std::vector> controllers{machine, std::make_shared( - camera)}; + camera)};*/ + + camera->set_zoom(zoom); + auto level_runner = std::make_unique( system_listener, @@ -59,8 +80,7 @@ namespace mad::core { global_dispatcher, level_dispatcher, world, - controllers - ); + controllers); level_dispatcher->registry(std::make_shared(*level_runner, std::make_shared(keys[LevelLoaderFromServer::IdKeys::Hero], keys[LevelLoaderFromServer::IdKeys::FinishBlock]))); level_dispatcher->registry(std::make_shared(*level_runner)); @@ -69,30 +89,81 @@ namespace mad::core { } std::unordered_map LevelLoaderFromServer::create_world(std::shared_ptr world) { + std::stringstream m_level_map_stream; + m_level_map_stream << m_level_map; float object_size = m_config_json["block"]; float current_position_x = object_size / 2; float current_position_y = object_size / 2; - std::size_t width = m_config_json["width"]; std::unordered_map keys; + Entity::Id hero_id = 0; + std::string map_line; create_background(world); - for (std::size_t i = 0; i < m_level_map.size();) { - for (std::size_t j = 0; j < width; ++j, ++i) { - char object = m_level_map[i]; + while (std::getline(m_level_map_stream, map_line)) { + for (char object : map_line) { switch (m_objects[object]) { case Objects::UnstableBlock: { create_block(world, {current_position_x, current_position_y}, - object_size, false); + object_size, false, m_objects[object]); + break; + } + case Objects::GroundBlock: { + create_block(world, + {current_position_x, + current_position_y}, + object_size, true, m_objects[object]); + break; + } + case Objects::BeginBlock: { + create_block(world, + {current_position_x, + current_position_y}, + object_size, true, m_objects[object]); break; } - case Objects::StableBlock: { + case Objects::MiddleBlock: { create_block(world, {current_position_x, current_position_y}, - object_size, true); + object_size, true, m_objects[object]); + break; + } + case Objects::EndBlock: { + create_block(world, + {current_position_x, + current_position_y}, + object_size, true, m_objects[object]); + break; + } + case Objects::SeparateBlock: { + create_block(world, + {current_position_x, + current_position_y}, + object_size, true, m_objects[object]); + break; + } + case Objects::Decoration1: { + create_decoration(world, + {current_position_x, + current_position_y}, + m_objects[object]); + break; + } + case Objects::Decoration2: { + create_decoration(world, + {current_position_x, + current_position_y}, + m_objects[object]); + break; + } + case Objects::Decoration3: { + create_decoration(world, + {current_position_x, + current_position_y}, + m_objects[object]); break; } case Objects::FinishBlock: { @@ -103,15 +174,16 @@ namespace mad::core { break; } case Objects::Hero: { - keys[LevelLoaderFromServer::IdKeys::Hero] = create_hero(world, - {current_position_x, - current_position_y}); + // Hero hero(world, {current_position_x, current_position_y}, m_config_json, level_dispatcher, controllers); + hero_id = create_hero(world, {current_position_x, current_position_y}); + r_hero_id = keys[LevelLoaderFromServer::IdKeys::Hero] = hero_id; break; } case Objects::Enemy1: { break; } case Objects::Enemy2: { + create_mob(world, {current_position_x, current_position_y}); break; } case Objects::Empty: { @@ -126,14 +198,36 @@ namespace mad::core { return keys; } - void LevelLoaderFromServer::create_block(std::shared_ptr world, - Vec2d position, float block_size, bool is_stable) { + void LevelLoaderFromServer::create_block(std::shared_ptr world, Vec2d position, + float block_size, bool is_stable, Objects object) { + + std::filesystem::path source(m_config_json["static_resources"]); - std::filesystem::path source("../../resources/static/"); - if (is_stable) { - source /= static_cast(m_config_json["texture"]["stable"]); - } else { - source /= static_cast(m_config_json["texture"]["unstable"]); + switch (object) { + case Objects::UnstableBlock: { + source /= m_config_json["texture"]["unstable_block"]; + break; + } + case Objects::GroundBlock: { + source /= m_config_json["texture"]["ground_block"]; + break; + } + case Objects::BeginBlock: { + source /= m_config_json["texture"]["begin_block"]; + break; + } + case Objects::MiddleBlock: { + source /= m_config_json["texture"]["middle_block"]; + break; + } + case Objects::EndBlock: { + source /= m_config_json["texture"]["end_block"]; + break; + } + case Objects::SeparateBlock: { + source /= m_config_json["texture"]["separate_block"]; + break; + } } auto image_storage = std::make_shared( @@ -141,15 +235,60 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Tile) - }})); + StaticImage::TransformType::Fit) + }})); Entity::Id square_id = world->create_physical_entity( - 0, + 1, position, 0, image_storage, - is_stable + is_stable); + } + + void LevelLoaderFromServer::create_decoration(std::shared_ptr world, Vec2d position, Objects object) { + std::filesystem::path source(m_config_json["decoration_resources"]); + + float decoration_scale = 1; + float delta_x = 0; + float delta_y = 0; + + switch (object) { + case Objects::Decoration1 : { + source /= m_config_json["decoration"]["decoration_01"]["source"]; + decoration_scale = m_config_json["decoration"]["decoration_01"]["scale"]; + delta_x = m_config_json["decoration"]["decoration_01"]["delta_x"]; + delta_y = m_config_json["decoration"]["decoration_01"]["delta_y"]; + break; + } + case Objects::Decoration2 : { + source /= m_config_json["decoration"]["decoration_02"]["source"]; + decoration_scale = m_config_json["decoration"]["decoration_02"]["scale"]; + delta_x = m_config_json["decoration"]["decoration_02"]["delta_x"]; + delta_y = m_config_json["decoration"]["decoration_02"]["delta_y"]; + break; + } + case Objects::Decoration3 : { + source /= m_config_json["decoration"]["decoration_03"]["source"]; + decoration_scale = m_config_json["decoration"]["decoration_03"]["scale"]; + delta_x = m_config_json["decoration"]["decoration_03"]["delta_x"]; + delta_y = m_config_json["decoration"]["decoration_03"]["delta_y"]; + break; + } + } + decoration_scale *= static_cast(m_config_json["camera"]["zoom"]); + + auto image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared(source, decoration_scale, delta_x, delta_y) + }})); + + Entity::Id decoration_id = world->create_viewable_entity( + 0, + position, + 0, + image_storage ); } @@ -170,53 +309,214 @@ namespace mad::core { image_storage = std::make_shared( std::unordered_map>( - {{ImageStorage::TypeAction::Idle, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], - m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], - physical_size_width, physical_size_height, size_scale, - delta_x, delta_y) - }, + {{ImageStorage::TypeAction::Jump, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["jump"]["source"], + + m_config_json["hero"]["animated"]["actions"]["jump"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["idle"]["source"], + + m_config_json["hero"]["animated"]["actions"]["idle"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, {ImageStorage::TypeAction::Run, - std::make_shared( - source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], - m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], - physical_size_width, physical_size_height, size_scale, - delta_x, delta_y) - }} - ) - ); + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["run"]["source"], + + m_config_json["hero"]["animated"]["actions"]["run"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Fly_up, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fly_up"]["source"], + + m_config_json["hero"]["animated"]["actions"]["fly_up"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Fall, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["fall"]["source"], + + m_config_json["hero"]["animated"]["actions"]["fall"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_1_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_1_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_1_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_1_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_2_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_2_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_2_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_2_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_2_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_2_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_3_beg, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_3_beg"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_3_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_3_end, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["source"], + + m_config_json["hero"]["animated"]["actions"]["attack_3_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Hurt, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["hurt"]["source"], + + m_config_json["hero"]["animated"]["actions"]["hurt"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Die, + std::make_shared( + source / m_config_json["hero"]["animated"]["actions"]["die"]["source"], + + m_config_json["hero"]["animated"]["actions"]["die"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + })); hero_id = world->create_physical_entity( - 0, + 2, position, 0, image_storage, - false, false - ); + false, false, + 0x0004, 0x0002); + + /// add sensor + auto m_entity = cast_to_or_null(world->get_storage().get_entity(hero_id)); + m_entity->add_sensor({0, 6}, 2.65, 0.05); + + float m_impulse = 2000; + float horizontal_velocity = 20; + + auto machine = std::make_shared(world, position, hero_id, level_dispatcher, m_impulse, horizontal_velocity); + controllers.push_back(machine); return hero_id; } + + void LevelLoaderFromServer::create_mob(std::shared_ptr world, Vec2d position) { + std::filesystem::path source(m_config_json["animated_resources"]); + source /= m_config_json["enemy"]["source"]; + + std::shared_ptr image_storage; + + float physical_size_width = m_config_json["enemy"]["animated"]["size_width"]; + float physical_size_height = m_config_json["enemy"]["animated"]["size_height"]; + float size_scale = m_config_json["enemy"]["animated"]["size_scale"]; + float delta_x = m_config_json["enemy"]["animated"]["delta_x"]; + float delta_y = m_config_json["enemy"]["animated"]["delta_y"]; + + + image_storage = std::make_shared( + std::unordered_map>( + {{ImageStorage::TypeAction::Idle, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["idle"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["idle"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Run, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["run"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["run"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_beg, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["attack_beg"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["attack_beg"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Attack_1_end, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["attack_end"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["attack_end"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Die, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["die"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["die"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)}, + {ImageStorage::TypeAction::Hurt, + std::make_shared( + source / m_config_json["enemy"]["animated"]["actions"]["hurt"]["source"], + + m_config_json["enemy"]["animated"]["actions"]["hurt"]["delta_time"], + physical_size_width, physical_size_height, size_scale, + delta_x, delta_y)} + })); + + Entity::Id enemy_id = world->create_physical_entity( + 2, + position, + 0, + image_storage, + false, false, + 0x0004, 0x0002); + + + float m_impulse = 2000; + float horizontal_velocity = 5.5f; + auto m_entity = cast_to_or_null(world->get_storage().get_entity(enemy_id)); + m_entity->add_sensor({6, 0}, 2.65, 0.05); + + auto machine = std::make_shared(world, position, enemy_id, level_dispatcher, m_impulse, horizontal_velocity, r_hero_id); + controllers.push_back(machine); + } Entity::Id LevelLoaderFromServer::create_finish_block(std::shared_ptr world, Vec2d position, float block_size) { - std::filesystem::path source("../../resources/static/"); - source /= static_cast(m_config_json["texture"]["finish"]); + std::filesystem::path source(m_config_json["static_resources"]); + source /= static_cast(m_config_json["texture"]["finish_block"]); auto image_storage = std::make_shared( std::unordered_map>( {{ImageStorage::TypeAction::Idle, std::make_shared(source, block_size, block_size, - StaticImage::TransformType::Fit) - }})); + StaticImage::TransformType::Fit)}})); return world->create_physical_entity( - 0, + 1, position, 0, image_storage, - true - ); + true); } void LevelLoaderFromServer::create_background(std::shared_ptr world) { @@ -230,18 +530,14 @@ namespace mad::core { {{ImageStorage::TypeAction::Idle, std::make_shared( source, - parallax_ratios, - m_config_json["background"]["scale"] - ) - }} - ) - ); + parallax_ratios) + }})); world->create_viewable_entity( -1, {0, 0}, 0, - image_storage - ); + image_storage); } -} \ No newline at end of file + +}// namespace mad::core diff --git a/core/loader/LevelLoaderFromServer.hpp b/core/loader/LevelLoaderFromServer.hpp index 04e310a..0829ad8 100644 --- a/core/loader/LevelLoaderFromServer.hpp +++ b/core/loader/LevelLoaderFromServer.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -26,64 +27,10 @@ using json = nlohmann::json; - namespace mad::core { - class ArrowController : public mad::core::EventHandler { - public: - explicit ArrowController(std::shared_ptr world, - mad::core::Entity::Id entity_id) - : m_world(std::move(world)), - m_entity_id(entity_id) {} - - void handle(const mad::core::Event &event) override { - //SPDLOG_INFO("handle arrow event"); - - auto make_move_intent = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).move(dir); - }); - }; - - auto impulse = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_linear_impulse_to_center(dir, event_dispatcher); - }); - }; - - auto force = [](mad::core::Vec2d dir) { - return mad::core::LambdaIntent( - [=](mad::core::Entity &entity, mad::core::EventDispatcher &event_dispatcher) { - mad::core::cast_to(entity).apply_force_to_center(dir, event_dispatcher); - }); - }; - - if (event.type == mad::core::Event::Type::KeyPressed) { - const auto &keystroke = mad::core::const_cast_to(event); - if (keystroke.key_id == sf::Keyboard::Key::Space) { - m_world->manipulate_entity_id(m_entity_id, impulse(mad::core::Vec2d{0.0f, -200000.0f})); - } - } else if (event.type == mad::core::Event::Type::KeyHeld) { - const auto &keystroke = mad::core::const_cast_to(event); - if (keystroke.key_id == sf::Keyboard::Key::Right) { - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{100000.0f, 0.0f})); - } - if (keystroke.key_id == sf::Keyboard::Key::Left) { - m_world->manipulate_entity_id(m_entity_id, force(mad::core::Vec2d{-100000.0f, 0.0f})); - } - } - } - - std::unordered_set handled_types() override { - return {mad::core::Event::Type::KeyPressed, mad::core::Event::Type::KeyHeld}; - } - private: - std::shared_ptr m_world; - mad::core::Entity::Id m_entity_id; - }; + class LevelLoaderFromServer : public LevelLoader { private: @@ -92,7 +39,10 @@ namespace mad::core { FinishBlock, }; + enum class Objects; + public: + explicit LevelLoaderFromServer(std::string map, json config); std::unique_ptr load( @@ -102,19 +52,30 @@ namespace mad::core { std::unordered_map create_world(std::shared_ptr world); void create_block(std::shared_ptr world, Vec2d position, - float block_size, bool is_stable); + float block_size, bool is_stable, Objects object); Entity::Id create_hero(std::shared_ptr world, Vec2d position); + void create_mob(std::shared_ptr world, Vec2d position); + void create_background(std::shared_ptr world); Entity::Id create_finish_block(std::shared_ptr world, Vec2d position, float block_size); + void create_decoration(std::shared_ptr world, Vec2d position, Objects object); + private: enum class Objects { UnstableBlock, - StableBlock, + GroundBlock, FinishBlock, + BeginBlock, + MiddleBlock, + EndBlock, + SeparateBlock, + Decoration1, + Decoration2, + Decoration3, Hero, Enemy1, Enemy2, @@ -125,18 +86,29 @@ namespace mad::core { std::string m_level_map; + std::vector> controllers; + + std::shared_ptr level_dispatcher; + std::unordered_map m_objects = { {'.', Objects::Empty}, - {'#', Objects::StableBlock}, + {'#', Objects::GroundBlock}, {'@', Objects::UnstableBlock}, {'F', Objects::FinishBlock}, + {'[', Objects::BeginBlock}, + {'_', Objects::MiddleBlock}, + {']', Objects::EndBlock}, + {'+', Objects::SeparateBlock}, + {'*', Objects::Decoration1}, + {'&', Objects::Decoration2}, + {'^', Objects::Decoration3}, {'H', Objects::Hero}, {'Z', Objects::Enemy1}, {'E', Objects::Enemy2} }; + int r_hero_id; }; - } -#endif//MAD_LEVELLOADERFROMSERVER_HPP +#endif //MAD_LEVELLOADERFROMFILE_HPP diff --git a/network/client/simple-client.cpp b/network/client/simple-client.cpp index a7977b3..5a11788 100644 --- a/network/client/simple-client.cpp +++ b/network/client/simple-client.cpp @@ -93,7 +93,7 @@ int main() { #endif spdlog::set_level(log_level); - auto window = std::make_shared(sf::VideoMode(640, 480), "MAD"); + auto window = std::make_shared(sf::VideoMode(), "MAD", sf::Style::Fullscreen); ImGui::SFML::Init(*window); window->setFramerateLimit(120); @@ -101,22 +101,22 @@ int main() { auto system_listener = std::make_shared(window); - auto network_storage_driver = std::make_shared(); + auto database_storage_driver = std::make_shared(); - std::vector> level_loaders = network_storage_driver->get_levels(); + std::vector> level_loaders = database_storage_driver->get_levels(); auto game_runner = std::make_unique( level_loaders, global_dispatcher, std::make_unique(), - std::make_unique(network_storage_driver), + std::make_unique(database_storage_driver), system_listener, - network_storage_driver + database_storage_driver ); global_dispatcher->registry(std::make_shared(*window)); global_dispatcher->registry(std::make_shared(*game_runner)); - global_dispatcher->registry(std::make_shared(*game_runner, network_storage_driver)); + global_dispatcher->registry(std::make_shared(*game_runner, database_storage_driver)); global_dispatcher->registry(std::make_shared(*game_runner)); game_runner->run(*window); diff --git a/network/server/simple-server.cpp b/network/server/simple-server.cpp index cc77ab4..6125c04 100644 --- a/network/server/simple-server.cpp +++ b/network/server/simple-server.cpp @@ -54,7 +54,7 @@ int main() { std::string map, map_line; input_config >> config; while (input_map >> map_line) { - map += map_line; + map += map_line + '\n'; } config["map"] = map; res.status = 200; @@ -209,8 +209,8 @@ int main() { if (!std::string(input_levelname).empty()) { std::filesystem::path level_container = levels_directory / input_levelname; if (std::filesystem::is_directory(level_container) && - std::filesystem::exists(level_container / "config.json") && - std::filesystem::exists(level_container / "map")) { + std::filesystem::exists(level_container / "config.json") && + std::filesystem::exists(level_container / "map")) { if (!db.is_level_exists(input_levelname)) { db.append_level(input_levelname); text_hint = "new level name"; diff --git a/resources/levels/level_01/config.json b/resources/levels/level_01/config.json new file mode 100644 index 0000000..e6c7b3d --- /dev/null +++ b/resources/levels/level_01/config.json @@ -0,0 +1,170 @@ +{ + "name" : "level_01", + "animated_resources" : "../../resources/animated/", + "block" : 10.0, + "static_resources" : "../../resources/static/block_01", + "decoration_resources" : "../../resources/decoration/decoration_01", + "camera": { + "position" : { + "x" : 10.0, + "y" : 10.0 + }, + "smoothness": 0.05, + "zoom": 0.1, + "follow_type" : "forward", + "minimal_distance" : 7.0, + "part_of_window" : 0.25 + }, + "background" : { + "source" : "../../resources/background/background_01", + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65] + }, + "texture" : { + "unstable_block" : "unstable_block.png", + "ground_block" : "ground_block.png", + "finish_block" : "finish_block.png", + "begin_block" : "begin_block.png", + "middle_block" : "middle_block.png", + "end_block" : "end_block.png", + "separate_block" : "separate_block.png" + }, + "decoration" : { + "decoration_01" : { + "source" : "arrow.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : 20 + }, + "decoration_02" : { + "source" : "head.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : 90 + }, + "decoration_03" : { + "source" : "gross.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : 0 + } + }, + "hero" : { + "source" : "hero", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "hero_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", + "type": "several_files", + "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "hero_hurt", + "type": "several_files", + "delta_time": 130 + }, + "die" : { + "source": "hero_die", + "type": "several_files", + "delta_time": 130 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 5, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 100 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 100 + }, + "hurt" : { + "source": "enemy_hurt", + "type": "several_files", + "delta_time": 100 + }, + "die" : { + "source": "enemy_die", + "type": "several_files", + "delta_time": 100 + } + } + } + } +} \ No newline at end of file diff --git a/resources/levels/level_01/map b/resources/levels/level_01/map new file mode 100644 index 0000000..e007306 --- /dev/null +++ b/resources/levels/level_01/map @@ -0,0 +1,11 @@ +......H...........................................................E.............................................................................................................................................................................................................................................. +......................................................[______________]........................................................................................................................................................................................................................................................ +..................................................+.................................................................._.......................................................................................................................................................................................... +............E.................................+...........................................E..........................._.......................................................................................................................................................................................... +[_________________]................E.......+.............................[____________________]......................_.................................................................................................................................................................................................................................. +......................[_________________].............................................................................._........................ +................................................................................................[_______________________... +..............................................................................................+ +............................................................................................+............................. +........................................................................................F.................................. +............................................................................................................................................................................ diff --git a/resources/levels/level_with_finish/config.json b/resources/levels/level_with_finish/config.json new file mode 100644 index 0000000..eb16d6e --- /dev/null +++ b/resources/levels/level_with_finish/config.json @@ -0,0 +1,126 @@ +{ + "name" : "level_with_finish", + "animated_resources" : "../../resources/animated/", + "static_resources" : "../../resources/static/", + "block" : 10.0, + "camera": { + "position" : { + "x" : 10.0, + "y" : 10.0 + }, + "angle": 15.0, + "smoothness": 0.6, + "zoom": 10.5, + "follow_type" : "forward", + "minimal_distance" : 3.0, + "part_of_window" : 0.02 + }, + "background" : { + "source" : "../../resources/background/background_02", + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75] + }, + "texture" : { + "ground_block" : "brick.png", + "unstable_block" : "brick.png", + "finish_block" : "exit.png" + }, + "hero" : { + "source" : "hero", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "hero_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", + "type": "several_files", + "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 + } + } + } + } +} \ No newline at end of file From d1ce0d55f40e2f58268a31d438b163bd5f8249f7 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 4 Jun 2022 23:22:39 +0300 Subject: [PATCH 106/121] Fix submodule --- .gitmodules | 3 +++ cpp-httplib | 1 + 2 files changed, 4 insertions(+) create mode 160000 cpp-httplib diff --git a/.gitmodules b/.gitmodules index 952393c..0e7cf9b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ [submodule "deps/cpp-httplib"] path = deps/cpp-httplib url = https://github.com/yhirose/cpp-httplib +[submodule "cpp-httplib"] + path = cpp-httplib + url = https://github.com/yhirose/cpp-httplib diff --git a/cpp-httplib b/cpp-httplib new file mode 160000 index 0000000..df20c27 --- /dev/null +++ b/cpp-httplib @@ -0,0 +1 @@ +Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c From aef7366e7c42d0bc53c323058be77f596710da8d Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 4 Jun 2022 23:36:22 +0300 Subject: [PATCH 107/121] Fix submodule --- deps/cpp-httplib | 1 + 1 file changed, 1 insertion(+) create mode 160000 deps/cpp-httplib diff --git a/deps/cpp-httplib b/deps/cpp-httplib new file mode 160000 index 0000000..df20c27 --- /dev/null +++ b/deps/cpp-httplib @@ -0,0 +1 @@ +Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c From 0d51504afb2a8a8cd5fee25c54c1134817cf003e Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 5 Jun 2022 00:05:54 +0300 Subject: [PATCH 108/121] Fix submodule --- deps/cpp-httplib | 1 + 1 file changed, 1 insertion(+) create mode 160000 deps/cpp-httplib diff --git a/deps/cpp-httplib b/deps/cpp-httplib new file mode 160000 index 0000000..9452c0a --- /dev/null +++ b/deps/cpp-httplib @@ -0,0 +1 @@ +Subproject commit 9452c0a4b69c5e4e31169ed32e961d330695122c From f3326f9b789749f6699a08c20bf8f0f2a615eeb0 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 5 Jun 2022 00:09:00 +0300 Subject: [PATCH 109/121] Fix submodule --- .gitmodules | 3 --- cpp-httplib | 1 - 2 files changed, 4 deletions(-) delete mode 160000 cpp-httplib diff --git a/.gitmodules b/.gitmodules index 0e7cf9b..952393c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,6 +22,3 @@ [submodule "deps/cpp-httplib"] path = deps/cpp-httplib url = https://github.com/yhirose/cpp-httplib -[submodule "cpp-httplib"] - path = cpp-httplib - url = https://github.com/yhirose/cpp-httplib diff --git a/cpp-httplib b/cpp-httplib deleted file mode 160000 index df20c27..0000000 --- a/cpp-httplib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit df20c27696c6dcb2b9ccecf3c4f9c3d06c1ecf8c From 413a8d4449d8e7d57d4e81b111d26e0a447ee19d Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 01:06:24 +0300 Subject: [PATCH 110/121] Add blocks --- resources/levels/level_02/config.json | 16 ++++++++-------- resources/static/block_02/block.png | Bin 0 -> 564 bytes resources/static/block_02/finish_block.png | Bin 0 -> 461657 bytes 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 resources/static/block_02/block.png create mode 100644 resources/static/block_02/finish_block.png diff --git a/resources/levels/level_02/config.json b/resources/levels/level_02/config.json index 16d86e2..db15eca 100644 --- a/resources/levels/level_02/config.json +++ b/resources/levels/level_02/config.json @@ -1,8 +1,8 @@ { "name" : "level_02", "animated_resources" : "../../resources/animated/", - "static_resources" : "../../resources/static/block_01", - "decoration_resources" : "../../resources/decoration/decoration_01", + "static_resources" : "../../resources/static/block_02", + "decoration_resources" : "../../resources/decoration/decoration_03", "block" : 10.0, "camera": { "position" : { @@ -20,13 +20,13 @@ "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6] }, "texture" : { - "unstable_block" : "unstable_block.png", - "ground_block" : "ground_block.png", + "unstable_block" : "block.png", + "ground_block" : "block.png", "finish_block" : "finish_block.png", - "begin_block" : "begin_block.png", - "middle_block" : "middle_block.png", - "end_block" : "end_block.png", - "separate_block" : "separate_block.png" + "begin_block" : "block.png", + "middle_block" : "block.png", + "end_block" : "block.png", + "separate_block" : "block.png" }, "decoration" : { "decoration_01" : { diff --git a/resources/static/block_02/block.png b/resources/static/block_02/block.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7906696087eda872b2e9f07e12e0184c69d4c8 GIT binary patch literal 564 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 z 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Ğ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%0AWEVG`uxprhN8Uq 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�$3mrc<@4!uQE?<>N=Ym{GnkApYA;KajkIPu^s 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 literal 0 HcmV?d00001 From 87797d6e71a7f1553fb8896b212078474d8f1a43 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 01:10:45 +0300 Subject: [PATCH 111/121] delete level --- game/game_database_example.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/game/game_database_example.cpp b/game/game_database_example.cpp index 0066163..bd6d6a1 100644 --- a/game/game_database_example.cpp +++ b/game/game_database_example.cpp @@ -47,8 +47,7 @@ int main() { std::vector> level_loaders{ std::make_shared("../../resources/levels/level_01"), std::make_shared("../../resources/levels/level_02"), - std::make_shared("../../resources/levels/level_03"), - std::make_shared("../../resources/levels/level_with_finish") + std::make_shared("../../resources/levels/level_03") }; auto game_runner = std::make_unique( From aaba3577b5b43042a43b3da02b380883e8f3b5e3 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 01:20:15 +0300 Subject: [PATCH 112/121] Add some decoration --- resources/levels/level_01/map | 6 +++--- resources/levels/level_02/map | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/levels/level_01/map b/resources/levels/level_01/map index e007306..ffb251b 100644 --- a/resources/levels/level_01/map +++ b/resources/levels/level_01/map @@ -1,8 +1,8 @@ -......H...........................................................E.............................................................................................................................................................................................................................................. +......H.................................................*....^....E.............................................................................................................................................................................................................................................. ......................................................[______________]........................................................................................................................................................................................................................................................ ..................................................+.................................................................._.......................................................................................................................................................................................... -............E.................................+...........................................E..........................._.......................................................................................................................................................................................... -[_________________]................E.......+.............................[____________________]......................_.................................................................................................................................................................................................................................. +.*....^.....E.................................+............................^........^.....E..........................._.......................................................................................................................................................................................... +[_________________]....^....&......E..^....+.............................[____________________]......................_.................................................................................................................................................................................................................................. ......................[_________________].............................................................................._........................ ................................................................................................[_______________________... ..............................................................................................+ diff --git a/resources/levels/level_02/map b/resources/levels/level_02/map index 148527c..3fdc251 100644 --- a/resources/levels/level_02/map +++ b/resources/levels/level_02/map @@ -1,8 +1,8 @@ -@......HE.#..#...................... +@......H........................... .................................... .................................... .................................... -.......&.....*...................... +.......&...E.*...................... .....[__________]..+..+...[]..F..... .....############.........##........ [__]......................##........ \ No newline at end of file From 5dd1f3ef3978fbbbb7ebb17b914f88e1a98e51bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 5 Jun 2022 01:56:02 +0300 Subject: [PATCH 113/121] add death event --- core/event/management/controller/Destroy.cpp | 4 +++- core/event/management/controller/Destroy.hpp | 4 +++- .../management/controller/statemachine/EnemyStateMachine.cpp | 2 +- .../management/controller/statemachine/HeroStateMachine.cpp | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/event/management/controller/Destroy.cpp b/core/event/management/controller/Destroy.cpp index 77e5b0a..a439e4f 100644 --- a/core/event/management/controller/Destroy.cpp +++ b/core/event/management/controller/Destroy.cpp @@ -1,6 +1,7 @@ #include "Destroy.hpp" +#include "event/physics/Death.hpp" #include "world/intent/LambdaIntent.hpp" -mad::core::Destroy::Destroy(std::shared_ptr world, mad::core::Entity::Id entity_id) : world(world), entity_id(entity_id) { +mad::core::Destroy::Destroy(std::shared_ptr world, std::shared_ptr level_dispatcher, mad::core::Entity::Id entity_id) : world(world), level_dispatcher(level_dispatcher), entity_id(entity_id) { m_entity = cast_to_or_null(world->get_storage().get_entity(entity_id)); } void mad::core::Destroy::control() { @@ -10,5 +11,6 @@ void mad::core::Destroy::control() { mad::core::cast_to(entity).set_image_position({-10000, -10000}); }); }; + level_dispatcher->dispatch(std::make_shared(entity_id)); world->manipulate_entity_id(entity_id, set_position()); } diff --git a/core/event/management/controller/Destroy.hpp b/core/event/management/controller/Destroy.hpp index ee82307..56a104b 100644 --- a/core/event/management/controller/Destroy.hpp +++ b/core/event/management/controller/Destroy.hpp @@ -10,12 +10,14 @@ namespace mad::core { class Destroy : public Controller { public: - Destroy(std::shared_ptr world, Entity::Id entity_id); + Destroy(std::shared_ptr world, std::shared_ptr level_dispatcher, Entity::Id entity_id); void control() override; private: std::shared_ptr world; + std::shared_ptr level_dispatcher; Entity::Id entity_id; PhysicalEntity* m_entity; + }; } diff --git a/core/event/management/controller/statemachine/EnemyStateMachine.cpp b/core/event/management/controller/statemachine/EnemyStateMachine.cpp index e4927c2..2416c7a 100644 --- a/core/event/management/controller/statemachine/EnemyStateMachine.cpp +++ b/core/event/management/controller/statemachine/EnemyStateMachine.cpp @@ -36,7 +36,7 @@ mad::core::EnemyStateMachine::EnemyStateMachine(std::shared_ptr worl StateMachine::StateId ground_left = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Left, horizontal_velocity)); StateMachine::StateId die_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId hurt_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - StateMachine::StateId destroy = machine->add_state(std::make_shared(world, hero_id)); + StateMachine::StateId destroy = machine->add_state(std::make_shared(world, level_dispatcher, hero_id)); int *attack_stage = new int(0); StateMachine::StateId attack_idle = machine->add_state(std::make_shared(world, level_dispatcher, hero_id, Movement::Direction::Idle, attack_stage, horizontal_velocity)); diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp index 3fc0675..91bd120 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.cpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -50,7 +50,7 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, StateMachine::StateId deal_damage = machine->add_state(std::make_shared(world, hero_id, level_dispatcher)); StateMachine::StateId hurt_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); StateMachine::StateId die_idle = machine->add_state(std::make_shared(world, hero_id, Movement::Direction::Idle)); - StateMachine::StateId destroy = machine->add_state(std::make_shared(world, hero_id)); + StateMachine::StateId destroy = machine->add_state(std::make_shared(world, level_dispatcher, hero_id)); machine->add_transition(ground_idle, hurt_idle, std::make_shared(hero_id)); From 666308a0bc8e754601408913f00be36c277aea0d Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 11:33:00 +0300 Subject: [PATCH 114/121] Complete level_03 --- resources/levels/level_03/map | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/levels/level_03/map b/resources/levels/level_03/map index 148527c..9bfd182 100644 --- a/resources/levels/level_03/map +++ b/resources/levels/level_03/map @@ -1,8 +1,8 @@ -@......HE.#..#...................... +@......H..#..#...................... .................................... .................................... .................................... -.......&.....*...................... -.....[__________]..+..+...[]..F..... +.......&..E..*...................... +.....[__________]..+..+..[]..F...... .....############.........##........ [__]......................##........ \ No newline at end of file From c1fafc3919c0e4e80d0a8fc4b002a4cfc2afe39a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 5 Jun 2022 11:49:00 +0300 Subject: [PATCH 115/121] fix bugs --- core/event/management/condition/FallDownCondition.cpp | 2 +- .../management/controller/statemachine/HeroStateMachine.cpp | 1 + resources/levels/level_01/map | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/event/management/condition/FallDownCondition.cpp b/core/event/management/condition/FallDownCondition.cpp index f2b28d6..3435c9b 100644 --- a/core/event/management/condition/FallDownCondition.cpp +++ b/core/event/management/condition/FallDownCondition.cpp @@ -6,7 +6,7 @@ std::unordered_set mad::core::FallDownCondition::trigger return {Event::Type::WorldUpdate}; } bool mad::core::FallDownCondition::is_triggered_by(const mad::core::Event &event) { - if(enemy_entity->get_position().get_y() > 250) return true; + if(enemy_entity->get_position().get_y() > 450) return true; return false; } void mad::core::FallDownCondition::on_start() { diff --git a/core/event/management/controller/statemachine/HeroStateMachine.cpp b/core/event/management/controller/statemachine/HeroStateMachine.cpp index 91bd120..fdbed62 100644 --- a/core/event/management/controller/statemachine/HeroStateMachine.cpp +++ b/core/event/management/controller/statemachine/HeroStateMachine.cpp @@ -75,6 +75,7 @@ mad::core::HeroStateMachine::HeroStateMachine(std::shared_ptr world, machine->add_transition(die_idle, destroy, std::make_shared(hero_id, ImageStorage::TypeAction::Die)); + machine->add_transition(destroy, ground_idle, std::make_shared()); diff --git a/resources/levels/level_01/map b/resources/levels/level_01/map index ffb251b..fc311bf 100644 --- a/resources/levels/level_01/map +++ b/resources/levels/level_01/map @@ -1,11 +1,11 @@ ......H.................................................*....^....E.............................................................................................................................................................................................................................................. ......................................................[______________]........................................................................................................................................................................................................................................................ -..................................................+.................................................................._.......................................................................................................................................................................................... -.*....^.....E.................................+............................^........^.....E..........................._.......................................................................................................................................................................................... +.................................................+++................................................................._.......................................................................................................................................................................................... +.*....^.....E...F.............................+............................^........^.....E..........................._.......................................................................................................................................................................................... [_________________]....^....&......E..^....+.............................[____________________]......................_.................................................................................................................................................................................................................................. ......................[_________________].............................................................................._........................ ................................................................................................[_______________________... ..............................................................................................+ ............................................................................................+............................. -........................................................................................F.................................. +.......................................................................................................................... ............................................................................................................................................................................ From 0af17ac3d0cb3bdbb47258001a13d0a07727d770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=80=D0=BE=D0=BD?= Date: Sun, 5 Jun 2022 11:59:59 +0300 Subject: [PATCH 116/121] fix bugs --- core/event/management/condition/FallDownCondition.cpp | 4 +++- core/event/management/condition/FallDownCondition.hpp | 1 + resources/levels/level_03/map | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/event/management/condition/FallDownCondition.cpp b/core/event/management/condition/FallDownCondition.cpp index 3435c9b..6ed3870 100644 --- a/core/event/management/condition/FallDownCondition.cpp +++ b/core/event/management/condition/FallDownCondition.cpp @@ -6,7 +6,9 @@ std::unordered_set mad::core::FallDownCondition::trigger return {Event::Type::WorldUpdate}; } bool mad::core::FallDownCondition::is_triggered_by(const mad::core::Event &event) { - if(enemy_entity->get_position().get_y() > 450) return true; + if(enemy_entity->get_position().get_y() < 450) cnt = 0; + if(enemy_entity->get_position().get_y() > 450) cnt++; + if(enemy_entity->get_position().get_y() > 450 && cnt >= 10000) return true; return false; } void mad::core::FallDownCondition::on_start() { diff --git a/core/event/management/condition/FallDownCondition.hpp b/core/event/management/condition/FallDownCondition.hpp index 5d44271..a74333b 100644 --- a/core/event/management/condition/FallDownCondition.hpp +++ b/core/event/management/condition/FallDownCondition.hpp @@ -16,6 +16,7 @@ namespace mad::core { private: Entity::Id m_entity_id; PhysicalEntity* enemy_entity; + int cnt = 0; }; }// namespace mad::core diff --git a/resources/levels/level_03/map b/resources/levels/level_03/map index 9bfd182..97d8a5f 100644 --- a/resources/levels/level_03/map +++ b/resources/levels/level_03/map @@ -3,6 +3,6 @@ .................................... .................................... .......&..E..*...................... -.....[__________]..+..+..[]..F...... +.....[__________]..+..+..[]......... .....############.........##........ [__]......................##........ \ No newline at end of file From c003306150e1f26112aeae0ece5b1f785d6902b2 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 13:08:02 +0300 Subject: [PATCH 117/121] Fix decoration --- resources/levels/level_02/map | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/levels/level_02/map b/resources/levels/level_02/map index 3fdc251..3633c47 100644 --- a/resources/levels/level_02/map +++ b/resources/levels/level_02/map @@ -2,7 +2,7 @@ .................................... .................................... .................................... -.......&...E.*...................... +...........E.*...................... .....[__________]..+..+...[]..F..... .....############.........##........ [__]......................##........ \ No newline at end of file From ed407e98460b6ac8dac4eafe01d401e07f17b1e9 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 13:11:26 +0300 Subject: [PATCH 118/121] Add debug_mode --- core/loader/LevelLoaderFromFile.cpp | 5 ++++- resources/levels/level_02/map | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/loader/LevelLoaderFromFile.cpp b/core/loader/LevelLoaderFromFile.cpp index 216d8c9..6cd2e05 100644 --- a/core/loader/LevelLoaderFromFile.cpp +++ b/core/loader/LevelLoaderFromFile.cpp @@ -35,8 +35,11 @@ namespace mad::core { float zoom = m_config_json["camera"]["zoom"]; float part_of_window = m_config_json["camera"]["part_of_window"]; +#if defined(DEBUG_MODE) auto camera = std::make_shared(camera_position, world, true); - +#else + auto camera = std::make_shared(camera_position, world, false); +#endif controllers = {std::make_shared( camera)}; diff --git a/resources/levels/level_02/map b/resources/levels/level_02/map index 3633c47..7af544b 100644 --- a/resources/levels/level_02/map +++ b/resources/levels/level_02/map @@ -2,7 +2,7 @@ .................................... .................................... .................................... -...........E.*...................... +...........E........................ .....[__________]..+..+...[]..F..... .....############.........##........ [__]......................##........ \ No newline at end of file From fe4b1662534e0de8accc246020905829788bf504 Mon Sep 17 00:00:00 2001 From: alexeyha Date: Sun, 5 Jun 2022 13:21:37 +0300 Subject: [PATCH 119/121] Add debug_mode in server --- core/loader/LevelLoaderFromServer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/loader/LevelLoaderFromServer.cpp b/core/loader/LevelLoaderFromServer.cpp index 65eb708..ed7e74d 100644 --- a/core/loader/LevelLoaderFromServer.cpp +++ b/core/loader/LevelLoaderFromServer.cpp @@ -30,7 +30,11 @@ namespace mad::core { float zoom = m_config_json["camera"]["zoom"]; float part_of_window = m_config_json["camera"]["part_of_window"]; +#if defined(DEBUG_MODE) auto camera = std::make_shared(camera_position, world, true); +#else + auto camera = std::make_shared(camera_position, world, false); +#endif controllers = {std::make_shared( camera)}; From 3844646eb9c07dc49819fa73dfc5ce6d593c3e61 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 9 Jul 2022 17:55:10 +0300 Subject: [PATCH 120/121] Add demo levels --- resources/levels/level_demo_01/config.json | 164 +++++++++++++++++++++ resources/levels/level_demo_01/map | 13 ++ resources/levels/level_demo_02/config.json | 164 +++++++++++++++++++++ resources/levels/level_demo_02/map | 13 ++ 4 files changed, 354 insertions(+) create mode 100644 resources/levels/level_demo_01/config.json create mode 100644 resources/levels/level_demo_01/map create mode 100644 resources/levels/level_demo_02/config.json create mode 100644 resources/levels/level_demo_02/map diff --git a/resources/levels/level_demo_01/config.json b/resources/levels/level_demo_01/config.json new file mode 100644 index 0000000..b3692eb --- /dev/null +++ b/resources/levels/level_demo_01/config.json @@ -0,0 +1,164 @@ +{ + "name" : "level_03", + "animated_resources" : "../../resources/animated/", + "static_resources" : "../../resources/static/block_03", + "decoration_resources" : "../../resources/decoration/decoration_03", + "block" : 10.0, + "camera": { + "position" : { + "x" : 10.0, + "y" : 10.0 + }, + "smoothness": 0.1, + "zoom": 0.1, + "follow_type" : "forward", + "minimal_distance" : 3.0, + "part_of_window" : 0.1 + }, + "background" : { + "source" : "../../resources/background/background_01", + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8] + }, + "texture" : { + "unstable_block" : "unstable_block.png", + "ground_block" : "ground_block.png", + "finish_block" : "finish_block.png", + "begin_block" : "begin_block.png", + "middle_block" : "middle_block.png", + "end_block" : "end_block.png", + "separate_block" : "separate_block.png" + }, + "decoration" : { + "decoration_01" : { + "source" : "tree.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : 5 + }, + "decoration_02" : { + "source" : "stone.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : -20 + } + }, + "hero" : { + "source" : "hero", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "hero_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", + "type": "several_files", + "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "hero_hurt", + "type": "several_files", + "delta_time": 130 + }, + "die" : { + "source": "hero_die", + "type": "several_files", + "delta_time": 130 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 5, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "enemy_hurt", + "type": "several_files", + "delta_time": 30 + }, + "die" : { + "source": "enemy_die", + "type": "several_files", + "delta_time": 30 + } + } + } + } +} \ No newline at end of file diff --git a/resources/levels/level_demo_01/map b/resources/levels/level_demo_01/map new file mode 100644 index 0000000..fcaa6fc --- /dev/null +++ b/resources/levels/level_demo_01/map @@ -0,0 +1,13 @@ +.....................############............................. +.....................############............................. +.....................############............................. +.....................############............................. +......................##########.............................. +..........................#####............................... +..........................#####.........@...................F. +...H............E............E.._..............E..........[__] +........[___..[_____]...._______#..@.._____________]..[___###. +________####...........[_########.....#############....######. +############...........############################....######. +############...........############################....######. +############################################################## \ No newline at end of file diff --git a/resources/levels/level_demo_02/config.json b/resources/levels/level_demo_02/config.json new file mode 100644 index 0000000..1cce7f3 --- /dev/null +++ b/resources/levels/level_demo_02/config.json @@ -0,0 +1,164 @@ +{ + "name" : "level_02", + "animated_resources" : "../../resources/animated/", + "static_resources" : "../../resources/static/block_02", + "decoration_resources" : "../../resources/decoration/decoration_03", + "block" : 10.0, + "camera": { + "position" : { + "x" : 10.0, + "y" : 10.0 + }, + "smoothness": 0.1, + "zoom": 0.1, + "follow_type" : "forward", + "minimal_distance" : 3.0, + "part_of_window" : 0.1 + }, + "background" : { + "source" : "../../resources/background/background_02", + "parallax_ratios" : [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6] + }, + "texture" : { + "unstable_block" : "block.png", + "ground_block" : "block.png", + "finish_block" : "finish_block.png", + "begin_block" : "block.png", + "middle_block" : "block.png", + "end_block" : "block.png", + "separate_block" : "block.png" + }, + "decoration" : { + "decoration_01" : { + "source" : "tree.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : 5 + }, + "decoration_02" : { + "source" : "stone.png", + "scale" : 1, + "delta_x" : 0, + "delta_y" : -20 + } + }, + "hero" : { + "source" : "hero", + "animated" : { + "size_width": 5.5, + "size_height": 9, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "hero_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "hero_run", + "type": "several_files", + "delta_time": 130 + }, + "jump" : { + "source": "hero_jump", + "type": "several_files", + "delta_time": 50 + }, + "fly_up" : { + "source": "hero_fly_up", + "type": "several_files", + "delta_time": 100 + }, + "fall" : { + "source": "hero_fall", + "type": "several_files", + "delta_time": 130 + }, + "attack_1_beg" : { + "source": "hero_attack_1_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_1_end" : { + "source": "hero_attack_1_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_beg" : { + "source": "hero_attack_2_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_2_end" : { + "source": "hero_attack_2_end", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_beg" : { + "source": "hero_attack_3_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_3_end" : { + "source": "hero_attack_3_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "hero_hurt", + "type": "several_files", + "delta_time": 130 + }, + "die" : { + "source": "hero_die", + "type": "several_files", + "delta_time": 130 + } + } + } + }, + "enemy" : { + "source" : "enemy", + "animated" : { + "size_width": 5.5, + "size_height": 5, + "size_scale": 0.3, + "delta_x" : 0, + "delta_y" : 3, + "actions" : { + "idle" : { + "source": "enemy_idle", + "type": "several_files", + "delta_time": 200 + }, + "run" : { + "source": "enemy_run", + "type": "several_files", + "delta_time": 130 + }, + "attack_beg" : { + "source": "enemy_attack_beg", + "type": "several_files", + "delta_time": 30 + }, + "attack_end" : { + "source": "enemy_attack_end", + "type": "several_files", + "delta_time": 30 + }, + "hurt" : { + "source": "enemy_hurt", + "type": "several_files", + "delta_time": 30 + }, + "die" : { + "source": "enemy_die", + "type": "several_files", + "delta_time": 30 + } + } + } + } +} \ No newline at end of file diff --git a/resources/levels/level_demo_02/map b/resources/levels/level_demo_02/map new file mode 100644 index 0000000..879b4bc --- /dev/null +++ b/resources/levels/level_demo_02/map @@ -0,0 +1,13 @@ +#@@@@................ +#@@@@................ +#@@@@................ +#.................... +##................... +###.................. +####................. +#####................ +######............... +#######.............. +####.H..EE........... +#######.@@@......F... +###########..[______] \ No newline at end of file From 5681502c8cecffa9a8d11a292ff6ba480ee7bb32 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 9 Jul 2022 18:18:05 +0300 Subject: [PATCH 121/121] Drop levels after server shutdown --- core/database/database/Database.cpp | 11 +++++++++++ core/database/database/Database.hpp | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/core/database/database/Database.cpp b/core/database/database/Database.cpp index 8009717..ad52ef7 100644 --- a/core/database/database/Database.cpp +++ b/core/database/database/Database.cpp @@ -38,6 +38,10 @@ namespace mad::core { } } + Database::~Database() { + drop_levels(); + } + bool Database::is_user_exists(const std::string &username) { pqxx::work W(m_connector); m_query = "SELECT * FROM users WHERE name = '" + W.esc(username) + "';"; @@ -134,4 +138,11 @@ namespace mad::core { auto total_rows = W.exec(m_query); return total_rows.size(); } + + void Database::drop_levels() { + pqxx::work W(m_connector); + m_query = "DROP TABLE levels;"; + W.exec(m_query); + W.commit(); + } } diff --git a/core/database/database/Database.hpp b/core/database/database/Database.hpp index d1fb612..d72e45d 100644 --- a/core/database/database/Database.hpp +++ b/core/database/database/Database.hpp @@ -35,6 +35,10 @@ namespace mad::core { void reset_progress(std::size_t id); void reset_progress(const std::string &username); + void drop_levels(); + + ~Database(); + private: pqxx::connection m_connector; std::string m_query;