Пример #1
0
        void OnBuffTriggered(TriggerBuff buff, FightActor triggerrer, BuffTriggerType trigger, object token)
        {
            var damages = new Fights.Damage(Dice)
            {
                Source = buff.Caster,
                Buff   = buff,
                IgnoreDamageReduction = true,
                IgnoreDamageBoost     = true,
                School      = GetEffectSchool(buff.Dice.EffectId),
                MarkTrigger = MarkTrigger,
                IsCritical  = Critical,
                Amount      = (int)Math.Floor((buff.Target.Stats.Health.PermanentDamages * Dice.DiceNum) / 100d)
            };

            if (Effect.EffectId == EffectsEnum.Effect_DamageNeutralPerCasterHPEroded ||
                Effect.EffectId == EffectsEnum.Effect_DamageEarthPerCasterHPEroded ||
                Effect.EffectId == EffectsEnum.Effect_DamageFirePerCasterHPEroded ||
                Effect.EffectId == EffectsEnum.Effect_DamageWaterPerCasterHPEroded ||
                Effect.EffectId == EffectsEnum.Effect_DamageAirPerCasterHPEroded)
            {
                damages.Amount = (int)Math.Floor((buff.Caster.Stats.Health.PermanentDamages * Dice.DiceNum) / 100d);
            }

            buff.Target.InflictDamage(damages);
        }
Пример #2
0
        void StealHp(FightActor target)
        {
            var damage = new Fights.Damage(Dice, GetEffectSchool(Effect.EffectId), Caster, Spell, TargetedCell, EffectZone)
            {
                IsCritical = Critical
            };

            // spell reflected
            var buff = target.GetBestReflectionBuff();

            if (buff != null && buff.ReflectedLevel >= Spell.CurrentLevel && Spell.Template.Id != 0)
            {
                NotifySpellReflected(target);
                damage.Source           = Caster;
                damage.ReflectedDamages = true;
                Caster.InflictDamage(damage);

                if (buff.Duration <= 0)
                {
                    target.RemoveBuff(buff);
                }
            }
            else
            {
                target.InflictDamage(damage);

                var amount = (short)Math.Floor(damage.Amount / 2.0);
                if (amount > 0)
                {
                    Caster.Heal(amount, target, true);
                }
            }
        }
Пример #3
0
        private void OnActorAttacked(TriggerBuff buff, BuffTriggerType trigger, object token)
        {
            System.Collections.Generic.IEnumerable <StatBuff> source = buff.Target.GetBuffs((Buff entry) => entry.Spell == base.Spell).OfType <StatBuff>();
            int num = (
                from entry in source
                where (int)entry.Duration == this.Effect.Duration
                select entry).Sum((StatBuff entry) => (int)entry.Value);
            short diceFace = base.Dice.DiceFace;

            if (num < (int)diceFace)
            {
                Fights.Damage damage = (Fights.Damage)token;
                int           num2   = damage.Amount;
                if (num2 + num > (int)diceFace)
                {
                    num2 = (int)((short)((int)diceFace - num));
                }
                PlayerFields punishmentBoostType = Punishment.GetPunishmentBoostType(base.Dice.DiceNum);
                StatBuff     buff2 = new StatBuff(buff.Target.PopNextBuffId(), buff.Target, base.Caster, base.Dice, base.Spell, (short)num2, punishmentBoostType, false, true, (short)Punishment.GetBuffEffectId(punishmentBoostType))
                {
                    Duration = base.Dice.Value
                };
                buff.Target.AddAndApplyBuff(buff2, true);
            }
        }
Пример #4
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors())
            {
                var integerEffect = GenerateEffect();

                if (integerEffect == null)
                {
                    return(false);
                }

                if (Effect.Duration != 0 || Effect.Delay != 0)
                {
                    AddTriggerBuff(actor, BuffTriggerType.OnTurnBegin, OnBuffTriggered);
                }
                else
                {
                    var damages = new Fights.Damage(Dice, EffectSchoolEnum.Neutral, Caster, Spell, TargetedCell, EffectZone)
                    {
                        IsCritical            = Critical,
                        IgnoreDamageBoost     = true,
                        IgnoreDamageReduction = false
                    };

                    damages.GenerateDamages();
                    var inflictedDamages = actor.InflictDamage(damages);

                    var heal = (int)Math.Floor(inflictedDamages / 2d);
                    Caster.Heal(heal, actor, true);
                }
            }

            return(true);
        }
