Example #1
0
        // todo : do something more general (ghost actors)
        private void CumulEffects(SpellEffectHandler handler, ref SpellTarget spellImpact, FightActor target, Spell spell)
        {
            var effect   = handler.Dice;
            var isFriend = Fighter.Team.Id == target.Team.Id;
            var result   = new SpellTarget();

            var category = SpellIdentifier.GetEffectCategories(effect.EffectId);

            if (category == 0)
            {
                return;
            }

            if (Fighter is SummonedTurret)
            {
                isFriend = category == SpellCategory.Healing;
            }

            var chanceToHappen = 1.0; //

            // When chances to happen is under 100%, then we reduce spellImpact accordingly, for simplicity, but after having apply damage bonus & reduction.
            // So average damage should remain exact even if Min and Max are not.
            if (effect.Random > 0)
            {
                chanceToHappen = effect.Random / 100.0;
            }

            if ((target is SummonedFighter))
            {
                chanceToHappen /= 2; // It's much better to hit non-summoned foes => effect on summons (except allies summon for Osa) is divided by 2.
            }
            uint min;
            uint max;

            if (handler is DamagePerHPLost)
            {
                min = max = (uint)Math.Round(((Fighter.Stats.Health.DamageTaken * effect.DiceNum) / 100d));
            }
            else if (handler is Kill && target != Fighter) // doesn't take sacrifice in account
            {
                min = max = (uint)target.LifePoints;
            }
            else
            {
                min = (uint)Math.Min(effect.DiceNum, effect.DiceFace);
                max = (uint)Math.Max(effect.DiceNum, effect.DiceFace);
            }

            if ((category & SpellCategory.DamagesNeutral) > 0)
            {
                AdjustDamage(result, min, max, SpellCategory.DamagesNeutral, chanceToHappen,
                             Fighter.Stats.GetTotal(PlayerFields.NeutralDamageBonus) + Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + Fighter.Stats.GetTotal(PlayerFields.PhysicalDamage),
                             Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + Fighter.Stats.GetTotal(PlayerFields.Strength),
                             target.Stats.GetTotal(PlayerFields.NeutralElementReduction),
                             target.Stats.GetTotal(PlayerFields.NeutralResistPercent),
                             isFriend);
            }

            if ((category & SpellCategory.DamagesFire) > 0)
            {
                AdjustDamage(result, min, max, SpellCategory.DamagesNeutral, chanceToHappen,
                             Fighter.Stats.GetTotal(PlayerFields.FireDamageBonus) + Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + Fighter.Stats.GetTotal(PlayerFields.MagicDamage),
                             Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + Fighter.Stats.GetTotal(PlayerFields.Intelligence),
                             target.Stats.GetTotal(PlayerFields.FireElementReduction),
                             target.Stats.GetTotal(PlayerFields.FireResistPercent),
                             isFriend);
            }


            if ((category & SpellCategory.DamagesAir) > 0)
            {
                AdjustDamage(result, min, max, SpellCategory.DamagesNeutral, chanceToHappen,
                             Fighter.Stats.GetTotal(PlayerFields.AirDamageBonus) + Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + Fighter.Stats.GetTotal(PlayerFields.MagicDamage),
                             Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + Fighter.Stats.GetTotal(PlayerFields.Agility),
                             target.Stats.GetTotal(PlayerFields.AirElementReduction),
                             target.Stats.GetTotal(PlayerFields.AirResistPercent),
                             isFriend);
            }

            if ((category & SpellCategory.DamagesWater) > 0)
            {
                AdjustDamage(result, min, max, SpellCategory.DamagesNeutral, chanceToHappen,
                             Fighter.Stats.GetTotal(PlayerFields.WaterDamageBonus) + Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + Fighter.Stats.GetTotal(PlayerFields.MagicDamage),
                             Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + Fighter.Stats.GetTotal(PlayerFields.Chance),
                             target.Stats.GetTotal(PlayerFields.WaterElementReduction),
                             target.Stats.GetTotal(PlayerFields.WaterResistPercent),
                             isFriend);
            }

            if ((category & SpellCategory.DamagesEarth) > 0)
            {
                AdjustDamage(result, min, max, SpellCategory.DamagesNeutral, chanceToHappen,
                             Fighter.Stats.GetTotal(PlayerFields.EarthDamageBonus) + Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + Fighter.Stats.GetTotal(PlayerFields.PhysicalDamage),
                             Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + Fighter.Stats.GetTotal(PlayerFields.Strength),
                             target.Stats.GetTotal(PlayerFields.EarthElementReduction),
                             target.Stats.GetTotal(PlayerFields.EarthResistPercent),
                             isFriend);
            }

            if ((category & SpellCategory.Healing) > 0)
            {
                var steal = (category & SpellCategory.Damages) > 0;
                if (steal)
                {
                    target = Fighter;                                                         // Probably hp steal
                }
                var hptoHeal = (uint)(Math.Max(0, target.MaxLifePoints - target.LifePoints)); // Can't heal over max
                if (steal)
                {
                    result.MinHeal = Math.Min(hptoHeal, Math.Abs(result.MinDamage));
                    result.MaxHeal = Math.Min(hptoHeal, Math.Abs(result.MaxDamage));
                }
                else
                {
                    if (hptoHeal > 0)
                    {
                        AdjustDamage(result, (uint)Math.Min(effect.DiceNum, hptoHeal), (uint)Math.Min(effect.DiceFace, hptoHeal), SpellCategory.Healing, chanceToHappen,
                                     Fighter.Stats.GetTotal(PlayerFields.HealBonus),
                                     Fighter.Stats.GetTotal(PlayerFields.Intelligence),
                                     0,
                                     0, !isFriend);

                        if (result.Heal > hptoHeal)
                        {
                            if (isFriend)
                            {
                                result.MinHeal = result.MaxHeal = +hptoHeal;
                            }
                            else
                            {
                                result.MinHeal = result.MaxHeal = -hptoHeal;
                            }
                        }
                    }
                }
            }

            if ((category & SpellCategory.Buff) > 0)
            {
                if (isFriend)
                {
                    result.Boost += spell.CurrentLevel * chanceToHappen;
                }
                else
                {
                    result.Boost -= spell.CurrentLevel * chanceToHappen;
                }
            }

            if ((category & SpellCategory.Curse) > 0)
            {
                var ratio = spell.CurrentLevel * chanceToHappen;

                if (effect.EffectId == EffectsEnum.Effect_SkipTurn) // Let say this effect counts as 2 damage per level of the target
                {
                    ratio = target.Level * 2 * chanceToHappen;
                }

                if (isFriend)
                {
                    result.Curse -= 2 * ratio;
                }
                else
                {
                    result.Curse += ratio;
                }
            }
            if (isFriend)
            {
                result.Add(result);                                                                            // amplify (double) effects on friends.
            }
            if (!isFriend && ((category & SpellCategory.Damages) > 0) && result.MinDamage > target.LifePoints) // Enough damage to kill the target => affect an arbitrary 50% of max heal (with at least current health), so strong spells are not favored anymore.
            {
                double ratio = Math.Max(target.MaxLifePoints / 2d, target.LifePoints) / result.MinDamage;
                result.Multiply(ratio);
            }

            if (spellImpact != null)
            {
                spellImpact.Add(result);
            }
            else
            {
                spellImpact = result;
            }
        }
