From: Ed <96445749+TheShuEd@users.noreply.github.com>
Date: Mon, 1 Jan 2024 07:33:48 +0000 (+0300)
Subject: Major Tesla tweaks (#23235)
X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=5e1fcfc63ead8749aeb0b2c77b477d2762ba62d9;p=space-station-14.git
Major Tesla tweaks (#23235)
* add ignore chance
* twekas
* add damaging and repairing
* grounding rod undestructable by tesla
---
diff --git a/Content.Server/Lightning/Components/LightningTargetComponent.cs b/Content.Server/Lightning/Components/LightningTargetComponent.cs
index e85993562c..6d806b3fe7 100644
--- a/Content.Server/Lightning/Components/LightningTargetComponent.cs
+++ b/Content.Server/Lightning/Components/LightningTargetComponent.cs
@@ -1,5 +1,6 @@
using Content.Server.Tesla.EntitySystems;
using Content.Shared.Explosion;
+using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
namespace Content.Server.Lightning.Components;
@@ -11,6 +12,12 @@ namespace Content.Server.Lightning.Components;
[RegisterComponent, Access(typeof(LightningSystem), typeof(LightningTargetSystem))]
public sealed partial class LightningTargetComponent : Component
{
+ ///
+ /// The probability that this target will not be ignored by a lightning strike. This is necessary for Tesla's balance.
+ ///
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public float HitProbability = 1f;
+
///
/// Priority level for selecting a lightning target.
///
@@ -56,4 +63,10 @@ public sealed partial class LightningTargetComponent : Component
///
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float MaxTileIntensity = 5f;
+
+ ///
+ /// how much structural damage the object takes from a lightning strike
+ ///
+ [DataField]
+ public FixedPoint2 DamageFromLightning = 1;
}
diff --git a/Content.Server/Lightning/LightningSystem.cs b/Content.Server/Lightning/LightningSystem.cs
index 00704df1e0..ae95a2a491 100644
--- a/Content.Server/Lightning/LightningSystem.cs
+++ b/Content.Server/Lightning/LightningSystem.cs
@@ -75,16 +75,26 @@ public sealed class LightningSystem : SharedLightningSystem
var targets = _lookup.GetComponentsInRange(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++;
}
}
}
diff --git a/Content.Server/Lightning/LightningTargetSystem.cs b/Content.Server/Lightning/LightningTargetSystem.cs
index f9e564a76a..ccaa74e9e2 100644
--- a/Content.Server/Lightning/LightningTargetSystem.cs
+++ b/Content.Server/Lightning/LightningTargetSystem.cs
@@ -1,6 +1,7 @@
using Content.Server.Explosion.EntitySystems;
using Content.Server.Lightning;
using Content.Server.Lightning.Components;
+using Content.Shared.Damage;
namespace Content.Server.Tesla.EntitySystems;
@@ -9,6 +10,7 @@ namespace Content.Server.Tesla.EntitySystems;
///
public sealed class LightningTargetSystem : EntitySystem
{
+ [Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly ExplosionSystem _explosionSystem = default!;
public override void Initialize()
@@ -20,15 +22,18 @@ public sealed class LightningTargetSystem : EntitySystem
private void OnHitByLightning(Entity 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);
+ }
}
}
diff --git a/Content.Server/Tesla/Components/TeslaCoilComponent.cs b/Content.Server/Tesla/Components/TeslaCoilComponent.cs
index 6effe8ca51..d9c7be6fe4 100644
--- a/Content.Server/Tesla/Components/TeslaCoilComponent.cs
+++ b/Content.Server/Tesla/Components/TeslaCoilComponent.cs
@@ -1,6 +1,4 @@
using Content.Server.Tesla.EntitySystems;
-using Robust.Shared.Audio;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.Tesla.Components;
diff --git a/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs b/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs
index bf98d77406..4fd2f9b6ed 100644
--- a/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs
+++ b/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs
@@ -1,9 +1,7 @@
-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;
@@ -24,9 +22,9 @@ public sealed class TeslaCoilSystem : EntitySystem
//When struck by lightning, charge the internal battery
private void OnHitByLightning(Entity coil, ref HitByLightningEvent args)
{
- if (!TryComp(coil, out var batteryComponent))
- return;
-
- _battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
+ if (TryComp(coil, out var batteryComponent))
+ {
+ _battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
+ }
}
}
diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml
index 0813f49731..8d5621206d 100644
--- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml
+++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml
@@ -61,9 +61,11 @@
- 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
@@ -73,6 +75,33 @@
- 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
@@ -123,9 +152,38 @@
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
+
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_16.png b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_16.png
new file mode 100644
index 0000000000..450cba0854
Binary files /dev/null and b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_16.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_25.png b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_25.png
new file mode 100644
index 0000000000..8cc1493e9f
Binary files /dev/null and b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_25.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_8.png b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_8.png
new file mode 100644
index 0000000000..9edd528a8b
Binary files /dev/null and b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/DamageOverlay_8.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/meta.json b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/meta.json
new file mode 100644
index 0000000000..e9dc48878c
--- /dev/null
+++ b/Resources/Textures/Structures/Power/Generation/Tesla/coil_cracks.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "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}
+ ]
+}
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_16.png b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_16.png
new file mode 100644
index 0000000000..3eadb94ad0
Binary files /dev/null and b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_16.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_25.png b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_25.png
new file mode 100644
index 0000000000..836935bfd8
Binary files /dev/null and b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_25.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_8.png b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_8.png
new file mode 100644
index 0000000000..97f7d381c1
Binary files /dev/null and b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/DamageOverlay_8.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/meta.json b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/meta.json
new file mode 100644
index 0000000000..e9dc48878c
--- /dev/null
+++ b/Resources/Textures/Structures/Power/Generation/Tesla/groundingrod_cracks.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "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}
+ ]
+}