Пример #5
0
        void DamageBuffTrigger(TriggerBuff buff, FightActor triggerrer, BuffTriggerType trigger, object token)
        {
            var triggerDmg = token as Fights.Damage;

            if (triggerDmg == null)
            {
                return;
            }

            if (triggerDmg.ReflectedDamages)
            {
                return;
            }

            var damage = new Fights.Damage(buff.Dice, GetEffectSchool(buff.Dice.EffectId), buff.Target, buff.Spell, buff.Target.Cell)
            {
                Buff              = buff,
                ReflectedDamages  = true,
                IsCritical        = Critical,
                MarkTrigger       = MarkTrigger,
                IgnoreDamageBoost = true
            };

            damage.GenerateDamages();
            damage.Amount = (int)((buff.Target.LifePoints * (buff.Dice.DiceNum / 100.0)));

            buff.Target.InflictDamage(damage);
        }
 public override bool Apply()
 {
     foreach (FightActor current in base.GetAffectedActors())
     {
         if (this.Effect.Duration > 0)
         {
             base.AddTriggerBuff(current, true, BuffTriggerType.TURN_BEGIN, new TriggerBuffApplyHandler(DamagePercent.DamageBuffTrigger));
         }
         else
         {
             Fights.Damage damage = new Fights.Damage(base.Dice, DamagePercent.GetEffectSchool(base.Dice.EffectId), base.Caster, base.Spell);
             damage.GenerateDamages();
             damage.Amount            = (int)((double)current.MaxLifePoints * ((double)damage.Amount / 100.0));
             damage.IgnoreDamageBoost = true;
             damage.MarkTrigger       = base.MarkTrigger;
             SpellReflectionBuff bestReflectionBuff = current.GetBestReflectionBuff();
             if (bestReflectionBuff != null && bestReflectionBuff.ReflectedLevel >= (int)base.Spell.CurrentLevel && base.Spell.Template.Id != 0)
             {
                 this.NotifySpellReflected(current);
                 damage.Source           = current;
                 damage.ReflectedDamages = true;
                 base.Caster.InflictDamage(damage);
                 current.RemoveAndDispellBuff(bestReflectionBuff);
             }
             else
             {
                 current.InflictDamage(damage);
             }
         }
     }
     return(true);
 }
Пример #7
0
 private static void DamageBuffTrigger(TriggerBuff buff, BuffTriggerType trigger, object token)
 {
     Fights.Damage damage = new Fights.Damage(buff.Dice, DirectDamage.GetEffectSchool(buff.Dice.EffectId), buff.Caster, buff.Spell)
     {
         Buff = buff
     };
     buff.Target.InflictDamage(damage);
 }
Пример #8
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors())
            {
                if (Effect.Duration != 0 || Effect.Delay != 0)
                {
                    if (BuffTriggerType == BuffTriggerType.Unknown)
                    {
                        AddTriggerBuff(actor, DamageBuffTrigger);
                    }
                    else
                    {
                        AddTriggerBuff(actor, BuffTriggerType, DamageBuffTrigger);
                    }
                }
                else
                {
                    // spell reflected
                    var buff = actor.GetBestReflectionBuff();
                    if (buff != null && buff.ReflectedLevel >= Spell.CurrentLevel &&
                        Spell.Template.Id != 0 && !Caster.IsIndirectSpellCast(Spell) && !Caster.IsPoisonSpellCast(Spell))
                    {
                        NotifySpellReflected(actor);
                        var damage = new Fights.Damage(Dice, GetEffectSchool(Dice.EffectId), Caster, Spell, Caster.Cell)
                        {
                            ReflectedDamages = true,
                            MarkTrigger      = MarkTrigger,
                            IsCritical       = Critical
                        };
                        damage.GenerateDamages();
                        damage.Amount = (short)(damage.Amount * Efficiency);

                        Caster.InflictDamage(damage);

                        if (buff.Duration <= 0)
                        {
                            actor.RemoveBuff(buff);
                        }
                    }
                    else
                    {
                        var damage = new Fights.Damage(Dice, GetEffectSchool(Dice.EffectId), Caster, Spell, TargetedCell, EffectZone)
                        {
                            MarkTrigger = MarkTrigger,
                            IsCritical  = Critical
                        };
                        damage.GenerateDamages();
                        damage.Amount = (short)(damage.Amount * Efficiency);

                        actor.InflictDamage(damage);
                    }
                }
            }

            return(true);
        }
 private void OnBuffTriggered(TriggerBuff buff, BuffTriggerType trigger, object token)
 {
     Fights.Damage damage = new Fights.Damage(base.Dice)
     {
         Source = buff.Caster,
         Buff   = buff,
         IgnoreDamageReduction = true,
         School      = DamagePerAPUsed.GetEffectSchool(buff.Dice.EffectId),
         MarkTrigger = base.MarkTrigger
     };
     damage.BaseMaxDamages = (int)buff.Target.UsedAP * damage.BaseMaxDamages;
     damage.BaseMinDamages = (int)buff.Target.UsedAP * damage.BaseMinDamages;
     buff.Target.InflictDamage(damage);
 }
