Пример #1
0
        public DamageWarhead(List <TextNode> nodes)
        {
            var fields = TypeLoader.GetFields(this);

            foreach (var node in nodes)
            {
                switch (node.Key)
                {
                case nameof(ArmorModifiers):
                    foreach (var node2 in node.Children)
                    {
                        ArmorModifiers.Add(node2.Key, node2.Convert <float>());
                    }

                    break;

                default:
                    TypeLoader.SetValue(this, fields, node);
                    break;
                }
            }

            if (RangeSteps.Length != Falloff.Length)
            {
                throw new InvalidNodeException($"Range step length ({RangeSteps.Length}) does not match with given falloff values ({Falloff.Length}).");
            }

            maxRange = FalloffHelper.GetMax(Falloff, RangeSteps);
        }
Пример #2
0
        public ForceWarhead(List <TextNode> nodes)
        {
            TypeLoader.SetValues(this, nodes);

            if (RangeSteps.Length != Falloff.Length)
            {
                throw new InvalidNodeException($"Range step length ({RangeSteps.Length}) does not match with given falloff values ({Falloff.Length}).");
            }

            maxRange = FalloffHelper.GetMax(Falloff, RangeSteps);
        }
Пример #3
0
        public void Impact(World world, Weapon weapon, Target target)
        {
            if (Acceleration != 0)
            {
                var physics = new RayPhysics(world);
                var maxDist = maxRange * weapon.DamageRangeModifier;
                var sectors = world.ActorLayer.GetSectors(target.Position, (int)maxDist);
                foreach (var sector in sectors)
                {
                    foreach (var actor in world.ActorLayer.Actors)
                    {
                        if (!actor.IsAlive || actor.Health == null || actor == weapon.Origin)
                        {
                            continue;
                        }

                        if (actor.Team == weapon.Team)
                        {
                            continue;
                        }

                        var dist = (target.Position - actor.Position).FlatDist;
                        if (dist > maxRange * weapon.DamageRangeModifier)
                        {
                            continue;
                        }
                        if (dist < 1f)
                        {
                            dist = 1;
                        }

                        float multiplier = FalloffHelper.GetMultiplier(Falloff, RangeSteps, dist, weapon.DamageRangeModifier);

                        physics.Start  = actor.Position;
                        physics.Target = target.Position;
                        var pen = physics.GetWallPenetrationValue();

                        if (pen == 0f)
                        {
                            continue;
                        }

                        if (Acceleration != 0)
                        {
                            var acceleration = (int)Math.Floor(multiplier * Acceleration * weapon.DamageModifier * pen);
                            if (acceleration != 0)
                            {
                                actor.Push((target.Position - actor.Position).FlatAngle, acceleration);
                            }
                        }

                        if (HeightAcceleration != 0)
                        {
                            var heightAcceleration = (int)Math.Floor(multiplier * HeightAcceleration * weapon.DamageModifier * pen);
                            if (heightAcceleration != 0)
                            {
                                actor.Lift(heightAcceleration);
                            }
                        }
                    }
                }
            }
        }
Пример #4
0
        public void Impact(World world, Weapon weapon, Target target)
        {
            if (Probability != 0 && Spell != null)
            {
                if (target.Type == TargetType.ACTOR)
                {
                    target.Actor.CastSpell(Spell);
                    return;
                }

                var physics = new RayPhysics(world);
                var maxDist = maxRange * weapon.DamageRangeModifier;
                var sectors = world.ActorLayer.GetSectors(target.Position, (int)maxDist);
                foreach (var sector in sectors)
                {
                    foreach (var actor in world.ActorLayer.Actors)
                    {
                        if (!actor.IsAlive || actor.Health == null || actor == weapon.Origin)
                        {
                            continue;
                        }

                        if (actor.Team == weapon.Team)
                        {
                            continue;
                        }

                        var dist = (target.Position - actor.Position).FlatDist;
                        if (dist > maxRange * weapon.DamageRangeModifier)
                        {
                            continue;
                        }
                        if (dist < 1f)
                        {
                            dist = 1;
                        }

                        var probability = Probability * FalloffHelper.GetMultiplier(ProbabilityFalloff, RangeSteps, dist, weapon.DamageRangeModifier);

                        if (!IgnoreWalls)
                        {
                            physics.Start  = actor.Position;
                            physics.Target = target.Position;
                            var pen = physics.GetWallPenetrationValue();

                            if (pen == 0f)
                            {
                                continue;
                            }

                            probability *= Probability;
                        }

                        if (probability == 0 || Program.SharedRandom.NextDouble() > probability)
                        {
                            continue;
                        }

                        actor.CastSpell(Spell);
                    }
                }
            }
        }
Пример #5
0
        public void Impact(World world, Weapon weapon, Target target)
        {
            if (Damage == 0)
            {
                return;
            }

            var maxDist = maxRange * weapon.DamageRangeModifier;

            if (!AgainstWalls)
            {
                if (target.Type == TargetType.ACTOR)
                {
                    damageActor(world, weapon, target.Actor, Damage);
                    return;
                }

                var physics = new RayPhysics(world);
                var sectors = world.ActorLayer.GetSectors(target.Position, (int)maxDist);
                foreach (var sector in sectors)
                {
                    foreach (var actor in sector.Actors)
                    {
                        if (!actor.IsAlive || actor.Health == null || actor == weapon.Origin)
                        {
                            continue;
                        }

                        if (actor.Team == weapon.Team)
                        {
                            continue;
                        }

                        var dist = (target.Position - actor.Position).FlatDist;
                        if (dist > maxDist)
                        {
                            continue;
                        }
                        if (dist < 1f)
                        {
                            dist = 1;
                        }

                        float damagemultiplier = FalloffHelper.GetMultiplier(Falloff, RangeSteps, dist, weapon.DamageRangeModifier);

                        physics.Start  = actor.Position;
                        physics.Target = target.Position;
                        var pen = physics.GetWallPenetrationValue();

                        if (pen == 0f)
                        {
                            continue;
                        }

                        var damage = (int)Math.Floor(damagemultiplier * Damage * weapon.DamageModifier * pen);

                        damageActor(world, weapon, actor, damage);
                    }
                }
            }
            else
            {
                foreach (var wall in world.WallLayer.GetRange(target.Position, (int)maxDist))
                {
                    if (wall == null || wall.Type.Invincible)
                    {
                        continue;
                    }

                    var dist = (target.Position - wall.Position).FlatDist;
                    if (dist > maxDist)
                    {
                        continue;
                    }
                    if (dist < 1)
                    {
                        dist = 1;
                    }

                    float damagemultiplier = FalloffHelper.GetMultiplier(Falloff, RangeSteps, dist, weapon.DamageRangeModifier);
                    var   damage           = (int)Math.Floor(damagemultiplier * Damage * weapon.DamageModifier);

                    if (ArmorModifiers.ContainsKey(wall.Type.Armor))
                    {
                        damage = (int)(damage * ArmorModifiers[wall.Type.Armor]);
                    }

                    if (damage == 0)
                    {
                        continue;
                    }

                    wall.Damage(damage);
                }
            }
        }