diff --git a/core/src/Effect.cpp b/core/src/Effect.cpp index 87beb2e..fea5573 100644 --- a/core/src/Effect.cpp +++ b/core/src/Effect.cpp @@ -181,3 +181,54 @@ EffectModifier effectModifiers(const EffectSet& set) { return modifier; } +EffectSet::Pending tickEffects(EffectSet& set) { + EffectSet::Pending pending; + for (EffectInstance& effect : set.active) { + if (effect.durationTicks <= 0) continue; + switch (effect.kind) { + case EffectKind::InstantHealth: + pending.instantHeal += + static_cast(4 << std::min(effect.amplifier, 8)) * effect.potency; + break; + case EffectKind::InstantDamage: + pending.instantDamage += + static_cast(6 << std::min(effect.amplifier, 8)) * effect.potency; + break; + default: break; + } + int interval = periodicIntervalTicks(effect.kind, effect.amplifier); + if (interval > 0 && effect.durationTicks % interval == 0) { + switch (effect.kind) { + case EffectKind::Regeneration: pending.regenerationHeal += 1.0f; break; + case EffectKind::Poison: pending.poisonDamage += 1.0f; break; + case EffectKind::Wither: pending.witherDamage += 1.0f; break; + case EffectKind::Saturation: + pending.saturationGain += static_cast(effect.level()); + break; + default: break; + } + } + --effect.durationTicks; + } + std::size_t before = set.active.size(); + set.active.erase(std::remove_if(set.active.begin(), set.active.end(), + [](const EffectInstance& e) { return e.durationTicks <= 0; }), + set.active.end()); + pending.expiredCount = static_cast(before - set.active.size()); + return pending; +} + +float applyEffectTick(const EffectSet::Pending& pending, float& health, float maxHealth) { + float before = health; + float heal = pending.regenerationHeal + pending.instantHeal; + if (heal > 0.0f) health = std::min(maxHealth, health + heal); + if (pending.poisonDamage > 0.0f) { + float survivable = clampZero(health - 1.0f); + health -= std::min(pending.poisonDamage, survivable); + } + float lethal = pending.witherDamage + pending.instantDamage; + if (lethal > 0.0f) health = clampZero(health - lethal); + return health - before; +} + +} // namespace vf