using Content.Server.Tesla.EntitySystems;
using Content.Shared.Explosion;
+using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
namespace Content.Server.Lightning.Components;
[RegisterComponent, Access(typeof(LightningSystem), typeof(LightningTargetSystem))]
public sealed partial class LightningTargetComponent : Component
{
+ /// <summary>
+ /// The probability that this target will not be ignored by a lightning strike. This is necessary for Tesla's balance.
+ /// </summary>
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public float HitProbability = 1f;
+
/// <summary>
/// Priority level for selecting a lightning target.
/// </summary>
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float MaxTileIntensity = 5f;
+
+ /// <summary>
+ /// how much structural damage the object takes from a lightning strike
+ /// </summary>
+ [DataField]
+ public FixedPoint2 DamageFromLightning = 1;
}
var targets = _lookup.GetComponentsInRange<LightningTargetComponent>(Transform(user).MapPosition, range).ToList();
_random.Shuffle(targets);
targets.Sort((x, y) => y.Priority.CompareTo(x.Priority));
- var realCount = Math.Min(targets.Count, boltCount);
- if (realCount <= 0)
- return;
- for (int i = 0; i < realCount; i++)
+ //var realCount = Math.Min(targets.Count, boltCount);
+
+ int shootedCount = 0;
+ int count = -1;
+ while(shootedCount < boltCount)
{
- ShootLightning(user, targets[i].Owner, lightningPrototype);
- if (arcDepth > 0)
+ count++;
+
+ if (count >= targets.Count) { break; }
+
+ var curTarget = targets[count];
+ if (!_random.Prob(curTarget.HitProbability)) //Chance to ignore target
+ continue;
+
+ ShootLightning(user, targets[count].Owner, lightningPrototype);
+ if (arcDepth - targets[count].LightningResistance > 0)
{
- ShootRandomLightnings(targets[i].Owner, range, 1, lightningPrototype, arcDepth - targets[i].LightningResistance);
+ ShootRandomLightnings(targets[count].Owner, range, 1, lightningPrototype, arcDepth - targets[count].LightningResistance);
}
+ shootedCount++;
}
}
}
using Content.Server.Explosion.EntitySystems;
using Content.Server.Lightning;
using Content.Server.Lightning.Components;
+using Content.Shared.Damage;
namespace Content.Server.Tesla.EntitySystems;
/// </summary>
public sealed class LightningTargetSystem : EntitySystem
{
+ [Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly ExplosionSystem _explosionSystem = default!;
public override void Initialize()
private void OnHitByLightning(Entity<LightningTargetComponent> uid, ref HitByLightningEvent args)
{
+ DamageSpecifier damage = new();
+ damage.DamageDict.Add("Structural", uid.Comp.DamageFromLightning);
+ _damageable.TryChangeDamage(uid, damage, true);
- if (!uid.Comp.LightningExplode)
- return;
-
- _explosionSystem.QueueExplosion(
- Transform(uid).MapPosition,
- uid.Comp.ExplosionPrototype,
- uid.Comp.TotalIntensity, uid.Comp.Dropoff,
- uid.Comp.MaxTileIntensity,
- canCreateVacuum: false);
+ if (uid.Comp.LightningExplode)
+ {
+ _explosionSystem.QueueExplosion(
+ Transform(uid).MapPosition,
+ uid.Comp.ExplosionPrototype,
+ uid.Comp.TotalIntensity, uid.Comp.Dropoff,
+ uid.Comp.MaxTileIntensity,
+ canCreateVacuum: false);
+ }
}
}
using Content.Server.Tesla.EntitySystems;
-using Robust.Shared.Audio;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.Tesla.Components;
-using Content.Server.Popups;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Tesla.Components;
using Content.Server.Lightning;
-using Robust.Shared.Timing;
namespace Content.Server.Tesla.EntitySystems;
//When struck by lightning, charge the internal battery
private void OnHitByLightning(Entity<TeslaCoilComponent> coil, ref HitByLightningEvent args)
{
- if (!TryComp<BatteryComponent>(coil, out var batteryComponent))
- return;
-
- _battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
+ if (TryComp<BatteryComponent>(coil, out var batteryComponent))
+ {
+ _battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
+ }
}
}
- type: BatteryDischarger
activeSupplyRate: 15000
- type: TeslaCoil
- chargeFromLightning: 1000000
+ chargeFromLightning: 500000
- type: LightningTarget
priority: 4
+ hitProbability: 0.5
+ lightningResistance: 10
lightningExplode: false
- type: PowerNetworkBattery
maxSupply: 1000000
- type: Pullable
- type: Clickable
- type: InteractionOutline
+ - type: Damageable
+ damageContainer: StructuralInorganic
+ - type: ExaminableDamage
+ messages: WindowMessages
+ - type: Repairable
+ - type: DamageVisuals
+ thresholds: [8, 16, 25]
+ damageDivisor: 3.333
+ trackAllDamage: true
+ damageOverlay:
+ sprite: Structures/Power/Generation/Tesla/coil_cracks.rsi
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 225
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - !type:PlaySoundBehavior
+ sound:
+ path: /Audio/Effects/metalbreak.ogg
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ SheetSteel1:
+ min: 2
+ max: 4
#- type: GuideHelp # To Do - add Tesla Guide
- type: entity
priority: 3
lightningResistance: 10
lightningExplode: false
+ damageFromLightning: 0
- type: Anchorable
- type: Rotatable
- type: Pullable
- type: Clickable
- type: InteractionOutline
+ - type: ExaminableDamage
+ messages: WindowMessages
+ - type: Repairable
+ - type: Damageable
+ damageContainer: StructuralInorganic
+ - type: DamageVisuals
+ thresholds: [8, 16, 25]
+ damageDivisor: 3.333
+ trackAllDamage: true
+ damageOverlay:
+ sprite: Structures/Power/Generation/Tesla/groundingrod_cracks.rsi
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 300
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - !type:PlaySoundBehavior
+ sound:
+ path: /Audio/Effects/metalbreak.ogg
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ SheetSteel1:
+ min: 2
+ max: 4
#- type: GuideHelp # To Do - add Tesla Guide
+
--- /dev/null
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "states": [
+ {"name": "DamageOverlay_8", "directions": 1},
+ {"name": "DamageOverlay_16", "directions": 1},
+ {"name": "DamageOverlay_25", "directions": 1}
+ ]
+}
--- /dev/null
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "states": [
+ {"name": "DamageOverlay_8", "directions": 1},
+ {"name": "DamageOverlay_16", "directions": 1},
+ {"name": "DamageOverlay_25", "directions": 1}
+ ]
+}