// // Created by HENRY Benjamin on 02/06/2021. // #include #include #include #include "Component/Speed/SpeedComponent.hpp" #include #include "Component/Movable/MovableComponent.hpp" #include "Bonus.hpp" #include #include #include "Component/BombHolder/BombHolderComponent.hpp" namespace BBM { void Bonus::BombUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete() || axis != CollisionComponent::CollidedAxis::ALL) return; auto *bombHolder = player.tryGetComponent(); if (!bombHolder) return; bombHolder->maxBombCount++; const_cast(bonus).scheduleDeletion(); } void Bonus::ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete() || axis != CollisionComponent::CollidedAxis::ALL) return; auto *bombHolder = player.tryGetComponent(); auto *playerBonus = player.tryGetComponent(); if (!bombHolder || !playerBonus) return; bombHolder->explosionRadius++; const_cast(bonus).scheduleDeletion(); } void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete() || axis != CollisionComponent::CollidedAxis::ALL) return; auto *speed = player.tryGetComponent(); auto *playerBonus = player.tryGetComponent(); if (!speed || !playerBonus) return; if (speed->speed >= 0.4) return; speed->speed += 0.025f; const_cast(bonus).scheduleDeletion(); } void Bonus::NoClipBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) { if (bonus.shouldDelete() || axis != CollisionComponent::CollidedAxis::ALL) return; auto *playerBonus = player.tryGetComponent(); if (!playerBonus) return; playerBonus->nextNoClipRate = playerBonus->noClipBonusRate; playerBonus->isNoClipOn = true; const_cast(bonus).scheduleDeletion(); } Bonus::BonusType Bonus::getRandomBonusType() { static std::default_random_engine generator(time(nullptr)); std::map chanceValue = { {NOTHING, 100.0f}, {BOMBSTOCK, 46.5f}, {SPEEDUP, 31.5f}, {EXPLOSIONINC, 16.5f}, {NOCLIP, 1.5f}, }; std::uniform_int_distribution distribution(1,1000); float value = (distribution(generator) / 10); BonusType bonus = NOTHING; for (auto &chance : chanceValue) if (chance.second > value) bonus = chance.first; return (bonus); } }