diff --git a/Content.Server/Cloning/CloningSystem.cs b/Content.Server/Cloning/CloningSystem.cs index 92e658591a..4eeba58093 100644 --- a/Content.Server/Cloning/CloningSystem.cs +++ b/Content.Server/Cloning/CloningSystem.cs @@ -46,6 +46,7 @@ using Content.Shared.Humanoid.Prototypes; using Robust.Shared.GameObjects.Components.Localization; //DeltaV End Metem Usings using Content.Server.EntityList; +using Content.Server.Parkstation.Cloning; using Content.Shared.SSDIndicator; using Content.Shared.Damage.ForceSay; using Content.Server.Polymorph.Components; @@ -249,6 +250,12 @@ public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity(uid); + // For other systems adding components to the mob + var bce = new BeenClonedEvent(pref, mind, mob, bodyToClone, clonePod.Owner); + RaiseLocalEvent(bce); + // TODO: Ideally, components like this should be components on the mind entity so this isn't necessary. // Add on special job components to the mob. if (_jobs.MindTryGetJob(mindEnt, out _, out var prototype)) diff --git a/Content.Server/Parkstation/Cloning/CloningEvents.cs b/Content.Server/Parkstation/Cloning/CloningEvents.cs new file mode 100644 index 0000000000..f1ab620f3d --- /dev/null +++ b/Content.Server/Parkstation/Cloning/CloningEvents.cs @@ -0,0 +1,21 @@ +using Content.Shared.Mind; +using Content.Shared.Preferences; + +namespace Content.Server.Parkstation.Cloning; + +[ByRefEvent] +public sealed class BeingClonedEvent(HumanoidCharacterProfile profile, MindComponent mind, EntityUid cloner) : CancellableEntityEventArgs +{ + public HumanoidCharacterProfile Profile = profile; + public MindComponent Mind = mind; + public EntityUid Cloner = cloner; +} + +public sealed class BeenClonedEvent(HumanoidCharacterProfile profile, MindComponent mind, EntityUid mob, EntityUid OriginalMob, EntityUid cloner) : EntityEventArgs +{ + public HumanoidCharacterProfile Profile = profile; + public MindComponent Mind = mind; + public EntityUid Mob = mob; + public EntityUid OriginalMob = OriginalMob; + public EntityUid Cloner = cloner; +} diff --git a/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwapPowerComponent.cs b/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwapPowerComponent.cs index 26b5fde57f..500a487c20 100644 --- a/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwapPowerComponent.cs +++ b/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwapPowerComponent.cs @@ -19,4 +19,36 @@ public sealed partial class ShadowkinDarkSwapPowerComponent : Component [DataField("shadowkinDarkSwapActionEntity")] public EntityUid? ShadowkinDarkSwapActionEntity; + + + /// + /// If the entity should be sent to the dark + /// + [DataField("invisible")] + public bool Invisible = true; + + /// + /// If it should be pacified + /// + [DataField("pacify")] + public bool Pacify = true; + + /// + /// If the entity should dim nearby lights when swapped + /// + [DataField("darken"), ViewVariables(VVAccess.ReadWrite)] + public bool Darken = true; + + /// + /// How far to dim nearby lights + /// + [DataField("range"), ViewVariables(VVAccess.ReadWrite)] + public float DarkenRange = 5f; + + /// + /// How fast to refresh nearby light dimming in seconds + /// Without this performance would be significantly worse + /// + [ViewVariables(VVAccess.ReadWrite)] + public float DarkenRate = 0.084f; // 1/12th of a second } diff --git a/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinSightComponent.cs b/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinSightComponent.cs new file mode 100644 index 0000000000..b9b097a149 --- /dev/null +++ b/Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinSightComponent.cs @@ -0,0 +1,4 @@ +namespace Content.Server.Parkstation.Species.Shadowkin.Components; + +[RegisterComponent] +public sealed partial class ShadowkinSightComponent : Component; diff --git a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs index 67b4560dbc..610e25a37f 100644 --- a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs +++ b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs @@ -65,13 +65,17 @@ private void Shutdown(EntityUid uid, ShadowkinDarkSwapPowerComponent component, private void OnInvisStartup(EntityUid uid, ShadowkinDarkSwappedComponent component, ComponentStartup args) { if (component.Pacify) - EnsureComp(uid); - - if (!component.Invisible) - return; + { + var pax = EnsureComp(uid); + pax.DisallowAllCombat = true; + pax.DisallowDisarm = true; + } - SetVisibility(uid, true); - SuppressFactions(uid, true); + if (component.Invisible) + { + SetVisibility(uid, true, true, true); + SuppressFactions(uid, true); + } } private void OnInvisShutdown(EntityUid uid, ShadowkinDarkSwappedComponent component, ComponentShutdown args) @@ -80,13 +84,15 @@ private void OnInvisShutdown(EntityUid uid, ShadowkinDarkSwappedComponent compon if (component.Invisible) { - SetVisibility(uid, false); + SetVisibility(uid, false, true, true); SuppressFactions(uid, false); } + // Prevent more updates while cleaning up component.Darken = false; - foreach (var light in component.DarkenedLights.ToArray()) + // In case more updates occur for some reason. create a copy of the list to prevent error + foreach (var light in component.DarkenedLights.ToList()) { if (!_entity.TryGetComponent(light, out var pointLight) || !_entity.TryGetComponent(light, out var shadowkinLight)) @@ -95,6 +101,7 @@ private void OnInvisShutdown(EntityUid uid, ShadowkinDarkSwappedComponent compon _darken.ResetLight(pointLight, shadowkinLight); } + // Clear the original list component.DarkenedLights.Clear(); } @@ -103,8 +110,10 @@ private void DarkSwap(EntityUid uid, ShadowkinDarkSwapPowerComponent component, { var performer = _entity.GetNetEntity(args.Performer); - // Need power to drain power - if (!_entity.HasComponent(args.Performer)) + // Need power to drain power + if (!_entity.HasComponent(args.Performer) + || _entity.TryGetComponent(args.Performer, out var cuff) + && cuff.AntiShadowkin) return; // Don't activate abilities if handcuffed @@ -112,64 +121,97 @@ private void DarkSwap(EntityUid uid, ShadowkinDarkSwapPowerComponent component, if (_entity.HasComponent(args.Performer)) return; - - var hasComp = _entity.HasComponent(args.Performer); - - if (hasComp) - Darkened(performer, args.StaminaCostOff, args.PowerCostOff, args.SoundOff, args.VolumeOff, args); - else - UnDarkened(performer, args.StaminaCostOn, args.PowerCostOn, args.SoundOn, args.VolumeOn, args); + SetDarkened(performer, !_entity.HasComponent(args.Performer), args.SoundOn, + args.VolumeOn, args.SoundOff, args.VolumeOff, args, args.StaminaCostOn, args.PowerCostOn, + args.StaminaCostOff, args.PowerCostOff); _magic.Speak(args, false); } - public void Darkened(NetEntity performer, float staminaCostOff, float powerCostOff, SoundSpecifier soundOff, float volumeOff, ShadowkinDarkSwapEvent? args) + + /// + /// Handles the effects of darkswapping + /// + /// The entity being modified + /// Is the entity swapping in to or out of The Dark? + /// Sound for the darkswapping + /// Volume for the on sound + /// Sound for the un swapping + /// Volume for the off sound + /// Stamina cost for darkswapping + /// Power cost for darkswapping + /// Stamina cost for un swapping + /// Power cost for un swapping + /// If from an event, handle it + public void SetDarkened( + NetEntity performer, + bool addComp, + SoundSpecifier? soundOn, + float? volumeOn, + SoundSpecifier? soundOff, + float? volumeOff, + ShadowkinDarkSwapEvent? args, + float staminaCostOn = 0, + float powerCostOn = 0, + float staminaCostOff = 0, + float powerCostOff = 0) { - var performerUid = _entity.GetEntity(performer); + var ent = _entity.GetEntity(performer); - var ev = new ShadowkinDarkSwapAttemptEvent(performerUid); - RaiseLocalEvent(ev); - if (ev.Cancelled) + // We require the power component to DarkSwap + if (!_entity.TryGetComponent(ent, out var power)) return; - _entity.RemoveComponent(performerUid); - RaiseNetworkEvent(new ShadowkinDarkSwappedEvent(performer, false)); - - _audio.PlayPvs(soundOff, performerUid, AudioParams.Default.WithVolume(volumeOff)); - - _power.TryAddPowerLevel(performerUid, -powerCostOff); - _stamina.TakeStaminaDamage(performerUid, staminaCostOff); - - if (args != null) - args.Handled = true; - } - - public void UnDarkened(NetEntity performer, float staminaCostOn, float powerCostOn, SoundSpecifier soundOn, float volumeOn, ShadowkinDarkSwapEvent? args) - { - var performerUid = _entity.GetEntity(performer); - - var ev = new ShadowkinDarkSwapAttemptEvent(performerUid); + // Ask other systems if we can DarkSwap + var ev = new ShadowkinDarkSwapAttemptEvent(ent); RaiseLocalEvent(ev); if (ev.Cancelled) return; - var comp = _entity.EnsureComponent(performerUid); - comp.Invisible = true; - comp.Pacify = true; - comp.Darken = true; + if (addComp) // Into The Dark + { + // Add the DarkSwapped component and set variables to match the power component + var comp = _entity.EnsureComponent(ent); + comp.Invisible = power.Invisible; + comp.Pacify = power.Pacify; + comp.Darken = power.Darken; + comp.DarkenRange = power.DarkenRange; + comp.DarkenRate = power.DarkenRate; + + // Tell other systems we've DarkSwapped + RaiseNetworkEvent(new ShadowkinDarkSwappedEvent(performer, true)); + + // Play a sound if there is one + if (soundOn != null) + _audio.PlayPvs(soundOn, ent, AudioParams.Default.WithVolume(volumeOn ?? 5f)); + + // Drain power and stamina if we have a cost + _power.TryAddPowerLevel(ent, -powerCostOn); + _stamina.TakeStaminaDamage(ent, staminaCostOn); + } + else // Out on The Dark + { + // Remove the DarkSwapped component, the rest is handled in the shutdown event + _entity.RemoveComponent(ent); - RaiseNetworkEvent(new ShadowkinDarkSwappedEvent(performer, true)); + // Tell other systems we've un DarkSwapped + RaiseNetworkEvent(new ShadowkinDarkSwappedEvent(performer, false)); - _audio.PlayPvs(soundOn, performerUid, AudioParams.Default.WithVolume(volumeOn)); + // Play a sound if there is one + if (soundOff != null) + _audio.PlayPvs(soundOff, ent, AudioParams.Default.WithVolume(volumeOff ?? 5f)); - _power.TryAddPowerLevel(performerUid, -powerCostOn); - _stamina.TakeStaminaDamage(performerUid, staminaCostOn); + // Drain power and stamina if we have a cost + _power.TryAddPowerLevel(ent, -powerCostOff); + _stamina.TakeStaminaDamage(ent, staminaCostOff); + } + // If we have an event, handle it if (args != null) args.Handled = true; } - public void SetVisibility(EntityUid uid, bool set) + public void SetVisibility(EntityUid uid, bool set, bool invisibility, bool stealth) { // We require the visibility component for this to work EnsureComp(uid); @@ -180,14 +222,20 @@ public void SetVisibility(EntityUid uid, bool set) if (_entity.TryGetComponent(uid, out EyeComponent? eye)) _eye.SetVisibilityMask(uid, eye.VisibilityMask | (int) VisibilityFlags.DarkSwapInvisibility, eye); - // Make other entities unable to see the entity unless also DarkSwapped - _visibility.AddLayer(uid, (ushort) VisibilityFlags.DarkSwapInvisibility, false); - _visibility.RemoveLayer(uid, (ushort) VisibilityFlags.Normal, false); + if (invisibility) + { + // Make other entities unable to see the entity unless also DarkSwapped + _visibility.AddLayer(uid, (ushort) VisibilityFlags.DarkSwapInvisibility, false); + _visibility.RemoveLayer(uid, (ushort) VisibilityFlags.Normal, false); + } _visibility.RefreshVisibility(uid); // Add a stealth shader to the entity - if (!_entity.HasComponent(uid)) + if (!_entity.HasComponent(uid) && stealth) + { _stealth.SetVisibility(uid, 0.8f, _entity.EnsureComponent(uid)); + _stealth.SetEnabled(uid, true); + } } else // Visible { @@ -195,14 +243,17 @@ public void SetVisibility(EntityUid uid, bool set) if (_entity.TryGetComponent(uid, out EyeComponent? eye)) _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.DarkSwapInvisibility, eye); - // Make other entities able to see the entity again - _visibility.RemoveLayer(uid, (ushort) VisibilityFlags.DarkSwapInvisibility, false); - _visibility.AddLayer(uid, (ushort) VisibilityFlags.Normal, false); + if (invisibility) + { + // Make other entities able to see the entity again + _visibility.RemoveLayer(uid, (ushort) VisibilityFlags.DarkSwapInvisibility, false); + _visibility.AddLayer(uid, (ushort) VisibilityFlags.Normal, false); + } _visibility.RefreshVisibility(uid); // Remove the stealth shader from the entity if (!_entity.HasComponent(uid)) - _stealth.SetVisibility(uid, 1f, _entity.EnsureComponent(uid)); + _stealth.SetEnabled(uid, false); } } diff --git a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs index e6c7e81e71..f568ed706a 100644 --- a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs +++ b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs @@ -61,7 +61,7 @@ private void Rest(EntityUid uid, ShadowkinRestPowerComponent component, Shadowki if (_entity.TryGetComponent(uid, out var sleepingComponent)) _actions.RemoveAction(args.Performer, sleepingComponent.WakeAction); - _power.TryAddMultiplier(args.Performer, 1.5f); + _power.TryAddMultiplier(args.Performer, 2f); // No action cooldown _actions.ClearCooldown(sleepingComponent?.WakeAction); @@ -72,7 +72,7 @@ private void Rest(EntityUid uid, ShadowkinRestPowerComponent component, Shadowki // Wake up _entity.RemoveComponent(args.Performer); _entity.RemoveComponent(args.Performer); - _power.TryAddMultiplier(args.Performer, -1.5f); + _power.TryAddMultiplier(args.Performer, -2f); // Action cooldown args.Handled = true; diff --git a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs index a576556d8e..3d81c0254a 100644 --- a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs +++ b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs @@ -59,17 +59,16 @@ private void Shutdown(EntityUid uid, ShadowkinTeleportPowerComponent component, private void Teleport(EntityUid uid, ShadowkinTeleportPowerComponent component, ShadowkinTeleportEvent args) { - // Need power to drain power - if (!_entity.TryGetComponent(args.Performer, out var comp)) - return; - - // Don't activate abilities if handcuffed - // TODO: Something like the Psionic Headcage to disable powers for Shadowkin - if (_entity.HasComponent(args.Performer)) + // Need power to drain power + if (!_entity.TryGetComponent(args.Performer, out var comp) + // Don't activate abilities if handcuffed + || _entity.TryGetComponent(args.Performer, out var cuff) + && cuff.AntiShadowkin) return; var transform = Transform(args.Performer); + // Must be on the same map if (transform.MapID != args.Target.GetMapId(EntityManager)) return; @@ -98,7 +97,6 @@ private void Teleport(EntityUid uid, ShadowkinTeleportPowerComponent component, _transform.AttachToGridOrMap(pullable.Owner); // Resume pulling - // TODO: This does nothing? // This does things sometimes, but the client never knows // This does nothing?? _pulling.TryStartPull(args.Performer, pullable.Owner); } diff --git a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs index c17e4b4c01..5a9fc9a58a 100644 --- a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs +++ b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs @@ -26,7 +26,7 @@ public ShadowkinPowerSystem() { ShadowkinPowerThreshold.Good, Locale.GetString("shadowkin-power-good") }, { ShadowkinPowerThreshold.Okay, Locale.GetString("shadowkin-power-okay") }, { ShadowkinPowerThreshold.Tired, Locale.GetString("shadowkin-power-tired") }, - { ShadowkinPowerThreshold.Min, Locale.GetString("shadowkin-power-min") } + { ShadowkinPowerThreshold.Min, Locale.GetString("shadowkin-power-min") }, }; } @@ -197,17 +197,17 @@ public void SetPowerLevel(EntityUid uid, float newPowerLevel) /// /// Tries to blackeye a shadowkin /// - public bool TryBlackeye(EntityUid uid) + public bool TryBlackeye(EntityUid uid, bool damage = true, bool checkPower = true) { - return _blackeye.TryBlackeye(uid); + return _blackeye.TryBlackeye(uid, damage, checkPower); } /// /// Blackeyes a shadowkin /// - public void Blackeye(EntityUid uid) + public void Blackeye(EntityUid uid, bool damage = true) { - _blackeye.Blackeye(uid); + _blackeye.Blackeye(uid, damage); } diff --git a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSightSystem.cs b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSightSystem.cs new file mode 100644 index 0000000000..24ab53914b --- /dev/null +++ b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSightSystem.cs @@ -0,0 +1,29 @@ +using Content.Server.Parkstation.Species.Shadowkin.Components; +using Content.Shared.Inventory.Events; + +namespace Content.Server.Parkstation.Species.Shadowkin.Systems; + +public sealed class ShadowkinSightSystem : EntitySystem +{ + [Dependency] private readonly ShadowkinDarkSwapSystem _darkSwap = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnEquipped); + } + + + private void OnEquipped(EntityUid uid, ShadowkinSightComponent component, GotEquippedEvent args) + { + _darkSwap.SetVisibility(args.Equipee, true, false, false); + } + + private void OnUnEquipped(EntityUid uid, ShadowkinSightComponent component, GotUnequippedEvent args) + { + _darkSwap.SetVisibility(args.Equipee, false, false, false); + } +} diff --git a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSystem.Blackeye.cs b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSystem.Blackeye.cs index 825d526e7e..86f652e0e0 100644 --- a/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSystem.Blackeye.cs +++ b/Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSystem.Blackeye.cs @@ -1,4 +1,6 @@ -using Content.Server.Parkstation.Species.Shadowkin.Components; +using Content.Server.Nyanotrasen.Cloning; +using Content.Server.Parkstation.Cloning; +using Content.Server.Parkstation.Species.Shadowkin.Components; using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Prototypes; @@ -30,15 +32,18 @@ public override void Initialize() SubscribeLocalEvent(OnBlackeyeAttempt); SubscribeAllEvent(OnBlackeye); + + SubscribeLocalEvent(OnCloned); } private void OnBlackeyeAttempt(ShadowkinBlackeyeAttemptEvent ev) { var uid = _entity.GetEntity(ev.Ent); - if (!_entity.TryGetComponent(uid, out var component) || - component.Blackeye || - !(component.PowerLevel <= ShadowkinComponent.PowerThresholds[ShadowkinPowerThreshold.Min] + 5)) + if (!_entity.TryGetComponent(uid, out var component) + || component.Blackeye + || ev.CheckPower + && component.PowerLevel > ShadowkinComponent.PowerThresholds[ShadowkinPowerThreshold.Min] + 5) ev.Cancel(); } @@ -56,13 +61,14 @@ private void OnBlackeye(ShadowkinBlackeyeEvent ev) _power.SetPowerLevel(uid, ShadowkinComponent.PowerThresholds[ShadowkinPowerThreshold.Min]); // Update client state - Dirty(component); + Dirty(uid, component); // Remove powers _entity.RemoveComponent(uid); _entity.RemoveComponent(uid); _entity.RemoveComponent(uid); _entity.RemoveComponent(uid); + _entity.RemoveComponent(uid); if (!ev.Damage) @@ -73,9 +79,7 @@ private void OnBlackeye(ShadowkinBlackeyeEvent ev) // Stamina crit if (_entity.TryGetComponent(uid, out var stamina)) - { _stamina.TakeStaminaDamage(uid, stamina.CritThreshold, null, uid); - } // Nearly crit with cellular damage // If already 5 damage off of crit, don't do anything @@ -87,34 +91,46 @@ private void OnBlackeye(ShadowkinBlackeyeEvent ev) _damageable.TryChangeDamage(uid, new DamageSpecifier(_prototype.Index("Cellular"), - Math.Max((double) (key.Value - minus - 5), 0)), - true, - true, - null, - null); + Math.Max((double) (key.Value - minus - 5), 0)), true); + } + + private void OnCloned(BeenClonedEvent ev) + { + // Don't give blackeyed Shadowkin their abilities back when they're cloned. + if (_entity.TryGetComponent(ev.OriginalMob, out var shadowkin) && + shadowkin.Blackeye) + _power.TryBlackeye(ev.Mob, false, false); + + // Blackeye the Shadowkin that come from the metempsychosis machine + if (_entity.HasComponent(ev.Cloner) && + _entity.HasComponent(ev.Mob)) + _power.TryBlackeye(ev.Mob, false, false); } /// /// Tries to blackeye a shadowkin /// - public bool TryBlackeye(EntityUid uid) + public bool TryBlackeye(EntityUid uid, bool damage = true, bool checkPower = true) { + if (!_entity.HasComponent(uid)) + return false; + var ent = _entity.GetNetEntity(uid); // Raise an attempted blackeye event - var ev = new ShadowkinBlackeyeAttemptEvent(ent); + var ev = new ShadowkinBlackeyeAttemptEvent(ent, checkPower); RaiseLocalEvent(ev); if (ev.Cancelled) return false; - Blackeye(uid); + Blackeye(uid, damage); return true; } /// /// Blackeyes a shadowkin /// - public void Blackeye(EntityUid uid) + public void Blackeye(EntityUid uid, bool damage = true) { var ent = _entity.GetNetEntity(uid); @@ -126,7 +142,7 @@ public void Blackeye(EntityUid uid) } component.Blackeye = true; - RaiseNetworkEvent(new ShadowkinBlackeyeEvent(ent)); - RaiseLocalEvent(new ShadowkinBlackeyeEvent(ent)); + RaiseNetworkEvent(new ShadowkinBlackeyeEvent(ent, damage)); + RaiseLocalEvent(new ShadowkinBlackeyeEvent(ent, damage)); } } diff --git a/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs b/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs index 464ef77885..e8c4f34732 100644 --- a/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs +++ b/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs @@ -12,7 +12,6 @@ namespace Content.Shared.CombatMode.Pacification; /// If you want full-pacifism (no combat mode at all), you can simply set before adding. /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentPause] -[Access(typeof(PacificationSystem))] public sealed partial class PacifiedComponent : Component { [DataField] diff --git a/Content.Shared/Cuffs/Components/HandcuffComponent.cs b/Content.Shared/Cuffs/Components/HandcuffComponent.cs index 07468a4dab..ffc5a1f423 100644 --- a/Content.Shared/Cuffs/Components/HandcuffComponent.cs +++ b/Content.Shared/Cuffs/Components/HandcuffComponent.cs @@ -99,6 +99,12 @@ public sealed partial class HandcuffComponent : Component /// [DataField] public bool UncuffEasierWhenLarge = false; + + + // Parkstation-Shadowkin Start + [DataField] + public bool AntiShadowkin; + // Parkstation-Shadowkin End } /// diff --git a/Content.Shared/Parkstation/Clothing/Components/ClothingGrantComponentComponent.cs b/Content.Shared/Parkstation/Clothing/Components/ClothingGrantComponentComponent.cs index 749ed07366..a3ffb93754 100644 --- a/Content.Shared/Parkstation/Clothing/Components/ClothingGrantComponentComponent.cs +++ b/Content.Shared/Parkstation/Clothing/Components/ClothingGrantComponentComponent.cs @@ -1,15 +1,14 @@ using Robust.Shared.Prototypes; -namespace Content.Shared.Parkstation.Clothing.Components +namespace Content.Shared.Parkstation.Clothing.Components; + +[RegisterComponent] +public sealed partial class ClothingGrantComponentComponent : Component { - [RegisterComponent] - public sealed partial class ClothingGrantComponentComponent : Component - { - [DataField("component", required: true)] - [AlwaysPushInheritance] - public ComponentRegistry Components { get; private set; } = new(); + [DataField("component", required: true)] + [AlwaysPushInheritance] + public ComponentRegistry Components { get; private set; } = new(); - [ViewVariables(VVAccess.ReadWrite)] - public bool IsActive = false; - } + [ViewVariables(VVAccess.ReadWrite)] + public bool IsActive = false; } diff --git a/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinComponent.cs b/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinComponent.cs index 023bae1be5..41186eae39 100644 --- a/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinComponent.cs +++ b/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinComponent.cs @@ -13,10 +13,10 @@ public sealed partial class ShadowkinComponent : Component public float MaxedPowerRoof = 0f; [ViewVariables(VVAccess.ReadWrite)] - public float MaxedPowerRateMin = 45f; + public float MaxedPowerRateMin = 90f; [ViewVariables(VVAccess.ReadWrite)] - public float MaxedPowerRateMax = 150f; + public float MaxedPowerRateMax = 240f; [ViewVariables(VVAccess.ReadWrite)] @@ -76,7 +76,7 @@ public float PowerLevel /// How much energy is gained per second. /// [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] - public float PowerLevelGain = 0.75f; + public float PowerLevelGain = 0.5f; /// /// Power gain multiplier diff --git a/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwappedComponent.cs b/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwappedComponent.cs index 9d4e3d8675..7eabadd869 100644 --- a/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwappedComponent.cs +++ b/Content.Shared/Parkstation/Species/Shadowkin/Components/ShadowkinDarkSwappedComponent.cs @@ -6,19 +6,23 @@ namespace Content.Shared.Parkstation.Species.Shadowkin.Components; public sealed partial class ShadowkinDarkSwappedComponent : Component { /// - /// If it should be sent to the dark + /// If the entity should be sent to the dark /// + /// + /// This is also defined in the power component, this is if you want to use only some effects of the swap without a toggle + /// [DataField("invisible")] public bool Invisible = true; /// - /// If it should be pacified + /// If the entity should be pacified /// + /// [DataField("pacify")] public bool Pacify = true; /// - /// If it should dim nearby lights + /// If the entity should dim nearby lights when swapped /// [DataField("darken"), ViewVariables(VVAccess.ReadWrite)] public bool Darken = true; @@ -26,12 +30,19 @@ public sealed partial class ShadowkinDarkSwappedComponent : Component /// /// How far to dim nearby lights /// + /// [DataField("range"), ViewVariables(VVAccess.ReadWrite)] public float DarkenRange = 5f; [ViewVariables(VVAccess.ReadOnly)] public List DarkenedLights = new(); + /// + /// How fast to refresh nearby light dimming in seconds + ///
+ /// Without this, performance would be significantly worse + ///
+ /// [ViewVariables(VVAccess.ReadWrite)] public float DarkenRate = 0.084f; // 1/12th of a second diff --git a/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Blackeye.cs b/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Blackeye.cs index 42b2206230..70613f4b22 100644 --- a/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Blackeye.cs +++ b/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Blackeye.cs @@ -5,28 +5,18 @@ namespace Content.Shared.Parkstation.Species.Shadowkin.Events; /// /// Raised to notify other systems of an attempt to blackeye a shadowkin. /// -public sealed class ShadowkinBlackeyeAttemptEvent : CancellableEntityEventArgs +public sealed class ShadowkinBlackeyeAttemptEvent(NetEntity ent, bool checkPower = true) : CancellableEntityEventArgs { - public readonly NetEntity Ent; - - public ShadowkinBlackeyeAttemptEvent(NetEntity ent) - { - Ent = ent; - } + public readonly NetEntity Ent = ent; + public readonly bool CheckPower = checkPower; } /// /// Raised when a shadowkin becomes a blackeye. /// [Serializable, NetSerializable] -public sealed class ShadowkinBlackeyeEvent : EntityEventArgs +public sealed class ShadowkinBlackeyeEvent(NetEntity ent, bool damage = true) : EntityEventArgs { - public readonly NetEntity Ent; - public readonly bool Damage; - - public ShadowkinBlackeyeEvent(NetEntity ent, bool damage = true) - { - Ent = ent; - Damage = damage; - } + public readonly NetEntity Ent = ent; + public readonly bool Damage = damage; } diff --git a/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Powers.cs b/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Powers.cs index febc58b8c5..d30413cfa4 100644 --- a/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Powers.cs +++ b/Content.Shared/Parkstation/Species/Shadowkin/Events/ShadowkinEvents.Powers.cs @@ -76,35 +76,21 @@ public sealed partial class ShadowkinDarkSwapEvent : InstantActionEvent, ISpeakS public string? Speech { get; set; } } -public sealed class ShadowkinDarkSwapAttemptEvent : CancellableEntityEventArgs +public sealed class ShadowkinDarkSwapAttemptEvent(EntityUid performer) : CancellableEntityEventArgs { - EntityUid Performer; - - public ShadowkinDarkSwapAttemptEvent(EntityUid performer) - { - Performer = performer; - } + public EntityUid Performer = performer; } -public sealed partial class ShadowkinRestEvent: InstantActionEvent -{ - -} +public sealed partial class ShadowkinRestEvent: InstantActionEvent; /// /// Raised over network to notify the client that they're going in/out of The Dark. /// [Serializable, NetSerializable] -public sealed class ShadowkinDarkSwappedEvent : EntityEventArgs +public sealed class ShadowkinDarkSwappedEvent(NetEntity performer, bool darkSwapped) : EntityEventArgs { - public NetEntity Performer { get; } - public bool DarkSwapped { get; } - - public ShadowkinDarkSwappedEvent(NetEntity performer, bool darkSwapped) - { - Performer = performer; - DarkSwapped = darkSwapped; - } + public NetEntity Performer = performer; + public bool DarkSwapped = darkSwapped; } diff --git a/Content.Shared/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs b/Content.Shared/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs index 60299b5011..48068385d9 100644 --- a/Content.Shared/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs +++ b/Content.Shared/Parkstation/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs @@ -22,15 +22,15 @@ public override void Initialize() private void OnInteractionAttempt(EntityUid uid, ShadowkinDarkSwappedComponent component, InteractionAttemptEvent args) { - if (args.Target == null || !_entity.TryGetComponent(args.Target, out var __) || - _entity.TryGetComponent(args.Target, out _)) + if (args.Target == null + || !_entity.HasComponent(args.Target) + || _entity.HasComponent(args.Target)) return; args.Cancel(); - if (_gameTiming.InPrediction) - return; - // TODO This appears on way too many things - _popup.PopupEntity(Loc.GetString("ethereal-pickup-fail"), args.Target.Value, uid); + if (_gameTiming is { InPrediction: true, IsFirstTimePredicted: true }) + //TODO: This appears on way too many things + _popup.PopupEntity(Loc.GetString("ethereal-pickup-fail"), args.Target.Value, uid); } } diff --git a/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml b/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml index 891067b1c1..87101c7139 100644 --- a/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml +++ b/Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml @@ -11,3 +11,4 @@ Reptilian: 0.5 SlimePerson: 0.5 Vulpkanin: 0.5 + Shadowkin: 0.4 diff --git a/Resources/Prototypes/Parkstation/Body/Organs/shadowkin.yml b/Resources/Prototypes/Parkstation/Body/Organs/shadowkin.yml new file mode 100644 index 0000000000..3d51544e08 --- /dev/null +++ b/Resources/Prototypes/Parkstation/Body/Organs/shadowkin.yml @@ -0,0 +1,136 @@ +- type: entity + id: BaseShadowkinOrgan + parent: BaseItem + abstract: true + components: + - type: Organ + - type: Sprite + sprite: Parkstation/Mobs/Species/Shadowkin/organs.rsi + + +- type: entity + id: OrganShadowkinBrain + parent: BaseShadowkinOrgan + name: brain + description: The source of incredible, unending intelligence. + components: + - type: Sprite + state: brain + - type: Organ + - type: Input + context: ghost + - type: InputMover + - type: MovementSpeedModifier # How the hell does it walk? + baseWalkSpeed: 0 + baseSprintSpeed: 0 + - type: Brain + +- type: entity + id: OrganShadowkinEyes + parent: BaseShadowkinOrgan + name: eyes + description: I see beyond anything you ever will! + components: + - type: Sprite + state: eyes + - type: Organ + +- type: entity + id: OrganShadowkinEars + parent: BaseShadowkinOrgan + name: ears + description: Hey, listen! + components: + - type: Sprite + state: ears + - type: Organ + +- type: entity + id: OrganShadowkinTongue + parent: BaseShadowkinOrgan + name: tongue + description: A fleshy muscle mostly used for lying. + components: + - type: Sprite + state: tongue + - type: Organ + + +- type: entity + id: OrganShadowkinAppendix + parent: BaseShadowkinOrgan + name: appendix + description: What does this do? + components: + - type: Sprite + state: appendix + - type: Organ + + +- type: entity + id: OrganShadowkinHeart + parent: BaseShadowkinOrgan + name: heart + description: I feel bad for the heartless bastard who lost this. + components: + - type: Sprite + state: heart + - type: Organ + - type: Metabolizer + maxReagents: 2 + metabolizerTypes: [Shadowkin] + groups: + - id: Medicine + - id: Poison + - id: Narcotic + +- type: entity + id: OrganShadowkinStomach + parent: BaseShadowkinOrgan + name: stomach + description: '"Yummy!", says the stomach, although you are unable to hear it.' + components: + - type: Sprite + state: stomach + - type: Organ + - type: SolutionContainerManager + solutions: + stomach: + maxVol: 40 + - type: Stomach + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Shadowkin] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganShadowkinLiver + parent: BaseShadowkinOrgan + name: liver + description: "Live 'er? I hardly know 'er!" + components: + - type: Sprite + state: liver + - type: Organ + - type: Metabolizer + maxReagents: 1 + metabolizerTypes: [Shadowkin] + groups: + - id: Alcohol + rateModifier: 0.1 + +- type: entity + id: OrganShadowkinKidneys + parent: BaseShadowkinOrgan + name: kidneys + description: Give the kid their knees back, please, this is the third time this week. + components: + - type: Sprite + state: kidneys + - type: Organ + - type: Metabolizer + maxReagents: 5 + metabolizerTypes: [Shadowkin] + removeEmpty: true \ No newline at end of file diff --git a/Resources/Prototypes/Parkstation/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Parkstation/Chemistry/metabolizer_types.yml new file mode 100644 index 0000000000..66ce009b66 --- /dev/null +++ b/Resources/Prototypes/Parkstation/Chemistry/metabolizer_types.yml @@ -0,0 +1,3 @@ +- type: metabolizerType + id: Shadowkin + name: shadowkin diff --git a/Resources/Prototypes/Parkstation/Entities/Body/Parts/shadowkin.yml b/Resources/Prototypes/Parkstation/Entities/Body/Parts/shadowkin.yml index 7edfb6b7ec..da5fba8dd2 100644 --- a/Resources/Prototypes/Parkstation/Entities/Body/Parts/shadowkin.yml +++ b/Resources/Prototypes/Parkstation/Entities/Body/Parts/shadowkin.yml @@ -6,9 +6,9 @@ components: - type: Sprite netsync: false - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi - type: Icon - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi - type: Damageable damageContainer: Biological - type: BodyPart diff --git a/Resources/Prototypes/Parkstation/Entities/Body/Prototypes/shadowkin.yml b/Resources/Prototypes/Parkstation/Entities/Body/Prototypes/shadowkin.yml index b3e47eb224..88e30ad0b2 100644 --- a/Resources/Prototypes/Parkstation/Entities/Body/Prototypes/shadowkin.yml +++ b/Resources/Prototypes/Parkstation/Entities/Body/Prototypes/shadowkin.yml @@ -8,8 +8,8 @@ connections: - torso organs: - brain: OrganHumanBrain - eyes: OrganHumanEyes + brain: OrganShadowkinBrain + eyes: OrganShadowkinEyes torso: part: TorsoShadowkin connections: @@ -17,12 +17,12 @@ - right arm - left leg - right leg - organs: # placeholders - heart: OrganHumanHeart - lungs: OrganHumanLungs - stomach: OrganHumanStomach - liver: OrganHumanLiver - kidneys: OrganHumanKidneys + organs: + heart: OrganShadowkinHeart + # lungs: OrganShadowkinLungs + stomach: OrganShadowkinStomach + liver: OrganShadowkinLiver + kidneys: OrganShadowkinKidneys right arm: part: RightArmShadowkin connections: diff --git a/Resources/Prototypes/Parkstation/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/Parkstation/Entities/Clothing/Eyes/glasses.yml new file mode 100644 index 0000000000..3693a440ee --- /dev/null +++ b/Resources/Prototypes/Parkstation/Entities/Clothing/Eyes/glasses.yml @@ -0,0 +1,14 @@ +- type: entity + parent: ClothingEyesBase + id: ClothingEyesGlassesShadowkinDarkWindow + name: darkened goggles + description: An unusual pair of goggles designed to allow the wearer to peer into The Dark. + components: + - type: Sprite + sprite: Parkstation/Clothing/Eyes/Glasses/darkened.rsi + - type: Clothing + sprite: Parkstation/Clothing/Eyes/Glasses/darkened.rsi + - type: EyeProtection + - type: DropOnSlip + chance: 20 + - type: ShadowkinSight diff --git a/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuit-helmets.yml index fc6b369310..f636057462 100644 --- a/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuit-helmets.yml @@ -39,3 +39,30 @@ Piercing: 0.95 Heat: 0.9 Radiation: 0.6 + +- type: entity + parent: ClothingHeadHardsuitBase + id: ClothingHeadHelmetHardsuitShadowkinDarkswap + noSpawn: true + name: darkened softsuit helmet + components: + - type: Sprite + sprite: Parkstation/Clothing/Head/Hardsuits/darkened.rsi + - type: Clothing + sprite: Parkstation/Clothing/Head/Hardsuits/darkened.rsi + - type: PointLight + color: "#d6adff" + - type: Armor + modifiers: + coefficients: + Blunt: 1.4 + Slash: 1.3 + Piercing: 1.2 + Radiation: 0.4 + - type: ClothingSpeedModifier + walkModifier: 0.5 + sprintModifier: 0.5 + - type: ClothingGrantComponent + component: + - type: ShadowkinDarkSwapped + darken: false diff --git a/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuits.yml b/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuits.yml index 43f01db5ec..148219f03f 100644 --- a/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuits.yml +++ b/Resources/Prototypes/Parkstation/Entities/Clothing/Head/hardsuits.yml @@ -26,3 +26,33 @@ damageCoefficient: 0.8 - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitHoP + +- type: entity + parent: ClothingOuterHardsuitBase + id: ClothingOuterHardsuitShadowkinDarkswap + name: darkened softsuit + description: This hardsuit allows the wearer to jump the gap between the "normal" dimension and The Dark. + components: + - type: Sprite + sprite: Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi + - type: Clothing + sprite: Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.9 + Slash: 0.8 + Piercing: 0.9 + Radiation: 0.3 + - type: ClothingSpeedModifier + walkModifier: 0.9 + sprintModifier: 0.9 + - type: Item + size: 65 + - type: Tag + tags: + - FullBodyOuter + - Hardsuit + - type: ToggleableClothing + clothingPrototype: ClothingHeadHelmetHardsuitShadowkinDarkswap + actionId: ShadowkinDarkSwapHardsuitToggle diff --git a/Resources/Prototypes/Parkstation/Entities/Mobs/Player/shadowkin.yml b/Resources/Prototypes/Parkstation/Entities/Mobs/Player/shadowkin.yml index f8a2449c66..916bf83767 100644 --- a/Resources/Prototypes/Parkstation/Entities/Mobs/Player/shadowkin.yml +++ b/Resources/Prototypes/Parkstation/Entities/Mobs/Player/shadowkin.yml @@ -6,10 +6,11 @@ components: - type: HumanoidAppearance species: Shadowkin + initial: Shadowkin - type: Hunger - type: Thirst - type: Icon - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: full - type: Body prototype: Shadowkin @@ -82,7 +83,58 @@ layer: - MobLayer - type: Sprite + noRot: true + drawdepth: Mobs scale: 0.85, 0.85 # Small + layers: + - map: ["enum.HumanoidVisualLayers.Chest"] + - map: ["enum.HumanoidVisualLayers.Head"] + - map: ["enum.HumanoidVisualLayers.Snout"] + - map: ["enum.HumanoidVisualLayers.Eyes"] + - map: ["enum.HumanoidVisualLayers.RArm"] + - map: ["enum.HumanoidVisualLayers.LArm"] + - map: ["enum.HumanoidVisualLayers.RLeg"] + - map: ["enum.HumanoidVisualLayers.LLeg"] + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: ["enum.HumanoidVisualLayers.StencilMask"] + sprite: Mobs/Customization/masking_helpers.rsi + state: full + visible: false + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["socks"] + - map: ["underpants"] + - map: ["undershirt"] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: ["id"] + - map: ["gloves"] + - map: ["shoes"] + - map: ["ears"] + - map: ["outerClothing"] + - map: ["eyes"] + - map: ["belt"] + - map: ["neck"] + - map: ["back"] + - map: ["enum.HumanoidVisualLayers.FacialHair"] + - map: ["enum.HumanoidVisualLayers.Hair"] + - map: ["enum.HumanoidVisualLayers.HeadSide"] + - map: ["enum.HumanoidVisualLayers.HeadTop"] + - map: ["mask"] + - map: ["head"] + - map: ["pocket1"] + - map: ["pocket2"] + - map: ["enum.HumanoidVisualLayers.Tail"] + - map: ["enum.HumanoidVisualLayers.Wings"] - type: Eye zoom: "0.85, 0.85" - type: MeleeWeapon @@ -129,8 +181,6 @@ - type: PotentialPsionic chance: -2 # They have their own abilities. - type: MovementSpeedModifier - baseWalkSpeed : 4.5 - baseSprintSpeed : 2.7 - type: entity diff --git a/Resources/Prototypes/Parkstation/Entities/Objects/Misc/handcuffs.yml b/Resources/Prototypes/Parkstation/Entities/Objects/Misc/handcuffs.yml new file mode 100644 index 0000000000..e458dd804f --- /dev/null +++ b/Resources/Prototypes/Parkstation/Entities/Objects/Misc/handcuffs.yml @@ -0,0 +1,21 @@ +- type: entity + parent: Handcuffs + id: HandcuffsShadowkin + name: shadowkin restraints + description: One of the first creations after finding Shadowkin, these were used to contain the Shadowkin during research so they didn't teleport away. + components: + - type: Item + size: 20 + - type: Handcuff + cuffedRSI: Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi + breakoutTime: 40 + damageOnResist: + types: + Blunt: 2 + cuffTime: 4 + uncuffTime: 5 + stunBonus: 4 + antiShadowkin: true + - type: Sprite + sprite: Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi + state: icon diff --git a/Resources/Prototypes/Parkstation/HumanoidProfiles/shadowkin.yml b/Resources/Prototypes/Parkstation/HumanoidProfiles/shadowkin.yml new file mode 100644 index 0000000000..1093b4f2c7 --- /dev/null +++ b/Resources/Prototypes/Parkstation/HumanoidProfiles/shadowkin.yml @@ -0,0 +1,6 @@ +- type: humanoidProfile + id: Shadowkin + profile: + species: Shadowkin + height: 0.85 + width: 0.85 diff --git a/Resources/Prototypes/Parkstation/Magic/shadowkin.yml b/Resources/Prototypes/Parkstation/Magic/shadowkin.yml index e90a5d332c..f33d94d59b 100644 --- a/Resources/Prototypes/Parkstation/Magic/shadowkin.yml +++ b/Resources/Prototypes/Parkstation/Magic/shadowkin.yml @@ -1,5 +1,6 @@ - type: entity id: ShadowkinTeleportAction + noSpawn: true name: action-name-shadowkin-teleport description: action-description-shadowkin-teleport components: @@ -20,6 +21,7 @@ - type: entity id: ShadowkinDarkSwapAction + noSpawn: true name: action-name-shadowkin-darkswap description: action-description-shadowkin-darkswap components: @@ -39,6 +41,7 @@ - type: entity id: ShadowkinRestAction + noSpawn: true name: action-name-shadowkin-rest description: action-description-shadowkin-rest components: @@ -52,3 +55,17 @@ checkCanInteract: false checkConsciousness: false event: !type:ShadowkinRestEvent + +- type: entity + id: ShadowkinDarkSwapHardsuitToggle + noSpawn: true + name: action-name-shadowkin-darkswap + components: + - type: InstantAction + useDelay: 15 + itemIconStyle: NoItem + priority: -21 + icon: + sprite: Parkstation/Clothing/Head/Hardsuits/darkened.rsi + state: icon + event: !type:ToggleClothingEvent diff --git a/Resources/Prototypes/Parkstation/Species/shadowkin.yml b/Resources/Prototypes/Parkstation/Species/shadowkin.yml index d0c5388b35..fd44829b3e 100644 --- a/Resources/Prototypes/Parkstation/Species/shadowkin.yml +++ b/Resources/Prototypes/Parkstation/Species/shadowkin.yml @@ -73,89 +73,89 @@ - type: humanoidBaseSprite id: MobShadowkinHead baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: head_m - type: humanoidBaseSprite id: MobShadowkinHeadMale baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: head_m - type: humanoidBaseSprite id: MobShadowkinHeadFemale baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: head_f - type: humanoidBaseSprite id: MobShadowkinTorso baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: torso_m - type: humanoidBaseSprite id: MobShadowkinTorsoMale baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: torso_m - type: humanoidBaseSprite id: MobShadowkinTorsoFemale baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: torso_f - type: humanoidBaseSprite id: MobShadowkinLLeg baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: l_leg - type: humanoidBaseSprite id: MobShadowkinLHand baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: l_hand - type: humanoidBaseSprite id: MobShadowkinEyes baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: eyes - type: humanoidBaseSprite id: MobShadowkinLArm baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: l_arm - type: humanoidBaseSprite id: MobShadowkinLFoot baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: l_foot - type: humanoidBaseSprite id: MobShadowkinRLeg baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: r_leg - type: humanoidBaseSprite id: MobShadowkinRHand baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: r_hand - type: humanoidBaseSprite id: MobShadowkinRArm baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: r_arm - type: humanoidBaseSprite id: MobShadowkinRFoot baseSprite: - sprite: Parkstation/Mobs/Species/shadowkin.rsi + sprite: Parkstation/Mobs/Species/Shadowkin/parts.rsi state: r_foot diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 661e1b7dd1..30cb3893a1 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -512,6 +512,14 @@ shouldHave: true reagent: Protein amount: 0.5 + # Parkstation-Shadowkin Start + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Shadowkin + reagent: Protein + amount: 0.5 + # Parkstation-Shadowkin End - type: reagent id: Allicin diff --git a/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/equipped-EYES.png b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/equipped-EYES.png new file mode 100644 index 0000000000..39fafeb144 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/equipped-EYES.png differ diff --git a/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/icon.png b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/icon.png new file mode 100644 index 0000000000..8ef5aa68d0 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/icon.png differ diff --git a/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-left.png b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-left.png new file mode 100644 index 0000000000..7ecbd93e8a Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-left.png differ diff --git a/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-right.png b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-right.png new file mode 100644 index 0000000000..26fd8e57a4 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-right.png differ diff --git a/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/meta.json b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/meta.json new file mode 100644 index 0000000000..555efbc7da --- /dev/null +++ b/Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "JustAnOrange", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-EYES", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/equipped-HELMET.png b/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..f6599f7bd4 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/icon.png b/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/icon.png new file mode 100644 index 0000000000..94d9e03b82 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/icon.png differ diff --git a/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/meta.json b/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/meta.json new file mode 100644 index 0000000000..66589a849a --- /dev/null +++ b/Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "JustAnOrange", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000..c93eb1bc51 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/icon.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/icon.png new file mode 100644 index 0000000000..4aa2067759 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/icon.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-left.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-left.png new file mode 100644 index 0000000000..6872735699 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-left.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-right.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-right.png new file mode 100644 index 0000000000..37b71b2cd3 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-right.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/meta.json b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/meta.json new file mode 100644 index 0000000000..57a0b994f9 --- /dev/null +++ b/Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "JustAnOrange", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/body-overlay-2.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/body-overlay-2.png new file mode 100644 index 0000000000..e8618fc6b7 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/body-overlay-2.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/icon.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/icon.png new file mode 100644 index 0000000000..def3161bb0 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/icon.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-left.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-left.png new file mode 100644 index 0000000000..5c15def766 Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-left.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-right.png b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-right.png new file mode 100644 index 0000000000..99c96d368a Binary files /dev/null and b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-right.png differ diff --git a/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/meta.json b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/meta.json new file mode 100644 index 0000000000..365122e186 --- /dev/null +++ b/Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "JustAnOrange", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "body-overlay-2", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/appendix.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/appendix.png new file mode 100644 index 0000000000..0d2ad309c7 Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/appendix.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/brain.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/brain.png new file mode 100644 index 0000000000..ac2806b79c Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/brain.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/core.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/core.png new file mode 100644 index 0000000000..ac2d7893fd Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/core.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/ears.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/ears.png new file mode 100644 index 0000000000..6ff3ac86b7 Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/ears.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/eyes.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/eyes.png new file mode 100644 index 0000000000..f7c0a306aa Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/eyes.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/heart.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/heart.png new file mode 100644 index 0000000000..1b79b529ae Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/heart.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/kidneys.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/kidneys.png new file mode 100644 index 0000000000..482bb24102 Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/kidneys.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/liver.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/liver.png new file mode 100644 index 0000000000..0a2e6ab25a Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/liver.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/lungs.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/lungs.png new file mode 100644 index 0000000000..a76c9fc1eb Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/lungs.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/meta.json b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/meta.json new file mode 100644 index 0000000000..1c9aebfb6d --- /dev/null +++ b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/meta.json @@ -0,0 +1,44 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/commit/f309886bf3e29808206693e9142304260df134e9", + "states": [ + { + "name": "appendix" + }, + { + "name": "brain" + }, + { + "name": "core" + }, + { + "name": "ears" + }, + { + "name": "eyes" + }, + { + "name": "heart" + }, + { + "name": "kidneys" + }, + { + "name": "liver" + }, + { + "name": "lungs" + }, + { + "name": "stomach" + }, + { + "name": "tongue" + } + ] +} diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/stomach.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/stomach.png new file mode 100644 index 0000000000..a0341750d3 Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/stomach.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/tongue.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/tongue.png new file mode 100644 index 0000000000..64306900f5 Binary files /dev/null and b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/tongue.png differ diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/eyes.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/eyes.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/eyes.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/eyes.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/full.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/full.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/full.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/full.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/head_f.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/head_f.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/head_f.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/head_f.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/head_m.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/head_m.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/head_m.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/head_m.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_arm.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_arm.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_arm.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_arm.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_foot.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_foot.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_foot.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_foot.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_hand.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_hand.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_hand.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_hand.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_leg.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_leg.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/l_leg.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/l_leg.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/meta.json b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/meta.json similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/meta.json rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/meta.json index 11752d5140..c4f9c9c10f 100644 --- a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/meta.json +++ b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/meta.json @@ -7,6 +7,10 @@ "license": "CC-BY-SA-3.0", "copyright": "https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/5bc3ea02ce03a551c85017f1ddd411315a19a5ca#diff-519788fa2ca74299d1686a44d3ab2098b49ed5ab65d293ec742bead7d49f0b8d", "states": [ + { + "name": "eyes", + "directions": 4 + }, { "name": "full", "directions": 4 @@ -58,10 +62,6 @@ { "name": "l_foot", "directions": 4 - }, - { - "name": "eyes", - "directions": 4 } ] } diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_arm.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_arm.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_arm.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_arm.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_foot.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_foot.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_foot.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_foot.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_hand.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_hand.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_hand.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_hand.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_leg.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_leg.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/r_leg.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/r_leg.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/torso_f.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/torso_f.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/torso_f.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/torso_f.png diff --git a/Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/torso_m.png b/Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/torso_m.png similarity index 100% rename from Resources/Textures/Parkstation/Mobs/Species/shadowkin.rsi/torso_m.png rename to Resources/Textures/Parkstation/Mobs/Species/Shadowkin/parts.rsi/torso_m.png