Пример #10
0
        static void OnBuffTriggered(TriggerBuff buff, FightActor triggerrer, BuffTriggerType trigger, object token)
        {
            var damages = new Fights.Damage(buff.Dice, EffectSchoolEnum.Unknown, buff.Caster, buff.Spell, buff.Target.Cell)
            {
                Buff       = buff,
                IsCritical = buff.Critical,
            };

            damages.GenerateDamages();
            buff.Target.InflictDirectDamage(damages.Amount);

            var heal = (int)Math.Floor(damages.Amount / 2d);

            buff.Caster.Heal(heal, buff.Target, true);
        }
Пример #11
0
        private static void DamageBuffTrigger(TriggerBuff buff, BuffTriggerType trigger, object token)
        {
            EffectInteger left = buff.GenerateEffect();

            if (!(left == null))
            {
                Fights.Damage damage = new Fights.Damage(buff.Dice, DamagePercent.GetEffectSchool(buff.Dice.EffectId), buff.Caster, buff.Spell)
                {
                    Buff = buff
                };
                damage.GenerateDamages();
                damage.Amount            = (int)((double)buff.Target.MaxLifePoints * ((double)damage.Amount / 100.0));
                damage.IgnoreDamageBoost = true;
                buff.Target.InflictDamage(damage);
            }
        }
Пример #12
0
        void BuffTrigger(TriggerBuff buff, FightActor triggerrer, BuffTriggerType trigger, object token)
        {
            var damage = token as Fights.Damage;

            if (damage == null)
            {
                return;
            }

            if (damage.ReflectedDamages)
            {
                return;
            }

            if (damage.IsWeaponAttack)
            {
                return;
            }

            if (damage.Source == null)
            {
                return;
            }

            var damages = (int)Math.Floor((damage.Amount * Dice.DiceNum) / 100.0);

            foreach (var actor in GetAffectedActors())
            {
                var reflectDamage = new Fights.Damage(damages)
                {
                    Source                = buff.Target,
                    School                = damage.School,
                    IsCritical            = damage.IsCritical,
                    IgnoreDamageBoost     = true,
                    IgnoreDamageReduction = false,
                    Spell            = null,
                    ReflectedDamages = true,
                };

                actor.InflictDamage(reflectDamage);
            }

            buff.Target.RemoveBuff(buff);
        }
Пример #13
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors())
            {
                var integerEffect = GenerateEffect();

                if (integerEffect == null)
                {
                    return(false);
                }

                if (Effect.Duration != 0 || Effect.Delay != 0)
                {
                    var triggerType = BuffTriggerType.Instant;

                    switch (Spell.Id)
                    {
                    case (int)SpellIdEnum.SPORE_TEILLE:
                        triggerType = BuffTriggerType.OnTackle;
                        break;
                    }

                    AddTriggerBuff(actor, triggerType, HealBuffTrigger);
                }
                else
                {
                    if (actor.IsAlive())
                    {
                        var damage = new Fights.Damage(Dice, EffectSchoolEnum.Healing, Caster, Spell, TargetedCell, EffectZone)
                        {
                            MarkTrigger = MarkTrigger,
                            IsCritical  = Critical
                        };
                        damage.GenerateDamages();
                        damage.Amount = (short)(damage.Amount * Efficiency);
                        actor.Heal(damage);
                    }
                }
            }

            return(true);
        }
