From f7be7fc84c8842dc45e65c666add7dcbb75181f8 Mon Sep 17 00:00:00 2001 From: Rouden <149893554+Roudenn@users.noreply.github.com> Date: Tue, 19 Nov 2024 08:15:34 +0300 Subject: [PATCH] [Port] Surgery Fixes: Popup Walker (#923) * Megasquached Surgery Updates Megasquached Surgery Updates Quick patch to see if tests shut up Please do not cherrypick this one yet. Refactored body parts to use damageablecomponent newmed health analyzer real, also refactors and some bugfixes * added solidus's comments, pending removal of namespace thingies for this repo, also fixed some healing thingies * fixes? * fix gib torso * fix prototypes * oops * Shitmed Update 1 (#1240) First in a series of PRs to introduce bugfixes and updates to Shitmed, this will generally feature PRs from Goobstation or Backmen as well since they are actively helping me maintain the code. Usual Shoutouts: Deltanedas: https://github.com/Goob-Station/Goob-Station/pull/882 --- :cl: Mocho, Deltanedas - add: You can now perform surgery as a monke. Rejoice. - add: You can perform surgery on a lot of animals now, I missed a lot of them so just ask if you want any particular critter to get it. - tweak: Entities now perish after 60 seconds of losing their heart and/or brain. - fix: Entities properly take asphyxiation damage after losing their brain. - fix: Torsos being gibbable, which would break surgery or just about anything. - fix: Items not being removed from their respective slots if the parts were gibbed rather than dropped. - fix: Animal organs not being usable properly in surgeries - fix: Cyborg limbs are now usable as pseudo-peg arm/legs. --------- Signed-off-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: goet <6637097+goet@users.noreply.github.com> Co-authored-by: Saphire Lattice Co-authored-by: Roudenn <149893554+Roudenn@users.noreply.github.com> * Shitmed Surgery Popups (#1241) Adds popups for surgery steps in Shitmed that every player within PVS range can see. This allows other players to see if the correct procedure is being performed. This PR also includes locale text for the new procedures and steps in #1240. **Remove Brain / Insert Brain** https://github.com/user-attachments/assets/ac20afa1-df74-48ab-b1d5-2e9a273dfba2
See more **Amputate Right Arm** https://github.com/user-attachments/assets/17f78683-6d3b-44ee-aea3-bb6987844fdc **Attach Right Arm** https://github.com/user-attachments/assets/584d4da2-d8b0-4c82-a323-26636e7fa4b8
:cl: Skubman - add: Surgery step descriptions (like making an incision, removing/attaching limbs and organs) are now shown as popups to everyone in range upon the start of the step. This makes it clear which surgical procedure is being done and to which body part. No more stealthy brain-stealing in front of everyone! * fix the things + locale --------- Signed-off-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: gluesniffler Co-authored-by: Zack Backmen Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: goet <6637097+goet@users.noreply.github.com> Co-authored-by: Saphire Lattice Co-authored-by: Skubman --- .../Backmen/Body/Systems/HeartSystem.cs | 40 +++++++ .../DelayedDeath/DelayedDeathComponent.cs | 16 +++ .../DelayedDeath/DelayedDeathSystem.cs | 32 +++++ .../Backmen/Surgery/SurgerySystem.cs | 39 +++--- Content.Server/Body/Systems/BodySystem.cs | 6 +- Content.Server/Body/Systems/BrainSystem.cs | 11 +- .../Body/Systems/RespiratorSystem.cs | 4 +- .../Surgery/Body/DebrainedComponent.cs | 1 - .../Body/SharedBodySystem.PartAppearance.cs | 14 ++- .../SurgeryPartRemovedConditionComponent.cs | 8 +- .../Surgery/SharedSurgerySystem.Steps.cs | 24 +++- .../Backmen/Surgery/SharedSurgerySystem.cs | 6 + .../Surgery/SurgeryStepDamageChangeEvent.cs | 9 ++ Content.Shared/Body/Organ/OrganComponent.cs | 7 ++ .../Body/Systems/SharedBodySystem.Body.cs | 23 +++- .../Body/Systems/SharedBodySystem.Organs.cs | 10 +- .../Body/Systems/SharedBodySystem.Parts.cs | 13 +- .../Damage/Systems/DamageableSystem.cs | 3 +- .../Inventory/InventorySystem.Slots.cs | 4 - .../en-US/backmen/surgery/surgery-popup.ftl | 52 ++++++++ .../ru-RU/backmen/metabolizer-types.ftl | 2 + .../ru-RU/backmen/surgery/surgery-popup.ftl | 52 ++++++++ .../Prototypes/Body/Organs/Animal/animal.yml | 7 ++ .../Prototypes/Body/Organs/Animal/slimes.yml | 4 + Resources/Prototypes/Body/Organs/arachnid.yml | 19 ++- Resources/Prototypes/Body/Organs/diona.yml | 19 ++- Resources/Prototypes/Body/Organs/moth.yml | 1 + Resources/Prototypes/Body/Organs/slime.yml | 4 + Resources/Prototypes/Body/Organs/vox.yml | 1 + Resources/Prototypes/Body/Parts/animal.yml | 10 ++ Resources/Prototypes/Body/Parts/silicon.yml | 13 +- .../Prototypes/Body/Prototypes/arachnid.yml | 1 + .../Prototypes/Body/Prototypes/diona.yml | 1 + .../Prototypes/Body/Prototypes/dwarf.yml | 1 + .../Body/Prototypes/gingerbread.yml | 1 + .../Prototypes/Body/Prototypes/human.yml | 1 + Resources/Prototypes/Body/Prototypes/moth.yml | 1 + .../Prototypes/Body/Prototypes/primate.yml | 8 ++ .../Prototypes/Body/Prototypes/reptilian.yml | 1 + .../Prototypes/Body/Prototypes/skeleton.yml | 1 + .../Prototypes/Body/Prototypes/slime.yml | 1 + Resources/Prototypes/Body/Prototypes/vox.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 46 +++++++- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 5 + .../Entities/Mobs/NPCs/regalrat.yml | 13 +- .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 7 ++ .../_Backmen/Body/Organs/shadowkin.yml | 111 ++++++++++++++++++ .../_Backmen/Entities/Surgery/surgeries.yml | 105 ++++++++++++++++- .../Entities/Surgery/surgery_steps.yml | 7 ++ .../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 .../Mobs/Species/Shadowkin/parts.rsi/eyes.png | Bin 0 -> 1643 bytes .../Shadowkin/parts.rsi/full-nomarkings.png | Bin 0 -> 3355 bytes .../Mobs/Species/Shadowkin/parts.rsi/full.png | Bin 0 -> 4851 bytes .../Species/Shadowkin/parts.rsi/head_f.png | Bin 0 -> 849 bytes .../Species/Shadowkin/parts.rsi/head_m.png | Bin 0 -> 849 bytes .../Species/Shadowkin/parts.rsi/l_arm.png | Bin 0 -> 614 bytes .../Species/Shadowkin/parts.rsi/l_foot.png | Bin 0 -> 1867 bytes .../Species/Shadowkin/parts.rsi/l_hand.png | Bin 0 -> 450 bytes .../Species/Shadowkin/parts.rsi/l_leg.png | Bin 0 -> 3086 bytes .../Species/Shadowkin/parts.rsi/meta.json | 71 +++++++++++ .../Species/Shadowkin/parts.rsi/r_arm.png | Bin 0 -> 605 bytes .../Species/Shadowkin/parts.rsi/r_foot.png | Bin 0 -> 1876 bytes .../Species/Shadowkin/parts.rsi/r_hand.png | Bin 0 -> 460 bytes .../Species/Shadowkin/parts.rsi/r_leg.png | Bin 0 -> 3090 bytes .../Species/Shadowkin/parts.rsi/torso_f.png | Bin 0 -> 1442 bytes .../Species/Shadowkin/parts.rsi/torso_m.png | Bin 0 -> 1432 bytes 77 files changed, 808 insertions(+), 73 deletions(-) create mode 100644 Content.Server/Backmen/Body/Systems/HeartSystem.cs create mode 100644 Content.Server/Backmen/DelayedDeath/DelayedDeathComponent.cs create mode 100644 Content.Server/Backmen/DelayedDeath/DelayedDeathSystem.cs create mode 100644 Content.Shared/Backmen/Surgery/SurgeryStepDamageChangeEvent.cs create mode 100644 Resources/Locale/en-US/backmen/surgery/surgery-popup.ftl create mode 100644 Resources/Locale/ru-RU/backmen/metabolizer-types.ftl create mode 100644 Resources/Locale/ru-RU/backmen/surgery/surgery-popup.ftl create mode 100644 Resources/Prototypes/_Backmen/Body/Organs/shadowkin.yml create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/appendix.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/brain.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/core.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/ears.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/eyes.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/heart.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/kidneys.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/liver.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/lungs.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/meta.json create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/stomach.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/tongue.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/eyes.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_f.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_m.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_arm.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_foot.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_hand.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_leg.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/meta.json create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_arm.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_foot.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_hand.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_leg.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_f.png create mode 100644 Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_m.png diff --git a/Content.Server/Backmen/Body/Systems/HeartSystem.cs b/Content.Server/Backmen/Body/Systems/HeartSystem.cs new file mode 100644 index 00000000000..1bb7269d92c --- /dev/null +++ b/Content.Server/Backmen/Body/Systems/HeartSystem.cs @@ -0,0 +1,40 @@ +using Content.Shared.Body.Components; +using Content.Shared.Body.Systems; +using Content.Shared.Body.Events; +using Content.Shared.Body.Organ; +using Content.Server.Backmen.DelayedDeath; +using Content.Server.Body.Components; +using Content.Shared.Backmen.Surgery.Body.Organs; + +namespace Content.Server.Backmen.Body.Systems; + +public sealed class HeartSystem : EntitySystem +{ + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleAddition); + SubscribeLocalEvent(HandleRemoval); + } + + private void HandleRemoval(EntityUid uid, HeartComponent _, ref OrganRemovedFromBodyEvent args) + { + if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.OldBody)) + return; + + // TODO: Add some form of very violent bleeding effect. + EnsureComp(args.OldBody); + } + + private void HandleAddition(EntityUid uid, HeartComponent _, ref OrganAddedToBodyEvent args) + { + if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.Body)) + return; + + if (_bodySystem.TryGetBodyOrganEntityComps(args.Body, out var _)) + RemComp(args.Body); + } + // Shitmed-End +} diff --git a/Content.Server/Backmen/DelayedDeath/DelayedDeathComponent.cs b/Content.Server/Backmen/DelayedDeath/DelayedDeathComponent.cs new file mode 100644 index 00000000000..5dfb7d6b38b --- /dev/null +++ b/Content.Server/Backmen/DelayedDeath/DelayedDeathComponent.cs @@ -0,0 +1,16 @@ +namespace Content.Server.Backmen.DelayedDeath; + +[RegisterComponent] +public sealed partial class DelayedDeathComponent : Component +{ + /// + /// How long it takes to kill the entity. + /// + [DataField] + public float DeathTime = 60; + + /// + /// How long it has been since the delayed death timer started. + /// + public float DeathTimer; +} \ No newline at end of file diff --git a/Content.Server/Backmen/DelayedDeath/DelayedDeathSystem.cs b/Content.Server/Backmen/DelayedDeath/DelayedDeathSystem.cs new file mode 100644 index 00000000000..2ca05663026 --- /dev/null +++ b/Content.Server/Backmen/DelayedDeath/DelayedDeathSystem.cs @@ -0,0 +1,32 @@ +using Content.Shared.Body.Organ; +using Content.Shared.Body.Events; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Mobs.Systems; +using Robust.Shared.Timing; +using Robust.Shared.Prototypes; + +namespace Content.Server.Backmen.DelayedDeath; + +public partial class DelayedDeathSystem : EntitySystem +{ + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + public override void Update(float frameTime) + { + base.Update(frameTime); + + using var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var component)) + { + component.DeathTimer += frameTime; + + if (component.DeathTimer >= component.DeathTime && !_mobState.IsDead(ent)) + { + var damage = new DamageSpecifier(_prototypes.Index("Bloodloss"), 150); + _damageable.TryChangeDamage(ent, damage, partMultiplier: 0f); + } + } + } +} \ No newline at end of file diff --git a/Content.Server/Backmen/Surgery/SurgerySystem.cs b/Content.Server/Backmen/Surgery/SurgerySystem.cs index feb6c68c9d4..ad1e69bd576 100644 --- a/Content.Server/Backmen/Surgery/SurgerySystem.cs +++ b/Content.Server/Backmen/Surgery/SurgerySystem.cs @@ -20,6 +20,7 @@ using Content.Shared.Backmen.Surgery.Effects.Step; using Content.Shared.Backmen.Surgery.Tools; using Content.Shared.Bed.Sleep; +using Content.Shared.Medical.Surgery; namespace Content.Server.Backmen.Surgery; @@ -43,8 +44,10 @@ public override void Initialize() SubscribeLocalEvent(OnToolAfterInteract); SubscribeLocalEvent(OnSurgeryStepDamage); - SubscribeLocalEvent(OnSurgeryDamageChange); - SubscribeLocalEvent(OnSurgerySpecialDamageChange); + // You might be wondering "why aren't we using StepEvent for these two?" reason being that StepEvent fires off regardless of success on the previous functions + // so this would heal entities even if you had a used or incorrect organ. + SubscribeLocalEvent(OnSurgerySpecialDamageChange); + SubscribeLocalEvent(OnSurgeryDamageChange); SubscribeLocalEvent(OnStepScreamComplete); SubscribeLocalEvent(OnStepSpawnComplete); SubscribeLocalEvent(OnPrototypesReloaded); @@ -127,15 +130,18 @@ private void OnToolAfterInteract(Entity ent, ref AfterInte private void OnSurgeryStepDamage(Entity ent, ref SurgeryStepDamageEvent args) => SetDamage(args.Body, args.Damage, args.PartMultiplier, args.User, args.Part); - private void OnSurgeryDamageChange(Entity ent, ref SurgeryStepEvent args) + private void OnSurgerySpecialDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent args) { - // This unintentionally punishes the user if they have an organ in another hand that is already used. - // Imo surgery shouldn't let you automatically pick tools on both hands anyway, it should only use the one you've got in your selected hand. - if (ent.Comp.IsConsumable - && args.Tools.Where(tool => TryComp(tool, out var organComp) - && !_body.TrySetOrganUsed(tool, true, organComp)).Any()) - return; + if (ent.Comp.DamageType == "Rot") + _rot.ReduceAccumulator(args.Body, TimeSpan.FromSeconds(2147483648)); // BEHOLD, SHITCODE THAT I JUST COPY PASTED. I'll redo it at some point, pinky swear :) + else if (ent.Comp.DamageType == "Eye" + && TryComp(ent, out BlindableComponent? blindComp) + && blindComp.EyeDamage > 0) + _blindableSystem.AdjustEyeDamage((args.Body, blindComp), -blindComp!.EyeDamage); + } + private void OnSurgeryDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent args) + { var damageChange = ent.Comp.Damage; if (HasComp(args.Body)) damageChange = damageChange * ent.Comp.SleepModifier; @@ -143,21 +149,6 @@ private void OnSurgeryDamageChange(Entity en SetDamage(args.Body, damageChange, 0.5f, args.User, args.Part); } - private void OnSurgerySpecialDamageChange(Entity ent, ref SurgeryStepEvent args) - { - if (ent.Comp.IsConsumable - && args.Tools.Where(tool => TryComp(tool, out var organComp) - && !_body.TrySetOrganUsed(tool, true, organComp)).Any()) - return; - - if (ent.Comp.DamageType == "Rot") - _rot.ReduceAccumulator(args.Body, TimeSpan.FromSeconds(2147483648)); // BEHOLD, SHITCODE THAT I JUST COPY PASTED. I'll redo it at some point, pinky swear :) - else if (ent.Comp.DamageType == "Eye" - && TryComp(args.Body, out BlindableComponent? blindComp) - && blindComp.EyeDamage > 0) - _blindableSystem.AdjustEyeDamage((args.Body, blindComp), -blindComp!.EyeDamage); - } - private void OnStepScreamComplete(Entity ent, ref SurgeryStepEvent args) { if (HasComp(args.Body)) diff --git a/Content.Server/Body/Systems/BodySystem.cs b/Content.Server/Body/Systems/BodySystem.cs index 0c7a021e7ee..d0e1814e737 100644 --- a/Content.Server/Body/Systems/BodySystem.cs +++ b/Content.Server/Body/Systems/BodySystem.cs @@ -85,9 +85,8 @@ protected override void AddPart( var layer = partEnt.Comp.ToHumanoidLayers(); if (layer != null) { - var layers = HumanoidVisualLayersExtension.Sublayers(layer.Value); _humanoidSystem.SetLayersVisibility( - bodyEnt, layers, visible: true, permanent: true, humanoid); + bodyEnt, new[] { layer.Value }, visible: true, permanent: true, humanoid); } } } @@ -172,7 +171,8 @@ public override HashSet GibPart( var ev = new BeingGibbedEvent(gibs); RaiseLocalEvent(partId, ref ev); - QueueDel(partId); + if (gibs.Any()) + QueueDel(partId); return gibs; } diff --git a/Content.Server/Body/Systems/BrainSystem.cs b/Content.Server/Body/Systems/BrainSystem.cs index 73be972b8f0..4cc7c753c62 100644 --- a/Content.Server/Body/Systems/BrainSystem.cs +++ b/Content.Server/Body/Systems/BrainSystem.cs @@ -2,8 +2,11 @@ using Content.Server.Ghost.Components; using Content.Shared.Backmen.Surgery.Body; using Content.Shared.Body.Components; +using Content.Shared.Body.Systems; using Content.Shared.Body.Events; using Content.Shared.Body.Organ; +using Content.Server.Backmen.DelayedDeath; +using Content.Shared.Backmen.Surgery.Body.Organs; using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Pointing; @@ -13,8 +16,8 @@ namespace Content.Server.Body.Systems public sealed class BrainSystem : EntitySystem { [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly SharedBodySystem _bodySystem = default!; - // Shitmed-Start public override void Initialize() { base.Initialize(); @@ -31,17 +34,21 @@ private void HandleRemoval(EntityUid uid, BrainComponent _, ref OrganRemovedFrom // Prevents revival, should kill the user within a given timespan too. EnsureComp(args.OldBody); + EnsureComp(args.OldBody); HandleMind(uid, args.OldBody); } + private void HandleAddition(EntityUid uid, BrainComponent _, ref OrganAddedToBodyEvent args) { if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.Body)) return; RemComp(args.Body); + if (_bodySystem.TryGetBodyOrganEntityComps(args.Body, out var _)) + RemComp(args.Body); HandleMind(args.Body, uid); } - // Shitmed-End + private void HandleMind(EntityUid newEntity, EntityUid oldEntity) { if (TerminatingOrDeleted(newEntity) || TerminatingOrDeleted(oldEntity)) diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index 447afb334de..c5cdb573aa9 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -78,7 +78,7 @@ public override void Update(float frameTime) UpdateSaturation(uid, -(float)respirator.UpdateInterval.TotalSeconds, respirator); - if (!_mobState.IsIncapacitated(uid) || HasComp(uid)) // Shitmed: cannot breathe in crit or when no brain. + if (!_mobState.IsIncapacitated(uid) && !HasComp(uid)) // Shitmed: cannot breathe in crit or when no brain. { switch (respirator.Status) { @@ -296,7 +296,7 @@ private void TakeSuffocationDamage(Entity ent) } } - _damageableSys.TryChangeDamage(ent, ent.Comp.Damage, interruptsDoAfters: false); + _damageableSys.TryChangeDamage(ent, HasComp(ent) ? ent.Comp.Damage * 4.5f : ent.Comp.Damage, interruptsDoAfters: false); } private void StopSuffocation(Entity ent) diff --git a/Content.Shared/Backmen/Surgery/Body/DebrainedComponent.cs b/Content.Shared/Backmen/Surgery/Body/DebrainedComponent.cs index cc2e15b567f..1e4169c7145 100644 --- a/Content.Shared/Backmen/Surgery/Body/DebrainedComponent.cs +++ b/Content.Shared/Backmen/Surgery/Body/DebrainedComponent.cs @@ -4,4 +4,3 @@ namespace Content.Shared.Backmen.Surgery.Body; [RegisterComponent] public sealed partial class DebrainedComponent : Component; -// TODO: Add a timer to kill the entity if they don't get a new brain in time. diff --git a/Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs b/Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs index d668fcb7266..9ec90434327 100644 --- a/Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs +++ b/Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs @@ -28,12 +28,18 @@ private void InitializePartAppearances() private void OnPartAppearanceStartup(EntityUid uid, BodyPartAppearanceComponent component, ComponentStartup args) { if (!TryComp(uid, out BodyPartComponent? part) - || part.OriginalBody == null - || TerminatingOrDeleted(part.OriginalBody.Value) - || !TryComp(part.OriginalBody.Value, out HumanoidAppearanceComponent? bodyAppearance) || part.ToHumanoidLayers() is not { } relevantLayer) return; + if (part.OriginalBody == null + || TerminatingOrDeleted(part.OriginalBody.Value) + || !TryComp(part.OriginalBody.Value, out HumanoidAppearanceComponent? bodyAppearance)) + { + //component.ID = part.BaseLayerId; + component.Type = relevantLayer; + return; + } + var customLayers = bodyAppearance.CustomBaseLayers; var spriteLayers = bodyAppearance.BaseLayers; component.Type = relevantLayer; @@ -159,7 +165,7 @@ protected void UpdateAppearance(EntityUid target, _humanoid.SetBaseLayerColor(target, component.Type, component.Color, true, bodyAppearance); _humanoid.SetLayerVisibility(target, component.Type, true, true, bodyAppearance); - + foreach (var (visualLayer, markingList) in component.Markings) { _humanoid.SetLayerVisibility(target, visualLayer, true, true, bodyAppearance); diff --git a/Content.Shared/Backmen/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs b/Content.Shared/Backmen/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs index fb51ab5b060..1ad5025480b 100644 --- a/Content.Shared/Backmen/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs +++ b/Content.Shared/Backmen/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs @@ -6,9 +6,15 @@ namespace Content.Shared.Medical.Surgery.Conditions; [RegisterComponent, NetworkedComponent] public sealed partial class SurgeryPartRemovedConditionComponent : Component { + /// + /// Requires that the parent part can attach a new part to this slot. + /// + [DataField(required: true)] + public string Connection = string.Empty; + [DataField] public BodyPartType Part; [DataField] public BodyPartSymmetry? Symmetry; -} \ No newline at end of file +} diff --git a/Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs index 8307d0a34a6..16710fc5f4b 100644 --- a/Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs @@ -10,6 +10,7 @@ using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.DoAfter; +using Content.Shared.IdentityManagement; using Content.Shared.Inventory; using Content.Shared.Item; using Content.Shared.Popups; @@ -21,6 +22,7 @@ using Content.Shared.Backmen.Surgery.Steps.Parts; using Content.Shared.Backmen.Surgery.Tools; using Content.Shared.Containers.ItemSlots; +using Content.Shared.Medical.Surgery; namespace Content.Shared.Backmen.Surgery; @@ -416,6 +418,12 @@ private void OnAddOrganStep(Entity ent, ref Surger && _body.InsertOrgan(args.Part, tool, insertedOrgan.SlotId, partComp, insertedOrgan)) { EnsureComp(tool); + if (_body.TrySetOrganUsed(tool, true, insertedOrgan) + && insertedOrgan.OriginalBody != args.Body) + { + var ev = new SurgeryStepDamageChangeEvent(args.User, args.Body, args.Part, ent); + RaiseLocalEvent(ent, ref ev); + } break; } } @@ -617,7 +625,21 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S BreakOnHandChange = true, }; - _doAfter.TryStartDoAfter(doAfter); + if (_doAfter.TryStartDoAfter(doAfter)) + { + var userName = Identity.Entity(user, EntityManager); + var targetName = Identity.Entity(ent.Owner, EntityManager); + + var locName = $"surgery-popup-procedure-{args.Surgery}-step-{args.Step}"; + var locResult = Loc.GetString(locName, + ("user", userName), ("target", targetName), ("part", part)); + + if (locResult == locName) + locResult = Loc.GetString($"surgery-popup-step-{args.Step}", + ("user", userName), ("target", targetName), ("part", part)); + + _popup.PopupEntity(locResult, user); + } } private (Entity Surgery, int Step)? GetNextStep(EntityUid body, EntityUid part, Entity surgery, List requirements) diff --git a/Content.Shared/Backmen/Surgery/SharedSurgerySystem.cs b/Content.Shared/Backmen/Surgery/SharedSurgerySystem.cs index e599641898f..81a74330bca 100644 --- a/Content.Shared/Backmen/Surgery/SharedSurgerySystem.cs +++ b/Content.Shared/Backmen/Surgery/SharedSurgerySystem.cs @@ -169,6 +169,12 @@ private void OnOrganConditionValid(Entity ent, r private void OnPartRemovedConditionValid(Entity ent, ref SurgeryValidEvent args) { + if (!_body.CanAttachToSlot(args.Part, ent.Comp.Connection)) + { + args.Cancelled = true; + return; + } + var results = _body.GetBodyChildrenOfType(args.Body, ent.Comp.Part, symmetry: ent.Comp.Symmetry); if (results is not { } || !results.Any()) return; diff --git a/Content.Shared/Backmen/Surgery/SurgeryStepDamageChangeEvent.cs b/Content.Shared/Backmen/Surgery/SurgeryStepDamageChangeEvent.cs new file mode 100644 index 00000000000..e8f0a34cde3 --- /dev/null +++ b/Content.Shared/Backmen/Surgery/SurgeryStepDamageChangeEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Damage; + +namespace Content.Shared.Medical.Surgery; + +/// +/// Raised on the target entity. +/// +[ByRefEvent] +public record struct SurgeryStepDamageChangeEvent(EntityUid User, EntityUid Body, EntityUid Part, EntityUid Step); diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 47c496a7081..8b457ba1126 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -14,6 +14,13 @@ public sealed partial class OrganComponent : Component, ISurgeryToolComponent [DataField, AutoNetworkedField] public EntityUid? Body; + /// + /// Relevant body this organ originally belonged to. + /// /// FOR WHATEVER FUCKING REASON AUTONETWORKING THIS CRASHES GIBTEST AAAAAAAAAAAAAAA + /// + [DataField] + public EntityUid? OriginalBody; + /// /// Shitcodey solution to not being able to know what name corresponds to each organ's slot ID /// without referencing the prototype or hardcoding. diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index ec4df450985..93a788187a5 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -388,12 +388,24 @@ public virtual HashSet GibPart( return gibs; if (part.Body is { } bodyEnt) - RemovePartChildren((partId, part), bodyEnt); + { + if (IsPartRoot(bodyEnt, partId, part: part)) + return gibs; - _gibbingSystem.TryGibEntityWithRef(partId, partId, GibType.Gib, GibContentsOption.Drop, ref gibs, - playAudio: true, launchGibs: true, launchDirection: splatDirection, launchImpulse: GibletLaunchImpulse * splatModifier, - launchImpulseVariance: GibletLaunchImpulseVariance, launchCone: splatCone); + RemovePartChildren((partId, part), bodyEnt); + _gibbingSystem.TryGibEntityWithRef(partId, + partId, + GibType.Gib, + GibContentsOption.Drop, + ref gibs, + playAudio: true, + launchGibs: true, + launchDirection: splatDirection, + launchImpulse: GibletLaunchImpulse * splatModifier, + launchImpulseVariance: GibletLaunchImpulseVariance, + launchCone: splatCone); + } if (HasComp(partId)) { @@ -412,8 +424,11 @@ private void OnProfileLoadFinished(EntityUid uid, BodyComponent component, Profi { if (!HasComp(uid) || TerminatingOrDeleted(uid)) + return; foreach (var part in GetBodyChildren(uid, component)) + { EnsureComp(part.Id); + } } } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index 7511536de45..0ead4cbd612 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -3,6 +3,7 @@ using Content.Shared.Body.Events; using Content.Shared.Body.Organ; using Content.Shared.Body.Part; +using Content.Shared.Damage; using Robust.Shared.Containers; namespace Content.Shared.Body.Systems; @@ -20,6 +21,7 @@ private void AddOrgan( if (organEnt.Comp.Body is not null) { + organEnt.Comp.OriginalBody = organEnt.Comp.Body; var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref addedInBodyEv); } @@ -38,6 +40,10 @@ private void RemoveOrgan(Entity organEnt, EntityUid parentPartUi RaiseLocalEvent(organEnt, ref removedInBodyEv); } + if (TryComp(parentPartUid, out DamageableComponent? damageable) + && damageable.TotalDamage > 200) + TrySetOrganUsed(organEnt, true, organEnt.Comp); + organEnt.Comp.Body = null; Dirty(organEnt, organEnt.Comp); } @@ -213,10 +219,10 @@ public bool TryGetBodyOrganEntityComps( public bool TrySetOrganUsed(EntityUid organId, bool used, OrganComponent? organ = null) { if (!Resolve(organId, ref organ) - || organ.Used == true) + || organ.Used == used) return false; - organ.Used = true; + organ.Used = used; Dirty(organId, organ); return true; } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index da7ecf4cbaf..440058ab1c1 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -279,7 +279,6 @@ private void OnPartEnableChanged(Entity partEnt, ref BodyPart else DisablePart(partEnt); } - private void EnablePart(Entity partEnt) { if (!TryComp(partEnt.Comp.Body, out BodyComponent? body)) @@ -553,6 +552,18 @@ public bool AttachPartToRoot( && Containers.Insert(partId, body.RootContainer); } + /// + /// Returns true if this parentId supports attaching a new part to the specified slot. + /// + public bool CanAttachToSlot( + EntityUid parentId, + string slotId, + BodyPartComponent? parentPart = null) + { + return Resolve(parentId, ref parentPart, logMissing: false) + && parentPart.Children.ContainsKey(slotId); + } + #endregion #region Attach/Detach diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 76453a9002c..a8a698d9750 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -29,7 +29,7 @@ public sealed class DamageableSystem : EntitySystem private EntityQuery _appearanceQuery; private EntityQuery _damageableQuery; private EntityQuery _mindContainerQuery; - private EntityQuery _targetingQuery; + public override void Initialize() { SubscribeLocalEvent(DamageableInit); @@ -41,7 +41,6 @@ public override void Initialize() _appearanceQuery = GetEntityQuery(); _damageableQuery = GetEntityQuery(); _mindContainerQuery = GetEntityQuery(); - _targetingQuery = GetEntityQuery(); } /// diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index dbaea2a5ec3..4fa44dcae68 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -194,11 +194,7 @@ public void SetSlotStatus(EntityUid uid, string slotName, bool isDisabled, Inven _transform.AttachToGridOrMap(entityUid, transform); _randomHelper.RandomOffset(entityUid, 0.5f); } - _containerSystem.ShutdownContainer(container); } - else - _containerSystem.EnsureContainer(uid, slotName); - slot.Disabled = isDisabled; break; } diff --git a/Resources/Locale/en-US/backmen/surgery/surgery-popup.ftl b/Resources/Locale/en-US/backmen/surgery/surgery-popup.ftl new file mode 100644 index 00000000000..8ded2fcaec9 --- /dev/null +++ b/Resources/Locale/en-US/backmen/surgery/surgery-popup.ftl @@ -0,0 +1,52 @@ +surgery-popup-step-SurgeryStepOpenIncisionScalpel = {$user} is making an incision on {$target}'s {$part}. +surgery-popup-step-SurgeryStepClampBleeders = {$user} is clamping the bleeders on {$target}'s {$part}. +surgery-popup-step-SurgeryStepRetractSkin = {$user} is retracting the skin on {$target}'s {$part}. +surgery-popup-step-SurgeryStepSawBones = {$user} is sawing through the bones on {$target}'s {$part}. +surgery-popup-step-SurgeryStepPriseOpenBones = {$user} is prising the bones open on {$target}'s {$part}. +surgery-popup-step-SurgeryStepCloseBones = {$user} is closing the bones on {$target}'s {$part}. +surgery-popup-step-SurgeryStepMendRibcage = {$user} is mending the ribcage on {$target}'s {$part}. +surgery-popup-step-SurgeryStepCloseIncision = {$user} is closing the incision on {$target}'s {$part}. + +surgery-popup-step-SurgeryStepInsertFeature = {$user} is inserting something onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachHead-step-SurgeryStepInsertFeature = {$user} is attaching a head onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachLeftArm-step-SurgeryStepInsertFeature = {$user} is attaching a left arm onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachRightArm-step-SurgeryStepInsertFeature = {$user} is attaching a right arm onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachLeftLeg-step-SurgeryStepInsertFeature = {$user} is attaching a left leg onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachRightLeg-step-SurgeryStepInsertFeature = {$user} is attaching a right leg onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachLeftHand-step-SurgeryStepInsertFeature = {$user} is attaching a left hand onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachRightHand-step-SurgeryStepInsertFeature = {$user} is attaching a right hand onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachLeftFoot-step-SurgeryStepInsertFeature = {$user} is attaching a left foot onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachRightFoot-step-SurgeryStepInsertFeature = {$user} is attaching a right foot onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachLegs-step-SurgeryStepInsertFeature = {$user} is attaching legs onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachHands-step-SurgeryStepInsertFeature = {$user} is attaching hands onto {$target}'s {$part}! +surgery-popup-procedure-SurgeryAttachFeet-step-SurgeryStepInsertFeature = {$user} is attaching feet onto {$target}'s {$part}! + +surgery-popup-step-SurgeryStepSealWounds = {$user} is sealing the wounds on {$target}'s {$part}. +surgery-popup-step-SurgeryStepSawFeature = {$user} is sawing through the bones on {$target}'s {$part}. +surgery-popup-step-SurgeryStepClampInternalBleeders = {$user} is clamping the internal bleeders on {$target}'s {$part}. +surgery-popup-step-SurgeryStepRemoveFeature = {$user} is amputating {$target}'s {$part}! +surgery-popup-step-SurgeryStepCarefulIncisionScalpel = {$user} is carefully making an incision on {$target}'s {$part}. +surgery-popup-step-SurgeryStepRepairBruteTissue = {$user} is repairing the damaged tissues on {$target}'s {$part}! +surgery-popup-step-SurgeryStepRepairBurnTissue = {$user} is repairing the burnt tissues on {$target}'s {$part}! +surgery-popup-step-SurgeryStepSealTendWound = {$user} is sealing the wounds on {$target}'s {$part}. +surgery-popup-step-SurgeryStepInsertItem = {$user} is inserting something into {$target}'s {$part}! +surgery-popup-step-SurgeryStepRemoveItem = {$user} is removing something from {$target}'s {$part}! + +surgery-popup-step-SurgeryStepRemoveOrgan = {$user} is removing an organ from {$target}'s {$part}! +surgery-popup-step-SurgeryStepInsertOrgan = {$user} is inserting an organ into {$target}'s {$part}! + +surgery-popup-procedure-SurgeryRemoveBrain-step-SurgeryStepRemoveOrgan = {$user} is removing the brain from {$target}'s {$part}! +surgery-popup-procedure-SurgeryRemoveHeart-step-SurgeryStepRemoveOrgan = {$user} is removing the heart from {$target}'s {$part}! +surgery-popup-procedure-SurgeryRemoveLiver-step-SurgeryStepRemoveOrgan = {$user} is removing the liver from {$target}'s {$part}! +surgery-popup-procedure-SurgeryRemoveLungs-step-SurgeryStepRemoveOrgan = {$user} is removing the lungs from {$target}'s {$part}! +surgery-popup-procedure-SurgeryRemoveEyes-step-SurgeryStepRemoveOrgan = {$user} is removing the eyes from {$target}'s {$part}! +surgery-popup-procedure-SurgeryRemoveStomach-step-SurgeryStepRemoveOrgan = {$user} is removing the stomach from {$target}'s {$part}! + +surgery-popup-procedure-SurgeryInsertBrain-step-SurgeryStepInsertOrgan = {$user} is inserting a brain into {$target}'s {$part}! +surgery-popup-step-SurgeryStepInsertLungs = {$user} is inserting lungs into {$target}'s {$part}! +surgery-popup-step-SurgeryStepInsertLiver = {$user} is inserting a liver into {$target}'s {$part}! +surgery-popup-step-SurgeryStepInsertEyes = {$user} is inserting eyes into {$target}'s {$part}! +surgery-popup-step-SurgeryStepInsertHeart = {$user} is inserting a heart into {$target}'s {$part}! +surgery-popup-step-SurgeryStepInsertStomach = {$user} is inserting a stomach into {$target}'s {$part}! + +surgery-popup-step-SurgeryStepSealOrganWound = {$user} is sealing the wounds on {$target}'s {$part}. diff --git a/Resources/Locale/ru-RU/backmen/metabolizer-types.ftl b/Resources/Locale/ru-RU/backmen/metabolizer-types.ftl new file mode 100644 index 00000000000..4b4818975b9 --- /dev/null +++ b/Resources/Locale/ru-RU/backmen/metabolizer-types.ftl @@ -0,0 +1,2 @@ +metabolizer-type-anthropomorph-animal = Гуманоидное животное +metabolizer-type-shadowkin = Шадовкин diff --git a/Resources/Locale/ru-RU/backmen/surgery/surgery-popup.ftl b/Resources/Locale/ru-RU/backmen/surgery/surgery-popup.ftl new file mode 100644 index 00000000000..82dd9ecc384 --- /dev/null +++ b/Resources/Locale/ru-RU/backmen/surgery/surgery-popup.ftl @@ -0,0 +1,52 @@ +surgery-popup-step-SurgeryStepOpenIncisionScalpel = {$user} делает разрез на {$part} {$target}. +surgery-popup-step-SurgeryStepClampBleeders = {$user} пережимает внутреннее кровотечение на {$part} {$target}. +surgery-popup-step-SurgeryStepRetractSkin = {$user} втягивает кожу на {$part} {$target}. +surgery-popup-step-SurgeryStepSawBones = {$user} пилит через кости на {$part} {$target}. +surgery-popup-step-SurgeryStepPriseOpenBones = {$user} вскрывает кости на {$part} {$target}. +surgery-popup-step-SurgeryStepCloseBones = {$user} закрывает кости на {$part} {$target}. +surgery-popup-step-SurgeryStepMendRibcage = {$user} лечит грудную клетку на {$part} {$target}. +surgery-popup-step-SurgeryStepCloseIncision = {$user} закрывает разрез на {$part} {$target}. + +surgery-popup-step-SurgeryStepInsertFeature = {$user} вставляет что-то в {$part} {$target}! +surgery-popup-procedure-SurgeryAttachHead-step-SurgeryStepInsertFeature = {$user} присоединяет голову к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachLeftArm-step-SurgeryStepInsertFeature = {$user} присоединяет левую руку к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachRightArm-step-SurgeryStepInsertFeature = {$user} присоединяет правую руку к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachLeftLeg-step-SurgeryStepInsertFeature = {$user} присоединяет левую ногу к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachRightLeg-step-SurgeryStepInsertFeature = {$user}присоединяет правую ногу к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachLeftHand-step-SurgeryStepInsertFeature = {$user} присоединяет левую ладонь к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachRightHand-step-SurgeryStepInsertFeature = {$user} присоединяет правую ногу к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachLeftFoot-step-SurgeryStepInsertFeature = {$user} присоединяет левую стопу к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachRightFoot-step-SurgeryStepInsertFeature = {$user} присоединяет правую стопу к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachLegs-step-SurgeryStepInsertFeature = {$user} присоединяет ноги к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachHands-step-SurgeryStepInsertFeature = {$user} присоединяет руки к {$part} {$target}! +surgery-popup-procedure-SurgeryAttachFeet-step-SurgeryStepInsertFeature = {$user} присоединяет стопы к {$part} {$target}! + +surgery-popup-step-SurgeryStepSealWounds = {$user} лечит раны на {$part} {$target}. +surgery-popup-step-SurgeryStepSawFeature = {$user} пилит через кости на {$part} {$target}. +surgery-popup-step-SurgeryStepClampInternalBleeders = {$user} пережимает внутреннее кровотечение у {$part} {$target}. +surgery-popup-step-SurgeryStepRemoveFeature = {$user} ампутирует {$part} {$target}! +surgery-popup-step-SurgeryStepCarefulIncisionScalpel = {$user} аккуратно закрывает разрез на {$part} {$target}. +surgery-popup-step-SurgeryStepRepairBruteTissue = {$user} лечит механические повреждения на {$part} {$target}! +surgery-popup-step-SurgeryStepRepairBurnTissue = {$user} лечит физические повреждения на {$part} {$target}! +surgery-popup-step-SurgeryStepSealTendWound = {$user} закрывает раны на {$part} {$target}. +surgery-popup-step-SurgeryStepInsertItem = {$user} вставляет что-то в {$part} {$target}! +surgery-popup-step-SurgeryStepRemoveItem = {$user} достаёт что-то из {$part} {$target}! + +surgery-popup-step-SurgeryStepRemoveOrgan = {$user} удаляет орган из {$part} {$target}! +surgery-popup-step-SurgeryStepInsertOrgan = {$user} вставляет орган в {$part} {$target}! + +surgery-popup-procedure-SurgeryRemoveBrain-step-SurgeryStepRemoveOrgan = {$user} удаляет мозг из {$part} {$target}! +surgery-popup-procedure-SurgeryRemoveHeart-step-SurgeryStepRemoveOrgan = {$user} удаляет сердце из {$part} {$target}! +surgery-popup-procedure-SurgeryRemoveLiver-step-SurgeryStepRemoveOrgan = {$user} удаляет печень из {$part} {$target}! +surgery-popup-procedure-SurgeryRemoveLungs-step-SurgeryStepRemoveOrgan = {$user} удаляет лёгкие из {$part} {$target}! +surgery-popup-procedure-SurgeryRemoveEyes-step-SurgeryStepRemoveOrgan = {$user} удаляет глаза из {$part} {$target}! +surgery-popup-procedure-SurgeryRemoveStomach-step-SurgeryStepRemoveOrgan = {$user} удаляет желудок из {$part} {$target}! + +surgery-popup-procedure-SurgeryInsertBrain-step-SurgeryStepInsertOrgan = {$user} вставляет мозг в {$part} {$target}! +surgery-popup-step-SurgeryStepInsertLungs = {$user} вставляет лёгкие в {$part} {$target}! +surgery-popup-step-SurgeryStepInsertLiver = {$user} вставляет печень в {$part} {$target}! +surgery-popup-step-SurgeryStepInsertEyes = {$user} вставляет глаза в {$part} {$target}! +surgery-popup-step-SurgeryStepInsertHeart = {$user} вставляет сердце в {$part} {$target}! +surgery-popup-step-SurgeryStepInsertStomach = {$user} вставляет желудок в {$part} {$target}! + +surgery-popup-step-SurgeryStepSealOrganWound = {$user} лечит раны на {$part} {$target}. diff --git a/Resources/Prototypes/Body/Organs/Animal/animal.yml b/Resources/Prototypes/Body/Organs/Animal/animal.yml index e59aad9da3f..6c20ded68e6 100644 --- a/Resources/Prototypes/Body/Organs/Animal/animal.yml +++ b/Resources/Prototypes/Body/Organs/Animal/animal.yml @@ -41,6 +41,7 @@ - state: lung-l - state: lung-r - type: Organ + slotId: lungs - type: Lung - type: Metabolizer removeEmpty: true @@ -73,6 +74,7 @@ - type: Sprite state: stomach - type: Organ + slotId: stomach - type: SolutionContainerManager solutions: stomach: @@ -116,6 +118,8 @@ - type: Sprite state: liver - type: Organ + slotId: liver + - type: Liver - type: Metabolizer maxReagents: 1 metabolizerTypes: [ Animal ] @@ -135,6 +139,8 @@ - type: Sprite state: heart-on - type: Organ + slotId: heart + - type: Heart - type: Metabolizer maxReagents: 2 metabolizerTypes: [ Animal ] @@ -157,6 +163,7 @@ - state: kidney-l - state: kidney-r - type: Organ + slotId: kidneys - type: Metabolizer maxReagents: 5 metabolizerTypes: [ Animal ] diff --git a/Resources/Prototypes/Body/Organs/Animal/slimes.yml b/Resources/Prototypes/Body/Organs/Animal/slimes.yml index f1a3d47e667..baa6674a471 100644 --- a/Resources/Prototypes/Body/Organs/Animal/slimes.yml +++ b/Resources/Prototypes/Body/Organs/Animal/slimes.yml @@ -8,6 +8,8 @@ sprite: Mobs/Species/Slime/organs.rsi state: brain-slime - type: Stomach + - type: Organ + slotId: core - type: Metabolizer maxReagents: 3 metabolizerTypes: [ Slime ] @@ -38,6 +40,8 @@ - state: lung-r-slime - type: Lung alert: LowNitrogen + - type: Organ + slotId: lungs - type: Metabolizer removeEmpty: true solutionOnBody: false diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index c7542ae1118..18e5e925c45 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -39,6 +39,8 @@ heldPrefix: stomach - type: Stomach updateInterval: 1.5 + - type: Organ + slotId: stomach - type: SolutionContainerManager solutions: stomach: @@ -62,6 +64,8 @@ - state: lung-l - state: lung-r - type: Lung + - type: Organ + slotId: lungs - type: Metabolizer updateInterval: 1.5 removeEmpty: true @@ -94,9 +98,9 @@ components: - type: Sprite state: heart-on - - type: Item - size: Small - heldPrefix: heart + - type: Heart + - type: Organ + slotId: heart - type: Metabolizer updateInterval: 1.5 maxReagents: 2 @@ -118,6 +122,9 @@ heldPrefix: liver - type: Sprite state: liver + - type: Liver + - type: Organ + slotId: liver - type: Metabolizer # The liver metabolizes certain chemicals only, like alcohol. updateInterval: 1.5 maxReagents: 1 @@ -157,9 +164,9 @@ layers: - state: eyeball-l - state: eyeball-r - - type: Item - size: Small - heldPrefix: eyeballs + - type: Eyes + - type: Organ + slotId: eyes - type: entity id: OrganArachnidTongue diff --git a/Resources/Prototypes/Body/Organs/diona.yml b/Resources/Prototypes/Body/Organs/diona.yml index bf865a07fd9..04b0dae1223 100644 --- a/Resources/Prototypes/Body/Organs/diona.yml +++ b/Resources/Prototypes/Body/Organs/diona.yml @@ -36,6 +36,9 @@ heldPrefix: brain - type: Sprite state: brain + - type: Brain + - type: Organ + slotId: brain - type: SolutionContainerManager solutions: organ: @@ -62,6 +65,8 @@ layers: - state: eyeball-l - state: eyeball-r + - type: Eyes + - type: entity id: OrganDionaStomach @@ -71,6 +76,8 @@ components: - type: Sprite state: stomach + - type: Organ + slotId: stomach - type: SolutionContainerManager solutions: stomach: @@ -104,11 +111,13 @@ description: "A spongy mess of slimy, leaf-like structures. Capable of breathing both carbon dioxide and oxygen." components: - type: Sprite - state: lungs - - type: Item - size: Small - heldPrefix: lungs - - type: Lung + sprite: Mobs/Species/Human/organs.rsi + layers: + - state: lung-l + - state: lung-r + - type: Lung + - type: Organ + slotId: lungs - type: Metabolizer removeEmpty: true solutionOnBody: false diff --git a/Resources/Prototypes/Body/Organs/moth.yml b/Resources/Prototypes/Body/Organs/moth.yml index 535c25c9d3f..2316a65eb35 100644 --- a/Resources/Prototypes/Body/Organs/moth.yml +++ b/Resources/Prototypes/Body/Organs/moth.yml @@ -1,5 +1,6 @@ - type: entity id: OrganMothStomach + name: moth stomach parent: [OrganAnimalStomach, OrganHumanStomach] categories: [ HideSpawnMenu ] components: diff --git a/Resources/Prototypes/Body/Organs/slime.yml b/Resources/Prototypes/Body/Organs/slime.yml index ca22d25423c..f07b734b39c 100644 --- a/Resources/Prototypes/Body/Organs/slime.yml +++ b/Resources/Prototypes/Body/Organs/slime.yml @@ -8,6 +8,8 @@ sprite: Mobs/Species/Slime/organs.rsi state: brain-slime - type: Stomach + - type: Organ + slotId: core - type: Metabolizer maxReagents: 6 metabolizerTypes: [ Slime ] @@ -49,6 +51,8 @@ layers: - state: lung-l-slime - state: lung-r-slime + - type: Organ + slotId: lungs - type: Lung alert: LowNitrogen - type: Metabolizer diff --git a/Resources/Prototypes/Body/Organs/vox.yml b/Resources/Prototypes/Body/Organs/vox.yml index 70e07832712..0e071571e10 100644 --- a/Resources/Prototypes/Body/Organs/vox.yml +++ b/Resources/Prototypes/Body/Organs/vox.yml @@ -1,5 +1,6 @@ - type: entity id: OrganVoxLungs + name: vox lungs parent: OrganHumanLungs description: "The blue, anaerobic lungs of a vox, they intake nitrogen to breathe. Any form of gaseous oxygen is lethally toxic if breathed in." suffix: "vox" diff --git a/Resources/Prototypes/Body/Parts/animal.yml b/Resources/Prototypes/Body/Parts/animal.yml index 21af8882eba..6af6bf0fd8a 100644 --- a/Resources/Prototypes/Body/Parts/animal.yml +++ b/Resources/Prototypes/Body/Parts/animal.yml @@ -94,3 +94,13 @@ - ReagentId: Blood Quantity: 20 +# Monkey head for borging/transplanting pun pun +- type: entity + parent: [PartAnimal, BaseHead] + id: HeadAnimal + name: animal head + categories: [ HideSpawnMenu ] + components: + - type: Sprite + layers: + - state: head_m \ No newline at end of file diff --git a/Resources/Prototypes/Body/Parts/silicon.yml b/Resources/Prototypes/Body/Parts/silicon.yml index 6b2b3f57d26..213a20b15be 100644 --- a/Resources/Prototypes/Body/Parts/silicon.yml +++ b/Resources/Prototypes/Body/Parts/silicon.yml @@ -25,7 +25,12 @@ - type: GuideHelp guides: - Cyborgs - - Robotics + - type: SurgeryTool + startSound: + path: /Audio/Medical/Surgery/organ1.ogg + endSound: + path: /Audio/Medical/Surgery/organ2.ogg + - type: Gibbable - type: entity id: BaseBorgArmLeft @@ -34,7 +39,7 @@ abstract: true components: - type: BodyPart - partType: Hand + partType: Arm symmetry: Left - type: Tag tags: @@ -48,7 +53,7 @@ abstract: true components: - type: BodyPart - partType: Hand + partType: Arm symmetry: Right - type: Tag tags: @@ -68,6 +73,7 @@ tags: - Trash - BorgLeg + - type: MovementBodyPart - type: entity id: BaseBorgLegRight @@ -82,6 +88,7 @@ tags: - Trash - BorgLeg + - type: MovementBodyPart - type: entity id: BaseBorgHead diff --git a/Resources/Prototypes/Body/Prototypes/arachnid.yml b/Resources/Prototypes/Body/Prototypes/arachnid.yml index a3caa42a6eb..c2175076b14 100644 --- a/Resources/Prototypes/Body/Prototypes/arachnid.yml +++ b/Resources/Prototypes/Body/Prototypes/arachnid.yml @@ -23,6 +23,7 @@ - left arm - right leg - left leg + - head right arm: part: RightArmArachnid connections: diff --git a/Resources/Prototypes/Body/Prototypes/diona.yml b/Resources/Prototypes/Body/Prototypes/diona.yml index 12ca203988c..33a65bdc5c3 100644 --- a/Resources/Prototypes/Body/Prototypes/diona.yml +++ b/Resources/Prototypes/Body/Prototypes/diona.yml @@ -16,6 +16,7 @@ - left arm - right leg - left leg + - head organs: stomach: OrganDionaStomachNymph lungs: OrganDionaLungsNymph diff --git a/Resources/Prototypes/Body/Prototypes/dwarf.yml b/Resources/Prototypes/Body/Prototypes/dwarf.yml index 592492688b7..fb5a1753ae4 100644 --- a/Resources/Prototypes/Body/Prototypes/dwarf.yml +++ b/Resources/Prototypes/Body/Prototypes/dwarf.yml @@ -17,6 +17,7 @@ - left arm - right leg - left leg + - head organs: heart: OrganDwarfHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/gingerbread.yml b/Resources/Prototypes/Body/Prototypes/gingerbread.yml index d5355be6412..d7a5d7bc1c4 100644 --- a/Resources/Prototypes/Body/Prototypes/gingerbread.yml +++ b/Resources/Prototypes/Body/Prototypes/gingerbread.yml @@ -17,6 +17,7 @@ - left arm - right leg - left leg + - head organs: heart: OrganHumanHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/human.yml b/Resources/Prototypes/Body/Prototypes/human.yml index 7a0f3bb5a7b..b46e5049bbd 100644 --- a/Resources/Prototypes/Body/Prototypes/human.yml +++ b/Resources/Prototypes/Body/Prototypes/human.yml @@ -17,6 +17,7 @@ - left arm - right leg - left leg + - head organs: heart: OrganHumanHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/moth.yml b/Resources/Prototypes/Body/Prototypes/moth.yml index b3271834417..4d80ebf803a 100644 --- a/Resources/Prototypes/Body/Prototypes/moth.yml +++ b/Resources/Prototypes/Body/Prototypes/moth.yml @@ -23,6 +23,7 @@ - left arm - right leg - left leg + - head right arm: part: RightArmMoth connections: diff --git a/Resources/Prototypes/Body/Prototypes/primate.yml b/Resources/Prototypes/Body/Prototypes/primate.yml index 2af9273be4c..4e73003b672 100644 --- a/Resources/Prototypes/Body/Prototypes/primate.yml +++ b/Resources/Prototypes/Body/Prototypes/primate.yml @@ -3,11 +3,19 @@ name: "primate" root: torso slots: + head: # Put pun pun into a humans body + part: HeadAnimal + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes torso: part: TorsoAnimal connections: - hands - legs + - head organs: lungs: OrganAnimalLungs stomach: OrganAnimalStomach diff --git a/Resources/Prototypes/Body/Prototypes/reptilian.yml b/Resources/Prototypes/Body/Prototypes/reptilian.yml index 1e9ebd54a48..97f9956b770 100644 --- a/Resources/Prototypes/Body/Prototypes/reptilian.yml +++ b/Resources/Prototypes/Body/Prototypes/reptilian.yml @@ -23,6 +23,7 @@ - left arm - right leg - left leg + - head right arm: part: RightArmReptilian connections: diff --git a/Resources/Prototypes/Body/Prototypes/skeleton.yml b/Resources/Prototypes/Body/Prototypes/skeleton.yml index 16d08365610..998d01cc499 100644 --- a/Resources/Prototypes/Body/Prototypes/skeleton.yml +++ b/Resources/Prototypes/Body/Prototypes/skeleton.yml @@ -14,6 +14,7 @@ - left arm - right leg - left leg + - head right arm: part: RightArmSkeleton connections: diff --git a/Resources/Prototypes/Body/Prototypes/slime.yml b/Resources/Prototypes/Body/Prototypes/slime.yml index b57c5eceb44..df246bb0d23 100644 --- a/Resources/Prototypes/Body/Prototypes/slime.yml +++ b/Resources/Prototypes/Body/Prototypes/slime.yml @@ -14,6 +14,7 @@ - left arm - right leg - left leg + - head organs: core: SentientSlimeCore lungs: OrganSlimeLungs diff --git a/Resources/Prototypes/Body/Prototypes/vox.yml b/Resources/Prototypes/Body/Prototypes/vox.yml index 2a1f6d9dca7..42cbb7e0855 100644 --- a/Resources/Prototypes/Body/Prototypes/vox.yml +++ b/Resources/Prototypes/Body/Prototypes/vox.yml @@ -17,6 +17,7 @@ - left arm - right leg - left leg + - head organs: heart: OrganHumanHeart lungs: OrganVoxLungs diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index a0b32080b23..13c19f58554 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -563,6 +563,8 @@ interfaces: enum.StrippingUiKey.Key: type: StrippableBoundUserInterface + enum.SurgeryUIKey.Key: + type: SurgeryBui # backmen: surgery - type: InventorySlots - type: Inventory speciesId: hamster @@ -593,7 +595,7 @@ 32: sprite: Mobs/Animals/mothroach/displacement.rsi state: neck - + - type: SurgeryTarget # backmen: surgery # Note that the mallard duck is actually a male drake mallard, with the brown duck being the female variant of the same species, however ss14 lacks sex specific textures # The white duck is more akin to a pekin or call duck. @@ -669,6 +671,13 @@ - type: NpcFactionMember factions: - Passive + # start-backmen: surgery + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui + # end-backmen: surgery - type: entity name: white duck #Quack @@ -924,6 +933,13 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin + # start-backmen: surgery + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui + # end-backmen: surgery - type: entity name: goat @@ -1017,6 +1033,11 @@ - type: HTN rootTask: task: RuminantHostileCompound + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui # Note that we gotta make this bitch vomit someday when you feed it anthrax or sumthin. Needs to be a small item thief too and aggressive if attacked. - type: entity @@ -1228,9 +1249,8 @@ abstract: true components: - type: CombatMode - #- type: SurgeryTarget - # canOperate: false - #- type: Targeting + - type: SurgeryTarget + - type: Targeting - type: Inventory templateId: monkey speciesId: monkey @@ -1257,8 +1277,8 @@ interfaces: enum.StrippingUiKey.Key: type: StrippableBoundUserInterface - #enum.SurgeryUIKey.Key: - # type: SurgeryBui + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: Sprite drawdepth: Mobs layers: @@ -1768,6 +1788,13 @@ Taco: RatTaco Burger: RatBurger Skewer: RatSkewer + # start-backmen: surgery + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui + # end-backmen: surgery - type: entity parent: MobMouse @@ -2412,6 +2439,13 @@ groups: Brute: -0.07 Burn: -0.07 + # start-backmen: surgery + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui + # end-backmen: surgery - type: entity name: tarantula diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 233b2f90308..eb52d04aaa0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -248,6 +248,11 @@ types: Slash: 10 Bloodloss: 5 + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: entity id: MobSharkSalvage diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 9b3c9c9ad4e..f1ce9e4f6e0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -124,6 +124,13 @@ - type: Sharp - type: TTS # Corvax-TTS voice: Rat + # start-backmen: surgery + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui + # end-backmen: surgery - type: entity id: MobRatKingBuff @@ -201,7 +208,11 @@ - map: [ "enum.DamageStateVisualLayers.BaseUnshaded"] state: eyes shader: unshaded - + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: SpriteMovement movementLayers: movement: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 54705bf40d1..78f801e5793 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -112,6 +112,13 @@ speechSounds: Slime - type: TypingIndicator proto: slime + # start-backmen: surgery + - type: SurgeryTarget + - type: UserInterface + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui + # end-backmen: surgery - type: entity name: basic slime diff --git a/Resources/Prototypes/_Backmen/Body/Organs/shadowkin.yml b/Resources/Prototypes/_Backmen/Body/Organs/shadowkin.yml new file mode 100644 index 00000000000..5ce977a5a56 --- /dev/null +++ b/Resources/Prototypes/_Backmen/Body/Organs/shadowkin.yml @@ -0,0 +1,111 @@ +- type: entity + id: OrganShadowkinBrain + parent: OrganHumanBrain + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + state: brain + +- type: entity + id: OrganShadowkinEyes + parent: OrganHumanEyes + description: I see beyond anything you ever will! + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + layers: + - state: eyes + +- type: entity + id: OrganShadowkinEars + parent: OrganHumanEars + description: Hey, listen! + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + state: ears + +- type: entity + id: OrganShadowkinTongue + parent: OrganHumanTongue + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + state: tongue + +- type: entity + id: OrganShadowkinAppendix + parent: OrganHumanAppendix + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + layers: + - state: appendix + +- type: entity + id: OrganShadowkinHeart + parent: OrganHumanHeart + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + state: heart + - type: Metabolizer + maxReagents: 2 + metabolizerTypes: [Shadowkin] + groups: + - id: Medicine + - id: Poison + - id: Narcotic + +- type: entity + id: OrganShadowkinStomach + parent: OrganHumanStomach + description: '"Yummy!", says the stomach, although you are unable to hear it.' + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + state: stomach + - type: SolutionContainerManager + solutions: + stomach: + maxVol: 40 + food: + maxVol: 5 + reagents: + - ReagentId: UncookedAnimalProteins + Quantity: 5 + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Shadowkin] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganShadowkinLiver + parent: OrganHumanLiver + description: "Live 'er? I hardly know 'er!" + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + state: liver + - type: Metabolizer + maxReagents: 1 + metabolizerTypes: [Shadowkin] + groups: + - id: Alcohol + rateModifier: 0.1 + +- type: entity + id: OrganShadowkinKidneys + parent: OrganHumanKidneys + description: Give the kid their knees back, please, this is the third time this week. + components: + - type: Sprite + sprite: Backmen/Mobs/Species/Shadowkin/organs.rsi + layers: + - state: kidneys + - type: Metabolizer + maxReagents: 5 + metabolizerTypes: [Shadowkin] + removeEmpty: true diff --git a/Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml index 9f033333e4f..43d8adfd6ed 100644 --- a/Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml @@ -69,13 +69,14 @@ categories: [ HideSpawnMenu ] components: - type: Surgery - #requirement: SurgeryOpenIncision + requirement: SurgeryOpenIncision steps: - SurgeryStepInsertFeature - SurgeryStepSealWounds - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: head part: Head - type: entity @@ -92,6 +93,7 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: left arm part: Arm symmetry: Left @@ -109,6 +111,7 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: right arm part: Arm symmetry: Right @@ -126,6 +129,7 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: left leg part: Leg symmetry: Left @@ -143,6 +147,7 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: right leg part: Leg symmetry: Right @@ -161,6 +166,7 @@ part: Arm symmetry: Left - type: SurgeryPartRemovedCondition + connection: left hand part: Hand symmetry: Left @@ -179,6 +185,7 @@ part: Arm symmetry: Right - type: SurgeryPartRemovedCondition + connection: right hand part: Hand symmetry: Right @@ -197,6 +204,7 @@ part: Leg symmetry: Left - type: SurgeryPartRemovedCondition + connection: left foot part: Foot symmetry: Left @@ -215,9 +223,66 @@ part: Leg symmetry: Right - type: SurgeryPartRemovedCondition + connection: right foot part: Foot symmetry: Right +# Surgery for animals - They have a single legs/hands entity. + +- type: entity + parent: SurgeryBase + id: SurgeryAttachLegs + name: Attach Legs + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenIncision + steps: + - SurgeryStepInsertFeature + - SurgeryStepSealWounds + - type: SurgeryPartCondition + part: Torso + - type: SurgeryPartRemovedCondition + connection: legs + part: Leg + symmetry: None + +- type: entity + parent: SurgeryBase + id: SurgeryAttachHands + name: Attach Hands + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenIncision + steps: + - SurgeryStepInsertFeature + - SurgeryStepSealWounds + - type: SurgeryPartCondition + part: Torso + - type: SurgeryPartRemovedCondition + connection: hands + part: Hand + symmetry: Left # shitcode i guess because of ui icons + +- type: entity + parent: SurgeryBase + id: SurgeryAttachFeet + name: Attach Feet + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenIncision + steps: + - SurgeryStepInsertFeature + - SurgeryStepSealWounds + - type: SurgeryPartCondition + part: Torso + - type: SurgeryPartRemovedCondition + connection: feet + part: Foot + symmetry: None + #- type: entity # parent: SurgeryBase # id: SurgeryAlienEmbryoRemoval @@ -432,6 +497,44 @@ inverse: true reattaching: true +- type: entity + parent: SurgeryBase + id: SurgeryRemoveStomach + name: Remove Stomach + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenRibcage + steps: + - SurgeryStepSawBones + - SurgeryStepClampInternalBleeders + - SurgeryStepRemoveOrgan + - type: SurgeryPartCondition + part: Torso + - type: SurgeryOrganCondition + organ: + - type: Stomach + +- type: entity + parent: SurgeryBase + id: SurgeryInsertStomach + name: Insert Stomach + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenRibcage + steps: + - SurgeryStepSawBones + - SurgeryStepInsertStomach + - SurgeryStepSealOrganWound + - type: SurgeryPartCondition + part: Torso + - type: SurgeryOrganCondition + organ: + - type: Stomach + inverse: true + reattaching: true + - type: entity parent: SurgeryBase id: SurgeryRemoveEyes diff --git a/Resources/Prototypes/_Backmen/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Backmen/Entities/Surgery/surgery_steps.yml index 434c06f35b5..b157e6425d5 100644 --- a/Resources/Prototypes/_Backmen/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Backmen/Entities/Surgery/surgery_steps.yml @@ -467,6 +467,13 @@ damageType: Rot isConsumable: true +# Doesn't serve much of a purpose right now. Just here for completeness-sake. +- type: entity + parent: SurgeryStepInsertOrgan + id: SurgeryStepInsertStomach + name: Add stomach + categories: [ HideSpawnMenu ] + - type: entity parent: SurgeryStepBase id: SurgeryStepSealOrganWound diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/appendix.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/brain.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/core.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/ears.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/kidneys.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/liver.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/meta.json b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/meta.json new file mode 100644 index 00000000000..1c9aebfb6d6 --- /dev/null +++ b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/stomach.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/organs.rsi/tongue.png b/Resources/Textures/Backmen/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/Backmen/Mobs/Species/Shadowkin/parts.rsi/eyes.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..20fd326f17fa91b0b6c33b7fea29a3d693ec11c3 GIT binary patch literal 1643 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_foot.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..30ad69dc3f0463bd7436d5c0dd40d2762822e7cf GIT binary patch literal 1867 zcmV-R2ekN!P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ck|ZY#{O1%t0zycF;~+p0zJZVLr1~+lJ8gT{ z>+n|>(*vy*dL<-O+JF2W={G!uYDrbBX;;m7YOlQv3|jtp_Py^p#~D|A=q{tD7Nu`~ zc#H_`mAs&5^n4RO{qZrxpC;(Dr&n^4@8tY+Q@)9)Jq#7JPx4i=<s?W>_@S}bI09Y8Q&^l#qNN{AonQ)us{Fy8)C4z6HS$1A(l>LQ2_6F(TBl0iS`$3#VEf5Rgb&h_X~>1vsr7-!N2m9E`->%ETwrvsJ;W{)-?@Z#*%#nsK5cOMhWXVxiGr_DC|9BGxs zt1el(Y_-+b*tD^fcHOdd+itt>5m;)$QA0w*qD7DKMD0Q~eS_Io{UlpTO8m_FV=hbSmAIprA=ktOB^IA6XfleqiG3DK32tHKp=D3-h(E>!5!!* zD2|Wtx_!2dTh+M2f7z$oV7t$A*R+UMCxVJ&2AqG=U7e?25i4!gSj!!xMu=|3QU{xd zr>sl2@3}m7Ju0+t(aN-?A|2lQgr{&Ydp^eY>axu@?ktEmCQg%3++T3@s|a4;!6$O= z${^Td&>%V$-m!}Bj;g@9Ds-w{bw@d2cH2s4>#Y~8@E)j z$;{gDa=h6F)NwiNOJd@6FT5Q>I+TMO9EglTc70p$jc`C&%NxEqWZU}6*-{s|0?+x! zd)dRmkHrGHxd!a6)bYg+pV|=fyc~?Tt0JkX$e_h$1Ygg2)r&T;b160G@F(beH+IwO zI9e?C0}B-1n@u&m)1IGNb#S>rnL;ZJM86KLvOvnGl9vI;n=%R!X`BR${{>8-Wz;?W z33HeOX>Q;w_y7O_hG|1XP)S2WAaHVTW@&6?004NLeUUv#!%!53PgA8L6%jj#IAo|! z7DPn^mr}(dSSW3URvk=U`Ug!Kk`xz5!L{Jv&tlcV#aUMeS3wZ`0daM4Qgo3L?@J0T zV!ZHpALre3c<(+yXjGVLc1-}PW*Mn?Ow8t1#lR~B1mVK~<|Jn7iS%Lyp7nK4om6)b zp5@*5XZ0z0lL0=FILdUxBHkdL*|c=d`@|tuk`&@|;&Fp6Nc_lk+2uFRMTZ5R88R}d zdEyYUSnOcAgIUQ?iKmIfimFk*kabz%yv13q)L84D{Dr~1wvy&Ltr5hrganchA)|&e zDzFftT_eRriq2ym{$a-)kq~_kr8`?LJ#?;(srom*uNKFj{yP@U?yEx-U z|961*ps3190ssI2000000002|u4x*3KA$#@qj~S`$}aD{jpJyK$HSVY`AXN%rvWJ? z#TX??RaNP#A$aetswzp+aU4o1eI+;lG+^I%4a1yvZ(KS-S2nRb$vUN^#&W}e8YTy%ZdO1002ovPDHLk FV1g6-alrrp literal 0 HcmV?d00001 diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_hand.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbc7371d14bd73a3bb5d33ed1f9e467fc12f881 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R4; zr;B4q#hkad7OrawU^w=%zxR=_1+$;@Tz3PD`v+1s%((N!lc#J`?;D;lxr1kKnn+z) z(6_UgUHa*}yz)Z_4}Aa2C35cE&%+8bF%yCraG~4Gd1lg=Uw^%jwe`Z=vbkExM+~N+cvVXJ=9!zL)}HzO_gK=#4gY?m zXH{~xC1&Jq3RV8+9?yu&acJTu2lBQX&wKu`z#_p!s&>ot4ATR3`_1>gzrJhc&)a3Y zP3QWtpMSpj%GWUFIp@=BZa*z@+$K6-^D}?rRfgt+4_24k8_V_2{aTgV_1S-Y{t@d1 mXAW`qas;$8HOzsbJNyn45~Pj< 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/meta.json b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/meta.json new file mode 100644 index 00000000000..a259ab696b8 --- /dev/null +++ b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/meta.json @@ -0,0 +1,71 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "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": "full", + "directions": 4 + }, + { + "name": "full-nomarkings", + "directions": 4 + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "eyes", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_arm.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..c294120942cf5eed679cf4306018857a95c18f09 GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|OJk zr;B4q#hkadd|w*|N*w=q|B0WbbmD2Jh=>zWUY?)$_Apv|om#!&i<{1r6z{OER^Ej< zwoff57XLr5dAj<{oxkE~>t06(n;FM`o|!yr)=%a~h729Y85HE08!C7hK%8`mguQXx z`|q!RczU+qawVZoiFua=9M)eK=4)pTJMsGKqWkZ=Q;ae>4hlFJNE~@saA3Rn?6XHc zR=6k#80Jwhj8>61O3E>36vYsNO5e%chYvgKq7lXmFZFv0GlJZIN(f3Ukyv~$am zPxb20|IUn-m>DhZAon1>Su}fV)c)@>3C|@MjwCY(^fNlxurYkZ$~p7SK&to1%MvH8 zshh6sZmLh^O0baWs<2siPa@Y$`r+rFI{gV;2c8x^{92{Su#@ZA=bap_PSe~BSPS;w zzuGQT6umaANc6y~nM@PH|5fdMRAZOC{r18Djfh{bPWv#P(06SSc*V`L{4%F?3fF_O z-7Bjb&b%!<%r}$i#PiQlyYGrUERZ;wBv|%hzg&yfRIWFZGJ$p^EdCKFf$DB${tx0+ X*88+ucF0=;(+h*AtDnm{r-UW|r#lO; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_foot.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..390e0a27ee3c31b36740b4d14c49fc5461cf57cb GIT binary patch literal 1876 zcmV-a2dnsrP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|cmMbR={AU$e0+JAdRw3JP`FfBhNh4?IkTQ&DTR*P8K^UOEqST7G}_P4=AQ^b0<8)6v6<(x)Hp zJwkh?XGnpRH|1kKIgaGRfclX1Oi%hnFOO;XQ$+3Vh|xai7iY^KpZ5NVSS_&TbgauL z75S;RMctQj^Bsr+iqCr9Xl9MJvEWFtu znJ3GoYhv7aN*0omq)4G)lP*h|uuR?}(DEY|y5{ZIbdwq;UIa@fI3tX>TDo`sZ+q$} zVxANcR)5bG;$l89(8;2l|F8le6!(3kSAy^D>jPlnq`>N=xnY4L`RQ?b&phlYw4Rjq2;wCku+OVwJd)pHhyi4{|;X4b6RXwpj4 zR-3ifdK;;87o1h?wOen!_c1W(faihHqYWsWUA(w@b@S%k$HexTW$LWcW}AJEw0OxX zOIKaC+Ujd;+Sp3FY~6L+ZoBUh*lHnBLZgO7iyq^F+J$QRgxPoG{uwp8p$5Rxg;{~o z9W|)U?k?!ii5|>=7#9NKb`ZdZ=7U*oR0<#D(!nfu#;H(7lzPBfbPxlAWfN=A1G{(R zzTuW|?*A)p{1Lfyp!*%jr32j)t;+Gw~kH;IH>;Mjr~Y)^|?aNhBKE6AsNSltmICL!4A*rocO1X>y4 zQX^2-bb-+{o0_wA75E8n#|fAzjs#amI2f<*XwxzNXme|*jXajbUY4ScKscB$Dt!j-ltVc>d}1Vr?<=A`>lSL@t;G(!%h3(cYdieeb+;I{hn|#U z-KHnm63wa2YHPTaI=o+bgdWt39N~+OmSsyF?90$;2n6LBa=7KTTP3Vlr*H*x_yl|Qx=^DXP62=RLp?hdJLRH@+i2}VtaKMee_Q5^QAG4Z+w%7!W-c&9x-wc@zC6vlKY*E#w{uDpEClgZ10<4qZf zh&0Xu*?$2O?o8x8{S6*e{0(5$8@&Jk0fuQqLr_UWLm+T+Z)Rz1WdHzpoPCi!NW)MR zg-=tZA{7xkh&W`ZP8LK(1ea39B3LMGg;pI*Uit@38j=(jN5Qq=;Ll>!!Nplu2UkH5 z`~h)waZ+@V67Ne2En>XzcpvB8b9nDQKxkB$YIaQks%9CfcudUZR>i<81O(y30OllS z>WTDX2A=hGPn}eE5uWAU_hE=c^y zb=l=N&P9g>o*6PSsd?fMu~_V2xr15BP>H9B!-}d=zL0fU;k?CJt<+fSp8SQuytb0& zI;|1Jv4jMY5Fw+6GAghTp$?=2#!SC6cg{et5 zDHsE~Uu^qh6bS4B&AM%WAKP~G1n@rtS6bU&Z2+^Mq}SV8_z39V1}?7Kn!E>G?f^qi zx@1U>4?5<5S>o`L`X0O?6YK~#9!?b@M^g+L62;d2)Z0*mLZcthq52*Kh}K!PDb z0Tw~ROw!dWA)6b-|LK`dr%hcY0000000000006*WbzR#uP1g6lm1Svf$f+z#8-~HA zX|lSmZ|C%L=ks}HY zbIv__KYntlD2k7B&W__yk|Z*-uP#ii>#8`8wQZZ)wpE&@DvILsB-StK1bo9B1R=!$ O0000XhvZ!BQeyxZ7OypHo7SH)?>RDJ^{CTqbMEwcD3^-838phL4FU|2&Kl8l!%Ii|@{5%t> znMoTtju#rt^tq5>5_ElzlmZ7+v5nls(@z7mrhedjWZ}21{V-#qL|UIeZ^7Igv)PLC z&nIub`9Szh+3u9HPm3gmG{eTzrD97t(MinkC7Pk&Njh9M(TR$#;COcD?{ww?SGihf0r>(WMP0t zf{onlsI}iNaa?|RrDERqEyed_6ZYRfyzOmD{qDPuu3mfnHTd~%YlqD@x3D!g{=9j- yJ9PEc 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_m.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..dafc83b65eb84c863c1f67ff31c90ef59b130ced GIT binary patch literal 1432 zcmV;J1!ww+P)afqZvo(H z7%XPqX0uUhYAQd+&oD%aqE|@Zy_oIC$43@DI5-%d$NUiE{r#OVIja1A34oUt78cUO z!vhn82&#vLg)uP({`B<3f5+!M2)GD%FWfvNBm^$c*X!#m-=CkKIUF1g2Y=4P?e}~A z5&(noyjWCMSJTwg6vfBK)BXKD#~+ON`ubweXm4+q1_X5Q$oAXY+XVjU>1oQ(&u76g z^Wct-j;5276aFkdr?NWu9Rl)&`}_MMJw2Tc4-d(1x6{tf4te5^PESvH;412?as#`& zyCNeagFZh$IUHhRV|fzx_V&EO2iyaE5f>LnDJdzex+f`7QBe_x1l->U$gq_dRo)>hIRNWN`tZTz!mN621)$#6QI{A^@oMERY{A%JDB zzP_I3=H@v5;Q>ueP5fN%e~diKpiS;cundF0wzihJ|6eBc-3rV70PZCvB{VTHAv!xd znH0~-0LZ~MHa61W;2_P<&wD38%Mz^Y0lu>=2M@p~qafFNh#;YL0s?j*@*DpW2Lk`x ziO`?&jMn_~&j}D{SOSpAVF^Gcha~`+9F_oNa##Y8$zcgVCWj@!Prm%y{Q-fnL6ZP8 zGc%&6r-%L);G7T#w$07W`ko0&fXMB3i|+33Uu%#6z>TB0p`jrh)EajnvbMG+a&vQO zb#;}G$5FR;I2?wGu)e-7WMv8`)3B+cqC$TUfa)%ni%(%kM@P9do|cwIo12@WtgOrs z5x`YkT+Hj(BT}1!~xKNBm zQAQ3P6Vlh$N2R5uO7Bw^Ko%qc5W^6ZsL{NDBB|a0$Hm13p-%|hzQ^&tw)qQX0XjN5 zxHNWte$MfS;v{N>D3v>%PTfNQ9G+!Qpf(8Z;o)Ja0Ag%wYfFF-7pk=} zF){1~Mgd&lL`35mOyZ0;Aqw;C@4UmkT^R# zqw@0dz_!UrWM^l4yFz4Z9A*O9*N7EB0$kt(H*E0rM%btVB>^z&fXx1wiH3#-Ze2s8 zq)`ADyso9Cg%%eVz3p7nq!! zWC2v%A5cz$AXr#f@CH1{joJcB)Ya87pX?R^&?ls2AEId$kVJYkMXJEJF;n&lslqxD mB9p@sfJ_cc05UmDFTj5?`Q@6?Q