From 8b7a24ff1fe63be927c4cfd93f665186f151fc7a Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Wed, 2 Jun 2021 16:13:18 +0200 Subject: [PATCH 01/43] bonus has been done, just need to remove comments when bombholder will be push + decide the time before they got remove --- CMakeLists.txt | 6 +++ sources/Bonus/Bonus.cpp | 38 ++++++++++++++++ sources/Bonus/Bonus.hpp | 18 ++++++++ sources/Component/Bonus/BonusComponent.cpp | 21 +++++++++ sources/Component/Bonus/BonusComponent.hpp | 47 ++++++++++++++++++++ sources/System/Health/HealthSystem.cpp | 50 ++++++++++++++++++++-- sources/System/Health/HealthSystem.hpp | 11 ++++- 7 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 sources/Bonus/Bonus.cpp create mode 100644 sources/Bonus/Bonus.hpp create mode 100644 sources/Component/Bonus/BonusComponent.cpp create mode 100644 sources/Component/Bonus/BonusComponent.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f43e51f3..47411480 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,10 @@ set(SOURCES sources/Runner/Runner.hpp sources/Map/Map.cpp sources/Map/Map.hpp + sources/Bonus/Bonus.cpp + sources/Bonus/Bonus.hpp + sources/Component/Bonus/BonusComponent.cpp + sources/Component/Bonus/BonusComponent.hpp sources/Component/Position/PositionComponent.cpp sources/Component/Position/PositionComponent.hpp sources/Component/Movable/MovableComponent.cpp @@ -28,6 +32,8 @@ set(SOURCES sources/Component/Keyboard/KeyboardComponent.hpp sources/Component/Health/HealthComponent.cpp sources/Component/Health/HealthComponent.hpp + sources/Component/Bonus/BonusComponent.cpp + sources/Component/Bonus/BonusComponent.hpp sources/System/Movable/MovableSystem.hpp sources/System/Movable/MovableSystem.cpp sources/System/Controllable/ControllableSystem.cpp diff --git a/sources/Bonus/Bonus.cpp b/sources/Bonus/Bonus.cpp new file mode 100644 index 00000000..4db1b2c6 --- /dev/null +++ b/sources/Bonus/Bonus.cpp @@ -0,0 +1,38 @@ +// +// Created by HENRY Benjamin on 02/06/2021. +// + +#include "Bonus.hpp" +//#include "Component/BombHolderComponent/BombHolderComponent.hpp" + +namespace BBM { + void Bonus::BombUpBonus(const WAL::Entity &entity, const WAL::Entity &other) + { + auto &bombHolder = other.getComponent(); + bombHolder.maxBombCount++; + } + + void Bonus::DamageIncreasedBonus(const WAL::Entity &entity, const WAL::Entity &other) + { + auto &bombHolder = other.getComponent(); + //bombHolder.damage++; + } + + void Bonus::ExplosionRangeBonus(const WAL::Entity &entity, const WAL::Entity &other) + { + auto &bombHolder = other.getComponent(); + //bombHolder.explosionRange++; + } + + void Bonus::SpeedUpBonus(const WAL::Entity &entity, const WAL::Entity &other) + { + auto &movable = other.getComponent(); + movable.addForce(Vector3f(1, 0, 1)); + } + + void Bonus::IgnoreWallsBonus(const WAL::Entity &entity, const WAL::Entity &other) + { + auto &bombHolder = other.getComponent(); + //bombHolder.ignoreWall = false; + } +} \ No newline at end of file diff --git a/sources/Bonus/Bonus.hpp b/sources/Bonus/Bonus.hpp new file mode 100644 index 00000000..46d4d5e1 --- /dev/null +++ b/sources/Bonus/Bonus.hpp @@ -0,0 +1,18 @@ +// +// Created by HENRY Benjamin on 02/06/2021. +// + +#pragma once + +#include "Entity/Entity.hpp" + +namespace BBM { + class Bonus { + public: + static void BombUpBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void DamageIncreasedBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void ExplosionRangeBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void SpeedUpBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void IgnoreWallsBonus(const WAL::Entity &entity, const WAL::Entity &other); + }; +} \ No newline at end of file diff --git a/sources/Component/Bonus/BonusComponent.cpp b/sources/Component/Bonus/BonusComponent.cpp new file mode 100644 index 00000000..c2789f1c --- /dev/null +++ b/sources/Component/Bonus/BonusComponent.cpp @@ -0,0 +1,21 @@ +// +// Created by Benjamin Henry on 2021-06-01. +// + +#include "BonusComponent.hpp" + +namespace BBM { + BonusComponent::BonusComponent(WAL::Entity &entity) + : WAL::Component(entity) + {} + + WAL::Component *BonusComponent::clone(WAL::Entity &entity) const + { + return new BonusComponent(entity); + } + + BonusComponent::BonusType BonusComponent::getRandomBonusType() const + { + return (static_cast(std::rand() % IGNOREWALLS)); + } +} \ No newline at end of file diff --git a/sources/Component/Bonus/BonusComponent.hpp b/sources/Component/Bonus/BonusComponent.hpp new file mode 100644 index 00000000..9e12cc10 --- /dev/null +++ b/sources/Component/Bonus/BonusComponent.hpp @@ -0,0 +1,47 @@ +// +// Created by Benjamin Henry on 2021-06-01. +// + +#pragma once + +#include "Component/Component.hpp" +#include "Entity/Entity.hpp" +#include + +using namespace std::chrono_literals; + +namespace BBM +{ + class BonusComponent : public WAL::Component + { + public: + + enum BonusType { + NOTHING, + BOMBSTOCK, + SPEEDUP, + EXPLOSIONINC, + DAMAGEINC, + IGNOREWALLS + }; + + std::chrono::nanoseconds disappearTimer = 10s; + + BonusType getRandomBonusType() const; + + //! @inherit + WAL::Component *clone(WAL::Entity &entity) const override; + + //! @brief A Bonus component can't be instantiated, it should be derived. + explicit BonusComponent(WAL::Entity &entity); + + //! @brief A Bonus component can't be instantiated, it should be derived. + BonusComponent(const BonusComponent &) = default; + + //! @brief default destructor + ~BonusComponent() override = default; + + //! @brief A Bonus component can't be assigned + BonusComponent &operator=(const BonusComponent &) = delete; + }; +} \ No newline at end of file diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 90bbfbb9..0f24ee91 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -3,24 +3,66 @@ // Edited by Benjamin Henry on 2021-05-20. // +#include +#include +#include #include "HealthSystem.hpp" #include "Component/Health/HealthComponent.hpp" -#include "Component/Controllable/ControllableComponent.hpp" +#include "Component/Bonus/BonusComponent.hpp" #include "Entity/Entity.hpp" +#include "Bonus/Bonus.hpp" + +namespace RAY3D = RAY::Drawables::Drawables3D; namespace BBM { - HealthSystem::HealthSystem() + HealthSystem::HealthSystem(WAL::Wal &wal) : WAL::System({ typeid(HealthComponent) - }) + }), + _wal(wal) {} + void HealthSystem::_createBonus(Vector3f position, BonusComponent::BonusType bonusType, std::chrono::nanoseconds timer) + { + std::map map = { + {BonusComponent::BonusType::BOMBSTOCK, "assets/items/bombup"}, + {BonusComponent::BonusType::SPEEDUP, "assets/items/speedup"}, + //{BonusComponent::BonusType::EXPLOSIONINC, "assets/items/explosion"}, + {BonusComponent::BonusType::DAMAGEINC, "assets/items/fireup"}, + {BonusComponent::BonusType::IGNOREWALLS, "assets/items/wallpass"} + }; + std::vector> func = { + &Bonus::BombUpBonus, &Bonus::SpeedUpBonus, &Bonus::ExplosionRangeBonus, + &Bonus::DamageIncreasedBonus, &Bonus::IgnoreWallsBonus + }; + + if (bonusType == BonusComponent::BonusType::NOTHING) + return; + std::cout << "Bonus spawned" << std::endl; + this->_wal.scene->addEntity("Bonus") + .addComponent(position) + .addComponent(1) + //.addComponent(1, func[bonusType -1]) + //.addComponent(timer, &[](WAL::Entity &bonus){ + // std::cout << "Bonus disappeared" << std::endl; + // bonus.scheduleDeletion(); + // }) + .addComponent>(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, "assets/items/items.png")); + } + void HealthSystem::onFixedUpdate(WAL::Entity &entity) { auto &health = entity.getComponent(); + auto &position = entity.getComponent(); - if (health.getHealthPoint() == 0) + if (health.getHealthPoint() == 0) { + if (entity.hasComponent()) { + auto &bonus = entity.getComponent(); + auto bonusType = bonus.getRandomBonusType(); + this->_createBonus(position.position, bonusType, bonus.disappearTimer); + } health.onDeath(entity); + } } } \ No newline at end of file diff --git a/sources/System/Health/HealthSystem.hpp b/sources/System/Health/HealthSystem.hpp index 15ca2062..3b59b1ca 100644 --- a/sources/System/Health/HealthSystem.hpp +++ b/sources/System/Health/HealthSystem.hpp @@ -5,6 +5,9 @@ #pragma once +#include +#include "Models/Vector3.hpp" +#include "Wal.hpp" #include "System/System.hpp" namespace BBM @@ -12,12 +15,18 @@ namespace BBM //! @brief A system to handle Health entities. class HealthSystem : public WAL::System { + private: + //! @brief A reference to the engine to spawn new entities. + WAL::Wal &_wal; + + //! @brief Spawn a bonus at the specified position. + void _createBonus(Vector3f position, BonusComponent::BonusType bonusType, std::chrono::nanoseconds timer); public: //! @inherit void onFixedUpdate(WAL::Entity &entity) override; //! @brief A default constructor - HealthSystem(); + HealthSystem(WAL::Wal &wal); //! @brief A Health system is copy constructable HealthSystem(const HealthSystem &) = default; //! @brief A default destructor From 2772b75de152263c6ac2fb5ec165b13b09903f5a Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Wed, 2 Jun 2021 16:29:00 +0200 Subject: [PATCH 02/43] comments added --- sources/Bonus/Bonus.cpp | 5 +++++ sources/Bonus/Bonus.hpp | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/sources/Bonus/Bonus.cpp b/sources/Bonus/Bonus.cpp index 4db1b2c6..4d43997d 100644 --- a/sources/Bonus/Bonus.cpp +++ b/sources/Bonus/Bonus.cpp @@ -10,29 +10,34 @@ namespace BBM { { auto &bombHolder = other.getComponent(); bombHolder.maxBombCount++; + //entity.scheduleDeletion(true); } void Bonus::DamageIncreasedBonus(const WAL::Entity &entity, const WAL::Entity &other) { auto &bombHolder = other.getComponent(); //bombHolder.damage++; + //entity.scheduleDeletion(true); } void Bonus::ExplosionRangeBonus(const WAL::Entity &entity, const WAL::Entity &other) { auto &bombHolder = other.getComponent(); //bombHolder.explosionRange++; + //entity.scheduleDeletion(true); } void Bonus::SpeedUpBonus(const WAL::Entity &entity, const WAL::Entity &other) { auto &movable = other.getComponent(); movable.addForce(Vector3f(1, 0, 1)); + //entity.scheduleDeletion(true); } void Bonus::IgnoreWallsBonus(const WAL::Entity &entity, const WAL::Entity &other) { auto &bombHolder = other.getComponent(); //bombHolder.ignoreWall = false; + //entity.scheduleDeletion(true); } } \ No newline at end of file diff --git a/sources/Bonus/Bonus.hpp b/sources/Bonus/Bonus.hpp index 46d4d5e1..4169e510 100644 --- a/sources/Bonus/Bonus.hpp +++ b/sources/Bonus/Bonus.hpp @@ -1,5 +1,6 @@ // // Created by HENRY Benjamin on 02/06/2021. +// Edited by AUGIER Tom on 02/06/2021. // #pragma once @@ -9,10 +10,29 @@ namespace BBM { class Bonus { public: + //! @param entity bonus + //! @param other the entity on which the effect will be applied + //! @brief Apply bonus effect that allows players to carry one more bomb than before static void BombUpBonus(const WAL::Entity &entity, const WAL::Entity &other); + + //! @param entity bonus + //! @param other the entity on which the effect will be applied + //! @brief Apply bonus effect who increased the bomb damage static void DamageIncreasedBonus(const WAL::Entity &entity, const WAL::Entity &other); + + //! @param entity bonus + //! @param other the entity on which the effect will be applied + //! @brief Apply bonus effect that expend the explosion range of the bomb static void ExplosionRangeBonus(const WAL::Entity &entity, const WAL::Entity &other); + + //! @param entity bonus + //! @param other the entity on which the effect will be applied + //! @brief Apply bonus effect that allows to run faster static void SpeedUpBonus(const WAL::Entity &entity, const WAL::Entity &other); + + //! @param entity bonus + //! @param other the entity on which the effect will be applied + //! @brief Apply bonus effect that allows bomb explosion to pass through walls static void IgnoreWallsBonus(const WAL::Entity &entity, const WAL::Entity &other); }; } \ No newline at end of file From 27c73de6ed172c9db99037a8b8ce87bbfe326615 Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Wed, 2 Jun 2021 18:26:40 +0200 Subject: [PATCH 03/43] include collisioncomponent missing --- sources/Bonus/Bonus.cpp | 33 +++++++++++++------------- sources/Bonus/Bonus.hpp | 30 +++++++++++------------ sources/System/Health/HealthSystem.cpp | 7 +++--- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/sources/Bonus/Bonus.cpp b/sources/Bonus/Bonus.cpp index 4d43997d..bf72e3bc 100644 --- a/sources/Bonus/Bonus.cpp +++ b/sources/Bonus/Bonus.cpp @@ -2,42 +2,43 @@ // Created by HENRY Benjamin on 02/06/2021. // +#include "Component/Movable/MovableComponent.hpp" #include "Bonus.hpp" //#include "Component/BombHolderComponent/BombHolderComponent.hpp" namespace BBM { - void Bonus::BombUpBonus(const WAL::Entity &entity, const WAL::Entity &other) + void Bonus::BombUpBonus(WAL::Entity &entity, const WAL::Entity &other) { - auto &bombHolder = other.getComponent(); - bombHolder.maxBombCount++; - //entity.scheduleDeletion(true); + //auto &bombHolder = entity.getComponent(); + //bombHolder.maxBombCount++; + //other.scheduleDeletion(true); } - void Bonus::DamageIncreasedBonus(const WAL::Entity &entity, const WAL::Entity &other) + void Bonus::DamageIncreasedBonus(WAL::Entity &entity, const WAL::Entity &other) { - auto &bombHolder = other.getComponent(); + //auto &bombHolder = entity.getComponent(); //bombHolder.damage++; - //entity.scheduleDeletion(true); + //other.scheduleDeletion(true); } - void Bonus::ExplosionRangeBonus(const WAL::Entity &entity, const WAL::Entity &other) + void Bonus::ExplosionRangeBonus(WAL::Entity &entity, const WAL::Entity &other) { - auto &bombHolder = other.getComponent(); + //auto &bombHolder = entity.getComponent(); //bombHolder.explosionRange++; - //entity.scheduleDeletion(true); + //other.scheduleDeletion(true); } - void Bonus::SpeedUpBonus(const WAL::Entity &entity, const WAL::Entity &other) + void Bonus::SpeedUpBonus(WAL::Entity &entity, const WAL::Entity &other) { - auto &movable = other.getComponent(); + auto &movable = entity.getComponent(); movable.addForce(Vector3f(1, 0, 1)); - //entity.scheduleDeletion(true); + //other.scheduleDeletion(true); } - void Bonus::IgnoreWallsBonus(const WAL::Entity &entity, const WAL::Entity &other) + void Bonus::IgnoreWallsBonus(WAL::Entity &entity, const WAL::Entity &other) { - auto &bombHolder = other.getComponent(); + //auto &bombHolder = entity.getComponent(); //bombHolder.ignoreWall = false; - //entity.scheduleDeletion(true); + //other.scheduleDeletion(true); } } \ No newline at end of file diff --git a/sources/Bonus/Bonus.hpp b/sources/Bonus/Bonus.hpp index 4169e510..cc3c15d6 100644 --- a/sources/Bonus/Bonus.hpp +++ b/sources/Bonus/Bonus.hpp @@ -10,29 +10,29 @@ namespace BBM { class Bonus { public: - //! @param entity bonus - //! @param other the entity on which the effect will be applied + //! @param other bonus + //! @param entity the entity on which the effect will be applied //! @brief Apply bonus effect that allows players to carry one more bomb than before - static void BombUpBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void BombUpBonus(WAL::Entity &entity, const WAL::Entity &other); - //! @param entity bonus - //! @param other the entity on which the effect will be applied + //! @param other bonus + //! @param entity the entity on which the effect will be applied //! @brief Apply bonus effect who increased the bomb damage - static void DamageIncreasedBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void DamageIncreasedBonus(WAL::Entity &entity, const WAL::Entity &other); - //! @param entity bonus - //! @param other the entity on which the effect will be applied + //! @param other bonus + //! @param entity the entity on which the effect will be applied //! @brief Apply bonus effect that expend the explosion range of the bomb - static void ExplosionRangeBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void ExplosionRangeBonus(WAL::Entity &entity, const WAL::Entity &other); - //! @param entity bonus - //! @param other the entity on which the effect will be applied + //! @param other bonus + //! @param entity the entity on which the effect will be applied //! @brief Apply bonus effect that allows to run faster - static void SpeedUpBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void SpeedUpBonus(WAL::Entity &entity, const WAL::Entity &other); - //! @param entity bonus - //! @param other the entity on which the effect will be applied + //! @param other bonus + //! @param entity the entity on which the effect will be applied //! @brief Apply bonus effect that allows bomb explosion to pass through walls - static void IgnoreWallsBonus(const WAL::Entity &entity, const WAL::Entity &other); + static void IgnoreWallsBonus(WAL::Entity &entity, const WAL::Entity &other); }; } \ No newline at end of file diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 0f24ee91..d57e0c82 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -6,6 +6,7 @@ #include #include #include +#include "Component/Collision/CollisionComponent.hpp" #include "HealthSystem.hpp" #include "Component/Health/HealthComponent.hpp" #include "Component/Bonus/BonusComponent.hpp" @@ -25,14 +26,14 @@ namespace BBM void HealthSystem::_createBonus(Vector3f position, BonusComponent::BonusType bonusType, std::chrono::nanoseconds timer) { - std::map map = { + static std::map map = { {BonusComponent::BonusType::BOMBSTOCK, "assets/items/bombup"}, {BonusComponent::BonusType::SPEEDUP, "assets/items/speedup"}, //{BonusComponent::BonusType::EXPLOSIONINC, "assets/items/explosion"}, {BonusComponent::BonusType::DAMAGEINC, "assets/items/fireup"}, {BonusComponent::BonusType::IGNOREWALLS, "assets/items/wallpass"} }; - std::vector> func = { + static std::vector> func = { &Bonus::BombUpBonus, &Bonus::SpeedUpBonus, &Bonus::ExplosionRangeBonus, &Bonus::DamageIncreasedBonus, &Bonus::IgnoreWallsBonus }; @@ -43,7 +44,7 @@ namespace BBM this->_wal.scene->addEntity("Bonus") .addComponent(position) .addComponent(1) - //.addComponent(1, func[bonusType -1]) + .addComponent(func[bonusType - 1], [](WAL::Entity &, const WAL::Entity &){}, 5.0) //.addComponent(timer, &[](WAL::Entity &bonus){ // std::cout << "Bonus disappeared" << std::endl; // bonus.scheduleDeletion(); From 6134ab9352545949999aa4ed4b746e4e7e55334c Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Thu, 3 Jun 2021 09:51:35 +0200 Subject: [PATCH 04/43] just miss timercomponent + bombholdercomponent now (using all callbacks from collisioncomponent) --- sources/Bonus/Bonus.cpp | 43 ++++++++++++++------------ sources/Bonus/Bonus.hpp | 30 +++++++++--------- sources/System/Health/HealthSystem.cpp | 4 ++- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/sources/Bonus/Bonus.cpp b/sources/Bonus/Bonus.cpp index bf72e3bc..1c4a400c 100644 --- a/sources/Bonus/Bonus.cpp +++ b/sources/Bonus/Bonus.cpp @@ -7,38 +7,43 @@ //#include "Component/BombHolderComponent/BombHolderComponent.hpp" namespace BBM { - void Bonus::BombUpBonus(WAL::Entity &entity, const WAL::Entity &other) + void Bonus::BombUpBonus(WAL::Entity &player, const WAL::Entity &bonus) { - //auto &bombHolder = entity.getComponent(); - //bombHolder.maxBombCount++; - //other.scheduleDeletion(true); + /* if (player.hasComponent()) { + auto &bombHolder = player.getComponent(); + bombHolder.maxBombCount++; + } */ } - void Bonus::DamageIncreasedBonus(WAL::Entity &entity, const WAL::Entity &other) + void Bonus::DamageIncreasedBonus(WAL::Entity &player, const WAL::Entity &bonus) { - //auto &bombHolder = entity.getComponent(); - //bombHolder.damage++; - //other.scheduleDeletion(true); + /* if (player.hasComponent()) { + auto &bombHolder = player.getComponent(); + bombHolder.damage++; + } */ } - void Bonus::ExplosionRangeBonus(WAL::Entity &entity, const WAL::Entity &other) + void Bonus::ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus) { - //auto &bombHolder = entity.getComponent(); - //bombHolder.explosionRange++; - //other.scheduleDeletion(true); + /* if (player.hasComponent()) { + auto &bombHolder = player.getComponent(); + bombHolder.explosionRange++; + } */ } - void Bonus::SpeedUpBonus(WAL::Entity &entity, const WAL::Entity &other) + void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus) { - auto &movable = entity.getComponent(); + if (!player.hasComponent()) + return; + auto &movable = player.getComponent(); movable.addForce(Vector3f(1, 0, 1)); - //other.scheduleDeletion(true); } - void Bonus::IgnoreWallsBonus(WAL::Entity &entity, const WAL::Entity &other) + void Bonus::IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus) { - //auto &bombHolder = entity.getComponent(); - //bombHolder.ignoreWall = false; - //other.scheduleDeletion(true); + /* if (player.hasComponent()) { + auto &bombHolder = player.getComponent(); + bombHolder.ignoreWalls = true; + } */ } } \ No newline at end of file diff --git a/sources/Bonus/Bonus.hpp b/sources/Bonus/Bonus.hpp index cc3c15d6..25579ef0 100644 --- a/sources/Bonus/Bonus.hpp +++ b/sources/Bonus/Bonus.hpp @@ -10,29 +10,29 @@ namespace BBM { class Bonus { public: - //! @param other bonus - //! @param entity the entity on which the effect will be applied + //! @param bonus bonus + //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect that allows players to carry one more bomb than before - static void BombUpBonus(WAL::Entity &entity, const WAL::Entity &other); + static void BombUpBonus(WAL::Entity &player, const WAL::Entity &bonus); - //! @param other bonus - //! @param entity the entity on which the effect will be applied + //! @param bonus bonus + //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect who increased the bomb damage - static void DamageIncreasedBonus(WAL::Entity &entity, const WAL::Entity &other); + static void DamageIncreasedBonus(WAL::Entity &player, const WAL::Entity &bonus); - //! @param other bonus - //! @param entity the entity on which the effect will be applied + //! @param bonus bonus + //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect that expend the explosion range of the bomb - static void ExplosionRangeBonus(WAL::Entity &entity, const WAL::Entity &other); + static void ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus); - //! @param other bonus - //! @param entity the entity on which the effect will be applied + //! @param bonus bonus + //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect that allows to run faster - static void SpeedUpBonus(WAL::Entity &entity, const WAL::Entity &other); + static void SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus); - //! @param other bonus - //! @param entity the entity on which the effect will be applied + //! @param bonus bonus + //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect that allows bomb explosion to pass through walls - static void IgnoreWallsBonus(WAL::Entity &entity, const WAL::Entity &other); + static void IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus); }; } \ No newline at end of file diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index d57e0c82..d5e898a5 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -44,7 +44,9 @@ namespace BBM this->_wal.scene->addEntity("Bonus") .addComponent(position) .addComponent(1) - .addComponent(func[bonusType - 1], [](WAL::Entity &, const WAL::Entity &){}, 5.0) + .addComponent([](WAL::Entity &bonus, const WAL::Entity &player) { + //bonus.scheduleDeletion(true); + }, func[bonusType - 1]) //.addComponent(timer, &[](WAL::Entity &bonus){ // std::cout << "Bonus disappeared" << std::endl; // bonus.scheduleDeletion(); From 82e1f065341352300fcc1419d73c9d3bb42dccac Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Thu, 3 Jun 2021 10:42:09 +0200 Subject: [PATCH 05/43] rename Bonus folder => Items folder (bonus/malus should be inside) --- sources/{Bonus => Items}/Bonus.cpp | 0 sources/{Bonus => Items}/Bonus.hpp | 0 sources/System/Health/HealthSystem.cpp | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename sources/{Bonus => Items}/Bonus.cpp (100%) rename sources/{Bonus => Items}/Bonus.hpp (100%) diff --git a/sources/Bonus/Bonus.cpp b/sources/Items/Bonus.cpp similarity index 100% rename from sources/Bonus/Bonus.cpp rename to sources/Items/Bonus.cpp diff --git a/sources/Bonus/Bonus.hpp b/sources/Items/Bonus.hpp similarity index 100% rename from sources/Bonus/Bonus.hpp rename to sources/Items/Bonus.hpp diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index d5e898a5..82afdfeb 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -11,7 +11,7 @@ #include "Component/Health/HealthComponent.hpp" #include "Component/Bonus/BonusComponent.hpp" #include "Entity/Entity.hpp" -#include "Bonus/Bonus.hpp" +#include "Items/Bonus.hpp" namespace RAY3D = RAY::Drawables::Drawables3D; From c345c49894a7e92a2fd11f6e6a6637c41dab10b8 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Thu, 3 Jun 2021 15:49:49 +0200 Subject: [PATCH 06/43] png added --- CMakeLists.txt | 4 ++-- assets/items/bombup.png | Bin 0 -> 1228 bytes assets/items/fireup.png | Bin 0 -> 1201 bytes assets/items/items.png-autosave.kra | Bin 0 -> 149925 bytes assets/items/speedup.png | Bin 0 -> 1148 bytes assets/items/speedup.png~ | Bin 0 -> 1142 bytes assets/items/wallpass.png | Bin 0 -> 1241 bytes sources/System/Health/HealthSystem.cpp | 2 +- 8 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 assets/items/bombup.png create mode 100644 assets/items/fireup.png create mode 100644 assets/items/items.png-autosave.kra create mode 100644 assets/items/speedup.png create mode 100644 assets/items/speedup.png~ create mode 100644 assets/items/wallpass.png diff --git a/CMakeLists.txt b/CMakeLists.txt index c85acd9d..91817cc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,8 +16,8 @@ set(SOURCES sources/Runner/Runner.hpp sources/Map/Map.cpp sources/Map/Map.hpp - sources/Bonus/Bonus.cpp - sources/Bonus/Bonus.hpp + sources/Items/Bonus.cpp + sources/Items/Bonus.hpp sources/Component/Bonus/BonusComponent.cpp sources/Component/Bonus/BonusComponent.hpp sources/Component/Position/PositionComponent.cpp diff --git a/assets/items/bombup.png b/assets/items/bombup.png new file mode 100644 index 0000000000000000000000000000000000000000..687a064f4ecb55407267825dd4cb33c54238350c GIT binary patch literal 1228 zcmV;-1T*`IP)>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf00096NklKe91IM`t0D3TL#gOl zl6*!7#UFkkEMdX0j}sVjeTdK@*FCHT0;pPFlL@3DEi`#l%zD3~|OWi`@bH0GKyfUHmbcpn5 zk|sB)3>AGNE{2J&hv^-I==Jv3SI6+?>AK&RXih|HdqZVMTnvwTnBGa3-uA)Afj9&- zA^lI#$OI6h_g~T5&ZO3}=y?)dKYBfk-akffYoqH&SN{*>n}5I|4-f`|A0MuxjcL(4 zs0YZt(L6jr0Z%t;iO$35E+Ukt3Hbm$&l1X$gv>*iAI-y~4G&V&%n(&ic3YZI9vrOU zFCFszdubV#D0|FHy^+2 zpnd@P1r1<2x&`Rj8lWm>3bz43C!z^?45vJ(^G*o>c^2dsG=MqcL5U?udf_Vy$TSZ& qV^5}boZ3cQp+)Tg95rvSg#ZBQ_q9naOwf@40000>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf0008$Nkl-&-d;mc6lG5R~N2#c!a%y+F2WA5l!;Zpugqb;nLjtKudgv*^e!&BZ(uH+ zl5c~&E@!{+4%>|dqQCv&U)ZA6nM>)ar>tbZbrH_waEi05lJ5-P$Mv&RXK`+xVUBeX zc7P2h=G3WEuET_!(uE>%5cNs&Pb6+my3LT{RY;{z}fl( zUyt{HTn?X4O?ol-AAOCqF2W9Qsd@VZgQ?G@!MN7aRiWm#fs>{Nb17}glhdllx(H`; z80N;UZ=ADOm;aa3SVw!Bb@$izsO}1>WnF|F;Awr>n6fM8aJ+Xh+TrGZ%-@ZNoW^fO zx&{`-S+v8Yv~FaoCU0GYGwX2ej_+>Wee1FP%dIA_%P9^@p~v;?F<;MOchx#84QpM5 z9bhRXs(xR2J-kI%>`Vf6R&viI4E9)PwD=vAMxRMUl>wvjaPxI;8*L_;#41yLh6h(z zO9O^80$F2^cA96}rVDuVcF`2rP!E6&e;PluR1ZyF(*#0*tYY{UG@EV-s;-jKX&!0I=xr# zv(8ydNfrzo9RU6BGV~i(DY^lxzy<&SX#WEGU)WjMnYns7nt`AJF20Q%9c`^lj9jf8 z?3p|nY@DrJjg(}ep#S$BrT;TpNvR5K8z=y<0uBJc{WqGCmA$Eh38SZ-ZJ64m{RT5~ z&oP~rzHilbvoV$mER{kCvAhkNLLi|gs##09R9dM4^_%c#{Fj#WgaUl2IK)ZQ(#6F^ z?a0Sxy_uzGX>l+X*PUoAbc2}uYwLGe?QkGP)^Wbx__oVsk3Bl|8Q)Bj_oFR z$KIO&eDM{%j{I++u^@c#xgr>wmi1OIT=1p)x#j@2p43g4u9odiWB%Yk)!L)O3{7JmRBZ80T3udxyX`BB%P>#~9=Ai@`Y0vn zRr&)6BAG#5fDet2+1b&8#PxgBIBEKP6XE*V9BEL}$==}M+Nfds^n8l`dxco%p+vB} zE!e4{y`c>~HR%J~MhGEc&E|P$=#X-c+lV%n;g?-)l$M>8M+}_7f1{np6goLXO;Vq$ z{1%~{ZMI#4(5T`_A@jTsZJ@%Z-Hci6sL=n4xk4O?v=1ocxmO-oT9J8vUTkpTr5|$9 z_m)eOGQ~|y;ZY1POb$`j4wu%7S|aux4o(i-XQ2b%taL@%eo8eRJ*GV(cAlfNp?mJd z7jqo|nUz6vsKwJD>(vti3hl=JNNc#}_wwg2FA8`;##+j&5rI_Hy&t^?aV)q}3Zu1x zv~%!}(n$2m+wXFD!uSd+k%^yAU7)y=UxjHSm-}K9?*9ELGxWF#h#%QC@VwtqQy}aJ z*s!GtT9aj*`2zfh_W#B7|3$k_OsZEB2mqh~1^^)cL;F9ZyV;r9yIR?sJNyUvxMX?N zVPfR)>rV`pjC^S6k4%M#(fRTjE}k3btZ!9--RLXHfZta_^gw$(HNp3(&5Q zdaoPtG;@`yA@bRa)0o3G6zAp8t<9bb7G!h0b^axy5`>|;?wT&RQ{J;OJlc z*Ss8^&D^cbJQyAAEdYW-1N~7-3X%x0xUm0H2+~qwDgeO0+5-TA(2)P`2W`LpOTaiv zX}bUbh$H_6NE#g?9socLkQNhG^UR&<_3B~J)IR?7TmGru7Qwph!Wsde7zEB-c>~H2 z%`v08!BzN!ySKe1@_wVPuAyhW4*H}5Mc)nrUCC2jEq5?T0tAAbJd~IOChHpEd7JgB zx5gSl@w>_Tx@FeYVQ(@qZFaoV;=1~0Te!s=|8TP4dy3!+>v;tVSYar(l6%eplhEo$ zD%sBo1ERZLzzmPj9QfEuJecFz15GSDwTzU}^&%U=-}#~jx1IOXcaLeD2;$Prr-xbB z4;uGb{*Q6miK`u?P8p=_3b|{P+@{yMlAn zdk?GYm$>nJBGuf-+bH{B!|pHjwBKRk_MbO(wS)$TXXgzP-ST9lo9^d!xjon904#lH z5=}jizf=$J3H~o7n;ysfoA>ek6m1Mr`P9qM*XI{Gf?j&V@xGhApuHHUuZ3t+@ zRo1tLg@9jq1# zF7J6Bjh-JLABOu`_KxDW{_xe2oGyyWtx^#eB7>PA#9ThBYA}=-0NVm@WD5q^P5<{x zdPc_LV$VmPt4in9R7Cp30b7mr_O*LG5{TlVrzegX9`wT}-m9IL_18-3xaBOA zU1jvG;XrV_>dxnR{+L)HTK8k50jcequvF;aMNnZbzq9@B{r-FR*O*36{ zJrJ%$5%M%e)C;#69PN=qjr&w&8ONsLaPW@KexYrMO7{Jq?%_6~fSxx+S}cobnVXo1GB9Uef(&W4HNi4AIy6Z!$--?Scauxw z=>-lZW`e;$PV|^+#fXJI6*?jtjePfbLGRxCTnGD_BgV z_D=HTH%qqh)}@d_|7X&R^NQ`OSc)$VPPL+{q^Z|t{WuC6{H>1UM%Oo$ z$RUmHw9Y;u_#|G3?iliD*&wV?SLIgc;;I$etCuj!H8qBot zE8#s4`5DdpYZ6<#BZ4O0l9jq5nEb3qK5F-kb2>ZX8GV-R%Ye($!|nGg2*VDp&EW@# z*U*6e0AdM*G8Wx#Zxjhw%H50XRn!@d_2hb9{OdYp0e+>9JEDYcGC5L# z^I$n_NCE(N`x2Oc?2H*V&T%FPx>vuT`Rq26j%e7?D5#vjgT+LqbT=^*m8ER$0$M~} zZ7GFi8G{%hWgI*Zd8l@FZLcWy9A>yJrt@Y2#iad&Q#5kIlRrsi%ET5U`ksZpnR&{3 zJ1T{pMM8;UBD8KhbSWpWj%9f-o@s$~QkSbESq5q;2dTNuEBY_Q*5bEB@8C@^NsMgF zJyZDY-}+XmaB+U5WJ4;9>gdQFzkyY#LGWq}xY3*WD840Y&jB0EAE!W4Ug+s}%oF!au^o|sO{j!;FUgcp)~ zJ{IjlPb6bf3GiHTQF4XjnA3+p7yo`P(j9dcWoc>>;as1%R>d|>$_78FsLE)JESB9= zA@k9p-58cOH9e^$N_)q>E3B4Y{-bOL!X}S2hJuBsaMZ zZ_0q}n~45DBlZja8&Fjm8L#Qb+hYB{V9im$W#9yc1pBehydx6)PpU>bf`C%=^+=YC z?*bw}MJN`mbN*5tBcotqX1rYY-{IBP*E(OCFb?8`V7oXXSMxdDVf)7Vp2WYy2&3@G z3q#095xr$)G`95qru*IqF#53$dCWXIXDurQ@>h(2%GdLpA77^@)xzK*PECA}Q}App zb`(MIUDd&;b#cdbxekpY#3bGz;8Zh7WzVMXc4c*Sb#R4BT7GifK_Dm-w_O1^wJ?F& z|MuKq;$@Xqm*DO0-v0U+@Z}}Jo5S}W(;r$W8wty66ajqMabV_Q5efgXxM8c~{Aj?B zw4z4NmO!`FZebMHRC>_4Uymm}p0aJO{ri49QA;~G4G55V*~tk^2npcy{e!b!ad?}8 zI>Y0C2Pg~!PuY!YDCJyIN(g=qs%7W*6_o-q|raH83Soc=4S?v6EjB`+&_56;i7-b;kUOx48!8;(5eMDxLaa4KwuMd$6_(YJ+2LXTmZ$7$vG`~Su(8;nlWIn0 zpyaN_Oa;l*p0g`c3z9zw&rxOMlm%>$(On8r)`v0tEmQ>tBZ$d6l{Z|wO{N(c!~bNGeS|fSZq9BmuO_2zN7nsfAbk=DR`%CE$Db$ ze^#~={gH)?8kK)}tEc$E$msb10j~*#j1YsQ8!r!W?6*yUUcZxF6F)zQ9a`9P{7JRC ziGM%Ijn0Ss>BRzqk5MHOMhBCgd&(S7o{0Gr}{#&*N&24UyjnBXYbkR=>?l~6c;|&MPw0{ zCYU0}N?h6eI)=Ix1|}+#7}=>zl!u=2w_a=wDu{&;xV+3m(?(1oWUP8_8~M2uNf7tD zZTGN%T56X*)z86IGqKR^J5p@XMY*}IX?QSE#SD_cqc==yxfxp_Md}PpWdYZKXwd6wC)UwH9yjcRwQL6dCXBe=l{iGPdT1Qk1` zE|ZoiRftJNEnuXYg`wOCT-+Z2#&#MvmNREu-_;ofl!4hOUFx=5ow;iUBVp?pBcQ8; zc*d((mcBc66KS#8-p}he08j)zf+F4M_>Q`e=C12*9x5&oyPgpG-$yf)9wB`%Tl%ml zZo5{#J+j@W@B%I&9^x79;{u*}yk#eQc3z2u)LBMVIPrSkFcgK3ktb?LHTk}I10u(C zy>JxYVr!^jC6)0fau7LEfHm|4qqva6VYMJq6$%LwTI!5ix|E1muU*$)C<W5~t_(*d96fWEu?zU0BigLE_q7V-M- zD;^161WxN>I~|VMKp2MMGRcxNZLL0ZVbAxCfCM&M7=snk2a8lg=B1{iG|t}STLOjz zzp?w%G75p?sxd8X!n=oA?IIwM7mM^pn=^OT6xDN-wJ$L)4(0nMAwag1??A`FA5NNI z@x9ogSfFJPY1t%x*K6=>D;6p$;G5o(@+O1=UsJ03K`(*GX93A^UOj^~iUAkx?SLLi z)oAtXV=6l}#bY~8PD1zd3Mes(W?G%U?SYgUF%}>Mnb-O^R*B$@^lOPjy|Q*+8cSCp z4OJS+V#3vyol6X#hGzSn-s#yDbY8Ny4cvlSPFQFjxw0D8f?=LBu~{fO zk9iSWx~NPOT}yLEb!bd%mwpeQR@($op2NeUp*#xvC#2I*4jR-Wk*JcZ-uk zHYhd#MR;5+`2?wILSpsaFYAS6XtH{;qg(h-_R+>=gOVgdogA_rw-=2j;S+T_Kxvf(eZ%+=4S~qE4YdljZ zfVuSIG0?AeKKN(ZBZ9bX{&YOOsoG7sycqlhX$F)x^2Dh=CCks5ZWPiAU;EDl3_Dyn?(V6V1|8=^*$=*luY7JZIbE!xUVm(8n#AsF8$1WJpoDt#t*F!w z91CC=ukQVA@FRUR&1+vPr;2&+E>#Lk4IxP$Vj$w3K3%Nv8e9p0;oZ=oo*3Hu(eS#} zf3UiaTj2EQWE%lDQo89Y+4uDdyea$Fyhu%jZV>`rIMUNKR&@pc?b>XMX_2%q3FkDc z^DE#5YBW(h@2q5Qls?U*EeD|nBWf3B<~=z0YlWpNg;+WOYP@a+^IW74RDX)IUav{I zS78w0OehGXNP6C$l0A}7QOcL zs$`iZCe;NPsC%}X`z0BH48t5HB872;QV24D9`-Bs{$-)lGc~XYQzy-}oYM|{qL`e5 zf^wR1u!_V8olL~YSvQs)lP*4SKyolze9@JaX8zzk)?H-q=No^FWm1TrF==VwnCbg^ zAR5VNC~>Oz^3n*m3{*KSi~#DeKFLA~=<((*HUL%*zxn&$_N*6#=4~x(`W)tdygvuP?qSy+C??Y5p*c?tNU&kh4TiZ1gBxJ~1RNd%f>b0ATwkPSan>`PYa`fMGrU!PT!k8s%+dWoG_1&O%v(?x;fZm= zxoJ!8h2i;Cg<(!RAq;6qEHAP7UIGkt8wC#X&%QS|#%RB9#k`~6qW0_IyHrcs(r$z^TV}yzg$;2Cna|rbMjK3nh&&`)< zDD4Z$u=_4Zz4@VlRy;hYXI+OYU*|-u_Hcxsl~l^=U;@vlv!(R1YH7Ozw;{lLa__wE zwtr0RZ6d&k?e3*ek2tExYP9DRDF6dyH=uW)6~(ERL2r1X@$l+hP|BA6@SI4J8~sI* zGKWmk))U2Y=|+bN>lyrM8m*C(ZR@k&%h(8!FC}Y{^7KPbBn1>M0hy_=c%(A);U>7i zL}rBXhN@~IJaiP%B{`8j6hBTh(-;!ePEM_!m=Za)JZ|K~h0Q{x7A4#K8XwPQ9<79q+-B!%6^C$p?TrsqBxe^L8wqWf+VUSSegbG=k_y4Gl9ME{RjnZ<83?(W~P7ZSTM`b0P&wI z4A08TX6x37@xw34^?C5+ETP=U9iF%hRttQIxVHE%We<~%3{5qc`ueyo$p(aZ+U`P2 z!?+mv$dHF(E_#(3XOtM}Mzw|0C|Ii9lI)t~iZ>~&CAx>&*3H$x*C}FmPf8ohR3=24 z0(eJPjSviVIpm=O!zOS>V36+vRY&m;q!0{wIG0sMMiznh`lcO2*8wjrfS0$Q+!~(S zpW>Wk`zQ_XAp{)8NPZUU=45O3-{~3;u-%j$_D=n#AhaYMa=(0?;oO2AknOvR zqJO&6o!SEsvbYB(E*;4A%q%a)|Cym|K)=aWO3M|eOMcFv#etA9?P<9OdYt&r!m1-# z6G?3=6_R6!Ea8;onLp9sR1TXDcoaEgwFV*I$NbLBOnAPog;23ZVX^e6+ zXA_}{;gxVzn4s^K?6Eit%b#d5`3xj!T&N)t>K7EM5%_^4`tTBmA}2vC*{O-BaQ2Z~ zk!o^NA+!-Z-SoFCJrcHTlA0efxdojTotA!mwe$I6)8(j^oxkD-XkuA4th^3dU6~y# z$m2Uda?vA#-Np`2@kU-=iA1?Yr};Mljt+?M?;`2dOk?@wj($Xwv{e9&-(pBzL~niN%$E|dLLaXvcNa!_RvG&ADC9z^U^lQ z8sB)&rFC`tK&3Z5)MTb+XyKRAPl4(#abn|8q!1*y8v01QQ@Aiif)qtL6H}@Lm5?AL zV+oxr-~=_wW#7)d?T_?XeOEb2Br6ky_Pi~;@W+qnotZe2t_8?t))Giu7=>-kMgT8_ zibCl&-0<1|O|(CHdoo$TH;iP?3vx6h%sVT&#P~w)YP8@|KDz04Y%S>plC8-}5B_pE z+fI*;+*Nuf?U014WzFGX0(jy>wp^@_^9Jgz?ZV?w_=b*v2t|Nc67Qc6sli<1cUtsw zQ$_|Iz}7NEqBgl6fiou@MYCY%#Fbr24@mxInRd7(|9i2nYIa6iMUO6?H5^J7dO}lI z)R>NJGFmB>=q$L_%8Z@k$jG{vNnAB+b=*DxVRRN{X9XSV2QMT{iCML!kD*YhPf;xL%SuWT52mJ!@x2Py~q(sv&wGCIuYMU1#Q_ER`{Y}wGoIE_4ls{xqR+V zAThRCi^fkdb1oswx2$a5@4m=EhKG4(!5cBE$G80TCR!M$kKph3xuWR>JuJkeH>5g(Gl)#^ z*og7cf$%CsGF$0m#rokQcp>oi&-wzF?kHCCMl=EKG)O{!v>@plU)yuG1Rb84?H55p z)Nl0h&JQh;GzbAmk%`iR3~?4?7D^i!fnY@#I_*D)=Ux8C!BF&h-E(HR$*1{=_}7XN zOcw}qQx4a*!rG~Mjf=T7m9V44s_J2SciUzFjX}7-=R^^5u$JK7(d^+}Q6CEpJrRS2 zJ3f8;Q4c=p(K^KS!&{0%V<2DfmE*>~3YVH7Rt$d~_(2Ff&l>uz6loi!+^4tR@)@qa zZg^JooZ&)(4w<%}o@3qHUlf5~pzWNTp8hfq-e6z*Odrhujtj5*KK(~>0Y8%Xo-F(W z=Ph%NKNAW{2opL^Xm{7kF!VpOfkusuBa&DCiPLrSNpb@+L!~38t_J3gN2n^Xe4gI~ zS>tkcN&I-C-9JGqwy0*~KtsY_IxSC=d6EfQD>VFI${nU~XG8Z@uqdNXaU^!#we}w0!^CQL0lQ zR&T>)K4sp@!O|vsx8u-~eO~p;^5IJ$(Q8Hr6gYkae%O06@t<0X(luS4^BuFqjH=7n3CBP~lgbgzaapNJe zoj959)DvhdC%kb*x&}Zu)lg5Skg&Y<_dtD?Dy@PH92ybkqE-&k^i9cRV`!(=($XE` znY?XdmpR4`3w?m1$JZ$m#9j!6c6s~>StBcDmXx-iSv{MLlAfNf{ZqRPNQC+TE-sB|=m73C?zKFpqYvsAOht6QV?T=H{^FQ#gsbUzjAK+4)d;k@p`utEBG(7LIF&lMAsHd zcDF+fABf(E948zC={@&(0mGy2Ocig|Jk&{YVn1bHeG*EtpG7?$PVkC2@_l|OE+EB! zMbLWJ@BGq#=gsVF1U9dfAS7{qe|B5>K7sy|IRZXgdqp1C$qO=>hnVl^F%5982T5^gCfJGKVGKHk;Zm2Q1;rYbT`ipu04&1-Tz~{k|3G z2q(`P`U5JbvYcN(P@8ce#r2F`B*pn?1QM6bzb6iXL38WbeY6CI$$Rn=@NuVkTsv68 zR?EK@n1IYHBxWhPGc(P~_fPHexPKs;VGW-Ba_6a)y4#jLaMV49%^hFpdepX2N;y$q zoJ||T6kD7T(x(!!Dw7Rm4JAh=t)hb?clAsUL*|{D(i#!c4$KsryAX)oUbGx}qKk!= zb|%$1R^F}vSxVPu2S>MnbJj47e{DENp@EPviD+=28@H0$m+M8VJZEtuXws0P!B3PL z?fAInAvp7qY9a}TaYI8PTZ)rZJ3$EN{_fPtvI>-5q&%ZM8l#durB_!rG|fnfK(^|s zu-7@`QCUekp(1vxgSw&(G7YhFA#5E4QFv`?~Pm>eN?izu2 zigbGL_InEffr|lS6W2(8lfs?5W>UuR`IS{nE=@i@n;H#ywFQKvUp7UAvY6(I=N;Gw zhqMb{e*Ytj(MA1O!cwf#mT`M69G`jV1%DBkkknk`h9a*&nc0;KV$--<}@;p^5H0bIgZE#;sakKep*{ zr@W9&eH%t@sXmz!&0K`DHbd#oW}diTCfOGQxz;=ONtvmsBKaAmtpeT1;@~#$<45f1C=>P8>I+uLTEwG~(l9a+r_g$JU>j+8F>3^Q zSxSrwCTs`UAk+fX)@h}X1;&Vm>tr!Cfulll+>2$^&Thcw%E)oF9;)mqbjnc|^ToZq z5c$0 zI{J$Wj2&WN78@Z}*fJC@5q3hiiVUVmPG+nGTM7z`oFi0dSz|}Xz{JE4I9WekkXv+c z#f&6Q0=Tv16{+N^bB5{5Sej?e+{tH%g3Hcbkp!)wvoqL|dC;33k{p$mPo10f&6%U98|RU`dC_YKiNW?JZogBQslwhY7MV5%Qj+I*7quzK6? zqCQ)SW@tfC&%VAt_7=i0NV_8Dh@wr{!|=asx}Zi=k$K%_4~YwU!kx+oM;U$8|Hu(b zB1qU~oZ_mIRvM#nFCcdvi%k?KTrUe)ZNn|2XEqCoxdf`LBwV(eMp}(Jy0c?AQd{C! z_3xR)Mzc70-ZRawQ1m@%17+0_q)zE9{f2pguN>LlQ@vF7yI%*dg8rZDv7i-G(!Y9s zyDk{S?l;F21fCY}s=#h~eAk6Gm%oPRP!HE5@Pz36PE?sD;QXd-#|H&Q(1m}b_^193 zOD_0kDo|{2{`qe`g3&vGby?t(w z97+jl8piI&rw|!+u#<<{Q2V^DR|kLJw1EjY>kQg`XJe3%brKHLY=6^AcqAAS|5=^) zc|_pmuFNUO;&p`NF*gv|cw6IovcI6QG@Q$?cwNq!Gx{U&Hs4vNOH#6Q{muoS*KDl= zo<~udT4jbGmgyWkHg*Lx9;B8A$H1O7%7bN_|DhlvWiJ?eXXQX5t`OVa>FRWdyz5w> zKFCA0eh5h}2TqPwbhGwXCU!-sXjlGug%s|CCft zwfqs=hNMRSR`FJyA8U<-Vq|C}j>d}xB(QnWF z)lkCSFeaaW(+$`GfJwbYPCCqf6l{Na5j`@J$9bRC+A*PB!l^t z59nVwLzeI8$Rr_yrMch`oz}9-=?_<><*Pk2KU>{sDx-6EO#f7w>Hyt(Y@*X{$UY%W zbqUzsj}F#OV>rSQLZ?RmCisOq3eo@kmO<|S81ik^8<0-e!#Zj|WcW`2|;vu-fY5utw^JPRi2&)yX!Y!6x< zcnzNmgu0}U8MwvjoBcc3O3BMhfA0GfHkQG*u3oq^Gw6~~<@`8m_{R8`k!zJe+%X^( z*`N*hN=LDA02blGy7BMMejOxOX5%`E$RSV>ez+uaboh?U&@Z_}V{5O7s%r(@5V5G- zKK-IMmJd7IsPyLVJNs%V(tNb~#iyeazON~b^_p2}%U%Q1(b$}*XFuDDjPNv*rp=w5 ziux?*h)M)XrI0UxOl}&xTMRc_QHQ7hh!-#*CD{t}X61plL_wPVP*wjYMUWLde(E|+ zW58=>IDZ=?pNFecMr77|s0R`8wIsQKad1MD+=y3jLbKfT-SSMA9yx4(WW00YH%3H@NQR^aQbz4P;Wsb%ID$Qf)fv76= z15BlT>^R0Ba1p)ui05+UybSjsqYaX{NL?2dv*)_NNG02)>v< ztCP!q75_;KKkqX7VU;C^o7=MF24-!gliie3nW8X^MD~V+WwUbf``41;NY?_v9O>f&#)ukfE%dyx`jvG0bCrn5>hwl#kE&mxP^eoSg}2dg<54y}B@Fdi`rOIN z6GdhreP1EkR48HVPGdQ!C6)8--uq+#wQBrOMTm2UY!9rpv`TY8aiM{)5*Jq71ms<=7kOKp{@dj zO;sIo7z9W+HG1f4ye1nv1a_z{5|pH1k}2M6?0qqKe_bAga6erzW!2-U=xjO|BrHAc zWJPWDL>vR7HG+=T^d?M{G8;xYf<`t!=t8kysysf>OYkI*1+Ysu2G%II)D_j)p$dHu zcc(bqO;&43;_#xI3lsMOyFO2?jZ-%`6z{c<4aAI)Mp^NRzx<@_v;Qeze^D*MGU3Bm z*kFtwq||Z`ga}A%@@bA*xboUw+2H65VST}+qZ5i$Pw$OLR25Alag@;E%UCm0kubAH z>?bLU3Tu9r;mApXu4ACM%@pTp`j>;yKc};hfi0FiOx1^`7}9vt)KI?1{>k6?WrWcx zqh=KO#;wzNRS(y=s*|h7Tb2|ShRSu=T~1H>){MRu*lK*;h}6|dHU!xr%v!wON*;cOAY&&i8gCR6+#;0M-zNF zW>a`;e`#XyQz)CZ5c`$HjC_ASYHdVw0J0UWZqSCS<5Cqj=mIvZ6|%{5%j0Ih{GTrI z$2L!4^5CP}F2;O& zcV!svlUNFzr&mBpZ?LY-0EEVeWTgpg>)f-=7_^ z`MV1k!9zp)kFle-{ul89?l;YyXqVbylzV}51H_r{lZQwwz4ga$CA-!DlbpKmEEF3! z8*X$=(f*a=J6T4kLf|=>l!87B=teGZwcpUN$3kWYut-V>;#o(?(nqA459W zidMU9kO&g+*rNp_FN31>H~VA zLNs`lgYc5gwCmUSvmt)D+Dm&9UakV+FmG8eRGaQrJ3CECJ zONhAv4K4i%=X~Ve7dtPzk*`1ka0|VNmZ|sJ@6(TlPrSEp@K&quT&Ur}#O|vuIF_Ne ztVbOCMt}3XxHtsL65AAedt3j#egmMPisDn{n?@*<#71mLh4<>0&@{AvMja;uHc#AE zqbjh%6g1uxqc09e^IRRG7j)Eav?gcgmIZlSGQ+IS$iqtY0(7qH6I*qHW<%K{CZ(em zLd$l=LV$~HM9io;$Jw1Nvl8Dffj>0vF|k6r;<(a%U*`-2z6N8xa5@lqRFca42*8pXA%zd`$3a_al*Inl-R{4eyQeINBDKvC8h-q7{+QzpaCpDui3Me(+8ke}~$ zXcF2*AJYZ#lrsd>WT+$d!ei~LQmcy%B-pjAvzWwM%$R()QdAi4hbfs{8z4_TinSTb z=SiA6L?x!;HaR8CI2c`d-0v-w6{fC@z$LR@cxIO_Z#a*~?`+Xo;Nu_iY#KT-#b5tO z+M7JC;sWXjF&R1P5?!v+^-?97G}a#b{g2pI^j+9teGkZp)_DEZ<>;TB3$B3UgoN@? zUO^Fg0D{htiGlh3??1cu4TjGU_`mlqa0k}v16Dr+f;W7>QyyW)5{N47&(_AL3(hdR zc)srKes->mbsVP}`o!zTtTq8El7?gi(Akb!$nrK20JMqP^nJfclP}$3hz@@wVw`^S6)oZyROC@{b-MAFSO6F0b@FUVs04 zP(v+p@Rr3ipWKGczDPtj^N`ZXE8CqQ!Pfgd;I8Jz{j&JbU>S5e74$OrgG1b#`QYiZeKQ>pwoUUD@bvtOZ$w)%_54~GAlfbWF->BunX8#RL4fASgFg4 zz|DgwbORpwboD<;LdeM$M2pojoMMPbrMK67bEWMqMh_^cYR*!w#8AgvfGg!Ru(T7G zlS18F4*j>V$d|K1bvc`A$w1jjp({xJY^B4w= zL@W7ZimBg_DODZ;IKZ>5;-{453_-1u%~uo~a$@<#+rr(3w{%HB-1sd=ZRJDT73gKT z24c_}tHP_P9xxe;H4zXqQCpsEI5J}uTY$>^cmc|WIng|ijZG1B_vm39$aO|b&m+~s zTl(^5RbeVSU5vuc77*>;5mUn``@mYxHJq!1g;UrUd}vE|Qt@NqTYfW@3uM~J_gVIv zPIKVbx#VxeBB({bLGXnWl85hc%lG#H>R*wLk7i>XdqWu3M4sRM0s}LvL|N`1-@jhb zxmnhCl_$r{lRf(6Va#zA+p#3TDvcUR5!e%FKi{K^ zO0Bbir(7c`cXxn%SQI@%@o$sTHQ_c<6C3-J>iq0{(kTa2dhN?IIecGdA}l z_VxqRKWU=p(ko~#uf@>1<0%0)ee`Dd94&lnGlBA^#(`!PcZdOa5~T+lYBjU)T`?fa zdD$;_n3Opo(tps>(49%gq`!MMxqO0=o|?+!If1eHIe_{7!sOxd93_ADga-99T1a;1 z`l>g?0z;Hm)$j;W9K|_Gk}DE|jsWFnOaa?!@fl(a%LqDi=~kk=!~3VG!4mphtky`& z;I8sW8xK*-B;^q&PGa8Jix_l{kV&YTa3L`GNC(k_>g_%eWHHK>ldggt!`mIQFmh^N02avSOQ_H78eh+u&#c9mD%o?f zqBwG5peG0fL_M_UsR*h_whSovqPmJSMHP?5wTpX87x&nwNqw(kK(&a_UfljYx0}Lc z?=o&pj!8UsHZb8;;mm^l{Lgt1p(IIypj{Gce1QcQW5-)Mn6BF*e=H?1OG7jyQJq4Q zaC4Sbfh)xB7{#3Woi(di%#eXJJ)G8v%WXHU*ghKMz20q=mMyx| z4vb)w?0N^Q;_wIvRW67$SiV2VgGNrzE78+@qS*qG`UyxwC_T~+mEw^SOvd+zp6T@E z`K*T@02G&E^F0)6H<`nG87I@1OH{UP1Kv6&5Jir~Xjk!@X`%J^?#ef9cDrGB*+BTY zdV<hks(hQg1EL zC%SRD_)3P`s6a(f8XSrs!*qUewanrbw$z;$C*3LWbFI|96CZN~JtdNar{64^!|W*5 zTZkj^;*k1OYYUF4_kf4p%?ikO|v4qkXicD-i8(C+gIHvxlMITTy)J;O{|T^kfXEe2*Ukr){k^v|R=MIj_)m5rfV zS`RfJuT#-TwV1LDvIJKfdK#0IOCSsaBRpS0kgBeI({FRN9k;!qrS2~yK+zyMGWkC- z(9Pz>Vc&{tUWie|1%HnAG4k||Y#j3Qukw+pdXnwQyfx7tuJT=-0 za3K%xLcKP_XlT_@oj#UMCW_N|!}`E5w9u#Apx^1UYxMBMD#hWytl+pqDQc-(5nR3J zqJ^?Odn5u;i&r;t!UVYBkQBhH2#al=^iu8Vj;t*5Cd!TrhJ2|g8g9=M!0|X9&0#H0 z*-Y}icC&O{XQXxACi(w`#}JuPeeXBpQ?55h6AY2Dx#>E)Hi>j7itno(|I0u~81{aU zD4os>U+%!mlUK>M`WSYk2;1`-70gPt5dTL$6I#1MQEOzAz?%c#t(E>urZzHUOQD6j zhSan~tIL!JPvmlUvs_L1j0kL9#06+L&gKu>Dl>cpoEfFG< zN1XJJ&!bfe=G17G;|~hqF`w#SRxQ7{G-0j_$w#|>@b7sY;Nbah!;L50E#L<5bE6W; zASu9wu>X96X~0>JcLX86@4^BxG{(w%Kb*6)D!kwWUCMR`d4tq&Y7hNZeJ4a!Nt1}5 zec=TJWH=QjJGP1ME>4xq6*QXxmtAxk7o2lEU%ln%JOZa4uwyo1O#^nKj9kvO5A5fX zy(eQO@N>#Ea9aP~LLug+>--8=uiwKYL?S~ZAw^O7Sv&}QbzcQq)rC8=V4=emB|(@F z2N9JK!oY$t1Sax~!nW{aHR62Lew`*P$`Vs=X96JzwEn+OWR|(bmX^?zu!R@kVTuA1 zKD(o{_W~_uJWB%)_XSn!3gk7K}G3TRI~0v!4Li(K7eM{K3<%9+Uf&% zLz57c4Hl9G5@WZ#I3^dOOlVub=9d`HXfj=0Mv6wTS|?`rMoM74`(Fico79zJ32SEE zC!UcAda76_m`sr9k>LRtfkqlJ8jim`qrFKyQRmbnID?DMIgzWsaW7xF>F#gKBM=ep z84Wlv>an*yhhyD@G);WzhX2mQh_COrmB+XY;}8jqX9HRX(OXpoR_!d}KV5Ao6&pfr{Kh=fcD?JkHCbSa>BV->-h4O zp9AVDE3`&CE-9>H+k(6jZvY~E?<~-pz}MdA2fhJTO~msTUJUcc@UH*z2JXA}F1~*2 zEuP1HYWBr%@5I+@^T|HU58%SLc}sFQCmRaC_nCxZBD~_{f>xkBw(FQU`0Z~7m;~PU z6OMKQ9AK@nYnocB^&Fw7?O#Nu&m{^2;?UqB&=p%V-I$;TvzX1O+Z2Cp^Kd=ekCNM* zZp+6Ap8EK`eD#)tyLtqUjU(CApczgq*BrWsXSEkdf&gcy!MxfFte2X07X#+13PMjX zYa(BsTdDIX%eJgj);0Zy)|7S@oGWpGK;S9N0V=grWreNk2A_J*HA`fussb?zbuiJ0 zV4Odm)NV{1CWK})9>Bv8QEyi!X_rZ`p4;YMPQ3mOnzkO2em{|W^3Sm=vFm2}s`8^q z#LUo+aU}~V3tExqhCDaKVNC?t_4i`V6ZbN<36V)zO!q)zkvK{`%JGp-Z>-(}$S2+a zSkOus6+%%8Weima+VC&S$boUbkc5y&%s}5srk=Dqt?T5a#?4#XW=j5K?Z(0HbR9(6 zmgD+Pw?I7ImMtCa9byFTDB?tdklB)J@4t&nPdF1X;S9`mHnrlLeAWV%YyX0`5!PCw zAe?pfSr2eIt5;Fh0-e(phEoV^g_vkIQMk%c71iv12pfy_W);u2Lc)MF^h3O~B{)m8 z){+2x8yndd9Qe3H;|}Ae{}xH3qKbb6wk_*DN|`bY32g4Y-d5B> zk`i9_n}lf-Nd_Bk%ubKmAvCc3iMfMgf)PK$06;*$zmr*V%Km%zv0VXFv$w%1001BW zNklIVU4Mc`(d;i@#FhmjJEdh{tvyCI7zwu z9ar+e!8w0LKFsOb8|hIk8?Q>;+0NxA@O#1Jh!xeYhY zjlsLPm4EC};IZb)YBonBb`77v$P{*~?(TEcz$P#qQmT;IjWL32ZoZG}Z#_uvN{kBO zrqsx0<8a@o&rM7BaQ6JMwBndjH})FTXSU^kp4`J1?ii_1f*KjgVe!n3#TUh5*3F>%&Q$?Jusp9JmH{$_36j2cdokg-D^600EFE!FO zLDGe|MBF@U`6flpDmxFuEgGO0`rngP$cGOps_#*S$G+MsYJdpI5qSADv52i$D16>^ z=*$KX9mPM)c^r#UvZqEq& z&e>V-`?Sjr)@IZ7vLQxr(HUHN?kO;exaWZZWuY?w&u!0Fm3bNw8!*#J!SR#mmGuuch$UvXOXKjn5wFM-Nh zs_}T^$FdRA;h`G<2d3HL)ZhIJieg=^kuN-v3T10=dF{on^W_rx;MTB+-@$~JA)D1KUh!GNrsH~%$!fGQmh=%9F z^UH4~4!q$loiA-wx0Us2vsjdpk~j%Ceb2F+dBPsPcI!RdzdR&1+XEI>c=C6wa z+{LZS4|3MrF+6tu7}`-xQO5(OGrov-;iu)mvzxxD-CEXdFVhcLx1<;9G~e1jrSrvI zf%xC9g3a}i)h_d$5kGHij*UHLgP_#zhQ4LY&>D{X-n#NH|A(kx4 zNu!9xPLqSnM}9Ybf4wj%ORjtH9&YWg8G=siyT4SGvZ|x{NASiRe)cxHZvD=YZS=JM z-yF@xn{}?+e$4<#Jq4-Hg>(8Tka&X3^$JuW4&mwNZ*yb?cflzeJ`y0C?B%b1`|p`# zhnVbn4#?Knz-$dSEmIVsC(2dPP4uX!UkAEdY@Pq?%4lEhrYi$NF3itm)ChR#TTe!k z4j=vvhfFG-o2>3w2&Z^=suf$V{DFPAF32ljP=s9gnkQjbJUtc>a0xKqgA;Ee8o+D* z;Ynmmecu1qC!_Ow_|SE~j5a&G^Dk~@X?ehV-g`M?`ix(69YNll@gfLdW97~tS!I}v zc>QNX_DtYwpK;8^{t0Odas?A9zw`PWBIxbadTr@X{Lg=>#8seo!Ki@N9Uv3npJ12^ zKiW(XuR8A<$ej4l@41fxvLQIq^i~_s)jtTu(luw z3`Q(Y9fkExI7aI()p`mwJB+|OL{P(WS&o@+(m2?{mgP}l%vkZ3X6g}qtN$R6UpR&{ z=Z>Kf#x-Z}TH0`@rpM{Wf$__|}6U*IDIbriR1@Fak*o zaRSnSr0tN*!C{bGNvo2o%vo9*u+$$grq9Hzpp9vT&PH*GQl-i$5E=%`!msaw($DCl zv7j-u8j6V^3N}W@yG`$19v%tg&@2@x!4^;zupGd0SbG5FBgX?MZAn>`xXM?rsrnvv zSNQ>CL>Oho3{|%(eQ$uZ>Pu(CdJQhd!;9&(7^4mny6wGK#Rm|5kWgvF0mm&g*?+K4 zc$6qpP-v4Kg`6;aqyg1`)WWrSpuY3 z<)V9G&ShL3-AMZg{@sv(3(F_bHz{)`oX4??Jp@A(!ApMmB=U*!(O*3TqdsTp*w4NK z%>v&2Dc{OFS69!izc8zUL7BLK_b#7G`>?}457Msks=t2{anr$T21I>$&AaXQ{vt3O3%~J^1j&TAot4pW%AEx)ImPX@zH4iJtl)bnvmhWofM<*l)O2e_>8a2v zs|>S@QC3mq-UEo@peDxjjX_c55pg||uhgAy3a<9^cIkTv#1I)jfCHoK?Zw>nKtzQS zK9sctwMQ_G5j^N)1gFm(!x_C}Xht#X5tO}ny+v8@t-*tQV{njRS#a~=gPb*Y3}?;z zAmhvb4u#e^U+n*`js5n zz6G`R)|MOi%DK`9*T`5asKI*xffMWssI^QE4bZmro_8PSY9nCO3SGWEd=4SnD6E}9mmf)7T{I+k z=H0#X4UX+)+`l~D7@mI!GK&$|l6{Bn;kN#RoH2I{XV!+mp&0x?yuJS*w+|j~qWE`?+tp;*Tf7y`upK$15D)>~hZhUXJN_L!jyi zM3|HX-|8RY)^+-PSK{o$Xo^^h&K#e5-^VDrEzf_3FFZ+B z#ytDA&nF)CXO&DMmZCk!$KLfZSZwi(CsS7;&1%xN+&B*@ZHR5bb8h@Rrpj>VT*^e? zl7l;Y0wV%0DW6E+r1Xw^GRG-A_vSAk?KYpdMqv-N{;gTEX%^sh&xG+DNDJmB@U;)Z z+%)&6U~^C0VAejO90$Dj`KQrnT3+=FcM;cFhR8TxdE7np33+?9$WRQMS$VfyzXK9D z@S;`jp9sJHmu-3({QNZ|dZF?wPszwb;kVzOu<9VQ8y!TWLMwp(`;?r-DYt!97?g(J z)E4~)tUPNK*Hq8_@V!Cc+E!fMl%nDrS}Gtf3rY+9amGCljtGqq3LL+u&EAC$2bU+r z(}ETa2_*Dgbx!?DkHZ`(?F%)NwU-L-4J@=H4leJ!-_eS#vj#&u;krY2aeMzk&X_xv zQ@ab?xpJ6q_75_ya!&+e*4|1LUr;uxGQRrY{&j}nSeCPKJ@5yVQq_6=x{9&R7VIA{ zanHEVNzFOVSvZdQxWUbX2l&R|0fuExAhJQjheXnvBs>3ww3L4i2Ah+aMMQ~^t zDIIy@VY;;#p(_I#!$YK_K3YE+DJ&rs!Qo{bjZ7^XnOuf27;R9|5h{hy#@;*CI5&obGH z=Tevq1JpoVBe*8Uk$xM#woCmWSZR8jv0T%rh1U7HgiH}9)78`31t>`1y`I=9E2W`d z3Ck%A8lWjYrtt_G{NRgzoO6VM)V=f6$T>J~42gz-P6-!Xld2hR)2%$`~4F~wf@&i7vuMQ)o zUM_8w>E{PV1MVNM5}AOpEkPWi*}Bg<55St4H`6&v&X|KnvW4?-?^zOU~_x{$YG>qj{-Mffot-SLgiv<@ccfD+t zFcU7n!g~V6btC3N=BvxNkWl2$WVDVAa#NCs9Bc7)%I32vt5s z9X>MXfr#hg zGxTDkR9H%#R-A5cXtwnL&Qcq-oJFWeR{A7ifXgjT1iQL|bAuhXPgnX( zvXE?|GjgDvWuyMIXIWK6onfI{0m6a9Yn}kGVdh`xR-Oycl(gm?27O5Sg&I{St23ek zgW7u!Lf?Bm84H1M4JaFmOTM=$zuiRYS;P$(Ha?>d^cHdr0!-3lklLk0j*Z6M|)oGM;qyDG7_IwoK^Y6R@BM~q7 z#h0=?2)X#6AA)noJ%!VH6(9MXD{xx!jMqH@L3h+|?e@hP)<7qR8?Nx!ew`dvQ+UcN zpRuNo1Z-ue1>u;Nc2ZIrJA6%x_OzAXJ zT8*ei)GZiJDpn^2jX1>Gip*AMu*L*5J^p${sygc%(7Ke^ARe<%JVD0;E2A27`nzWU zzSFWf>9@J7@klZ=04^%LYau&FP!-?rKM_Ilam`7-v!?0xV-a*b0yU@^pk}ybzbK4| zG~V{)1*I2c7~?zkRG@GCsBBC9eVF-n$8|ez)gO?EBR&FL(KH*-PvKC*8-n^oNSYpz zcCzAIEF)b<*#u;D-g)8zvhTo)WK(~=Q%_)dBH$p;ydg8{fhw0Pp)bOq>DT;aLviUN zbMV93I=v_@S>byC0;wwljd0vThw&t*-AI^kHy9TMs*ofJW#!0~dVQ;+s!@7eO-u^CnQ= zofHNU=bd{I6858%JJs_u>ZcB7(SR$z1!01>K6U~ zr8!4GjyUdPZzFBAdGfhWp<+lZZiB549IPgA-m7LcBp%2kVr>vb6~$}!QI132@vbM* z8X10O#m54sCPjeC8UFIYQyGa+^bF<*xP-e(?Frmodjh}v!8Y9qWQQhntnwIJF)_kh z7CS7r;MSM>HNX2FSNa{Ds0X$vYqwj(qrWM{Mmcez!>A}JY(Wx)ewk2JgeKs`Juyja zsZ_Ae(MST60PBv<=qeD3p%Dq8QT9L3uM3L4s~7x;lZ_rgl0&n^Rl?yFA8ns{vHg{h z{z}NG=@{Dz7xn?rW{C^zk++w_C?y*7QL`0%J_8$B2ql0_r?YOy1xaqQGqDq8hd*@6mYU-tc@{@ zL~spT@57N_u3f&jsi%orZPwRkgv!C3cn@c};m`euYyREN;a}qAU#CNXGA}8zf^wQ} z4t-HjmX#bHWR&Vyos@JE4^2PLE1XjXqmttmQvw53<&c_LCy;<6`M*AxCZu6NURrK@ zpwIG3zH2w&|Ev;5CL)&Dml#({@sjJge-d!vUp)?!hwyjx&CCRsR2+KoJ~Xj>L%s@t zswK;ha(e+S9qMGpPp|5TC8DxpBG=#r&;H-YvJsblvY;p?$lulZ(M*Zs2LH>meu_A0 zV(J&>f~Q_Wk&n6bllczYzpmciuMw+igmszMZz4qfxj5WWr^pmb@#5~+;T{W~tflmkDyLXg4RKhY-4gkS-AG(1%k@o-oh0<|KH#yMZP>jH9x%qKfOaO9Lr0GId;zi4&8eFM=J`v@d!1eN4)-8|4FrejzYhJ zIYrjaLBNGaw|_6MAg)+eFI=MST3mhC95FY%9zA;l0H zC8)ayr|iGhTHi!v#8cG5iufP68*FImbe-^RdAyA|BKdwHu zOpjA#l!#oxm1mq0Kc6)6!Ad`29|tcdFBL)aL8osDD>^7{ThD z^lM#Q=Je>!VkdB>-4Y%Go^X@3N;r`#zPJV7u)Kvh|f6Hr&OB@wLjR~ctHaT2r8 zYY`j2-4qwl)U^Ox!?Ipn>A!u#smJid(~sqOKYk94^ijM7ICS_Bx7~Kz(ecA880)$5 zwq@T%(RD7bD75McWfTG;%xQ!H?q449*s~r7D7W7FE#?5wzXsf_zn(j2 zhJJ__;*^1Rh+&+S+xs z@v9KQPpteF%|^gY=lw?rJSs|SvBl+gU(RZ_ibh&r=MN+Fc;Mm}L6Wj~5|}c>eE0*9 zWhjQIopRou-T_oMArvA)Fm>;KI-0qOF5jN}-c>c=O3`_KeJI)PK}d`)s@E zJ*X|zk=|ovgML-myLXN!oc2|0HQ54PGc|luduu|-hmODdKM#F+BS> zPaR#hYnW>8~~S_3fsV~`CPHiuh!#-*%55(R=HA$JX^LRKe1 z{cyeIcGjV(qfADSR&+&)4V+zTh`T@pC)@|am95^xWLy%ZizLb1>?Ky9sysxLh@hsR za80sGw&<^{!^DnbWkka`j)|Ixz&YUnfMeTDB!mL(2)Dv(PRq1K5rxvTO^{{r`l5(A>D&eE6=x{(JW^b|pV@6t$+00w=+nSf3tV#luhH+1IpyQOOCZ9vckCgaYw(PJ2RdqS zd!5sOTj2^{*U$i3M|ffe-;43NCKOHR{d@oU z%AZ3thG&kpAR28sL}n+o=aq)O>k}G92ZEVL+o1A^6CDZY_DuxFc4umfCBmG4phanqLPAw=n?f z9-XuPdf93N>s)n^Cj@y)!}W+XB}waCcf$vb^4!j_+$~BFgc#?DM@m~Pi%sYlX0%yz z^=xx!N?5*~=-LSsMNU~x*W1b@8$rER^dg&gM1e_W$PgOM0cqf7`qRK8z7BWLZ_1dU zfH2rY5T;noAxvhQ#$iqP*=#@|xTpaJiVR!^Q3!<7t%V>@eT*R3Ll~u= zz+3Ob4w4Jx2Izn^LFWADwgV>co`ERXx}`B%cd#9n7ph7=bc{=7v{aE`NZSGGlyTn& z*hWj9jYbChXs{t@zvWPQ2 z^->zH$M-$$GJ4$>Z~Ez{kT(4KDw|mT@Q=U7U@+p!uY3+`g_BP_m$)o=)(u}^A<0PI z(7$MdvCgN9qkUUw0xBL=i(BQsL-iC96-Vw9ZhPPel*TV~^Lt{1MzH@&P zXF>0bN!#Eqo=#qlpbUBJCtd>0Hu|%_g!GzRase=zkiBdbGdzqr#j^wNlr5OadV7}x z|E&RZ;JLp7Ne|3vz8L1~CqP-ktwX3raQEd9j^LSNPce3czJMTtV(j?S=iN>^7x2cv zI|CC6CKM)p$Dcg+4jQK7)!pk!_EtnM_Xm8#75m61@i__F001BWNklKy;^Ec@+*KN_8YcV(1 zBCgSa(!?=0*Fu0e_7vKcbA$mbE_9iT6P6_+ahA02({D-c&=QssSlJn(pQ0!zOW*lr zM40Qfu&%;6i*qG&9o>=%RE7R1L=YC|y39AKZS_+KlekH4T5OJXigXdPK-6oaVFIl- zSdUL%V zPURpajb=&Qu=J~X0p=MJ4rBSRG?WknPklF)z}sumi%6suE1;n;*q8GXQE7 zDI?DO+{YqmWum0*kqN-ec(KG1vTD;}w zE+Wgv{P}w$B4fGo-8a+gRvUufgO!jAU-bkeSmd>ze-9#X@ntXBp#N3#ccN*FKfUbj z++U1%Y*czrKot#R?!V-v=n3cWzh0DJ0#JJ@+0b&|Kklaz`0`b!k+uyNod?zi+;gk{ z-rTvLDugdzeHv)YU1$9SsB+w8k0EV`TzYAO2wZg?6n#f&mE>rOO{R!M{{R#rbbk=y z4*cL{(CNanehk7Gt{OsC!HMeWU{>)^Ir0`L2k_~2oWVhtS-ZOzYhJeKgYSia_y6Dq!~o~`3wBOd-a^}%KVGx%R0}1 z8Rg?luRx`axF*g_gM^~6h_L-&r3Xr! z!r?e#B$mTTg>$=m0H8!s?De-Iq^4^UfrV~Kr)M`9fPfmezt)e)Hv0X{=pv42^hF?T zc{e2p{r1_&ccVn1Au!YLmBKlwAe;CdZQMcx;<+|aOPF$?-!6@?HL@lbY zT*06eG;jELgz=Nd*m(}RN#Dl`(q8F@)~e4=OqQ$JG1f~Y1}9Rp{y56gk{6Xn`-vl; zs8Ao&bB_9c`jvfNIhs*eQ+a#(tRtFoo;6gtqYCuywuyY@Ap8 z-XC7W!hCOw{@>H5uvk_6*X5t%plz~G-;81qQKTx^d*uhn)4hD@slQI#OSt$vP&IsB zP9qyy?*H6=;t1?Tk0EIUyzqrE8N-Kfg)E2r{#hXmaHpP1n!@*8CJ-aPVt_n`Pdy*1CY*Hwq%FAc#kAW^Zurr8BsN?+2|1iw#)JK6R;~H!s(zGo zj)Qao=6?#R75MbKAs)l`?Oto(oR9>TpE_|L*(l`C4nB$TFydX$JD;&D`GW&rBMBnD zc=4~%i~KTUPz-tc=l>JAEqLP|VKMM1KdGsB<0&_iX~=tCAY?8iA6iU0E&WrREh)=_ z%31;w5Z42Gc{qZ~5lC2<_bQsL6@r%Pu+Fj2j{Q3u_<&kNS80aCYzPDK?)6JN}dBx{`Zs*vXu<4Lu_qC2N7Ef27+^vI<_L>|UuVa%l7PqPro zw*oenRS9Nmlh0^UGRewyYtfx$svp>*e@aVQlm(TGHl>9W)fLo5l!GCHLp4Q2W}bkv zJ_}HkK46w4b&*SG{2F|Ea-pfC+kR5ca>ynMqcKc|*eJv8)NrKuZp7Sxc0to@?ie71uz_${IkoGD}q%;qeU}0%V7^$G~ z0urSxF7BZddjk*_DKfVQEi)!KCT#u#cZz$*Pw#wf4YyWn%C);hw#%#I0brN%Sa=H>afEC7TEND&Z!;xytcK#mU~ z@pxBTHduBFwAc+<~3l_c>4wDl^{h!;oXpt}S zABlP?7oQKVG90+|G>Qtoe4Qa}!1rAM5(IF@X-EmjpXH-d2X19n{pK9pcN-M_k`r$F zFsg^R_4_|SJBxAA`5Q9;1|RTyFW&8b<@2Gn2q&FHuMu&>vlf_-g=PRNPFX#$$~ddg zf%>Jw>_*^6!9YO`ob))zSKy079}D;)wjB(rpc9Y}D9izuL#&q9|MWikOK|pe7VXY) z?G0aJer}#lv{td%LAj~?36}fIJoUV%U{?D4>?w*P0@%sS7<##_0r)xpb zvJ%Qts03UHjYdcm3X8pzA|KO8V%nW1RZ;j_{{RlHj_9=#j_I{9B6Ul+kNz7i>wB=f z0Z^1cc3%=b8f2pfkga(Dek~3~;a}|0xbziUz$B{}jY~%35^%F^LCNw7igI{qfHBdG zyrBNtN2#}|z$%K2tP+|@G&_!S6{9ia*?6XVck%m)DYwzF`Y!I!4KCZMdna$7iDVKHTflHuZP%I~;QO1u%M z5}@hb{zem$6q3-hF-5|%Rr*$OrJ{w->Nd6v>RDnw00|*z`4~WvtyK|DMIdP#k}4pZ zM7UT;lgiJ~u41gvnC~II9^G!2cBjq8jsc;awz1CATIk^d$C6zkvmP^61R726CT%{= zD4e?ez6ZcL2NIA(0mtoWFsYQv`3gTHP+3PKiCE|~P?X7}Ac_J|Uka>d>gMeJzNk)@ zy1Q=nKfP=d1Mt!KFMatl#Bt2`J^hC%OXWZR|JQ9;0+gi!jxT-rGZaNZRns<0T^V@b z;LWVPm5Ot9RJYc#Ueq}b9lnF%B;d4Do=TnbCj;?!WKr^xA^cC$gSYRh)s)a_h4{NKho4^$tg=^L*&MpTxy2ijz);&~WfJpOO1w zt!mFHe!xHdg1Q*!X})j$nj0Y>S*maDM@A#>78qd-eRY3iE zbcI2zoVN-h3I|rvQW@N>J_u*oc1HI%1=#O^6fXNupab~g|KkA=Pn+I*h*QIJe)~jD z-xKneuS?N>#!vtE8yUNbCwv7o?r_zgoy?J?RO^ z$|~2Le?4<;A$qx^vLX5#-f&JYJqZJ^0kJcIq@>_-}OpJ61!lc>q2tpJf|Or7=QLloUll zQ4|=nab54+<^|{O>n)$>pX#VR2`%WhJXKO7F)Vbqr*58R2ZXiGv6WFUiyE)j@0>R( zJId53jK^SO%KiwK0LN8;Kc+e%o0wTFAced+;p1D3336h5>B6BV@EgJfHs;rS;i>s+pUp` zwt3%0@Wnw2!%47i|B#~#eb?;B0SJ3ACZ*GJ2uh|78wR8e!3DnBmcSE?I15o!yZ$># zV0J7<+5SXg|6}U~bY%hKs{p6=(cuUFQ4N09O6L%a-I|0{g_YHUBodNFn?|0XMFmBB zx&^ojwH2$YtHhxp3WT684l_;|t`1pUT|vu*MtRbRVv78O`%c~Tt6{E_arJv{q}{dK8i4vV7_J0d`06LoUrkw5@rIq+k@%v`s@r(OhUqWpgfBLsrjX92E-EEDd%!%WqZ0l!}#FW>#@ zk1Q+r{sqOyOZM;gsl`)Htz!uFcSloGG;PKL7zrj9j{7DwQ)c9%ff2@&lGpsqKM||p z^Kboc^ujiL`il%keJ(!l0%!(&NHH$Q^2CD;7r zF9X8G7heDq`217eLa#LkmtD%B8uE-6K9fQmZ~plUX*GnxI!fn|IHD{oR)!hFQAwO6 z%ym*aO(8F#+3?U{h>vOZmqrZ7etFtyCUhFUXsA$M_%-7}tQ{|-b)U4Z{c_dT!lXx= ztQmmBLgfoHQ1!Wd*1#5b5JV)VCa#34i9Qp z;6}A=FTl!5NPiI0UriYdQ|9NkKLzg@Y@@%7F`D9n6c?u0L~sdc-2|B!A3ICiK;SC` zjqx6VF;LaW;9IWV9^G2qIRE3S5`uDV;c6}5yeD9$Xgk{+Z)zB(1^lxE*T2i$|AcI1 zgseS)ure%!ExJh?k`6&pvUK<`WFZS(KiF5s-Xm07P4Tr*ThSlopd}047N9IG9fq;6 z5Vhzg9Z1>)DE)px6|SKP1wkFRbxKy0-21?Y{r9bqHe=2??HJP7V4cpYM~!i)gWvt_vR+e*5Uu5q>n;;M>>sLmzfo|*N*d|X<1j6dkJ^KTMC}?cSpLGXCGNSRJ^U;Z6 z|GoP#CZ2f$Tc>T=F!QT(>^k^W(6pp@(f?@g&BHCd>N?-g8s2xmd+#&WsmeeGLP7?@ z5R#B!NFp*y)E3l$B0ef0Xgf97SFo>r+o5lF-z#c6H9oWo7ZC&@5|nw+KnMwml^HT8 zm86oYBy~=mVGr-L*1CWE*1PvUV^#ECNI$rq=R8$spLf6OUF%(I{pRoY8x%zsQZI?% zDxkDx_rj^Pr!0pK?Zf+uhaSBZtu3dVD4M`UZ`_~>Ou&!#R}B~a)N@CYe|`@3AN*!K zoEkTIK{pqh1IFG(>AFElHi#~KRI#ujC4bnDTavmfaE87iDi=Qd zP_%`@=0hMLnu8CpvdV~KTLH5Q>H@C20$}wdhPhe%Gk4iM%Wl)7;*h_I%VN#L8+K9x?3)$zB9{;iy z_0rb?T@0Y?nWL3rVOBH&72HSzP{EBp56+LkV*-K2vL|o5 z2&|NSGNq{|5PN-)>c6t~bkc<9JYzSl)UtcmR4fRR?OWAVOgK|mqd4tpv$R_lqv7~n z9h6bj&f`J@JSy`P;_#bQFd4b{PFMe79Xl}N7 z(aTECylx6pW`tYgMpuE_w)ogNmqVw^3Ez7%Di!vc5a6Hy-*Al-ehX@B;(bF_ZF_lQ6I7DY z&cudn@(*^>1c0NI{E95=(9XIfNlGALBL$F8N_;xRn`N|a(ZG^B7w}|MD}5*f<#He0 zG6X9bg1#0soIDq;0PpctfPRS@3^3IYuX0>E#I?$8X}f$2d>cq|a2E0&1Pdlz?_8Li z3@MY_S(FupWdF4)NNTyy7Vn^?45>1x&?9)y;i#mgt&FslvbZ`x0Vj4^*wo_c^;+Cq zw?$nV_O13=Tph^wyk@zOD#2+3N^9E6P^##O4}oD>^XQ>9d?nhz;_3jSHFe?0vV^Hl zi=wQVn{BbyFM%9w6c4Tr2q;n`8p_;US8ySf=D6KmiI#>)p{~>j{KI=e68cvaK-z>Z zrXckcZ@LZDx3u2(JXD^<64HM`^O}%V6mPth(5<2LLX)+jIq&GCEnffHUuHP$^P!La zAw@CRRulNHH_FR9vgCKPS{+`0`M;yx?oyTogJQD@qP!+p$35TsA<RYdqaULOMa+OV1H&Bt z>c2oe3orU*Neez6J``jS>gQa_j%&*fNrPF{A?R>C1{3uP6*IR5{y<< zuHv!7LxR%mp6fEzNwHc{={wDvkZv2|4r2(F2?WOhQ)WJriiG(0rZO42l=u%whAPlAX1Al0?piT z4_}H_kk=yl%_<~o(24h6+q&P@l%`!9Iwm2Y*qzk0%=kPRIt_RZt@H&4GMPkG3YemWPi^wtqu0N9eL_kJY#v$m-I?r2hHw;EnhVyo*mk38o`pws2J%brO#Ww`i48SgcFAs-qJ z=u_~e;}QJ^bkXO;+pj?Rqof^%s0lcD^W88|@FzbDg@KdL7VrFtZv>rf5eih`3)ue! zDA(ZOFF~t>Uo4>$AgQ*T|BbZ(fBrKq{A$iWJ?~cfKIgm-zehBI*S!%1y#Dw9oQeeh zlYb^D%K-T*`u#scLd8pe8^8e=~?mtv>$DG!y#MM5eM~kDbfTV|^u#Nvay_tLBxm>{~dMGTrK;S{>@T#_N>aw=fO6 zUjSQHB(5Gwem#?+W;3!mOKa#y^WboJJc+gJnr@F$x7@vTTvYGcH@b$Qk&qS;2BjNm zi5XhDyGx}60TrYXK}i)*lokmkB}64=009*dkx~#?Gzv(mG;{7je|!J-^FHs{`+3hF z=X?&hX1K4r@9TTzjB7c}Y_rc%)YHbyFCtaFi%s>qz23~#QWi4pMo|AUtYX1u4gNOT)CqTXQjYD#3n?ZDlpGIN*t2wMzX9Ty6YesDi!F%z zZguqEsvVa(V$QuY;)>z7px~Zi>g&X z>QPx}rcmK{*@EDfYtsI($*9wL&Mp%BJAu7Lk;!^gYMg^x+*?Y=|0b%z@@==9rl{#~Na<&*21xf-G4r%D6txkcXGG?eIcHi)qxWoa@`KXF5?o|bs_sb!x8 z+b!+BM*Adj!H z9zkacZfNqZ&1I#r%c!IWZ4j?8zU}(pBsyTv-i6NUc^H3nWA4ItJJM}C#iWmRa`lX? zBNxxG$Z`p}1mYXPhaeREFJ%Aq8mrL-qH0~ zs8@fC_YzX=!3WcnmszGl?W$y=Wg)P!f$-*Yj-=)C(J;yrl}-cG>1yoPTNBOm{4YP* z%DtqYSn170oAR^$hjxbWew9Huyw63RHj_Vl+1~<1ReU;TL|T>RrG?&LW?qDTir`E> zf_wgpKnxPLKYkp}?eXWlC?TD_dZ+c-wq$I!86y53v%*GFKZOL}JhAR&&Per?tL6sL za*OJDo;*UCJoEO$c*6~G+UJ3aL{nSm53cZ#QJc5_%)I3>9e9RVsKU3$a+qIDGP+s`N0lQQ(jC?n>P9+M}#Q@5a`r#xDP$!&a; z+@UPSeX1tY>_XLB&rkZ`DCleo=xOUl?>01TD~&AsQ7f)mj!um($5c16Ty{%VJ{_^O zaCCxO{KmzdLD}Q7dq1e$B6g&DjZL1Acwuwq!^)YK2JnySCcbf6cHdC|0hR{-9Ouui zJdwbv5ecrswG|q>O{~MXCd$iQdqG0qzEQLGY9Ky4Voo6VYOxOv=I2t}o}|^V`tFb1d^6R@TCw^*l_z|ao@BLE+m~C5Uul3l-(rR( zy^M#gznUg>ifsBC>O<6c6D$()*LMNhoLNg9nrH0>ZG96Mr7!XHAkK+qevFo^j2nw^ z5O_uQG=stR`{r`3rpW794kmQ?7noaL;KSNy_R>(Si_+Ehkf+Dd&0exA0?9$sbsB=z zU!y!DOcX12`|9Zx*i(bP;D@Fsj!5nEI1Oo8y^)=!efp_m_xQNlC$=xHHOave53-~c z`@7N|2YnJQ;%n61o`r?cW|2$<=g#K++<+fYOI&Tah)v5YPqgp6#AuESy}r)rB%FOh zE#>-AL^;(RZ@Mr83)NDRs^&^>dhe5+*r-;+mWQ2Rz6E6P}O3Icu#fr)gfhuPwH@Wo%2X47RI#elC9dSAlR*evZLX zH60HZgktFDzZeju(gL0kFZDjQa5-`;FxFbHTmGe++i`8j3bgPkMO{AQ>NmvITGNd3 zj2_e@iOMS(+TO`Sw~2Yqm=v8D!P}CSXW(w6()5zvs^_K{LtX0fpNxJ>GItrBT-)0m z^)hMEQ1jpoWaYRR5Zfk;-j;&d{Xo>mhfohM&*pHgX?D*)8MF zpF9?C%Wy0E`u(rRQWU?lUPY$f9LXJuc4=+cgg)3(q4%TF&c4C!5m)2s$nh_tKSN4F zP@P{Gn{oTD3bK|Y-=&_!FP!AZ$1~*=rF5C^i?=hT$2pB=aeI{{-&>rdILy!Up0Ayv zH4eKdq4!uOqW6L+)7JR-KCJAtU}WZX4Sm*VZ%^eTyjpskdG!-T@Z4i6XU5Y4$MEfu zINKK4%ZXmbGWuhJ*K%=s%C6obyhjE~PJUtQIh|yPYsmQ_n|`+^Z0TuW_WqB^wn1e2 zSZRRlxc9U5Tw~TYDC){c&dF zoL7e4@B4Y#synnPTj`Muw38d|2)Edspjp|W{Nc9nJPS7}9{oPntu3U^bHgAUQCe!S z^ON$rsdJqcdvckwBuezhMCQV#MPY5Jp!GT;3@QIyRdXT$+|kVc`AhnyQ#jAmA^&Bo z%DEBms`)9F7Klme=%`JbWa!+B)$1%5_v?pOvjg8x-qxl$HF%-ltHFA);$quH{`D=l z)WCO=8%h@!E}rh+ke`3CSh?$eNwi5cd5FW{zTY|7DFMprJ5?VRIqv60Xx+^Fx^!et zx%x=Fa@`1q6h<#3Azz?O ztf)p`c{#{d$eG5Rc%F49M9BAk$jFdMfYOVY6W3Ns=y|tlbaIgmw-zK~7_t~D8z1jZg zvMUKfTb^?}?6T$^ZqhTC2BhpH#$sL{-+DEfu%9}VwVvsNyp(^EouSQ8Bm(idcZkhJ zQ6kDzprX`Uo1C&x<8$fB)h>Z?Y`dLl;mhTVdJNq;SHARUS8XwFYy{f>N?{0 z^OyrC@6xI@_yunkqy;yPYBm=#r($W3g!iD2q!z)9YM(TVy&SRC8f8NAljGtazw_)Z zujHgQ9J{wS-!GpX`t9ynE33dUyI=X`QxCBtJ^t1k4Berg+mu+3>#jj{OyO@ol>A~6 zI)4nCJe|i}KQUh5NjrHdl&O(&D`Z~F<|R)4tA8Cs7u928l`?5P!M$gC3s>@AK7WWP z>bw5Krjd<>s7TzzQc5lhBuR}>({FYuuse$LwL>iK#dOXGtQ}u+pSqjbnq??g?oLI{ zxX8i0Xo0T{a=FyC8#pe-$C6u(M(VWBTWhfr>E|*Az}@hDcP6ASv3=wC6+tQhf4uR= zAF>WygWE68RS9daTQPG!ac3xoUj>e857MEu7mn^5$dR>KP{ydlf(2EOdr{a^Jx_oI?o zLLLed+ju#)erGIByXmdBeZTg`qb!dcGCvmq{DiOO$t4<@`+bW$E*-rOmh5+Eu-7Uts$reu_WYN z5KF?+c~thg&y&ty77{`MtFC;aTT$y0Qj8WW)rkjD$9HJ^s93_BCF*`$y*n;Zh}J)2 z7jt_!=WeKZhL1ECQGH6ari!u1u$qYZ)zA56Ys~{B>2$i!D!R_^Oa#miyx5B^_>%wP zkwyTc8h5XRvZNMmxyGRQOe`!wJ8bTt&Q|p}r(MD50T0iR@h+r`Q&wF^3QfTHoBP>C zf+Jqp8^q#<$_$L{Z_Ttvowkr3B6db0ID?1k!kP}lVS6hoR5+vkA4UPAq75c@W7M6K zRE3jMCf}}M4IE=Q9nMvBuw9dkvwUD;jt?k*hsTZ>`rj>-CHazx3nMaP;THdKm8X44 zYE5iKRW?#FqOyaxH87t>^ zs@>c3%hrzkFn6p(DX~1~;+xGptp_Rh@3-tc-esi;`2KwNLb|TPwvAu0#gXlXiKaLQ z&-Xui$4+|Qv{_p5(Qv>kjW$Is5LrID>n~nQ$`lQa8ilpri-iAD})jVC_DFV4uU*cDf** z)Aj3zQ)Lwv%=c*5J{9nurd7hd^~wV|cw9ld@FQBZZq;zRAWN%Bo~>^e(m7|w=v6xV z%~qiU_Z!mLniv5-o+ML=dnee7dp@}}jqRA_+p&H4@YI;Eur6knQjNOe8J|Fh+Hk(G zbw%qyOm7~~hh=MwNx4qj`)3bumn-P|i|oLY|0(8M-^PT6Z{Jg}o z{XR-O z#1`~?qCKT>*4<6Kf;pD1nw0cb$N=N)20JxZNgtFPk`Ly}oLtV;6U6c!I;=Y4ELB zoXqg}8S>mRtdNMdZus#i5xv|y_OXhb(8)J>Z9h6*s|~+a{J9phDLGE3;D7vtXWVPO zNT(ZO5V7u}@UZ%jMbobwe)_A(%8-hO@05qXC+{)Nx9Jyeb>a8j-?E8e zHKl&6HgcX74V%3rA#mj0!Oye-Vn$>2mvRN8@hd{d0}tL9@%-o7)3NgrB9q2c7hX1@PsXpP_6CK_E_1auB6=eyYXz*X z?zvoLZWL+yQLgx5gJN&U!=Emg=d%sNc^-VS$$B2U99B#Axi$?Bt*MfikT(%~J}M*( zzj6~lP9f5{iJm0M^R=^oEU28GL00v(`0h*Qh1I(h3I$gO5iyA8T z9`P2LE0Mo)+Avonex?L5N-VnM3T!i2AG0mJ9;=RcR1;x&d+U?FMIl>7z7~&KjL*T5 z*W5D_<_WIxI}+x1p>D(Ps-Al}6n ziA%GTHszL5T7&gB&d7BLB;KauYU_w(sAe{$es-(-KBj!^lUh{0qncl4em$>_h-dem zM-QrNw5}DeAV0O7ICi?m^^60}*CAftJovN&cyh*Nxr}EbV%|;b9JaS#P>wMNH4G;5 zJ8GowSs0Qtwabt&kK~|U98Ko?aCD+`wK|4!!~-LD!Ui!0a$w{!_{FC)zl{4;rDeMj;r#x9gOw-oZ-+{98Du zh*;G~x>^K2#G{>hESwx+)#&H_+^_N3EJ9*-vNQf+58kZW)LJZTV*`4Au-`yQ(UnMi zYokpLO)K>LVE%%KY?-EFCeb*%-({)w^_6Q6tAba8?w!!t=B;mKGj@$X{+u?5s^y4# zMN;Cyy46J*mA$p305nV@WR%BmZZ9s6{;nvT_0s{P7+vN_*50MEjiSRirp?^j1>YhbEx+r~UHh&xK4(Ote);X67|6 zDP1k==9%~*vJ}%BdTfG*_C(35Q>49g)Hw@A^$tZR9ukd}tD9_}!=eJGem1CIv|fAf zbR!bqzO{)?j>Jl};2ZO8FNF;rcb2?ArFqenG~=9g=-NT(8wSr{%_gqtUluB_C^1aec>wHeBoPR)-{_cgTVAVk@7d*0f0UoIuhXiUa z=+UI}*M?^J`=nbWn+i%v_1phyX1UngOgov4J~436P*b4@Y2BG>1gTKoqjZT zpdZunm+K#01$Q6Ue8~FEeg63K0-5hAr)ga3qO($zOuyOBEP5}qQwy|h`!QL3{={Z~ zP&BLdZE>I2)Q;rRF##5<)n<=7UyrGF4nolbed7xZzTPLc z*AZ}8^Kbn&LNgNSNX}!E!SEy@Lq=7`k6!xTU5(P-&KpB-U06jrVW_%}GKctV?elXF zC^+646(Xd47nIsZCcTU-Ld}hNw5F99GfwI;4hdcSglM7sv3{rC}t7segJ3I zd3$o}BAw(DCNTo(d=!s$Bs!DnpUR2F(<$W`#(y_wDUv>ycZqEt3%{`To>ru(*&34h z%pz2*ME0ulu^QZ&)$&HPVZ19>+3d?fa;UW(dy?thJR#q@kJ&L_wbqelC8#X<&c@{N zs~xPzJGUn&Rvli`?47Pz%jyYWl7K99)!xoA8` zK8~wtkyX+0tb=$zD_4;X{&z}#+Z|=cXoOQjIxp6Z2FA{3Ctpbj$3Ln@zW#=hm1@`X zJ0O4aMS6tQ+&Zp4klf|IbH4qlt$TZ?g}r?vHUjT`l)F1^6oCwV!c9BA?Kor^=y>qJ zNNOx+Zhj&H(a6FmX4zZ7$jH0*^PI*yy4KYLnm?%d^uh`6fVdPqSw(72+2APdq`1k# zJriAp1`04h$$<$^)@O<`v$gEr zF!;+nz$hL)dBQ;YrsTW2BHikY&aHBq^VHloNL^%D&GafT<(<_dDbmELB>}u#*!7j? z`@a-J4qo)mO;Pnu3p?xp_Vr_)fOue5#rDe)%0^_3hWIrXUZQM5Nr6p;ez!J6#&`f=MrMEOrW zX0P}_nMWtmIF#GDfF36iX{~te<$HL%|R-7jwdq zKI}y;sd2`K7}!}d=0(u_ER~+JhH%o#<%`s>3ly2~Eu^fS+oUPSC$O|rd*DW88`|{; zu8Lf?VwpL*=lPA(WfHrUvo}R5XZ7pNF89=Zmg(o!JF;;+aftr-*J0ECf&pSyi(7$) z!mZRn?37jMrbl*=YUK7;`$)pR>p7kMR2A~MTg+y@$-6CuPQrrLDntK@G#S_Pysy)} zn5yAxt}P<<&?AYxinM+;1`lvnw<6g^-XS-W z{chJ!-r1PNY%NS^Jl=Ox8{Llybg{-AG(v6G54k+-N+{%wH#-&Xd%T-0kqc`@?%r;P zqf382&)FTcWyYFP&MQweZHU?0Xc<2!XO&pyrFAT{wy~St3(W2Pxb8w;rth+K{JpCc znb^MHrZH*n{KPMT_?=afA%Rt5tI9?14P@!XfR`liHJ2XC%i{Nf9ojyP($>5X-IAJG zF(|EilirlLwmb2m!t_?XslB2qNr)V)D$)8#zeV(Sl*@1sOBvI(hmXpUW%~(58QGRz zZ@k|y7?0%p>Y`pPwesn+Zjh%#Z+LFMsfV6up#&t}lB?I528|rscj;L70w7)IefM5J z`EB^Mfb{F_Ln#kp?<4cz%#O0^Hypjz5lQ>!_EbiA_Hf;^(XR9w@L=u~=b0wGC0_ASj5gXP|E><&(ML zG>c&r$U;V z?}@fe+p^m9wtTX077`ujxYJLJ#T`Ae{l>U2!-GN>JPq!NkibQ0I(}|qW)>D3N2c;B zB7y33-bZFM{?>VJ$Ajav7^2plExsEYu@Tja$jucz9WsMGRqfxRfb~9R=lih!xnoK@u zK8K@LakiqwsiXWQndJ!az3TbmO_R$hvrnfTuN(0EnpmU_UYOiBANum(`61426_jSHoB5XJ&!zSf;q#`peIlGWBBxRb)o)|ZzLL%#Yt9D{|ogd@p(iFV4bnC{9Be<3c&3*76%`!$(` z>0{G^#HN3ug|hIm{RIo&Dj}mBo{@1yI`jaUlfmT>lh9; zfu21TN>2+7JJRg}cMg0oYAy4cm!WIdNF^L>w0ypKevXL| zQFLsQl03*WyD2A()Ar5Ron0&SbJXMJx@xI$FBG0{pU#i@8ag|Xg*R@IJubJ?gFksN zPQvkJUGGfCbjwvAdUiZf=KCH)Wk zYtA!OYZd6@ez`uM+X^Lxi6b&x>l=?Cf)|;Jax9zg!IE z>0T8a81jS~l}eAOQN3j{xFKl%gtE>7qV1?*rg-AsS3muTCEUP2AuQjR=IotJaae=C zlC<09h)UUYuPf?$J~90iFF7DetV`d{sc#4S^rYO|jah_-wv__nxHMd*H?=a(=1ubS|4 zD8^uUZCB}QCvMn0o+`dz__px;I9Vn3tBP35s!jIQw-=P+CcB;5GUUcz6|gr3l?bJT z&$3l0!?tF@z7#*V=7ffhalBAlvzzEtfpA5*4r6eSUfLY}@qV{UFWxwg7JEA9Gp^+3 z@Omp$hHm@5d%|{b)Kafovwi;QCrgo*UzWvupQG2T(^i}2BUog|+6@{UT8>u6BY? z%Uo}^{7_o|yua|UYpo%SHE9m#fjyEV%m3&z`K8w-$5NYiawJ#-+Row0v*-Q3A4q=u zEEqA9!>?wnwD;7Pl+IoD$%YWKaPU*ZPh;^_kwvb>F%1JU>M(6uY&$N}JdVTPw(~$5 zox)1&EHF=qpf|wKpw_6N!?(h9N^)Pf5s6gRDZI|_xxhm0p$ht`e5UuL|?8oJYaje zmhprndTUE)gV^tlOq8HJa{sKkxfDrVsm|#Si-O>T z1hr2yK~|J!OU#NJzy1mly-m?#Uz6?~XRh;Q?>wJ4u{BkKw7&cMj?IZOMj zJX=S^k`LTCANF=Yl!YcVtyqC@?$&iu0Z}V zx;kdp4P{#76YgXx1hxDyl1ml&qW3ZHqK94p!be3-_!dww%t-n(G-&ND8Nxt`S|m-RJT$C zZWl~Ae|zqfTtr2?D{UpmkJl6flIxSv*FQ7o?T>cL2eE#?Dt*+zxiJleNtkBp#Ueu) z%MEqg^G(Bc__*gdnj^H1p+p#mDYk?4Sdg5q-F zI!pKa{#Gv`t((&{yqiHSogvzow0pcB4l#?mKb^@rGIXz{pA;7p?OPEI>>t1OWi45p zj_63D?Vc26OCS1Xv#`S@n1TgiT!B4uc*iLx~dL$+5BS&Y-1-kQ6hR7Smbv(_FmP*s)*l?9E;`+s4 z2ZRa3DmzEW!<*&tD#B|s;QN*?7s(Z(YwoAsjJVuWFR)nMObQ;b__gx%`&xmyp$j58 zS?3XPoVrDs--yrf+A_v`ItZ`Ie4uAinB4%zpLZ$IjMGiusq72XoCi#qV9n5Rro>$;|uUC$;EmgRUr z9P;#t?KGZcii6`g#P-;2-uu>j`G{|C!)LtXXb)hWQqHEY&%=2}If#^x%(L|J*TH&K zO*sn7nawYYt=Jp~(DCZWL|WD^+YkG8({QMvbm$#_JiKRSNn#&Lq7bJYf-D$hGRRlG zTrqijweT5uPyn^Pj)tmv=&jhT-Oa*oPX4gzlMA}C)MH|kRuLIN&w7gHDdxU(RYo;c z2~eKr>KL^mFCQ*R;+9$k&t4*8Q9u*5t>I`DwOO{xhveZ1U!L8;lMw2h;)0qrc`W12 zn||D^?oUs>e}`kp*mL+%x^PcB=ttOlQwW-~AuaKD-2iM?y- z%3DjTvrVEE23_)hWT~59F}S5G(9YoYRI6~YbieGT#ISpRxq2cMVs7s2n?=sl<1LBG zfxSEiFEjg&(l1cw!fWlDCXGZD)V2LNCH8H-mqpuRsG{cY#J?C6a2erb!t`j3I@){` zNaVAFh9qL8JCiMX7*jIZ0-m3$*;a%V>y6`AiHOIEq zSx+~!37>drs|gx}eF5mD^^SuFjMb z+w1=GyAARWH__t>*BwM-V(JG?A#r=o`jt#Hdu#Aj?}Yl?w&Vc*4yUI%GkIA$Hkp3D zqT5U#3`m*+4V1{j4UPZ7aj0Pe0)9q zSJ>NpRl$^sCk2%S#l@xeK?@{LM$FPV4M6O{({5!lOvF7@bJwujwcN+2P^RLQsY!}- z>`1ibgO|U`sX5-SJ2so z=IofPn%6I%wdffbG~~fMtF2$jrnBI@j_wOht-qTn9zx<_aiM@BTUw=nKOA{(k8OJJ zG2D8j2rg*Eu#kjS2D98Rliv(sG44NU5%G}%TS4uU}q{ZBooVuLW-R zXcom#m`@{6Sen5vVDN!1y&$8QnB!S#?6!_~-5_h(Q_>`ASf+l{TJ(qCxYZ|(0){iA zlnxYe&g8kLrw~5EG}$MDJKh-C!7^1ZZ*4}d*8YeS{;@uI)ZK<*gz8M&2W-eJmBQMV zgNUeKNBhBm_o6hE)5@(;`<})-J>IfAEhOG6X(ZXkZ*a%y9#!|cYNV+fcF}?n0DQig8UuW?>>i)av&22Y1&O3J0JVmcgLC!t*xU7v$n@_q?K@ zk9w$}G>vWVwDD&&5X{W-b5V2NREs;6Flg~+RGfklF?6@n{}UZLl?*CJf6%%US=sUZ zdeYZz=J@qi=Hn+nM%t=AP&GD>S00Fdw0!;rg;Qsz?Dhfj2U$WZ^PR~4Ij(SReR{Xp z`Ci37C~R6{;LgaX#J2UxZK9ilj~=)3ksiMnJxE%{$fjNG9Mj2aw5(*~Dq))}bd;Cf zpS|QV@!G8$*9t0??_uW}Z5FAwMtdWYYsx!sT06pT(*^>z%fu(wxt>S86x`l-!cnqr zL-b_c6xo~oAHK4WA57%EkBOK2(wKT5JadL+;=~)KSDM9imws?LSJX7^1@@l3PwWuW z`-ER~TkaW1kz9%t{y8Y;9rkgmZ+?$e#rGkx-4{&a4Elg!^Q;O`)o7;he3jf@2b#P0Ik(ZZv=1(Gp485E-YE?55xD%&K>Zd?$*-#$w zrPw0(@r5>Y_|JIxrp#37Xro%)#wz$;iO%g<;r8dx3T)n{nJM4dqdI0b=00jb{>lt} zZF7%q(6xuf=_(ncLeKG%0DIxoCm_yyc#wly$cIh#wync7<=KYgEn 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 literal 0 HcmV?d00001 diff --git a/assets/items/speedup.png b/assets/items/speedup.png new file mode 100644 index 0000000000000000000000000000000000000000..81157d2f904192b6eb799e4b7c71a67fb3c6b08f GIT binary patch literal 1148 zcmV-?1cUpDP)>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf0008BNklf9-aItAXX4pJS1C^|$zbSR^1mxw&{A4CvIbSn@l!EOoGsU)Evw%V$_x4N^_ zj<(~BAh_N1G!B$^@SgT;O0Doa?FmU=S z8p88kB5R8b=h5lZ3lBC6pad2p!#dL5{$R!obi99-DJGxCeqg_vd^R1wNbZXJ3)4*I z#zuxYI(MQg1=xwK@LW?_4dY1+n(g)ila3xZVr&Fnub)KV9|1H&5M6h5f<1(nrd3Mw zOdluul8#}^8n(-p=Y0^m2qTZ^dX<>h>A$W=I))YCzov>P3m`<9t| z(;nMP$Y-esrc#=T1_6zwW7xWeQ4foiT-@WLjvs+NGn##fK#iBvv~&zBz_ip6{eD5i z9j6nyI@j3ON?Z+YLOVOcedzxV#LO<#{C*~y`FMRKABjY6X=yT@tJ5l_|C^~w&o3Rr zmh15HTo+UD56*6x?ERzm{9CQ_(lM+6Gv%Rx#$`2(-^o}A+(CHwJa-$RN19yOftvnY z83F_B`nS4gsFW5kOPQ7|9mAIEFhQEdXFsWPbau3d0w0AvDg!Mx{l{;hM^_o%rDIqD zX4(M+G&c5fmo*d~LYg-RK_56Zi8M;7!=5la-}SZ+fbhf~F2OZ#|JPUBKiKl`gXw#U zN@)SJlxfM*F>KWEk`}OL?TadO(+1QuEv)IMh^4chyq~7F3i(GGHa>W)X-mk0#+Cak zO~YvKex?2Et1JDal?9DIt&D*2+p@H999G!BKEE6q#*ewQ;H&!rN8lUBgNFU>_i>v5 O0000>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf00085Nkl=FG?nQ=b%$mVkXK`{vp{QMzaH zPirjPU0MRBO$}b{95svqSu{Hk1txt%u*J+2Jl;IHfIr0171rSKmf8<~sFkK=O7ohk zv~df^Ftvthd(g=){5=LwrI95%PATqn`mgZ_$FKza*Hq!9UEMUCYe98**1ZmgC!ppN zHR@5B(lzSHhIJzx!*$azYaI^GANZ0b!Z9oX`;tcuP7AWmJbdm+zGP$BXuP)kFI{Uev#3O8+-geqUcWhNu_Y9fRyr(QFe&HCVuEPq_ES~$xouRp-ebm>t?qgD3{bz3A^@0vm3&*eoOcFis z=T*ESzPtjpsO^!SNq{Xkhcrs4!{IcX-;MT;0)LNBm%jSHzS`FP8w>s|>!o>Tjy8U& zVcMSJ)y`JKCFOTFZ|&Vs(Pwl4T=T`T`s!rj6CuK*U}re!A3qG4}&+4!x6VAxE<50oRULsYlV3IG5A07*qo IM6N<$g0yocz5oCK literal 0 HcmV?d00001 diff --git a/assets/items/wallpass.png b/assets/items/wallpass.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecd6181482fc0538ede025aecd623714ef292af GIT binary patch literal 1241 zcmV;~1Sb25P)>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf0009JNkl5X1%lfL9rjoabh} z-Mja#J2QK?i@P_o-Q2!;`@Z+yx9`o|EMxlWZVwo7!5bb~taqZ@I{U%3tvtr4{x7pn z$n&;Kx9+&VkFoJ@%+W`MIWVo1~`+o^C-sa#Z$iWT*D!e0iH3xcf?UN_n`Qm{A6>D=&wz{jD0$;e{GSsXI_^W z>$$OIuBcpha+veF>rTL&Y*!Aj^h*ml`!=5^ewIw(kY#Yyo=EY;7&SD0(FKc;zCj z0m~&udZj!Lg;K? zdO~wJz3h~;T)Gb9`W4lSsxbD#IN#SB@6z6QYu+MLHds{-AxPcnxtHWr8$gs z8G~vu$}uycQCBX)8gN20F*36PIgGt2?i(Yg2hb!@uN)bKaEf$Fhx1qZq?L=X$KivW z`!f<#jepW{Jt^X}DAu)Ikp%6Xm*(jSg0Q`_yZ$Zj%sT5}8<%5%auL>mMTwX8`_jEM z0!2>e8UNG{a#G~Du$&d?bMNbvmi1Ix<&=wXAct$0E5sR@T){iLC>7m9zEsp4MSG20 z;XwnGi?9YPm98lklCHxdPWw0sy>Qe%LVINO>y(!DR9fYNBOI;>B?~{t_9ln_dFPs( z!xY9qL3AFP`v>(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, "assets/items/items.png")); + .addComponent>(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, map.at(bonusType) + ".png")); } void HealthSystem::onFixedUpdate(WAL::Entity &entity) From 78f2be8cb1d6d859b21cda1bef3aa6c5e585e4c9 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Mon, 7 Jun 2021 09:31:55 +0200 Subject: [PATCH 07/43] obj rotation & healthsystem fix bonus --- assets/items/bombup.obj | 84 +++++++-------- assets/items/bombup.png | Bin 1228 -> 0 bytes assets/items/fireup.mtl | 12 +-- assets/items/fireup.obj | 138 ++++++++++++------------- assets/items/fireup.png | Bin 1201 -> 0 bytes assets/items/items.png-autosave.kra | Bin 149925 -> 0 bytes assets/items/speedup.obj | 86 +++++++-------- assets/items/speedup.png | Bin 1148 -> 0 bytes assets/items/wallpass.obj | 86 +++++++-------- assets/items/wallpass.png | Bin 1241 -> 0 bytes sources/System/Health/HealthSystem.cpp | 2 +- 11 files changed, 199 insertions(+), 209 deletions(-) delete mode 100644 assets/items/bombup.png delete mode 100644 assets/items/fireup.png delete mode 100644 assets/items/items.png-autosave.kra delete mode 100644 assets/items/speedup.png delete mode 100644 assets/items/wallpass.png diff --git a/assets/items/bombup.obj b/assets/items/bombup.obj index ab9d47d4..cf171182 100644 --- a/assets/items/bombup.obj +++ b/assets/items/bombup.obj @@ -1,31 +1,31 @@ -# Blender v2.92.0 OBJ File: '' +# Blender v2.93.0 OBJ File: '' # www.blender.org mtllib bombup.mtl o map_ob000_item_02_bombup -v 0.400000 -0.335876 0.229810 -v -0.400000 0.229810 -0.335876 -v 0.400000 0.229810 -0.335876 -v -0.400000 -0.335876 0.229810 -v 0.400000 0.229810 -0.335876 -v -0.400000 0.335876 -0.229810 -v 0.400000 0.335876 -0.229810 -v -0.400000 0.229810 -0.335876 -v 0.400000 0.335876 -0.229810 -v -0.400000 -0.229810 0.335876 -v 0.400000 -0.229810 0.335876 -v -0.400000 0.335876 -0.229810 -v 0.400000 -0.229810 0.335876 -v -0.400000 -0.335876 0.229810 -v 0.400000 -0.335876 0.229810 -v -0.400000 -0.229810 0.335876 -v -0.400000 -0.229810 0.335876 -v -0.400000 0.229810 -0.335876 -v -0.400000 -0.335876 0.229810 -v -0.400000 0.335876 -0.229810 -v 0.400000 0.335876 -0.229810 -v 0.400000 -0.335876 0.229810 -v 0.400000 0.229810 -0.335876 -v 0.400000 -0.229810 0.335876 +v 0.400000 0.398345 -0.083348 +v 0.400000 -0.401481 -0.066619 +v -0.400000 0.398345 -0.083348 +v -0.400000 -0.401481 -0.066619 +v 0.400000 0.401481 0.066619 +v 0.400000 0.398345 -0.083348 +v -0.400000 0.401481 0.066619 +v -0.400000 0.398345 -0.083348 +v 0.400000 -0.398345 0.083348 +v 0.400000 0.401481 0.066619 +v -0.400000 -0.398345 0.083348 +v -0.400000 0.401481 0.066619 +v 0.400000 -0.401481 -0.066619 +v 0.400000 -0.398345 0.083348 +v -0.400000 -0.401481 -0.066619 +v -0.400000 -0.398345 0.083348 +v -0.400000 -0.401481 -0.066619 +v -0.400000 -0.398345 0.083348 +v -0.400000 0.398345 -0.083348 +v -0.400000 0.401481 0.066619 +v 0.400000 0.398345 -0.083348 +v 0.400000 0.401481 0.066619 +v 0.400000 -0.401481 -0.066619 +v 0.400000 -0.398345 0.083348 vt 0.001000 0.498000 vt 0.001000 0.252000 vt 0.124000 0.498000 @@ -50,23 +50,23 @@ vt 0.648280 0.996259 vt 0.632244 0.996259 vt 0.648280 0.754140 vt 0.632244 0.754140 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 0.7071 0.7071 -vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.0209 -0.9998 +vn 0.0000 0.9998 -0.0209 +vn 0.0000 0.0209 0.9998 +vn 0.0000 -0.9998 0.0209 vn -1.0000 0.0000 0.0000 vn 1.0000 0.0000 0.0000 usemtl mat_map_ob000_item_007 -s off -f 3/1/1 1/2/1 2/3/1 -f 2/3/1 1/2/1 4/4/1 -f 7/5/2 5/6/2 6/7/2 -f 6/7/2 5/6/2 8/8/2 -f 11/9/3 9/10/3 10/11/3 -f 10/11/3 9/10/3 12/12/3 -f 15/13/4 13/14/4 14/15/4 -f 14/15/4 13/14/4 16/16/4 -f 19/17/5 17/18/5 18/19/5 -f 18/19/5 17/18/5 20/20/5 -f 23/21/6 21/22/6 22/23/6 -f 22/23/6 21/22/6 24/24/6 +s 1 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 2/2/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 +f 7/7/2 6/6/2 8/8/2 +f 9/9/3 10/10/3 11/11/3 +f 11/11/3 10/10/3 12/12/3 +f 13/13/4 14/14/4 15/15/4 +f 15/15/4 14/14/4 16/16/4 +f 17/17/5 18/18/5 19/19/5 +f 19/19/5 18/18/5 20/20/5 +f 21/21/6 22/22/6 23/23/6 +f 23/23/6 22/22/6 24/24/6 diff --git a/assets/items/bombup.png b/assets/items/bombup.png deleted file mode 100644 index 687a064f4ecb55407267825dd4cb33c54238350c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 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%0DIxoCm_yyc#wly$cIh#wync7<=KYgEn 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 diff --git a/assets/items/speedup.obj b/assets/items/speedup.obj index 9b8292cc..c1db8bdd 100644 --- a/assets/items/speedup.obj +++ b/assets/items/speedup.obj @@ -1,31 +1,31 @@ -# Blender v2.92.0 OBJ File: '' +# Blender v2.93.0 OBJ File: '' # www.blender.org mtllib speedup.mtl o map_ob000_item_03_speedup -v 0.400000 -0.335876 0.229810 -v -0.400000 0.229810 -0.335876 -v 0.400000 0.229810 -0.335876 -v -0.400000 -0.335876 0.229810 -v 0.400000 0.229810 -0.335876 -v -0.400000 0.335876 -0.229810 -v 0.400000 0.335876 -0.229810 -v -0.400000 0.229810 -0.335876 -v 0.400000 0.335876 -0.229810 -v -0.400000 -0.229810 0.335876 -v 0.400000 -0.229810 0.335876 -v -0.400000 0.335876 -0.229810 -v 0.400000 -0.229810 0.335876 -v -0.400000 -0.335876 0.229810 -v 0.400000 -0.335876 0.229810 -v -0.400000 -0.229810 0.335876 -v -0.400000 -0.229810 0.335876 -v -0.400000 0.229810 -0.335876 -v -0.400000 -0.335876 0.229810 -v -0.400000 0.335876 -0.229810 -v 0.400000 0.335876 -0.229810 -v 0.400000 -0.335876 0.229810 -v 0.400000 0.229810 -0.335876 -v 0.400000 -0.229810 0.335876 +v 0.400000 0.397750 -0.086142 +v 0.400000 -0.401939 -0.063800 +v -0.400000 0.397750 -0.086142 +v -0.400000 -0.401939 -0.063800 +v 0.400000 0.401939 0.063800 +v 0.400000 0.397750 -0.086142 +v -0.400000 0.401939 0.063800 +v -0.400000 0.397750 -0.086142 +v 0.400000 -0.397750 0.086142 +v 0.400000 0.401939 0.063800 +v -0.400000 -0.397750 0.086142 +v -0.400000 0.401939 0.063800 +v 0.400000 -0.401939 -0.063800 +v 0.400000 -0.397750 0.086142 +v -0.400000 -0.401939 -0.063800 +v -0.400000 -0.397750 0.086142 +v -0.400000 -0.401939 -0.063800 +v -0.400000 -0.397750 0.086142 +v -0.400000 0.397750 -0.086142 +v -0.400000 0.401939 0.063800 +v 0.400000 0.397750 -0.086142 +v 0.400000 0.401939 0.063800 +v 0.400000 -0.401939 -0.063800 +v 0.400000 -0.397750 0.086142 vt 0.001000 0.748000 vt 0.001000 0.502000 vt 0.124000 0.748000 @@ -50,23 +50,23 @@ vt 0.648280 0.996259 vt 0.632244 0.996259 vt 0.648280 0.754140 vt 0.632244 0.754140 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 0.7071 0.7071 -vn 0.0000 -0.7071 0.7071 -vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0279 -0.9996 +vn 0.0000 0.9996 -0.0279 +vn 0.0000 0.0279 0.9996 +vn 0.0000 -0.9996 0.0279 +vn -1.0000 -0.0000 0.0000 vn 1.0000 0.0000 0.0000 usemtl mat_map_ob000_item_007.002 -s off -f 3/1/1 1/2/1 2/3/1 -f 2/3/1 1/2/1 4/4/1 -f 7/5/2 5/6/2 6/7/2 -f 6/7/2 5/6/2 8/8/2 -f 11/9/3 9/10/3 10/11/3 -f 10/11/3 9/10/3 12/12/3 -f 15/13/4 13/14/4 14/15/4 -f 14/15/4 13/14/4 16/16/4 -f 19/17/5 17/18/5 18/19/5 -f 18/19/5 17/18/5 20/20/5 -f 23/21/6 21/22/6 22/23/6 -f 22/23/6 21/22/6 24/24/6 +s 1 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 2/2/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 +f 7/7/2 6/6/2 8/8/2 +f 9/9/3 10/10/3 11/11/3 +f 11/11/3 10/10/3 12/12/3 +f 13/13/4 14/14/4 15/15/4 +f 15/15/4 14/14/4 16/16/4 +f 17/17/5 18/18/5 19/19/5 +f 19/19/5 18/18/5 20/20/5 +f 21/21/6 22/22/6 23/23/6 +f 23/23/6 22/22/6 24/24/6 diff --git a/assets/items/speedup.png b/assets/items/speedup.png deleted file mode 100644 index 81157d2f904192b6eb799e4b7c71a67fb3c6b08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148 zcmV-?1cUpDP)>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf0008BNklf9-aItAXX4pJS1C^|$zbSR^1mxw&{A4CvIbSn@l!EOoGsU)Evw%V$_x4N^_ zj<(~BAh_N1G!B$^@SgT;O0Doa?FmU=S z8p88kB5R8b=h5lZ3lBC6pad2p!#dL5{$R!obi99-DJGxCeqg_vd^R1wNbZXJ3)4*I z#zuxYI(MQg1=xwK@LW?_4dY1+n(g)ila3xZVr&Fnub)KV9|1H&5M6h5f<1(nrd3Mw zOdluul8#}^8n(-p=Y0^m2qTZ^dX<>h>A$W=I))YCzov>P3m`<9t| z(;nMP$Y-esrc#=T1_6zwW7xWeQ4foiT-@WLjvs+NGn##fK#iBvv~&zBz_ip6{eD5i z9j6nyI@j3ON?Z+YLOVOcedzxV#LO<#{C*~y`FMRKABjY6X=yT@tJ5l_|C^~w&o3Rr zmh15HTo+UD56*6x?ERzm{9CQ_(lM+6Gv%Rx#$`2(-^o}A+(CHwJa-$RN19yOftvnY z83F_B`nS4gsFW5kOPQ7|9mAIEFhQEdXFsWPbau3d0w0AvDg!Mx{l{;hM^_o%rDIqD zX4(M+G&c5fmo*d~LYg-RK_56Zi8M;7!=5la-}SZ+fbhf~F2OZ#|JPUBKiKl`gXw#U zN@)SJlxfM*F>KWEk`}OL?TadO(+1QuEv)IMh^4chyq~7F3i(GGHa>W)X-mk0#+Cak zO~YvKex?2Et1JDal?9DIt&D*2+p@H999G!BKEE6q#*ewQ;H&!rN8lUBgNFU>_i>v5 O0000>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf0009JNkl5X1%lfL9rjoabh} z-Mja#J2QK?i@P_o-Q2!;`@Z+yx9`o|EMxlWZVwo7!5bb~taqZ@I{U%3tvtr4{x7pn z$n&;Kx9+&VkFoJ@%+W`MIWVo1~`+o^C-sa#Z$iWT*D!e0iH3xcf?UN_n`Qm{A6>D=&wz{jD0$;e{GSsXI_^W z>$$OIuBcpha+veF>rTL&Y*!Aj^h*ml`!=5^ewIw(kY#Yyo=EY;7&SD0(FKc;zCj z0m~&udZj!Lg;K? zdO~wJz3h~;T)Gb9`W4lSsxbD#IN#SB@6z6QYu+MLHds{-AxPcnxtHWr8$gs z8G~vu$}uycQCBX)8gN20F*36PIgGt2?i(Yg2hb!@uN)bKaEf$Fhx1qZq?L=X$KivW z`!f<#jepW{Jt^X}DAu)Ikp%6Xm*(jSg0Q`_yZ$Zj%sT5}8<%5%auL>mMTwX8`_jEM z0!2>e8UNG{a#G~Du$&d?bMNbvmi1Ix<&=wXAct$0E5sR@T){iLC>7m9zEsp4MSG20 z;XwnGi?9YPm98lklCHxdPWw0sy>Qe%LVINO>y(!DR9fYNBOI;>B?~{t_9ln_dFPs( z!xY9qL3AFP`v>(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, map.at(bonusType) + ".png")); + .addComponent>(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, "assets/items/items.png")); } void HealthSystem::onFixedUpdate(WAL::Entity &entity) From 6de8505cfda10dd14d88b018f3b0ef2a914f6d67 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Mon, 7 Jun 2021 10:21:51 +0200 Subject: [PATCH 08/43] levitatecomponent on bonus + system + fix something in model (raylib) --- CMakeLists.txt | 4 ++ lib/Ray/sources/Model/Model.cpp | 4 +- lib/Ray/sources/Model/Model.hpp | 2 +- .../Component/Levitate/LevitateComponent.cpp | 24 ++++++++++++ .../Component/Levitate/LevitateComponent.hpp | 38 +++++++++++++++++++ sources/System/Health/HealthSystem.cpp | 5 ++- sources/System/Levitate/LevitateSystem.cpp | 32 ++++++++++++++++ sources/System/Levitate/LevitateSystem.hpp | 29 ++++++++++++++ 8 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 sources/Component/Levitate/LevitateComponent.cpp create mode 100644 sources/Component/Levitate/LevitateComponent.hpp create mode 100644 sources/System/Levitate/LevitateSystem.cpp create mode 100644 sources/System/Levitate/LevitateSystem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b75620d..07b2e9ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,10 @@ set(SOURCES sources/Component/Collision/CollisionComponent.hpp sources/System/Collision/CollisionSystem.hpp sources/System/Collision/CollisionSystem.cpp + sources/System/Levitate/LevitateSystem.hpp + sources/System/Levitate/LevitateSystem.cpp + sources/Component/Levitate/LevitateComponent.cpp + sources/Component/Levitate/LevitateComponent.cpp ) add_executable(bomberman diff --git a/lib/Ray/sources/Model/Model.cpp b/lib/Ray/sources/Model/Model.cpp index aab5fdc6..740514a8 100644 --- a/lib/Ray/sources/Model/Model.cpp +++ b/lib/Ray/sources/Model/Model.cpp @@ -80,9 +80,9 @@ namespace RAY::Drawables::Drawables3D { return this->_rotationAngle; } - Model &Model::setRotationAxis(const RAY::Vector3 &scale) + Model &Model::setRotationAxis(const RAY::Vector3 &rotationAxis) { - this->_scale = scale; + this->_rotationAxis = rotationAxis; return *this; } diff --git a/lib/Ray/sources/Model/Model.hpp b/lib/Ray/sources/Model/Model.hpp index 7a7e3fdf..813ef26c 100644 --- a/lib/Ray/sources/Model/Model.hpp +++ b/lib/Ray/sources/Model/Model.hpp @@ -66,7 +66,7 @@ namespace RAY::Drawables::Drawables3D { float getRotationAngle(void); //! @brief Set Rotation Axis - Model &setRotationAxis(const RAY::Vector3 &scale); + Model &setRotationAxis(const RAY::Vector3 &rotationAxis); //! @return rotation axis const RAY::Vector3 & getRotationAxis(void); diff --git a/sources/Component/Levitate/LevitateComponent.cpp b/sources/Component/Levitate/LevitateComponent.cpp new file mode 100644 index 00000000..1e6f3c5f --- /dev/null +++ b/sources/Component/Levitate/LevitateComponent.cpp @@ -0,0 +1,24 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#include "LevitateComponent.hpp" + +namespace BBM +{ + LevitateComponent::LevitateComponent(WAL::Entity &entity) + : WAL::Component(entity), + y() + {} + + LevitateComponent::LevitateComponent(WAL::Entity &entity, float y) + : WAL::Component(entity), + y(y) + {} + + WAL::Component *LevitateComponent::clone(WAL::Entity &entity) const + { + return new LevitateComponent(entity); + } + +} // namespace BMM \ No newline at end of file diff --git a/sources/Component/Levitate/LevitateComponent.hpp b/sources/Component/Levitate/LevitateComponent.hpp new file mode 100644 index 00000000..d2868956 --- /dev/null +++ b/sources/Component/Levitate/LevitateComponent.hpp @@ -0,0 +1,38 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#pragma once + +#include "Component/Component.hpp" +#include "Entity/Entity.hpp" +#include "Models/Vector3.hpp" + +namespace BBM { + class LevitateComponent : public WAL::Component { + public: + + //! @brief Go down or up + bool up = true; + //! @brief Original y of the entity + float y; + + //! @inherit + WAL::Component *clone(WAL::Entity &entity) const override; + + //! @brief Create a new levitate component. + explicit LevitateComponent(WAL::Entity &entity); + + //! @brief Create a new levitate component. + LevitateComponent(WAL::Entity &entity, float y); + + //! @brief A Levitate component is copy constructable. + LevitateComponent(const LevitateComponent &) = default; + + //! @brief default destructor + ~LevitateComponent() override = default; + + //! @brief A Levitate component can't be assigned + LevitateComponent &operator=(const LevitateComponent &) = delete; + }; +} \ No newline at end of file diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 82afdfeb..0005e9bd 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "Component/Collision/CollisionComponent.hpp" #include "HealthSystem.hpp" #include "Component/Health/HealthComponent.hpp" @@ -19,7 +20,8 @@ namespace BBM { HealthSystem::HealthSystem(WAL::Wal &wal) : WAL::System({ - typeid(HealthComponent) + typeid(HealthComponent), + typeid(PositionComponent) }), _wal(wal) {} @@ -44,6 +46,7 @@ namespace BBM this->_wal.scene->addEntity("Bonus") .addComponent(position) .addComponent(1) + .addComponent(position.y) .addComponent([](WAL::Entity &bonus, const WAL::Entity &player) { //bonus.scheduleDeletion(true); }, func[bonusType - 1]) diff --git a/sources/System/Levitate/LevitateSystem.cpp b/sources/System/Levitate/LevitateSystem.cpp new file mode 100644 index 00000000..3d243ead --- /dev/null +++ b/sources/System/Levitate/LevitateSystem.cpp @@ -0,0 +1,32 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#include "LevitateSystem.hpp" + +namespace BBM { + LevitateSystem::LevitateSystem() + : WAL::System({ + typeid(LevitateComponent), + typeid(PositionComponent) + }) + {} + + void LevitateSystem::onFixedUpdate(WAL::Entity &entity) { + auto &levitate = entity.getComponent(); + auto &position = entity.getComponent(); + float &y = position.position.y; + + if (levitate.up) { + if (y < levitate.y + 0.1f) + y += 0.004f; + else + levitate.up = false; + return; + } + if (y > levitate.y - 0.1f) + y -= 0.004f; + else + levitate.up = true; + } +} \ No newline at end of file diff --git a/sources/System/Levitate/LevitateSystem.hpp b/sources/System/Levitate/LevitateSystem.hpp new file mode 100644 index 00000000..2b5a0fae --- /dev/null +++ b/sources/System/Levitate/LevitateSystem.hpp @@ -0,0 +1,29 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#pragma once + +#include "Component/Levitate/LevitateComponent.hpp" +#include "Component/Position/PositionComponent.hpp" +#include "Wal.hpp" +#include "System/System.hpp" + +namespace BBM { + class LevitateSystem : public WAL::System + { + private: + public: + //! @inherit + void onFixedUpdate(WAL::Entity &entity) override; + + //! @brief A default constructor + LevitateSystem(); + //! @brief A Levitate system is copy constructable + LevitateSystem(const LevitateSystem &) = default; + //! @brief A default destructor + ~LevitateSystem() override = default; + //! @brief A Levitate system is assignable. + LevitateSystem &operator=(const LevitateSystem &) = default; + }; +} \ No newline at end of file From 78d026114e3401f8266c84af454f4b302ca34dee Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Mon, 7 Jun 2021 14:35:19 +0200 Subject: [PATCH 09/43] init --- .../BombAnimator/BombAnimatorComponent.cpp | 5 +++++ .../BombAnimator/BombAnimatorComponent.hpp | 21 +++++++++++++++++++ .../BombAnimator/BombAnimatorSystem.cpp | 5 +++++ .../BombAnimator/BombAnimatorSystem.hpp | 14 +++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 sources/Component/BombAnimator/BombAnimatorComponent.cpp create mode 100644 sources/Component/BombAnimator/BombAnimatorComponent.hpp create mode 100644 sources/System/BombAnimator/BombAnimatorSystem.cpp create mode 100644 sources/System/BombAnimator/BombAnimatorSystem.hpp diff --git a/sources/Component/BombAnimator/BombAnimatorComponent.cpp b/sources/Component/BombAnimator/BombAnimatorComponent.cpp new file mode 100644 index 00000000..3ff7574c --- /dev/null +++ b/sources/Component/BombAnimator/BombAnimatorComponent.cpp @@ -0,0 +1,5 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#include "BombAnimatorComponent.hpp" diff --git a/sources/Component/BombAnimator/BombAnimatorComponent.hpp b/sources/Component/BombAnimator/BombAnimatorComponent.hpp new file mode 100644 index 00000000..78e8ebc6 --- /dev/null +++ b/sources/Component/BombAnimator/BombAnimatorComponent.hpp @@ -0,0 +1,21 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#pragma once +namespace BBM { + class BombAnimatorComponent { + public: + //! @inherit + WAL::Component *clone(WAL::Entity &entity) const override; + + //! @brief ctor + explicit BombAnimatorComponent(WAL::Entity &entity); + //! @brief copy ctor + BombAnimatorComponent(const BombAnimatorComponent &) = default; + //! @brief dtor + ~BombAnimatorComponent() override = default; + //! @brief assignment operator + BombAnimatorComponent &operator=(const BombAnimatorComponent &) = delete; + }; +} \ No newline at end of file diff --git a/sources/System/BombAnimator/BombAnimatorSystem.cpp b/sources/System/BombAnimator/BombAnimatorSystem.cpp new file mode 100644 index 00000000..3bae8d09 --- /dev/null +++ b/sources/System/BombAnimator/BombAnimatorSystem.cpp @@ -0,0 +1,5 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#include "BombAnimatorSystem.hpp" diff --git a/sources/System/BombAnimator/BombAnimatorSystem.hpp b/sources/System/BombAnimator/BombAnimatorSystem.hpp new file mode 100644 index 00000000..170730dc --- /dev/null +++ b/sources/System/BombAnimator/BombAnimatorSystem.hpp @@ -0,0 +1,14 @@ +// +// Created by hbenjamin on 07/06/2021. +// + +#ifndef BOMBERMAN_BOMBANIMATORSYSTEM_H +#define BOMBERMAN_BOMBANIMATORSYSTEM_H + + +class BombAnimatorSystem { + +}; + + +#endif //BOMBERMAN_BOMBANIMATORSYSTEM_H From 982050cb91de03df272ebd524cea41824dc237cd Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Tue, 8 Jun 2021 16:41:59 +0200 Subject: [PATCH 10/43] bombanimatorcomponent created, waiting for model to test --- CMakeLists.txt | 4 +++ .../BombAnimator/BombAnimatorComponent.cpp | 12 ++++++++ .../BombAnimator/BombAnimatorComponent.hpp | 15 +++++++++- sources/Runner/Runner.cpp | 2 ++ .../BombAnimator/BombAnimatorSystem.cpp | 22 ++++++++++++++ .../BombAnimator/BombAnimatorSystem.hpp | 29 ++++++++++++++----- .../System/BombHolder/BombHolderSystem.cpp | 6 +++- 7 files changed, 81 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 588f5096..aa74bf81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,10 @@ set(SOURCES sources/Component/Animator/AnimatorComponent.hpp sources/System/Animator/AnimatorSystem.cpp sources/System/Animator/AnimatorSystem.hpp + sources/Component/BombAnimator/BombAnimatorComponent.cpp + sources/Component/BombAnimator/BombAnimatorComponent.hpp + sources/System/BombAnimator/BombAnimatorSystem.cpp + sources/System/BombAnimator/BombAnimatorSystem.hpp ) add_executable(bomberman sources/main.cpp diff --git a/sources/Component/BombAnimator/BombAnimatorComponent.cpp b/sources/Component/BombAnimator/BombAnimatorComponent.cpp index 3ff7574c..f3b15836 100644 --- a/sources/Component/BombAnimator/BombAnimatorComponent.cpp +++ b/sources/Component/BombAnimator/BombAnimatorComponent.cpp @@ -3,3 +3,15 @@ // #include "BombAnimatorComponent.hpp" + +namespace BBM +{ + BombAnimatorComponent::BombAnimatorComponent(WAL::Entity &entity) + : WAL::Component(entity) + {} + + WAL::Component *BombAnimatorComponent::clone(WAL::Entity &entity) const + { + return new BombAnimatorComponent(entity); + } +} \ No newline at end of file diff --git a/sources/Component/BombAnimator/BombAnimatorComponent.hpp b/sources/Component/BombAnimator/BombAnimatorComponent.hpp index 78e8ebc6..3e5145b3 100644 --- a/sources/Component/BombAnimator/BombAnimatorComponent.hpp +++ b/sources/Component/BombAnimator/BombAnimatorComponent.hpp @@ -3,9 +3,22 @@ // #pragma once + +#include "Component/Component.hpp" +#include "Entity/Entity.hpp" +#include + +using namespace std::chrono_literals; + namespace BBM { - class BombAnimatorComponent { + class BombAnimatorComponent : public WAL::Component{ public: + + //! @brief The number of seconds of each animation. This variable is used to reset the nextAnimationRate value. + std::chrono::nanoseconds animationRate = 1000ms; + //! @brief The number of nanosecond before the next animation. + std::chrono::nanoseconds nextAnimationRate = animationRate; + //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 57494e5e..4b8fd421 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "Component/Animation/AnimationsComponent.hpp" #include "System/Animation/AnimationsSystem.hpp" #include "Map/Map.hpp" @@ -52,6 +53,7 @@ namespace BBM .addSystem() .addSystem() .addSystem() + .addSystem() .addSystem() .addSystem() .addSystem() diff --git a/sources/System/BombAnimator/BombAnimatorSystem.cpp b/sources/System/BombAnimator/BombAnimatorSystem.cpp index 3bae8d09..27647a38 100644 --- a/sources/System/BombAnimator/BombAnimatorSystem.cpp +++ b/sources/System/BombAnimator/BombAnimatorSystem.cpp @@ -3,3 +3,25 @@ // #include "BombAnimatorSystem.hpp" +#include +#include + +namespace BBM +{ + BombAnimatorSystem::BombAnimatorSystem(WAL::Wal &wal) + : System(wal) + {} + + void BombAnimatorSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) + { + auto &animator = entity.get(); + + animator.nextAnimationRate -= dtime; + if (animator.nextAnimationRate <= 0ns) { + animator.nextAnimationRate = animator.animationRate; + /*auto &animation = entity.get(); + auto ind = animation.getCurrentAnimIndex(); + animation.setAnimIndex(ind++);*/ + } + } +} \ No newline at end of file diff --git a/sources/System/BombAnimator/BombAnimatorSystem.hpp b/sources/System/BombAnimator/BombAnimatorSystem.hpp index 170730dc..83d227ab 100644 --- a/sources/System/BombAnimator/BombAnimatorSystem.hpp +++ b/sources/System/BombAnimator/BombAnimatorSystem.hpp @@ -2,13 +2,28 @@ // Created by hbenjamin on 07/06/2021. // -#ifndef BOMBERMAN_BOMBANIMATORSYSTEM_H -#define BOMBERMAN_BOMBANIMATORSYSTEM_H +#pragma once +#include "Component/Animation/AnimationsComponent.hpp" +#include "Component/BombAnimator/BombAnimatorComponent.hpp" +#include "System/System.hpp" -class BombAnimatorSystem { +namespace BBM +{ + //! @brief A system to handle BombAnimator entities. + class BombAnimatorSystem : public WAL::System + { + public: + //! @inherit + void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dTime) override; -}; - - -#endif //BOMBERMAN_BOMBANIMATORSYSTEM_H + //! @brief A default constructor + BombAnimatorSystem(WAL::Wal &wal); + //! @brief An BombAnimator system is copy constructable + BombAnimatorSystem(const BombAnimatorSystem &) = default; + //! @brief A default destructor + ~BombAnimatorSystem() override = default; + //! @brief A BombAnimator system is assignable. + BombAnimatorSystem &operator=(const BombAnimatorSystem &) = default; + }; +} diff --git a/sources/System/BombHolder/BombHolderSystem.cpp b/sources/System/BombHolder/BombHolderSystem.cpp index 2d46b3b8..76934aea 100644 --- a/sources/System/BombHolder/BombHolderSystem.cpp +++ b/sources/System/BombHolder/BombHolderSystem.cpp @@ -2,6 +2,8 @@ // Created by Zoe Roux on 5/31/21. // +#include +#include #include "Component/Timer/TimerComponent.hpp" #include "System/Event/EventSystem.hpp" #include "Component/Renderer/Drawable3DComponent.hpp" @@ -43,7 +45,9 @@ namespace BBM .addComponent(position) .addComponent(BombHolderSystem::explosionTimer, &BombHolderSystem::_bombExplosion) .addComponent("assets/bombs/bomb.obj", - std::make_pair(MAP_DIFFUSE, "assets/bombs/bomb_normal.png")); + std::make_pair(MAP_DIFFUSE, "assets/bombs/bomb_normal.png")) + .addComponent() + .addComponent(RAY::ModelAnimations("assets/bombs/bomb.obj"), 0); } void BombHolderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) From 3009e34ac3768df0509191bcb63e16e4b0441096 Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Tue, 8 Jun 2021 20:12:09 +0200 Subject: [PATCH 11/43] increased range + damage bonus added, just miss ignorewalls now & sprite for the explosionrange bonus --- CMakeLists.txt | 2 + sources/Component/Bomb/BasicBombComponent.cpp | 19 ++++++++++ sources/Component/Bomb/BasicBombComponent.hpp | 38 +++++++++++++++++++ .../BombHolder/BombHolderComponent.hpp | 4 ++ sources/Items/Bonus.cpp | 6 +-- .../System/BombHolder/BombHolderSystem.cpp | 16 +++++--- .../System/BombHolder/BombHolderSystem.hpp | 4 +- 7 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 sources/Component/Bomb/BasicBombComponent.cpp create mode 100644 sources/Component/Bomb/BasicBombComponent.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 09365555..4475da2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,8 @@ set(SOURCES sources/Component/Animator/AnimatorComponent.hpp sources/System/Animator/AnimatorSystem.cpp sources/System/Animator/AnimatorSystem.hpp + sources/Component/Bomb/BasicBombComponent.cpp + sources/Component/Bomb/BasicBombComponent.hpp ) add_executable(bomberman sources/main.cpp diff --git a/sources/Component/Bomb/BasicBombComponent.cpp b/sources/Component/Bomb/BasicBombComponent.cpp new file mode 100644 index 00000000..4c6f74af --- /dev/null +++ b/sources/Component/Bomb/BasicBombComponent.cpp @@ -0,0 +1,19 @@ +// +// Created by Utilisateur on 08/06/2021. +// + +#include "BasicBombComponent.hpp" + +namespace BBM +{ + BasicBombComponent::BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius) + : WAL::Component(entity), + damage(damage), + explosionRadius(explosionRadius) + {} + + WAL::Component *BasicBombComponent::clone(WAL::Entity &entity) const + { + return new BasicBombComponent(entity, this->damage, this->explosionRadius); + } +} \ No newline at end of file diff --git a/sources/Component/Bomb/BasicBombComponent.hpp b/sources/Component/Bomb/BasicBombComponent.hpp new file mode 100644 index 00000000..f9225a54 --- /dev/null +++ b/sources/Component/Bomb/BasicBombComponent.hpp @@ -0,0 +1,38 @@ +// +// Created by Utilisateur on 08/06/2021. +// + +#pragma once + +#include "Component/Component.hpp" +#include "Entity/Entity.hpp" +#include + +using namespace std::chrono_literals; + +namespace BBM +{ + class BasicBombComponent : public WAL::Component + { + public: + //! @brief The radius of the explosion. + const float explosionRadius = 3; + //! @brief The damage made by the explosion on an entity + const int damage = 1; + + //! @inherit + WAL::Component *clone(WAL::Entity &entity) const override; + + //! @brief A component can't be instantiated, it should be derived. + explicit BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius); + + //! @brief A component can't be instantiated, it should be derived. + BasicBombComponent(const BasicBombComponent &) = default; + + //! @brief default destructor + ~BasicBombComponent() override = default; + + //! @brief A component can't be assigned + BasicBombComponent &operator=(const BasicBombComponent &) = delete; + }; +} \ No newline at end of file diff --git a/sources/Component/BombHolder/BombHolderComponent.hpp b/sources/Component/BombHolder/BombHolderComponent.hpp index 03906e84..75a0f0f9 100644 --- a/sources/Component/BombHolder/BombHolderComponent.hpp +++ b/sources/Component/BombHolder/BombHolderComponent.hpp @@ -25,6 +25,10 @@ namespace BBM std::chrono::nanoseconds refillRate = 5000ms; //! @brief The number of nanosecond before the next bomb refill. std::chrono::nanoseconds nextBombRefill = refillRate; + //! @brief The radius of the explosion. + float explosionRadius = 3; + //! @brief The damage made by the explosion on an entity + int damage = 1; //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 9da6e4c1..dd6337c0 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -20,8 +20,7 @@ namespace BBM { { if (player.hasComponent()) { auto &bombHolder = player.getComponent(); - std::cout << "Explosion is supposed to deal 1 more damage here" << std::endl; - //bombHolder.damage++; + bombHolder.damage++; } } @@ -29,8 +28,7 @@ namespace BBM { { if (player.hasComponent()) { auto &bombHolder = player.getComponent(); - std::cout << "Explosion is supposed to be 1 range higher here" << std::endl; - //bombHolder.explosionRange++; + bombHolder.explosionRadius++; } } diff --git a/sources/System/BombHolder/BombHolderSystem.cpp b/sources/System/BombHolder/BombHolderSystem.cpp index 2d46b3b8..7ca6ed67 100644 --- a/sources/System/BombHolder/BombHolderSystem.cpp +++ b/sources/System/BombHolder/BombHolderSystem.cpp @@ -2,6 +2,7 @@ // Created by Zoe Roux on 5/31/21. // +#include #include "Component/Timer/TimerComponent.hpp" #include "System/Event/EventSystem.hpp" #include "Component/Renderer/Drawable3DComponent.hpp" @@ -14,7 +15,6 @@ namespace RAY3D = RAY::Drawables::Drawables3D; namespace BBM { std::chrono::nanoseconds BombHolderSystem::explosionTimer = 3s; - float BombHolderSystem::explosionRadius = 3; BombHolderSystem::BombHolderSystem(WAL::Wal &wal) : System(wal) @@ -24,26 +24,30 @@ namespace BBM { bomb.scheduleDeletion(); auto &bombPosition = bomb.getComponent(); - wal.getSystem().dispatchEvent([&bombPosition](WAL::Entity &entity){ + auto &basicBomb = bomb.getComponent(); + wal.getSystem().dispatchEvent([&bombPosition, &basicBomb](WAL::Entity &entity){ auto *health = entity.tryGetComponent(); auto *pos = entity.tryGetComponent(); if (!health || !pos) return; - if (pos->position.distance(bombPosition.position) > BombHolderSystem::explosionRadius) + if (pos->position.distance(bombPosition.position) > basicBomb.explosionRadius) return; // TODO do a raycast here to only remove health to entities that are not behind others. - health->takeDmg(1); + health->takeDmg(basicBomb.damage); }); } - void BombHolderSystem::_spawnBomb(Vector3f position) + void BombHolderSystem::_spawnBomb(Vector3f position, BombHolderComponent &holder) { this->_wal.scene->scheduleNewEntity("Bomb") .addComponent(position) + .addComponent(holder.damage, holder.explosionRadius) .addComponent(BombHolderSystem::explosionTimer, &BombHolderSystem::_bombExplosion) .addComponent("assets/bombs/bomb.obj", std::make_pair(MAP_DIFFUSE, "assets/bombs/bomb_normal.png")); + holder.damage = 1; + holder.explosionRadius = 3; } void BombHolderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) @@ -54,7 +58,7 @@ namespace BBM if (controllable.bomb && holder.bombCount > 0) { holder.bombCount--; - this->_spawnBomb(position.position); + this->_spawnBomb(position.position, holder); } if (holder.bombCount < holder.maxBombCount) { holder.nextBombRefill -= dtime; diff --git a/sources/System/BombHolder/BombHolderSystem.hpp b/sources/System/BombHolder/BombHolderSystem.hpp index fd3d4e78..d21cffdb 100644 --- a/sources/System/BombHolder/BombHolderSystem.hpp +++ b/sources/System/BombHolder/BombHolderSystem.hpp @@ -18,15 +18,13 @@ namespace BBM { private: //! @brief Spawn a bomb at the specified position. - void _spawnBomb(Vector3f position); + void _spawnBomb(Vector3f position, BombHolderComponent &holder); //! @brief The method triggered when the bomb explode. static void _bombExplosion(WAL::Entity &bomb, WAL::Wal &); public: //! @brief The explosion time of new bombs. static std::chrono::nanoseconds explosionTimer; - //! @brief The radius of the explosion. - static float explosionRadius; //! @inherit void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; From 58bbd1fb932df20dab53b3da4c7dc8735e64bbed Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Tue, 8 Jun 2021 20:37:10 +0200 Subject: [PATCH 12/43] Update speedup bonus & fixing one bug (double bonus/...) --- .../Controllable/ControllableComponent.hpp | 2 ++ sources/Items/Bonus.cpp | 15 +++++++++++++-- .../System/Controllable/ControllableSystem.cpp | 2 +- .../System/Controllable/ControllableSystem.hpp | 3 --- sources/System/Health/HealthSystem.cpp | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/sources/Component/Controllable/ControllableComponent.hpp b/sources/Component/Controllable/ControllableComponent.hpp index 8376d43f..f8c21743 100644 --- a/sources/Component/Controllable/ControllableComponent.hpp +++ b/sources/Component/Controllable/ControllableComponent.hpp @@ -22,6 +22,8 @@ namespace BBM bool bomb = false; //! @brief input value for pause bool pause = false; + //! @brief The speed applied to every controllable entities. + float speed = .25f; //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index dd6337c0..5ba73d6b 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -3,6 +3,7 @@ // #include +#include #include "Component/Movable/MovableComponent.hpp" #include "Bonus.hpp" #include "Component/BombHolder/BombHolderComponent.hpp" @@ -10,6 +11,8 @@ namespace BBM { void Bonus::BombUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { + if (bonus.shouldDelete()) + return; if (player.hasComponent()) { auto &bombHolder = player.getComponent(); bombHolder.maxBombCount++; @@ -18,6 +21,8 @@ namespace BBM { void Bonus::DamageIncreasedBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { + if (bonus.shouldDelete()) + return; if (player.hasComponent()) { auto &bombHolder = player.getComponent(); bombHolder.damage++; @@ -26,6 +31,8 @@ namespace BBM { void Bonus::ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { + if (bonus.shouldDelete()) + return; if (player.hasComponent()) { auto &bombHolder = player.getComponent(); bombHolder.explosionRadius++; @@ -34,14 +41,18 @@ namespace BBM { void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { + if (bonus.shouldDelete()) + return; if (!player.hasComponent()) return; - auto &movable = player.getComponent(); - movable.addForce(Vector3f(1, 0, 1)); + auto &controllable = player.getComponent(); + controllable.speed += 0.02f; } void Bonus::IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { + if (bonus.shouldDelete()) + return; if (player.hasComponent()) { auto &bombHolder = player.getComponent(); std::cout << "Explosion is supposed to pass through walls here" << std::endl; diff --git a/sources/System/Controllable/ControllableSystem.cpp b/sources/System/Controllable/ControllableSystem.cpp index f14c46b3..16c82d82 100644 --- a/sources/System/Controllable/ControllableSystem.cpp +++ b/sources/System/Controllable/ControllableSystem.cpp @@ -18,7 +18,7 @@ namespace BBM { auto &controllable = entity.get(); auto &movable = entity.get(); - Vector2f move = controllable.move.normalized() * ControllableSystem::speed; + Vector2f move = controllable.move.normalized() * controllable.speed; movable.addForce(Vector3f(move.x, controllable.jump, move.y)); } diff --git a/sources/System/Controllable/ControllableSystem.hpp b/sources/System/Controllable/ControllableSystem.hpp index 25a9e837..6648bbb3 100644 --- a/sources/System/Controllable/ControllableSystem.hpp +++ b/sources/System/Controllable/ControllableSystem.hpp @@ -15,9 +15,6 @@ namespace BBM class ControllableSystem : public WAL::System { public: - //! @brief The speed applied to every controllable entities. - static constexpr const float speed = .25f; - //! @inherit void onFixedUpdate(WAL::ViewEntity &entity) override; diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 85fa2f0f..01e3f433 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -63,7 +63,7 @@ namespace BBM auto &position = entity.get(); if (health.getHealthPoint() == 0) { - if (entity->hasComponent()) { + if (entity->hasComponent() && !entity->shouldDelete()) { auto &bonus = entity->getComponent(); auto bonusType = bonus.getRandomBonusType(); this->_createBonus(position.position, bonusType, bonus.disappearTimer); From 97b7a7d259a1f8b5b77b8cd26b287a92dfd2f901 Mon Sep 17 00:00:00 2001 From: EternalRat <44569175+EternalRat@users.noreply.github.com> Date: Tue, 8 Jun 2021 21:05:08 +0200 Subject: [PATCH 13/43] timer added to speedup bonus (15s) --- sources/Component/Controllable/ControllableComponent.hpp | 7 +++++++ sources/Items/Bonus.cpp | 3 ++- sources/System/Controllable/ControllableSystem.cpp | 9 ++++++++- sources/System/Controllable/ControllableSystem.hpp | 5 ++++- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/sources/Component/Controllable/ControllableComponent.hpp b/sources/Component/Controllable/ControllableComponent.hpp index f8c21743..05bef5cc 100644 --- a/sources/Component/Controllable/ControllableComponent.hpp +++ b/sources/Component/Controllable/ControllableComponent.hpp @@ -8,6 +8,9 @@ #include #include "Component/Component.hpp" #include "Entity/Entity.hpp" +#include + +using namespace std::chrono_literals; namespace BBM { @@ -24,6 +27,10 @@ namespace BBM bool pause = false; //! @brief The speed applied to every controllable entities. float speed = .25f; + //! @brief The number of seconds before a speedbonus expire. This variable is used to reset the nextSpeedBonusRate value. + std::chrono::nanoseconds speedBonusRate = 15000ms; + //! @brief The number of nanosecond before the expiration of a speed bonus. + std::chrono::nanoseconds nextSpeedBonusRate = speedBonusRate; //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 5ba73d6b..854563e6 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -46,7 +46,8 @@ namespace BBM { if (!player.hasComponent()) return; auto &controllable = player.getComponent(); - controllable.speed += 0.02f; + controllable.speed = 0.35f; + controllable.nextSpeedBonusRate = controllable.speedBonusRate; } void Bonus::IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) diff --git a/sources/System/Controllable/ControllableSystem.cpp b/sources/System/Controllable/ControllableSystem.cpp index 16c82d82..e0fb8b78 100644 --- a/sources/System/Controllable/ControllableSystem.cpp +++ b/sources/System/Controllable/ControllableSystem.cpp @@ -14,12 +14,19 @@ namespace BBM : System(wal) {} - void ControllableSystem::onFixedUpdate(WAL::ViewEntity &entity) + void ControllableSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) { auto &controllable = entity.get(); auto &movable = entity.get(); Vector2f move = controllable.move.normalized() * controllable.speed; movable.addForce(Vector3f(move.x, controllable.jump, move.y)); + if (controllable.speed == 0.25f) + return; + controllable.nextSpeedBonusRate -= dtime; + if (controllable.nextSpeedBonusRate <= 0ns) { + controllable.nextSpeedBonusRate = controllable.speedBonusRate; + controllable.speed = 0.25f; + } } } \ No newline at end of file diff --git a/sources/System/Controllable/ControllableSystem.hpp b/sources/System/Controllable/ControllableSystem.hpp index 6648bbb3..268515c1 100644 --- a/sources/System/Controllable/ControllableSystem.hpp +++ b/sources/System/Controllable/ControllableSystem.hpp @@ -9,14 +9,17 @@ #include "Component/Controllable/ControllableComponent.hpp" #include "System/System.hpp" +using namespace std::chrono_literals; + namespace BBM { //! @brief A system to handle Controllable entities. class ControllableSystem : public WAL::System { public: + //! @inherit - void onFixedUpdate(WAL::ViewEntity &entity) override; + void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; //! @brief A default constructor explicit ControllableSystem(WAL::Wal &wal); From 54bc9ce5ac5a51263b4a14e47b725d91d034b6bf Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 10:57:55 +0200 Subject: [PATCH 14/43] need to fix explosion.obj --- CMakeLists.txt | 4 - assets/bombs/explosion/blast.png | Bin 0 -> 47275 bytes assets/bombs/explosion/explosion.mtl | 12 + assets/bombs/explosion/explosion.obj | 2071 +++++++++++++++++ assets/bombs/explosion/explosion.png | Bin 0 -> 2200 bytes .../BombAnimator/BombAnimatorComponent.cpp | 17 - .../BombAnimator/BombAnimatorComponent.hpp | 34 - sources/Runner/Runner.cpp | 2 - .../BombAnimator/BombAnimatorSystem.cpp | 27 - .../BombAnimator/BombAnimatorSystem.hpp | 29 - .../System/BombHolder/BombHolderSystem.cpp | 14 +- 11 files changed, 2092 insertions(+), 118 deletions(-) create mode 100644 assets/bombs/explosion/blast.png create mode 100644 assets/bombs/explosion/explosion.mtl create mode 100644 assets/bombs/explosion/explosion.obj create mode 100644 assets/bombs/explosion/explosion.png delete mode 100644 sources/Component/BombAnimator/BombAnimatorComponent.cpp delete mode 100644 sources/Component/BombAnimator/BombAnimatorComponent.hpp delete mode 100644 sources/System/BombAnimator/BombAnimatorSystem.cpp delete mode 100644 sources/System/BombAnimator/BombAnimatorSystem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a614554..48dcf444 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,10 +81,6 @@ set(SOURCES sources/Component/Animator/AnimatorComponent.hpp sources/System/Animator/AnimatorSystem.cpp sources/System/Animator/AnimatorSystem.hpp - sources/Component/BombAnimator/BombAnimatorComponent.cpp - sources/Component/BombAnimator/BombAnimatorComponent.hpp - sources/System/BombAnimator/BombAnimatorSystem.cpp - sources/System/BombAnimator/BombAnimatorSystem.hpp ) add_executable(bomberman sources/main.cpp diff --git a/assets/bombs/explosion/blast.png b/assets/bombs/explosion/blast.png new file mode 100644 index 0000000000000000000000000000000000000000..037212f67f03826eb9341527a28124a187d1ec56 GIT binary patch literal 47275 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 aiTw{`qE2)k3_^4O0000 - -using namespace std::chrono_literals; - -namespace BBM { - class BombAnimatorComponent : public WAL::Component{ - public: - - //! @brief The number of seconds of each animation. This variable is used to reset the nextAnimationRate value. - std::chrono::nanoseconds animationRate = 1000ms; - //! @brief The number of nanosecond before the next animation. - std::chrono::nanoseconds nextAnimationRate = animationRate; - - //! @inherit - WAL::Component *clone(WAL::Entity &entity) const override; - - //! @brief ctor - explicit BombAnimatorComponent(WAL::Entity &entity); - //! @brief copy ctor - BombAnimatorComponent(const BombAnimatorComponent &) = default; - //! @brief dtor - ~BombAnimatorComponent() override = default; - //! @brief assignment operator - BombAnimatorComponent &operator=(const BombAnimatorComponent &) = delete; - }; -} \ No newline at end of file diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 924fb85e..591ce261 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include "Component/Animation/AnimationsComponent.hpp" #include "System/Animation/AnimationsSystem.hpp" #include "Map/Map.hpp" @@ -53,7 +52,6 @@ namespace BBM .addSystem() .addSystem() .addSystem() - .addSystem() .addSystem() .addSystem() .addSystem() diff --git a/sources/System/BombAnimator/BombAnimatorSystem.cpp b/sources/System/BombAnimator/BombAnimatorSystem.cpp deleted file mode 100644 index 27647a38..00000000 --- a/sources/System/BombAnimator/BombAnimatorSystem.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Created by hbenjamin on 07/06/2021. -// - -#include "BombAnimatorSystem.hpp" -#include -#include - -namespace BBM -{ - BombAnimatorSystem::BombAnimatorSystem(WAL::Wal &wal) - : System(wal) - {} - - void BombAnimatorSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) - { - auto &animator = entity.get(); - - animator.nextAnimationRate -= dtime; - if (animator.nextAnimationRate <= 0ns) { - animator.nextAnimationRate = animator.animationRate; - /*auto &animation = entity.get(); - auto ind = animation.getCurrentAnimIndex(); - animation.setAnimIndex(ind++);*/ - } - } -} \ No newline at end of file diff --git a/sources/System/BombAnimator/BombAnimatorSystem.hpp b/sources/System/BombAnimator/BombAnimatorSystem.hpp deleted file mode 100644 index 83d227ab..00000000 --- a/sources/System/BombAnimator/BombAnimatorSystem.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Created by hbenjamin on 07/06/2021. -// - -#pragma once - -#include "Component/Animation/AnimationsComponent.hpp" -#include "Component/BombAnimator/BombAnimatorComponent.hpp" -#include "System/System.hpp" - -namespace BBM -{ - //! @brief A system to handle BombAnimator entities. - class BombAnimatorSystem : public WAL::System - { - public: - //! @inherit - void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dTime) override; - - //! @brief A default constructor - BombAnimatorSystem(WAL::Wal &wal); - //! @brief An BombAnimator system is copy constructable - BombAnimatorSystem(const BombAnimatorSystem &) = default; - //! @brief A default destructor - ~BombAnimatorSystem() override = default; - //! @brief A BombAnimator system is assignable. - BombAnimatorSystem &operator=(const BombAnimatorSystem &) = default; - }; -} diff --git a/sources/System/BombHolder/BombHolderSystem.cpp b/sources/System/BombHolder/BombHolderSystem.cpp index 76934aea..30d0c80b 100644 --- a/sources/System/BombHolder/BombHolderSystem.cpp +++ b/sources/System/BombHolder/BombHolderSystem.cpp @@ -2,7 +2,6 @@ // Created by Zoe Roux on 5/31/21. // -#include #include #include "Component/Timer/TimerComponent.hpp" #include "System/Event/EventSystem.hpp" @@ -26,7 +25,7 @@ namespace BBM { bomb.scheduleDeletion(); auto &bombPosition = bomb.getComponent(); - wal.getSystem().dispatchEvent([&bombPosition](WAL::Entity &entity){ + wal.getSystem().dispatchEvent([&bombPosition, &wal](WAL::Entity &entity){ auto *health = entity.tryGetComponent(); auto *pos = entity.tryGetComponent(); @@ -34,6 +33,13 @@ namespace BBM return; if (pos->position.distance(bombPosition.position) > BombHolderSystem::explosionRadius) return; + wal.scene->scheduleNewEntity("explosion") + .addComponent(pos->position) + .addComponent(1s, [](WAL::Entity &explosion, WAL::Wal &wal) { + explosion.scheduleDeletion(); + }) + .addComponent("assets/bombs/explosion/explosion.obj", + std::make_pair(MAP_DIFFUSE, "assets/bombs/explosion/explosion.png")); // TODO do a raycast here to only remove health to entities that are not behind others. health->takeDmg(1); }); @@ -45,9 +51,7 @@ namespace BBM .addComponent(position) .addComponent(BombHolderSystem::explosionTimer, &BombHolderSystem::_bombExplosion) .addComponent("assets/bombs/bomb.obj", - std::make_pair(MAP_DIFFUSE, "assets/bombs/bomb_normal.png")) - .addComponent() - .addComponent(RAY::ModelAnimations("assets/bombs/bomb.obj"), 0); + std::make_pair(MAP_DIFFUSE, "assets/bombs/bomb_normal.png")); } void BombHolderSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) From 5c357af61d99eeecb296cd492af4ef4d18e061c7 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 12:05:33 +0200 Subject: [PATCH 15/43] PlayerBonus system & component made (containing timer) --- CMakeLists.txt | 4 ++ .../Component/Bonus/PlayerBonusComponent.cpp | 16 ++++++ .../Component/Bonus/PlayerBonusComponent.hpp | 51 +++++++++++++++++++ .../Controllable/ControllableComponent.hpp | 4 -- sources/Items/Bonus.cpp | 15 ++++-- sources/Runner/Runner.cpp | 4 ++ sources/System/Bonus/PlayerBonusSystem.cpp | 42 +++++++++++++++ sources/System/Bonus/PlayerBonusSystem.hpp | 34 +++++++++++++ .../Controllable/ControllableSystem.cpp | 7 --- 9 files changed, 163 insertions(+), 14 deletions(-) create mode 100644 sources/Component/Bonus/PlayerBonusComponent.cpp create mode 100644 sources/Component/Bonus/PlayerBonusComponent.hpp create mode 100644 sources/System/Bonus/PlayerBonusSystem.cpp create mode 100644 sources/System/Bonus/PlayerBonusSystem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4475da2f..63493adc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,10 @@ set(SOURCES sources/System/Animator/AnimatorSystem.hpp sources/Component/Bomb/BasicBombComponent.cpp sources/Component/Bomb/BasicBombComponent.hpp + sources/Component/Bonus/PlayerBonusComponent.hpp + sources/Component/Bonus/PlayerBonusComponent.cpp + sources/System/Bonus/PlayerBonusSystem.hpp + sources/System/Bonus/PlayerBonusSystem.cpp ) add_executable(bomberman sources/main.cpp diff --git a/sources/Component/Bonus/PlayerBonusComponent.cpp b/sources/Component/Bonus/PlayerBonusComponent.cpp new file mode 100644 index 00000000..1c1d1d31 --- /dev/null +++ b/sources/Component/Bonus/PlayerBonusComponent.cpp @@ -0,0 +1,16 @@ +// +// Created by hbenjamin on 09/06/2021. +// + +#include "PlayerBonusComponent.hpp" + +namespace BBM { + PlayerBonusComponent::PlayerBonusComponent(WAL::Entity &entity) + : WAL::Component(entity) + {} + + WAL::Component *PlayerBonusComponent::clone(WAL::Entity &entity) const + { + return new PlayerBonusComponent(entity); + } +} diff --git a/sources/Component/Bonus/PlayerBonusComponent.hpp b/sources/Component/Bonus/PlayerBonusComponent.hpp new file mode 100644 index 00000000..3c1adacc --- /dev/null +++ b/sources/Component/Bonus/PlayerBonusComponent.hpp @@ -0,0 +1,51 @@ +// +// Created by hbenjamin on 09/06/2021. +// + +#pragma once + +#include "Component/Component.hpp" +#include "Entity/Entity.hpp" +#include + +using namespace std::chrono_literals; + +namespace BBM +{ + class PlayerBonusComponent : public WAL::Component + { + public: + + //! @brief The number of seconds before a speed bonus expire. This variable is used to reset the nextSpeedBonusRate value. + std::chrono::nanoseconds speedBonusRate = 15s; + //! @brief The number of nanosecond before the expiration of a speed bonus. + std::chrono::nanoseconds nextSpeedBonusRate = speedBonusRate; + //! @brief The number of seconds before a damage bonus expire. This variable is used to reset the nextDamageBonusRate value. + std::chrono::nanoseconds damageBonusRate = 20s; + //! @brief The number of nanosecond before the expiration of a damage bonus. + std::chrono::nanoseconds nextDamageBonusRate = damageBonusRate; + //! @brief The number of seconds before a range bonus expire. This variable is used to reset the nextRangeBonusRate value. + std::chrono::nanoseconds rangeBonusRate = 10s; + //! @brief The number of nanosecond before the expiration of a range bonus. + std::chrono::nanoseconds nextRangeBonusRate = rangeBonusRate; + //! @brief The number of seconds before a ignoreWalls expire. This variable is used to reset the nextSpeedBonusRate value. + std::chrono::nanoseconds ignoreWallsBonusRate = 15s; + //! @brief The number of nanosecond before the expiration of a ignoreWalls bonus. + std::chrono::nanoseconds nextIgnoreWallsBonusRate = ignoreWallsBonusRate; + + //! @inherit + WAL::Component *clone(WAL::Entity &entity) const override; + + //! @brief A Bonus component can't be instantiated, it should be derived. + explicit PlayerBonusComponent(WAL::Entity &entity); + + //! @brief A Bonus component can't be instantiated, it should be derived. + PlayerBonusComponent(const PlayerBonusComponent &) = default; + + //! @brief default destructor + ~PlayerBonusComponent() override = default; + + //! @brief A Bonus component can't be assigned + PlayerBonusComponent &operator=(const PlayerBonusComponent &) = delete; + }; +} \ No newline at end of file diff --git a/sources/Component/Controllable/ControllableComponent.hpp b/sources/Component/Controllable/ControllableComponent.hpp index 05bef5cc..48df8db0 100644 --- a/sources/Component/Controllable/ControllableComponent.hpp +++ b/sources/Component/Controllable/ControllableComponent.hpp @@ -27,10 +27,6 @@ namespace BBM bool pause = false; //! @brief The speed applied to every controllable entities. float speed = .25f; - //! @brief The number of seconds before a speedbonus expire. This variable is used to reset the nextSpeedBonusRate value. - std::chrono::nanoseconds speedBonusRate = 15000ms; - //! @brief The number of nanosecond before the expiration of a speed bonus. - std::chrono::nanoseconds nextSpeedBonusRate = speedBonusRate; //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 854563e6..b6af53d1 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Component/Movable/MovableComponent.hpp" #include "Bonus.hpp" #include "Component/BombHolder/BombHolderComponent.hpp" @@ -25,7 +26,9 @@ namespace BBM { return; if (player.hasComponent()) { auto &bombHolder = player.getComponent(); - bombHolder.damage++; + auto &playerBonus = player.getComponent(); + bombHolder.damage = 2; + playerBonus.nextDamageBonusRate = playerBonus.damageBonusRate; } } @@ -35,7 +38,10 @@ namespace BBM { return; if (player.hasComponent()) { auto &bombHolder = player.getComponent(); - bombHolder.explosionRadius++; + auto &playerBonus = player.getComponent(); + if (bombHolder.explosionRadius <= 6) + bombHolder.explosionRadius++; + playerBonus.nextRangeBonusRate = playerBonus.rangeBonusRate; } } @@ -46,8 +52,9 @@ namespace BBM { if (!player.hasComponent()) return; auto &controllable = player.getComponent(); + auto &playerBonus = player.getComponent(); controllable.speed = 0.35f; - controllable.nextSpeedBonusRate = controllable.speedBonusRate; + playerBonus.nextSpeedBonusRate = playerBonus.speedBonusRate; } void Bonus::IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) @@ -55,7 +62,9 @@ namespace BBM { if (bonus.shouldDelete()) return; if (player.hasComponent()) { + auto &playerBonus = player.getComponent(); auto &bombHolder = player.getComponent(); + playerBonus.nextIgnoreWallsBonusRate = playerBonus.ignoreWallsBonusRate; std::cout << "Explosion is supposed to pass through walls here" << std::endl; //bombHolder.ignoreWalls = true; } diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 96c6b5f2..2fd9a5af 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "Component/Animation/AnimationsComponent.hpp" #include "System/Animation/AnimationsSystem.hpp" #include "Map/Map.hpp" @@ -58,6 +60,7 @@ namespace BBM .addSystem() .addSystem() .addSystem() + .addSystem() .addSystem(); } @@ -83,6 +86,7 @@ namespace BBM .addComponent(BBM::Vector3f{0.25, 0, 0.25}, BBM::Vector3f{.75, 2, .75}) .addComponent() .addComponent() + .addComponent() .addComponent(1, [](WAL::Entity &entity) { auto &animation = entity.getComponent(); animation.setAnimIndex(5); diff --git a/sources/System/Bonus/PlayerBonusSystem.cpp b/sources/System/Bonus/PlayerBonusSystem.cpp new file mode 100644 index 00000000..f8aa721f --- /dev/null +++ b/sources/System/Bonus/PlayerBonusSystem.cpp @@ -0,0 +1,42 @@ +// +// Created by hbenjamin on 09/06/2021. +// + +#include "PlayerBonusSystem.hpp" + +using namespace std::chrono_literals; + +namespace BBM +{ + PlayerBonusSystem::PlayerBonusSystem(WAL::Wal &wal) + : System(wal) + {} + + void PlayerBonusSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) + { + auto &controllable = entity.get(); + auto &holder = entity.get(); + auto &playerBonus = entity.get(); + + playerBonus.nextSpeedBonusRate -= dtime; + if (playerBonus.nextSpeedBonusRate <= 0ns) { + playerBonus.nextSpeedBonusRate = playerBonus.speedBonusRate; + controllable.speed = 0.25f; + } + playerBonus.nextIgnoreWallsBonusRate -= dtime; + if (playerBonus.nextIgnoreWallsBonusRate <= 0ns) { + playerBonus.nextIgnoreWallsBonusRate = playerBonus.ignoreWallsBonusRate; + //holder.ignoreWalls = false; + } + playerBonus.nextDamageBonusRate -= dtime; + if (playerBonus.nextDamageBonusRate <= 0ns) { + playerBonus.nextDamageBonusRate = playerBonus.damageBonusRate; + holder.damage = 1; + } + playerBonus.nextRangeBonusRate -= dtime; + if (playerBonus.nextRangeBonusRate <= 0ns) { + playerBonus.nextRangeBonusRate = playerBonus.rangeBonusRate; + holder.explosionRadius = 3; + } + } +} \ No newline at end of file diff --git a/sources/System/Bonus/PlayerBonusSystem.hpp b/sources/System/Bonus/PlayerBonusSystem.hpp new file mode 100644 index 00000000..6f0a08fa --- /dev/null +++ b/sources/System/Bonus/PlayerBonusSystem.hpp @@ -0,0 +1,34 @@ +// +// Created by hbenjamin on 09/06/2021. +// + +#pragma once + +#include +#include +#include "Models/Vector3.hpp" +#include "Component/Bonus/PlayerBonusComponent.hpp" +#include "Component/Controllable/ControllableComponent.hpp" +#include "Component/BombHolder/BombHolderComponent.hpp" + +namespace BBM +{ + //! @brief The system that allow one to place bombs. + class PlayerBonusSystem : public WAL::System + { + private: + public: + //! @inherit + void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; + + //! @brief A default constructor + explicit PlayerBonusSystem(WAL::Wal &wal); + //! @brief A bomb holder system is copy constructable + PlayerBonusSystem(const PlayerBonusSystem &) = default; + //! @brief A default destructor + ~PlayerBonusSystem() override = default; + //! @brief A bomb holder system is not assignable. + PlayerBonusSystem &operator=(const PlayerBonusSystem &) = delete; + }; +} + diff --git a/sources/System/Controllable/ControllableSystem.cpp b/sources/System/Controllable/ControllableSystem.cpp index e0fb8b78..0714fddc 100644 --- a/sources/System/Controllable/ControllableSystem.cpp +++ b/sources/System/Controllable/ControllableSystem.cpp @@ -21,12 +21,5 @@ namespace BBM Vector2f move = controllable.move.normalized() * controllable.speed; movable.addForce(Vector3f(move.x, controllable.jump, move.y)); - if (controllable.speed == 0.25f) - return; - controllable.nextSpeedBonusRate -= dtime; - if (controllable.nextSpeedBonusRate <= 0ns) { - controllable.nextSpeedBonusRate = controllable.speedBonusRate; - controllable.speed = 0.25f; - } } } \ No newline at end of file From 93a4fa792c919de19c80c302570d6758259e4bcc Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 12:15:01 +0200 Subject: [PATCH 16/43] =?UTF-8?q?removed=20ignore=20walls=20bonus=20(sorry?= =?UTF-8?q?=20cl=C3=A9ment=20:(=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/Component/Bonus/BonusComponent.cpp | 2 +- sources/Component/Bonus/BonusComponent.hpp | 3 +-- sources/Component/Bonus/PlayerBonusComponent.hpp | 4 ---- sources/Items/Bonus.cpp | 13 ------------- sources/Items/Bonus.hpp | 5 ----- sources/System/Bonus/PlayerBonusSystem.cpp | 5 ----- sources/System/Health/HealthSystem.cpp | 5 ++--- 7 files changed, 4 insertions(+), 33 deletions(-) diff --git a/sources/Component/Bonus/BonusComponent.cpp b/sources/Component/Bonus/BonusComponent.cpp index 98ed6d95..c56e81e6 100644 --- a/sources/Component/Bonus/BonusComponent.cpp +++ b/sources/Component/Bonus/BonusComponent.cpp @@ -20,7 +20,7 @@ namespace BBM { double rnd = static_cast(std::rand()) / RAND_MAX; if (rnd < 0.4) - return (static_cast(std::rand() % (IGNOREWALLS - 1) + 1)); + return (static_cast(std::rand() % (DAMAGEINC - 1) + 1)); return (NOTHING); } } \ No newline at end of file diff --git a/sources/Component/Bonus/BonusComponent.hpp b/sources/Component/Bonus/BonusComponent.hpp index 75dc79c6..94284c23 100644 --- a/sources/Component/Bonus/BonusComponent.hpp +++ b/sources/Component/Bonus/BonusComponent.hpp @@ -21,8 +21,7 @@ namespace BBM BOMBSTOCK, SPEEDUP, EXPLOSIONINC, - DAMAGEINC, - IGNOREWALLS + DAMAGEINC }; std::chrono::nanoseconds disappearTimer = 5s; diff --git a/sources/Component/Bonus/PlayerBonusComponent.hpp b/sources/Component/Bonus/PlayerBonusComponent.hpp index 3c1adacc..6ce52e42 100644 --- a/sources/Component/Bonus/PlayerBonusComponent.hpp +++ b/sources/Component/Bonus/PlayerBonusComponent.hpp @@ -28,10 +28,6 @@ namespace BBM std::chrono::nanoseconds rangeBonusRate = 10s; //! @brief The number of nanosecond before the expiration of a range bonus. std::chrono::nanoseconds nextRangeBonusRate = rangeBonusRate; - //! @brief The number of seconds before a ignoreWalls expire. This variable is used to reset the nextSpeedBonusRate value. - std::chrono::nanoseconds ignoreWallsBonusRate = 15s; - //! @brief The number of nanosecond before the expiration of a ignoreWalls bonus. - std::chrono::nanoseconds nextIgnoreWallsBonusRate = ignoreWallsBonusRate; //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index b6af53d1..2dec424c 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -56,17 +56,4 @@ namespace BBM { controllable.speed = 0.35f; playerBonus.nextSpeedBonusRate = playerBonus.speedBonusRate; } - - void Bonus::IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) - { - if (bonus.shouldDelete()) - return; - if (player.hasComponent()) { - auto &playerBonus = player.getComponent(); - auto &bombHolder = player.getComponent(); - playerBonus.nextIgnoreWallsBonusRate = playerBonus.ignoreWallsBonusRate; - std::cout << "Explosion is supposed to pass through walls here" << std::endl; - //bombHolder.ignoreWalls = true; - } - } } \ No newline at end of file diff --git a/sources/Items/Bonus.hpp b/sources/Items/Bonus.hpp index 36a37607..185b5a26 100644 --- a/sources/Items/Bonus.hpp +++ b/sources/Items/Bonus.hpp @@ -29,10 +29,5 @@ namespace BBM { //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect that allows to run faster static void SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis); - - //! @param bonus bonus - //! @param player the entity on which the effect will be applied - //! @brief Apply bonus effect that allows bomb explosion to pass through walls - static void IgnoreWallsBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis); }; } \ No newline at end of file diff --git a/sources/System/Bonus/PlayerBonusSystem.cpp b/sources/System/Bonus/PlayerBonusSystem.cpp index f8aa721f..432a6807 100644 --- a/sources/System/Bonus/PlayerBonusSystem.cpp +++ b/sources/System/Bonus/PlayerBonusSystem.cpp @@ -23,11 +23,6 @@ namespace BBM playerBonus.nextSpeedBonusRate = playerBonus.speedBonusRate; controllable.speed = 0.25f; } - playerBonus.nextIgnoreWallsBonusRate -= dtime; - if (playerBonus.nextIgnoreWallsBonusRate <= 0ns) { - playerBonus.nextIgnoreWallsBonusRate = playerBonus.ignoreWallsBonusRate; - //holder.ignoreWalls = false; - } playerBonus.nextDamageBonusRate -= dtime; if (playerBonus.nextDamageBonusRate <= 0ns) { playerBonus.nextDamageBonusRate = playerBonus.damageBonusRate; diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 01e3f433..195aca97 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -30,12 +30,11 @@ namespace BBM {BonusComponent::BonusType::BOMBSTOCK, "assets/items/bombup"}, {BonusComponent::BonusType::SPEEDUP, "assets/items/speedup"}, //{BonusComponent::BonusType::EXPLOSIONINC, "assets/items/explosion"}, - {BonusComponent::BonusType::DAMAGEINC, "assets/items/fireup"}, - {BonusComponent::BonusType::IGNOREWALLS, "assets/items/wallpass"} + {BonusComponent::BonusType::DAMAGEINC, "assets/items/fireup"} }; static std::vector> func = { &Bonus::BombUpBonus, &Bonus::SpeedUpBonus, //&Bonus::ExplosionRangeBonus, - &Bonus::DamageIncreasedBonus, &Bonus::IgnoreWallsBonus + &Bonus::DamageIncreasedBonus }; if (bonusType == BonusComponent::BonusType::NOTHING) From 9c1190be3034c856b2bcf7fd93dac06e8cd5dc96 Mon Sep 17 00:00:00 2001 From: "arthur.jamet" Date: Wed, 9 Jun 2021 12:48:20 +0200 Subject: [PATCH 17/43] using glb model forexplosion --- assets/bombs/explosion/explosion.glb | Bin 0 -> 70836 bytes assets/bombs/explosion/explosion.mtl | 12 - assets/bombs/explosion/explosion.obj | 2071 ----------------- .../System/BombHolder/BombHolderSystem.cpp | 2 +- 4 files changed, 1 insertion(+), 2084 deletions(-) create mode 100644 assets/bombs/explosion/explosion.glb delete mode 100644 assets/bombs/explosion/explosion.mtl delete mode 100644 assets/bombs/explosion/explosion.obj diff --git a/assets/bombs/explosion/explosion.glb b/assets/bombs/explosion/explosion.glb new file mode 100644 index 0000000000000000000000000000000000000000..065ed85c9e431b441dafba8a80ff0a0041df910e GIT binary patch literal 70836 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, [](WAL::Entity &explosion, WAL::Wal &wal) { explosion.scheduleDeletion(); }) - .addComponent("assets/bombs/explosion/explosion.obj", + .addComponent("assets/bombs/explosion/explosion.glb", std::make_pair(MAP_DIFFUSE, "assets/bombs/explosion/explosion.png")); // TODO do a raycast here to only remove health to entities that are not behind others. health->takeDmg(1); From 84ff472f2aaa5fcc7bf83c3147f5e2dd48d8a24f Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 9 Jun 2021 14:36:19 +0200 Subject: [PATCH 18/43] Real bombs collisions but waiting for origin/bonus to be merged --- sources/System/BombHolder/BombHolderSystem.cpp | 15 +++++++++++++-- sources/System/BombHolder/BombHolderSystem.hpp | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/sources/System/BombHolder/BombHolderSystem.cpp b/sources/System/BombHolder/BombHolderSystem.cpp index 0ccd396b..7807577e 100644 --- a/sources/System/BombHolder/BombHolderSystem.cpp +++ b/sources/System/BombHolder/BombHolderSystem.cpp @@ -19,6 +19,17 @@ namespace BBM { std::chrono::nanoseconds BombHolderSystem::explosionTimer = 3s; + void BombHolderSystem::_bombCollide(WAL::Entity &entity, + const WAL::Entity &bomb, + CollisionComponent::CollidedAxis collidedAxis) + { + auto &bombInfo = bomb.getComponent(); + if (bombInfo.skipOwner && bombInfo.owner == entity) + return; + return MapGenerator::wallCollide(entity, bomb, collidedAxis); + } + + BombHolderSystem::BombHolderSystem(WAL::Wal &wal) : System(wal) {} @@ -54,8 +65,8 @@ namespace BBM this->_wal.scene->scheduleNewEntity("Bomb") .addComponent(position.round()) .addComponent(BombHolderSystem::explosionTimer, &BombHolderSystem::_bombExplosion) -// .addComponent(WAL::Callback(), -// &MapGenerator::wallCollide, 0.25, .75) + .addComponent(WAL::Callback(), + &BombHolderSystem::_bombCollide, 0.25, .75) .addComponent("assets/bombs/bomb.obj", std::make_pair(MAP_DIFFUSE, "assets/bombs/bomb_normal.png")); } diff --git a/sources/System/BombHolder/BombHolderSystem.hpp b/sources/System/BombHolder/BombHolderSystem.hpp index 105f9139..ed3486d1 100644 --- a/sources/System/BombHolder/BombHolderSystem.hpp +++ b/sources/System/BombHolder/BombHolderSystem.hpp @@ -6,6 +6,7 @@ #include #include +#include #include "Models/Vector3.hpp" #include "Component/Position/PositionComponent.hpp" #include "Component/BombHolder/BombHolderComponent.hpp" @@ -25,6 +26,9 @@ namespace BBM //! @brief The method triggered when the bomb explode. static void _bombExplosion(WAL::Entity &bomb, WAL::Wal &); + + //! @brief The method called when a player collide with a bomb. + static void _bombCollide(WAL::Entity &entity, const WAL::Entity &wall, BBM::CollisionComponent::CollidedAxis collidedAxis); public: //! @brief The explosion time of new bombs. static std::chrono::nanoseconds explosionTimer; From 3a99e5913b20573d8860870b46801379bf0a8282 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 14:49:37 +0200 Subject: [PATCH 19/43] fixed healthsystem, using callbacks to create bonuses and removed bonuscomponent (useless) --- CMakeLists.txt | 4 -- sources/Component/Bonus/BonusComponent.cpp | 26 ---------- sources/Component/Bonus/BonusComponent.hpp | 46 ----------------- sources/Component/Health/HealthComponent.cpp | 2 +- sources/Component/Health/HealthComponent.hpp | 5 +- sources/Items/Bonus.cpp | 49 +++++++++++-------- sources/Items/Bonus.hpp | 10 ++++ sources/Map/Map.cpp | 38 ++++++++++++-- sources/Map/Map.hpp | 5 +- sources/Runner/Runner.cpp | 2 +- sources/System/Bonus/PlayerBonusSystem.hpp | 4 +- .../Controllable/ControllableSystem.cpp | 2 +- .../Controllable/ControllableSystem.hpp | 2 +- sources/System/Health/HealthSystem.cpp | 40 +-------------- sources/System/Health/HealthSystem.hpp | 5 +- 15 files changed, 88 insertions(+), 152 deletions(-) delete mode 100644 sources/Component/Bonus/BonusComponent.cpp delete mode 100644 sources/Component/Bonus/BonusComponent.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 63493adc..d6d3f606 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,6 @@ set(SOURCES sources/Map/Map.hpp sources/Items/Bonus.cpp sources/Items/Bonus.hpp - sources/Component/Bonus/BonusComponent.cpp - sources/Component/Bonus/BonusComponent.hpp sources/Component/Position/PositionComponent.cpp sources/Component/Position/PositionComponent.hpp sources/Component/Movable/MovableComponent.cpp @@ -41,8 +39,6 @@ set(SOURCES sources/Component/Keyboard/KeyboardComponent.hpp sources/Component/Health/HealthComponent.cpp sources/Component/Health/HealthComponent.hpp - sources/Component/Bonus/BonusComponent.cpp - sources/Component/Bonus/BonusComponent.hpp sources/System/Movable/MovableSystem.hpp sources/System/Movable/MovableSystem.cpp sources/System/Controllable/ControllableSystem.cpp diff --git a/sources/Component/Bonus/BonusComponent.cpp b/sources/Component/Bonus/BonusComponent.cpp deleted file mode 100644 index c56e81e6..00000000 --- a/sources/Component/Bonus/BonusComponent.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by Benjamin Henry on 2021-06-01. -// - -#include "BonusComponent.hpp" -#include - -namespace BBM { - BonusComponent::BonusComponent(WAL::Entity &entity) - : WAL::Component(entity) - {} - - WAL::Component *BonusComponent::clone(WAL::Entity &entity) const - { - return new BonusComponent(entity); - } - - BonusComponent::BonusType BonusComponent::getRandomBonusType() const - { - double rnd = static_cast(std::rand()) / RAND_MAX; - - if (rnd < 0.4) - return (static_cast(std::rand() % (DAMAGEINC - 1) + 1)); - return (NOTHING); - } -} \ No newline at end of file diff --git a/sources/Component/Bonus/BonusComponent.hpp b/sources/Component/Bonus/BonusComponent.hpp deleted file mode 100644 index 94284c23..00000000 --- a/sources/Component/Bonus/BonusComponent.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// Created by Benjamin Henry on 2021-06-01. -// - -#pragma once - -#include "Component/Component.hpp" -#include "Entity/Entity.hpp" -#include - -using namespace std::chrono_literals; - -namespace BBM -{ - class BonusComponent : public WAL::Component - { - public: - - enum BonusType { - NOTHING, - BOMBSTOCK, - SPEEDUP, - EXPLOSIONINC, - DAMAGEINC - }; - - std::chrono::nanoseconds disappearTimer = 5s; - - BonusType getRandomBonusType() const; - - //! @inherit - WAL::Component *clone(WAL::Entity &entity) const override; - - //! @brief A Bonus component can't be instantiated, it should be derived. - explicit BonusComponent(WAL::Entity &entity); - - //! @brief A Bonus component can't be instantiated, it should be derived. - BonusComponent(const BonusComponent &) = default; - - //! @brief default destructor - ~BonusComponent() override = default; - - //! @brief A Bonus component can't be assigned - BonusComponent &operator=(const BonusComponent &) = delete; - }; -} \ No newline at end of file diff --git a/sources/Component/Health/HealthComponent.cpp b/sources/Component/Health/HealthComponent.cpp index 8901ab31..9063520b 100644 --- a/sources/Component/Health/HealthComponent.cpp +++ b/sources/Component/Health/HealthComponent.cpp @@ -10,7 +10,7 @@ namespace BBM { - HealthComponent::HealthComponent(WAL::Entity &entity, unsigned int healthPoint, const WAL::Callback &onDeath) + HealthComponent::HealthComponent(WAL::Entity &entity, unsigned int healthPoint, const WAL::Callback &onDeath) : WAL::Component(entity), _healthPoint(healthPoint), onDeath(onDeath) diff --git a/sources/Component/Health/HealthComponent.hpp b/sources/Component/Health/HealthComponent.hpp index 29c202d4..3be3c979 100644 --- a/sources/Component/Health/HealthComponent.hpp +++ b/sources/Component/Health/HealthComponent.hpp @@ -9,6 +9,7 @@ #include #include "Component/Component.hpp" #include "Entity/Entity.hpp" +#include "Wal.hpp" namespace BBM { @@ -21,7 +22,7 @@ namespace BBM public: //! @brief The callback invoked on this entity's death. - WAL::Callback onDeath; + WAL::Callback onDeath; //! @brief add health to the entity void addHealthPoint(unsigned int healthPoint); @@ -36,7 +37,7 @@ namespace BBM WAL::Component *clone(WAL::Entity &entity) const override; //! @brief Constructor - HealthComponent(WAL::Entity &entity, unsigned int healthPoint, const WAL::Callback &onDeath = WAL::Callback()); + HealthComponent(WAL::Entity &entity, unsigned int healthPoint, const WAL::Callback &onDeath = WAL::Callback()); //! @brief A Health component can't be instantiated, it should be derived. HealthComponent(const HealthComponent &) = default; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 2dec424c..97a4002b 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -14,46 +14,53 @@ namespace BBM { { if (bonus.shouldDelete()) return; - if (player.hasComponent()) { - auto &bombHolder = player.getComponent(); - bombHolder.maxBombCount++; - } + auto *bombHolder = player.tryGetComponent(); + if (bombHolder == nullptr) + return; + bombHolder->maxBombCount++; } void Bonus::DamageIncreasedBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete()) return; - if (player.hasComponent()) { - auto &bombHolder = player.getComponent(); - auto &playerBonus = player.getComponent(); - bombHolder.damage = 2; - playerBonus.nextDamageBonusRate = playerBonus.damageBonusRate; - } + auto *bombHolder = player.tryGetComponent(); + if (bombHolder == nullptr) + return; + auto &playerBonus = player.getComponent(); + bombHolder->damage = 2; + playerBonus.nextDamageBonusRate = playerBonus.damageBonusRate; } void Bonus::ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete()) return; - if (player.hasComponent()) { - auto &bombHolder = player.getComponent(); - auto &playerBonus = player.getComponent(); - if (bombHolder.explosionRadius <= 6) - bombHolder.explosionRadius++; - playerBonus.nextRangeBonusRate = playerBonus.rangeBonusRate; - } + auto *bombHolder = player.tryGetComponent(); + if (bombHolder == nullptr) + return; + auto &playerBonus = player.getComponent(); + if (bombHolder->explosionRadius <= 6) + bombHolder->explosionRadius++; + playerBonus.nextRangeBonusRate = playerBonus.rangeBonusRate; } void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete()) return; - if (!player.hasComponent()) - return; - auto &controllable = player.getComponent(); + auto *controllable = player.tryGetComponent(); auto &playerBonus = player.getComponent(); - controllable.speed = 0.35f; + controllable->speed = 0.35f; playerBonus.nextSpeedBonusRate = playerBonus.speedBonusRate; } + + Bonus::BonusType Bonus::getRandomBonusType() + { + double rnd = static_cast(std::rand()) / RAND_MAX; + + if (rnd < 0.4) + return (static_cast(std::rand() % (DAMAGEINC - 1) + 1)); + return (NOTHING); + } } \ No newline at end of file diff --git a/sources/Items/Bonus.hpp b/sources/Items/Bonus.hpp index 185b5a26..25fa182c 100644 --- a/sources/Items/Bonus.hpp +++ b/sources/Items/Bonus.hpp @@ -29,5 +29,15 @@ namespace BBM { //! @param player the entity on which the effect will be applied //! @brief Apply bonus effect that allows to run faster static void SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis); + + enum BonusType { + NOTHING, + BOMBSTOCK, + SPEEDUP, + EXPLOSIONINC, + DAMAGEINC + }; + + static BonusType getRandomBonusType(); }; } \ No newline at end of file diff --git a/sources/Map/Map.cpp b/sources/Map/Map.cpp index 516f1ba0..cae0eda9 100644 --- a/sources/Map/Map.cpp +++ b/sources/Map/Map.cpp @@ -7,9 +7,12 @@ #include "System/Collision/CollisionSystem.hpp" #include "Map.hpp" #include -#include +#include +#include +#include namespace RAY3D = RAY::Drawables::Drawables3D; +using namespace std::chrono_literals; namespace BBM { @@ -29,9 +32,39 @@ namespace BBM mov->_velocity.z = 0; } - void MapGenerator::wallDestroyed(WAL::Entity &entity) + void MapGenerator::wallDestroyed(WAL::Entity &entity, WAL::Wal &wal) { entity.scheduleDeletion(); + auto &position = entity.getComponent().position; + static std::map map = { + {Bonus::BonusType::BOMBSTOCK, "assets/items/bombup"}, + {Bonus::BonusType::SPEEDUP, "assets/items/speedup"}, + //{BonusComponent::BonusType::EXPLOSIONINC, "assets/items/explosion"}, + {Bonus::BonusType::DAMAGEINC, "assets/items/fireup"} + }; + static std::vector> func = { + &Bonus::BombUpBonus, &Bonus::SpeedUpBonus, //&Bonus::ExplosionRangeBonus, + &Bonus::DamageIncreasedBonus + }; + auto bonusType = Bonus::getRandomBonusType(); + + if (bonusType == Bonus::BonusType::NOTHING) + return; + if (!map.contains(bonusType)) + return; + wal.scene->scheduleNewEntity("Bonus") + .addComponent(position) + .addComponent(1, [](WAL::Entity &entity, WAL::Wal &wal) { + entity.scheduleDeletion(); + }) + .addComponent(position.y) + .addComponent([](WAL::Entity &bonus, const WAL::Entity &player, CollisionComponent::CollidedAxis axis) { + bonus.scheduleDeletion(); + }, func[bonusType - 1], 0.25, .75) + .addComponent(5s, [](WAL::Entity &bonus, WAL::Wal &wal){ + bonus.scheduleDeletion(); + }) + .addComponent(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, "assets/items/items.png")); } const std::string MapGenerator::assetsPath = "./assets/"; @@ -150,7 +183,6 @@ namespace BBM scene->addEntity("Breakable Block") .addComponent(coords) .addComponent(1, &MapGenerator::wallDestroyed) - .addComponent() .addComponent( WAL::Callback(), &MapGenerator::wallCollide, 0.25, .75) diff --git a/sources/Map/Map.hpp b/sources/Map/Map.hpp index 4a961cbc..a6c9c5ed 100644 --- a/sources/Map/Map.hpp +++ b/sources/Map/Map.hpp @@ -21,6 +21,9 @@ #include "Component/Health/HealthComponent.hpp" #include "Component/Collision/CollisionComponent.hpp" #include "Component/Movable/MovableComponent.hpp" +#include + + namespace BBM { @@ -162,7 +165,7 @@ namespace BBM static void wallCollide(WAL::Entity &entity, const WAL::Entity &wall, CollisionComponent::CollidedAxis collidedAxis); - static void wallDestroyed(WAL::Entity &entity); + static void wallDestroyed(WAL::Entity &entity, WAL::Wal &wal); //! @param width Width of the map diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 2fd9a5af..201c677a 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -87,7 +87,7 @@ namespace BBM .addComponent() .addComponent() .addComponent() - .addComponent(1, [](WAL::Entity &entity) { + .addComponent(1, [](WAL::Entity &entity, WAL::Wal &wal) { auto &animation = entity.getComponent(); animation.setAnimIndex(5); }); diff --git a/sources/System/Bonus/PlayerBonusSystem.hpp b/sources/System/Bonus/PlayerBonusSystem.hpp index 6f0a08fa..b454ce6e 100644 --- a/sources/System/Bonus/PlayerBonusSystem.hpp +++ b/sources/System/Bonus/PlayerBonusSystem.hpp @@ -4,8 +4,8 @@ #pragma once -#include -#include +#include "System/System.hpp" +#include "Wal.hpp" #include "Models/Vector3.hpp" #include "Component/Bonus/PlayerBonusComponent.hpp" #include "Component/Controllable/ControllableComponent.hpp" diff --git a/sources/System/Controllable/ControllableSystem.cpp b/sources/System/Controllable/ControllableSystem.cpp index 0714fddc..16c82d82 100644 --- a/sources/System/Controllable/ControllableSystem.cpp +++ b/sources/System/Controllable/ControllableSystem.cpp @@ -14,7 +14,7 @@ namespace BBM : System(wal) {} - void ControllableSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) + void ControllableSystem::onFixedUpdate(WAL::ViewEntity &entity) { auto &controllable = entity.get(); auto &movable = entity.get(); diff --git a/sources/System/Controllable/ControllableSystem.hpp b/sources/System/Controllable/ControllableSystem.hpp index 268515c1..0a0d8c21 100644 --- a/sources/System/Controllable/ControllableSystem.hpp +++ b/sources/System/Controllable/ControllableSystem.hpp @@ -19,7 +19,7 @@ namespace BBM public: //! @inherit - void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; + void onFixedUpdate(WAL::ViewEntity &entity) override; //! @brief A default constructor explicit ControllableSystem(WAL::Wal &wal); diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 195aca97..d73f4ae2 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -12,7 +12,6 @@ #include #include "HealthSystem.hpp" #include "Component/Health/HealthComponent.hpp" -#include "Component/Bonus/BonusComponent.hpp" #include "Entity/Entity.hpp" #include "Items/Bonus.hpp" @@ -24,50 +23,13 @@ namespace BBM : System(wal) {} - void HealthSystem::_createBonus(Vector3f position, BonusComponent::BonusType bonusType, std::chrono::nanoseconds timer) - { - static std::map map = { - {BonusComponent::BonusType::BOMBSTOCK, "assets/items/bombup"}, - {BonusComponent::BonusType::SPEEDUP, "assets/items/speedup"}, - //{BonusComponent::BonusType::EXPLOSIONINC, "assets/items/explosion"}, - {BonusComponent::BonusType::DAMAGEINC, "assets/items/fireup"} - }; - static std::vector> func = { - &Bonus::BombUpBonus, &Bonus::SpeedUpBonus, //&Bonus::ExplosionRangeBonus, - &Bonus::DamageIncreasedBonus - }; - - if (bonusType == BonusComponent::BonusType::NOTHING) - return; - try { - this->_wal.scene->scheduleNewEntity("Bonus") - .addComponent(position) - .addComponent(1, [](WAL::Entity &entity) { - entity.scheduleDeletion(); - }) - .addComponent(position.y) - .addComponent([](WAL::Entity &bonus, const WAL::Entity &player, CollisionComponent::CollidedAxis axis) { - bonus.scheduleDeletion(); - }, func[bonusType - 1], 0.25, .75) - .addComponent(timer, [](WAL::Entity &bonus, WAL::Wal &wal){ - bonus.scheduleDeletion(); - }) - .addComponent(map.at(bonusType) + ".obj", std::make_pair(MAP_DIFFUSE, "assets/items/items.png")); - } catch (std::out_of_range const &err) {} - } - void HealthSystem::onFixedUpdate(WAL::ViewEntity &entity) { auto &health = entity.get(); auto &position = entity.get(); if (health.getHealthPoint() == 0) { - if (entity->hasComponent() && !entity->shouldDelete()) { - auto &bonus = entity->getComponent(); - auto bonusType = bonus.getRandomBonusType(); - this->_createBonus(position.position, bonusType, bonus.disappearTimer); - } - health.onDeath(entity); + health.onDeath(entity, this->_wal); } } } \ No newline at end of file diff --git a/sources/System/Health/HealthSystem.hpp b/sources/System/Health/HealthSystem.hpp index acfcd210..044e0347 100644 --- a/sources/System/Health/HealthSystem.hpp +++ b/sources/System/Health/HealthSystem.hpp @@ -5,7 +5,6 @@ #pragma once -#include #include "Models/Vector3.hpp" #include "Wal.hpp" #include "Component/Health/HealthComponent.hpp" @@ -17,9 +16,7 @@ namespace BBM class HealthSystem : public WAL::System { private: - //! @brief Spawn a bonus at the specified position. - void _createBonus(Vector3f position, BonusComponent::BonusType bonusType, std::chrono::nanoseconds timer); - public: + public: //! @inherit void onFixedUpdate(WAL::ViewEntity &entity) override; From 012e9ff05451a57d364c2fd89936509633fcfd00 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 14:58:45 +0200 Subject: [PATCH 20/43] removed positioncomponent into healthsystem --- sources/System/Health/HealthSystem.cpp | 3 +-- sources/System/Health/HealthSystem.hpp | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index d73f4ae2..e1a369c9 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -23,10 +23,9 @@ namespace BBM : System(wal) {} - void HealthSystem::onFixedUpdate(WAL::ViewEntity &entity) + void HealthSystem::onFixedUpdate(WAL::ViewEntity &entity) { auto &health = entity.get(); - auto &position = entity.get(); if (health.getHealthPoint() == 0) { health.onDeath(entity, this->_wal); diff --git a/sources/System/Health/HealthSystem.hpp b/sources/System/Health/HealthSystem.hpp index 044e0347..5f09cb1d 100644 --- a/sources/System/Health/HealthSystem.hpp +++ b/sources/System/Health/HealthSystem.hpp @@ -13,12 +13,12 @@ namespace BBM { //! @brief A system to handle Health entities. - class HealthSystem : public WAL::System + class HealthSystem : public WAL::System { private: public: //! @inherit - void onFixedUpdate(WAL::ViewEntity &entity) override; + void onFixedUpdate(WAL::ViewEntity &entity) override; //! @brief A default constructor explicit HealthSystem(WAL::Wal &wal); From 6d222869422d4ceca3dd8067ba0a3ce94259cc68 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 14:59:13 +0200 Subject: [PATCH 21/43] removed useless include --- sources/System/Health/HealthSystem.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index e1a369c9..07e247ee 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -3,17 +3,9 @@ // Edited by Benjamin Henry on 2021-05-20. // -#include -#include -#include -#include -#include "Component/Collision/CollisionComponent.hpp" -#include #include #include "HealthSystem.hpp" #include "Component/Health/HealthComponent.hpp" -#include "Entity/Entity.hpp" -#include "Items/Bonus.hpp" namespace RAY3D = RAY::Drawables::Drawables3D; From 0de77bcdfcee8fbcf958c15af7b690767c6ee01c Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 15:00:01 +0200 Subject: [PATCH 22/43] readded one include --- sources/System/Health/HealthSystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/System/Health/HealthSystem.cpp b/sources/System/Health/HealthSystem.cpp index 07e247ee..1f9ab156 100644 --- a/sources/System/Health/HealthSystem.cpp +++ b/sources/System/Health/HealthSystem.cpp @@ -3,6 +3,7 @@ // Edited by Benjamin Henry on 2021-05-20. // +#include #include #include "HealthSystem.hpp" #include "Component/Health/HealthComponent.hpp" From 78e5428bb6c3c26f013cef62365ab3b80bfe7777 Mon Sep 17 00:00:00 2001 From: "arthur.jamet" Date: Wed, 9 Jun 2021 16:09:47 +0200 Subject: [PATCH 23/43] fix bonus orientation --- assets/items/bombup.mtl | 2 +- assets/items/bombup.obj | 64 ++++++++++++++++++------------------ assets/items/fireup.mtl | 12 ++++++- assets/items/fireup.obj | 66 +++++++++++++++++++------------------- assets/items/speedup.mtl | 6 ++-- assets/items/speedup.obj | 64 ++++++++++++++++++------------------ assets/items/speedup.png~ | Bin 1142 -> 0 bytes assets/items/wallpass.mtl | 2 +- assets/items/wallpass.obj | 64 ++++++++++++++++++------------------ 9 files changed, 145 insertions(+), 135 deletions(-) delete mode 100644 assets/items/speedup.png~ diff --git a/assets/items/bombup.mtl b/assets/items/bombup.mtl index d2a7d74f..f00fb7b5 100644 --- a/assets/items/bombup.mtl +++ b/assets/items/bombup.mtl @@ -1,7 +1,7 @@ # Blender MTL File: 'None' # Material Count: 1 -newmtl mat_map_ob000_item_007 +newmtl mat_map_ob000_item_007.004 Ns 323.999994 Ka 1.000000 1.000000 1.000000 Kd 0.800000 0.800000 0.800000 diff --git a/assets/items/bombup.obj b/assets/items/bombup.obj index cf171182..898ade23 100644 --- a/assets/items/bombup.obj +++ b/assets/items/bombup.obj @@ -1,31 +1,31 @@ # Blender v2.93.0 OBJ File: '' # www.blender.org mtllib bombup.mtl -o map_ob000_item_02_bombup -v 0.400000 0.398345 -0.083348 -v 0.400000 -0.401481 -0.066619 -v -0.400000 0.398345 -0.083348 -v -0.400000 -0.401481 -0.066619 -v 0.400000 0.401481 0.066619 -v 0.400000 0.398345 -0.083348 -v -0.400000 0.401481 0.066619 -v -0.400000 0.398345 -0.083348 -v 0.400000 -0.398345 0.083348 -v 0.400000 0.401481 0.066619 -v -0.400000 -0.398345 0.083348 -v -0.400000 0.401481 0.066619 -v 0.400000 -0.401481 -0.066619 -v 0.400000 -0.398345 0.083348 -v -0.400000 -0.401481 -0.066619 -v -0.400000 -0.398345 0.083348 -v -0.400000 -0.401481 -0.066619 -v -0.400000 -0.398345 0.083348 -v -0.400000 0.398345 -0.083348 -v -0.400000 0.401481 0.066619 -v 0.400000 0.398345 -0.083348 -v 0.400000 0.401481 0.066619 -v 0.400000 -0.401481 -0.066619 -v 0.400000 -0.398345 0.083348 +o map_ob000_item_02_bombup.002 +v -0.406274 -0.087688 0.390996 +v -0.393549 -0.062236 -0.408499 +v 0.393625 -0.087688 0.403727 +v 0.406350 -0.062236 -0.395768 +v -0.406350 0.062236 0.395768 +v -0.406274 -0.087688 0.390996 +v 0.393549 0.062236 0.408499 +v 0.393625 -0.087688 0.403727 +v -0.393625 0.087688 -0.403727 +v -0.406350 0.062236 0.395768 +v 0.406274 0.087688 -0.390996 +v 0.393549 0.062236 0.408499 +v -0.393549 -0.062236 -0.408499 +v -0.393625 0.087688 -0.403727 +v 0.406350 -0.062236 -0.395768 +v 0.406274 0.087688 -0.390996 +v 0.406350 -0.062236 -0.395768 +v 0.406274 0.087688 -0.390996 +v 0.393625 -0.087688 0.403727 +v 0.393549 0.062236 0.408499 +v -0.406274 -0.087688 0.390996 +v -0.406350 0.062236 0.395768 +v -0.393549 -0.062236 -0.408499 +v -0.393625 0.087688 -0.403727 vt 0.001000 0.498000 vt 0.001000 0.252000 vt 0.124000 0.498000 @@ -50,13 +50,13 @@ vt 0.648280 0.996259 vt 0.632244 0.996259 vt 0.648280 0.754140 vt 0.632244 0.754140 -vn 0.0000 -0.0209 -0.9998 -vn 0.0000 0.9998 -0.0209 -vn 0.0000 0.0209 0.9998 -vn 0.0000 -0.9998 0.0209 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -usemtl mat_map_ob000_item_007 +vn 0.0005 -0.9995 -0.0318 +vn -0.0159 -0.0318 0.9994 +vn -0.0005 0.9995 0.0318 +vn 0.0159 0.0318 -0.9994 +vn 0.9999 0.0000 0.0159 +vn -0.9999 -0.0000 -0.0159 +usemtl mat_map_ob000_item_007.004 s 1 f 1/1/1 2/2/1 3/3/1 f 3/3/1 2/2/1 4/4/1 diff --git a/assets/items/fireup.mtl b/assets/items/fireup.mtl index 5b165d4a..a90b6641 100644 --- a/assets/items/fireup.mtl +++ b/assets/items/fireup.mtl @@ -1,2 +1,12 @@ # Blender MTL File: 'None' -# Material Count: 0 +# Material Count: 1 + +newmtl mat_map_ob000_item_007.005 +Ns 323.999994 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/assets/items/fireup.obj b/assets/items/fireup.obj index cf171182..8aefa489 100644 --- a/assets/items/fireup.obj +++ b/assets/items/fireup.obj @@ -1,31 +1,31 @@ # Blender v2.93.0 OBJ File: '' # www.blender.org -mtllib bombup.mtl -o map_ob000_item_02_bombup -v 0.400000 0.398345 -0.083348 -v 0.400000 -0.401481 -0.066619 -v -0.400000 0.398345 -0.083348 -v -0.400000 -0.401481 -0.066619 -v 0.400000 0.401481 0.066619 -v 0.400000 0.398345 -0.083348 -v -0.400000 0.401481 0.066619 -v -0.400000 0.398345 -0.083348 -v 0.400000 -0.398345 0.083348 -v 0.400000 0.401481 0.066619 -v -0.400000 -0.398345 0.083348 -v -0.400000 0.401481 0.066619 -v 0.400000 -0.401481 -0.066619 -v 0.400000 -0.398345 0.083348 -v -0.400000 -0.401481 -0.066619 -v -0.400000 -0.398345 0.083348 -v -0.400000 -0.401481 -0.066619 -v -0.400000 -0.398345 0.083348 -v -0.400000 0.398345 -0.083348 -v -0.400000 0.401481 0.066619 -v 0.400000 0.398345 -0.083348 -v 0.400000 0.401481 0.066619 -v 0.400000 -0.401481 -0.066619 -v 0.400000 -0.398345 0.083348 +mtllib fireup.mtl +o map_ob000_item_02_bombup.003 +v -0.401008 -0.084798 0.397024 +v -0.398980 -0.065157 -0.402734 +v 0.398990 -0.084798 0.399052 +v 0.401017 -0.065157 -0.400706 +v -0.401017 0.065157 0.400706 +v -0.401008 -0.084798 0.397024 +v 0.398980 0.065157 0.402734 +v 0.398990 -0.084798 0.399052 +v -0.398990 0.084798 -0.399052 +v -0.401017 0.065157 0.400706 +v 0.401008 0.084798 -0.397024 +v 0.398980 0.065157 0.402734 +v -0.398980 -0.065157 -0.402734 +v -0.398990 0.084798 -0.399052 +v 0.401017 -0.065157 -0.400706 +v 0.401008 0.084798 -0.397024 +v 0.401017 -0.065157 -0.400706 +v 0.401008 0.084798 -0.397024 +v 0.398990 -0.084798 0.399052 +v 0.398980 0.065157 0.402734 +v -0.401008 -0.084798 0.397024 +v -0.401017 0.065157 0.400706 +v -0.398980 -0.065157 -0.402734 +v -0.398990 0.084798 -0.399052 vt 0.001000 0.498000 vt 0.001000 0.252000 vt 0.124000 0.498000 @@ -50,13 +50,13 @@ vt 0.648280 0.996259 vt 0.632244 0.996259 vt 0.648280 0.754140 vt 0.632244 0.754140 -vn 0.0000 -0.0209 -0.9998 -vn 0.0000 0.9998 -0.0209 -vn 0.0000 0.0209 0.9998 -vn 0.0000 -0.9998 0.0209 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -usemtl mat_map_ob000_item_007 +vn 0.0001 -0.9997 -0.0246 +vn -0.0025 -0.0245 0.9997 +vn -0.0001 0.9997 0.0246 +vn 0.0025 0.0245 -0.9997 +vn 1.0000 0.0000 0.0025 +vn -1.0000 0.0000 -0.0025 +usemtl mat_map_ob000_item_007.005 s 1 f 1/1/1 2/2/1 3/3/1 f 3/3/1 2/2/1 4/4/1 diff --git a/assets/items/speedup.mtl b/assets/items/speedup.mtl index e2209d22..2bbe0a75 100644 --- a/assets/items/speedup.mtl +++ b/assets/items/speedup.mtl @@ -1,12 +1,12 @@ # Blender MTL File: 'None' # Material Count: 1 -newmtl mat_map_ob000_item_007.002 -Ns 323.999994 +newmtl mat_map_ob000_item_007.006 +Ns 225.000000 Ka 1.000000 1.000000 1.000000 Kd 0.800000 0.800000 0.800000 Ks 0.500000 0.500000 0.500000 Ke 0.000000 0.000000 0.000000 -Ni 1.000000 +Ni 1.450000 d 1.000000 illum 2 diff --git a/assets/items/speedup.obj b/assets/items/speedup.obj index c1db8bdd..514403db 100644 --- a/assets/items/speedup.obj +++ b/assets/items/speedup.obj @@ -1,31 +1,31 @@ # Blender v2.93.0 OBJ File: '' # www.blender.org mtllib speedup.mtl -o map_ob000_item_03_speedup -v 0.400000 0.397750 -0.086142 -v 0.400000 -0.401939 -0.063800 -v -0.400000 0.397750 -0.086142 -v -0.400000 -0.401939 -0.063800 -v 0.400000 0.401939 0.063800 -v 0.400000 0.397750 -0.086142 -v -0.400000 0.401939 0.063800 -v -0.400000 0.397750 -0.086142 -v 0.400000 -0.397750 0.086142 -v 0.400000 0.401939 0.063800 -v -0.400000 -0.397750 0.086142 -v -0.400000 0.401939 0.063800 -v 0.400000 -0.401939 -0.063800 -v 0.400000 -0.397750 0.086142 -v -0.400000 -0.401939 -0.063800 -v -0.400000 -0.397750 0.086142 -v -0.400000 -0.401939 -0.063800 -v -0.400000 -0.397750 0.086142 -v -0.400000 0.397750 -0.086142 -v -0.400000 0.401939 0.063800 -v 0.400000 0.397750 -0.086142 -v 0.400000 0.401939 0.063800 -v 0.400000 -0.401939 -0.063800 -v 0.400000 -0.397750 0.086142 +o map_ob000_item_03_speedup.001 +v -0.403210 -0.086631 0.394388 +v -0.396728 -0.063305 -0.405246 +v 0.396764 -0.086631 0.400873 +v 0.403246 -0.063305 -0.398762 +v -0.403246 0.063305 0.398762 +v -0.403210 -0.086631 0.394388 +v 0.396728 0.063305 0.405246 +v 0.396764 -0.086631 0.400873 +v -0.396764 0.086631 -0.400873 +v -0.403246 0.063305 0.398762 +v 0.403210 0.086631 -0.394388 +v 0.396728 0.063305 0.405246 +v -0.396728 -0.063305 -0.405246 +v -0.396764 0.086631 -0.400873 +v 0.403246 -0.063305 -0.398762 +v 0.403210 0.086631 -0.394388 +v 0.403246 -0.063305 -0.398762 +v 0.403210 0.086631 -0.394388 +v 0.396764 -0.086631 0.400873 +v 0.396728 0.063305 0.405246 +v -0.403210 -0.086631 0.394388 +v -0.403246 0.063305 0.398762 +v -0.396728 -0.063305 -0.405246 +v -0.396764 0.086631 -0.400873 vt 0.001000 0.748000 vt 0.001000 0.502000 vt 0.124000 0.748000 @@ -50,13 +50,13 @@ vt 0.648280 0.996259 vt 0.632244 0.996259 vt 0.648280 0.754140 vt 0.632244 0.754140 -vn 0.0000 -0.0279 -0.9996 -vn 0.0000 0.9996 -0.0279 -vn 0.0000 0.0279 0.9996 -vn 0.0000 -0.9996 0.0279 -vn -1.0000 -0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -usemtl mat_map_ob000_item_007.002 +vn 0.0002 -0.9996 -0.0292 +vn -0.0081 -0.0292 0.9995 +vn -0.0002 0.9996 0.0292 +vn 0.0081 0.0292 -0.9995 +vn 1.0000 0.0000 0.0081 +vn -1.0000 0.0000 -0.0081 +usemtl mat_map_ob000_item_007.006 s 1 f 1/1/1 2/2/1 3/3/1 f 3/3/1 2/2/1 4/4/1 diff --git a/assets/items/speedup.png~ b/assets/items/speedup.png~ deleted file mode 100644 index 9a3f6fa14b43f6378d1b3bf29e705fb17f855f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1142 zcmV-+1d02JP)>cGJ8MH%(={*fpE&wOI}Sslx*M4j3?vMGqdsf zN9u^sOb0Pd_ngsmI>o=^?V6CPR|(bY|9yXsro7?l5NZ$}(jC_q9uZD0`Htds;h0|3 z^1^$qWOD+$-Ewvda4RdDKm!hCMYY zwOwW>9vQ|-5+_HQ1uT3LQfdK;#Zi?W%uKavFXWeWR*%?Lx~c9G_LS z+!mayLEEjPx!RW$kr_5kcshdS8ECzP#<@yX-|HOSKz2o*=mNHPphxz%%zpx)RcGG3 zBM_+o000SaNLh0L04^f{04^f|c%?sf00085Nkl=FG?nQ=b%$mVkXK`{vp{QMzaH zPirjPU0MRBO$}b{95svqSu{Hk1txt%u*J+2Jl;IHfIr0171rSKmf8<~sFkK=O7ohk zv~df^Ftvthd(g=){5=LwrI95%PATqn`mgZ_$FKza*Hq!9UEMUCYe98**1ZmgC!ppN zHR@5B(lzSHhIJzx!*$azYaI^GANZ0b!Z9oX`;tcuP7AWmJbdm+zGP$BXuP)kFI{Uev#3O8+-geqUcWhNu_Y9fRyr(QFe&HCVuEPq_ES~$xouRp-ebm>t?qgD3{bz3A^@0vm3&*eoOcFis z=T*ESzPtjpsO^!SNq{Xkhcrs4!{IcX-;MT;0)LNBm%jSHzS`FP8w>s|>!o>Tjy8U& zVcMSJ)y`JKCFOTFZ|&Vs(Pwl4T=T`T`s!rj6CuK*U}re!A3qG4}&+4!x6VAxE<50oRULsYlV3IG5A07*qo IM6N<$g0yocz5oCK diff --git a/assets/items/wallpass.mtl b/assets/items/wallpass.mtl index 26ba44df..99cdab02 100644 --- a/assets/items/wallpass.mtl +++ b/assets/items/wallpass.mtl @@ -1,7 +1,7 @@ # Blender MTL File: 'None' # Material Count: 1 -newmtl mat_map_ob000_item_007.003 +newmtl mat_map_ob000_item_007.007 Ns 323.999994 Ka 1.000000 1.000000 1.000000 Kd 0.800000 0.800000 0.800000 diff --git a/assets/items/wallpass.obj b/assets/items/wallpass.obj index 919b15c3..bb67337a 100644 --- a/assets/items/wallpass.obj +++ b/assets/items/wallpass.obj @@ -1,31 +1,31 @@ # Blender v2.93.0 OBJ File: '' # www.blender.org mtllib wallpass.mtl -o map_ob000_item_14_wallthrough -v 0.400000 0.394974 -0.098087 -v 0.400000 -0.403679 -0.051660 -v -0.400000 0.394974 -0.098087 -v -0.400000 -0.403679 -0.051660 -v 0.400000 0.403679 0.051660 -v 0.400000 0.394974 -0.098087 -v -0.400000 0.403679 0.051660 -v -0.400000 0.394974 -0.098087 -v 0.400000 -0.394974 0.098087 -v 0.400000 0.403679 0.051660 -v -0.400000 -0.394974 0.098087 -v -0.400000 0.403679 0.051660 -v 0.400000 -0.403679 -0.051660 -v 0.400000 -0.394974 0.098087 -v -0.400000 -0.403679 -0.051660 -v -0.400000 -0.394974 0.098087 -v -0.400000 -0.403679 -0.051660 -v -0.400000 -0.394974 0.098087 -v -0.400000 0.394974 -0.098087 -v -0.400000 0.403679 0.051660 -v 0.400000 0.394974 -0.098087 -v 0.400000 0.403679 0.051660 -v 0.400000 -0.403679 -0.051660 -v 0.400000 -0.394974 0.098087 +o map_ob000_item_14_wallthrough.001 +v -0.406589 -0.098369 0.388116 +v -0.393149 -0.051371 -0.410391 +v 0.393297 -0.098369 0.401580 +v 0.406738 -0.051371 -0.396927 +v -0.406738 0.051371 0.396927 +v -0.406589 -0.098369 0.388116 +v 0.393149 0.051371 0.410391 +v 0.393297 -0.098369 0.401580 +v -0.393297 0.098369 -0.401580 +v -0.406738 0.051371 0.396927 +v 0.406589 0.098369 -0.388116 +v 0.393149 0.051371 0.410391 +v -0.393149 -0.051371 -0.410391 +v -0.393297 0.098369 -0.401580 +v 0.406738 -0.051371 -0.396927 +v 0.406589 0.098369 -0.388116 +v 0.406738 -0.051371 -0.396927 +v 0.406589 0.098369 -0.388116 +v 0.393297 -0.098369 0.401580 +v 0.393149 0.051371 0.410391 +v -0.406589 -0.098369 0.388116 +v -0.406738 0.051371 0.396927 +v -0.393149 -0.051371 -0.410391 +v -0.393297 0.098369 -0.401580 vt 0.501000 0.998000 vt 0.501000 0.752000 vt 0.624000 0.998000 @@ -50,13 +50,13 @@ vt 0.648280 0.996259 vt 0.632244 0.996259 vt 0.648280 0.754140 vt 0.632244 0.754140 -vn 0.0000 -0.0580 -0.9983 -vn 0.0000 0.9983 -0.0580 -vn 0.0000 0.0580 0.9983 -vn 0.0000 -0.9983 0.0580 -vn -1.0000 0.0000 0.0000 -vn 1.0000 -0.0000 0.0000 -usemtl mat_map_ob000_item_007.003 +vn 0.0010 -0.9983 -0.0587 +vn -0.0168 -0.0587 0.9981 +vn -0.0010 0.9983 0.0587 +vn 0.0168 0.0587 -0.9981 +vn 0.9999 -0.0000 0.0168 +vn -0.9999 0.0000 -0.0168 +usemtl mat_map_ob000_item_007.007 s 1 f 1/1/1 2/2/1 3/3/1 f 3/3/1 2/2/1 4/4/1 From 99729153a32a4b93106e4a7922e4c4ea9a8f1b00 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 16:16:48 +0200 Subject: [PATCH 24/43] deleted bad texture --- assets/bombs/explosion/explosion.png | Bin 2200 -> 0 bytes sources/System/BombHolder/BombHolderSystem.cpp | 7 ------- 2 files changed, 7 deletions(-) delete mode 100644 assets/bombs/explosion/explosion.png diff --git a/assets/bombs/explosion/explosion.png b/assets/bombs/explosion/explosion.png deleted file mode 100644 index 9ed5ab29d8312cedd491e59491625c5d0a9095bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 zcmV;J2xs?+P)Px#32;bRa{vGfQvd)9Qvv_G*>L~>0H{z*R7C>;0V)av zE(--T3DAo6Phy||7<_UMkjP4623ts|A|kbH5~6+Gyil#x%!+djJ2L|JZ-`UN!&Wg#Y!B z|Cd<*{*)b=QJ(++2YE?EK~z}7t(gl~8e0s7#}{I?_$(+&QHm51s8)pk|Icoco#f;k z7)rZt@G+~8Z|$`wGbfL#%A-kfLeV;wIHWi#g8xkZvelx0$p4}GV<@)OQYdrwiU1nq z6OjL!%A9?U0}i>`&(OO_HY}*3REb|LlrCtH&5W(sNEM}EHbMZ-XeI~AJ7bv&=0ymw zGcrrA^&(-Fs?dvzQ;Hi6x&*r**D4k)#0IKB33qmLCP5d<7STlh1K6=5mK+eOKneFH z1k-PnOqxYMtWueI zOVPRQ&=+4ZThQ!=NG31XMe=6wW-L3vRE83;?;&tP3t7x?uz8$JI0;ztK*W**p!WNd$z(d6j_7+zm&8^w z`CNjNV3o@WmSKfTN{Kld^(;msX0vLL6Bt>MoG7v8K?hWU-cz*c!y)X6Xx<8LstfRz z)F!b^WoVn?rvzUSTFGnRc<&%r%#B#53Ua{l$UlS)vPdq#$>Q9F0?SkaK0bbE(50Y> ztdiHjD!7$g5OWR7)O%1r&O;EIRJYmZ4BTjBPE_WC-Lvb26{cjbzn@=OGr*J;>_q?01-lVd zDR(-8xdF?>7YRl)*}>w33$`3KuI4VgYjPb+S{eHG@&G9B=1Jk{eoM6F{!@-Cuvq6%<YF z5O}eGU^Rj>!X6D6Y}`h?ZECN{6)t1nB?ue@ORAkScQh%uhgEngHgE|m+;f>W&qaJNKK(()^Y+xmi$}PZCHEqGjtB8MhG2d@ ztnh+Z#Pr1rP2Ud>YwriV&*T*9Wk%==!d^VT5*F{BE$_3vbZUl#cnU8x1xqY&(}E3a zx6Qanh%-Ol+Ww+kIvB?VUh9U1T(zOF_b{Aq*SQfYI2}a4{TTA&g5?g11KG~EqwK)& zgGf${aXOAQ{6HRaHD$-ph61AU>g>`_jCMTdrF@X$;qAq#bFQV*acpmO&obqPjDX;Q z*CjaWDKF^r<0X|Pv3%gWrpJ6E)jQS$WM!WfJYGmiC4~wtVYS@J$`a#db)S`~QmPwR z%E@PfzcQ4HRmZ0CEI%}<0Im+BU~w1)rBr@TLn~D0ukvMOs$zep!n&+~kAq-q19}NO z(`tPwF-BP}1-rBu(rlq6$~za~?rHO;-OyxeT}#&+0fDDBK(Y6+amhNZs%W!9gE7z! zgS#Q_T!yJ5@`h*{+KW)Fqt7ZDq8tp(#O8R?HtYPcz?O2g-}E*X-SHj3Wn*Yi6>Her z>%4tC_C7XmIHfb3XnUNxlmh2 zH{iidJF)pr4OqxJjk?$9>DWlbcCtxVG3ZKTIZQkaERr!jBh?snjn>9o8>dFuybl)V zqb?z1FgL+aZqoO$96YESpXtEQz@}Kolbv#q=wn0^%eQPJHVxJTSjVXk7*Xor^IIBw zVutv|2dZ%dygvWcVRf3QVx-EdJ2s@%F)gU#K`l17VlR%XF;|wsvW1V8&tw!XGxn_m zYXu*L@p>ABU;7mN`qHSUI}X^(2|LI(xYzh%WBb#z5ZJP5$hIQB5zv)DS~Q#)^z^S5 z7}*Bnz_%?}jND)=64oLIJ1$(BX+0FSLs;Z^=o+V_)^DDgYa62dw9JZIr*iG|r-jy* zMcLP|B};3v9kB+^7JIhY^VrYVdSPK$M{aIhZ~7*3-?xx)4Y}*;G$Y&Q^e9`JhPCO= zRDc6nHob@0j#r_+jNM_)>yqKKq7@#HDpjakoGm0LazKY@0czC0i9{xJE74oV1hiSz aiTw{`qE2)k3_^4O0000position.distance(bombPosition.position) > BombHolderSystem::explosionRadius) return; - wal.scene->scheduleNewEntity("explosion") - .addComponent(pos->position) - .addComponent(1s, [](WAL::Entity &explosion, WAL::Wal &wal) { - explosion.scheduleDeletion(); - }) - .addComponent("assets/bombs/explosion/explosion.glb", - std::make_pair(MAP_DIFFUSE, "assets/bombs/explosion/explosion.png")); // TODO do a raycast here to only remove health to entities that are not behind others. health->takeDmg(1); }); From 6667344592b5300976d1f7160868fc514dfd175e Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 9 Jun 2021 16:53:27 +0200 Subject: [PATCH 25/43] Making left and right block solids --- sources/Map/Map.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/sources/Map/Map.cpp b/sources/Map/Map.cpp index b5ca0268..44190315 100644 --- a/sources/Map/Map.cpp +++ b/sources/Map/Map.cpp @@ -72,9 +72,25 @@ namespace BBM static const std::string unbreakableObj = unbreakableWallPath + objExtension; static const std::string unbreakablePnj = unbreakableWallPath + imageExtension; + for (int i = 0; i < height; i++) { + scene->addEntity("Bomb stopper") + .addComponent(-1, 0, i) + .addComponent>(); + scene->addEntity("Bomb stopper") + .addComponent(width + 1, 0, i) + .addComponent>(); + } + for (int i = 0; i < width; i++) { + scene->addEntity("Bomb stopper") + .addComponent(i, 0, -1) + .addComponent>(); + scene->addEntity("Bomb stopper") + .addComponent(i, 0, height + 1) + .addComponent>(); + } + scene->addEntity("Bottom Wall") .addComponent(Vector3f((width + 1) / 2, 0, -1)) - .addComponent>() .addComponent( WAL::Callback(), &MapGenerator::wallCollide, Vector3f(-(width + 1) / 2 , 0.25, 0.25), Vector3f(width + 1, 2, 0.75)) @@ -83,7 +99,6 @@ namespace BBM RAY::Vector3(width + 3, 1, 1)); scene->addEntity("Upper Wall") .addComponent(Vector3f((width + 1) / 2, 0, height + 1)) - .addComponent>() .addComponent( WAL::Callback(), &MapGenerator::wallCollide, Vector3f(-(width + 1) / 2 , 0.25, 0.25), Vector3f(width + 1, 2, 0.75)) @@ -92,7 +107,6 @@ namespace BBM RAY::Vector3(width + 3, 1, 1)); scene->addEntity("Left Wall") .addComponent(Vector3f(width + 1, 0, height / 2)) - .addComponent>() .addComponent( WAL::Callback(), &MapGenerator::wallCollide, Vector3f(0.25, 0.25, -(height + 1) / 2 ), Vector3f(0.75, 2, height + 1)) From fdcea71fcd0ec2228efef29d9e46fa0a3ee33ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 9 Jun 2021 17:43:38 +0200 Subject: [PATCH 26/43] fixing keyboard (he was switching between a and d) --- .../Collision/CollisionComponent.hpp | 6 ++++ sources/Items/Bonus.cpp | 1 - sources/Map/Map.cpp | 29 ++++++++++--------- sources/Map/Map.hpp | 6 ++-- sources/System/Collision/CollisionSystem.cpp | 2 +- 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/sources/Component/Collision/CollisionComponent.hpp b/sources/Component/Collision/CollisionComponent.hpp index 06878a76..e4244a7a 100644 --- a/sources/Component/Collision/CollisionComponent.hpp +++ b/sources/Component/Collision/CollisionComponent.hpp @@ -23,8 +23,14 @@ namespace BBM }; //! @brief onCollide functions to be called + //! @param first self + //! @param second the entity you collided + //! @param third the collision axis (to know which axis collided) WAL::Callback onCollide; //! @brief onCollided functions to be called + //! @param first the entity that collided you + //! @param second self + //! @param third the collision axis (to know which axis collided) WAL::Callback onCollided; //! @brief Bound size on all axis Vector3f bound; diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 60365e05..3f9ec489 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -37,7 +37,6 @@ namespace BBM { void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { - std::cout << "soeed" << std::endl; if (bonus.shouldDelete()) return; auto *controllable = player.tryGetComponent(); diff --git a/sources/Map/Map.cpp b/sources/Map/Map.cpp index 5772e298..0554b742 100644 --- a/sources/Map/Map.cpp +++ b/sources/Map/Map.cpp @@ -17,10 +17,14 @@ using namespace std::chrono_literals; namespace BBM { - void MapGenerator::wallCollide(WAL::Entity &entity, - const WAL::Entity &wall, - CollisionComponent::CollidedAxis collidedAxis) + void MapGenerator::wallCollided(WAL::Entity &entity, + const WAL::Entity &wall, + CollisionComponent::CollidedAxis collidedAxis) { + auto name = entity.getName(); + if (name == "Unbreakable Wall" || name == "Breakable Block") { + name = "salut"; + } auto *mov = entity.tryGetComponent(); if (!mov) @@ -57,10 +61,9 @@ namespace BBM entity.scheduleDeletion(); }) .addComponent(position.y) - .addComponent(func[bonusType - 1], [](WAL::Entity &bonus, const WAL::Entity &player, CollisionComponent::CollidedAxis axis) { + .addComponent([](WAL::Entity &bonus, const WAL::Entity &player, CollisionComponent::CollidedAxis axis) { bonus.scheduleDeletion(); - std::cout << "called" << std::endl; - }, 0.5, .5) + }, func[bonusType - 1], 0.5, .5) .addComponent(5s, [](WAL::Entity &bonus, WAL::Wal &wal){ bonus.scheduleDeletion(); }) @@ -93,7 +96,7 @@ namespace BBM .addComponent>() .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, 0.25, .75) + &MapGenerator::wallCollided, 0.25, .75) .addComponent(unbreakableObj, std::make_pair(MAP_DIFFUSE, unbreakablePng)); } @@ -111,7 +114,7 @@ namespace BBM .addComponent>() .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, Vector3f(-(width + 1) / 2 , 0.25, 0.25), Vector3f(width + 1, 2, 0.75)) + &MapGenerator::wallCollided, Vector3f(-(width + 1) / 2 , 0.25, 0.25), Vector3f(width + 1, 2, 0.75)) .addComponent(unbreakableObj, std::make_pair(MAP_DIFFUSE, unbreakablePnj), RAY::Vector3(width + 3, 1, 1)); @@ -120,7 +123,7 @@ namespace BBM .addComponent>() .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, Vector3f(-(width + 1) / 2 , 0.25, 0.25), Vector3f(width + 1, 2, 0.75)) + &MapGenerator::wallCollided, Vector3f(-(width + 1) / 2 , 0.25, 0.25), Vector3f(width + 1, 2, 0.75)) .addComponent(unbreakableObj, std::make_pair(MAP_DIFFUSE, unbreakablePnj), RAY::Vector3(width + 3, 1, 1)); @@ -129,7 +132,7 @@ namespace BBM .addComponent>() .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, Vector3f(0.25, 0.25, -(height + 1) / 2 ), Vector3f(0.75, 2, height + 1)) + &MapGenerator::wallCollided, Vector3f(0.25, 0.25, -(height + 1) / 2 ), Vector3f(0.75, 2, height + 1)) .addComponent(unbreakableObj, std::make_pair(MAP_DIFFUSE, unbreakablePnj), RAY::Vector3(1, 1, height + 1)); @@ -137,7 +140,7 @@ namespace BBM .addComponent(Vector3f(-1, 0, height / 2)) .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, Vector3f(0.25, 0.25, -(height + 1) / 2 ), Vector3f(0.75, 2, height + 1)) + &MapGenerator::wallCollided, Vector3f(0.25, 0.25, -(height + 1) / 2 ), Vector3f(0.75, 2, height + 1)) .addComponent(unbreakableObj, std::make_pair(MAP_DIFFUSE, unbreakablePnj), RAY::Vector3(1, 1, height + 1)); @@ -189,7 +192,7 @@ namespace BBM .addComponent(1, &MapGenerator::wallDestroyed) .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, 0.25, .75) + &MapGenerator::wallCollided, 0.25, .75) .addComponent(breakableObj, std::make_pair(MAP_DIFFUSE, breakablePng)); } @@ -225,7 +228,7 @@ namespace BBM .addComponent>() .addComponent( WAL::Callback(), - &MapGenerator::wallCollide, 0.25, .75) + &MapGenerator::wallCollided, 0.25, .75) .addComponent(UnbreakableObj, std::make_pair(MAP_DIFFUSE, UnbreakablePng)); } diff --git a/sources/Map/Map.hpp b/sources/Map/Map.hpp index ea8da96c..8fb6da1c 100644 --- a/sources/Map/Map.hpp +++ b/sources/Map/Map.hpp @@ -155,9 +155,9 @@ namespace BBM static const std::string secondFloorHolePath; public: - static void wallCollide(WAL::Entity &entity, - const WAL::Entity &wall, - CollisionComponent::CollidedAxis collidedAxis); + static void wallCollided(WAL::Entity &entity, + const WAL::Entity &wall, + CollisionComponent::CollidedAxis collidedAxis); static void wallDestroyed(WAL::Entity &entity, WAL::Wal &wal); diff --git a/sources/System/Collision/CollisionSystem.cpp b/sources/System/Collision/CollisionSystem.cpp index bb12b32f..db68e3c0 100644 --- a/sources/System/Collision/CollisionSystem.cpp +++ b/sources/System/Collision/CollisionSystem.cpp @@ -69,7 +69,7 @@ namespace BBM collidedAxis += CollisionComponent::CollidedAxis::Z; } if (collidedAxis) { - colA.onCollide(other, entity, static_cast(collidedAxis)); + colA.onCollide(entity, other, static_cast(collidedAxis)); colB.onCollided(entity, other, static_cast(collidedAxis)); } } From 1dd4e0b22d9216889035c062b1512b96ca9b6a88 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 9 Jun 2021 18:00:15 +0200 Subject: [PATCH 27/43] Starting a bomb system --- CMakeLists.txt | 2 +- sources/Component/Bomb/BasicBombComponent.cpp | 7 ++--- sources/Component/Bomb/BasicBombComponent.hpp | 6 ++++- sources/System/Bomb/BombSystem.cpp | 20 ++++++++++++++ sources/System/Bomb/BombSystem.hpp | 27 +++++++++++++++++++ .../System/BombHolder/BombHolderSystem.cpp | 8 +++--- .../System/BombHolder/BombHolderSystem.hpp | 2 +- 7 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 sources/System/Bomb/BombSystem.cpp create mode 100644 sources/System/Bomb/BombSystem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fff0473e..bcaa0c02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,7 +102,7 @@ set(SOURCES sources/System/Sound/PlayerSoundManagerSystem.hpp sources/System/Music/MusicSystem.hpp sources/System/Music/MusicSystem.cpp -) + sources/System/Bomb/BombSystem.cpp sources/System/Bomb/BombSystem.hpp) add_executable(bomberman sources/main.cpp ${SOURCES} diff --git a/sources/Component/Bomb/BasicBombComponent.cpp b/sources/Component/Bomb/BasicBombComponent.cpp index 4c6f74af..dcf9627e 100644 --- a/sources/Component/Bomb/BasicBombComponent.cpp +++ b/sources/Component/Bomb/BasicBombComponent.cpp @@ -6,14 +6,15 @@ namespace BBM { - BasicBombComponent::BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius) + BasicBombComponent::BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius, int ownerID) : WAL::Component(entity), damage(damage), - explosionRadius(explosionRadius) + explosionRadius(explosionRadius), + ownerID(ownerID) {} WAL::Component *BasicBombComponent::clone(WAL::Entity &entity) const { - return new BasicBombComponent(entity, this->damage, this->explosionRadius); + return new BasicBombComponent(entity, this->damage, this->explosionRadius, this->ownerID); } } \ No newline at end of file diff --git a/sources/Component/Bomb/BasicBombComponent.hpp b/sources/Component/Bomb/BasicBombComponent.hpp index f9225a54..988304d2 100644 --- a/sources/Component/Bomb/BasicBombComponent.hpp +++ b/sources/Component/Bomb/BasicBombComponent.hpp @@ -19,12 +19,16 @@ namespace BBM const float explosionRadius = 3; //! @brief The damage made by the explosion on an entity const int damage = 1; + //! @brief The ID of the owner. + int ownerID; + //! @brief Should collisions with the owner be disabled.² + bool ignoreOwner = true; //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; //! @brief A component can't be instantiated, it should be derived. - explicit BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius); + explicit BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius, int ownerID); //! @brief A component can't be instantiated, it should be derived. BasicBombComponent(const BasicBombComponent &) = default; diff --git a/sources/System/Bomb/BombSystem.cpp b/sources/System/Bomb/BombSystem.cpp new file mode 100644 index 00000000..c9b11fcc --- /dev/null +++ b/sources/System/Bomb/BombSystem.cpp @@ -0,0 +1,20 @@ +// +// Created by Zoe Roux on 6/9/21. +// + +#include "BombSystem.hpp" + +namespace BBM +{ + BombSystem::BombSystem(WAL::Wal &wal) + : System(wal) + { + + } + + void BombSystem::onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) + { +// if (entity.get().) + // TODO set ignoreOwner to false once the player moved out of the block. + } +} diff --git a/sources/System/Bomb/BombSystem.hpp b/sources/System/Bomb/BombSystem.hpp new file mode 100644 index 00000000..f84ee7b9 --- /dev/null +++ b/sources/System/Bomb/BombSystem.hpp @@ -0,0 +1,27 @@ +// +// Created by Zoe Roux on 6/9/21. +// + +#pragma once + +#include +#include "Component/Bomb/BasicBombComponent.hpp" + +namespace BBM +{ + class BombSystem : public WAL::System + { + public: + //! @inherit + void onUpdate(WAL::ViewEntity &entity, std::chrono::nanoseconds dtime) override; + + //! @brief Construct a new bomb system. + explicit BombSystem(WAL::Wal &wal); + //! @brief A bomb system is copy constructable + BombSystem(const BombSystem &) = default; + //! @brief A default destructor + ~BombSystem() override = default; + //! @brief A bomb system can't be assigned. + BombSystem operator=(const BombSystem &) = delete; + }; +} diff --git a/sources/System/BombHolder/BombHolderSystem.cpp b/sources/System/BombHolder/BombHolderSystem.cpp index d862f5fe..eaf5ddf0 100644 --- a/sources/System/BombHolder/BombHolderSystem.cpp +++ b/sources/System/BombHolder/BombHolderSystem.cpp @@ -25,7 +25,7 @@ namespace BBM CollisionComponent::CollidedAxis collidedAxis) { auto &bombInfo = bomb.getComponent(); - if (bombInfo.skipOwner && bombInfo.owner == entity) + if (bombInfo.ignoreOwner && bombInfo.ownerID == entity.getUid()) return; return MapGenerator::wallCollide(entity, bomb, collidedAxis); } @@ -62,11 +62,11 @@ namespace BBM _dispatchExplosion(position, wal, 3 + (explosionRadius - 3)); } - void BombHolderSystem::_spawnBomb(Vector3f position, BombHolderComponent &holder) + void BombHolderSystem::_spawnBomb(Vector3f position, BombHolderComponent &holder, int id) { this->_wal.scene->scheduleNewEntity("Bomb") .addComponent(position.round()) - .addComponent(holder.damage, holder.explosionRadius) + .addComponent(holder.damage, holder.explosionRadius, id) .addComponent(BombHolderSystem::explosionTimer, &BombHolderSystem::_bombExplosion) .addComponent(WAL::Callback(), &BombHolderSystem::_bombCollide, 0.25, .75) @@ -84,7 +84,7 @@ namespace BBM if (controllable.bomb && holder.bombCount > 0) { holder.bombCount--; - this->_spawnBomb(position.position, holder); + this->_spawnBomb(position.position, holder, entity->getUid()); } if (holder.bombCount < holder.maxBombCount) { holder.nextBombRefill -= dtime; diff --git a/sources/System/BombHolder/BombHolderSystem.hpp b/sources/System/BombHolder/BombHolderSystem.hpp index 98449318..04ccc324 100644 --- a/sources/System/BombHolder/BombHolderSystem.hpp +++ b/sources/System/BombHolder/BombHolderSystem.hpp @@ -19,7 +19,7 @@ namespace BBM { private: //! @brief Spawn a bomb at the specified position. - void _spawnBomb(Vector3f position, BombHolderComponent &holder); + void _spawnBomb(Vector3f position, BombHolderComponent &holder, int id); //! @brief Spawn a bomb at the specified position. static void _dispatchExplosion(Vector3f position, WAL::Wal &, int count); From 2955cd76a76ab1efec35faf35e91b9236c9c8244 Mon Sep 17 00:00:00 2001 From: HENRY Benjamin Date: Wed, 9 Jun 2021 22:22:27 +0200 Subject: [PATCH 28/43] added a bandage to a huge wound (collisionsystem wasn't calling the two callbacks, just one, now it's still only one, but the bonuses are applied only if you're on them --- sources/Items/Bonus.cpp | 16 ++++++++-------- sources/Items/Bonus.hpp | 3 +-- sources/Map/Map.cpp | 4 ---- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 3f9ec489..47a5c2ba 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -12,35 +12,35 @@ namespace BBM { void Bonus::BombUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { - if (bonus.shouldDelete()) + if (bonus.shouldDelete() || axis != 7) return; auto *bombHolder = player.tryGetComponent(); - if (bombHolder == nullptr) + if (!bombHolder) return; bombHolder->maxBombCount++; } void Bonus::ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { - static int test = 0; - if (bonus.shouldDelete()) + if (bonus.shouldDelete() || axis != 7) return; auto *bombHolder = player.tryGetComponent(); auto *playerBonus = player.tryGetComponent(); - if (bombHolder == nullptr || playerBonus == nullptr) + if (!bombHolder || !playerBonus) return; if (bombHolder->explosionRadius <= 6) bombHolder->explosionRadius++; - std::cout << ++test << " Explosion radius : " << bombHolder->explosionRadius << std::endl; playerBonus->nextRangeBonusRate = playerBonus->rangeBonusRate; } void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { - if (bonus.shouldDelete()) + if (bonus.shouldDelete() || axis != 7) return; auto *controllable = player.tryGetComponent(); auto *playerBonus = player.tryGetComponent(); + if (!controllable || !playerBonus) + return; controllable->speed = 0.35f; playerBonus->nextSpeedBonusRate = playerBonus->speedBonusRate; } @@ -50,7 +50,7 @@ namespace BBM { double rnd = static_cast(std::rand()) / RAND_MAX; if (rnd < 0.8) - return (static_cast(std::rand() % (DAMAGEINC - 1) + 1)); + return (static_cast(std::rand() % (EXPLOSIONINC - 1) + 1)); return (NOTHING); } } \ No newline at end of file diff --git a/sources/Items/Bonus.hpp b/sources/Items/Bonus.hpp index 25fa182c..6c15efd4 100644 --- a/sources/Items/Bonus.hpp +++ b/sources/Items/Bonus.hpp @@ -34,8 +34,7 @@ namespace BBM { NOTHING, BOMBSTOCK, SPEEDUP, - EXPLOSIONINC, - DAMAGEINC + EXPLOSIONINC }; static BonusType getRandomBonusType(); diff --git a/sources/Map/Map.cpp b/sources/Map/Map.cpp index 0554b742..28242cc8 100644 --- a/sources/Map/Map.cpp +++ b/sources/Map/Map.cpp @@ -21,10 +21,6 @@ namespace BBM const WAL::Entity &wall, CollisionComponent::CollidedAxis collidedAxis) { - auto name = entity.getName(); - if (name == "Unbreakable Wall" || name == "Breakable Block") { - name = "salut"; - } auto *mov = entity.tryGetComponent(); if (!mov) From 40a281cfe600a02a3d243eabdac800eabafe2fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 10 Jun 2021 00:14:36 +0200 Subject: [PATCH 29/43] adding 2 tests on collision components callbacks --- tests/CollisionTest.cpp | 98 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/tests/CollisionTest.cpp b/tests/CollisionTest.cpp index 164c6aae..5261dc8f 100644 --- a/tests/CollisionTest.cpp +++ b/tests/CollisionTest.cpp @@ -1,4 +1,4 @@ -// + // Created by Louis Auzuret on 5/31/21. // @@ -61,7 +61,7 @@ TEST_CASE("Collision test", "[Component][System]") } -TEST_CASE("Collsion test with movable", "[Component][System]") +TEST_CASE("Collision test with movable", "[Component][System]") { Wal wal; CollisionSystem collision(wal); @@ -99,6 +99,100 @@ TEST_CASE("Collsion test with movable", "[Component][System]") REQUIRE(entity.getComponent().position.z == 0.0); } + +TEST_CASE("Collision test callbacks calls", "[Component][System]") +{ + int nbCallbacksCalled = 0; + Wal wal; + CollisionSystem collision(wal); + MovableSystem movable(wal); + + wal.scene = std::make_shared(); + + wal.scene->addEntity("player") + .addComponent() + .addComponent( + [&nbCallbacksCalled](Entity &actual, const Entity &, int) { nbCallbacksCalled++; }, + [&nbCallbacksCalled](Entity &actual, const Entity &, int) { nbCallbacksCalled++; }, 0, 5.0) + .addComponent(); + + wal.scene->addEntity("block") + .addComponent(0, 0, 0) + .addComponent( + [&nbCallbacksCalled](Entity &actual, const Entity &, int) { nbCallbacksCalled++; }, + [&nbCallbacksCalled](Entity &actual, const Entity &, int) { + nbCallbacksCalled++; + try { + auto &mov = actual.getComponent(); + mov._velocity = Vector3f(); + } catch (std::exception &e) {}; + }, 0, 1); + Entity &entity = wal.scene->getEntities().front(); + REQUIRE(entity.getComponent().position == Vector3f()); + + entity.getComponent().bound.x = 5; + entity.getComponent().bound.y = 5; + entity.getComponent().bound.z = 5; + + entity.getComponent().addForce({1, 1, 1}); + collision.update(std::chrono::nanoseconds(1)); + collision.fixedUpdate(); + movable.update(std::chrono::nanoseconds(1)); + movable.fixedUpdate(); + REQUIRE(nbCallbacksCalled == 4); + REQUIRE(entity.getComponent().position.x == 0.0); + REQUIRE(entity.getComponent().position.y == 0.0); + REQUIRE(entity.getComponent().position.z == 0.0); +} + +TEST_CASE("Collision test callbacks args", "[Component][System]") +{ + int nbCallbacksCalled = 0; + Wal wal; + CollisionSystem collision(wal); + MovableSystem movable(wal); + + wal.scene = std::make_shared(); + + wal.scene->addEntity("player") + .addComponent() + .addComponent( + [&nbCallbacksCalled](Entity &actual, const Entity &other, int) { + nbCallbacksCalled++; + REQUIRE(actual.getName() == "player"); + REQUIRE(other.getName() == "block"); + }, + [&nbCallbacksCalled](Entity &actual, const Entity &other, int) { + nbCallbacksCalled++; + REQUIRE(other.getName() == "player"); + REQUIRE(actual.getName() == "block"); + }, 0, 5.0); + + wal.scene->addEntity("block") + .addComponent(0, 0, 0) + .addComponent( + [&nbCallbacksCalled](Entity &actual, const Entity &other, int) { + nbCallbacksCalled++; + REQUIRE(other.getName() == "player"); + REQUIRE(actual.getName() == "block"); + }, + [&nbCallbacksCalled](Entity &actual, const Entity &other, int) { + nbCallbacksCalled++; + REQUIRE(actual.getName() == "player"); + REQUIRE(other.getName() == "block"); + }, 0, 1); + Entity &entity = wal.scene->getEntities().front(); + REQUIRE(entity.getComponent().position == Vector3f()); + + entity.getComponent().bound.x = 5; + entity.getComponent().bound.y = 5; + entity.getComponent().bound.z = 5; + + collision.update(std::chrono::nanoseconds(1)); + collision.fixedUpdate(); + REQUIRE(nbCallbacksCalled == 4); +} + TEST_CASE("Vector round", "[Vector]") { Vector3f v(1.3, 1.5, 1.7); From 5646c0ecbd907e869ae5e6d8faa3d44391027138 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 10 Jun 2021 11:31:32 +0200 Subject: [PATCH 30/43] Bomb collisions should be good --- sources/Component/Bomb/BasicBombComponent.cpp | 2 +- sources/Component/Bomb/BasicBombComponent.hpp | 6 +++--- sources/Runner/Runner.cpp | 16 +++----------- sources/System/Bomb/BombSystem.cpp | 21 +++++++++++++------ sources/System/Bomb/BombSystem.hpp | 5 +++-- .../System/BombHolder/BombHolderSystem.cpp | 7 ++++--- .../System/BombHolder/BombHolderSystem.hpp | 5 +++-- 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/sources/Component/Bomb/BasicBombComponent.cpp b/sources/Component/Bomb/BasicBombComponent.cpp index dcf9627e..97cbb70d 100644 --- a/sources/Component/Bomb/BasicBombComponent.cpp +++ b/sources/Component/Bomb/BasicBombComponent.cpp @@ -6,7 +6,7 @@ namespace BBM { - BasicBombComponent::BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius, int ownerID) + BasicBombComponent::BasicBombComponent(WAL::Entity &entity, int damage, int explosionRadius, unsigned ownerID) : WAL::Component(entity), damage(damage), explosionRadius(explosionRadius), diff --git a/sources/Component/Bomb/BasicBombComponent.hpp b/sources/Component/Bomb/BasicBombComponent.hpp index 988304d2..1b9b46bf 100644 --- a/sources/Component/Bomb/BasicBombComponent.hpp +++ b/sources/Component/Bomb/BasicBombComponent.hpp @@ -16,11 +16,11 @@ namespace BBM { public: //! @brief The radius of the explosion. - const float explosionRadius = 3; + const int explosionRadius = 3; //! @brief The damage made by the explosion on an entity const int damage = 1; //! @brief The ID of the owner. - int ownerID; + unsigned ownerID; //! @brief Should collisions with the owner be disabled.² bool ignoreOwner = true; @@ -28,7 +28,7 @@ namespace BBM WAL::Component *clone(WAL::Entity &entity) const override; //! @brief A component can't be instantiated, it should be derived. - explicit BasicBombComponent(WAL::Entity &entity, int damage, float explosionRadius, int ownerID); + explicit BasicBombComponent(WAL::Entity &entity, int damage, int explosionRadius, unsigned ownerID); //! @brief A component can't be instantiated, it should be derived. BasicBombComponent(const BasicBombComponent &) = default; diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 6a9217f3..0601b681 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -7,12 +7,7 @@ #include "System/Movable/MovableSystem.hpp" #include "System/Renderer/RenderSystem.hpp" #include -#include -#include #include -#include