Пример #14
0
        static void DamageBuffTrigger(TriggerBuff buff, FightActor triggerrer, BuffTriggerType trigger, object token)
        {
            var damages = token as Fights.Damage;

            if (damages != null && (damages.Spell == null || damages.ReflectedDamages))
            {
                return;
            }

            var damage = new Fights.Damage(buff.Dice, GetEffectSchool(buff.Dice.EffectId), buff.Caster, null, buff.Target.Cell)
            {
                IsCritical       = buff.Critical,
                ReflectedDamages = true
            };

            damage.GenerateDamages();
            damage.Amount = (short)(damage.Amount * buff.Efficiency);

            buff.Target.InflictDamage(damage);
        }
Пример #15
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors())
            {
                var damages = new Fights.Damage(Dice)
                {
                    Source      = Caster,
                    School      = GetEffectSchool(Dice.EffectId),
                    MarkTrigger = MarkTrigger,
                    IsCritical  = Critical
                };

                var percent = ((double)Caster.Stats.MP.Total / Caster.Stats.MP.TotalMax) * 100.0;
                damages.BaseMaxDamages = (int)Math.Floor(damages.BaseMaxDamages * (percent / 100.0));
                damages.BaseMinDamages = (int)Math.Floor(damages.BaseMinDamages * (percent / 100.0));

                actor.InflictDamage(damages);
            }

            return(true);
        }
Пример #16
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors().ToArray())
            {
                var damages = new Fights.Damage(Dice)
                {
                    MarkTrigger = MarkTrigger
                };
                damages.GenerateDamages();

                damages.Amount = (int)(Dice.DiceNum * Caster.Stats.Health.TotalMaxWithoutPermanentDamages * (Math.Pow(Math.Cos(2 * Math.PI * ((100 * Caster.LifePoints / Caster.MaxLifePoints) * 0.01 - 0.5)) + 1, 2) / 4) / 100);

                // spell reflected
                var buff = actor.GetBestReflectionBuff();
                if (buff != null && buff.ReflectedLevel >= Spell.CurrentLevel && Spell.Template.Id != 0)
                {
                    NotifySpellReflected(actor);
                    damages.Source            = Caster;
                    damages.ReflectedDamages  = true;
                    damages.IgnoreDamageBoost = true;
                    damages.IsCritical        = Critical;
                    Caster.InflictDamage(damages);

                    if (buff.Duration <= 0)
                    {
                        actor.RemoveBuff(buff);
                    }
                }
                else
                {
                    damages.Source            = Caster;
                    damages.IgnoreDamageBoost = true;
                    actor.InflictDamage(damages);
                }
            }

            return(true);
        }
 public override bool Apply()
 {
     foreach (FightActor current in base.GetAffectedActors())
     {
         Fights.Damage damage = new Fights.Damage(base.Dice);
         damage.MarkTrigger = base.MarkTrigger;
         damage.GenerateDamages();
         double num  = 0.0;
         double num2 = (double)base.Caster.LifePoints / (double)base.Caster.MaxLifePoints;
         if (num2 <= 0.5)
         {
             num = 2.0 * num2;
         }
         else
         {
             if (num2 > 0.5)
             {
                 num = 1.0 + (num2 - 0.5) * -2.0;
             }
         }
         damage.Amount = (int)((double)base.Caster.LifePoints * num * (double)damage.Amount / 100.0);
         SpellReflectionBuff bestReflectionBuff = current.GetBestReflectionBuff();
         if (bestReflectionBuff != null && bestReflectionBuff.ReflectedLevel >= (int)base.Spell.CurrentLevel && base.Spell.Template.Id != 0)
         {
             this.NotifySpellReflected(current);
             damage.Source            = current;
             damage.ReflectedDamages  = true;
             damage.IgnoreDamageBoost = true;
             base.Caster.InflictDamage(damage);
             current.RemoveAndDispellBuff(bestReflectionBuff);
         }
         else
         {
             current.InflictDamage(damage);
         }
     }
     return(true);
 }
