feat: add kill reward + effect damages

This commit is contained in:
2021-11-05 13:10:42 +01:00
parent d75fdd64b3
commit 524af9ad5f
6 changed files with 94 additions and 18 deletions

View File

@@ -14,16 +14,19 @@ bool Mob::isImmuneTo(EffectType type) {
return std::find(getEffectImmunities().begin(), getEffectImmunities().end(), type) != getEffectImmunities().end();
}
void Mob::addEffect(EffectType effectType, float durationSec) {
EffectDuration& Mob::getEffect(EffectType effectType){
return *std::find_if(m_Effects.begin(), m_Effects.end(), [&effectType](EffectDuration effect) { return effect.type == effectType;});
}
void Mob::addEffect(EffectType effectType, float durationSec, const Tower* tower) {
if (isImmuneTo(effectType))
return;
if (hasEffect(effectType)) {
auto it = std::find_if(m_Effects.begin(), m_Effects.end(), [&effectType](EffectDuration effect) { return effect.first == effectType;});
EffectDuration& effect = *it;
if (effect.second < durationSec)
effect.second = durationSec; // setting new duration if it's greater then the actual
EffectDuration& effect = getEffect(effectType);
if (effect.duration < durationSec)
effect.duration = durationSec; // setting new duration if it's greater then the actual
} else {
m_Effects.push_back({ effectType, durationSec });
m_Effects.push_back({ effectType, durationSec, tower });
}
}
@@ -35,14 +38,54 @@ void Mob::updateEffects(std::uint64_t delta) {
float deltaSec = (float)delta / 1000.0f;
for (std::size_t i = 0; i < m_Effects.size(); i++) {
EffectDuration& effect = m_Effects[i];
effect.second -= deltaSec;
if (effect.second < 0) // effect has gone
effect.duration -= deltaSec;
if (effect.duration < 0){ // effect has gone
m_Effects.erase(m_Effects.begin() + i);
switch(effect.type){
case EffectType::Fire:{
m_EffectFireTimer.reset();
break;
}
case EffectType::Poison:{
m_EffectPoisonTimer.reset();
break;
}
case EffectType::Heal:{
m_EffectHealTimer.reset();
}
default:
break;
}
}
}
if(hasEffect(EffectType::Fire)){
if(m_EffectFireTimer.update(delta)){
damage(3);
if(isDead()){
setKillTower(getEffect(EffectType::Fire).tower);
}
}
}
if(hasEffect(EffectType::Poison)){
if(m_EffectPoisonTimer.update(delta)){
damage(1);
if(isDead()){
setKillTower(getEffect(EffectType::Poison).tower);
}
}
}
if(hasEffect(EffectType::Heal)){
if(m_EffectFireTimer.update(delta)){
heal(10);
}
}
}
bool Mob::hasEffect(EffectType type) {
return std::find_if(m_Effects.begin(), m_Effects.end(), [&type](EffectDuration effect) { return effect.first == type;}) != m_Effects.end();
return std::find_if(m_Effects.begin(), m_Effects.end(), [&type](EffectDuration effect) { return effect.type == type;}) != m_Effects.end();
}

View File

@@ -192,7 +192,7 @@ void IceTower::tick(std::uint64_t delta, World* world) {
bool wasTowerActive = false;
for (MobPtr mob : world->getMobList()) {
if (isMobInRange(mob)) {
mob->addEffect(EffectType::Slowness, 1); // slowness for 1s every second
mob->addEffect(EffectType::Slowness, 1, this); // slowness for 1s every second
mob->damage(damage);
wasTowerActive = true;
}
@@ -207,7 +207,7 @@ void MageTower::tick(std::uint64_t delta, World* world) {
bool wasTowerActive = false;
for (MobPtr mob : world->getMobList()) {
if (isMobInRange(mob)) {
mob->addEffect(EffectType::Fire, getLevel().getLevel()); // slowness for 1s every second
mob->addEffect(EffectType::Fire, getLevel().getLevel() * 5, this);
wasTowerActive = true;
}
}

View File

@@ -243,6 +243,15 @@ void World::cleanDeadMobs() {
for (std::size_t i = 0; i < m_Mobs.size(); i++) {
MobPtr mob = m_Mobs[i];
if (!mob->isAlive()) {
mob->OnDeath(this);
//reward players
Player& sender = m_Game->getPlayerById(mob->getSender());
sender.addEXP(mob->getStats()->getExpReward());
Player& killer = m_Game->getPlayerById(mob->getKillTower()->getBuilder());
killer.addGold(mob->getStats()->getMoneyCost());
m_Mobs.erase(m_Mobs.begin() + i);
}
}
@@ -271,6 +280,8 @@ void World::OnArrowShot(MobPtr target, Tower* shooter) {
// aoe damage
} else {
target->damage(shooter->getStats()->getDamage());
if(target->isDead())
target->setKillTower(shooter);
}
}