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 00000000000..0d2ad309c74 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/appendix.png differ 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 00000000000..ac2806b79ce Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/brain.png differ 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 00000000000..ac2d7893fdb Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/core.png differ 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 00000000000..6ff3ac86b76 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/ears.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/eyes.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/eyes.png new file mode 100644 index 00000000000..f7c0a306aaa Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/eyes.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/heart.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/heart.png new file mode 100644 index 00000000000..1b79b529aee Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/heart.png differ 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 00000000000..482bb241022 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/kidneys.png differ 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 00000000000..0a2e6ab25ae Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/liver.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/lungs.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/lungs.png new file mode 100644 index 00000000000..a76c9fc1eb4 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/lungs.png differ 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 00000000000..a0341750d32 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/stomach.png differ 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 00000000000..64306900f57 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/organs.rsi/tongue.png differ 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 00000000000..20fd326f17f Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/eyes.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png new file mode 100644 index 00000000000..b62d81fec79 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full-nomarkings.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full.png new file mode 100644 index 00000000000..253eb0c3c9b Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/full.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_f.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_f.png new file mode 100644 index 00000000000..9d99bd18903 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_f.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_m.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_m.png new file mode 100644 index 00000000000..9d99bd18903 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/head_m.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_arm.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_arm.png new file mode 100644 index 00000000000..078ca333f6d Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_arm.png differ 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 00000000000..30ad69dc3f0 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_foot.png differ 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 00000000000..0cbc7371d14 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_hand.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_leg.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_leg.png new file mode 100644 index 00000000000..b961dfc842a Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/l_leg.png differ 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 00000000000..c294120942c Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_arm.png differ 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 00000000000..390e0a27ee3 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_foot.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_hand.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_hand.png new file mode 100644 index 00000000000..331e33a587e Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_hand.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_leg.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_leg.png new file mode 100644 index 00000000000..6b0270f6343 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/r_leg.png differ diff --git a/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_f.png b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_f.png new file mode 100644 index 00000000000..83cc63cdd29 Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_f.png differ 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 00000000000..dafc83b65eb Binary files /dev/null and b/Resources/Textures/Backmen/Mobs/Species/Shadowkin/parts.rsi/torso_m.png differ