Example #2
0
        private void CumulEffects(EffectDice effect, ref SpellTarget spellImpact, FightActor target, Spell spell)
        {
            bool            flag             = this.Fighter.Team.Id == target.Team.Id;
            SpellTarget     spellTarget      = new SpellTarget();
            SpellTargetType arg_2A_0         = effect.Targets;
            SpellCategory   effectCategories = SpellIdentifier.GetEffectCategories(effect.EffectId);

            if (effectCategories != SpellCategory.None)
            {
                double num = 1.0;
                if (effect.Random > 0)
                {
                    num = (double)effect.Random / 100.0;
                }
                if (target is SummonedFighter)
                {
                    num /= 2.0;
                }
                uint damage  = (uint)System.Math.Min(effect.DiceNum, effect.DiceFace);
                uint damage2 = (uint)System.Math.Max(effect.DiceNum, effect.DiceFace);
                if ((effectCategories & SpellCategory.DamagesNeutral) > SpellCategory.None)
                {
                    SpellSelector.AdjustDamage(spellTarget, damage, damage2, SpellCategory.DamagesNeutral, num, this.Fighter.Stats.GetTotal(PlayerFields.NeutralDamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.PhysicalDamage), this.Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + this.Fighter.Stats.GetTotal(PlayerFields.Strength), target.Stats.GetTotal(PlayerFields.NeutralElementReduction), target.Stats.GetTotal(PlayerFields.NeutralResistPercent), flag);
                }
                if ((effectCategories & SpellCategory.DamagesFire) > SpellCategory.None)
                {
                    SpellSelector.AdjustDamage(spellTarget, damage, damage2, SpellCategory.DamagesNeutral, num, this.Fighter.Stats.GetTotal(PlayerFields.FireDamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.MagicDamage), this.Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + this.Fighter.Stats.GetTotal(PlayerFields.Intelligence), target.Stats.GetTotal(PlayerFields.FireElementReduction), target.Stats.GetTotal(PlayerFields.FireResistPercent), flag);
                }
                if ((effectCategories & SpellCategory.DamagesAir) > SpellCategory.None)
                {
                    SpellSelector.AdjustDamage(spellTarget, damage, damage2, SpellCategory.DamagesNeutral, num, this.Fighter.Stats.GetTotal(PlayerFields.AirDamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.MagicDamage), this.Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + this.Fighter.Stats.GetTotal(PlayerFields.Agility), target.Stats.GetTotal(PlayerFields.AirElementReduction), target.Stats.GetTotal(PlayerFields.AirResistPercent), flag);
                }
                if ((effectCategories & SpellCategory.DamagesWater) > SpellCategory.None)
                {
                    SpellSelector.AdjustDamage(spellTarget, damage, damage2, SpellCategory.DamagesNeutral, num, this.Fighter.Stats.GetTotal(PlayerFields.WaterDamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.MagicDamage), this.Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + this.Fighter.Stats.GetTotal(PlayerFields.Chance), target.Stats.GetTotal(PlayerFields.WaterElementReduction), target.Stats.GetTotal(PlayerFields.WaterResistPercent), flag);
                }
                if ((effectCategories & SpellCategory.DamagesEarth) > SpellCategory.None)
                {
                    SpellSelector.AdjustDamage(spellTarget, damage, damage2, SpellCategory.DamagesNeutral, num, this.Fighter.Stats.GetTotal(PlayerFields.EarthDamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.DamageBonus) + this.Fighter.Stats.GetTotal(PlayerFields.PhysicalDamage), this.Fighter.Stats.GetTotal(PlayerFields.DamageBonusPercent) + this.Fighter.Stats.GetTotal(PlayerFields.Strength), target.Stats.GetTotal(PlayerFields.EarthElementReduction), target.Stats.GetTotal(PlayerFields.EarthResistPercent), flag);
                }
                if ((effectCategories & SpellCategory.Healing) > SpellCategory.None)
                {
                    bool flag2;
                    if (flag2 = ((effectCategories & SpellCategory.Damages) > SpellCategory.None))
                    {
                        target = this.Fighter;
                    }
                    uint num2 = (uint)System.Math.Max(0, target.MaxLifePoints - target.LifePoints);
                    if (flag2)
                    {
                        spellTarget.MinHeal = System.Math.Min(num2, System.Math.Abs(spellTarget.MinDamage));
                        spellTarget.MaxHeal = System.Math.Min(num2, System.Math.Abs(spellTarget.MaxDamage));
                    }
                    else
                    {
                        if (num2 > 0u)
                        {
                            SpellSelector.AdjustDamage(spellTarget, (uint)System.Math.Min((long)effect.DiceNum, (long)((ulong)num2)), (uint)System.Math.Min((long)effect.DiceFace, (long)((ulong)num2)), SpellCategory.Healing, num, this.Fighter.Stats.GetTotal(PlayerFields.HealBonus), this.Fighter.Stats.GetTotal(PlayerFields.Intelligence), 0, 0, !flag);
                            if (spellTarget.Heal > num2)
                            {
                                if (flag)
                                {
                                    spellTarget.MinHeal = (spellTarget.MaxHeal = num2);
                                }
                                else
                                {
                                    spellTarget.MinHeal = (spellTarget.MaxHeal = (double)(-(double)((ulong)num2)));
                                }
                            }
                        }
                    }
                }
                if ((effectCategories & SpellCategory.Buff) > SpellCategory.None)
                {
                    if (flag)
                    {
                        spellTarget.Boost += (double)spell.CurrentLevel * num;
                    }
                    else
                    {
                        spellTarget.Boost -= (double)spell.CurrentLevel * num;
                    }
                }
                if ((effectCategories & SpellCategory.Curse) > SpellCategory.None)
                {
                    double num3 = (double)spell.CurrentLevel * num;
                    if (effect.EffectId == EffectsEnum.Effect_SkipTurn)
                    {
                        num3 = (double)(target.Level * 2) * num;
                    }
                    if (flag)
                    {
                        spellTarget.Curse -= 2.0 * num3;
                    }
                    else
                    {
                        spellTarget.Curse += num3;
                    }
                }
                if (flag)
                {
                    spellTarget.Add(spellTarget);
                }
                if (!flag && (effectCategories & SpellCategory.Damages) > SpellCategory.None && spellTarget.MinDamage > (double)target.LifePoints)
                {
                    double num3 = System.Math.Max((double)target.MaxLifePoints / 2.0, (double)target.LifePoints) / spellTarget.MinDamage;
                    spellTarget.Multiply(num3);
                }
                if (spellImpact != null)
                {
                    spellImpact.Add(spellTarget);
                }
                else
                {
                    spellImpact = spellTarget;
                }
            }
        }