From 9ce2fea66bacbc1a9c1e68a4daf85dcd5320c1c1 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT Date: Mon, 19 Aug 2024 23:09:25 -0700 Subject: [PATCH] https://github.com/Simple-Station/Parkstation/pull/209 --- Content.Server/Cloning/CloningSystem.cs | 11 ++ .../Parkstation/Cloning/CloningEvents.cs | 21 +++ .../ShadowkinDarkSwapPowerComponent.cs | 32 ++++ .../Components/ShadowkinSightComponent.cs | 4 + .../Systems/ShadowkinPowerSystem.DarkSwap.cs | 163 ++++++++++++------ .../Systems/ShadowkinPowerSystem.Rest.cs | 4 +- .../Systems/ShadowkinPowerSystem.Teleport.cs | 14 +- .../Shadowkin/Systems/ShadowkinPowerSystem.cs | 10 +- .../Shadowkin/Systems/ShadowkinSightSystem.cs | 29 ++++ .../Systems/ShadowkinSystem.Blackeye.cs | 52 ++++-- .../Pacification/PacifiedComponent.cs | 1 - .../Cuffs/Components/HandcuffComponent.cs | 6 + .../ClothingGrantComponentComponent.cs | 19 +- .../Components/ShadowkinComponent.cs | 6 +- .../ShadowkinDarkSwappedComponent.cs | 17 +- .../Events/ShadowkinEvents.Blackeye.cs | 22 +-- .../Events/ShadowkinEvents.Powers.cs | 26 +-- .../Systems/ShadowkinPowerSystem.DarkSwap.cs | 12 +- .../Nyanotrasen/metempsychoticHumanoids.yml | 1 + .../Parkstation/Body/Organs/shadowkin.yml | 136 +++++++++++++++ .../Chemistry/metabolizer_types.yml | 3 + .../Entities/Body/Parts/shadowkin.yml | 4 +- .../Entities/Body/Prototypes/shadowkin.yml | 16 +- .../Entities/Clothing/Eyes/glasses.yml | 14 ++ .../Clothing/Head/hardsuit-helmets.yml | 27 +++ .../Entities/Clothing/Head/hardsuits.yml | 30 ++++ .../Entities/Mobs/Player/shadowkin.yml | 56 +++++- .../Entities/Objects/Misc/handcuffs.yml | 21 +++ .../HumanoidProfiles/shadowkin.yml | 6 + .../Parkstation/Magic/shadowkin.yml | 17 ++ .../Parkstation/Species/shadowkin.yml | 30 ++-- Resources/Prototypes/Reagents/toxins.yml | 8 + .../Glasses/darkened.rsi/equipped-EYES.png | Bin 0 -> 314 bytes .../Eyes/Glasses/darkened.rsi/icon.png | Bin 0 -> 415 bytes .../Eyes/Glasses/darkened.rsi/inhand-left.png | Bin 0 -> 386 bytes .../Glasses/darkened.rsi/inhand-right.png | Bin 0 -> 397 bytes .../Eyes/Glasses/darkened.rsi/meta.json | 26 +++ .../darkened.rsi/equipped-HELMET.png | Bin 0 -> 1388 bytes .../Head/Hardsuits/darkened.rsi/icon.png | Bin 0 -> 847 bytes .../Head/Hardsuits/darkened.rsi/meta.json | 18 ++ .../darkened.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 1972 bytes .../Hardsuits/darkened.rsi/icon.png | Bin 0 -> 1183 bytes .../Hardsuits/darkened.rsi/inhand-left.png | Bin 0 -> 1097 bytes .../Hardsuits/darkened.rsi/inhand-right.png | Bin 0 -> 1158 bytes .../Hardsuits/darkened.rsi/meta.json | 26 +++ .../body-overlay-2.png | Bin 0 -> 1142 bytes .../Misc/shadowkin_restraints.rsi/icon.png | Bin 0 -> 3072 bytes .../shadowkin_restraints.rsi/inhand-left.png | Bin 0 -> 234 bytes .../shadowkin_restraints.rsi/inhand-right.png | Bin 0 -> 242 bytes .../Misc/shadowkin_restraints.rsi/meta.json | 26 +++ .../Species/Shadowkin/organs.rsi/appendix.png | Bin 0 -> 1609 bytes .../Species/Shadowkin/organs.rsi/brain.png | Bin 0 -> 823 bytes .../Species/Shadowkin/organs.rsi/core.png | Bin 0 -> 927 bytes .../Species/Shadowkin/organs.rsi/ears.png | Bin 0 -> 1677 bytes .../Species/Shadowkin/organs.rsi/eyes.png | Bin 0 -> 1014 bytes .../Species/Shadowkin/organs.rsi/heart.png | Bin 0 -> 670 bytes .../Species/Shadowkin/organs.rsi/kidneys.png | Bin 0 -> 759 bytes .../Species/Shadowkin/organs.rsi/liver.png | Bin 0 -> 710 bytes .../Species/Shadowkin/organs.rsi/lungs.png | Bin 0 -> 735 bytes .../Species/Shadowkin/organs.rsi/meta.json | 44 +++++ .../Species/Shadowkin/organs.rsi/stomach.png | Bin 0 -> 770 bytes .../Species/Shadowkin/organs.rsi/tongue.png | Bin 0 -> 2303 bytes .../parts.rsi}/eyes.png | Bin .../parts.rsi}/full.png | Bin .../parts.rsi}/head_f.png | Bin .../parts.rsi}/head_m.png | Bin .../parts.rsi}/l_arm.png | Bin .../parts.rsi}/l_foot.png | Bin .../parts.rsi}/l_hand.png | Bin .../parts.rsi}/l_leg.png | Bin .../parts.rsi}/meta.json | 8 +- .../parts.rsi}/r_arm.png | Bin .../parts.rsi}/r_foot.png | Bin .../parts.rsi}/r_hand.png | Bin .../parts.rsi}/r_leg.png | Bin .../parts.rsi}/torso_f.png | Bin .../parts.rsi}/torso_m.png | Bin 77 files changed, 786 insertions(+), 180 deletions(-) create mode 100644 Content.Server/Parkstation/Cloning/CloningEvents.cs create mode 100644 Content.Server/Parkstation/Species/Shadowkin/Components/ShadowkinSightComponent.cs create mode 100644 Content.Server/Parkstation/Species/Shadowkin/Systems/ShadowkinSightSystem.cs create mode 100644 Resources/Prototypes/Parkstation/Body/Organs/shadowkin.yml create mode 100644 Resources/Prototypes/Parkstation/Chemistry/metabolizer_types.yml create mode 100644 Resources/Prototypes/Parkstation/Entities/Clothing/Eyes/glasses.yml create mode 100644 Resources/Prototypes/Parkstation/Entities/Objects/Misc/handcuffs.yml create mode 100644 Resources/Prototypes/Parkstation/HumanoidProfiles/shadowkin.yml create mode 100644 Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/equipped-EYES.png create mode 100644 Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/icon.png create mode 100644 Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-left.png create mode 100644 Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/inhand-right.png create mode 100644 Resources/Textures/Parkstation/Clothing/Eyes/Glasses/darkened.rsi/meta.json create mode 100644 Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/icon.png create mode 100644 Resources/Textures/Parkstation/Clothing/Head/Hardsuits/darkened.rsi/meta.json create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/icon.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-left.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/inhand-right.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Hardsuits/darkened.rsi/meta.json create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/body-overlay-2.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/icon.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-left.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/inhand-right.png create mode 100644 Resources/Textures/Parkstation/Clothing/OuterClothing/Misc/shadowkin_restraints.rsi/meta.json create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/appendix.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/brain.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/core.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/ears.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/eyes.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/heart.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/kidneys.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/liver.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/lungs.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/meta.json create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/stomach.png create mode 100644 Resources/Textures/Parkstation/Mobs/Species/Shadowkin/organs.rsi/tongue.png rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/eyes.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/full.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/head_f.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/head_m.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/l_arm.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/l_foot.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/l_hand.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/l_leg.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/meta.json (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/r_arm.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/r_foot.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/r_hand.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/r_leg.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/torso_f.png (100%) rename Resources/Textures/Parkstation/Mobs/Species/{shadowkin.rsi => Shadowkin/parts.rsi}/torso_m.png (100%) 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 0000000000000000000000000000000000000000..39fafeb1449fe4e7c941553177275a6764af8e1c GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Zh5*mhE&XX zdut=-AqSCTAN3Q|UFIH`ptbe^i{wGWAPzsJB_|~MCU7!sTR-UqgB$DXh>k^UD(NCR z|MtIox1;?1y1o8P3|pqFc)m6I|GsLS^ckPaC)X548vpil&)0eOxhi^^)x7h)TOIeW zFBHg_xon=d?{oGEOKP`HR>?heh`Tvc*Yn?r|4XI_Uq8(VbPW^~JpFU`k5r3+@!VAp zYh%`g+y6aOcSh~U;^svfRZ-_Roq74^+}UG=G1F&HUXmTRAbYP_-pm$-FH@ge&V(Cs t;S}q2Q?u7ykFCA|4dqLX@J#ddWzYh$IiQwY3Z4vNdAjk1@5Yiy`?t)*pFY&zJ)JZy|?rD;)PEug}uGP&tKIsEKllg ziaw&cIwYHAR@mz~A2Tu-w^+x{{UV)Yec?6#m*txnZ|Hnl6UNO@Q{ODWw=_w#;pSqd z1!X~xpMJHSGr87ylW$IG(5_ukcD%jJ#SFL4z0GL;5$M`-Y@WI2n}SC?I@9GJZWiG4 z@;&@LXyu;8qK6o-tvsuElm}?X-pHEkE3b&;{C|F7d*Pg9u2v<6osXLn`LH zy|vNnaDc?okHL-^f=p~oGhMVIc5#<~V%(H^+V~mgF9tvH8m5Cqp3|KkvN0tcd}!q{ zM@DC-p!5IzmfyYi6`Yu)%m_3Y2+~u=Uup_~*8ZiTeX0rzM`)vq@+F^!T;LlF4jme|vs0&+6g){B!ZWU29cd zzWWzc8auyc{;E}nUY~APd8rlos-kAn)^GLd4wKew-E4E;b5hOi6PD^Pvlrf<^L~Bt zxs%&_RW#3+FV@lTozM^$C~~lRy@~Hsm6M*DD^_Wh#4i6=)058$aVdzLv(@u|Y41h3 z&U^env^U;Tp6ugr=G%!SLI!TtDMg$MY?&B3o(uoBZMR#qUH2SNJzr{sXPU1sgBFm@ V0WtsxE(K2pQJ$`TF6*2UngG@6p5y=k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..26fd8e57a42b5079a1d9454b1601a85f3f7e71b3 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zbv<1iLn`LH zz2)e2*g@jx$8g6CK_)h)$j*=rCHiMhF{ezwJI7G{1!D}WP2&ZlC9|CpnHV=dNQzmx zVB5xx39J6!H``nh|LnAuKNHYoAow@c@phxm=|feflh$kN-l={4^S;@>J)9qZwodxu zx%uWA)AuLWwO7vD&uc$Z&FEOmVOLw5WS<#6!asLisxl3l_k3;T_I--kxijo-yeFMo zw9#y~_0-gxzj+OgwLJU~)_>M%Qb}p;szn;xp8eaxc(K-bWVyu5G_!9yzV``kz3Nw|Ahf1-bagXRH5) zcei(547Zk6x?Pf)^dCmKEqiO3=NOJGUY6*wY%xL-3_RXFEzq5 c&DWPf3&`dGnF9ouf+vG0Pgg&ebxsLQ0Bh{1tN;K2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f6599f7bd49ada543988813203ec1592c7d91c7e GIT binary patch literal 1388 zcmV-y1(W)TP)EX>4Tx04R}tkv&MmKpe$iQ^gM|LaiX;kfA!+MMWG-6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Yam~RI@7zsG4P@ z;xRFsTNQg=(T8CGK?Egc>WTDX2A<>V9zMR_MR=C?xj)B%k~bOP6N#ftH!R`};@M40 z=e$oGVkJo-J|~_u=z_$LT$f#b<6LxD;F%#KlbRIIO4|K2h+1tNoTK)Y1U|DjXP`A2J00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=Lr=66BVIw;XeQX02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00TrxL_t(|+U=T8Xwz^M$G<7X9b_Fp);T1UfCYya$;u8} zZxxD+;bkx>jP5AwO{#R)fymfk13^~sI4@#hm*GKr7~-g76fJs?2|JV#T-S}@{(%ts z^U(fcR;!TMUzzwm5J+E|ygzxr_Y1rS5dSxd*BdhvD_oo}!)Y#* z=M59$a2nGo=PgZxIE4Ptz#^BL0ctqSeSQ_eUjHxG4h}8sZac2Zis`DpA~>eqjiA+i$%2x6~R?vkd#( z>3pl}vJlS3qWU@KMFvO>007L?O4(us%qbi0`<5EJI@pl{m|H8_PCL`zSrepggF!XH zL)r+sBHgy^`}@@C>=$7lK_CRv($0@1VIo4K@bE%5ClOG1VIqQzero=0{~$DWzwf8N=Mq{ zoO5O7?(>>c=5Be#-nc5mnCIHA>27GHY znOKe_Q(cknb2j7+6O$3$br4(y;7Wfz(xMe@nnwVD&1z5fq`G%jtbomJ@M&4z&u#GO zVg>A^x_7o&?a4ZA5H<-Lr34@r)$P;=>aA&EfZ+9)`s9cVnxAc&M|PWBECsi70fZ?Zj9dtU}08i@2)V*>)HBw^=YPdni7TA$-$w8nq|1^7Q3$4YB`#LNQbt`fEa0b8TwqZ~rdDIafI6!T{c?(l%t5ynb7_s9C<>>G!e?!b=8R u)X&EX>4Tx04R}tkv&MmKpe$iQ^gM|LaiX;kfA!+MMWG-6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Yam~RI@7zsG4P@ z;xRFsTNQg=(T8CGK?Egc>WTDX2A<>V9zMR_MR=C?xj)B%k~bOP6N#ftH!R`};@M40 z=e$oGVkJo-J|~_u=z_$LT$f#b<6LxD;F%#KlbRIIO4|K2h+1tNoTK)Y1U|DjXP`A2J00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=Lr=66gAafS1eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00AdSL_t(o!|j!^O9EjS#(#GRP7RV0aYUfd7#a<^2GQUw zG&u^l8sr}k4hpswjZQ+)=H%GW66Mg+&=7HiP>9qbi0ANepz_`2HQi_5Grqjv3(t>- z=L0RR|1RS%kIsrMS2l0lltSM#BTc}{R9pb(^}?8S-gO4j{Ua+8nuHnz%$Nm0ay_=x z(a*0j0PioSM&t8sP{z{{B)2S+5m;k8~|55E8c{j zlGcd}u(h2BAilRI-5WiAiw1nV7met&jn&A&j1xhE{M_&7{f=RrtCa!2OazcprwO&R Zw5Ih3RAP-((z5^n002ovPDHLkV1oJ>d3*o> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c93eb1bc511730e7d3472d14ca20ffb4309bce07 GIT binary patch literal 1972 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6872735699de40c11816ec2058c1159ac582212d GIT binary patch literal 1097 zcmV-P1h)H$P)EX>4Tx04R}tkvmAkP!xv$riu?Lf_4yb$WWbH5EXGORV;#q(pG5I!Q`edXws0R zxHt-~1qUCCRRf)s6A|;-i6k5c1;Br6yd;Xt$&jo}=g{fv&6i_wG zNX27fHn%GFyrK_7@L>{RiJ5vLy_kV#ece+h)m?;VdH4NU14`axfKMcjGTpFiCo7lF3yD zBgX=&P$4;f@IUxHTeC1d$WEE0hc?#$dfJ^k|X(P355dien#Jv1BP#b{xx@Qt#h0{02!Lq@(pls z2uu_yd)?#Ry`6LWx2H9~ALiw9)mX_M_5c6?24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YA10*A1TvBoX000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0006YNkl3`3`~yXYAPx?$Dozyy9TgFU z;vhJ5a8(pU5GQdF6kHt~x@ZwB4mv6b6~Upd4h}&gD3*eANE{?3(Td*P7s>EGOPfo1 zFS*`*x$ppl5JCtcgb+dqA%qYe+`g5_?OTa{Ytzlj3P&Pju&^J^PL2Wq4$5v620m=Z z#p1#^0O0hzH>%$(SteOe535!d17IAwwOw!hQ>W+G-_FN30|1*FgO+aAUkC8tXTU-E z5@FzDZf3ge`DXJSmFgL6$2HE%?GmsZ7nSN+>-+uH2nNP#2m>FLs`sax|1B#kY}0_^ z)G)%pPqkHRFR9}&@KKx^7Rkz84OlCdBLFzOx%lxnrNRUNVCQ7P(#?AFkMmgslhqpl zUSB?^d>HuX>h9GlVC}N}$2}{TOWFMlnQlD|VNmf>yAh8+{ui50LrCpnD7GE?7A%qY@2qA_=iBBkR+2f##$t0JZ2tt{4MOqM&rul-P~6Foiv0DV-AVk#Ou P00000NkvXXu0mjfH!Rw| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..37b71b2cd3eedc31aafb459425441bf363d93fab GIT binary patch literal 1158 zcmV;11bO?3P)EX>4Tx04R}tkvmAkP!xv$riu?Lf_4yb$WWbH5EXGORV;#q(pG5I!Q`edXws0R zxHt-~1qUCCRRf)s6A|;-i6k5c1;Br6yd;Xt$&jo}=g{fv&6i_wG zNX27fHn%GFyrK_7@L>{RiJ5vLy_kV#ece+h)m?;VdH4NU14`axfKMcjGTpFiCo7lF3yD zBgX=&P$4;f@IUxHTeC1d$WEE0hc?#$dfJ^k|X(P355dien#Jv1BP#b{xx@Qt#h0{02!Lq@(pls z2uu_yd)?#Ry`6LWx2H9~ALiw9)mX_M_5c6?24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YA10*sF>~eqr000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0007ANklh6z9S-Tx!L^Zs5TT%> zrIZ#z1)+mO*GdZ_h?BSo3R#0VWRXxw$Pg!Kq0lT2>Ds~J2vh1H7Sr{xR;7L#NbVH|0N%XL zCb9_GTtVq-4m<(H(lK1e#?IDeX!3sl3gv1IhBQ;N4aR8>-2#R*QLfg8-_K7TV&%~p zT*pSaY9)U0-JYYZ+3*MQ8>?^~dn8spYmfYP9UJ+L)kGITS94$wzs#2u0DNwIyEXaq z+!Fx6`=i}N_JEA}ROxCKlNw2+H@PXO=e)75N@OSHYd21A-?T^tHS znj_sb$=E+X3SG^{xJJ_NUj@2px96nlLN`hCtp)Hd5Saxz^6ACXfR1LNbCGB^_C;7M z=>oMsZK2z9@crupbbAguZEL2B z4;$BiI;yF;79dW~fV3<;yT5{)>r32RU*h+#A9(fR%Y1u45EX>4Tx04R}tkvmAkP!xv$riu?Lf_4yb$WWbH5EXGORV;#q(pG5I!Q`edXws0R zxHt-~1qUCCRRf)s6A|;-i6k5c1;Br6yd;Xt$&jo}=g{fv&6i_wG zNX27fHn%GFyrK_7@L>{RiJ5vLy_kV#ece+h)m?;VdH4NU14`axfKMcjGTpFiCo7lF3yD zBgX=&P$4;f@IUxHTeC1d$WEE0hc?#$dfJ^k|X(P355dien#Jv1BP#b{xx@Qt#h0{02!Lq@(pls z2uu_yd)?#Ry`6LWx2H9~ALiw9)mX_M_5c6?24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YA11c0pV%qZn000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0006_NklZ&eO{^M^Ka+(6yh{bDPO10E2Vi#(vFbg zhfCy$z&(PM25>Alf_bue`d;^ZN0_Z-s5Dw+9RrXAU>-)Fn-+FjG?RM8? z1|u~1;mm*>Pc1Klztf`!8vMu0AdaUTV;iDW2om;u?9@U9{?q@+Q!ta)#9M~c-{DAt zM)B{*-aMuJH=-68!he)^b1MJ0@|T2*G4*G63bU+|{kAh|<-% zVByw-(fkI3!C){L3ic}rYyH@bN=(&wcT3Ydq3&$G;cQDA7kc$Vp}*@(a#OBkq&FjipB=|~B?-j&Ex zM}GI<(t!29rx!^Ifx0z4LBkwK!yu`10at609t3LaZ6+RyI6%2LJ#7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..def3161bb0aa157191591f4a2c2d4600ff9d1708 GIT binary patch literal 3072 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 YKsE=+5Foe|JQ+lJy85}Sb4q9e03B>vRsaA1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..99c96d368ad662720c069d13f2110606a75f60db GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|CV9FzhE&XX zdut(s@4Z{Qzbx}!;Jtc}lh$4z6SwREX=7m6d$;OW zkfDB#`QkrM_c^?J^S|d*ZKK$3uBq{h_Hb+6Pn!Mzz*=jD2lHzf*Kw5`XO6vG57fk$ f8sVAd>&u`8WOIN_0fI}xlR=cHtDnm{r-UW|L>OEz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d2ad309c74d012db5d5dab59a953f02654d7a5e GIT binary patch literal 1609 zcmV-P2DbT$P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_Zk|ZY#{pS=u0$PFNutxX>KE5BBl~uh|bWcx@ ze;l1erYMz=#Cr$`^Pj(0_zMqZ%Rwz=FYXbK7A;)S$?@^bn=CP|-B-MH)6w0E!mB^7 z9-%$cGo(Pusl3ON?MPk>@VlgEda^fqxrgCb8Rg3nqrK2KyN7tBa(mYrd120BTWeJZ zK7O0jHI<_W!v+u?NyPVvh~2Qz0gai=arU0Mk6EJ|YalEfoGFYh)}T)5 zazT4LvCSD6V zf0s9Y$z0gf{R!s6rtS%I?|FN|+SvPh-*p(VvF$S4phiLY!C>af85aCC8NNE;$I*|Y z|He_bqo~pE?n$D z+oTr5QCK@|D}1x#tlHUW{$QTrJHWJNipxkf8y3v5f0{QOe>mHa&qQt=N(FcW8r&M} z1Wd6jp7Yw1IdXi+@K*6fNp0wk<6+r8M0t*#L&i>+30rHe*mfzMfC8uDJ)Vf|NfpP< zC;Bl>_}U(A-`I}McjXI5z5rGhH9=Nw99>)#eE+dQGR(r~USKzcvhTs?uYmj4FOd7W z48LM{qH}%$7GL1lEpO2t1HXdo_mK*p8omtsLDcXE2>WsLKX;UHg~1*a{soGNSj#pX zO4R@W0flKpLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~mUDisGSh&W`ZPF6%k97`38 zV4<`XT6HkF^h0RUkfgXc3a$kQKNhPFF3!3-xC(;c2Z*bSlcI~1_`jskBF2N`e!RQ) zxO)c(^)geYYVzG_o zHfAM5C7vb@E2>8MLe^!4^A=~dTxHFB@)rj4+H#ufG=~w#A`(bKgp4XSP=w3Vu9j|qgF|4nNZD&1@9t{v?cX!a{(b=U>2lk$kG59;000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Ri2^9i1CxXzlHUIzs8FWQh zbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0G>%iK~z}7?Ub<%!ypty&&Z`+ zcmQZ<>;b(0B2JUgQ$UX^OJ6Ax!52=7djs(94g^35Aw+?7zF6mr<_x2euiK7kUZ4qK zH0eV)06-POXxd-o6q`$owPFBRw;drI$SGo)7u7o&YUENT-6SE>X3>`{Av#clnUMt#ph0Cn0Wc{I?+pA*7WPP4YcQ=~tct00000NkvXX Hu0mjf8{*v2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ac2806b79cefb50b0dafdbb93575cdde187cc7e8 GIT binary patch literal 823 zcmV-71IYY|P)EX>4Tx04R}tkv&MmKpe$iQ^gM|3RV$u$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya_BRI_aYP&La) zL?dE4vnqDHq6-5MFo-^hnR+a_n1bi{x`&UicVV98eeTcEqhw76_(bA4rW+RV2Jy_M zrE}gV4zhxz5T6r|8+1Y9N3P2*zj4kxEbz>rkxI-H2Z_ae3(GCc3WiENO&n5Gjq-)G z%L?Z$&T6T`8u#Qc3}m&HB-d$nDK!8MxA#{&EeN{Up8G z)Ivu2C8-PGhg;Bp5TdeS9BawI=ZA(sQ*&*+;nK>sb!z2^4T*vIJukfN@ZZ-9eC zU@TAB>mKj!Z0+seGmZX!06^_>lj{7Tu>b%724YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YD0v#@meDV7L00A>eL_t(o!|jz_Pr@)1hMx^) zwt+J!aX8RKK>z>mQ7;8<{9pp@*w)q?UBGAp3&fi~H*HSRzHi>}#M?-Va1j@1`6Oypqs%m~1 zkO_$&26&zaA!I^Qtk;xf$-xaQ(iCG1VY`J~35s=2^TZ<)a!Wi-)59B>K2ID57-LLj zL~BhkFNmUuJj(#czSg6)VKV4%y{+&2D5YpL8Yra*!w?|^d7d+yOr4|5flaRZi3x(B zmiXRX@Efzq)R9sGRN_aUgnuQmY07>w7K_EQE1!JgsDt#P++qL#002ovPDHLkV1nd; BZnppc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ac2d7893fdb13dd286886878c3ad64ea8ca4f934 GIT binary patch literal 927 zcmV;Q17Q4#P)EX>4Tx04R}tkv&MmKpe$iQ^gM|3RV$u$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya_BRI_aYP&La) zL?dE4vnqDHq6-5MFo-^hnR+a_n1bi{x`&UicVV98eeTcEqhw76_(bA4rW+RV2Jy_M zrE}gV4zhxz5T6r|8+1Y9N3P2*zj4kxEbz>rkxI-H2Z_ae3(GCc3WiENO&n5Gjq-)G z%L?Z$&T6T`8u#Qc3}m&HB-d$nDK!8MxA#{&EeN{Up8G z)Ivu2C8-PGhg;Bp5TdeS9BawI=ZA(sQ*&*+;nK>sb!z2^4T*vIJukfN@ZZ-9eC zU@TAB>mKj!Z0+seGmZX!06^_>lj{7Tu>b%724YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YD0v$8%dYvKw00EmxL_t(o!|hc)Yr;?zJx`=V zZJ>n=Ej)#yODVV{yL+c@4*7i<-24mfW)VskMTh}22nM2A)4|@yO^j(0Q>UEi<%67) zbI-jOXwaZRMRa@pxQ_3LI>^J_5daWGzPO110C>EAjsZZ^I{<(O?Fj&|U3;a3w5yPE z5HSEqIRF5>K*rx+b5WZEZ|`P;c)RvaM6Xian|+LdyVH3zov3$$$QRvSKi;@2QAq$N zmvR8lTb{i`e{P!wM$-uZ;1KTB^GoCa&?;N|+2{D|OrnUKhm!(YSpZo{u;z{;r!xT9 zLnAXAe+9CT17s(+--RQ5V<|InW0qmgxYvCkB7HLUQw(WTG z(?PUNLzTtzmW2f5mO#@x2qItbkEAo9GVn`on?`1*Tr~%>oJc!D4)8V%cSmS?C$|m7 zHB*q2^GtA;XjESk(Jo3(WgsDGa1eS0UyCP+lDml=v-zS zwyFvUB41E_>3ZX?68CCf$63fr_`f>Pph1JW@B`15%vja@;{E^t002ovPDHLkV1j#; Bn(F`n literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6ff3ac86b7642a95b27e60e079439eb127376880 GIT binary patch literal 1677 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 Ef{!*J8~^|S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..482bb2410227df442ae3e7ee251ef6fcd27fa473 GIT binary patch literal 759 zcmVEX>4Tx04R}tkv&MmKpe$iQ^gM|3RV$u$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya_BRI_aYP&La) zL?dE4vnqDHq6-5MFo-^hnR+a_n1bi{x`&UicVV98eeTcEqhw76_(bA4rW+RV2Jy_M zrE}gV4zhxz5T6r|8+1Y9N3P2*zj4kxEbz>rkxI-H2Z_ae3(GCc3WiENO&n5Gjq-)G z%L?Z$&T6T`8u#Qc3}m&HB-d$nDK!8MxA#{&EeN{Up8G z)Ivu2C8-PGhg;Bp5TdeS9BawI=ZA(sQ*&*+;nK>sb!z2^4T*vIJukfN@ZZ-9eC zU@TAB>mKj!Z0+seGmZX!06^_>lj{7Tu>b%724YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YD0v#~`bo>qg008qzL_t(o!|jx@3WG2dMQ=(c zTfssH2X)awKfwS006##7y4Vg5fd*2urc**96sne%!aIwQ7hmpuUIP#WK@b~=f>^uH zHSB(EV!vc_n&sB%b?DjB`X&Ksmg{49LXs3_NlQL?^|Gn~0Jqx(X_o7EMC{%@+-+_U zYGhFmYoSJakg1nd?M-BJ22A55DbTeIB%i$SU5B1^ZDS|o3jJ6HT#V}|i1k#yEh{RxB`8Mr^@d2`7pgy(~GF8KsE poSQQ+7vVa8Ri~?%APC|wcmnhbg@c}Xw&(x=002ovPDHLkV1mhNOmF}I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0a2e6ab25ae4c51e237c78ed7f9e592422c6fe16 GIT binary patch literal 710 zcmV;%0y+JOP)EX>4Tx04R}tkv&MmKpe$iQ^gM|3RV$u$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya_BRI_aYP&La) zL?dE4vnqDHq6-5MFo-^hnR+a_n1bi{x`&UicVV98eeTcEqhw76_(bA4rW+RV2Jy_M zrE}gV4zhxz5T6r|8+1Y9N3P2*zj4kxEbz>rkxI-H2Z_ae3(GCc3WiENO&n5Gjq-)G z%L?Z$&T6T`8u#Qc3}m&HB-d$nDK!8MxA#{&EeN{Up8G z)Ivu2C8-PGhg;Bp5TdeS9BawI=ZA(sQ*&*+;nK>sb!z2^4T*vIJukfN@ZZ-9eC zU@TAB>mKj!Z0+seGmZX!06^_>lj{7Tu>b%724YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YD0v#@meDV7L006>CL_t(o!|jv54uUWchkqC* z0tsv^?ZN^N!23Ud51<1s+QGr3Catb@Y66PdYieBX8!y*>_ooFIhGCdLlf@hovUA^Z zPRB!*yZ|rmhj9^CYJxQy{V+nQ2>@V?4k{w2$i3K0Jaf4<8USD}x1f7->iE~>0I=U} z7vk&voNfg|cCM_Nm$;WdcN{8@n!qP9RZc3v8jZ4Q-tL$xj+%fqdi8O|%1Pf)$j+te sdd?;^@fUJ3bEX>4Tx04R}tkv&MmKpe$iQ^gM|3RV$u$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya_BRI_aYP&La) zL?dE4vnqDHq6-5MFo-^hnR+a_n1bi{x`&UicVV98eeTcEqhw76_(bA4rW+RV2Jy_M zrE}gV4zhxz5T6r|8+1Y9N3P2*zj4kxEbz>rkxI-H2Z_ae3(GCc3WiENO&n5Gjq-)G z%L?Z$&T6T`8u#Qc3}m&HB-d$nDK!8MxA#{&EeN{Up8G z)Ivu2C8-PGhg;Bp5TdeS9BawI=ZA(sQ*&*+;nK>sb!z2^4T*vIJukfN@ZZ-9eC zU@TAB>mKj!Z0+seGmZX!06^_>lj{7Tu>b%724YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YD0v$4$eXXL z1Bq-7)kOw<0N?)scmNpcq8%8TKvK$z6Qng7h0>_WeM^)7+T7iLmjVPq5dY3@f9QSQ zN509Ar?XcP(YGCpd~KIfc#UH<*LDE?EB$u8upkatNiduPwm!v)**hSmK%As#b&WVl zolykY0lRxC1vt;p>KXvh>KdG9V-Ztah~{)|C)3J2)faa_E8`^LJcCvSO;<6kjH62_ z#=?R-@J?T}0DIQM{Owp-N002ovPDHLkV1j7)Ls|d; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a0341750d3247e864d1def1b4c272b696493d930 GIT binary patch literal 770 zcmV+d1O5DoP)EX>4Tx04R}tkv&MmKpe$iQ^gM|3RV$u$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_3;J6>}?mh0_0Ya_BRI_aYP&La) zL?dE4vnqDHq6-5MFo-^hnR+a_n1bi{x`&UicVV98eeTcEqhw76_(bA4rW+RV2Jy_M zrE}gV4zhxz5T6r|8+1Y9N3P2*zj4kxEbz>rkxI-H2Z_ae3(GCc3WiENO&n5Gjq-)G z%L?Z$&T6T`8u#Qc3}m&HB-d$nDK!8MxA#{&EeN{Up8G z)Ivu2C8-PGhg;Bp5TdeS9BawI=ZA(sQ*&*+;nK>sb!z2^4T*vIJukfN@ZZ-9eC zU@TAB>mKj!Z0+seGmZX!06^_>lj{7Tu>b%724YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>YD0v#{UMq;_4>Y36V0N{E#qszo78Q>)&MgGzX=I@VTbs_1Dr=tS{faG~64Z%|?@>k=O z7iHo8Hxiy7DtNVG3FjpnZwe&*d^!RE{KXueAAVIW_d_3e?@v&LtBbQpv@NE- z@Ie`HgeCLN&BwzI!qR#tzh556^Wrzv_Bf&c&j07*qoM6N<$f=-=I AiU0rr literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..64306900f57f8f8214509ed2fe4ee22edb47debf GIT binary patch literal 2303 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|aavV1d{pTri1Y#q|$QU6_!#c}8V#f7$Rm;FnMdvzgBmeO-lQ}sXw$mnpn)wa zFLp@g!E()2ac(>$3yCICQQGX%WJ(p5!Ak_Q{M-v&>$YpTK@|&6f+iD;5#G2)dffc# z_|(wejUZYvUcK zOP7sr(mix@?u@tFE?UBh|KS-L}j2U3c5@MD0Q~y~FGya^FUc?x+E(m@Oe>LRvHPwd{1 z`+!?Q-Ty3Z{EA#U(ESeN(t++18?4jdTPLOfH0Y*|ZKq_rtYX2<=}w=`hDF>q1)n*#u8tRp`Cp&^^qL?s666 z9AYnhHAl)-F<(f*b+l?jMkjcSX3@t+FSEw#fshdQ5}|9Cjx$Eo%9>7H2bz*j^E?<1 z9XP{mA#i1L!ue2Y3_R3NjCc`UCjCmxL5R275#4qWZ1q z!tpyRx>=UCb`TQ829Df09W}vqtrLU=e@<+cPx#tTD(zgV`7M_cl4+vIakOrd*h;t9 zozQi1_z264WwCT9WH-|c3h+JKbqd~#JGJFM>)Sh-z9<4g5!j;$;wl2a6#;gHXS0~V zW^5$M0H&MiD%QhCGrC^YO7E-n;R?D}bM&QXZ@^VM?1ih=lWNj`EX>4Tx0C=2zkv&MmKpe$iQ>7{u2P=p;WT;M7 zL`57+6^me@v=v%)FuC+YXws0RxHt-~1qVMCs}3&Cx;nTDg5U>;tBaGOi}v_(b9;(+!Jwop@%`(mC%FhgeBch|h_~47wokBiCh@-#8Z?7Isb!v+DNN+{ftykfE-YZh(VBV6;ftYaZ|JYVYmeGtK^f0QKo|+p>?gR{#J224YJ` zL;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j>YD0yY}jxcDak z000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0005vNkl8xhd~l5T^Rp?;tPn-oi6eOcByn>DHL3|@C|$fcOn`Wv6YHw zHH|1;#1>N2j#`?G$9uG#D;+2e9OzZ@ZEEM=YofahsXbp)NSGXRkn>+fl8+e}@VVxzHzRjqOH@+D?-r$ygF2v9Ig z5g~{X9YPx(=3pR5`h>~C{St>2mGM(qiua0tm5F`LtzeiU?jK+*q@a(a88UUM&nf_n zWskD-;yFN9B0a59!7xQm86}fAL{uGQq4E;d7v}iMNvvv(>h`9qgs&HYJF9P{l}3$s z)<=R$lmnp%)5}HaZs{R!Ha9S}G&9+}==mRTlel^;A~NeAXgaN*!3CK9_Ejiyl)iP~ z2aS$H-L_HX$ZzM09A)m+qSUtx{L1xQUYM~IYxPguC@=PR3;q;JJ*=@S;ren94-b!j ZhVN3>q1ffHIM)CG002ovPDHLkV1iKRO}YR8 literal 0 HcmV?d00001 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