Major Tesla tweaks (#23235)

* add ignore chance

* twekas

* add damaging and repairing

* grounding rod undestructable by tesla
This commit is contained in:
Ed
2024-01-01 10:33:48 +03:00
committed by GitHub
parent 2b01899d63
commit 5e1fcfc63e
14 changed files with 135 additions and 25 deletions

View File

@@ -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
{
/// <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>
@@ -56,4 +63,10 @@ public sealed partial class LightningTargetComponent : Component
/// </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;
}

View File

@@ -75,16 +75,26 @@ public sealed class LightningSystem : SharedLightningSystem
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++;
}
}
}

View File

@@ -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;
/// </summary>
public sealed class LightningTargetSystem : EntitySystem
{
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly ExplosionSystem _explosionSystem = default!;
public override void Initialize()
@@ -20,10 +22,12 @@ public sealed class LightningTargetSystem : EntitySystem
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;
if (uid.Comp.LightningExplode)
{
_explosionSystem.QueueExplosion(
Transform(uid).MapPosition,
uid.Comp.ExplosionPrototype,
@@ -32,3 +36,4 @@ public sealed class LightningTargetSystem : EntitySystem
canCreateVacuum: false);
}
}
}

View File

@@ -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;

View File

@@ -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<TeslaCoilComponent> coil, ref HitByLightningEvent args)
{
if (!TryComp<BatteryComponent>(coil, out var batteryComponent))
return;
if (TryComp<BatteryComponent>(coil, out var batteryComponent))
{
_battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
}
}
}

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

View File

@@ -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}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

View File

@@ -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}
]
}