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); }
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); }
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); } } } } } }
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); } } } }
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); } } }