Пример #18
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors())
            {
                var damages = new Fights.Damage(Dice)
                {
                    Source = Caster,
                    IgnoreDamageReduction = true,
                    IgnoreDamageBoost     = true,
                    School      = GetEffectSchool(Dice.EffectId),
                    MarkTrigger = MarkTrigger,
                    IsCritical  = Critical
                };

                var damagesAmount = Math.Round(((Caster.Stats.Health.DamageTaken * Dice.DiceNum) / 100d));

                damages.Amount = (int)damagesAmount;

                actor.InflictDamage(damages);
            }

            return(true);
        }
Пример #19
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors().ToArray())
            {
                if (Effect.Duration != 0 || Effect.Delay != 0)
                {
                    AddTriggerBuff(actor, DamageBuffTrigger);
                }
                else
                {
                    var damage = new Fights.Damage(Dice, GetEffectSchool(Dice.EffectId), Caster, Spell, TargetedCell, EffectZone);
                    damage.GenerateDamages();
                    damage.Amount            = (int)Math.Floor((Caster.LifePoints * Dice.DiceNum) / 100d);
                    damage.IgnoreDamageBoost = true;
                    damage.MarkTrigger       = MarkTrigger;
                    damage.IsCritical        = Critical;

                    // spell reflected
                    var buff = actor.GetBestReflectionBuff();
                    if (buff != null && buff.ReflectedLevel >= Spell.CurrentLevel && Spell.Template.Id != 0)
                    {
                        NotifySpellReflected(actor);
                        damage.Source           = Caster;
                        damage.ReflectedDamages = true;
                        Caster.InflictDamage(damage);

                        actor.RemoveBuff(buff);
                    }
                    else
                    {
                        actor.InflictDamage(damage);
                    }
                }
            }

            return(true);
        }
Пример #20
0
        protected override bool InternalApply()
        {
            foreach (var actor in GetAffectedActors())
            {
                if (Effect.Duration != 0 || Effect.Delay != 0)
                {
                    AddTriggerBuff(actor, BuffTriggerType.Instant, OnBuffTriggered);
                }
                else
                {
                    var damages = new Fights.Damage(Dice)
                    {
                        Source = Caster,
                        IgnoreDamageReduction = true,
                        IgnoreDamageBoost     = true,
                        School      = GetEffectSchool(Dice.EffectId),
                        MarkTrigger = MarkTrigger,
                        IsCritical  = Critical,
                        Amount      = (int)Math.Floor((actor.Stats.Health.PermanentDamages * Dice.DiceNum) / 100d)
                    };

                    if (Effect.EffectId == EffectsEnum.Effect_DamageNeutralPerCasterHPEroded ||
                        Effect.EffectId == EffectsEnum.Effect_DamageEarthPerCasterHPEroded ||
                        Effect.EffectId == EffectsEnum.Effect_DamageFirePerCasterHPEroded ||
                        Effect.EffectId == EffectsEnum.Effect_DamageWaterPerCasterHPEroded ||
                        Effect.EffectId == EffectsEnum.Effect_DamageAirPerCasterHPEroded)
                    {
                        damages.Amount = (int)Math.Floor((Caster.Stats.Health.PermanentDamages * Dice.DiceNum) / 100d);
                    }

                    actor.InflictDamage(damages);
                }
            }

            return(true);
        }
Пример #21
0
        void OnBuffTriggered(TriggerBuff buff, FightActor triggerrer, BuffTriggerType trigger, object token)
        {
            var usedAP = buff.Target.UsedAP;

            if (usedAP <= 0)
            {
                return;
            }

            var damages = new Fights.Damage(Dice)
            {
                Source      = buff.Caster,
                Buff        = buff,
                School      = GetEffectSchool(buff.Dice.EffectId),
                MarkTrigger = MarkTrigger,
                IsCritical  = Critical,
                Spell       = buff.Spell
            };

            damages.GenerateDamages();
            damages.Amount = usedAP * damages.BaseMaxDamages;

            buff.Target.InflictDamage(damages);
        }
Пример #22
0
        protected override bool InternalApply()
        {
            var integerEffect = GenerateEffect();

            if (integerEffect == null)
            {
                return(false);
            }

            var actors = new List <FightActor>();

            if (Pull)
            {
                actors = GetAffectedActors().OrderBy(entry => entry.Position.Point.ManhattanDistanceTo(TargetedPoint)).ToList();
            }
            else
            {
                actors = GetAffectedActors().OrderByDescending(entry => entry.Position.Point.ManhattanDistanceTo(TargetedPoint)).ToList();
            }

            foreach (var actor in actors)
            {
                if (!actor.CanBePushed())
                {
                    continue;
                }

                var referenceCell = TargetedCell.Id == actor.Cell.Id ? CastPoint : TargetedPoint;

                if (referenceCell.CellId == actor.Position.Cell.Id)
                {
                    continue;
                }

                var pushDirection = Pull ? actor.Position.Point.OrientationTo(referenceCell) : referenceCell.OrientationTo(actor.Position.Point);

                if (PushDirection != null)
                {
                    pushDirection = PushDirection.Value;
                }

                var startCell = actor.Position.Point;
                var lastCell  = startCell;

                if (Distance == 0)
                {
                    Distance = (short)(pushDirection.IsDiagonal() ? Math.Ceiling(integerEffect.Value / 2.0) : integerEffect.Value);
                }

                var stopCell = startCell.GetCellInDirection(pushDirection, Distance);

                for (var i = 0; i < Distance; i++)
                {
                    var nextCell = lastCell.GetNearestCellInDirection(pushDirection);

                    // the next cell is blocking, or an adjacent cell is blocking if it's in diagonal
                    if (IsBlockingCell(nextCell, actor) ||
                        (pushDirection.IsDiagonal() && pushDirection.GetDiagonalDecomposition().Any(x => IsBlockingCell(lastCell.GetNearestCellInDirection(x), actor))))
                    {
                        if (nextCell == null)
                        {
                            stopCell = lastCell;
                            nextCell = stopCell;
                        }

                        if (Fight.ShouldTriggerOnMove(Fight.Map.Cells[nextCell.CellId], actor))
                        {
                            DamagesDisabled = true;
                            stopCell        = nextCell;
                        }
                        else
                        {
                            stopCell = lastCell;
                        }

                        break;
                    }

                    if (nextCell != null)
                    {
                        lastCell = nextCell;
                    }
                }

                if (actor.IsAlive())
                {
                    foreach (var character in Fight.GetCharactersAndSpectators().Where(actor.IsVisibleFor))
                    {
                        ActionsHandler.SendGameActionFightSlideMessage(character.Client, Caster, actor, startCell.CellId, stopCell.CellId);
                    }
                }

                if (!DamagesDisabled)
                {
                    var fightersInline = Fight.GetAllFightersInLine(startCell, Distance, pushDirection);
                    fightersInline.Insert(0, actor);
                    var distance = integerEffect.Value - startCell.ManhattanDistanceTo(stopCell);
                    var targets  = 0;

                    foreach (var fighter in fightersInline)
                    {
                        var pushDamages = Formulas.FightFormulas.CalculatePushBackDamages(Caster, fighter, (int)distance, targets);

                        if (pushDamages > 0)
                        {
                            var pushDamage = new Fights.Damage(pushDamages)
                            {
                                Source                = actor,
                                School                = EffectSchoolEnum.Pushback,
                                IgnoreDamageBoost     = true,
                                IgnoreDamageReduction = false
                            };

                            fighter.InflictDamage(pushDamage);
                        }

                        targets++;
                    }
                }

                if (actor.IsCarrying() && stopCell != startCell)
                {
                    actor.ThrowActor(Map.Cells[startCell.CellId], true);
                }

                actor.Position.Cell = Map.Cells[stopCell.CellId];

                if (Effect.EffectId != EffectsEnum.Effect_PullForward)
                {
                    actor.TriggerBuffs(Caster, BuffTriggerType.OnPushed);
                }
                actor.TriggerBuffs(Caster, BuffTriggerType.OnMoved);
            }

            return(true);
        }