From b496993ee6a5da9f868f4a6ad888798159618cb2 Mon Sep 17 00:00:00 2001 From: whateverusername0 Date: Mon, 2 Sep 2024 16:08:31 +1000 Subject: [PATCH 01/40] lol!!! --- Content.Client/Buckle/BuckleSystem.cs | 2 +- Content.Client/Input/ContentContexts.cs | 1 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 8 + .../_White/Standing/LayingDownSystem.cs | 82 ++++++ .../Standing/StandingStateSystem.cs | 18 +- .../_White/Standing/LayingDownSystem.cs | 28 ++ .../Buckle/SharedBuckleSystem.Buckle.cs | 2 +- Content.Shared/Input/ContentKeyFunctions.cs | 1 + .../Standing/StandingStateComponent.cs | 45 +-- .../Standing/StandingStateSystem.cs | 266 +++++++++--------- Content.Shared/Stunnable/SharedStunSystem.cs | 21 +- .../_Goobstation/CCVars/CCVars.Goob.cs | 13 + .../_White/Standing/LayingDownComponent.cs | 25 ++ .../_White/Standing/SharedLayingDownSystem.cs | 162 +++++++++++ .../en-US/_white/escape-menu/options-menu.ftl | 1 + .../Prototypes/Entities/Mobs/Species/base.yml | 1 + Resources/keybinds.yml | 3 + 17 files changed, 514 insertions(+), 165 deletions(-) create mode 100644 Content.Client/_White/Standing/LayingDownSystem.cs create mode 100644 Content.Server/_White/Standing/LayingDownSystem.cs create mode 100644 Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs create mode 100644 Content.Shared/_White/Standing/LayingDownComponent.cs create mode 100644 Content.Shared/_White/Standing/SharedLayingDownSystem.cs create mode 100644 Resources/Locale/en-US/_white/escape-menu/options-menu.ftl diff --git a/Content.Client/Buckle/BuckleSystem.cs b/Content.Client/Buckle/BuckleSystem.cs index 035e1300ca5..255a5b4af16 100644 --- a/Content.Client/Buckle/BuckleSystem.cs +++ b/Content.Client/Buckle/BuckleSystem.cs @@ -65,7 +65,7 @@ private void OnAppearanceChange(EntityUid uid, BuckleComponent component, ref Ap !buckled || args.Sprite == null) { - _rotationVisualizerSystem.SetHorizontalAngle((uid, rotVisuals), rotVisuals.DefaultRotation); + //_rotationVisualizerSystem.SetHorizontalAngle((uid, rotVisuals), rotVisuals.DefaultRotation); return; } diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 639f326f7f4..5d2f7f98870 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -34,6 +34,7 @@ public static void SetupContexts(IInputContextContainer contexts) common.AddFunction(ContentKeyFunctions.RotateStoredItem); common.AddFunction(ContentKeyFunctions.SaveItemLocation); common.AddFunction(ContentKeyFunctions.Point); + common.AddFunction(ContentKeyFunctions.ToggleStanding); // WD EDIT common.AddFunction(ContentKeyFunctions.ZoomOut); common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 24be904e061..a818f72833f 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -103,6 +103,12 @@ private void HandleStaticStorageUI(BaseButton.ButtonToggledEventArgs args) _cfg.SaveToFile(); } + private void HandleToggleAutoGetUp(BaseButton.ButtonToggledEventArgs args) // WD EDIT + { + _cfg.SetCVar(CCVars.AutoGetUp, args.Pressed); + _cfg.SaveToFile(); + } + public KeyRebindTab() { IoCManager.InjectDependencies(this); @@ -161,6 +167,8 @@ void AddCheckBox(string checkBoxName, bool currentState, Action(OnMovementInput); + + SubscribeNetworkEvent(OnCheckAutoGetUp); + } + + private void OnMovementInput(EntityUid uid, LayingDownComponent component, MoveEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + if (!_standing.IsDown(uid)) + return; + + if (_buckle.IsBuckled(uid)) + return; + + if (_animation.HasRunningAnimation(uid, "rotate")) + return; + + if (!TryComp(uid, out var transform) + || !TryComp(uid, out var sprite) + || !TryComp(uid, out var rotationVisuals)) + { + return; + } + + var rotation = transform.LocalRotation + (_eyeManager.CurrentEye.Rotation - (transform.LocalRotation - transform.WorldRotation)); + + if (rotation.GetDir() is Direction.SouthEast or Direction.East or Direction.NorthEast or Direction.North) + { + rotationVisuals.HorizontalRotation = Angle.FromDegrees(270); + sprite.Rotation = Angle.FromDegrees(270); + return; + } + + rotationVisuals.HorizontalRotation = Angle.FromDegrees(90); + sprite.Rotation = Angle.FromDegrees(90); + } + + private void OnCheckAutoGetUp(CheckAutoGetUpEvent ev, EntitySessionEventArgs args) + { + if (!_timing.IsFirstTimePredicted) + return; + + var uid = GetEntity(ev.User); + + if (!TryComp(uid, out var transform) || !TryComp(uid, out var rotationVisuals)) + return; + + var rotation = transform.LocalRotation + (_eyeManager.CurrentEye.Rotation - (transform.LocalRotation - transform.WorldRotation)); + + if (rotation.GetDir() is Direction.SouthEast or Direction.East or Direction.NorthEast or Direction.North) + { + rotationVisuals.HorizontalRotation = Angle.FromDegrees(270); + return; + } + + rotationVisuals.HorizontalRotation = Angle.FromDegrees(90); + } +} diff --git a/Content.Server/Standing/StandingStateSystem.cs b/Content.Server/Standing/StandingStateSystem.cs index e2b64958446..20ee9534c3f 100644 --- a/Content.Server/Standing/StandingStateSystem.cs +++ b/Content.Server/Standing/StandingStateSystem.cs @@ -49,14 +49,14 @@ public override void Initialize() } - /// - /// Raised after an entity falls down. - /// - public sealed class FellDownEvent : EntityEventArgs +/// +/// Raised after an entity falls down. +/// +public sealed class FellDownEvent : EntityEventArgs +{ + public EntityUid Uid { get; } + public FellDownEvent(EntityUid uid) { - public EntityUid Uid { get; } - public FellDownEvent(EntityUid uid) - { - Uid = uid; - } + Uid = uid; } +} diff --git a/Content.Server/_White/Standing/LayingDownSystem.cs b/Content.Server/_White/Standing/LayingDownSystem.cs new file mode 100644 index 00000000000..b43a4d6813c --- /dev/null +++ b/Content.Server/_White/Standing/LayingDownSystem.cs @@ -0,0 +1,28 @@ +using Content.Shared._White; +using Content.Shared._White.Standing; +using Content.Shared.CCVar; +using Robust.Shared.Configuration; + +namespace Content.Server.Standing; + +public sealed class LayingDownSystem : SharedLayingDownSystem // WD EDIT +{ + [Dependency] private readonly INetConfigurationManager _cfg = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeNetworkEvent(OnCheckAutoGetUp); + } + + private void OnCheckAutoGetUp(CheckAutoGetUpEvent ev, EntitySessionEventArgs args) + { + var uid = GetEntity(ev.User); + + if (!TryComp(uid, out LayingDownComponent? layingDown)) + return; + + layingDown.AutoGetUp = _cfg.GetClientCVar(args.SenderSession.Channel, CCVars.AutoGetUp); + Dirty(uid, layingDown); + } +} diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 1745730647d..8d04c9dcacf 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -380,7 +380,7 @@ private void Buckle(Entity buckle, Entity strap _standing.Stand(buckle, force: true); break; case StrapPosition.Down: - _standing.Down(buckle, false, false, force: true); + _standing.Down(buckle, false, false); break; } diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 863d9da970f..fcc1969ceee 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -59,6 +59,7 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction ZoomOut = "ZoomOut"; public static readonly BoundKeyFunction ZoomIn = "ZoomIn"; public static readonly BoundKeyFunction ResetZoom = "ResetZoom"; + public static readonly BoundKeyFunction ToggleStanding = "ToggleStanding"; // WD EDIT public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp"; public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown"; diff --git a/Content.Shared/Standing/StandingStateComponent.cs b/Content.Shared/Standing/StandingStateComponent.cs index 02708722355..3a7cb2a008f 100644 --- a/Content.Shared/Standing/StandingStateComponent.cs +++ b/Content.Shared/Standing/StandingStateComponent.cs @@ -1,24 +1,35 @@ using Robust.Shared.Audio; using Robust.Shared.GameStates; -namespace Content.Shared.Standing +namespace Content.Shared.Standing; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class StandingStateComponent : Component { - [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(StandingStateSystem))] - public sealed partial class StandingStateComponent : Component - { - [ViewVariables(VVAccess.ReadWrite)] - [DataField] - public SoundSpecifier? DownSound { get; private set; } = new SoundCollectionSpecifier("BodyFall"); + [ViewVariables(VVAccess.ReadWrite)] + [DataField] + public SoundSpecifier DownSound { get; private set; } = new SoundCollectionSpecifier("BodyFall"); + + // WD EDIT START + [DataField, AutoNetworkedField] + public StandingState CurrentState { get; set; } = StandingState.Standing; + // WD EDIT END - [DataField, AutoNetworkedField] - public bool Standing { get; set; } = true; + [DataField, AutoNetworkedField] + public bool Standing { get; set; } = true; - /// - /// List of fixtures that had their collision mask changed when the entity was downed. - /// Required for re-adding the collision mask. - /// - [DataField, AutoNetworkedField] - public List ChangedFixtures = new(); - } + /// + /// List of fixtures that had their collision mask changed when the entity was downed. + /// Required for re-adding the collision mask. + /// + [DataField, AutoNetworkedField] + public List ChangedFixtures = new(); +} +// WD EDIT START +public enum StandingState +{ + Lying, + GettingUp, + Standing, } +// WD EDIT END diff --git a/Content.Shared/Standing/StandingStateSystem.cs b/Content.Shared/Standing/StandingStateSystem.cs index 8d9be9ab776..9f7662bdbe8 100644 --- a/Content.Shared/Standing/StandingStateSystem.cs +++ b/Content.Shared/Standing/StandingStateSystem.cs @@ -1,172 +1,168 @@ +// HEAVILY EDITED +// if wizden ever does something to this system we're FUCKED +// regards. + +using Content.Shared._White; +using Content.Shared.Buckle; +using Content.Shared.Buckle.Components; using Content.Shared.Hands.Components; +using Content.Shared.Movement.Systems; using Content.Shared.Physics; using Content.Shared.Rotation; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; -namespace Content.Shared.Standing +namespace Content.Shared.Standing; +public sealed class StandingStateSystem : EntitySystem { - public sealed class StandingStateSystem : EntitySystem + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; // WD EDIT + [Dependency] private readonly SharedBuckleSystem _buckle = default!; // WD EDIT + + // If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited. + private const int StandingCollisionLayer = (int) CollisionGroup.MidImpassable; + public bool IsDown(EntityUid uid, StandingStateComponent? standingState = null) { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; + if (!Resolve(uid, ref standingState, false)) + return false; - // If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited. - private const int StandingCollisionLayer = (int) CollisionGroup.MidImpassable; + return standingState.CurrentState is StandingState.Lying or StandingState.GettingUp; + } - public bool IsDown(EntityUid uid, StandingStateComponent? standingState = null) - { - if (!Resolve(uid, ref standingState, false)) - return false; + public bool Down(EntityUid uid, bool playSound = true, bool dropHeldItems = true, + StandingStateComponent? standingState = null, + AppearanceComponent? appearance = null, + HandsComponent? hands = null) + { + // TODO: This should actually log missing comps... + if (!Resolve(uid, ref standingState, false)) + return false; + // Optional component. + Resolve(uid, ref appearance, ref hands, false); - return !standingState.Standing; - } + if (standingState.CurrentState is StandingState.Lying or StandingState.GettingUp) + return true; - public bool Down(EntityUid uid, - bool playSound = true, - bool dropHeldItems = true, - bool force = false, - StandingStateComponent? standingState = null, - AppearanceComponent? appearance = null, - HandsComponent? hands = null) + // This is just to avoid most callers doing this manually saving boilerplate + // 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to. + // We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway + // and ultimately this is just to avoid boilerplate in Down callers + keep their behavior consistent. + if (dropHeldItems && hands != null) { - // TODO: This should actually log missing comps... - if (!Resolve(uid, ref standingState, false)) - return false; - - // Optional component. - Resolve(uid, ref appearance, ref hands, false); - - if (!standingState.Standing) - return true; - - // This is just to avoid most callers doing this manually saving boilerplate - // 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to. - // We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway - // and ultimately this is just to avoid boilerplate in Down callers + keep their behavior consistent. - if (dropHeldItems && hands != null) - { - RaiseLocalEvent(uid, new DropHandItemsEvent(), false); - } - - if (!force) - { - var msg = new DownAttemptEvent(); - RaiseLocalEvent(uid, msg, false); - - if (msg.Cancelled) - return false; - } + RaiseLocalEvent(uid, new DropHandItemsEvent(), false); + } - standingState.Standing = false; - Dirty(uid, standingState); - RaiseLocalEvent(uid, new DownedEvent(), false); + if (TryComp(uid, out BuckleComponent? buckle) && buckle.Buckled && !_buckle.TryUnbuckle(uid, uid, buckleComp: buckle)) // WD EDIT + return false; - // Seemed like the best place to put it - _appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Horizontal, appearance); + var msg = new DownAttemptEvent(); + RaiseLocalEvent(uid, msg, false); - // Change collision masks to allow going under certain entities like flaps and tables - if (TryComp(uid, out FixturesComponent? fixtureComponent)) - { - foreach (var (key, fixture) in fixtureComponent.Fixtures) - { - if ((fixture.CollisionMask & StandingCollisionLayer) == 0) - continue; - - standingState.ChangedFixtures.Add(key); - _physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask & ~StandingCollisionLayer, manager: fixtureComponent); - } - } + if (msg.Cancelled) + return false; - // check if component was just added or streamed to client - // if true, no need to play sound - mob was down before player could seen that - if (standingState.LifeStage <= ComponentLifeStage.Starting) - return true; + standingState.CurrentState = StandingState.Lying; + Dirty(standingState); + RaiseLocalEvent(uid, new DownedEvent(), false); - if (playSound) + // Seemed like the best place to put it + _appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Horizontal, appearance); + // Change collision masks to allow going under certain entities like flaps and tables + if (TryComp(uid, out FixturesComponent? fixtureComponent)) + { + foreach (var (key, fixture) in fixtureComponent.Fixtures) { - _audio.PlayPredicted(standingState.DownSound, uid, uid); + if ((fixture.CollisionMask & StandingCollisionLayer) == 0) + continue; + standingState.ChangedFixtures.Add(key); + _physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask & ~StandingCollisionLayer, manager: fixtureComponent); } - - return true; } + // check if component was just added or streamed to client + // if true, no need to play sound - mob was down before player could seen that + if (standingState.LifeStage <= ComponentLifeStage.Starting) + return true; - public bool Stand(EntityUid uid, - StandingStateComponent? standingState = null, - AppearanceComponent? appearance = null, - bool force = false) + if (playSound) { - // TODO: This should actually log missing comps... - if (!Resolve(uid, ref standingState, false)) - return false; + _audio.PlayPredicted(standingState.DownSound, uid, null); + } - // Optional component. - Resolve(uid, ref appearance, false); + _movement.RefreshMovementSpeedModifiers(uid); // WD EDIT + return true; + } - if (standingState.Standing) - return true; + public bool Stand(EntityUid uid, + StandingStateComponent? standingState = null, + AppearanceComponent? appearance = null, + bool force = false) + { + // TODO: This should actually log missing comps... + if (!Resolve(uid, ref standingState, false)) + return false; + // Optional component. + Resolve(uid, ref appearance, false); - if (!force) - { - var msg = new StandAttemptEvent(); - RaiseLocalEvent(uid, msg, false); + if (standingState.CurrentState is StandingState.Standing) + return true; - if (msg.Cancelled) - return false; - } + if (TryComp(uid, out BuckleComponent? buckle) && buckle.Buckled && !_buckle.TryUnbuckle(uid, uid, buckleComp: buckle)) // WD EDIT + return false; - standingState.Standing = true; - Dirty(uid, standingState); - RaiseLocalEvent(uid, new StoodEvent(), false); + if (!force) + { + var msg = new StandAttemptEvent(); + RaiseLocalEvent(uid, msg, false); + if (msg.Cancelled) + return false; + } - _appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Vertical, appearance); + standingState.CurrentState = StandingState.Standing; + Dirty(uid, standingState); + RaiseLocalEvent(uid, new StoodEvent(), false); - if (TryComp(uid, out FixturesComponent? fixtureComponent)) + _appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Vertical, appearance); + if (TryComp(uid, out FixturesComponent? fixtureComponent)) + { + foreach (var key in standingState.ChangedFixtures) { - foreach (var key in standingState.ChangedFixtures) - { - if (fixtureComponent.Fixtures.TryGetValue(key, out var fixture)) - _physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask | StandingCollisionLayer, fixtureComponent); - } + if (fixtureComponent.Fixtures.TryGetValue(key, out var fixture)) + _physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask | StandingCollisionLayer, fixtureComponent); } - standingState.ChangedFixtures.Clear(); - - return true; } - } - - public sealed class DropHandItemsEvent : EventArgs - { - } - - /// - /// Subscribe if you can potentially block a down attempt. - /// - public sealed class DownAttemptEvent : CancellableEntityEventArgs - { - } - - /// - /// Subscribe if you can potentially block a stand attempt. - /// - public sealed class StandAttemptEvent : CancellableEntityEventArgs - { - } - - /// - /// Raised when an entity becomes standing - /// - public sealed class StoodEvent : EntityEventArgs - { - } + standingState.ChangedFixtures.Clear(); + _movement.RefreshMovementSpeedModifiers(uid); // WD EDIT - /// - /// Raised when an entity is not standing - /// - public sealed class DownedEvent : EntityEventArgs - { + return true; } } +public sealed class DropHandItemsEvent : EventArgs +{ +} +/// +/// Subscribe if you can potentially block a down attempt. +/// +public sealed class DownAttemptEvent : CancellableEntityEventArgs +{ +} +/// +/// Subscribe if you can potentially block a stand attempt. +/// +public sealed class StandAttemptEvent : CancellableEntityEventArgs +{ +} +/// +/// Raised when an entity becomes standing +/// +public sealed class StoodEvent : EntityEventArgs +{ +} +/// +/// Raised when an entity is not standing +/// +public sealed class DownedEvent : EntityEventArgs +{ +} diff --git a/Content.Shared/Stunnable/SharedStunSystem.cs b/Content.Shared/Stunnable/SharedStunSystem.cs index 8f828131f5c..01a7cbbe648 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.cs @@ -19,6 +19,8 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; +using Robust.Shared.Containers; +using Content.Shared._White.Standing; namespace Content.Shared.Stunnable; @@ -32,6 +34,8 @@ public abstract class SharedStunSystem : EntitySystem [Dependency] private readonly EntityWhitelistSystem _entityWhitelist = default!; [Dependency] private readonly StandingStateSystem _standingState = default!; [Dependency] private readonly StatusEffectsSystem _statusEffect = default!; + [Dependency] private readonly SharedLayingDownSystem _layingDown = default!; // WD EDIT + [Dependency] private readonly SharedContainerSystem _container = default!; // WD EDIT /// /// Friction modifier for knocked down players. @@ -136,12 +140,25 @@ private void OnStunOnContactCollide(Entity ent, ref Star private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args) { - _standingState.Down(uid); + RaiseNetworkEvent(new CheckAutoGetUpEvent(GetNetEntity(uid))); // WD EDIT + _layingDown.TryLieDown(uid, null, null, DropHeldItemsBehavior.DropIfStanding); // WD EDIT } private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args) { - _standingState.Stand(uid); + // WD EDIT START + if (!TryComp(uid, out StandingStateComponent? standing)) + return; + + if (TryComp(uid, out LayingDownComponent? layingDown)) + { + if (layingDown.AutoGetUp && !_container.IsEntityInContainer(uid)) + _layingDown.TryStandUp(uid, layingDown); + return; + } + + _standingState.Stand(uid, standing); + // WD EDIT END } private void OnStandAttempt(EntityUid uid, KnockedDownComponent component, StandAttemptEvent args) diff --git a/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs b/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs new file mode 100644 index 00000000000..144981e9a6b --- /dev/null +++ b/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared._Goobstation.CCVar; + +[CVarDefs] +public sealed partial class GoobCVars +{ + /// + /// Should the player automatically get up after being knocked down + /// + public static readonly CVarDef AutoGetUp = + CVarDef.Create("white.auto_get_up", true, CVar.CLIENT | CVar.ARCHIVE | CVar.REPLICATED); // WD EDIT +} diff --git a/Content.Shared/_White/Standing/LayingDownComponent.cs b/Content.Shared/_White/Standing/LayingDownComponent.cs new file mode 100644 index 00000000000..6a52cb194fc --- /dev/null +++ b/Content.Shared/_White/Standing/LayingDownComponent.cs @@ -0,0 +1,25 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.Standing; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class LayingDownComponent : Component +{ + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float StandingUpTime { get; set; } = .5f; + + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float SpeedModify { get; set; } = .4f; + + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public bool AutoGetUp; +} +[Serializable, NetSerializable] +public sealed class ChangeLayingDownEvent : CancellableEntityEventArgs; + +[Serializable, NetSerializable] +public sealed class CheckAutoGetUpEvent(NetEntity user) : CancellableEntityEventArgs +{ + public NetEntity User = user; +} diff --git a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs new file mode 100644 index 00000000000..2406d19a37c --- /dev/null +++ b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs @@ -0,0 +1,162 @@ +using Content.Shared.DoAfter; +using Content.Shared.Gravity; +using Content.Shared.Input; +using Content.Shared.Mobs.Systems; +using Content.Shared.Movement.Systems; +using Content.Shared.Standing; +using Content.Shared.Stunnable; +using Robust.Shared.Input.Binding; +using Robust.Shared.Player; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.Standing; + +public abstract class SharedLayingDownSystem : EntitySystem +{ + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly StandingStateSystem _standing = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; + + public override void Initialize() + { + CommandBinds.Builder + .Bind(ContentKeyFunctions.ToggleStanding, InputCmdHandler.FromDelegate(ToggleStanding)) + .Register(); + + SubscribeNetworkEvent(OnChangeState); + + SubscribeLocalEvent(OnStandingUpDoAfter); + SubscribeLocalEvent(OnRefreshMovementSpeed); + SubscribeLocalEvent(OnParentChanged); + } + + public override void Shutdown() + { + base.Shutdown(); + + CommandBinds.Unregister(); + } + + private void ToggleStanding(ICommonSession? session) + { + if (session?.AttachedEntity == null || + !HasComp(session.AttachedEntity) || + _gravity.IsWeightless(session.AttachedEntity.Value)) + { + return; + } + + RaiseNetworkEvent(new ChangeLayingDownEvent()); + } + + private void OnChangeState(ChangeLayingDownEvent ev, EntitySessionEventArgs args) + { + if (!args.SenderSession.AttachedEntity.HasValue) + return; + + var uid = args.SenderSession.AttachedEntity.Value; + + // TODO: Wizard + //if (HasComp(uid)) + // return; + + if (!TryComp(uid, out StandingStateComponent? standing) || + !TryComp(uid, out LayingDownComponent? layingDown)) + { + return; + } + + RaiseNetworkEvent(new CheckAutoGetUpEvent(GetNetEntity(uid))); + + if (HasComp(uid) || !_mobState.IsAlive(uid)) + return; + + if (_standing.IsDown(uid, standing)) + TryStandUp(uid, layingDown, standing); + else + TryLieDown(uid, layingDown, standing); + } + + private void OnStandingUpDoAfter(EntityUid uid, StandingStateComponent component, StandingUpDoAfterEvent args) + { + if (args.Handled || args.Cancelled || HasComp(uid) || + _mobState.IsIncapacitated(uid) || !_standing.Stand(uid)) + { + component.CurrentState = StandingState.Lying; + } + + component.CurrentState = StandingState.Standing; + } + + private void OnRefreshMovementSpeed(EntityUid uid, LayingDownComponent component, RefreshMovementSpeedModifiersEvent args) + { + if (_standing.IsDown(uid)) + args.ModifySpeed(component.SpeedModify, component.SpeedModify); + else + args.ModifySpeed(1f, 1f); + } + + private void OnParentChanged(EntityUid uid, LayingDownComponent component, EntParentChangedMessage args) + { + // If the entity is not on a grid, try to make it stand up to avoid issues + if (!TryComp(uid, out var standingState) + || standingState.CurrentState is StandingState.Standing + || Transform(uid).GridUid != null) + { + return; + } + + _standing.Stand(uid, standingState); + } + + public bool TryStandUp(EntityUid uid, LayingDownComponent? layingDown = null, StandingStateComponent? standingState = null) + { + if (!Resolve(uid, ref standingState, false) || + !Resolve(uid, ref layingDown, false) || + standingState.CurrentState is not StandingState.Lying || + !_mobState.IsAlive(uid) || + TerminatingOrDeleted(uid)) + { + return false; + } + + var args = new DoAfterArgs(EntityManager, uid, layingDown.StandingUpTime, new StandingUpDoAfterEvent(), uid) + { + BreakOnHandChange = false, + RequireCanInteract = false + }; + + if (!_doAfter.TryStartDoAfter(args)) + return false; + + standingState.CurrentState = StandingState.GettingUp; + return true; + } + + public bool TryLieDown(EntityUid uid, LayingDownComponent? layingDown = null, StandingStateComponent? standingState = null, DropHeldItemsBehavior behavior = DropHeldItemsBehavior.NoDrop) + { + if (!Resolve(uid, ref standingState, false) || + !Resolve(uid, ref layingDown, false) || + standingState.CurrentState is not StandingState.Standing) + { + if (behavior == DropHeldItemsBehavior.AlwaysDrop) + RaiseLocalEvent(uid, new DropHandItemsEvent()); + + return false; + } + + _standing.Down(uid, true, behavior != DropHeldItemsBehavior.NoDrop, standingState); + return true; + } +} + +[Serializable, NetSerializable] +public sealed partial class StandingUpDoAfterEvent : SimpleDoAfterEvent; + +public enum DropHeldItemsBehavior : byte +{ + NoDrop, + DropIfStanding, + AlwaysDrop +} diff --git a/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl b/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl new file mode 100644 index 00000000000..8ef2b1639ae --- /dev/null +++ b/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl @@ -0,0 +1 @@ +ui-options-function-auto-get-up = Automatically get up after falling \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 5670f10c0c6..190f3d9229b 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -288,6 +288,7 @@ Asphyxiation: -1.0 - type: FireVisuals alternateState: Standing + - type: LayingDown # WD EDIT - type: entity save: false diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 3b8158b7c7a..882d74c6503 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -44,6 +44,9 @@ binds: - function: Walk type: State key: Shift +- function: ToggleStanding + type: State + key: R # Shuttle - function: ShuttleStrafeUp type: State From c3b7d25bc3a485730203dc4674f3be06c14a9864 Mon Sep 17 00:00:00 2001 From: whateverusername0 Date: Mon, 2 Sep 2024 16:09:07 +1000 Subject: [PATCH 02/40] uh --- Resources/Locale/en-US/_white/escape-menu/options-menu.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl b/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl index 8ef2b1639ae..bb729e9bb4e 100644 --- a/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl +++ b/Resources/Locale/en-US/_white/escape-menu/options-menu.ftl @@ -1 +1 @@ -ui-options-function-auto-get-up = Automatically get up after falling \ No newline at end of file +ui-options-function-auto-get-up = Automatically get up after falling From e6edaffe5316aa704b3baed43e225f2c9a45be57 Mon Sep 17 00:00:00 2001 From: whateverusername0 Date: Mon, 2 Sep 2024 18:56:49 +1000 Subject: [PATCH 03/40] :trollface: --- Content.IntegrationTests/Tests/Buckle/BuckleTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs b/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs index 156f42aac33..cb4cb6324a2 100644 --- a/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs +++ b/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs @@ -313,7 +313,9 @@ await server.WaitAssertion(() => await server.WaitAssertion(() => { // Still buckled - Assert.That(buckle.Buckled); + //Assert.That(buckle.Buckled); // goob edit + // he's not supposed to be buckled with the new falling down system + // do i just did this :trollface: // Now with no item in any hand foreach (var hand in hands.Hands.Values) From db1edbd0ba535f1e9fd9a3c005280883fcc5b0a2 Mon Sep 17 00:00:00 2001 From: username <113782077+whateverusername0@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:01:59 +1000 Subject: [PATCH 04/40] Update BuckleSystem.cs --- Content.Client/Buckle/BuckleSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Buckle/BuckleSystem.cs b/Content.Client/Buckle/BuckleSystem.cs index 255a5b4af16..5842d348dc2 100644 --- a/Content.Client/Buckle/BuckleSystem.cs +++ b/Content.Client/Buckle/BuckleSystem.cs @@ -65,7 +65,7 @@ private void OnAppearanceChange(EntityUid uid, BuckleComponent component, ref Ap !buckled || args.Sprite == null) { - //_rotationVisualizerSystem.SetHorizontalAngle((uid, rotVisuals), rotVisuals.DefaultRotation); + //_rotationVisualizerSystem.SetHorizontalAngle((uid, rotVisuals), rotVisuals.DefaultRotation); // WD EDIT return; } From ba34712789eacfb4b0360f7bf9ad15d1e83ec0c4 Mon Sep 17 00:00:00 2001 From: username <113782077+whateverusername0@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:04:25 +1000 Subject: [PATCH 05/40] ok --- Content.Server/_White/Standing/LayingDownSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_White/Standing/LayingDownSystem.cs b/Content.Server/_White/Standing/LayingDownSystem.cs index b43a4d6813c..95315c28c33 100644 --- a/Content.Server/_White/Standing/LayingDownSystem.cs +++ b/Content.Server/_White/Standing/LayingDownSystem.cs @@ -5,7 +5,7 @@ namespace Content.Server.Standing; -public sealed class LayingDownSystem : SharedLayingDownSystem // WD EDIT +public sealed class LayingDownSystem : SharedLayingDownSystem { [Dependency] private readonly INetConfigurationManager _cfg = default!; From da885d8854e2ccab302290a83f0ac3eb9b949dbe Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Sat, 16 Nov 2024 18:10:26 -0400 Subject: [PATCH 06/40] Shitmed (#869) * full fucking send * ope forgot to remove the EE scripts * fix test * fix shitcode fail --- Content.Client/Body/Systems/BodySystem.cs | 69 ++ Content.Client/Hands/Systems/HandsSystem.cs | 33 + .../UI/HealthAnalyzerBoundUserInterface.cs | 20 +- .../UI/HealthAnalyzerWindow.xaml | 224 +++++- .../UI/HealthAnalyzerWindow.xaml.cs | 128 ++- .../Humanoid/HumanoidAppearanceSystem.cs | 8 +- Content.Client/Input/ContentContexts.cs | 8 + .../Inventory/ClientInventorySystem.cs | 16 +- .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 10 + Content.Client/Stylesheets/StyleNano.cs | 54 ++ .../Screens/DefaultGameScreen.xaml | 2 + .../Screens/DefaultGameScreen.xaml.cs | 1 + .../Screens/SeparatedChatGameScreen.xaml | 6 +- .../Screens/SeparatedChatGameScreen.xaml.cs | 3 +- .../Systems/Alerts/Widgets/AlertsUI.xaml | 12 +- .../Inventory/InventoryUIController.cs | 2 +- .../Body/Components/BrainComponent.cs | 3 + .../_Shitmed/Body/Components/LungComponent.cs | 3 + .../Body/Components/StomachComponent.cs | 3 + .../_Shitmed/Medical/Surgery/SurgeryBui.cs | 358 +++++++++ .../Medical/Surgery/SurgeryStepButton.xaml | 4 + .../Medical/Surgery/SurgeryStepButton.xaml.cs | 16 + .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 11 + .../Medical/Surgery/SurgeryWindow.xaml | 23 + .../Medical/Surgery/SurgeryWindow.xaml.cs | 14 + .../_Shitmed/Targeting/TargetingSystem.cs | 102 +++ .../PartStatus/PartStatusUIController.cs | 82 ++ .../PartStatus/Widgets/PartStatusControl.xaml | 57 ++ .../Widgets/PartStatusControl.xaml.cs | 50 ++ .../Targeting/TargetingUIController.cs | 82 ++ .../Targeting/Widgets/TargetingControl.xaml | 216 +++++ .../Widgets/TargetingControl.xaml.cs | 58 ++ .../Xenonids/UI/XenoChoiceControl.xaml | 17 + .../Xenonids/UI/XenoChoiceControl.xaml.cs | 26 + .../Tests/_Shitmed/Body/SpeciesBUITest.cs | 63 ++ .../Atmos/EntitySystems/BarotraumaSystem.cs | 4 +- Content.Server/Body/Systems/BodySystem.cs | 64 +- Content.Server/Body/Systems/BrainSystem.cs | 25 +- .../Body/Systems/RespiratorSystem.cs | 3 +- .../Thresholds/Behaviors/GibBehavior.cs | 5 +- .../EntityEffects/Effects/HealthChange.cs | 8 +- Content.Server/Hands/Systems/HandsSystem.cs | 45 +- .../Components/HealthAnalyzerComponent.cs | 6 + Content.Server/Medical/CryoPodSystem.cs | 3 +- Content.Server/Medical/HealingSystem.cs | 30 +- .../Medical/HealthAnalyzerSystem.cs | 70 +- .../Thresholds/Behaviors/GibPartBehavior.cs | 21 + .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 188 +++++ .../_Shitmed/Targeting/TargetingSystem.cs | 54 ++ Content.Shared/Bed/Sleep/SleepingSystem.cs | 8 +- Content.Shared/Body/Organ/OrganComponent.cs | 22 +- Content.Shared/Body/Part/BodyPartComponent.cs | 117 ++- .../Body/Systems/SharedBodySystem.Body.cs | 105 ++- .../Body/Systems/SharedBodySystem.Organs.cs | 15 + .../Body/Systems/SharedBodySystem.Parts.cs | 282 ++++++- .../Body/Systems/SharedBodySystem.cs | 8 +- .../Damage/Systems/DamageableSystem.cs | 54 +- .../Humanoid/HumanoidVisualLayersExtension.cs | 14 + .../SharedHumanoidAppearanceSystem.cs | 2 + Content.Shared/Input/ContentKeyFunctions.cs | 9 + .../Inventory/InventorySystem.Slots.cs | 49 +- .../Inventory/InventoryTemplatePrototype.cs | 5 + .../HealthAnalyzerScannedUserMessage.cs | 16 +- .../Systems/MobStateSystem.StateMachine.cs | 4 + .../Weapons/Melee/MeleeWeaponComponent.cs | 16 + .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 4 +- .../_Goobstation/CCVars/CCVars.Goob.cs | 7 + .../_Shitmed/Body/Events/BodyPartEvents.cs | 28 + .../_Shitmed/Body/Organ/DebrainedComponent.cs | 7 + .../_Shitmed/Body/Organ/EarsComponent.cs | 7 + .../_Shitmed/Body/Organ/EyesComponent.cs | 6 + .../_Shitmed/Body/Organ/HeartComponent.cs | 6 + .../_Shitmed/Body/Organ/LiverComponent.cs | 6 + .../Body/Organ/MarkingContainerComponent.cs | 15 + .../_Shitmed/Body/Organ/TailComponent.cs | 6 + .../Body/Part/BodyPartAppearanceComponent.cs | 45 ++ .../SharedBodySystem.PartAppearance.cs | 201 +++++ .../Systems/SharedBodySystem.Targeting.cs | 505 ++++++++++++ .../Events/ProfileLoadFinishedEvent.cs | 7 + .../SurgeryCloseIncisionConditionComponent.cs | 6 + .../SurgeryLarvaConditionComponent.cs | 6 + .../SurgeryMarkingConditionComponent.cs | 26 + ...SurgeryOperatingTableConditionComponent.cs | 6 + .../SurgeryOrganConditionComponent.cs | 18 + .../SurgeryPartConditionComponent.cs | 17 + .../Conditions/SurgeryPartPresentCondition.cs | 6 + .../SurgeryPartRemovedConditionComponent.cs | 14 + .../Surgery/Conditions/SurgeryValidEvent.cs | 9 + .../SurgeryWoundedConditionComponent.cs | 7 + .../Effects/Complete/SurgeryCompletedEvent.cs | 7 + .../Complete/SurgeryRemoveLarvaComponent.cs | 6 + .../SurgeryDamageChangeEffectComponent.cs | 17 + ...rgerySpecialDamageChangeEffectComponent.cs | 14 + .../Step/SurgeryStepCavityEffectComponent.cs | 10 + .../Step/SurgeryStepEmoteEffectComponent.cs | 12 + .../Effects/Step/SurgeryStepSpawnEffect.cs | 13 + .../Step/SurgeryTendWoundsEffectComponent.cs | 20 + .../Surgery/OperatingTableComponent.cs | 6 + .../Surgery/SharedSurgerySystem.Steps.cs | 758 ++++++++++++++++++ .../_Shitmed/Surgery/SharedSurgerySystem.cs | 283 +++++++ .../_Shitmed/Surgery/StepInvalidReason.cs | 10 + .../Steps/Parts/BleedersClampedComponent.cs | 6 + .../Parts/BodyPartReattachedComponent.cs | 6 + .../Steps/Parts/BodyPartSawedComponent.cs | 6 + .../Steps/Parts/IncisionOpenComponent.cs | 6 + .../Parts/InternalBleedersClampedComponent.cs | 6 + .../Steps/Parts/OrganReattachedComponent.cs | 6 + .../Steps/Parts/PartRemovedComponent.cs | 6 + .../Steps/Parts/RibcageOpenComponent.cs | 6 + .../Steps/Parts/RibcageSawedComponent.cs | 6 + .../Steps/Parts/SkinRetractedComponent.cs | 6 + .../Steps/SurgeryAddMarkingStepComponent.cs | 34 + .../Steps/SurgeryAddOrganStepComponent.cs | 6 + .../Steps/SurgeryAddPartStepComponent.cs | 6 + .../Steps/SurgeryAffixOrganStepComponent.cs | 6 + .../Steps/SurgeryAffixPartStepComponent.cs | 6 + .../Steps/SurgeryCanPerformStepEvent.cs | 14 + .../SurgeryCutLarvaRootsStepComponent.cs | 6 + .../SurgeryRemoveMarkingStepComponent.cs | 29 + .../Steps/SurgeryRemoveOrganStepComponent.cs | 6 + .../Steps/SurgeryRemovePartStepComponent.cs | 6 + .../Steps/SurgeryRepeatableStepComponent.cs | 6 + .../Steps/SurgeryStepCompleteCheckEvent.cs | 4 + .../Surgery/Steps/SurgeryStepComponent.cs | 22 + .../_Shitmed/Surgery/SurgeryComponent.cs | 18 + .../_Shitmed/Surgery/SurgeryDoAfterEvent.cs | 18 + .../Surgery/SurgerySpeedModifierComponent.cs | 11 + .../Surgery/SurgeryStepDamageEvent.cs | 9 + .../_Shitmed/Surgery/SurgeryStepEvent.cs | 7 + .../Surgery/SurgeryTargetComponent.cs | 10 + Content.Shared/_Shitmed/Surgery/SurgeryUI.cs | 32 + .../_Shitmed/Surgery/SurgeryUiRefreshEvent.cs | 14 + .../Surgery/Tools/BoneGelComponent.cs | 11 + .../Surgery/Tools/BoneSawComponent.cs | 10 + .../Surgery/Tools/BoneSetterComponent.cs | 6 + .../Surgery/Tools/CauteryComponent.cs | 10 + .../Surgery/Tools/HemostatComponent.cs | 10 + .../Surgery/Tools/ISurgeryToolComponent.cs | 11 + .../Surgery/Tools/RetractorComponent.cs | 10 + .../Surgery/Tools/ScalpelComponent.cs | 10 + .../Surgery/Tools/SurgeryToolComponent.cs | 16 + .../Surgery/Tools/SurgicalDrillComponent.cs | 10 + Content.Shared/_Shitmed/Targeting/Events.cs | 38 + .../Targeting/SharedTargetingSystem.cs | 26 + .../_Shitmed/Targeting/TargetBodyPart.cs | 31 + .../_Shitmed/Targeting/TargetIntegrity.cs | 13 + .../_Shitmed/Targeting/TargetingComponent.cs | 59 ++ .../_White/Standing/SharedLayingDownSystem.cs | 8 +- .../_Shitmed/Medical/Surgery/attributions.yml | 49 ++ .../_Shitmed/Medical/Surgery/cautery1.ogg | Bin 0 -> 34770 bytes .../_Shitmed/Medical/Surgery/cautery2.ogg | Bin 0 -> 16854 bytes .../_Shitmed/Medical/Surgery/hemostat1.ogg | Bin 0 -> 15729 bytes .../Audio/_Shitmed/Medical/Surgery/organ1.ogg | Bin 0 -> 18912 bytes .../Audio/_Shitmed/Medical/Surgery/organ2.ogg | Bin 0 -> 18946 bytes .../_Shitmed/Medical/Surgery/retractor1.ogg | Bin 0 -> 11537 bytes .../_Shitmed/Medical/Surgery/retractor2.ogg | Bin 0 -> 9915 bytes .../Audio/_Shitmed/Medical/Surgery/saw.ogg | Bin 0 -> 46750 bytes .../_Shitmed/Medical/Surgery/scalpel1.ogg | Bin 0 -> 13736 bytes .../_Shitmed/Medical/Surgery/scalpel2.ogg | Bin 0 -> 13098 bytes .../Locale/en-US/_Shitmed/surgery-ui.ftl | 12 + .../en-US/escape-menu/ui/options-menu.ftl | 3 + Resources/Locale/en-US/guidebook/guides.ftl | 6 + .../components/health-analyzer-component.ftl | 2 + Resources/Prototypes/Body/Organs/human.yml | 17 +- Resources/Prototypes/Body/Parts/animal.yml | 2 +- Resources/Prototypes/Body/Parts/base.yml | 86 +- Resources/Prototypes/Body/Parts/skeleton.yml | 2 +- Resources/Prototypes/Body/Parts/vox.yml | 88 +- .../Prototypes/Body/Prototypes/a_ghost.yml | 19 +- .../Prototypes/Body/Prototypes/human.yml | 35 +- .../Catalog/Fills/Backpacks/duffelbag.yml | 2 + .../Catalog/Fills/Crates/medical.yml | 4 + .../Catalog/Fills/Lockers/heads.yml | 2 + .../Prototypes/DeltaV/Body/Parts/harpy.yml | 85 +- .../Prototypes/DeltaV/Body/Parts/rodentia.yml | 84 +- .../DeltaV/Body/Parts/vulpkanin.yml | 82 ++ .../Entities/Clothing/Belt/belts.yml | 1 + .../Entities/Debugging/debug_sweps.yml | 52 ++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 6 +- .../Prototypes/Entities/Mobs/Species/base.yml | 6 + .../Entities/Mobs/Species/skeleton.yml | 3 +- .../Entities/Mobs/Species/slime.yml | 3 + .../Circuitboards/Machine/production.yml | 16 + .../Objects/Specific/Medical/surgery.yml | 184 ++++- .../Furniture/Tables/operating_table.yml | 3 +- .../Entities/Structures/Machines/lathe.yml | 50 ++ .../Prototypes/EntityLists/Tools/surgery.yml | 6 + Resources/Prototypes/Guidebook/medical.yml | 32 + Resources/Prototypes/Reagents/gases.yml | 16 +- .../Prototypes/Recipes/Lathes/medical.yml | 9 + .../Recipes/Lathes/rehydrateable.yml | 100 +++ .../Prototypes/Roles/Jobs/Medical/chemist.yml | 6 + .../Jobs/Medical/chief_medical_officer.yml | 5 + .../Roles/Jobs/Medical/medical_doctor.yml | 5 + .../Roles/Jobs/Medical/medical_intern.yml | 5 + .../Roles/Jobs/Medical/paramedic.yml | 5 + .../_Shitmed/Body/Organs/felinid.yml | 24 + .../Prototypes/_Shitmed/Damage/containers.yml | 5 + .../_Shitmed/Damage/modifier_sets.yml | 10 + .../_Shitmed/Entities/Surgery/surgeries.yml | 539 +++++++++++++ .../Entities/Surgery/surgery_steps.yml | 563 +++++++++++++ .../Prototypes/_Shitmed/Species/misc.yml | 12 + .../Guidebook/Medical/OrganManipulation.xml | 51 ++ .../Guidebook/Medical/PartManipulation.xml | 51 ++ .../_Shitmed/Guidebook/Medical/Surgery.xml | 40 + .../Guidebook/Medical/UtilitySurgeries.xml | 24 + .../Textures/Interface/Ashen/target_doll.png | Bin 0 -> 422 bytes .../Interface/Clockwork/target_doll.png | Bin 0 -> 1219 bytes .../Interface/Default/target_doll.png | Bin 0 -> 422 bytes .../Interface/Minimalist/target_doll.png | Bin 0 -> 422 bytes .../Interface/Plasmafire/target_doll.png | Bin 0 -> 462 bytes .../Textures/Interface/Retro/target_doll.png | Bin 0 -> 383 bytes .../Interface/Slimecore/target_doll.png | Bin 0 -> 422 bytes .../Interface/Targeting/Doll/eyes.png | Bin 0 -> 5227 bytes .../Interface/Targeting/Doll/eyes_hover.png | Bin 0 -> 6856 bytes .../Interface/Targeting/Doll/groin.png | Bin 0 -> 5485 bytes .../Interface/Targeting/Doll/groin_hover.png | Bin 0 -> 6452 bytes .../Interface/Targeting/Doll/head.png | Bin 0 -> 5663 bytes .../Interface/Targeting/Doll/head_hover.png | Bin 0 -> 7153 bytes .../Interface/Targeting/Doll/leftarm.png | Bin 0 -> 5779 bytes .../Targeting/Doll/leftarm_hover.png | Bin 0 -> 6652 bytes .../Interface/Targeting/Doll/leftfoot.png | Bin 0 -> 5462 bytes .../Targeting/Doll/leftfoot_hover.png | Bin 0 -> 5476 bytes .../Interface/Targeting/Doll/lefthand.png | Bin 0 -> 5462 bytes .../Targeting/Doll/lefthand_hover.png | Bin 0 -> 6174 bytes .../Interface/Targeting/Doll/leftleg.png | Bin 0 -> 5488 bytes .../Targeting/Doll/leftleg_hover.png | Bin 0 -> 6185 bytes .../Interface/Targeting/Doll/mouth.png | Bin 0 -> 5219 bytes .../Interface/Targeting/Doll/mouth_hover.png | Bin 0 -> 5208 bytes .../Interface/Targeting/Doll/rightarm.png | Bin 0 -> 5773 bytes .../Targeting/Doll/rightarm_hover.png | Bin 0 -> 6592 bytes .../Interface/Targeting/Doll/rightfoot.png | Bin 0 -> 5454 bytes .../Targeting/Doll/rightfoot_hover.png | Bin 0 -> 5465 bytes .../Interface/Targeting/Doll/righthand.png | Bin 0 -> 5467 bytes .../Targeting/Doll/righthand_hover.png | Bin 0 -> 6207 bytes .../Interface/Targeting/Doll/rightleg.png | Bin 0 -> 5473 bytes .../Targeting/Doll/rightleg_hover.png | Bin 0 -> 5908 bytes .../Interface/Targeting/Doll/torso.png | Bin 0 -> 5284 bytes .../Interface/Targeting/Doll/torso_hover.png | Bin 0 -> 5672 bytes .../Targeting/Status/groin.rsi/groin_0.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_1.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_2.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_3.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_4.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_5.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_6.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_7.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_8.png | Bin 0 -> 178 bytes .../Targeting/Status/groin.rsi/meta.json | 38 + .../Targeting/Status/head.rsi/head_0.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_1.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_2.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_3.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_4.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_5.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_6.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_7.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_8.png | Bin 0 -> 155 bytes .../Targeting/Status/head.rsi/meta.json | 38 + .../Status/leftarm.rsi/leftarm_0.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_1.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_2.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_3.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_4.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_5.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_6.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_7.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_8.png | Bin 0 -> 154 bytes .../Targeting/Status/leftarm.rsi/meta.json | 38 + .../Status/leftfoot.rsi/leftfoot_0.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_1.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_2.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_3.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_4.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_5.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_6.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_7.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_8.png | Bin 0 -> 166 bytes .../Targeting/Status/leftfoot.rsi/meta.json | 38 + .../Status/lefthand.rsi/lefthand_0.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_1.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_2.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_3.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_4.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_5.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_6.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_7.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_8.png | Bin 0 -> 152 bytes .../Targeting/Status/lefthand.rsi/meta.json | 38 + .../Status/leftleg.rsi/leftleg_0.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_1.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_2.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_3.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_4.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_5.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_6.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_7.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_8.png | Bin 0 -> 170 bytes .../Targeting/Status/leftleg.rsi/meta.json | 38 + .../Targeting/Status/rightarm.rsi/meta.json | 38 + .../Status/rightarm.rsi/rightarm_0.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_1.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_2.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_3.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_4.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_5.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_6.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_7.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_8.png | Bin 0 -> 158 bytes .../Targeting/Status/rightfoot.rsi/meta.json | 38 + .../Status/rightfoot.rsi/rightfoot_0.png | Bin 0 -> 176 bytes .../Status/rightfoot.rsi/rightfoot_1.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_2.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_3.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_4.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_5.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_6.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_7.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_8.png | Bin 0 -> 161 bytes .../Targeting/Status/righthand.rsi/meta.json | 38 + .../Status/righthand.rsi/righthand_0.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_1.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_2.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_3.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_4.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_5.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_6.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_7.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_8.png | Bin 0 -> 152 bytes .../Targeting/Status/rightleg.rsi/meta.json | 38 + .../Status/rightleg.rsi/rightleg_0.png | Bin 0 -> 178 bytes .../Status/rightleg.rsi/rightleg_1.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_2.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_3.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_4.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_5.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_6.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_7.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_8.png | Bin 0 -> 166 bytes .../Targeting/Status/torso.rsi/meta.json | 38 + .../Targeting/Status/torso.rsi/torso_0.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_1.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_2.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_3.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_4.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_5.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_6.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_7.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_8.png | Bin 0 -> 186 bytes .../Species/Misc/Pizza/parts.rsi/l_arm.png | Bin 0 -> 572 bytes .../Species/Misc/Pizza/parts.rsi/meta.json | 19 + .../Species/Misc/Pizza/parts.rsi/r_arm.png | Bin 0 -> 608 bytes .../Medical/Surgery/bone_gel.rsi/bone-gel.png | Bin 0 -> 432 bytes .../Surgery/bone_gel.rsi/bone-gel_0.png | Bin 0 -> 391 bytes .../Surgery/bone_gel.rsi/bone-gel_25.png | Bin 0 -> 444 bytes .../Surgery/bone_gel.rsi/bone-gel_50.png | Bin 0 -> 456 bytes .../Surgery/bone_gel.rsi/bone-gel_75.png | Bin 0 -> 444 bytes .../Medical/Surgery/bone_gel.rsi/meta.json | 29 + .../bone_gel.rsi/predator_bone-gel.png | Bin 0 -> 585 bytes .../Surgery/bonesetter.rsi/bonesetter.png | Bin 0 -> 581 bytes .../Medical/Surgery/bonesetter.rsi/meta.json | 17 + .../bonesetter.rsi/predator_bonesetter.png | Bin 0 -> 489 bytes .../Surgery/manipulation.rsi/insertion.png | Bin 0 -> 379 bytes .../Surgery/manipulation.rsi/meta.json | 14 + .../limbgrower.rsi/limbgrower_fill.png | Bin 0 -> 9056 bytes .../limbgrower.rsi/limbgrower_idleoff.png | Bin 0 -> 3320 bytes .../limbgrower.rsi/limbgrower_idleon.png | Bin 0 -> 11102 bytes .../limbgrower.rsi/limbgrower_openpanel.png | Bin 0 -> 3981 bytes .../limbgrower.rsi/limbgrower_panelopen.png | Bin 0 -> 2273 bytes .../limbgrower.rsi/limbgrower_unfill.png | Bin 0 -> 9104 bytes .../Machines/limbgrower.rsi/meta.json | 85 ++ Resources/keybinds.yml | 9 +- 372 files changed, 8590 insertions(+), 179 deletions(-) create mode 100644 Content.Client/_Shitmed/Body/Components/BrainComponent.cs create mode 100644 Content.Client/_Shitmed/Body/Components/LungComponent.cs create mode 100644 Content.Client/_Shitmed/Body/Components/StomachComponent.cs create mode 100644 Content.Client/_Shitmed/Medical/Surgery/SurgeryBui.cs create mode 100644 Content.Client/_Shitmed/Medical/Surgery/SurgeryStepButton.xaml create mode 100644 Content.Client/_Shitmed/Medical/Surgery/SurgeryStepButton.xaml.cs create mode 100644 Content.Client/_Shitmed/Medical/Surgery/SurgerySystem.cs create mode 100644 Content.Client/_Shitmed/Medical/Surgery/SurgeryWindow.xaml create mode 100644 Content.Client/_Shitmed/Medical/Surgery/SurgeryWindow.xaml.cs create mode 100644 Content.Client/_Shitmed/Targeting/TargetingSystem.cs create mode 100644 Content.Client/_Shitmed/UserInterface/Systems/PartStatus/PartStatusUIController.cs create mode 100644 Content.Client/_Shitmed/UserInterface/Systems/PartStatus/Widgets/PartStatusControl.xaml create mode 100644 Content.Client/_Shitmed/UserInterface/Systems/PartStatus/Widgets/PartStatusControl.xaml.cs create mode 100644 Content.Client/_Shitmed/UserInterface/Systems/Targeting/TargetingUIController.cs create mode 100644 Content.Client/_Shitmed/UserInterface/Systems/Targeting/Widgets/TargetingControl.xaml create mode 100644 Content.Client/_Shitmed/UserInterface/Systems/Targeting/Widgets/TargetingControl.xaml.cs create mode 100644 Content.Client/_Shitmed/Xenonids/UI/XenoChoiceControl.xaml create mode 100644 Content.Client/_Shitmed/Xenonids/UI/XenoChoiceControl.xaml.cs create mode 100644 Content.IntegrationTests/Tests/_Shitmed/Body/SpeciesBUITest.cs create mode 100644 Content.Server/_Shitmed/Destructible/Thresholds/Behaviors/GibPartBehavior.cs create mode 100644 Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs create mode 100644 Content.Server/_Shitmed/Targeting/TargetingSystem.cs create mode 100644 Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/EarsComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/EyesComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/HeartComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/LiverComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/MarkingContainerComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/TailComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs create mode 100644 Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs create mode 100644 Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs create mode 100644 Content.Shared/_Shitmed/Humanoid/Events/ProfileLoadFinishedEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryLarvaConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryMarkingConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartPresentCondition.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryValidEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryWoundedConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryCompletedEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/OperatingTableComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/StepInvalidReason.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/BleedersClampedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartReattachedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartSawedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/IncisionOpenComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/OrganReattachedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/PartRemovedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageOpenComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageSawedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/Parts/SkinRetractedComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddMarkingStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddOrganStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddPartStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixOrganStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixPartStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemovePartStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryRepeatableStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryDoAfterEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgerySpeedModifierComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryStepDamageEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryTargetComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryUI.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryUiRefreshEvent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/BoneSetterComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs create mode 100644 Content.Shared/_Shitmed/Targeting/Events.cs create mode 100644 Content.Shared/_Shitmed/Targeting/SharedTargetingSystem.cs create mode 100644 Content.Shared/_Shitmed/Targeting/TargetBodyPart.cs create mode 100644 Content.Shared/_Shitmed/Targeting/TargetIntegrity.cs create mode 100644 Content.Shared/_Shitmed/Targeting/TargetingComponent.cs create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/attributions.yml create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/cautery1.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/cautery2.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/hemostat1.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/organ1.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/organ2.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/retractor1.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/retractor2.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/saw.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/scalpel1.ogg create mode 100644 Resources/Audio/_Shitmed/Medical/Surgery/scalpel2.ogg create mode 100644 Resources/Locale/en-US/_Shitmed/surgery-ui.ftl create mode 100644 Resources/Prototypes/_Shitmed/Body/Organs/felinid.yml create mode 100644 Resources/Prototypes/_Shitmed/Damage/containers.yml create mode 100644 Resources/Prototypes/_Shitmed/Damage/modifier_sets.yml create mode 100644 Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml create mode 100644 Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml create mode 100644 Resources/Prototypes/_Shitmed/Species/misc.yml create mode 100644 Resources/ServerInfo/_Shitmed/Guidebook/Medical/OrganManipulation.xml create mode 100644 Resources/ServerInfo/_Shitmed/Guidebook/Medical/PartManipulation.xml create mode 100644 Resources/ServerInfo/_Shitmed/Guidebook/Medical/Surgery.xml create mode 100644 Resources/ServerInfo/_Shitmed/Guidebook/Medical/UtilitySurgeries.xml create mode 100644 Resources/Textures/Interface/Ashen/target_doll.png create mode 100644 Resources/Textures/Interface/Clockwork/target_doll.png create mode 100644 Resources/Textures/Interface/Default/target_doll.png create mode 100644 Resources/Textures/Interface/Minimalist/target_doll.png create mode 100644 Resources/Textures/Interface/Plasmafire/target_doll.png create mode 100644 Resources/Textures/Interface/Retro/target_doll.png create mode 100644 Resources/Textures/Interface/Slimecore/target_doll.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/eyes.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/eyes_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/groin.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/groin_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/head.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/head_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftarm.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftarm_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/lefthand.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/lefthand_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftleg.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftleg_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/mouth.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/mouth_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightarm.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightarm_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightfoot.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightfoot_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/righthand.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/righthand_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightleg.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightleg_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/torso.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Doll/torso_hover.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_8.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_0.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_1.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_2.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_3.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_4.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_5.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_6.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_7.png create mode 100644 Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_8.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Misc/Pizza/parts.rsi/l_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Misc/Pizza/parts.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Misc/Pizza/parts.rsi/r_arm.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_0.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_25.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_50.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_75.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/predator_bone-gel.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/bonesetter.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/predator_bonesetter.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi/insertion.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_fill.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_idleoff.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_idleon.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_openpanel.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_panelopen.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_unfill.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/meta.json diff --git a/Content.Client/Body/Systems/BodySystem.cs b/Content.Client/Body/Systems/BodySystem.cs index bab785525b0..d26721ba247 100644 --- a/Content.Client/Body/Systems/BodySystem.cs +++ b/Content.Client/Body/Systems/BodySystem.cs @@ -1,7 +1,76 @@ using Content.Shared.Body.Systems; +// Shitmed Change Start +using Content.Shared._Shitmed.Body.Part; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Robust.Client.GameObjects; +using Robust.Shared.Utility; +using Content.Shared.Body.Components; +// Shitmed Change End namespace Content.Client.Body.Systems; public sealed class BodySystem : SharedBodySystem { + // Shitmed Change Start + [Dependency] private readonly MarkingManager _markingManager = default!; + + private void ApplyMarkingToPart(MarkingPrototype markingPrototype, + IReadOnlyList? colors, + bool visible, + SpriteComponent sprite) + { + for (var j = 0; j < markingPrototype.Sprites.Count; j++) + { + var markingSprite = markingPrototype.Sprites[j]; + + if (markingSprite is not SpriteSpecifier.Rsi rsi) + continue; + + var layerId = $"{markingPrototype.ID}-{rsi.RsiState}"; + + if (!sprite.LayerMapTryGet(layerId, out _)) + { + var layer = sprite.AddLayer(markingSprite, j + 1); + sprite.LayerMapSet(layerId, layer); + sprite.LayerSetSprite(layerId, rsi); + } + + sprite.LayerSetVisible(layerId, visible); + + if (!visible) + continue; + + // Okay so if the marking prototype is modified but we load old marking data this may no longer be valid + // and we need to check the index is correct. So if that happens just default to white? + if (colors != null && j < colors.Count) + sprite.LayerSetColor(layerId, colors[j]); + else + sprite.LayerSetColor(layerId, Color.White); + } + } + + protected override void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component) + { + if (!TryComp(target, out SpriteComponent? sprite)) + return; + + if (component.Color != null) + sprite.Color = component.Color.Value; + + foreach (var (visualLayer, markingList) in component.Markings) + foreach (var marking in markingList) + { + if (!_markingManager.TryGetMarking(marking, out var markingPrototype)) + continue; + + ApplyMarkingToPart(markingPrototype, marking.MarkingColors, marking.Visible, sprite); + } + } + + protected override void RemoveBodyMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance) + { + return; + } + // Shitmed Change End } diff --git a/Content.Client/Hands/Systems/HandsSystem.cs b/Content.Client/Hands/Systems/HandsSystem.cs index 68800a2afe5..a9f162fefe7 100644 --- a/Content.Client/Hands/Systems/HandsSystem.cs +++ b/Content.Client/Hands/Systems/HandsSystem.cs @@ -1,9 +1,11 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Shared._Shitmed.Body.Events; // Shitmed Change using Content.Client.DisplacementMap; using Content.Client.Examine; using Content.Client.Strip; using Content.Client.Verbs.UI; +using Content.Shared.Body.Part; // Shitmed Change using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; @@ -51,6 +53,8 @@ public override void Initialize() SubscribeLocalEvent(OnHandsShutdown); SubscribeLocalEvent(HandleComponentState); SubscribeLocalEvent(OnVisualsChanged); + SubscribeLocalEvent(HandleBodyPartRemoved); // Shitmed Change + SubscribeLocalEvent(HandleBodyPartDisabled); // Shitmed Change OnHandSetActive += OnHandActivated; } @@ -240,6 +244,35 @@ public void UIHandAltActivateItem(string handName) #region visuals + // Shitmed Change Start + private void HideLayers(EntityUid uid, HandsComponent component, Entity part, SpriteComponent? sprite = null) + { + if (part.Comp.PartType != BodyPartType.Hand || !Resolve(uid, ref sprite, logMissing: false)) + return; + + var location = part.Comp.Symmetry switch + { + BodyPartSymmetry.None => HandLocation.Middle, + BodyPartSymmetry.Left => HandLocation.Left, + BodyPartSymmetry.Right => HandLocation.Right, + _ => throw new ArgumentOutOfRangeException(nameof(part.Comp.Symmetry)) + }; + + if (component.RevealedLayers.TryGetValue(location, out var revealedLayers)) + { + foreach (var key in revealedLayers) + sprite.RemoveLayer(key); + + revealedLayers.Clear(); + } + } + + private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref BodyPartRemovedEvent args) => HideLayers(uid, component, args.Part); + + private void HandleBodyPartDisabled(EntityUid uid, HandsComponent component, ref BodyPartDisabledEvent args) => HideLayers(uid, component, args.Part); + + // Shitmed Change End + protected override void HandleEntityInserted(EntityUid uid, HandsComponent hands, EntInsertedIntoContainerMessage args) { base.HandleEntityInserted(uid, hands, args); diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs index baea03c8923..3261a109e73 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs @@ -1,4 +1,5 @@ using Content.Shared.MedicalScanner; +using Content.Shared._Shitmed.Targeting; // Shitmed Change using JetBrains.Annotations; using Robust.Client.UserInterface; @@ -19,10 +20,11 @@ protected override void Open() base.Open(); _window = this.CreateWindow(); - + _window.OnBodyPartSelected += SendBodyPartMessage; // Shitmed Change _window.Title = EntMan.GetComponent(Owner).EntityName; } + protected override void ReceiveMessage(BoundUserInterfaceMessage message) { if (_window == null) @@ -33,5 +35,21 @@ protected override void ReceiveMessage(BoundUserInterfaceMessage message) _window.Populate(cast); } + + // Shitmed Change Start + private void SendBodyPartMessage(TargetBodyPart? part, EntityUid target) => SendMessage(new HealthAnalyzerPartMessage(EntMan.GetNetEntity(target), part ?? null)); + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_window != null) + _window.OnBodyPartSelected -= SendBodyPartMessage; + + _window?.Dispose(); + } + + // Shitmed Change End } } diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml index aae8785b1fe..996796d9c9b 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml @@ -2,7 +2,7 @@ xmlns="https://spacestation14.io" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" MaxHeight="525" - MinWidth="300"> + MinWidth="350"> /// The health analyzer that should receive the updates /// The entity to start analyzing - private void BeginAnalyzingEntity(Entity healthAnalyzer, EntityUid target) + /// Shitmed Change: The body part to analyze, if any + private void BeginAnalyzingEntity(Entity healthAnalyzer, EntityUid target, EntityUid? part = null) { //Link the health analyzer to the scanned entity healthAnalyzer.Comp.ScannedEntity = target; + healthAnalyzer.Comp.CurrentBodyPart = part; // Shitmed Change _toggle.TryActivate(healthAnalyzer.Owner); - UpdateScannedUser(healthAnalyzer, target, true); + UpdateScannedUser(healthAnalyzer, target, true, part); // Shitmed Change } /// @@ -170,19 +196,44 @@ private void StopAnalyzingEntity(Entity healthAnalyzer, { //Unlink the analyzer healthAnalyzer.Comp.ScannedEntity = null; - + healthAnalyzer.Comp.CurrentBodyPart = null; // Shitmed Change _toggle.TryDeactivate(healthAnalyzer.Owner); UpdateScannedUser(healthAnalyzer, target, false); } + // Shitmed Change Start + /// + /// Shitmed Change: Handle the selection of a body part on the health analyzer + /// + /// The health analyzer that's receiving the updates + /// The message containing the selected part + private void OnHealthAnalyzerPartSelected(Entity healthAnalyzer, ref HealthAnalyzerPartMessage args) + { + if (!TryGetEntity(args.Owner, out var owner)) + return; + + if (args.BodyPart == null) + { + BeginAnalyzingEntity(healthAnalyzer, owner.Value, null); + } + else + { + var (targetType, targetSymmetry) = _bodySystem.ConvertTargetBodyPart(args.BodyPart.Value); + if (_bodySystem.GetBodyChildrenOfType(owner.Value, targetType, symmetry: targetSymmetry) is { } part) + BeginAnalyzingEntity(healthAnalyzer, owner.Value, part.FirstOrDefault().Id); + } + } + // Shitmed Change End + /// /// Send an update for the target to the healthAnalyzer /// /// The health analyzer /// The entity being scanned /// True makes the UI show ACTIVE, False makes the UI show INACTIVE - public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode) + /// Shitmed Change: The body part being scanned, if any + public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode, EntityUid? part = null) { if (!_uiSystem.HasUi(healthAnalyzer, HealthAnalyzerUiKey.Key)) return; @@ -210,6 +261,12 @@ public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool s if (HasComp(target)) unrevivable = true; + // Shitmed Change Start + Dictionary? body = null; + if (HasComp(target)) + body = _bodySystem.GetBodyPartStatus(target); + // Shitmed Change End + _uiSystem.ServerSendUiMessage(healthAnalyzer, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage( GetNetEntity(target), bodyTemperature, @@ -217,6 +274,9 @@ public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool s scanMode, bleeding, unrevivable + // Shitmed Change + body, + part != null ? GetNetEntity(part) : null )); } } diff --git a/Content.Server/_Shitmed/Destructible/Thresholds/Behaviors/GibPartBehavior.cs b/Content.Server/_Shitmed/Destructible/Thresholds/Behaviors/GibPartBehavior.cs new file mode 100644 index 00000000000..abbbd0928ad --- /dev/null +++ b/Content.Server/_Shitmed/Destructible/Thresholds/Behaviors/GibPartBehavior.cs @@ -0,0 +1,21 @@ +using Content.Shared.Body.Components; +using Content.Shared.Body.Part; +using JetBrains.Annotations; + +// Leaving this one in the default namespace because I am afraid to test it +// in the Shitmed namespace lmao. +namespace Content.Server.Destructible.Thresholds.Behaviors; + +[UsedImplicitly] +[DataDefinition] +public sealed partial class GibPartBehavior : IThresholdBehavior +{ + public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null) + { + if (!system.EntityManager.TryGetComponent(owner, out BodyPartComponent? part)) + return; + + system.BodySystem.GibPart(owner, part); + } +} + diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs new file mode 100644 index 00000000000..d8c52e3bdf7 --- /dev/null +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -0,0 +1,188 @@ +using Content.Server.Atmos.Rotting; +using Content.Server.Body.Systems; +using Content.Server.Chat.Systems; +using Content.Shared.Body.Organ; +using Content.Shared.Body.Part; +using Content.Server.Popups; +using Content.Shared.Bed.Sleep; +using Content.Shared.CCVar; +using Content.Shared.Damage; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared._Shitmed.Medical.Surgery; +using Content.Shared._Shitmed.Medical.Surgery.Conditions; +using Content.Shared._Shitmed.Medical.Surgery.Effects.Step; +using Content.Shared._Shitmed.Medical.Surgery.Steps; +using Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; +using Content.Shared._Shitmed.Medical.Surgery.Tools; +using Content.Shared.Prototypes; +using Robust.Server.GameObjects; +using Robust.Shared.Configuration; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using System.Linq; + +namespace Content.Server._Shitmed.Medical.Surgery; + +public sealed class SurgerySystem : SharedSurgerySystem +{ + [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly RottingSystem _rot = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + + private readonly List _surgeries = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnToolAfterInteract); + SubscribeLocalEvent(OnSurgeryStepDamage); + SubscribeLocalEvent(OnSurgeryDamageChange); + SubscribeLocalEvent(OnSurgerySpecialDamageChange); + SubscribeLocalEvent(OnStepScreamComplete); + SubscribeLocalEvent(OnStepSpawnComplete); + SubscribeLocalEvent(OnPrototypesReloaded); + LoadPrototypes(); + } + + protected override void RefreshUI(EntityUid body) + { + var surgeries = new Dictionary>(); + foreach (var surgery in _surgeries) + { + if (GetSingleton(surgery) is not { } surgeryEnt) + continue; + + foreach (var part in _body.GetBodyChildren(body)) + { + var ev = new SurgeryValidEvent(body, part.Id); + RaiseLocalEvent(surgeryEnt, ref ev); + + if (ev.Cancelled) + continue; + + surgeries.GetOrNew(GetNetEntity(part.Id)).Add(surgery); + } + + } + _ui.SetUiState(body, SurgeryUIKey.Key, new SurgeryBuiState(surgeries)); + /* + Reason we do this is because when applying a BUI State, it rolls back the state on the entity temporarily, + which just so happens to occur right as we're checking for step completion, so we end up with the UI + not updating at all until you change tools or reopen the window. I love shitcode. + */ + _ui.ServerSendUiMessage(body, SurgeryUIKey.Key, new SurgeryBuiRefreshMessage()); + } + private void SetDamage(EntityUid body, + DamageSpecifier damage, + float partMultiplier, + EntityUid user, + EntityUid part) + { + if (!TryComp(part, out var partComp)) + return; + + _damageable.TryChangeDamage(body, + damage, + true, + origin: user, + canSever: false, + partMultiplier: partMultiplier, + targetPart: _body.GetTargetBodyPart(partComp)); + } + + private void OnToolAfterInteract(Entity ent, ref AfterInteractEvent args) + { + var user = args.User; + if (args.Handled + || !args.CanReach + || args.Target == null + || !HasComp(args.Target) + || !TryComp(args.User, out var surgery) + || !surgery.CanOperate + || !IsLyingDown(args.Target.Value, args.User)) + { + return; + } + + if (user == args.Target && !_config.GetCVar(CCVars.CanOperateOnSelf)) + { + _popup.PopupEntity(Loc.GetString("surgery-error-self-surgery"), user, user); + return; + } + + args.Handled = true; + _ui.OpenUi(args.Target.Value, SurgeryUIKey.Key, user); + RefreshUI(args.Target.Value); + } + + 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) + { + // 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; + + var damageChange = ent.Comp.Damage; + if (HasComp(args.Body)) + damageChange = damageChange * ent.Comp.SleepModifier; + + 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)) + return; + + _chat.TryEmoteWithChat(args.Body, ent.Comp.Emote); + } + private void OnStepSpawnComplete(Entity ent, ref SurgeryStepEvent args) => + SpawnAtPosition(ent.Comp.Entity, Transform(args.Body).Coordinates); + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs args) + { + if (!args.WasModified()) + return; + + LoadPrototypes(); + } + + private void LoadPrototypes() + { + _surgeries.Clear(); + foreach (var entity in _prototypes.EnumeratePrototypes()) + if (entity.HasComponent()) + _surgeries.Add(new EntProtoId(entity.ID)); + } +} diff --git a/Content.Server/_Shitmed/Targeting/TargetingSystem.cs b/Content.Server/_Shitmed/Targeting/TargetingSystem.cs new file mode 100644 index 00000000000..0fcb0e7ed5a --- /dev/null +++ b/Content.Server/_Shitmed/Targeting/TargetingSystem.cs @@ -0,0 +1,54 @@ +using Content.Shared.Body.Systems; +using Content.Shared.Mobs; +using Content.Shared._Shitmed.Targeting; +using Content.Shared._Shitmed.Targeting.Events; + +namespace Content.Server._Shitmed.Targeting; +public sealed class TargetingSystem : SharedTargetingSystem +{ + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeNetworkEvent(OnTargetChange); + SubscribeLocalEvent(OnMobStateChange); + } + + private void OnTargetChange(TargetChangeEvent message, EntitySessionEventArgs args) + { + if (!TryComp(GetEntity(message.Uid), out var target)) + return; + + target.Target = message.BodyPart; + Dirty(GetEntity(message.Uid), target); + } + + private void OnMobStateChange(EntityUid uid, TargetingComponent component, MobStateChangedEvent args) + { + // Revival is handled by the server, so we're keeping all of this here. + var changed = false; + + if (args.NewMobState == MobState.Dead) + { + foreach (var part in GetValidParts()) + { + component.BodyStatus[part] = TargetIntegrity.Dead; + changed = true; + } + // I love groin shitcode. + component.BodyStatus[TargetBodyPart.Groin] = TargetIntegrity.Dead; + } + else if (args.OldMobState == MobState.Dead && (args.NewMobState == MobState.Alive || args.NewMobState == MobState.Critical)) + { + component.BodyStatus = _bodySystem.GetBodyPartStatus(uid); + changed = true; + } + + if (changed) + { + Dirty(uid, component); + RaiseNetworkEvent(new TargetIntegrityChangeEvent(GetNetEntity(uid)), uid); + } + } +} diff --git a/Content.Shared/Bed/Sleep/SleepingSystem.cs b/Content.Shared/Bed/Sleep/SleepingSystem.cs index 620ff96a757..ff0e06326cb 100644 --- a/Content.Shared/Bed/Sleep/SleepingSystem.cs +++ b/Content.Shared/Bed/Sleep/SleepingSystem.cs @@ -211,8 +211,14 @@ private void OnDamageChanged(Entity ent, ref DamageChangedEve if (!args.DamageIncreased || args.DamageDelta == null) return; - if (args.DamageDelta.GetTotal() >= ent.Comp.WakeThreshold) + /* Shitmed Change Start - Surgery needs this, sorry! If the nocturine gamers get too feisty + I'll probably just increase the threshold */ + + if (args.DamageDelta.GetTotal() >= ent.Comp.WakeThreshold + && !HasComp(ent)) TryWaking((ent, ent.Comp)); + + // Shitmed Change End } /// diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 3048927b5fb..1ce8243f319 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -1,16 +1,36 @@ using Content.Shared.Body.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Content.Shared._Shitmed.Medical.Surgery.Tools; // Shitmed Change namespace Content.Shared.Body.Organ; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] [Access(typeof(SharedBodySystem))] -public sealed partial class OrganComponent : Component +public sealed partial class OrganComponent : Component, ISurgeryToolComponent // Shitmed Change { /// /// Relevant body this organ is attached to. /// [DataField, AutoNetworkedField] public EntityUid? Body; + + // Shitmed Change Start + /// + /// Shitmed Change: Shitcodey solution to not being able to know what name corresponds to each organ's slot ID + /// without referencing the prototype or hardcoding. + /// + + [DataField] + public string SlotId = ""; + + [DataField] + public string ToolName { get; set; } = "An organ"; + + /// + /// Shitmed Change: If true, the organ will not heal an entity when transplanted into them. + /// + [DataField, AutoNetworkedField] + public bool? Used { get; set; } + // Shitmed Change End } diff --git a/Content.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index c4e65c06a3f..45d8975fb1a 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -4,11 +4,19 @@ using Robust.Shared.GameStates; using Robust.Shared.Serialization; +// Shitmed Change + +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.FixedPoint; +using Content.Shared._Shitmed.Medical.Surgery.Tools; +using Content.Shared._Shitmed.Targeting; + namespace Content.Shared.Body.Part; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] [Access(typeof(SharedBodySystem))] -public sealed partial class BodyPartComponent : Component +public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent // Shitmed Change { // Need to set this on container changes as it may be several transform parents up the hierarchy. /// @@ -17,6 +25,113 @@ public sealed partial class BodyPartComponent : Component [DataField, AutoNetworkedField] public EntityUid? Body; + // Shitmed Change Start + + [DataField, AutoNetworkedField] + public EntityUid? OriginalBody; + + [DataField, AutoNetworkedField] + public BodyPartSlot? ParentSlot; + + /// + /// Shitmed Change: Amount of damage to deal when the part gets removed. + /// Only works if IsVital is true. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 VitalDamage = 100; + + [DataField] + public string ToolName { get; set; } = "A body part"; + + [DataField, AutoNetworkedField] + public bool? Used { get; set; } = null; + + /// + /// Shitmed Change: What's the max health this body part can have? + /// + [DataField] + public float MinIntegrity; + + /// + /// Shitmed Change: Whether this body part is enabled or not. + /// + [DataField, AutoNetworkedField] + public bool Enabled = true; + + /// + /// Shitmed Change: Whether this body part can be enabled or not. Used for non-functional prosthetics. + /// + [DataField] + public bool CanEnable = true; + + /// + /// Shitmed Change: How long it takes to run another self heal tick on the body part. + /// + [DataField] + public float HealingTime = 30; + + /// + /// Shitmed Change: How long it has been since the last self heal tick on the body part. + /// + public float HealingTimer; + + /// + /// Shitmed Change: How much health to heal on the body part per tick. + /// + [DataField] + public float SelfHealingAmount = 5; + + /// + /// Shitmed Change: The name of the container for this body part. Used in insertion surgeries. + /// + [DataField] + public string ContainerName { get; set; } = "part_slot"; + + /// + /// Shitmed Change: The slot for item insertion. + /// + [DataField, AutoNetworkedField] + public ItemSlot ItemInsertionSlot = new(); + + + /// + /// Shitmed Change: Current species. Dictates things like body part sprites. + /// + [DataField, AutoNetworkedField] + public string Species { get; set; } = ""; + + /// + /// Shitmed Change: The total damage that has to be dealt to a body part + /// to make possible severing it. + /// + [DataField, AutoNetworkedField] + public float SeverIntegrity = 90; + + /// + /// Shitmed Change: The ID of the base layer for this body part. + /// + [DataField, AutoNetworkedField] + public string? BaseLayerId; + + /// + /// Shitmed Change: On what TargetIntegrity we should re-enable the part. + /// + [DataField, AutoNetworkedField] + public TargetIntegrity EnableIntegrity = TargetIntegrity.ModeratelyWounded; + + [DataField, AutoNetworkedField] + public Dictionary IntegrityThresholds = new() + { + { TargetIntegrity.CriticallyWounded, 90 }, + { TargetIntegrity.HeavilyWounded, 75 }, + { TargetIntegrity.ModeratelyWounded, 60 }, + { TargetIntegrity.SomewhatWounded, 40}, + { TargetIntegrity.LightlyWounded, 20 }, + { TargetIntegrity.Healthy, 10 }, + }; + + // Shitmed Change End + [DataField, AutoNetworkedField] public BodyPartType PartType = BodyPartType.Other; diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 250f90db8f3..7ecc13fbcab 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -15,6 +15,19 @@ using Robust.Shared.Map; using Robust.Shared.Utility; +// Shitmed Change +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.FixedPoint; +using Content.Shared.Humanoid; +using Content.Shared._Shitmed.Humanoid.Events; +using Content.Shared._Shitmed.Body.Part; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared.Rejuvenate; +using Content.Shared.Standing; +using Content.Shared._Shitmed.Targeting; +using Robust.Shared.Timing; + namespace Content.Shared.Body.Systems; public partial class SharedBodySystem @@ -29,6 +42,8 @@ public partial class SharedBodySystem [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly GibbingSystem _gibbingSystem = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly ItemSlotsSystem _slots = default!; // Shitmed Change + [Dependency] private readonly IGameTiming _gameTiming = default!; // Shitmed Change private const float GibletLaunchImpulse = 8; private const float GibletLaunchImpulseVariance = 3; @@ -42,6 +57,8 @@ private void InitializeBody() SubscribeLocalEvent(OnBodyInit); SubscribeLocalEvent(OnBodyMapInit); SubscribeLocalEvent(OnBodyCanDrag); + SubscribeLocalEvent(OnStandAttempt); // Shitmed Change + SubscribeLocalEvent(OnProfileLoadFinished); // Shitmed change } private void OnBodyInserted(Entity ent, ref EntInsertedIntoContainerMessage args) @@ -114,12 +131,13 @@ private void MapInitBody(EntityUid bodyEntity, BodyPrototype prototype) // This should already handle adding the entity to the root. var rootPartUid = SpawnInContainerOrDrop(protoRoot.Part, bodyEntity, BodyRootContainerId); var rootPart = Comp(rootPartUid); + rootPart.OriginalBody = bodyEntity; // Shitmed Change rootPart.Body = bodyEntity; Dirty(rootPartUid, rootPart); // Setup the rest of the body entities. SetupOrgans((rootPartUid, rootPart), protoRoot.Organs); - MapInitParts(rootPartUid, prototype); + MapInitParts(rootPartUid, rootPart, prototype); // Shitmed Change } private void OnBodyCanDrag(Entity ent, ref CanDragEvent args) @@ -130,7 +148,7 @@ private void OnBodyCanDrag(Entity ent, ref CanDragEvent args) /// /// Sets up all of the relevant body parts for a particular body entity and root part. /// - private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) + private void MapInitParts(EntityUid rootPartId, BodyPartComponent rootPart, BodyPrototype prototype) // Shitmed Change { // Start at the root part and traverse the body graph, setting up parts as we go. // Basic BFS pathfind. @@ -168,6 +186,11 @@ private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) var childPartComponent = Comp(childPart); var partSlot = CreatePartSlot(parentEntity, connection, childPartComponent.PartType, parentPartComponent); + // Shitmed Change Start + childPartComponent.ParentSlot = partSlot; + childPartComponent.OriginalBody = rootPart.Body; + Dirty(childPart, childPartComponent); + // Shitmed Change End var cont = Containers.GetContainer(parentEntity, GetPartSlotContainerId(connection)); if (partSlot is null || !Containers.Insert(childPart, cont)) @@ -234,6 +257,8 @@ public IEnumerable GetBodyContainers( if (id is null || !Resolve(id.Value, ref body, logMissing: false) || body.RootContainer.ContainedEntity is null + || body is null // Shitmed Change + || body.RootContainer == default // Shitmed Change || !Resolve(body.RootContainer.ContainedEntity.Value, ref rootPart)) { yield break; @@ -291,7 +316,10 @@ public virtual HashSet GibBody( Vector2? splatDirection = null, float splatModifier = 1, Angle splatCone = default, - SoundSpecifier? gibSoundOverride = null) + SoundSpecifier? gibSoundOverride = null, + // Shitmed Change + GibType gib = GibType.Gib, + GibContentsOption contents = GibContentsOption.Drop) { var gibs = new HashSet(); @@ -308,9 +336,9 @@ public virtual HashSet GibBody( foreach (var part in parts) { - _gibbingSystem.TryGibEntityWithRef(bodyId, part.Id, GibType.Gib, GibContentsOption.Skip, ref gibs, - playAudio: false, launchGibs:true, launchDirection:splatDirection, launchImpulse: GibletLaunchImpulse * splatModifier, - launchImpulseVariance:GibletLaunchImpulseVariance, launchCone: splatCone); + _gibbingSystem.TryGibEntityWithRef(bodyId, part.Id, gib, contents, ref gibs, // Shitmed Change + playAudio: false, launchGibs: true, launchDirection: splatDirection, launchImpulse: GibletLaunchImpulse * splatModifier, + launchImpulseVariance: GibletLaunchImpulseVariance, launchCone: splatCone); if (!gibOrgans) continue; @@ -335,4 +363,69 @@ public virtual HashSet GibBody( _audioSystem.PlayPredicted(gibSoundOverride, bodyTransform.Coordinates, null); return gibs; } + + // Shitmed Change Start + + public virtual HashSet GibPart( + EntityUid partId, + BodyPartComponent? part = null, + bool launchGibs = true, + Vector2? splatDirection = null, + float splatModifier = 1, + Angle splatCone = default, + SoundSpecifier? gibSoundOverride = null) + { + var gibs = new HashSet(); + + if (!Resolve(partId, ref part, logMissing: false)) + return gibs; + + if (part.Body is { } bodyEnt) + { + if (IsPartRoot(bodyEnt, partId, part: part)) + return gibs; + + RemovePartChildren((partId, part), bodyEnt); + foreach (var organ in GetPartOrgans(partId, part)) + { + _gibbingSystem.TryGibEntityWithRef(bodyEnt, organ.Id, GibType.Drop, GibContentsOption.Skip, + ref gibs, playAudio: false, launchImpulse: GibletLaunchImpulse * splatModifier, + launchImpulseVariance: GibletLaunchImpulseVariance, launchCone: splatCone); + } + var ev = new BodyPartDroppedEvent((partId, part)); + RaiseLocalEvent(bodyEnt, ref ev); + } + + _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)) + { + foreach (var item in _inventory.GetHandOrInventoryEntities(partId)) + { + SharedTransform.AttachToGridOrMap(item); + gibs.Add(item); + } + } + _audioSystem.PlayPredicted(gibSoundOverride, Transform(partId).Coordinates, null); + return gibs; + } + + private void OnProfileLoadFinished(EntityUid uid, BodyComponent component, ProfileLoadFinishedEvent args) + { + if (!HasComp(uid) + || TerminatingOrDeleted(uid)) + + foreach (var part in GetBodyChildren(uid, component)) + EnsureComp(part.Id); + } + private void OnStandAttempt(Entity ent, ref StandAttemptEvent args) + { + if (ent.Comp.LegEntities.Count == 0) + args.Cancel(); + } + + // Shitmed Change End } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index f83dd50c998..6fc559cc6b0 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -209,4 +209,19 @@ public bool TryGetBodyOrganEntityComps( comps = null; return false; } + + // Shitmed Change Start + + public bool TrySetOrganUsed(EntityUid organId, bool used, OrganComponent? organ = null) + { + if (!Resolve(organId, ref organ) + || organ.Used == true) + return false; + + organ.Used = true; + Dirty(organId, organ); + return true; + } + + // Shitmed Change End } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index 0917197e29f..0930ac41ae5 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -10,10 +10,21 @@ using Robust.Shared.Containers; using Robust.Shared.Utility; +// Shitmed Change Start +using Content.Shared.Humanoid; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared._Shitmed.Body.Part; +using Content.Shared.Inventory; +using Content.Shared.Random; +using Content.Shared._Shitmed.Targeting.Events; + namespace Content.Shared.Body.Systems; public partial class SharedBodySystem { + [Dependency] private readonly RandomHelperSystem _randomHelper = default!; // Shitmed Change + [Dependency] private readonly InventorySystem _inventorySystem = default!; // Shitmed Change + private void InitializeParts() { // TODO: This doesn't handle comp removal on child ents. @@ -21,8 +32,174 @@ private void InitializeParts() // If you modify this also see the Body partial for root parts. SubscribeLocalEvent(OnBodyPartInserted); SubscribeLocalEvent(OnBodyPartRemoved); + + // Shitmed Change Start + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnBodyPartRemove); + SubscribeLocalEvent(OnAmputateAttempt); + SubscribeLocalEvent(OnPartEnableChanged); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (ent.Comp.PartType == BodyPartType.Torso) + { + // For whatever reason this slot is initialized properly on the server, but not on the client. + // This seems to be an issue due to wiz-merge, on my old branch it was properly instantiating + // ItemInsertionSlot's container on both ends. It does show up properly on ItemSlotsComponent though. + _slots.AddItemSlot(ent, ent.Comp.ContainerName, ent.Comp.ItemInsertionSlot); + Dirty(ent, ent.Comp); + } + } + + private void OnBodyPartRemove(Entity ent, ref ComponentRemove args) + { + if (ent.Comp.PartType == BodyPartType.Torso) + _slots.RemoveItemSlot(ent, ent.Comp.ItemInsertionSlot); + } + + private void OnPartEnableChanged(Entity partEnt, ref BodyPartEnableChangedEvent args) + { + if (!partEnt.Comp.CanEnable && args.Enabled) + return; + + partEnt.Comp.Enabled = args.Enabled; + Dirty(partEnt, partEnt.Comp); + + if (args.Enabled) + EnablePart(partEnt); + else + DisablePart(partEnt); + } + + private void EnablePart(Entity partEnt) + { + if (!TryComp(partEnt.Comp.Body, out BodyComponent? body)) + return; + + // I hate having to hardcode these checks so much. + if (partEnt.Comp.PartType == BodyPartType.Leg) + AddLeg(partEnt, (partEnt.Comp.Body.Value, body)); + + if (partEnt.Comp.PartType == BodyPartType.Arm) + { + var hand = GetBodyChildrenOfType(partEnt.Comp.Body.Value, BodyPartType.Hand, symmetry: partEnt.Comp.Symmetry).FirstOrDefault(); + if (hand != default) + { + var ev = new BodyPartEnabledEvent(hand); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + if (partEnt.Comp.PartType == BodyPartType.Hand) + { + var ev = new BodyPartEnabledEvent(partEnt); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + /// + /// This function handles disabling or enabling equipment slots when an entity is + /// missing all of a given part type, or they get one added to them. + /// It is called right before dropping a part, or right after adding one. + /// + public void ChangeSlotState(Entity partEnt, bool disable) + { + if (partEnt.Comp.Body is not null + && GetBodyPartCount(partEnt.Comp.Body.Value, partEnt.Comp.PartType) == 1 + && TryGetPartSlotContainerName(partEnt.Comp.PartType, out var containerNames)) + { + foreach (var containerName in containerNames) + { + _inventorySystem.SetSlotStatus(partEnt.Comp.Body.Value, containerName, disable); + var ev = new RefreshInventorySlotsEvent(containerName); + RaiseLocalEvent(partEnt.Comp.Body.Value, ev); + } + } + + } + + private void DisablePart(Entity partEnt) + { + if (!TryComp(partEnt.Comp.Body, out BodyComponent? body)) + return; + + if (partEnt.Comp.PartType == BodyPartType.Leg) + RemoveLeg(partEnt, (partEnt.Comp.Body.Value, body)); + + if (partEnt.Comp.PartType == BodyPartType.Arm) + { + var hand = GetBodyChildrenOfType(partEnt.Comp.Body.Value, BodyPartType.Hand, symmetry: partEnt.Comp.Symmetry).FirstOrDefault(); + if (hand != default) + { + var ev = new BodyPartDisabledEvent(hand); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + if (partEnt.Comp.PartType == BodyPartType.Hand) + { + var ev = new BodyPartDisabledEvent(partEnt); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + // TODO: Refactor this crap. I hate it so much. + private void RemovePartEffect(Entity partEnt, Entity bodyEnt) + { + if (TerminatingOrDeleted(bodyEnt) + || !Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false)) + return; + + RemovePartChildren(partEnt, bodyEnt, bodyEnt.Comp); + } + + protected void RemovePartChildren(Entity partEnt, EntityUid bodyEnt, BodyComponent? body = null) + { + if (!Resolve(bodyEnt, ref body, logMissing: false)) + return; + + if (partEnt.Comp.Children.Any()) + { + foreach (var slotId in partEnt.Comp.Children.Keys) + { + if (Containers.TryGetContainer(partEnt, GetPartSlotContainerId(slotId), out var container) && + container is ContainerSlot slot && + slot.ContainedEntity is { } childEntity && + TryComp(childEntity, out BodyPartComponent? childPart)) + { + var ev = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(childEntity, ref ev); + DropPart((childEntity, childPart)); + } + } + + Dirty(bodyEnt, body); + } + } + + protected virtual void DropPart(Entity partEnt) + { + ChangeSlotState(partEnt, true); + // I don't know if this can cause issues, since any part that's being detached HAS to have a Body. + // though I really just want the compiler to shut the fuck up. + var body = partEnt.Comp.Body.GetValueOrDefault(); + if (TryComp(partEnt, out TransformComponent? transform) && _gameTiming.IsFirstTimePredicted) + { + var enableEvent = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(partEnt, ref enableEvent); + var droppedEvent = new BodyPartDroppedEvent(partEnt); + RaiseLocalEvent(body, ref droppedEvent); + SharedTransform.AttachToGridOrMap(partEnt, transform); + _randomHelper.RandomOffset(partEnt, 0.5f); + } + } + private void OnAmputateAttempt(Entity partEnt, ref AmputateAttemptEvent args) => + DropPart(partEnt); + + // Shitmed Change End private void OnBodyPartInserted(Entity ent, ref EntInsertedIntoContainerMessage args) { // Body part inserted into another body part. @@ -53,6 +230,7 @@ private void OnBodyPartRemoved(Entity ent, ref EntRemovedFrom if (TryComp(removedUid, out BodyPartComponent? part) && part.Body is not null) { + CheckBodyPart((removedUid, part), GetTargetBodyPart(part), true); // Shitmed Change RemovePart(part.Body.Value, (removedUid, part), slotId); RecursiveBodyUpdate((removedUid, part), null); } @@ -93,6 +271,8 @@ private void RecursiveBodyUpdate(Entity ent, EntityUid? bodyU } } + // The code for RemovePartEffect() should live here, because it literally is the point of this recursive function. + // But the debug asserts at the top plus existing tests need refactoring for this. So we'll be lazy. foreach (var slotId in ent.Comp.Children.Keys) { if (!Containers.TryGetContainer(ent, GetPartSlotContainerId(slotId), out var container)) @@ -127,12 +307,13 @@ protected virtual void RemovePart( { Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false); Dirty(partEnt, partEnt.Comp); - partEnt.Comp.Body = null; - + partEnt.Comp.OriginalBody = partEnt.Comp.Body; // Shitmed Change + partEnt.Comp.ParentSlot = null; // Shitmed Change var ev = new BodyPartRemovedEvent(slotId, partEnt); RaiseLocalEvent(bodyEnt, ref ev); RemoveLeg(partEnt, bodyEnt); + RemovePartEffect(partEnt, bodyEnt); // Shitmed Change PartRemoveDamage(bodyEnt, partEnt); } @@ -159,11 +340,7 @@ private void RemoveLeg(Entity legEnt, Entity bodyEnt.Comp.LegEntities.Remove(legEnt); UpdateMovementSpeed(bodyEnt); Dirty(bodyEnt, bodyEnt.Comp); - - if (!bodyEnt.Comp.LegEntities.Any()) - { - Standing.Down(bodyEnt); - } + Standing.Down(bodyEnt); // Shitmed Change } } @@ -177,9 +354,8 @@ private void PartRemoveDamage(Entity bodyEnt, Entity("Bloodloss"), 300); - Damageable.TryChangeDamage(bodyEnt, damage); + var damage = new DamageSpecifier(Prototypes.Index("Bloodloss"), partEnt.Comp.VitalDamage); // Shitmed Change + Damageable.TryChangeDamage(bodyEnt, damage, partMultiplier: 0f); // Shitmed Change } } @@ -444,6 +620,14 @@ public bool AttachPart( return false; } + part.ParentSlot = slot; + + if (TryComp(parentPart.Body, out HumanoidAppearanceComponent? bodyAppearance) + && !HasComp(partId) + && !TerminatingOrDeleted(parentPartId) + && !TerminatingOrDeleted(partId)) // Saw some exceptions involving these due to the spawn menu. + EnsureComp(partId); + return Containers.Insert(partId, container); } @@ -656,11 +840,13 @@ public bool BodyHasChild( public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyChildrenOfType( EntityUid bodyId, BodyPartType type, - BodyComponent? body = null) + BodyComponent? body = null, + // Shitmed Change + BodyPartSymmetry? symmetry = null) { foreach (var part in GetBodyChildren(bodyId, body)) { - if (part.Component.PartType == type) + if (part.Component.PartType == type && (symmetry == null || part.Component.Symmetry == symmetry)) // Shitmed Change yield return part; } } @@ -722,6 +908,78 @@ public bool TryGetBodyPartOrganComponents( return false; } + // Shitmed Change Start + /// + /// Tries to get a list of ValueTuples of EntityUid and OrganComponent on each organ + /// in the given part. + /// + /// The part entity id to check on. + /// The type of component to check for. + /// The part to check for organs on. + /// The organs found on the body part. + /// Whether any were found. + /// + /// This method is somewhat of a copout to the fact that we can't use reflection to generically + /// get the type of component on runtime due to sandboxing. So we simply do a HasComp check for each organ. + /// + public bool TryGetBodyPartOrgans( + EntityUid uid, + Type type, + [NotNullWhen(true)] out List<(EntityUid Id, OrganComponent Organ)>? organs, + BodyPartComponent? part = null) + { + if (!Resolve(uid, ref part)) + { + organs = null; + return false; + } + + var list = new List<(EntityUid Id, OrganComponent Organ)>(); + + foreach (var organ in GetPartOrgans(uid, part)) + { + if (HasComp(organ.Id, type)) + list.Add((organ.Id, organ.Component)); + } + + if (list.Count != 0) + { + organs = list; + return true; + } + + organs = null; + return false; + } + + private bool TryGetPartSlotContainerName(BodyPartType partType, out HashSet containerNames) + { + containerNames = partType switch + { + BodyPartType.Arm => new() { "gloves" }, + BodyPartType.Leg => new() { "shoes" }, + BodyPartType.Head => new() { "eyes", "ears", "head", "mask" }, + _ => new() + }; + return containerNames.Count > 0; + } + + public int GetBodyPartCount(EntityUid bodyId, BodyPartType partType, BodyComponent? body = null) + { + if (!Resolve(bodyId, ref body, logMissing: false)) + return 0; + + int count = 0; + foreach (var part in GetBodyChildren(bodyId, body)) + { + if (part.Component.PartType == partType) + count++; + } + return count; + } + + // Shitmed Change End + /// /// Gets the parent body part and all immediate child body parts for the partId. /// diff --git a/Content.Shared/Body/Systems/SharedBodySystem.cs b/Content.Shared/Body/Systems/SharedBodySystem.cs index a45966fcc37..f31b20b0adc 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.cs @@ -28,7 +28,7 @@ public abstract partial class SharedBodySystem : EntitySystem /// public const string OrganSlotContainerIdPrefix = "body_organ_slot_"; - [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IGameTiming _timing = default!; [Dependency] protected readonly IPrototypeManager Prototypes = default!; [Dependency] protected readonly DamageableSystem Damageable = default!; [Dependency] protected readonly MovementSpeedModifierSystem Movement = default!; @@ -42,6 +42,12 @@ public override void Initialize() InitializeBody(); InitializeParts(); + + // Shitmed Change Start + // To try and mitigate the server load due to integrity checks, we set up a Job Queue. + InitializeIntegrityQueue(); + InitializePartAppearances(); + // Shitmed Change End } /// diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 3c3e1b736df..9a64426e1f2 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -12,6 +12,11 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; +// Shitmed Change +using Content.Shared.Body.Systems; +using Content.Shared._Shitmed.Targeting; +using Robust.Shared.Random; + namespace Content.Shared.Damage { public sealed class DamageableSystem : EntitySystem @@ -19,6 +24,8 @@ public sealed class DamageableSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly INetManager _netMan = default!; + [Dependency] private readonly SharedBodySystem _body = default!; // Shitmed Change + [Dependency] private readonly IRobustRandom _random = default!; // Shitmed Change [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; private EntityQuery _appearanceQuery; @@ -97,7 +104,7 @@ public void SetDamage(EntityUid uid, DamageableComponent damageable, DamageSpeci /// The damage changed event is used by other systems, such as damage thresholds. /// public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSpecifier? damageDelta = null, - bool interruptsDoAfters = true, EntityUid? origin = null) + bool interruptsDoAfters = true, EntityUid? origin = null, bool? canSever = null) // Shitmed Change { component.Damage.GetDamagePerGroup(_prototypeManager, component.DamagePerGroup); component.TotalDamage = component.Damage.GetTotal(); @@ -108,7 +115,7 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp var data = new DamageVisualizerGroupData(component.DamagePerGroup.Keys.ToList()); _appearance.SetData(uid, DamageVisualizerKeys.DamageUpdateGroups, data, appearance); } - RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin)); + RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin, canSever ?? true)); // Shitmed Change } /// @@ -124,7 +131,9 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp /// null if the user had no applicable components that can take damage. /// public DamageSpecifier? TryChangeDamage(EntityUid? uid, DamageSpecifier damage, bool ignoreResistances = false, - bool interruptsDoAfters = true, DamageableComponent? damageable = null, EntityUid? origin = null) + bool interruptsDoAfters = true, DamageableComponent? damageable = null, EntityUid? origin = null, + // Shitmed Change + bool? canSever = true, bool? canEvade = false, float? partMultiplier = 1.00f, TargetBodyPart? targetPart = null) { if (!uid.HasValue || !_damageableQuery.Resolve(uid.Value, ref damageable, false)) { @@ -137,10 +146,11 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp return damage; } - var before = new BeforeDamageChangedEvent(damage, origin); + var before = new BeforeDamageChangedEvent(damage, origin, targetPart, canSever ?? true, canEvade ?? false, partMultiplier ?? 1.00f); // Shitmed Change RaiseLocalEvent(uid.Value, ref before); - if (before.Cancelled) + if (before.Cancelled + || before.Evaded) // Shitmed Change return null; // Apply resistances @@ -151,10 +161,11 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp { // TODO DAMAGE PERFORMANCE // use a local private field instead of creating a new dictionary here.. + // TODO: We need to add a check to see if the given armor covers the targeted part (if any) to modify or not. damage = DamageSpecifier.ApplyModifierSet(damage, modifierSet); } - var ev = new DamageModifyEvent(damage, origin); + var ev = new DamageModifyEvent(damage, origin, targetPart); // Shitmed Change RaiseLocalEvent(uid.Value, ev); damage = ev.Damage; @@ -186,7 +197,7 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp } if (delta.DamageDict.Count > 0) - DamageChanged(uid.Value, damageable, delta, interruptsDoAfters, origin); + DamageChanged(uid.Value, damageable, delta, interruptsDoAfters, origin, canSever); // Shitmed Change return delta; } @@ -256,6 +267,11 @@ private void OnRejuvenate(EntityUid uid, DamageableComponent component, Rejuvena TryComp(uid, out var thresholds); _mobThreshold.SetAllowRevives(uid, true, thresholds); // do this so that the state changes when we set the damage SetAllDamage(uid, component, 0); + // Shitmed Start + if (HasComp(uid)) + foreach (var part in _body.GetBodyChildren(uid)) + RaiseLocalEvent(part.Id, new RejuvenateEvent()); + // Shitmed End _mobThreshold.SetAllowRevives(uid, false, thresholds); } @@ -286,7 +302,16 @@ private void DamageableHandleState(EntityUid uid, DamageableComponent component, /// Raised before damage is done, so stuff can cancel it if necessary. /// [ByRefEvent] - public record struct BeforeDamageChangedEvent(DamageSpecifier Damage, EntityUid? Origin = null, bool Cancelled = false); + public record struct BeforeDamageChangedEvent( + DamageSpecifier Damage, + EntityUid? Origin = null, + // Shitmed Change + TargetBodyPart? TargetPart = null, + bool CanSever = true, + bool CanEvade = false, + float PartMultiplier = 1.00f, + bool Evaded = false, + bool Cancelled = false); /// /// Raised on an entity when damage is about to be dealt, @@ -303,12 +328,14 @@ public sealed class DamageModifyEvent : EntityEventArgs, IInventoryRelayEvent public readonly DamageSpecifier OriginalDamage; public DamageSpecifier Damage; public EntityUid? Origin; + public readonly TargetBodyPart? TargetPart; // Shitmed Change - public DamageModifyEvent(DamageSpecifier damage, EntityUid? origin = null) + public DamageModifyEvent(DamageSpecifier damage, EntityUid? origin = null, TargetBodyPart? targetPart = null) // Shitmed Change { OriginalDamage = damage; Damage = damage; Origin = origin; + TargetPart = targetPart; // Shitmed Change } } @@ -347,12 +374,17 @@ public sealed class DamageChangedEvent : EntityEventArgs /// public readonly EntityUid? Origin; - public DamageChangedEvent(DamageableComponent damageable, DamageSpecifier? damageDelta, bool interruptsDoAfters, EntityUid? origin) + /// + /// Shitmed Change: Can this damage event sever parts? + /// + public readonly bool CanSever; + + public DamageChangedEvent(DamageableComponent damageable, DamageSpecifier? damageDelta, bool interruptsDoAfters, EntityUid? origin, bool canSever = true) // Shitmed Change { Damageable = damageable; DamageDelta = damageDelta; Origin = origin; - + CanSever = canSever; // Shitmed Change if (DamageDelta == null) return; diff --git a/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs b/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs index 0f8b940bd66..384f3cc7ae5 100644 --- a/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs +++ b/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs @@ -63,6 +63,20 @@ public static IEnumerable Sublayers(HumanoidVisualLayers l yield return HumanoidVisualLayers.Chest; yield return HumanoidVisualLayers.Tail; break; + // Shitmed Change Start + case HumanoidVisualLayers.LHand: + yield return HumanoidVisualLayers.LHand; + break; + case HumanoidVisualLayers.RHand: + yield return HumanoidVisualLayers.RHand; + break; + case HumanoidVisualLayers.LFoot: + yield return HumanoidVisualLayers.LFoot; + break; + case HumanoidVisualLayers.RFoot: + yield return HumanoidVisualLayers.RFoot; + break; + // Shitmed Change End default: yield break; } diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index 327bc226269..0b1a3ef5a2b 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Decals; using Content.Shared.Examine; using Content.Shared.Humanoid.Markings; +using Content.Shared._Shitmed.Humanoid.Events; // Shitmed Change using Content.Shared.Humanoid.Prototypes; using Content.Shared.IdentityManagement; using Content.Shared.Preferences; @@ -100,6 +101,7 @@ private void OnInit(EntityUid uid, HumanoidAppearanceComponent humanoid, Compone } LoadProfile(uid, startingSet.Profile, humanoid); + RaiseLocalEvent(uid, new ProfileLoadFinishedEvent()); } private void OnExamined(EntityUid uid, HumanoidAppearanceComponent component, ExaminedEvent args) diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index fcc1969ceee..a7093119d41 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -61,6 +61,15 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction ResetZoom = "ResetZoom"; public static readonly BoundKeyFunction ToggleStanding = "ToggleStanding"; // WD EDIT + // Shitmed Change Start + public static readonly BoundKeyFunction TargetHead = "TargetHead"; + public static readonly BoundKeyFunction TargetTorso = "TargetTorso"; + public static readonly BoundKeyFunction TargetLeftArm = "TargetLeftArm"; + public static readonly BoundKeyFunction TargetRightArm = "TargetRightArm"; + public static readonly BoundKeyFunction TargetLeftLeg = "TargetLeftLeg"; + public static readonly BoundKeyFunction TargetRightLeg = "TargetRightLeg"; + + // Shitmed Change End public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp"; public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown"; public static readonly BoundKeyFunction ArcadeLeft = "ArcadeLeft"; diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index 04d58c1cd52..95f80f86e43 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -6,12 +6,20 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; +// Shitmed Change +using Robust.Shared.Serialization.Manager; +using Content.Shared.Random; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + namespace Content.Shared.Inventory; public partial class InventorySystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IViewVariablesManager _vvm = default!; + [Dependency] private readonly RandomHelperSystem _randomHelper = default!; // Shitmed Change + [Dependency] private readonly ISerializationManager _serializationManager = default!; // Shitmed Change private void InitializeSlots() { @@ -60,7 +68,7 @@ protected virtual void OnInit(EntityUid uid, InventoryComponent component, Compo if (!_prototypeManager.TryIndex(component.TemplateId, out InventoryTemplatePrototype? invTemplate)) return; - component.Slots = invTemplate.Slots; + _serializationManager.CopyTo(invTemplate.Slots, ref component.Slots, notNullableOverride: true); // Shitmed Change component.Containers = new ContainerSlot[component.Slots.Length]; for (var i = 0; i < component.Containers.Length; i++) { @@ -139,7 +147,7 @@ public bool TryGetSlot(EntityUid uid, string slot, [NotNullWhen(true)] out SlotD foreach (var slotDef in inventory.Slots) { - if (!slotDef.Name.Equals(slot)) + if (!slotDef.Name.Equals(slot) || slotDef.Disabled) // Shitmed Change continue; slotDefinition = slotDef; return true; @@ -252,7 +260,7 @@ public bool MoveNext([NotNullWhen(true)] out ContainerSlot? container) var i = _nextIdx++; var slot = _slots[i]; - if ((slot.SlotFlags & _flags) == 0) + if ((slot.SlotFlags & _flags) == 0 || slot.Disabled) // Shitmed Change continue; container = _containers[i]; @@ -292,7 +300,7 @@ public bool NextItem(out EntityUid item, [NotNullWhen(true)] out SlotDefinition? var i = _nextIdx++; slot = _slots[i]; - if ((slot.SlotFlags & _flags) == 0) + if ((slot.SlotFlags & _flags) == 0 || slot.Disabled) // Shitmed Change continue; var container = _containers[i]; @@ -308,4 +316,37 @@ public bool NextItem(out EntityUid item, [NotNullWhen(true)] out SlotDefinition? return false; } } + + // Shitmed Change Start + public void SetSlotStatus(EntityUid uid, string slotName, bool isDisabled, InventoryComponent? inventory = null) + { + if (!Resolve(uid, ref inventory)) + return; + + foreach (var slot in inventory.Slots) + { + if (slot.Name != slotName) + continue; + + if (isDisabled) + { + if (!TryGetSlotContainer(uid, slotName, out var container, out _, inventory)) + break; + + if (container.ContainedEntity is { } entityUid && TryComp(entityUid, out TransformComponent? transform) && _gameTiming.IsFirstTimePredicted) + { + _transform.AttachToGridOrMap(entityUid, transform); + _randomHelper.RandomOffset(entityUid, 0.5f); + } + //_containerSystem.ShutdownContainer(container); + } + //else + //_containerSystem.EnsureContainer(uid, slotName); + slot.Disabled = isDisabled; + break; + } + + Dirty(uid, inventory); + } + // Shitmed Change End } diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs index 91accec8c93..90b3fb3f947 100644 --- a/Content.Shared/Inventory/InventoryTemplatePrototype.cs +++ b/Content.Shared/Inventory/InventoryTemplatePrototype.cs @@ -60,4 +60,9 @@ public sealed partial class SlotDefinition /// Entity blacklist for CanEquip checks. /// [DataField("blacklist")] public EntityWhitelist? Blacklist = null; + + /// + /// Shitmed Change: Is this slot disabled? Could be due to severing or other reasons. + /// + [DataField] public bool Disabled; } diff --git a/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs b/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs index 08af1a36a7b..54a4a5e832d 100644 --- a/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs +++ b/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs @@ -1,3 +1,4 @@ +using Content.Shared._Shitmed.Targeting; // Shitmed Change using Robust.Shared.Serialization; namespace Content.Shared.MedicalScanner; @@ -14,8 +15,10 @@ public sealed class HealthAnalyzerScannedUserMessage : BoundUserInterfaceMessage public bool? ScanMode; public bool? Bleeding; public bool? Unrevivable; + public Dictionary? Body; // Shitmed Change + public NetEntity? Part; // Shitmed Change - public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable) + public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, Dictionary? body, NetEntity? part = null) // Shitmed Change { TargetEntity = targetEntity; Temperature = temperature; @@ -23,6 +26,17 @@ public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperatu ScanMode = scanMode; Bleeding = bleeding; Unrevivable = unrevivable; + Body = body; // Shitmed Change + Part = part; // Shitmed Change } } +// Shitmed Change Start +[Serializable, NetSerializable] +public sealed class HealthAnalyzerPartMessage(NetEntity? owner, TargetBodyPart? bodyPart) : BoundUserInterfaceMessage +{ + public readonly NetEntity? Owner = owner; + public readonly TargetBodyPart? BodyPart = bodyPart; + +} +// Shitmed Change End diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs b/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs index 5928b3871ff..744dc99de4d 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs @@ -1,5 +1,6 @@ using Content.Shared.Database; using Content.Shared.Mobs.Components; +using Content.Shared._Shitmed.Body.Organ; namespace Content.Shared.Mobs.Systems; @@ -103,6 +104,9 @@ private void ChangeState(EntityUid target, MobStateComponent component, MobState if (oldState == newState || !component.AllowedStates.Contains(newState)) return; + if (oldState == MobState.Dead && HasComp(target)) // Shitmed Change + return; + OnExitState(target, component, oldState); component.CurrentState = newState; OnEnterState(target, component, newState); diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 212c03475cf..a048844a119 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -154,6 +154,22 @@ public sealed partial class MeleeWeaponComponent : Component /// [DataField, AutoNetworkedField] public bool MustBeEquippedToUse = false; + + // Shitmed Change Start + + /// + /// Shitmed Change: Part damage is multiplied by this amount for single-target attacks + /// + [DataField, AutoNetworkedField] + public float ClickPartDamageMultiplier = 1.00f; + + /// + /// Shitmed Change: Part damage is multiplied by this amount for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyPartDamageMultiplier = 0.5f; + + // Shitmed Change End } /// diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 767b5c4ef62..2a3af8a677e 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -511,7 +511,7 @@ protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, Entity RaiseLocalEvent(target.Value, attackedEvent); var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage + attackedEvent.BonusDamage, hitEvent.ModifiersList); - var damageResult = Damageable.TryChangeDamage(target, modifiedDamage, origin:user, ignoreResistances:resistanceBypass); + var damageResult = Damageable.TryChangeDamage(target, modifiedDamage, origin: user, partMultiplier: component.ClickPartDamageMultiplier); // Shitmed Change if (damageResult is {Empty: false}) { @@ -666,7 +666,7 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU RaiseLocalEvent(entity, attackedEvent); var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage + attackedEvent.BonusDamage, hitEvent.ModifiersList); - var damageResult = Damageable.TryChangeDamage(entity, modifiedDamage, origin:user); + var damageResult = Damageable.TryChangeDamage(entity, modifiedDamage, origin: user, partMultiplier: component.HeavyPartDamageMultiplier); // Shitmed Change if (damageResult != null && damageResult.GetTotal() > FixedPoint2.Zero) { diff --git a/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs b/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs index 144981e9a6b..b3348d52b97 100644 --- a/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs +++ b/Content.Shared/_Goobstation/CCVars/CCVars.Goob.cs @@ -5,6 +5,13 @@ namespace Content.Shared._Goobstation.CCVar; [CVarDefs] public sealed partial class GoobCVars { + #region Surgery + + public static readonly CVarDef CanOperateOnSelf = + CVarDef.Create("surgery.can_operate_on_self", true, CVar.SERVERONLY); + + #endregion + /// /// Should the player automatically get up after being knocked down /// diff --git a/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs b/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs new file mode 100644 index 00000000000..4a97049882b --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs @@ -0,0 +1,28 @@ +using Content.Shared.Humanoid; +using Content.Shared.Body.Part; + +namespace Content.Shared._Shitmed.Body.Events; + +/// +/// Raised on an entity when attempting to remove a body part. +/// +[ByRefEvent] +public readonly record struct AmputateAttemptEvent(EntityUid Part); + +// Kind of a clone of BodyPartAddedEvent for surgical reattachment specifically. +[ByRefEvent] +public readonly record struct BodyPartAttachedEvent(Entity Part); + +// Kind of a clone of BodyPartRemovedEvent for any instances where we call DropPart(), reasoning being that RemovedEvent fires off +// a lot more often than what I'd like due to PVS. +[ByRefEvent] +public readonly record struct BodyPartDroppedEvent(Entity Part); + +[ByRefEvent] +public readonly record struct BodyPartEnableChangedEvent(bool Enabled); + +[ByRefEvent] +public readonly record struct BodyPartEnabledEvent(Entity Part); + +[ByRefEvent] +public readonly record struct BodyPartDisabledEvent(Entity Part); diff --git a/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs b/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs new file mode 100644 index 00000000000..9d07ca797d5 --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs @@ -0,0 +1,7 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Organ; + +[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/_Shitmed/Body/Organ/EarsComponent.cs b/Content.Shared/_Shitmed/Body/Organ/EarsComponent.cs new file mode 100644 index 00000000000..29c792dd0f4 --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/EarsComponent.cs @@ -0,0 +1,7 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Organ; + +[RegisterComponent] +public sealed partial class EarsComponent : Component; +// TODO: Use this for deafening. \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Body/Organ/EyesComponent.cs b/Content.Shared/_Shitmed/Body/Organ/EyesComponent.cs new file mode 100644 index 00000000000..3dade2091f1 --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/EyesComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Organ; + +[RegisterComponent] +public sealed partial class EyesComponent : Component; diff --git a/Content.Shared/_Shitmed/Body/Organ/HeartComponent.cs b/Content.Shared/_Shitmed/Body/Organ/HeartComponent.cs new file mode 100644 index 00000000000..fd7410d0dbe --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/HeartComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Organ; + +[RegisterComponent] +public sealed partial class HeartComponent : Component; diff --git a/Content.Shared/_Shitmed/Body/Organ/LiverComponent.cs b/Content.Shared/_Shitmed/Body/Organ/LiverComponent.cs new file mode 100644 index 00000000000..1fff7fee18c --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/LiverComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Organ; + +[RegisterComponent] +public sealed partial class LiverComponent : Component; diff --git a/Content.Shared/_Shitmed/Body/Organ/MarkingContainerComponent.cs b/Content.Shared/_Shitmed/Body/Organ/MarkingContainerComponent.cs new file mode 100644 index 00000000000..4931b59a30e --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/MarkingContainerComponent.cs @@ -0,0 +1,15 @@ +// This is a uh, very shitty copout to not wanting to modify the prototypes for felinids, and entities at large so they have ears. +// I will do that at some point, for now I just want the funny surgery to work lol. +using Robust.Shared.GameStates; +using Content.Shared.Humanoid.Markings; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared._Shitmed.Body.Organ; + +[RegisterComponent, NetworkedComponent] +public sealed partial class MarkingContainerComponent : Component +{ + [DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Marking = default!; + +} diff --git a/Content.Shared/_Shitmed/Body/Organ/TailComponent.cs b/Content.Shared/_Shitmed/Body/Organ/TailComponent.cs new file mode 100644 index 00000000000..53d4913eead --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/TailComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Organ; + +[RegisterComponent] +public sealed partial class TailComponent : Component; diff --git a/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs b/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs new file mode 100644 index 00000000000..a0150f82549 --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs @@ -0,0 +1,45 @@ +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Humanoid.Markings; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Body.Part; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class BodyPartAppearanceComponent : Component +{ + /// + /// HumanoidVisualLayer type for this body part. + /// + [DataField, AutoNetworkedField] + public HumanoidVisualLayers Type { get; set; } + + /// + /// Relevant markings for this body part that will be applied on attachment. + /// + [DataField, AutoNetworkedField] + public Dictionary> Markings = new(); + + /// + /// ID of this custom base layer. Must be a . + /// I don't actually know if these serializer props are necessary. I just lifted this from MS14 lol. + /// + [DataField(customTypeSerializer: typeof(PrototypeIdSerializer)), AutoNetworkedField] + public string? ID { get; set; } + + /// + /// Color of this custom base layer. Null implies skin colour if the corresponding is set to match skin. + /// + [DataField, AutoNetworkedField] + public Color? Color { get; set; } + + /// + /// Color of this custom base eye layer. Null implies eye colour if the corresponding is set to match skin. + /// + [DataField, AutoNetworkedField] + public Color? EyeColor { get; set; } + + [DataField, AutoNetworkedField] + public EntityUid? OriginalBody { get; set; } +} diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs new file mode 100644 index 00000000000..199870fa6d3 --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs @@ -0,0 +1,201 @@ +using System.Diagnostics; +using System.Linq; +using Content.Shared.Body.Components; +using Content.Shared.Body.Part; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared._Shitmed.Body.Part; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Body.Systems; +public partial class SharedBodySystem +{ + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + private void InitializePartAppearances() + { + base.Initialize(); + + SubscribeLocalEvent(OnPartAppearanceStartup); + SubscribeLocalEvent(HandleState); + SubscribeLocalEvent(OnPartAttachedToBody); + SubscribeLocalEvent(OnPartDroppedFromBody); + } + + private void OnPartAppearanceStartup(EntityUid uid, BodyPartAppearanceComponent component, ComponentStartup args) + { + if (!TryComp(uid, out BodyPartComponent? part) + || 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; + component.OriginalBody = part.OriginalBody.Value; + + part.Species = bodyAppearance.Species; + + if (customLayers.ContainsKey(component.Type)) + { + component.ID = customLayers[component.Type].Id; + component.Color = customLayers[component.Type].Color; + } + else if (spriteLayers.ContainsKey(component.Type)) + { + component.ID = spriteLayers[component.Type].ID; + component.Color = bodyAppearance.SkinColor; + } + else + { + component.ID = CreateIdFromPart(bodyAppearance, relevantLayer); + component.Color = bodyAppearance.SkinColor; + } + + // I HATE HARDCODED CHECKS I HATE HARDCODED CHECKS I HATE HARDCODED CHECKS + if (part.PartType == BodyPartType.Head) + component.EyeColor = bodyAppearance.EyeColor; + + var markingsByLayer = new Dictionary>(); + + foreach (var layer in HumanoidVisualLayersExtension.Sublayers(relevantLayer)) + { + var category = MarkingCategoriesConversion.FromHumanoidVisualLayers(layer); + if (bodyAppearance.MarkingSet.Markings.TryGetValue(category, out var markingList)) + markingsByLayer[layer] = markingList.Select(m => new Marking(m.MarkingId, m.MarkingColors.ToList())).ToList(); + } + + component.Markings = markingsByLayer; + } + + private string? CreateIdFromPart(HumanoidAppearanceComponent bodyAppearance, HumanoidVisualLayers part) + { + var speciesProto = _prototypeManager.Index(bodyAppearance.Species); + var baseSprites = _prototypeManager.Index(speciesProto.SpriteSet); + + if (!baseSprites.Sprites.ContainsKey(part)) + return null; + + return HumanoidVisualLayersExtension.GetSexMorph(part, bodyAppearance.Sex, baseSprites.Sprites[part]); + } + + public void ModifyMarkings(EntityUid uid, + Entity partAppearance, + HumanoidAppearanceComponent bodyAppearance, + HumanoidVisualLayers targetLayer, + string markingId, + bool remove = false) + { + + if (!Resolve(partAppearance, ref partAppearance.Comp)) + return; + + if (!remove) + { + + if (!_markingManager.Markings.TryGetValue(markingId, out var prototype)) + return; + + var markingColors = MarkingColoring.GetMarkingLayerColors( + prototype, + bodyAppearance.SkinColor, + bodyAppearance.EyeColor, + bodyAppearance.MarkingSet + ); + + var marking = new Marking(markingId, markingColors); + + _humanoid.SetLayerVisibility(uid, targetLayer, true, true, bodyAppearance); + _humanoid.AddMarking(uid, markingId, markingColors, true, true, bodyAppearance); + if (!partAppearance.Comp.Markings.ContainsKey(targetLayer)) + partAppearance.Comp.Markings[targetLayer] = new List(); + + partAppearance.Comp.Markings[targetLayer].Add(marking); + } + //else + //RemovePartMarkings(uid, component, bodyAppearance); + } + + private void HandleState(EntityUid uid, BodyPartAppearanceComponent component, ref AfterAutoHandleStateEvent args) => + ApplyPartMarkings(uid, component); + + private void OnPartAttachedToBody(EntityUid uid, BodyComponent component, ref BodyPartAttachedEvent args) + { + if (!TryComp(args.Part, out BodyPartAppearanceComponent? partAppearance) + || !TryComp(uid, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + if (partAppearance.ID != null) + _humanoid.SetBaseLayerId(uid, partAppearance.Type, partAppearance.ID, sync: true, bodyAppearance); + + UpdateAppearance(uid, partAppearance); + } + + private void OnPartDroppedFromBody(EntityUid uid, BodyComponent component, ref BodyPartDroppedEvent args) + { + if (TerminatingOrDeleted(uid) + || TerminatingOrDeleted(args.Part) + || !TryComp(uid, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + // We check for this conditional here since some entities may not have a profile... If they dont + // have one, and their part is gibbed, the markings will not be removed or applied properly. + if (!HasComp(args.Part)) + EnsureComp(args.Part); + + if (TryComp(args.Part, out var partAppearance)) + RemoveAppearance(uid, partAppearance, args.Part); + } + + protected void UpdateAppearance(EntityUid target, + BodyPartAppearanceComponent component) + { + if (!TryComp(target, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + if (component.EyeColor != null) + bodyAppearance.EyeColor = component.EyeColor.Value; + + if (component.Color != null) + _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); + foreach (var marking in markingList) + _humanoid.AddMarking(target, marking.MarkingId, marking.MarkingColors, false, true, bodyAppearance); + } + + Dirty(target, bodyAppearance); + } + + protected void RemoveAppearance(EntityUid entity, BodyPartAppearanceComponent component, EntityUid partEntity) + { + if (!TryComp(entity, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + foreach (var (visualLayer, markingList) in component.Markings) + { + _humanoid.SetLayerVisibility(entity, visualLayer, false, true, bodyAppearance); + } + RemoveBodyMarkings(entity, component, bodyAppearance); + } + + protected abstract void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component); + + protected abstract void RemoveBodyMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance); +} diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs new file mode 100644 index 00000000000..89bf2a0232e --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs @@ -0,0 +1,505 @@ +using Content.Shared.Body.Components; +using Content.Shared.Body.Part; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; +using Content.Shared.IdentityManagement; +using Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Popups; +using Content.Shared.Standing; +using Content.Shared._Shitmed.Targeting; +using Content.Shared._Shitmed.Targeting.Events; +using Robust.Shared.CPUJob.JobQueues; +using Robust.Shared.CPUJob.JobQueues.Queues; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Timing; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +// Namespace has set accessors, leaving it on the default. +namespace Content.Shared.Body.Systems; + +public partial class SharedBodySystem +{ + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + + [Dependency] private readonly SharedPopupSystem _popup = default!; + private readonly string[] _severingDamageTypes = { "Slash", "Pierce", "Blunt" }; + private const double IntegrityJobTime = 0.005; + private readonly JobQueue _integrityJobQueue = new(IntegrityJobTime); + public sealed class IntegrityJob : Job + { + private readonly SharedBodySystem _self; + private readonly Entity _ent; + public IntegrityJob(SharedBodySystem self, Entity ent, double maxTime, CancellationToken cancellation = default) : base(maxTime, cancellation) + { + _self = self; + _ent = ent; + } + + public IntegrityJob(SharedBodySystem self, Entity ent, double maxTime, IStopwatch stopwatch, CancellationToken cancellation = default) : base(maxTime, stopwatch, cancellation) + { + _self = self; + _ent = ent; + } + + protected override Task Process() + { + _self.ProcessIntegrityTick(_ent); + + return Task.FromResult(null); + } + } + + private EntityQuery _queryTargeting; + private void InitializeIntegrityQueue() + { + _queryTargeting = GetEntityQuery(); + SubscribeLocalEvent(OnBeforeDamageChanged); + SubscribeLocalEvent(OnBodyDamageModify); + SubscribeLocalEvent(OnPartDamageModify); + SubscribeLocalEvent(OnDamageChanged); + } + + private void ProcessIntegrityTick(Entity entity) + { + if (!TryComp(entity, out var damageable)) + return; + + var damage = damageable.TotalDamage; + + if (entity.Comp is { Body: { } body } + && damage > entity.Comp.MinIntegrity + && damage <= entity.Comp.IntegrityThresholds[TargetIntegrity.HeavilyWounded] + && _queryTargeting.HasComp(body) + && !_mobState.IsDead(body)) + _damageable.TryChangeDamage(entity, GetHealingSpecifier(entity), canSever: false, targetPart: GetTargetBodyPart(entity)); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + _integrityJobQueue.Process(); + + if (!_timing.IsFirstTimePredicted) + return; + + using var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var part)) + { + part.HealingTimer += frameTime; + + if (part.HealingTimer >= part.HealingTime) + { + part.HealingTimer = 0; + _integrityJobQueue.EnqueueJob(new IntegrityJob(this, (ent, part), IntegrityJobTime)); + } + } + } + + private void OnBeforeDamageChanged(Entity ent, ref BeforeDamageChangedEvent args) + { + // If our target has a TargetingComponent, that means they will take limb damage + // And if their attacker also has one, then we use that part. + if (_queryTargeting.TryComp(ent, out var targetEnt)) + { + var damage = args.Damage; + TargetBodyPart? targetPart = null; + + if (args.TargetPart != null) + { + targetPart = args.TargetPart; + } + else if (args.Origin.HasValue && _queryTargeting.TryComp(args.Origin.Value, out var targeter)) + { + targetPart = targeter.Target; + // If the target is Torso then have a 33% chance to hit another part + if (targetPart.Value == TargetBodyPart.Torso) + { + var additionalPart = GetRandomPartSpread(_random, 10); + targetPart = targetPart.Value | additionalPart; + } + } + else + { + // If there's an origin in this case, that means it comes from an entity without TargetingComponent, + // such as an animal, so we attack a random part. + if (args.Origin.HasValue) + { + targetPart = GetRandomBodyPart(ent, targetEnt); + } + // Otherwise we damage all parts equally (barotrauma, explosions, etc). + else if (damage != null) + { + // Division by 2 cuz damaging all parts by the same damage by default is too much. + damage /= 2; + targetPart = TargetBodyPart.All; + } + } + + if (targetPart == null) + return; + + if (!TryChangePartDamage(ent, args.Damage, args.CanSever, args.CanEvade, args.PartMultiplier, targetPart.Value) + && args.CanEvade) + { + if (_net.IsServer) + _popup.PopupEntity(Loc.GetString("surgery-part-damage-evaded", ("user", Identity.Entity(ent, EntityManager))), ent); + + args.Evaded = true; + } + } + } + + private void OnBodyDamageModify(Entity bodyEnt, ref DamageModifyEvent args) + { + if (args.TargetPart != null) + { + var (targetType, _) = ConvertTargetBodyPart(args.TargetPart.Value); + args.Damage = args.Damage * GetPartDamageModifier(targetType); + } + } + + private void OnPartDamageModify(Entity partEnt, ref DamageModifyEvent args) + { + if (partEnt.Comp.Body != null + && TryComp(partEnt.Comp.Body.Value, out DamageableComponent? damageable) + && damageable.DamageModifierSetId != null + && Prototypes.TryIndex(damageable.DamageModifierSetId, out var modifierSet)) + // TODO: We need to add a check to see if the given armor covers this part to cancel or not. + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, modifierSet); + + if (Prototypes.TryIndex("PartDamage", out var partModifierSet)) + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, partModifierSet); + + args.Damage = args.Damage * GetPartDamageModifier(partEnt.Comp.PartType); + } + + private bool TryChangePartDamage(EntityUid entity, + DamageSpecifier damage, + bool canSever, + bool canEvade, + float partMultiplier, + TargetBodyPart targetParts) + { + var landed = false; + var targets = SharedTargetingSystem.GetValidParts(); + foreach (var target in targets) + { + if (!targetParts.HasFlag(target)) + continue; + + var (targetType, targetSymmetry) = ConvertTargetBodyPart(target); + if (GetBodyChildrenOfType(entity, targetType, symmetry: targetSymmetry) is { } part) + { + if (canEvade && TryEvadeDamage(entity, GetEvadeChance(targetType))) + continue; + + var damageResult = _damageable.TryChangeDamage(part.FirstOrDefault().Id, damage * partMultiplier, canSever: canSever); + if (damageResult != null && damageResult.GetTotal() != 0) + landed = true; + } + } + + return landed; + } + + private void OnDamageChanged(Entity partEnt, ref DamageChangedEvent args) + { + if (!TryComp(partEnt, out var damageable)) + return; + + var severed = false; + var partIdSlot = GetParentPartAndSlotOrNull(partEnt)?.Slot; + var delta = args.DamageDelta; + + if (args.CanSever + && partIdSlot is not null + && delta != null + && !HasComp(partEnt) + && !partEnt.Comp.Enabled + && damageable.TotalDamage >= partEnt.Comp.SeverIntegrity + && _severingDamageTypes.Any(damageType => delta.DamageDict.TryGetValue(damageType, out var value) && value > 0)) + severed = true; + + CheckBodyPart(partEnt, GetTargetBodyPart(partEnt), severed, damageable); + + if (severed) + DropPart(partEnt); + + Dirty(partEnt, partEnt.Comp); + } + + /// + /// Gets the random body part rolling a number between 1 and 9, and returns + /// Torso if the result is 9 or more. The higher torsoWeight is, the higher chance to return it. + /// By default, the chance to return Torso is 50%. + /// + private static TargetBodyPart GetRandomPartSpread(IRobustRandom random, ushort torsoWeight = 9) + { + const int targetPartsAmount = 9; + // 5 = amount of target parts except Torso + return random.Next(1, targetPartsAmount + torsoWeight) switch + { + 1 => TargetBodyPart.Head, + 2 => TargetBodyPart.RightArm, + 3 => TargetBodyPart.RightHand, + 4 => TargetBodyPart.LeftArm, + 5 => TargetBodyPart.LeftHand, + 6 => TargetBodyPart.RightLeg, + 7 => TargetBodyPart.RightFoot, + 8 => TargetBodyPart.LeftLeg, + 9 => TargetBodyPart.LeftFoot, + _ => TargetBodyPart.Torso, + }; + } + + public TargetBodyPart? GetRandomBodyPart(EntityUid uid, TargetingComponent? target = null) + { + if (!Resolve(uid, ref target)) + return null; + + var totalWeight = target.TargetOdds.Values.Sum(); + var randomValue = _random.NextFloat() * totalWeight; + + foreach (var (part, weight) in target.TargetOdds) + { + if (randomValue <= weight) + return part; + randomValue -= weight; + } + + return TargetBodyPart.Torso; // Default to torso if something goes wrong + } + + /// + /// This should be called after body part damage was changed. + /// + protected void CheckBodyPart( + Entity partEnt, + TargetBodyPart? targetPart, + bool severed, + DamageableComponent? damageable = null) + { + if (!Resolve(partEnt, ref damageable)) + return; + + var integrity = damageable.TotalDamage; + + // KILL the body part + if (partEnt.Comp.Enabled && integrity >= partEnt.Comp.IntegrityThresholds[TargetIntegrity.CriticallyWounded]) + { + var ev = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(partEnt, ref ev); + } + + // LIVE the body part + if (!partEnt.Comp.Enabled && integrity <= partEnt.Comp.IntegrityThresholds[partEnt.Comp.EnableIntegrity] && !severed) + { + var ev = new BodyPartEnableChangedEvent(true); + RaiseLocalEvent(partEnt, ref ev); + } + + if (_queryTargeting.TryComp(partEnt.Comp.Body, out var targeting) + && HasComp(partEnt.Comp.Body)) + { + var newIntegrity = GetIntegrityThreshold(partEnt.Comp, integrity.Float(), severed); + // We need to check if the part is dead to prevent the UI from showing dead parts as alive. + if (targetPart is not null && + targeting.BodyStatus.ContainsKey(targetPart.Value) && + targeting.BodyStatus[targetPart.Value] != TargetIntegrity.Dead) + { + targeting.BodyStatus[targetPart.Value] = newIntegrity; + if (targetPart.Value == TargetBodyPart.Torso) + targeting.BodyStatus[TargetBodyPart.Groin] = newIntegrity; + + Dirty(partEnt.Comp.Body.Value, targeting); + } + // Revival events are handled by the server, so we end up being locked to a network event. + // I hope you like the _net.IsServer, Remuchi :) + if (_net.IsServer) + RaiseNetworkEvent(new TargetIntegrityChangeEvent(GetNetEntity(partEnt.Comp.Body.Value)), partEnt.Comp.Body.Value); + } + } + + /// + /// Gets the integrity of all body parts in the entity. + /// + public Dictionary GetBodyPartStatus(EntityUid entityUid) + { + var result = new Dictionary(); + + if (!TryComp(entityUid, out var body)) + return result; + + foreach (var part in SharedTargetingSystem.GetValidParts()) + { + result[part] = TargetIntegrity.Severed; + } + + foreach (var partComponent in GetBodyChildren(entityUid, body)) + { + var targetBodyPart = GetTargetBodyPart(partComponent.Component.PartType, partComponent.Component.Symmetry); + + if (targetBodyPart != null && TryComp(partComponent.Id, out var damageable)) + result[targetBodyPart.Value] = GetIntegrityThreshold(partComponent.Component, damageable.TotalDamage.Float(), false); + } + + // Hardcoded shitcode for Groin :) + result[TargetBodyPart.Groin] = result[TargetBodyPart.Torso]; + + return result; + } + + public TargetBodyPart? GetTargetBodyPart(Entity part) => GetTargetBodyPart(part.Comp.PartType, part.Comp.Symmetry); + public TargetBodyPart? GetTargetBodyPart(BodyPartComponent part) => GetTargetBodyPart(part.PartType, part.Symmetry); + + /// + /// Converts Enums from BodyPartType to their Targeting system equivalent. + /// + public TargetBodyPart? GetTargetBodyPart(BodyPartType type, BodyPartSymmetry symmetry) + { + return (type, symmetry) switch + { + (BodyPartType.Head, _) => TargetBodyPart.Head, + (BodyPartType.Torso, _) => TargetBodyPart.Torso, + (BodyPartType.Arm, BodyPartSymmetry.Left) => TargetBodyPart.LeftArm, + (BodyPartType.Arm, BodyPartSymmetry.Right) => TargetBodyPart.RightArm, + (BodyPartType.Hand, BodyPartSymmetry.Left) => TargetBodyPart.LeftHand, + (BodyPartType.Hand, BodyPartSymmetry.Right) => TargetBodyPart.RightHand, + (BodyPartType.Leg, BodyPartSymmetry.Left) => TargetBodyPart.LeftLeg, + (BodyPartType.Leg, BodyPartSymmetry.Right) => TargetBodyPart.RightLeg, + (BodyPartType.Foot, BodyPartSymmetry.Left) => TargetBodyPart.LeftFoot, + (BodyPartType.Foot, BodyPartSymmetry.Right) => TargetBodyPart.RightFoot, + _ => null + }; + } + + /// + /// Converts Enums from Targeting system to their BodyPartType equivalent. + /// + public (BodyPartType Type, BodyPartSymmetry Symmetry) ConvertTargetBodyPart(TargetBodyPart targetPart) + { + return targetPart switch + { + TargetBodyPart.Head => (BodyPartType.Head, BodyPartSymmetry.None), + TargetBodyPart.Torso => (BodyPartType.Torso, BodyPartSymmetry.None), + TargetBodyPart.Groin => (BodyPartType.Torso, BodyPartSymmetry.None), // TODO: Groin is not a part type yet + TargetBodyPart.LeftArm => (BodyPartType.Arm, BodyPartSymmetry.Left), + TargetBodyPart.LeftHand => (BodyPartType.Hand, BodyPartSymmetry.Left), + TargetBodyPart.RightArm => (BodyPartType.Arm, BodyPartSymmetry.Right), + TargetBodyPart.RightHand => (BodyPartType.Hand, BodyPartSymmetry.Right), + TargetBodyPart.LeftLeg => (BodyPartType.Leg, BodyPartSymmetry.Left), + TargetBodyPart.LeftFoot => (BodyPartType.Foot, BodyPartSymmetry.Left), + TargetBodyPart.RightLeg => (BodyPartType.Leg, BodyPartSymmetry.Right), + TargetBodyPart.RightFoot => (BodyPartType.Foot, BodyPartSymmetry.Right), + _ => (BodyPartType.Torso, BodyPartSymmetry.None) + }; + + } + + public DamageSpecifier GetHealingSpecifier(BodyPartComponent part) + { + var damage = new DamageSpecifier() + { + DamageDict = new Dictionary() + { + { "Blunt", -part.SelfHealingAmount }, + { "Slash", -part.SelfHealingAmount }, + { "Piercing", -part.SelfHealingAmount }, + { "Heat", -part.SelfHealingAmount }, + { "Cold", -part.SelfHealingAmount }, + { "Shock", -part.SelfHealingAmount }, + { "Caustic", -part.SelfHealingAmount * 0.1}, // not much caustic healing + } + }; + + return damage; + } + + /// + /// Fetches the damage multiplier for part integrity based on part types. + /// + /// TODO: Serialize this per body part. + public static float GetPartDamageModifier(BodyPartType partType) + { + return partType switch + { + BodyPartType.Head => 0.5f, // 50% damage, necks are hard to cut + BodyPartType.Torso => 1.0f, // 100% damage + BodyPartType.Arm => 0.7f, // 70% damage + BodyPartType.Hand => 0.7f, // 70% damage + BodyPartType.Leg => 0.7f, // 70% damage + BodyPartType.Foot => 0.7f, // 70% damage + _ => 0.5f + }; + } + + /// + /// Fetches the TargetIntegrity equivalent of the current integrity value for the body part. + /// + public static TargetIntegrity GetIntegrityThreshold(BodyPartComponent component, float integrity, bool severed) + { + if (severed) + return TargetIntegrity.Severed; + else if (!component.Enabled) + return TargetIntegrity.Disabled; + + var targetIntegrity = TargetIntegrity.Healthy; + foreach (var threshold in component.IntegrityThresholds) + { + if (integrity <= threshold.Value) + targetIntegrity = threshold.Key; + } + + return targetIntegrity; + } + + /// + /// Fetches the chance to evade integrity damage for a body part. + /// Used when the entity is not dead, laying down, or incapacitated. + /// + public static float GetEvadeChance(BodyPartType partType) + { + return partType switch + { + BodyPartType.Head => 0.70f, // 70% chance to evade + BodyPartType.Arm => 0.20f, // 20% chance to evade + BodyPartType.Hand => 0.20f, // 20% chance to evade + BodyPartType.Leg => 0.20f, // 20% chance to evade + BodyPartType.Foot => 0.20f, // 20% chance to evade + BodyPartType.Torso => 0f, // 0% chance to evade + _ => 0f + }; + } + + public bool CanEvadeDamage(EntityUid uid) + { + if (!TryComp(uid, out var mobState) + || !TryComp(uid, out var standingState) + || _mobState.IsCritical(uid, mobState) + || _mobState.IsDead(uid, mobState) + || standingState.CurrentState == StandingState.Lying) + return false; + + return true; + } + + public bool TryEvadeDamage(EntityUid uid, float evadeChance) + { + if (!CanEvadeDamage(uid)) + return false; + + return _random.NextFloat() < evadeChance; + } + +} diff --git a/Content.Shared/_Shitmed/Humanoid/Events/ProfileLoadFinishedEvent.cs b/Content.Shared/_Shitmed/Humanoid/Events/ProfileLoadFinishedEvent.cs new file mode 100644 index 00000000000..6d571651046 --- /dev/null +++ b/Content.Shared/_Shitmed/Humanoid/Events/ProfileLoadFinishedEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared._Shitmed.Humanoid.Events; + +/// +/// Raised on an entity when their profile has finished being loaded +/// +public sealed class ProfileLoadFinishedEvent : EntityEventArgs { } + diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs new file mode 100644 index 00000000000..6ee258aa47e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryCloseIncisionConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryLarvaConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryLarvaConditionComponent.cs new file mode 100644 index 00000000000..593022c144a --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryLarvaConditionComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryLarvaConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryMarkingConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryMarkingConditionComponent.cs new file mode 100644 index 00000000000..bb81f8c2deb --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryMarkingConditionComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryMarkingConditionComponent : Component +{ + + [DataField] + public bool Inverse; + + /// + /// The marking category to check for. + /// + [DataField] + public HumanoidVisualLayers MarkingCategory = default!; + + /// + /// Can be either a segment of a marking ID, or an entire ID that will be checked + /// against the entity to validate that the marking is not already present. + /// + [DataField] + public String MatchString = ""; +} diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs new file mode 100644 index 00000000000..677ae689c2e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryOperatingTableConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganConditionComponent.cs new file mode 100644 index 00000000000..53db0430e53 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganConditionComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Body.Organ; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryOrganConditionComponent : Component +{ + [DataField] + public ComponentRegistry? Organ; + + [DataField] + public bool Inverse; + + [DataField] + public bool Reattaching; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartConditionComponent.cs new file mode 100644 index 00000000000..46815b71c58 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartConditionComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartConditionComponent : Component +{ + [DataField] + public BodyPartType Part; + + [DataField] + public BodyPartSymmetry? Symmetry; + + [DataField] + public bool Inverse; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartPresentCondition.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartPresentCondition.cs new file mode 100644 index 00000000000..a458dec5868 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartPresentCondition.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartPresentConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs new file mode 100644 index 00000000000..f0dfc554e0e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartRemovedConditionComponent : Component +{ + [DataField] + public BodyPartType Part; + + [DataField] + public BodyPartSymmetry? Symmetry; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryValidEvent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryValidEvent.cs new file mode 100644 index 00000000000..a6890f8128c --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryValidEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Body.Part; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +/// +/// Raised on the entity that is receiving surgery. +/// +[ByRefEvent] +public record struct SurgeryValidEvent(EntityUid Body, EntityUid Part, bool Cancelled = false, BodyPartType PartType = default, BodyPartSymmetry? Symmetry = default); \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryWoundedConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryWoundedConditionComponent.cs new file mode 100644 index 00000000000..d48f7313d44 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryWoundedConditionComponent.cs @@ -0,0 +1,7 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryWoundedConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryCompletedEvent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryCompletedEvent.cs new file mode 100644 index 00000000000..b492f8dd0b9 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryCompletedEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Complete; + +/// +/// Raised on the entity that received the surgery. +/// +[ByRefEvent] +public record struct SurgeryCompletedEvent; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs new file mode 100644 index 00000000000..0cdebe30fab --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Complete; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemoveLarvaComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs new file mode 100644 index 00000000000..f4d95604e66 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryDamageChangeEffectComponent : Component +{ + [DataField] + public DamageSpecifier Damage = default!; + + [DataField] + public float SleepModifier = 0.5f; + + [DataField] + public bool IsConsumable; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs new file mode 100644 index 00000000000..a7b436984c1 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgerySpecialDamageChangeEffectComponent : Component +{ + [DataField] + public string DamageType = ""; + + [DataField] + public bool IsConsumable; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs new file mode 100644 index 00000000000..04dc376fd62 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryStepCavityEffectComponent : Component +{ + [DataField] + public string Action = "Insert"; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs new file mode 100644 index 00000000000..09e4f049d3c --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs @@ -0,0 +1,12 @@ +using Content.Shared.Chat.Prototypes; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryStepEmoteEffectComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId Emote = "Scream"; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs new file mode 100644 index 00000000000..f7df5e8bada --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs @@ -0,0 +1,13 @@ +using Content.Shared.Chat.Prototypes; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using System.ComponentModel.DataAnnotations; + +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryStepSpawnEffectComponent : Component +{ + [DataField(required: true), AutoNetworkedField] + public EntProtoId Entity; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs new file mode 100644 index 00000000000..2306c891025 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared._Shitmed.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryTendWoundsEffectComponent : Component +{ + [DataField, AutoNetworkedField] + public string MainGroup = "Brute"; + + [DataField, AutoNetworkedField] + public bool IsAutoRepeatable = true; + + [DataField, AutoNetworkedField] + public DamageSpecifier Damage = default!; + + [DataField, AutoNetworkedField] + public float HealMultiplier = 0.07f; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/OperatingTableComponent.cs b/Content.Shared/_Shitmed/Surgery/OperatingTableComponent.cs new file mode 100644 index 00000000000..6ad09760502 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/OperatingTableComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[RegisterComponent, NetworkedComponent] +public sealed partial class OperatingTableComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs new file mode 100644 index 00000000000..b96b4f76a62 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -0,0 +1,758 @@ +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Bed.Sleep; +using Content.Shared.Body.Part; +using Content.Shared.Body.Organ; +using Content.Shared.Body.Events; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared.Buckle.Components; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.DoAfter; +using Content.Shared._Shitmed.Medical.Surgery.Conditions; +using Content.Shared._Shitmed.Medical.Surgery.Effects.Step; +using Content.Shared._Shitmed.Medical.Surgery.Steps; +using Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; +using Content.Shared._Shitmed.Medical.Surgery.Tools; +//using Content.Shared.Mood; +using Content.Shared.Inventory; +using Content.Shared.Item; +using Content.Shared._Shitmed.Body.Organ; +using Content.Shared._Shitmed.Body.Part; +using Content.Shared.Popups; +using Robust.Shared.Prototypes; +using Robust.Shared.Toolshed.TypeParsers; +using System.Linq; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +public abstract partial class SharedSurgerySystem +{ + private static readonly string[] BruteDamageTypes = { "Slash", "Blunt", "Piercing" }; + private static readonly string[] BurnDamageTypes = { "Heat", "Shock", "Cold", "Caustic" }; + private void InitializeSteps() + { + SubscribeLocalEvent(OnToolStep); + SubscribeLocalEvent(OnToolCheck); + SubscribeLocalEvent(OnToolCanPerform); + + //SubSurgery(OnCutLarvaRootsStep, OnCutLarvaRootsCheck); + + /* Abandon all hope ye who enter here. Now I am become shitcoder, the bloater of files. + On a serious note, I really hate how much bloat this pattern of subscribing to a StepEvent and a CheckEvent + creates in terms of readability. And while Check DOES only run on the server side, it's still annoying to parse through.*/ + + SubSurgery(OnTendWoundsStep, OnTendWoundsCheck); + SubSurgery(OnCavityStep, OnCavityCheck); + SubSurgery(OnAddPartStep, OnAddPartCheck); + SubSurgery(OnAffixPartStep, OnAffixPartCheck); + SubSurgery(OnRemovePartStep, OnRemovePartCheck); + SubSurgery(OnAddOrganStep, OnAddOrganCheck); + SubSurgery(OnRemoveOrganStep, OnRemoveOrganCheck); + SubSurgery(OnAffixOrganStep, OnAffixOrganCheck); + SubSurgery(OnAddMarkingStep, OnAddMarkingCheck); + SubSurgery(OnRemoveMarkingStep, OnRemoveMarkingCheck); + Subs.BuiEvents(SurgeryUIKey.Key, subs => + { + subs.Event(OnSurgeryTargetStepChosen); + }); + } + + private void SubSurgery(EntityEventRefHandler onStep, + EntityEventRefHandler onComplete) where TComp : IComponent + { + SubscribeLocalEvent(onStep); + SubscribeLocalEvent(onComplete); + } + + private void OnToolStep(Entity ent, ref SurgeryStepEvent args) + { + if (ent.Comp.Tool != null) + { + foreach (var reg in ent.Comp.Tool.Values) + { + if (!AnyHaveComp(args.Tools, reg.Component, out var tool)) + return; + + if (_net.IsServer && + TryComp(tool, out SurgeryToolComponent? toolComp) && + toolComp.EndSound != null) + { + _audio.PlayEntity(toolComp.EndSound, args.User, tool); + } + } + } + + if (ent.Comp.Add != null) + { + foreach (var reg in ent.Comp.Add.Values) + { + var compType = reg.Component.GetType(); + if (HasComp(args.Part, compType)) + continue; + AddComp(args.Part, _compFactory.GetComponent(compType)); + } + } + + if (ent.Comp.Remove != null) + { + foreach (var reg in ent.Comp.Remove.Values) + { + RemComp(args.Part, reg.Component.GetType()); + } + } + + if (ent.Comp.BodyRemove != null) + { + foreach (var reg in ent.Comp.BodyRemove.Values) + { + RemComp(args.Body, reg.Component.GetType()); + } + } + + //if (!HasComp(args.Body)) + // //RaiseLocalEvent(args.Body, new MoodEffectEvent("SurgeryPain")); + // No mood on Goob :( + if (!_inventory.TryGetSlotEntity(args.User, "gloves", out var _) + || !_inventory.TryGetSlotEntity(args.User, "mask", out var _)) + { + var sepsis = new DamageSpecifier(_prototypes.Index("Poison"), 5); + var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 0.5f); + RaiseLocalEvent(args.Body, ref ev); + } + } + + private void OnToolCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + // Lord this function is fucking bloated now. Need to clean it up so its less spammy. + if (ent.Comp.Add != null) + { + foreach (var reg in ent.Comp.Add.Values) + { + if (!HasComp(args.Part, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + + if (ent.Comp.Remove != null) + { + foreach (var reg in ent.Comp.Remove.Values) + { + if (HasComp(args.Part, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + + if (ent.Comp.BodyRemove != null) + { + foreach (var reg in ent.Comp.BodyRemove.Values) + { + if (HasComp(args.Body, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + } + + private void OnToolCanPerform(Entity ent, ref SurgeryCanPerformStepEvent args) + { + if (HasComp(ent)) + { + if (!TryComp(args.Body, out BuckleComponent? buckle) || + !HasComp(buckle.BuckledTo)) + { + args.Invalid = StepInvalidReason.NeedsOperatingTable; + return; + } + } + + if (_inventory.TryGetContainerSlotEnumerator(args.Body, out var containerSlotEnumerator, args.TargetSlots)) + { + while (containerSlotEnumerator.MoveNext(out var containerSlot)) + { + if (!containerSlot.ContainedEntity.HasValue) + continue; + + args.Invalid = StepInvalidReason.Armor; + args.Popup = Loc.GetString("surgery-ui-window-steps-error-armor"); + return; + } + } + + RaiseLocalEvent(args.Body, ref args); + + if (args.Invalid != StepInvalidReason.None) + return; + + if (ent.Comp.Tool != null) + { + args.ValidTools ??= new HashSet(); + + foreach (var reg in ent.Comp.Tool.Values) + { + if (!AnyHaveComp(args.Tools, reg.Component, out var withComp)) + { + args.Invalid = StepInvalidReason.MissingTool; + + if (reg.Component is ISurgeryToolComponent tool) + args.Popup = $"You need {tool.ToolName} to perform this step!"; + + return; + } + + args.ValidTools.Add(withComp); + } + } + } + + private EntProtoId? GetProtoId(EntityUid entityUid) + { + if (!TryComp(entityUid, out var metaData)) + return null; + + return metaData.EntityPrototype?.ID; + } + + // I wonder if theres not a function that can do this already. + private bool HasDamageGroup(EntityUid entity, string[] group, out DamageableComponent? damageable) + { + if (!TryComp(entity, out var damageableComp)) + { + damageable = null; + return false; + } + + damageable = damageableComp; + return group.Any(damageType => damageableComp.Damage.DamageDict.TryGetValue(damageType, out var value) && value > 0); + + } + + private void OnTendWoundsStep(Entity ent, ref SurgeryStepEvent args) + { + var group = ent.Comp.MainGroup == "Brute" ? BruteDamageTypes : BurnDamageTypes; + + if (!HasDamageGroup(args.Body, group, out var damageable) + && !HasDamageGroup(args.Part, group, out var _) + || damageable == null) // This shouldnt be possible but the compiler doesn't shut up. + return; + + + // Right now the bonus is based off the body's total damage, maybe we could make it based off each part in the future. + var bonus = ent.Comp.HealMultiplier * damageable.DamagePerGroup[ent.Comp.MainGroup]; + if (_mobState.IsDead(args.Body)) + bonus *= 0.2; + + var adjustedDamage = new DamageSpecifier(ent.Comp.Damage); + var bonusPerType = bonus / group.Length; + + foreach (var type in group) + { + adjustedDamage.DamageDict[type] -= bonusPerType; + } + + var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 0.5f); + RaiseLocalEvent(args.Body, ref ev); + } + + private void OnTendWoundsCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + var group = ent.Comp.MainGroup == "Brute" ? BruteDamageTypes : BurnDamageTypes; + + if (HasDamageGroup(args.Body, group, out var _) + || HasDamageGroup(args.Part, group, out var _)) + args.Cancelled = true; + } + + /*private void OnCutLarvaRootsStep(Entity ent, ref SurgeryStepEvent args) + { + if (TryComp(args.Body, out VictimInfectedComponent? infected) && + infected.BurstAt > _timing.CurTime && + infected.SpawnedLarva == null) + { + infected.RootsCut = true; + } + } + + private void OnCutLarvaRootsCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Body, out VictimInfectedComponent? infected) || !infected.RootsCut) + args.Cancelled = true; + + // The larva has fully developed and surgery is now impossible + // TODO: Surgery should still be possible, but the fully developed larva should escape while also saving the hosts life + if (infected != null && infected.SpawnedLarva != null) + args.Cancelled = true; + }*/ + + private void OnCavityStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) || partComp.PartType != BodyPartType.Torso) + return; + + var activeHandEntity = _hands.EnumerateHeld(args.User).FirstOrDefault(); + if (activeHandEntity != default + && ent.Comp.Action == "Insert" + && TryComp(activeHandEntity, out ItemComponent? itemComp) + && (itemComp.Size.Id == "Tiny" + || itemComp.Size.Id == "Small")) + _itemSlotsSystem.TryInsert(ent, partComp.ItemInsertionSlot, activeHandEntity, args.User); + else if (ent.Comp.Action == "Remove") + _itemSlotsSystem.TryEjectToHands(ent, partComp.ItemInsertionSlot, args.User); + } + + private void OnCavityCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + // Normally this check would simply be partComp.ItemInsertionSlot.HasItem, but as mentioned before, + // For whatever reason it's not instantiating the field on the clientside after the wizmerge. + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || !TryComp(args.Part, out ItemSlotsComponent? itemComp) + || ent.Comp.Action == "Insert" + && !itemComp.Slots[partComp.ContainerName].HasItem + || ent.Comp.Action == "Remove" + && itemComp.Slots[partComp.ContainerName].HasItem) + args.Cancelled = true; + } + + private void OnAddPartStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp)) + return; + + foreach (var tool in args.Tools) + { + if (TryComp(tool, out BodyPartComponent? partComp) + && partComp.PartType == removedComp.Part + && (removedComp.Symmetry == null || partComp.Symmetry == removedComp.Symmetry)) + { + var slotName = removedComp.Symmetry != null + ? $"{removedComp.Symmetry?.ToString().ToLower()} {removedComp.Part.ToString().ToLower()}" + : removedComp.Part.ToString().ToLower(); + _body.TryCreatePartSlot(args.Part, slotName, partComp.PartType, out var _); + _body.AttachPart(args.Part, slotName, tool); + _body.ChangeSlotState((tool, partComp), false); + EnsureComp(tool); + var ev = new BodyPartAttachedEvent((tool, partComp)); + RaiseLocalEvent(args.Body, ref ev); + } + } + } + + private void OnAffixPartStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp)) + return; + + var targetPart = _body.GetBodyChildrenOfType(args.Body, removedComp.Part, symmetry: removedComp.Symmetry).FirstOrDefault(); + + if (targetPart != default) + { + // We reward players for properly affixing the parts by healing a little bit of damage, and enabling the part temporarily. + var ev = new BodyPartEnableChangedEvent(true); + RaiseLocalEvent(targetPart.Id, ref ev); + _damageable.TryChangeDamage(args.Body, + _body.GetHealingSpecifier(targetPart.Component) * 2, + canSever: false, // Just in case we heal a brute damage specifier and the logic gets fucky lol + targetPart: _body.GetTargetBodyPart(targetPart.Component.PartType, targetPart.Component.Symmetry)); + RemComp(targetPart.Id); + } + } + + private void OnAffixPartCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp)) + return; + + var targetPart = _body.GetBodyChildrenOfType(args.Body, removedComp.Part, symmetry: removedComp.Symmetry).FirstOrDefault(); + + if (targetPart != default + && HasComp(targetPart.Id)) + args.Cancelled = true; + } + + private void OnAddPartCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp) + || !_body.GetBodyChildrenOfType(args.Body, removedComp.Part, symmetry: removedComp.Symmetry).Any()) + args.Cancelled = true; + } + + private void OnRemovePartStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body) + return; + + var ev = new AmputateAttemptEvent(args.Part); + RaiseLocalEvent(args.Part, ref ev); + _hands.TryPickupAnyHand(args.User, args.Part); + } + + private void OnRemovePartCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body == args.Body) + args.Cancelled = true; + } + + private void OnAddOrganStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body + || !TryComp(args.Surgery, out SurgeryOrganConditionComponent? organComp) + || organComp.Organ == null) + return; + + // Adding organs is generally done for a single one at a time, so we only need to check for the first. + var firstOrgan = organComp.Organ.Values.FirstOrDefault(); + if (firstOrgan == default) + return; + + foreach (var tool in args.Tools) + { + if (HasComp(tool, firstOrgan.Component.GetType()) + && TryComp(tool, out var insertedOrgan) + && _body.InsertOrgan(args.Part, tool, insertedOrgan.SlotId, partComp, insertedOrgan)) + { + EnsureComp(tool); + break; + } + } + } + + private void OnAddOrganCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out var organComp) + || organComp.Organ is null + || !TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body) + return; + + // For now we naively assume that every entity will only have one of each organ type. + // that we do surgery on, but in the future we'll need to reference their prototype somehow + // to know if they need 2 hearts, 2 lungs, etc. + foreach (var reg in organComp.Organ.Values) + { + if (!_body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var _)) + { + args.Cancelled = true; + } + } + } + + private void OnAffixOrganStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out SurgeryOrganConditionComponent? removedOrganComp) + || removedOrganComp.Organ == null + || !removedOrganComp.Reattaching) + return; + + foreach (var reg in removedOrganComp.Organ.Values) + { + _body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs); + if (organs != null && organs.Count > 0) + RemComp(organs[0].Id); + } + + } + + private void OnAffixOrganCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out SurgeryOrganConditionComponent? removedOrganComp) + || removedOrganComp.Organ == null + || !removedOrganComp.Reattaching) + return; + + foreach (var reg in removedOrganComp.Organ.Values) + { + _body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs); + if (organs != null + && organs.Count > 0 + && organs.Any(organ => HasComp(organ.Id))) + args.Cancelled = true; + } + } + + private void OnRemoveOrganStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out var organComp) + || organComp.Organ == null) + return; + + foreach (var reg in organComp.Organ.Values) + { + _body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs); + if (organs != null && organs.Count > 0) + { + _body.RemoveOrgan(organs[0].Id, organs[0].Organ); + _hands.TryPickupAnyHand(args.User, organs[0].Id); + } + } + } + + private void OnRemoveOrganCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out var organComp) + || organComp.Organ == null + || !TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body) + return; + + foreach (var reg in organComp.Organ.Values) + { + if (_body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs) + && organs != null + && organs.Count > 0) + { + args.Cancelled = true; + return; + } + } + } + + // TODO: Refactor bodies to include ears as a prototype instead of doing whatever the hell this is. + private void OnAddMarkingStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Body, out HumanoidAppearanceComponent? bodyAppearance) + || ent.Comp.Organ == null) + return; + + var organType = ent.Comp.Organ.Values.FirstOrDefault(); + if (organType == default) + return; + + var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(ent.Comp.MarkingCategory); + foreach (var tool in args.Tools) + { + if (TryComp(tool, out MarkingContainerComponent? markingComp) + && HasComp(tool, organType.Component.GetType())) + { + if (!bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList) + || !markingList.Any(marking => marking.MarkingId.Contains(ent.Comp.MatchString))) + { + EnsureComp(args.Part); + _body.ModifyMarkings(args.Body, args.Part, bodyAppearance, ent.Comp.MarkingCategory, markingComp.Marking); + + if (ent.Comp.Accent != null + && ent.Comp.Accent.Values.FirstOrDefault() is { } accent) + { + var compType = accent.Component.GetType(); + if (!HasComp(args.Body, compType)) + AddComp(args.Body, _compFactory.GetComponent(compType)); + } + + QueueDel(tool); // Again since this isnt actually being inserted we just delete it lol. + } + } + } + + } + + private void OnAddMarkingCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(ent.Comp.MarkingCategory); + + if (!TryComp(args.Body, out HumanoidAppearanceComponent? bodyAppearance) + || !bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList) + || !markingList.Any(marking => marking.MarkingId.Contains(ent.Comp.MatchString))) + args.Cancelled = true; + } + + private void OnRemoveMarkingStep(Entity ent, ref SurgeryStepEvent args) + { + + } + + private void OnRemoveMarkingCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + + } + + private void OnSurgeryTargetStepChosen(Entity ent, ref SurgeryStepChosenBuiMsg args) + { + var user = args.Actor; + if (GetEntity(args.Entity) is not { Valid: true } body || + GetEntity(args.Part) is not { Valid: true } targetPart || + !IsSurgeryValid(body, targetPart, args.Surgery, args.Step, user, out var surgery, out var part, out var step)) + { + return; + } + + if (!PreviousStepsComplete(body, part, surgery, args.Step) || + IsStepComplete(body, part, args.Step, surgery)) + return; + + if (!CanPerformStep(user, body, part, step, true, out _, out _, out var validTools)) + return; + + if (_net.IsServer && validTools?.Count > 0) + { + foreach (var tool in validTools) + { + if (TryComp(tool, out SurgeryToolComponent? toolComp) && + toolComp.EndSound != null) + { + _audio.PlayEntity(toolComp.StartSound, user, tool); + } + } + } + + if (TryComp(body, out TransformComponent? xform)) + _rotateToFace.TryFaceCoordinates(user, _transform.GetMapCoordinates(body, xform).Position); + + var ev = new SurgeryDoAfterEvent(args.Surgery, args.Step); + // TODO: Make this serialized on a per surgery step basis, and also add penalties based on ghetto tools. + var duration = 2f; + if (TryComp(user, out SurgerySpeedModifierComponent? surgerySpeedMod) + && surgerySpeedMod is not null) + duration = duration / surgerySpeedMod.SpeedModifier; + + var doAfter = new DoAfterArgs(EntityManager, user, TimeSpan.FromSeconds(duration), ev, body, part) + { + BreakOnMove = true, + //BreakOnTargetMove = true, I fucking hate wizden dude. + CancelDuplicate = true, + DuplicateCondition = DuplicateConditions.SameEvent, + NeedHand = true, + BreakOnHandChange = true, + }; + + _doAfter.TryStartDoAfter(doAfter); + } + + private (Entity Surgery, int Step)? GetNextStep(EntityUid body, EntityUid part, Entity surgery, List requirements) + { + if (!Resolve(surgery, ref surgery.Comp)) + return null; + + if (requirements.Contains(surgery)) + throw new ArgumentException($"Surgery {surgery} has a requirement loop: {string.Join(", ", requirements)}"); + + requirements.Add(surgery); + + if (surgery.Comp.Requirement is { } requirementId && + GetSingleton(requirementId) is { } requirement && + GetNextStep(body, part, requirement, requirements) is { } requiredNext) + { + return requiredNext; + } + + for (var i = 0; i < surgery.Comp.Steps.Count; i++) + { + var surgeryStep = surgery.Comp.Steps[i]; + if (!IsStepComplete(body, part, surgeryStep, surgery)) + return ((surgery, surgery.Comp), i); + } + + return null; + } + + public (Entity Surgery, int Step)? GetNextStep(EntityUid body, EntityUid part, EntityUid surgery) + { + return GetNextStep(body, part, surgery, new List()); + } + + public bool PreviousStepsComplete(EntityUid body, EntityUid part, Entity surgery, EntProtoId step) + { + // TODO RMC14 use index instead of the prototype id + if (surgery.Comp.Requirement is { } requirement) + { + if (GetSingleton(requirement) is not { } requiredEnt || + !TryComp(requiredEnt, out SurgeryComponent? requiredComp) || + !PreviousStepsComplete(body, part, (requiredEnt, requiredComp), step)) + { + return false; + } + } + + foreach (var surgeryStep in surgery.Comp.Steps) + { + if (surgeryStep == step) + break; + + if (!IsStepComplete(body, part, surgeryStep, surgery)) + return false; + } + + return true; + } + + public bool CanPerformStep(EntityUid user, EntityUid body, EntityUid part, + EntityUid step, bool doPopup, out string? popup, out StepInvalidReason reason, + out HashSet? validTools) + { + var type = BodyPartType.Other; + if (TryComp(part, out BodyPartComponent? partComp)) + { + type = partComp.PartType; + } + + var slot = type switch + { + BodyPartType.Head => SlotFlags.HEAD, + BodyPartType.Torso => SlotFlags.OUTERCLOTHING | SlotFlags.INNERCLOTHING, + BodyPartType.Arm => SlotFlags.OUTERCLOTHING | SlotFlags.INNERCLOTHING, + BodyPartType.Hand => SlotFlags.GLOVES, + BodyPartType.Leg => SlotFlags.OUTERCLOTHING | SlotFlags.LEGS, + BodyPartType.Foot => SlotFlags.FEET, + BodyPartType.Tail => SlotFlags.NONE, + BodyPartType.Other => SlotFlags.NONE, + _ => SlotFlags.NONE + }; + + var check = new SurgeryCanPerformStepEvent(user, body, GetTools(user), slot); + RaiseLocalEvent(step, ref check); + popup = check.Popup; + validTools = check.ValidTools; + + if (check.Invalid != StepInvalidReason.None) + { + if (doPopup && check.Popup != null) + _popup.PopupEntity(check.Popup, user, user, PopupType.SmallCaution); + + reason = check.Invalid; + return false; + } + + reason = default; + return true; + } + + public bool CanPerformStep(EntityUid user, EntityUid body, EntityUid part, EntityUid step, bool doPopup) + { + return CanPerformStep(user, body, part, step, doPopup, out _, out _, out _); + } + + public bool IsStepComplete(EntityUid body, EntityUid part, EntProtoId step, EntityUid surgery) + { + if (GetSingleton(step) is not { } stepEnt) + return false; + + var ev = new SurgeryStepCompleteCheckEvent(body, part, surgery); + RaiseLocalEvent(stepEnt, ref ev); + return !ev.Cancelled; + } + + private bool AnyHaveComp(List tools, IComponent component, out EntityUid withComp) + { + foreach (var tool in tools) + { + if (HasComp(tool, component.GetType())) + { + withComp = tool; + return true; + } + } + + withComp = default; + return false; + } +} diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs new file mode 100644 index 00000000000..c4c13fbc1cb --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs @@ -0,0 +1,283 @@ +using System.Linq; +using Content.Shared._Shitmed.Medical.Surgery.Conditions; +using Content.Shared._Shitmed.Medical.Surgery.Effects.Complete; +using Content.Shared.Body.Systems; +using Content.Shared._Shitmed.Medical.Surgery.Steps; +using Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; +//using Content.Shared._RMC14.Xenonids.Parasite; +using Content.Shared.Body.Part; +using Content.Shared.Damage; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Body.Components; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Mobs.Systems; +using Content.Shared.GameTicking; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Popups; +using Content.Shared.Standing; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +public abstract partial class SharedSurgerySystem : EntitySystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IComponentFactory _compFactory = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedBodySystem _body = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly RotateToFaceSystem _rotateToFace = default!; + [Dependency] private readonly StandingStateSystem _standing = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + private readonly Dictionary _surgeries = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRoundRestartCleanup); + + SubscribeLocalEvent(OnTargetDoAfter); + SubscribeLocalEvent(OnCloseIncisionValid); + //SubscribeLocalEvent(OnLarvaValid); + SubscribeLocalEvent(OnPartConditionValid); + SubscribeLocalEvent(OnOrganConditionValid); + SubscribeLocalEvent(OnWoundedValid); + SubscribeLocalEvent(OnPartRemovedConditionValid); + SubscribeLocalEvent(OnPartPresentConditionValid); + SubscribeLocalEvent(OnMarkingPresentValid); + //SubscribeLocalEvent(OnRemoveLarva); + + InitializeSteps(); + } + + private void OnRoundRestartCleanup(RoundRestartCleanupEvent ev) + { + _surgeries.Clear(); + } + + private void OnTargetDoAfter(Entity ent, ref SurgeryDoAfterEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + if (args.Cancelled + || args.Handled + || args.Target is not { } target + || !IsSurgeryValid(ent, target, args.Surgery, args.Step, args.User, out var surgery, out var part, out var step) + || !PreviousStepsComplete(ent, part, surgery, args.Step) + || !CanPerformStep(args.User, ent, part, step, false)) + { + Log.Warning($"{ToPrettyString(args.User)} tried to start invalid surgery."); + return; + } + + args.Repeat = (HasComp(step) && !IsStepComplete(ent, part, args.Step, surgery)); + var ev = new SurgeryStepEvent(args.User, ent, part, GetTools(args.User), surgery); + RaiseLocalEvent(step, ref ev); + RefreshUI(ent); + } + + private void OnCloseIncisionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!HasComp(args.Part) || + !HasComp(args.Part) || + !HasComp(args.Part) || + !HasComp(args.Part) || + !HasComp(args.Part)) + { + args.Cancelled = true; + } + } + + private void OnWoundedValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Body, out DamageableComponent? damageable) + || !TryComp(args.Part, out DamageableComponent? partDamageable) + || damageable.TotalDamage <= 0 + && partDamageable.TotalDamage <= 0 + && !HasComp(args.Part)) + args.Cancelled = true; + } + + /*private void OnLarvaValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Body, out VictimInfectedComponent? infected)) + args.Cancelled = true; + + // The larva has fully developed and surgery is now impossible + if (infected != null && infected.SpawnedLarva != null) + args.Cancelled = true; + }*/ + private void OnPartConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Part, out var part)) + { + args.Cancelled = true; + return; + } + + var typeMatch = part.PartType == ent.Comp.Part; + var symmetryMatch = ent.Comp.Symmetry == null || part.Symmetry == ent.Comp.Symmetry; + var valid = typeMatch && symmetryMatch; + + if (ent.Comp.Inverse ? valid : !valid) + args.Cancelled = true; + } + + private void OnOrganConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Part, out var partComp) + || partComp.Body != args.Body + || ent.Comp.Organ == null) + { + args.Cancelled = true; + return; + } + + foreach (var reg in ent.Comp.Organ.Values) + { + if (_body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs) + && organs.Count > 0) + { + if (ent.Comp.Inverse + && (!ent.Comp.Reattaching + || ent.Comp.Reattaching + && !organs.Any(organ => HasComp(organ.Id)))) + args.Cancelled = true; + } + else if (!ent.Comp.Inverse) + args.Cancelled = true; + } + } + + private void OnPartRemovedConditionValid(Entity ent, ref SurgeryValidEvent args) + { + var results = _body.GetBodyChildrenOfType(args.Body, ent.Comp.Part, symmetry: ent.Comp.Symmetry); + if (results is not { } || !results.Any()) + return; + + if (!results.Any(part => HasComp(part.Id))) + args.Cancelled = true; + } + + private void OnPartPresentConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (args.Part == EntityUid.Invalid + || !HasComp(args.Part)) + args.Cancelled = true; + } + + private void OnMarkingPresentValid(Entity ent, ref SurgeryValidEvent args) + { + var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(ent.Comp.MarkingCategory); + + var hasMarking = TryComp(args.Body, out HumanoidAppearanceComponent? bodyAppearance) + && bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList) + && markingList.Any(marking => marking.MarkingId.Contains(ent.Comp.MatchString)); + + if ((!ent.Comp.Inverse && hasMarking) || (ent.Comp.Inverse && !hasMarking)) + args.Cancelled = true; + } + + /*private void OnRemoveLarva(Entity ent, ref SurgeryCompletedEvent args) + { + RemCompDeferred(ent); + }*/ + + protected bool IsSurgeryValid(EntityUid body, EntityUid targetPart, EntProtoId surgery, EntProtoId stepId, + EntityUid user, out Entity surgeryEnt, out EntityUid part, out EntityUid step) + { + surgeryEnt = default; + part = default; + step = default; + + if (!HasComp(body) || + !IsLyingDown(body, user) || + GetSingleton(surgery) is not { } surgeryEntId || + !TryComp(surgeryEntId, out SurgeryComponent? surgeryComp) || + !surgeryComp.Steps.Contains(stepId) || + GetSingleton(stepId) is not { } stepEnt + || !HasComp(targetPart) + && !HasComp(targetPart)) + return false; + + + var ev = new SurgeryValidEvent(body, targetPart); + if (_timing.IsFirstTimePredicted) + { + RaiseLocalEvent(stepEnt, ref ev); + RaiseLocalEvent(surgeryEntId, ref ev); + } + + if (ev.Cancelled) + return false; + + surgeryEnt = (surgeryEntId, surgeryComp); + part = targetPart; + step = stepEnt; + return true; + } + + public EntityUid? GetSingleton(EntProtoId surgeryOrStep) + { + if (!_prototypes.HasIndex(surgeryOrStep)) + return null; + + // This (for now) assumes that surgery entity data remains unchanged between client + // and server + // if it does not you get the bullet + if (!_surgeries.TryGetValue(surgeryOrStep, out var ent) || TerminatingOrDeleted(ent)) + { + ent = Spawn(surgeryOrStep, MapCoordinates.Nullspace); + _surgeries[surgeryOrStep] = ent; + } + + return ent; + } + + private List GetTools(EntityUid surgeon) + { + return _hands.EnumerateHeld(surgeon).ToList(); + } + + public bool IsLyingDown(EntityUid entity, EntityUid user) + { + if (_standing.IsDown(entity)) + return true; + + if (TryComp(entity, out BuckleComponent? buckle) && + TryComp(buckle.BuckledTo, out StrapComponent? strap)) + { + var rotation = strap.Rotation; + if (rotation.GetCardinalDir() is Direction.West or Direction.East) + return true; + } + + _popup.PopupEntity(Loc.GetString("surgery-error-laying"), user, user); + + return false; + } + + protected virtual void RefreshUI(EntityUid body) + { + } +} diff --git a/Content.Shared/_Shitmed/Surgery/StepInvalidReason.cs b/Content.Shared/_Shitmed/Surgery/StepInvalidReason.cs new file mode 100644 index 00000000000..7d1f6779ddf --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/StepInvalidReason.cs @@ -0,0 +1,10 @@ +namespace Content.Shared._Shitmed.Medical.Surgery; + +public enum StepInvalidReason +{ + None, + MissingSkills, + NeedsOperatingTable, + Armor, + MissingTool, +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/BleedersClampedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/BleedersClampedComponent.cs new file mode 100644 index 00000000000..9684cd83742 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/BleedersClampedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BleedersClampedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartReattachedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartReattachedComponent.cs new file mode 100644 index 00000000000..db08d326fa8 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartReattachedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BodyPartReattachedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartSawedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartSawedComponent.cs new file mode 100644 index 00000000000..6b52489a3d6 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/BodyPartSawedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BodyPartSawedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/IncisionOpenComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/IncisionOpenComponent.cs new file mode 100644 index 00000000000..b2c8dea84cc --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/IncisionOpenComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class IncisionOpenComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs new file mode 100644 index 00000000000..9f7763229a5 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class InternalBleedersClampedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/OrganReattachedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/OrganReattachedComponent.cs new file mode 100644 index 00000000000..7f612d061dc --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/OrganReattachedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class OrganReattachedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/PartRemovedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/PartRemovedComponent.cs new file mode 100644 index 00000000000..0a2f73d5604 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/PartRemovedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class PartsRemovedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageOpenComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageOpenComponent.cs new file mode 100644 index 00000000000..65f2e285ff8 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageOpenComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RibcageOpenComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageSawedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageSawedComponent.cs new file mode 100644 index 00000000000..a386a9293ce --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/RibcageSawedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RibcageSawedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/Parts/SkinRetractedComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/Parts/SkinRetractedComponent.cs new file mode 100644 index 00000000000..90f7d9297ec --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/Parts/SkinRetractedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SkinRetractedComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddMarkingStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddMarkingStepComponent.cs new file mode 100644 index 00000000000..5e9f6c946a7 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddMarkingStepComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAddMarkingStepComponent : Component +{ + /// + /// The marking category to add the marking to. + /// + [DataField] + public HumanoidVisualLayers MarkingCategory = default!; + + /// + /// Can be either a segment of a marking ID, or an entire ID that will be checked + /// against the entity to validate that the marking is not already present. + /// + [DataField] + public String MatchString = ""; + + /// + /// What type of organ is required for this surgery? + /// + [DataField] + public ComponentRegistry? Organ; + + /// + /// Component name for accent that will be applied. + /// + [DataField] + public ComponentRegistry? Accent; +} diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddOrganStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddOrganStepComponent.cs new file mode 100644 index 00000000000..db592d1cd6d --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddOrganStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAddOrganStepComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddPartStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddPartStepComponent.cs new file mode 100644 index 00000000000..c569341f997 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAddPartStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAddPartStepComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixOrganStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixOrganStepComponent.cs new file mode 100644 index 00000000000..13ce206f2db --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixOrganStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAffixOrganStepComponent : Component; diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixPartStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixPartStepComponent.cs new file mode 100644 index 00000000000..62baf329d2d --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryAffixPartStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAffixPartStepComponent : Component; diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs new file mode 100644 index 00000000000..14217c5aa5b --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Inventory; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[ByRefEvent] +public record struct SurgeryCanPerformStepEvent( + EntityUid User, + EntityUid Body, + List Tools, + SlotFlags TargetSlots, + string? Popup = null, + StepInvalidReason Invalid = StepInvalidReason.None, + HashSet? ValidTools = null +) : IInventoryRelayEvent; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs new file mode 100644 index 00000000000..438c974687b --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryCutLarvaRootsStepComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs new file mode 100644 index 00000000000..d0e4c260e98 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Prototypes; +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemoveMarkingStepComponent : Component +{ + /// + /// The category the marking belongs to. + /// + [DataField] + public HumanoidVisualLayers MarkingCategory = default!; + + /// + /// Can be either a segment of a marking ID, or an entire ID that will be checked + /// against the entity to validate that the marking is present. + /// + [DataField] + public String MatchString = ""; + + /// + /// Will this step spawn an item as a result of removing the markings? If so, which? + /// + [DataField] + public EntProtoId? ItemSpawn = default!; + +} diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs new file mode 100644 index 00000000000..13216db9a2e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemoveOrganStepComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemovePartStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemovePartStepComponent.cs new file mode 100644 index 00000000000..6eb3fcf8a58 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRemovePartStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemovePartStepComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRepeatableStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRepeatableStepComponent.cs new file mode 100644 index 00000000000..d28dc4ba08e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryRepeatableStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRepeatableStepComponent : Component; diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs new file mode 100644 index 00000000000..e70de606be2 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs @@ -0,0 +1,4 @@ +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[ByRefEvent] +public record struct SurgeryStepCompleteCheckEvent(EntityUid Body, EntityUid Part, EntityUid Surgery, bool Cancelled = false); \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs new file mode 100644 index 00000000000..b9f092cc208 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +[Prototype("SurgerySteps")] +public sealed partial class SurgeryStepComponent : Component +{ + + [DataField] + public ComponentRegistry? Tool; + + [DataField] + public ComponentRegistry? Add; + + [DataField] + public ComponentRegistry? Remove; + + [DataField] + public ComponentRegistry? BodyRemove; +} diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryComponent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryComponent.cs new file mode 100644 index 00000000000..4fc0c67c4d7 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryComponent.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Prototype("Surgeries")] +public sealed partial class SurgeryComponent : Component +{ + [DataField, AutoNetworkedField] + public int Priority; + + [DataField, AutoNetworkedField] + public EntProtoId? Requirement; + + [DataField(required: true), AutoNetworkedField] + public List Steps = new(); +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryDoAfterEvent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryDoAfterEvent.cs new file mode 100644 index 00000000000..8aad79c2c0e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryDoAfterEvent.cs @@ -0,0 +1,18 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[Serializable, NetSerializable] +public sealed partial class SurgeryDoAfterEvent : SimpleDoAfterEvent +{ + public readonly EntProtoId Surgery; + public readonly EntProtoId Step; + + public SurgeryDoAfterEvent(EntProtoId surgery, EntProtoId step) + { + Surgery = surgery; + Step = step; + } +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SurgerySpeedModifierComponent.cs b/Content.Shared/_Shitmed/Surgery/SurgerySpeedModifierComponent.cs new file mode 100644 index 00000000000..72b3a6dbf43 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgerySpeedModifierComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgerySpeedModifierComponent : Component +{ + [DataField] + public float SpeedModifier = 1.5f; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryStepDamageEvent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryStepDamageEvent.cs new file mode 100644 index 00000000000..128251aa3bd --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryStepDamageEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Damage; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +/// +/// Raised on the target entity. +/// +[ByRefEvent] +public record struct SurgeryStepDamageEvent(EntityUid User, EntityUid Body, EntityUid Part, EntityUid Surgery, DamageSpecifier Damage, float PartMultiplier); \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs new file mode 100644 index 00000000000..37301ac81bc --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared._Shitmed.Medical.Surgery; + +/// +/// Raised on the step entity. +/// +[ByRefEvent] +public record struct SurgeryStepEvent(EntityUid User, EntityUid Body, EntityUid Part, List Tools, EntityUid Surgery); \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryTargetComponent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryTargetComponent.cs new file mode 100644 index 00000000000..38505e28a9b --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryTargetComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryTargetComponent : Component +{ + [DataField] + public bool CanOperate = true; +} diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryUI.cs b/Content.Shared/_Shitmed/Surgery/SurgeryUI.cs new file mode 100644 index 00000000000..64a269ab02d --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryUI.cs @@ -0,0 +1,32 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[Serializable, NetSerializable] +public enum SurgeryUIKey +{ + Key +} + +[Serializable, NetSerializable] +public sealed class SurgeryBuiState(Dictionary> choices) : BoundUserInterfaceState +{ + public readonly Dictionary> Choices = choices; +} + +[Serializable, NetSerializable] +public sealed class SurgeryBuiRefreshMessage : BoundUserInterfaceMessage +{ +} + +[Serializable, NetSerializable] +public sealed class SurgeryStepChosenBuiMsg(NetEntity part, EntProtoId surgery, EntProtoId step, bool isBody) : BoundUserInterfaceMessage +{ + public readonly NetEntity Part = part; + public readonly EntProtoId Surgery = surgery; + public readonly EntProtoId Step = step; + + // Used as a marker for whether or not we're hijacking surgery by applying it on the body itself. + public readonly bool IsBody = isBody; +} diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryUiRefreshEvent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryUiRefreshEvent.cs new file mode 100644 index 00000000000..4504f327689 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryUiRefreshEvent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +[Serializable, NetSerializable] +public sealed class SurgeryUiRefreshEvent : EntityEventArgs +{ + public NetEntity Uid { get; } + + public SurgeryUiRefreshEvent(NetEntity uid) + { + Uid = uid; + } +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs new file mode 100644 index 00000000000..e4a63f4c6e0 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BoneGelComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "bone gel"; + + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs new file mode 100644 index 00000000000..a89b5356680 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BoneSawComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a bone saw"; + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/BoneSetterComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneSetterComponent.cs new file mode 100644 index 00000000000..0fde03958aa --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneSetterComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BoneSetterComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs new file mode 100644 index 00000000000..92bffe6f95e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class CauteryComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a cautery"; + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs new file mode 100644 index 00000000000..56ef9e097a7 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class HemostatComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a hemostat"; + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs new file mode 100644 index 00000000000..5338f3e1d66 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +public interface ISurgeryToolComponent +{ + [DataField] + public string ToolName { get; } + + // Mostly intended for discardable or non-reusable tools. + [DataField] + public bool? Used { get; set; } +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs new file mode 100644 index 00000000000..828de906f57 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RetractorComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a retractor"; + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs new file mode 100644 index 00000000000..cef2cc15fd0 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ScalpelComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a scalpel"; + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs new file mode 100644 index 00000000000..afa28af133e --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryToolComponent : Component +{ + + [DataField, AutoNetworkedField] + public SoundSpecifier? StartSound; + + [DataField, AutoNetworkedField] + public SoundSpecifier? EndSound; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs new file mode 100644 index 00000000000..6fe0070dced --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgicalDrillComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a surgical drill"; + public bool? Used { get; set; } = null; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Targeting/Events.cs b/Content.Shared/_Shitmed/Targeting/Events.cs new file mode 100644 index 00000000000..1b0d9564980 --- /dev/null +++ b/Content.Shared/_Shitmed/Targeting/Events.cs @@ -0,0 +1,38 @@ +using Content.Shared._Shitmed.Targeting; +using Robust.Shared.Serialization; + +namespace Content.Shared._Shitmed.Targeting.Events; + +[Serializable, NetSerializable] +public sealed class TargetChangeEvent : EntityEventArgs +{ + public NetEntity Uid { get; } + public TargetBodyPart BodyPart { get; } + public TargetChangeEvent(NetEntity uid, TargetBodyPart bodyPart) + { + Uid = uid; + BodyPart = bodyPart; + } +} + +[Serializable, NetSerializable] +public sealed class TargetIntegrityChangeEvent : EntityEventArgs +{ + public NetEntity Uid { get; } + public bool RefreshUi { get; } + public TargetIntegrityChangeEvent(NetEntity uid, bool refreshUi = true) + { + Uid = uid; + RefreshUi = refreshUi; + } +} + +public sealed class RefreshInventorySlotsEvent : EntityEventArgs +{ + public string SlotName { get; } + + public RefreshInventorySlotsEvent(string slotName) + { + SlotName = slotName; + } +} diff --git a/Content.Shared/_Shitmed/Targeting/SharedTargetingSystem.cs b/Content.Shared/_Shitmed/Targeting/SharedTargetingSystem.cs new file mode 100644 index 00000000000..2dccd238d84 --- /dev/null +++ b/Content.Shared/_Shitmed/Targeting/SharedTargetingSystem.cs @@ -0,0 +1,26 @@ +namespace Content.Shared._Shitmed.Targeting; +public abstract class SharedTargetingSystem : EntitySystem +{ + /// + /// Returns all Valid target body parts as an array. + /// + public static TargetBodyPart[] GetValidParts() + { + var parts = new[] + { + TargetBodyPart.Head, + TargetBodyPart.Torso, + //TargetBodyPart.Groin, + TargetBodyPart.LeftArm, + TargetBodyPart.LeftHand, + TargetBodyPart.LeftLeg, + TargetBodyPart.LeftFoot, + TargetBodyPart.RightArm, + TargetBodyPart.RightHand, + TargetBodyPart.RightLeg, + TargetBodyPart.RightFoot, + }; + + return parts; + } +} diff --git a/Content.Shared/_Shitmed/Targeting/TargetBodyPart.cs b/Content.Shared/_Shitmed/Targeting/TargetBodyPart.cs new file mode 100644 index 00000000000..37bcf175d2e --- /dev/null +++ b/Content.Shared/_Shitmed/Targeting/TargetBodyPart.cs @@ -0,0 +1,31 @@ +namespace Content.Shared._Shitmed.Targeting; + + +/// +/// Represents and enum of possible target parts. +/// +/// +/// To get all body parts as an Array, use static +/// method in SharedTargetingSystem GetValidParts. +/// +[Flags] +public enum TargetBodyPart : ushort +{ + Head = 1, + Torso = 1 << 1, + Groin = 1 << 2, + LeftArm = 1 << 3, + LeftHand = 1 << 4, + RightArm = 1 << 5, + RightHand = 1 << 6, + LeftLeg = 1 << 7, + LeftFoot = 1 << 8, + RightLeg = 1 << 9, + RightFoot = 1 << 10, + + Hands = LeftHand | RightHand, + Arms = LeftArm | RightArm, + Legs = LeftLeg | RightLeg, + Feet = LeftFoot | RightFoot, + All = Head | Torso | Groin | LeftArm | LeftHand | RightArm | RightHand | LeftLeg | LeftFoot | RightLeg | RightFoot, +} diff --git a/Content.Shared/_Shitmed/Targeting/TargetIntegrity.cs b/Content.Shared/_Shitmed/Targeting/TargetIntegrity.cs new file mode 100644 index 00000000000..e6b6a34905a --- /dev/null +++ b/Content.Shared/_Shitmed/Targeting/TargetIntegrity.cs @@ -0,0 +1,13 @@ +namespace Content.Shared._Shitmed.Targeting; +public enum TargetIntegrity +{ + Healthy = 0, + LightlyWounded = 1, + SomewhatWounded = 2, + ModeratelyWounded = 3, + HeavilyWounded = 4, + CriticallyWounded = 5, + Severed = 6, + Dead = 7, + Disabled = 8, +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Targeting/TargetingComponent.cs b/Content.Shared/_Shitmed/Targeting/TargetingComponent.cs new file mode 100644 index 00000000000..096e7026a51 --- /dev/null +++ b/Content.Shared/_Shitmed/Targeting/TargetingComponent.cs @@ -0,0 +1,59 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Targeting; + +/// +/// Controls entity limb targeting for actions. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TargetingComponent : Component +{ + [ViewVariables, AutoNetworkedField] + public TargetBodyPart Target = TargetBodyPart.Torso; + + /// + /// What odds does the entity have of targeting each body part? + /// + [DataField] + public Dictionary TargetOdds = new() + { + { TargetBodyPart.Head, 0.1f }, + { TargetBodyPart.Torso, 0.3f }, + { TargetBodyPart.Groin, 0.1f }, + { TargetBodyPart.LeftArm, 0.1f }, + { TargetBodyPart.LeftHand, 0.05f }, + { TargetBodyPart.RightArm, 0.1f }, + { TargetBodyPart.RightHand, 0.05f }, + { TargetBodyPart.LeftLeg, 0.1f }, + { TargetBodyPart.LeftFoot, 0.05f }, + { TargetBodyPart.RightLeg, 0.1f }, + { TargetBodyPart.RightFoot, 0.05f } + }; + + /// + /// What is the current integrity of each body part? + /// + [ViewVariables, AutoNetworkedField] + public Dictionary BodyStatus = new() + { + { TargetBodyPart.Head, TargetIntegrity.Healthy }, + { TargetBodyPart.Torso, TargetIntegrity.Healthy }, + { TargetBodyPart.Groin, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftArm, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftHand, TargetIntegrity.Healthy }, + { TargetBodyPart.RightArm, TargetIntegrity.Healthy }, + { TargetBodyPart.RightHand, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftLeg, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftFoot, TargetIntegrity.Healthy }, + { TargetBodyPart.RightLeg, TargetIntegrity.Healthy }, + { TargetBodyPart.RightFoot, TargetIntegrity.Healthy } + }; + + /// + /// What noise does the entity play when swapping targets? + /// + [DataField] + public string SwapSound = "/Audio/Effects/toggleoncombat.ogg"; +} diff --git a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs index 2406d19a37c..94d10322766 100644 --- a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs +++ b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Body.Components; // Shitmed Change using Content.Shared.DoAfter; using Content.Shared.Gravity; using Content.Shared.Input; @@ -116,10 +117,11 @@ public bool TryStandUp(EntityUid uid, LayingDownComponent? layingDown = null, St !Resolve(uid, ref layingDown, false) || standingState.CurrentState is not StandingState.Lying || !_mobState.IsAlive(uid) || - TerminatingOrDeleted(uid)) - { + TerminatingOrDeleted(uid) || + // Shitmed Change + !TryComp(uid, out var body) || + body.LegEntities.Count == 0) return false; - } var args = new DoAfterArgs(EntityManager, uid, layingDown.StandingUpTime, new StandingUpDoAfterEvent(), uid) { diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/attributions.yml b/Resources/Audio/_Shitmed/Medical/Surgery/attributions.yml new file mode 100644 index 00000000000..c88a3e0b70f --- /dev/null +++ b/Resources/Audio/_Shitmed/Medical/Surgery/attributions.yml @@ -0,0 +1,49 @@ +- files: ["cautery1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/cautery1.ogg" + +- files: ["cautery2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/cautery2.ogg" + +- files: ["hemostat.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/hemostat.ogg" + +- files: ["organ1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/organ1.ogg" + +- files: ["organ2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/organ2.ogg" + +- files: ["retractor1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/retractor1.ogg" + +- files: ["retractor2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/retractor2.ogg" + +- files: ["saw.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/saw.ogg" + +- files: ["scalpel1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/scalpel1.ogg" + +- files: ["scalpel2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/scalpel2.ogg" \ No newline at end of file diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/cautery1.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/cautery1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fbd9f2b4d86257e87ec704b2138249f9c60efe65 GIT binary patch literal 34770 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/cautery2.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/cautery2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc91e9f3ce679bfaf1aae3ea05bd2e10be827a49 GIT binary patch literal 16854 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�L!ICar2S(AT0m!2gadm}(y$<_sa2T&)z z8=l_y{P4aAd2$8qoMi?^q}6%%_C_3zTya&@x%oO54$1>&dzz5a7aO=Q-f&^hqz@47 zx)w0eM#tGM8cC24Pr5pL||ibPeBiio2)|C|ITk1j|%_Kv#{ zAKew~h78*cPcRD?AG79|yijtSXE|MD9-nBvai*u6IF&>JTCMU{eml60*9enPy_Mf* zB7sg97@Kpz^9X>>_NUj|8D{7El36zqqp82VPP*m{xYoTo#0n_mbgInxMU<*_2pDMue_Uc|Ox_j}QE+wp(!UEK_~#tEK^ari1>#&awq zm&29+o$y1mVt&W3pVzIBM!Wm$W>b-!j!i)O@;3_{e}>v@_}8-VQfxly1;T5q#H$aF ztLW;d8N;^W>a!BuwgX7LwJJAQfNS&39J-|)SGuAi?TCRMS2>r6?TW@de%Jg^U8(N8 zhy1TA?^zV9KZ|el$KjBrfos@QdeVh0ye1cXUEv{h=3OR|6okU8>tB~A5BIZyO^**& z`Q(T6r$q0_F_?}>HhNwJA77o&PkYZcz$&t_SXQG#AB$wJA%N_#gY^U~dWup4lNqN9 z2s=PyJ+=4T@reW;-kXOxsDV{VO2u`uNDSbxup+Cqh0LF`r{m+(wQJMsA^zcK-A~?j zSx=OyC>MIjVVmN=+kG%A-K+KF67dsj5xe2OJ}UoxW1M)Z#A2(fyQ=%&0H{#f2&8qhsB3VEOoB zVNrlErjW1~GHmEA*3~fPIp))_2pA zChReztaJuOWJl{@Ii%oxK1uvckg#ZhS!R*_>rvEfg+Q7_yV*oC+0&Uj*g#$cRzs+L@0*T(XOWT{nz_3f@h(-L`zoe8iIVmp7Sqym zaxUCe2$8@8Nm@AzK&kv5~d_F#>r=A0sz0TtAd%DCP_tyt0C?${?cF(->NhAwE#xTf|U`0ab zftr|Bcj9Z#1yWI{`hwETF> z#PL_~vvB56Gh{p_mpTlJ15((s&Pvm~StiiP^51+fFuYHUCRgZnICkVRYoWphBo-g; zU6Pz-7e!4@>KSWBDU9Jf&5IEkrP+GiAE0fhoS!*O8ng ze)iSMVeq73Ym2VIGC3+_CFJ!N6u?3&<$aix90t%O;CpjZ(RzN9lSg}blT^_vW|w8u zd^~EOO7k;_&-bHo#o!NG&NqYkEyA37$}DWdIagnnOuTsfPp}hH+Mx#yqsA}ix5-{^ z<@?s#aJ|w`l(Hd`2>E7mbN!sUm)rBJ_{@%bhuDa*YSzzPX7D3zHv$bm_A)A#=z6SD zJe7k2bF@R^ZOQhd?izFeXV!!);NmyMr+4yZte}rwioZF=fH(vMz;DkM0eh&8H1EGs im7s%^w+g>CQ2zPU`nKnPtADk++-EmIg8xSL=lMVXV@?kM literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/organ1.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/organ1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..37eaffc1a34ceb6bd5978d4fdadf3cf006889a82 GIT binary patch literal 18912 zcmbTe1ymhDvoJUpcXuuXhl{(r1c%`6?!ie276|SZEJ(1R7uNtG1PK}-I0Oj6f(H)} zc1XVWzqkMH`S+ZiGq>sK>aOnUs_L$)=|R)MK?gtp{&U^<{>v17{22kEhWL4SSvz?@ z6hY*x|5L>u@;B24(R^t6zpjUt4-jLnW?sDJ`~TbZ8Sx(?eh_Zx^wg14)60Rz)yZ1_ zFM1kf8eVQ*Zf+rNei{~SJ6m5HCwB)L1$RFuFAsM&J9i%#D%cJi{OM}T$f;`Rsmm&8 zOYq@?1qvE+n)2YoV>KEbA75K14~mCc%DQR_65bxZ?zR@*zFrP?Ue7E%yd13DdC)+p zoTi4ZjGV3n3Yb?^(9l+p_*bf~uAreS@z9fuwyv^{t^@@6-=JZ#a{3V9p%RZ8O@HW@ zWIX`D0{}|~7*3kKGORSch~-&Uy3#|gpF1WiJ*J<`CZ1>DzY-dLTVen}0zz5P6N|T$ zoySES$e0to3PqeWgv)7AW3|>q&_A9t*|?WAmASZ&!x+)9jgSG5BhpH=uZXlC66qf_e?nmgjk4u)ZsNiNQNW6RyU)TauKE(-&Dxj;1LUHJ%xLo7yfE zvlrguBHMZYNznh&K?9CO7KPjvPZsR~eKf2r%L_#Hk1QG>6eJT+Od(RPCmN}Tj!iOX z{$kf66qw{w(9u=b1211Q13$YtKi@gOAfv2TCT&4RZLdt`UzuILvLcK8&wUlNdiikw zC7lKW6w-@iZouBsQM~;w@)j{7vKj%feV7s&^i(=nYO!*ey>qQoZi{18i`z&8`$z-U z-zuOqAw7%+D0Ipx`+wZ_Mwxd1-?y~m5Gx=J&gGydbkLJQL7QRFiyigv3=aVyPo=fl z`@Q%Tz4-^d#lc(ANB(oV+Sr*I?td}if$abw%>(WCgnkBRLz`pTOTfTeV$NHA4xEaI z8Tmh7VSnWXB!u>jeWr6L8eg*2-)RX2(UKLR$zlEL39JxZ^n)hnOU~(-2u{vsVFgj{ zbZ?AqE^~WDR_9Z|C6*kXwQE zoThS6D;5mFwnkraw%)Z9fw`FUT;}F>-GBK0BNi3rdE>nz>tKtR#ax$mbTcq_ZJT#E zhW=3Yzl)DF$TzEbvVk`*X@U|_tchsLXw#^Dl5o-rd4^ym)Cq}?RVu=tXp=LS`n>#0 zISl|r;Qf{2|4ROf@;@mqNsVP4W@#Md9btb+s{6)8_v-ra6qz;0U4 zZpP1Up~cRmHOQ#tKMM0tZC2-e|A*#0s0f`%;)YTx(tm4CAxq+S;Y51nR0g9|re~QB zF*z04`MVWwG5$Braf~g`iYpEP!*YW>(|1Zr^^kM*SP;(T# z82*RmeBgn~f!fr-u73KDMu|yqLVXlS|0e?g;6pN&>fd!lOPgaxTVO_;Lr+)Y|Ew_} zbcSDjnjf6l3;-Yp0D6$g5qPm)$+GSehG;xn49G;dro8sLnWS5E?NmvzZtEMTP|cXg)x|pDYW% ztpb3@46Hq6m`LMSC1O-1RG1*LnR3}tdKhxDC zRL~>Vo6c0%Yj&I9w_DKFTOrY#X|Y=(2{y>|UFB0Z0v~5VsP9~6kj1QS&XD}P23PN?%7l`%rTJ#pq-Sjep)_wHM4D1#z^^8b@ zP3B&$Uj(g_Jz$=j@dcq)vvyXkzN;)wIZn=R-&N+YR9040wzyT+)|kBAseD^G+~81I zTRq$Wuc~$31EIC=DjV14h3-d6tXU>)fOJK|X$@PKx5L(P^1LBN}a8q6S@ zp-c1$m!$#E8_|sm-(olx`d|_$8;}RtARLx1qGdw}6@~yPwA(~Fc&z<2K6u(cX-af? zP-wk1RQjRmPgI;~)4#F~(C8*A59Os1s5rvXr?gRvN}s5>6s6B$^DD41k?8mXfKe)Hjp3xbtjLs5sR;bY9Ux@K|$kN%5tYiEvuS?ijI&ROd-Qo+u*7LDUY(xab+hwuTc?JblFi6 z<_a%0Sr|-jR0fT)d0Yer>z@@tV=N_6W##DCcY(n`DmXy9u36TvRT`3vJmr^1daBj)Gab#J^ZN_C-U=dGLSYfa5RFoM@LDL!o z3fgn7U(yYs;DG+EBbHd!SUiz5KDxZD_z`L<%oSnajMn&qqEOmDYV2IoG%t--^JfQ=B%=b-WW`{=A`W=gqar&{esE=kM&PgxB=rRh@-0Bx0B8n6sj>hl0d*Tw(<)~BFFRHtR@{W7HxTr&}X zXAf(piU?{^`eWDtO?s*}*d0hxg%=h$cm4VgfOO-18c;M`1^np1Ubg88+ zowcqOm;;5lc`L_71q8T^wFAI1GAdAqNU0#mOoqsP#SO=<9Q;9tYdk$^W@NA z{aK)mQ%3e+dVrhkgZ&W?0>H-s5FoM*eMs`W6aU*V`R^S1{|gZnpq+)U5AN0jWRz(C ztn$YMe;;jJ|6`fqPU+eMMmy1t$9gjd(bq zq1TrMju?e1A`-S!5&^QONKQqBg%Okz7z`92P@~h0RkFRcwOJWUGar_Yuf{4IAZ}E~ z(phb1uoqFZ(x$HuUCqlV!AfV1<2XQ-Qvn~X;{_tM!7Bap*3~>EQ`(?@lG#*)3S{g8 z4&8+V);wz+-we(_xI)ZY#|g|DV*+dLPk~USI?u?AlE#mdYkzr73mV(9e`ou_G0+Bi zQTQM&wDKyTR6WQDZ3M`Me`OKL|Emm7bo-xZfdaMtuU`5S*}tNNRs@#8s6ZiO`I}<| zbLjsJxWB>}K>(U^=^*BRW$6T9AAilebnOR;1gGW!@K;p-=Fn*$rt5EI+J9{yY(Y>& z5g%4z`W=SiVLDg-^^b^89EVhZP%HrOoOj-X%?{D@=S5_yMkIUTS##oR$BHP{+bNOv zlg*^_loIJ^yX@py$7^Z6u~Fgat4`NfVM%#8GnpzH_hGHcoG{s@= z@P0rxTlS@iph2RI?uQU1hlUfn2YkoYZ0kiARVc;z=Xyf`Y5+*ZrlF(D5lO^J!cE3Y z!A~VfBTNUy7Xa2Ep}0UO19Eh9w0&Z6-v%Osylq6uryod+f58t48rnZs1?g}8pKBh< z`49Zynm=@Nb^WaI2_q9DBNG#sAP;zP^Yd}TU>rO={Cxa;JiPq;{K9;!>})Ioyn?)J zf_%I}yn<}3to(euJOVtQSz&A}y!^a;Fcwxp-eEp|K|x+#HV&>cU<8>!8pmqE)sYVQ zN08@Olu@JpB31L@4T*vlb;dg!jB0G4Mgyfi5(Kf8x;INqvgA-ORowHo@YQ zInyF;B7lpR5x|1L+(M{>@Z+$;&9GSz3!$lRoL{UZ-l^&1TV}*EYR8ShI8DW z;MC<)epvfZ3qAF9>YHP*TXeabfnFaad+cKI`Q+oM-3_x!D}Hd=W`w*!ET0W9!{3X) zYvua&;;Gnlmdvkpk`ku;=KvP6KT=20^QfFRF$mnk?_%uys;hg1vR8~_jP<@!h~iFB zH_J6+Vcq$0Z-hRUfF2$pEPu?|bu|}bFHVBJOM8C-FF57UJ9#AZdMIF3ic^d5TR94V zbXU8*7&)nzu9~!hgU7*w=u_F@SD-gT&{rJDekdX3)3WKcM2a6tyQnj|oG5#A_4_&r z3EW#S-!JNaVIzVLj{w6TkNT$bcNh<<-UYoIeMB`Q8O3F6?-N0w$A`L!+n-g1%Lu4J z;)?4dwph`hf4?JoLc;k|WYU=~aP~rc>x(SG&x3T8hP2`AS4%;-E(J)0&>%{P>75GA z5<#_l(9vB1^BVGfZF_;0z>9kAG*hlBQH#Odd}Z>^+XNDo^`Yx$5+a+tn7WXztY_k{ zT?S`mPg_GV!awGZ*iDviaE~)9qV_a>_*whjIn?^Se=Wv&<3RI07YZPbJ>tFZ=hY+9 zb@2#ST0zDjmV|;n@4*-{&?^QpC?T zE)kY?Qy+N=440|-pOv=ykaPU>w)8jFdn=>RJG#Feo9S=D@B%?s{oaNs+^u*ODeDbp z$4`1&Qye8ia|TV??1A;wZS)=F4ujSeoz|=1nq2S1khI$tJOGO-gdfo@DT?s(SiS|s z_TzPvGEezWtVNB$7h1-s`J_RoNzKqVA&>qnzhim!MJkmDJ;a`7bM;ZI#Ht0smkmqr zoqSc<@3DBV1L8keR);7fN?e(iYY*@N43Lnk2+wbPhr25M+O~ufc&-jLTEDCG4-D+lqbD?@e%~l#g*=ChEsmue#_`o9pq!Fcd0JfySuDn>RL2-%VP9LJSJEjrUDk&3)-D(;j`rwJl6nTllV2wZg-)$RgZ1){YWF>lmn+A_JHocN8>R%n=(s$Cd_4<61M`NJ6 zN3vheTL1K9-*HYi4I@gvDZ7|-AkJY##O5hc`$dPin?DvwitV=a`hRZ9@7w6P;uf48@ROaI9J%pR=B06%wsLDy|BaAovUXUgiZ4sIL*z>j`^yl7KY zk)VC%_Xz(9i6m!y6q`QZ*x;8rMcpMy%@qj7?;{fXw~m)Rf!F=k_!4fEh~oGbGtc&O zrqoU2J|5giVMC0b3c%|t>9ks$9giA)GoBVW^x#vknAD702IpqH`&}0}1F$3CuSbs6 zDSS8Ueg~mkVm{{W$^U$2%RABY{D2jc{j1M!@sqQX?4eKj<{Frx4FWp~QV>_#5G=4SP0tzypcP<6x6`u--t^GmBi&dF)1@?1-L2a60Mk{JWk9Uz`O zByZ{H6@g9sdK=@LvW4~OFD&+JbIkpM$L$y_I0ycrWDH-OkM{y+26=Dcqg&s!)5q)4%we4x-IzQp zL!r-{T1T9KE(#z567tSkcfc*8_>LK1rDpnp<@k2+#C;Zdd~Of**W6q4=iPPY-+0+B zo4>!n+uFzh*E{l%Ce|AnibqW^nX?ultel~&p)>CstbSi6>qqfsR9BWAkodoL`!?wP z?d}qJvtC7dtVbG?=+2y3VrgB3q@Ka6;gA->3MB~&i5H$~&zb!Ainr{UyJEgBe$a@j zvtttkG?&TySKBt>E&Jo z2=YAla>x6y{p_c=@UMmJFC2pD^gPJte<_b}-J#9-?3(8swC^y!nu!rzlZ%|#fwQNW zo&<+JZyA#|_Z+GZI>)4*#vrq}T{bMpEZ0f0V7{+^_vOi6m!DNJ>gvUkyWyRM3ths~ z@|O_PlUk1LllSCr0$3g~&o_KwZ&fc(P;EYJLF6xQPpRviFO~0Uj_{EYc(bkOHCll@0!PD zj1e0N|C|vA6e;Ld^f^?i93Qu<>9=t@LDPp`)j5mQ!&$R#gBm=mJwhIvo#aoWJ+mS?!?*|lJMsNNOV@hki7eOrT|CMRq#^Gl9b-Q4 zCzjd$Y~XFa(AihFWEbL-bc=m!6Ta4~Ml?YD+}<^6ib8bJL*6e?a}x5Dbx8?4sYmo7y?h=C^Qw7fn~QER zx$r5Ln?2v4Lq6*}Ik)xHysBv?f#7o6v-cJbFXuDsOuT+D`{!qdQxT-2E>bLE7-_y@ z0h;3@Z2C0+oUd2poAhXC!@?+E_&Y{4#AW^A7ICZi?I@8~_wSP`Ey(hG^L-m%uZHb9YP6Wz%J)5WZD+}` z{G+ic!EQ#4Gjv%HK7(WmQO#HhezJp(H<#N5XVvQF>Kml3C-ElZMZ~u{Z8QKiKDt`K;jN~ zlD4X^AuDm$8~3w~rs@0(M^x1XL4W2PE4MfVu0@UbwLHB&VYO-ju#@@X=EmO8KX4_F zArhxC(K6#5r+y3zn-j6|?C(uE=w$`?vF~|1x7$_jd&e0r<+>>#te@QK7uMRE`H8K> z=gytFxor1VUvlD9C2S|O;T8UH@IZyIU)Pq3OR$eKI(59)L`i?OTw6yI7a5*YhCjrO zFt_x_I9FjFrN2k=3~;7!BWd-uKp{egzs^q>JoWJ6&o+bOV>4rD76eh?1SMA+8{Btt zD?G~ZrZn54pEx)_OSGZ4%_Ip#Wq`m(2DU$*(yxvGA#^~br!Bh>F?$Z{P!%a0wXVxw z(5kOa*kJV+0HD|ARamSGoNJascBoGwks~i4&kcVPc;B9$$E6jC;FmSq&h+u&hUUZQbm*!p@N$vU4m;H{3SC>^Ox_4@eoT`Od&rERK0K$FFR3C-+m61jel%=6+1jONEoROF;3#HqBp-d%U10)*h|Gb}T4fuayOx$P!Z8rtx5 z{-ce7n?Os31B;1t%FUSsg=c|*L>~^HS(l6uvx1!%51_Vd-aJshv_O>bie|PQC7BA_ z_EG}xrcybZFwc36%?P!sJv1!>P$Vd3Zi>HtmB7U#V>z*s3$6e zY>E(P!IRDteO|nTi%EeJ(rG0rgy{fp2-vvAGbV69J$3r z>vC;ud~LftTja4mE5+goj3#LGmio%HUmvD<7`I>Jp@WVsT<9WqT}wtj8e@7t@!EBJZsEZC82OFE95H}l)m6sn3L<}-A^YZe*c=@<^ z1bF#)Sh#rj*|@nmdB7Yu_?ML#27~ePa<;JXa`SL=!FaeiIeEC4SXtP>7zQ5)7aKbZ z53l^SpK;(m9Zgsw#ggfQG@BusYW*RUD6zwLmAiMntXe7533_ldF#(1;ZO{GWozi3z z*D2bz{**xo5m_wyRZG)vvw9#OPB8cRJb#J}ug#cl0`skd2>jQz`k8f&70@z0^G6-{ zFOVcTaUYivHrXxZ&Xh~jpZT1-H-u%scDCUJ%`Z6XT2^n&583T%WN|3(n~8S;jxie> zHF~8D5#K)rFUH|ZGy4we*}QwOxeQYe>aH_U87~hWoG=Wa>4p?{`7_{Y8RdEB6``Vc ze=y`1Y<^(+Yw{d3m--|+R1MJyZcg75H^Zh`e=cVi28 zQ-$zX@V6t#^@hQi`-+Y$)l>F0G(Zj6Uv|TOOYKF&YH%Jx17wJw`D0-&3$mHH%f$EQ zwdPnB*)%2tGfz_6lpn0!xWFx%R58BYF9p``xz7A(Ngw-mQthD`iB+GiJ~Hyf^l;<$ z;G>4#Ui$Ddfh3QpB05%iFYd`jkf0L&>3qI+|EaP=XH$Z2#9C?SHhENmzsL4U8DPJw zMV}gf3H9=M4$qf<0uAklSg}`F(qo*Ql~3jfucGx_(hKwGjVl-kp1PFtJ+)+i?JPJH!lC}hH8V7`es#lNn!AOF?2(oyZNUUP&obDdh z+9a*))Y$;VMD+eb7>NP8POH4W!y`R{Rl#QOYg4=Jhy{g8fC1UxK#XD%s`A|A5d|^o zTHRRH^?;N23YO2W&&N@O)T#Xqq_pjK8%%`dhNUtY_n;Ra`~_JyMZ}BKrd!j!@cWlA z%Os{0ixJU;;_Jq4ifs2s~KKXJHDm>*zgJVaIe?}yo+>b&thOP>WKltgkl|6Ca3oMyF$S@pbrW z8S}Uu!4w^HG5kY>|AOb`HYdQfzH)V%YD@u_Y}+Q!k6!f$CTAbJB^N=?u;3OM>)GtQ z+b?5+vN2gphN!^au+B! z@iO^0ssP!!=1tA&w&kqAoCMC`;*RjxzE&`xX>mX>%o$!g*?&)2SOhyxc|l+QO>#Nm zYp42*3-yIetaxLd#Ctn2fwkXjV!In3k-!x;@-CC{B%z=gI3x#7U5*G3iJYp^q&R5=7OfC;@IUH*e_^=t`g+N7$C|ugl&G%}PMFk=M1!~{! zm%*8+gB~4x6x(SM)h{4@)R0h9iWazGh5H&!AVtC14J&TyKaHy z7I%XfsyN!})lbnE(cYp^aqJKxL_`dtvuEchqMsO!#htRoCeqgxwyK3}S2mAWQMo5n zmR4UW=Y# zPUaB#;f8uw=|a>X7M{|{KYzUBblV2rVK)oqAgF;dEw!>$c2G= z$bHe}uHAD-NX942u2%aT5Y9Qc#3`AWguN5IKfm>Z@%LHg>0!cJNhAac@wW=3D8i>J z46tiOmldeyP6pf3bw}%pylsz2`U2=o*kc?*AeNAA?p@_^f+eFJvM3p@$GLpIUJkNO~u-Iy6nZV{Titbz;InV_JNh(xtG#{2e6aABhi?!-#hfy(YI8r zrW-%#$_dCIE`>X?IaLFM;~2Jg=BGd0GlIHfzRVmtKv>&=1cz&9FU|Q^*d=%0UOYdR z7BX?&9wQ;t=os0+q@;zoLg3KZcL7B8%R!x*N`>DMc0}STURz|oG1un^3wf4yB9#4T z5A$Vp^6S&8SOlgK(AR)lNT=k6zI1KUW5Pp6YV6xGKf`M(FN;<~V%Ct{e%gUn)0i=Y z1a8l}KkQ510IB6yVxbsO_F?(qPJ*?ua-Keq%eh{oQ~Wt+MMeEgsH`qRoesLb=oUgJ zo|eP57^%+%Ai6{hl+J^?Von7%X}Q*?X2c4`7)3>V6Jm#pPc8qz2mmZyY>S@PsJ)9Y zTTJbH9GX6vyaU<=&#}pS`@={>f2H})ZO@xO6Uw0S!|waS-3O!-cu4pY zx&dueT#frh35`rdDwqpDPktIN{o6^$joIYdgR0y-`X(e(bPIpfkJ1V2uDP9|v4|f8 zG=H0M_tPNdt65Z?_I%6VTXuKrox-;b@Md#MK>)?6MPGpb$R zr6y{cj5*kCo@hmr;uGP(6y^)X54j=-SVs>H04DC+QwQw)`j|fNDLBa!Zu4Ntf+{tc zS-1ciAdhX)iHhgb5nSJIu!2B{^eCtcn-`}%-)t*TA<6L1SH56lgqt}eO$0S;i_agT zgXO|@S}Ia8)hyd641cF!EoZcT)fM%=z@UItF|d62HAsgdj&6}VLz~^DddfhWD8h!Y zHe*GjFML3@lbRd0Y^ISKoak=6_-Ez4J-DL?jcR1Nq+sMv6hQcggg;c=WsZ{Xo|Kw+ zabU$$igXz7|F$WkiD1p6%aeG^^b|ptI3)fw==C>Dx!&K?R}olv*c$c#W7+ffF?$Tn z$n~n1H1T)Mzm_;O1-mg0EFH-g04O9x+EtAB5?jIXp63G!Zr9_uQ>z@?mtDT??=R;< ziZvL$BdWAbTHVTyzGI*h*e~yR{YH5k5>FHVn&NFB>(;)`2KpzG55g&w#0^?Jhyh)B z7$Vq5IeS%-)9_~84S0`Q*mJ*KBbO@mCEM@Znprn)c7ApIsWz$U8Wsll)(pU~@1y=b zL)K@R0zOzv-P;`+0pvk!z%(#aRFwGMr<{Kvc^qv~S?34(aOfs*{_vNfI zS7gz#U;BNPqSc9Efw;d))zOB=z+^p)3)rQ!1?U@4O(F8;n|PPgX|MyctP*0y;h; z2`f|NzoDhueAF#A+o)MOd*Dn3->cGF~V}Y)23D6O=KGl@Jy5L4XQ`=*d5Da>=waTIWOYcP}%WA zz8qwIy5Nic0UKxFc=v%jC5cb%d9l<8rKJ0ZdHvA9+HBvKJLgg&(n{&5;A-!-n8v1y zM2vKeJhZmnX!k}}EAgV8l}~&%AVDHZw)78w?p@uJZ?$5)3XDYfJ^CBeHo5akKYoBT zICzgYtB3Ck6Ip%hfLV6Dz=I8KG6&vYqo9(;!iUL@7wYgYgs_qRm1#pj7u<$h0 zaC@d~uLu*FlRF{R{Oe*^U5@V`&4oO(ti#V$G~(F)6T^;12==6_{6KMUWY;dX88oH? zI@cAs<kRUn9j-s3Sf&**#0aX2AQ5%DsrC(FYVUfFo*Shck95g;LxTHd@#vt^gxVZYn{d}QdL6me^fv-=?ffFfJ8I*Tz! zs7*M*c7EwV$b19hS5C1it6$7sSy4R_NDxrD9f|#7y=L@al{K~=y!zg)7S~CNZENay zyx7n}Dz_v$P!!!A(?Io$XyimKv(<27Y3084tK}uYj(y)gFA+RY&<{gnl2Q%Fpf=~1 zT5K41=f5$3Q{^dS9HbSa>dJDLx2T}(-t}Y!hJ_t+j25izuA?Tt*z<)3wCn60JMcVP zyr=?+MhvX)tcV7m#|;iM$p>{@Z+^%GEl_yZyqn@FaXHn#OkdOe6R@jS2a=l>{ubV@ofqOwJHyszxlSMZEL&KOp6TisIy%9wR zT~IoLf7lCA4-_EBF`y0%^3o8YMQmm5G{~hlA{^kHJ;kB8X+>drP9C>5hkXWw*b2nc z(vPsPIH6FkBXo(7mci<5!3{ddL;WvGju9?jsDZv?Sk`sHBD8 zB-o#f2HPt&GxE4un7AI$KXu95Sy412mI(I`2mbTvLdt(fCLYdB3^BQcXmWA$2=nlB z^K#U(FmrHmF@xa;K3)zMFz~<&1}eZH1UCmCp8y{ZD+`RBm5-NegqfL@6~@fX51yf5 z2BAFM{jA*FJgn@T4|VwE@65^bCE_9E1CxIgRO=|-&)p_Ye3kX2hR#XEPy2*+Zmqg` z&zC_J+BtoV_yKw3`_aWTKDj=aQu#@&+7o;wls^;=jA>)@}UD)2RM zONE=bq(IoQLjr0!$T9|%*o19FB_YWaFSzo4#00Sf2VZ}D{&wSQwmz3vT>iM$^}X*@ zh_xO>Uf^CVa8V>qnWjQoCRp^wnVy=tEdgP@z``%sGwXSpxJL!ooY!89_Alpko|_xR zn^=rX0;5PoanM-#ejQ9ORs-3A}L+`3~P;jZIw63>QD->ljc)LeOjz3=B)LFZ};qsY#SHj1> z3}J_a*q&6wjKozayDTqT*^1^@3w{ne&wnk2Of?KX!XmoN3hjAZ=k+R=m?g=M>K3mU&!R;VY7@p`-vkhm;Z_j$>3pUH4GQW-*EV20Wm*v z$WuP?P~~}ysT^g;wVzK1vN?QFA8!fI>2s+ao(!18zPhFtdIb7P?a`?6ZcyZ~0;n`H z?zWe`0)XyLQ>$+Je1X4yyQ_In_XvusRYlYPmUW7%J{j0j5=E z#p~PTMaD`jQ@`H_(e9D?EF<4<9nfcqA8f6sr~8m%T$VP|f)eD4s8;-u+QgSW*Eb}% zZU^5`{n(G^lByCfMH+75bO5Ln7T$~4nYjqa4wWJ{VVKdnlrm8&frC$2Fx)xZkAjc~ zleBVP1G;y99s}4;WEG5)7w9Ab$91WvS-NS_9V>eZzP~w7?`fTjRB#I8r&B7zH*WX% z0Nrap<{QOSLCXEP=6fV`Rw&Z#8_#4x8r>5dg_GBm%@u41_wnsH)p>;Uu7>J};Olw# z(j4&0JyK#Rh#=JQn7dOXpRF8CueyVkX_3^WH^-!NU$z%Duh@)jPDWCmD&)s!NddPW z=9J~Ivfm#`c>|O>uY0}-ak@hb?xh4wmN{NJD^6tfh-~BUbp8nqwMVp-u;_d)iIv~3 zOq235q1?ENO`KPF?U&0$+FqBg8!oxq3`M6Q5w!~ccb+* z;Fl*NIkZsXfQmi5AuLcQqK_%(yWQ6N?m26h?Wlk(9x`@hi`@$+Tmu^X5%O(>Vwo-1 zH@Tv_`VAKDw40!bl~Ex)?~V7h4Urui?vZ~Wcs*%DbG>+WKry){a zXtI|xZB1N57r-`uR$Kzh?&Sj1(BV}VWNxc{5y|52lG&lWPt_>rRm38zoEy2sf*v(I zlSr%}m~|_dak9|P;LIXYBeoD*SWKhdC|XN%dXJF2&MowQhTu}|^m|F4aH2SzllxOf z-t=NhqhuhKNpun9fzGIMK~o8(?OtR`&CbUQ!0X<=>mPyUKNXu-P!=SqED(lG{Q{|L zcI>P$x9uWeh~nsQsr`CqnRzujePc|B?(x%SBZ#}#HK%(kHwt|-Kc?L6OSRwnjwWm> za*0Eb@iFA_M?CT+Lb$_~XfVuQKVzh&5Vv#}(XBuEd=la?!9zHBLi$yZ^^aP0_s<|S zMdMS@DuC}3HknC$CN7D6*b%tUh7}p6eQ$&+t%65~%pXZmml7Tm0yem03c2q!p+y`7(l1NBHuY1iAWKRNl2Zq zY|3lwZs@cc`E54)S}?{wp{Z2c%IjvtYAYd0f*4?jSoqgXB&>|%-E6`=fhV3;SeLSm zg1NaI379=)zq3Yak&fd!g|Q}IU5cRqPBchvGs48^_Krz5XM61&2}*~y;)-9n5_DVK&$0Txj6M-Yh&>PqsHZcG#n z{=(QsM{(k3cYi5!rnPzw`0^VrmNAu{LZ&n>Vnd)tW4NM`L&PET-gSh?YciFW`so3q z4vS<4jySf3KcchzX9msB=?fpwVs!*~{iYj;^Pig*~u&aywGEH5mffNMXp_Nwtv~1y~UvTfdn2`L*R}mFYJ4*1`P(6*nD2fR2 zN^8Ppv|yJd`oOJV)YNTtRnyyYI@tU+D`aiz*6Gcz(41^osW$b}B!!I=T8LDmkF0*j z8)rM}A=IDk3T>OtMW&`Vw9t$nPlJ9ZeZhe8{>eC679xnw`3P7{zZbL4ckJCwZmUYN zGu&&R$zar&BC{dRtzb_4cHDJc-D)&txSKmunp#6=g=*W1qNUEfpu;q^Nnt*zTZy+vCUTKaQQy=`cy z;a6jo5U%yIbN4bR+i^Q^lPvMO(x=i>?`rPD_+T_5Z1{M-hr+OdxC`vcjjJAjBZc>< zYG}n?NVCUKk{bAaH(!dqkJ5OI%zzI!cXgZYq7+^%i$$hJYr%P>36$w3vp;1LweO75 zTqH3KN0X^o2H#l2R}gIsN$H}pi<{P1ZiK&g4P^?${7PGz{EO+YN%?;lz)ZM6ug8BM z`{v_CA#=(#xiq4(HRo52=lexUSVHGz*ZnOk;c)@K%kLlcnvE(+uXmvk648eIfN>w1 z$9<(v12+{d+HT=LYrQjVlE@H!Ly&rh4~joxhHC zdI&8Q*_F&KlO7|#Y~o5J>y{|^))8>1JIaw0FhGCC(UF>&Hu!7XH8d5XMh>s0Hdz=d z+s8DGywO>Ci8ZjA6?S2s_&vKO=T;)HXDxHO(p-NUVj)?KNNgFSf}{%$t;eIKw=VcC zx#*z~W>}fbR-x4WF^Y1K-Y0J~+89ZJ3>PHfeM&I6xzZTuGGsR8Q)i(^2xvZjta=)I z5Zmdiadg}mFz=m-cqsNvqibUza`x%3iDo(QZJ$L5A{jRsM$YXgg!#2zVsAnh(^n@Z ztsbJ#DnsR!_tp1x(EgxwqD&+d6!2|ZNPvL*)Kh!tV(#6Dwk!(nN&7KFK11UQk*>cv zD}w2#&m>_+YrkjdpCNs=Utj_q@+<3r{B-rc7XE#Z+9?8 z$Cg6|FN^w-3Jv_G?3Q=V#NqpB#@BXll&*SyFNh3;Vfjf)&ouqWVxqMN7BaF2N{JJ# zx7*J*TXyfdP95TME^pEMcH?M?QI^s8-T*2om+0K}$#8F-TSbm+6zvP%@9>dhbz;TO}!BPoO`=b2G8yT@4 z9SkOgw0g|2kn&~%t~wb2Y4sb|Tv^5w^&_{r{!AQ1im?mBdwy;OE-=a*;@I0w*`NLf z^W|tZ5^q4(O=tDbbL*}$TaTyBPBq1`$de(sR@uL#yU@On1taidhuEG51b_AGH;XTg z*_VVoL5W;wWtn?2>&)TU-AvX9k6;>cXESv_O_?&5#^#6OTP!S*>W!syr@e2t&wxl% z{JA={_t9&;U{ec{maA=ajHHzc8Q@b#fyQ{+Dq{ks*l^dk$m`R{>B;jU4ASy8-`Eud zX}t17OLLZeB?0tL%DIlewecF60W5qAvy8E1zBn}o+zs1tU^%o5{`8%$xwtpaAz6IE zPC30om3mdC`jh==h&(YIp3hQFU$#d63v~_M<@`uzVZ7I2f+S3M^GH8I&DGJsh42OS z@t3e#A#VgzDhs~&rKeSb49~a|1nQBWJokF}rgW5}e9OOaPwZ3dxk{UZsSP>!$(6UN ze-2yRT7@FZ`-T!^yZGv81)8LoVPNd~M{<*jJo9 zS!hXV!)h%fFMYr6tKp2U<>tQGMVA(_VAZOaxL6y8pvGu%X@BpCej4$zY!TvW$$~m6 zaPS6)E4e;ZC08Mdn zNtKU_lb4U1_fva+b5n0iOA6%w|D`5!e^>upcK)DNn6BT!{xSw2{?vDsQ8BE3Zs3zQ zJ}mXNxldtQ+2++)ADn_s>#QXe1w8WQNu2}@c%%4>^Ew6zmpXWor(uIvD>yJeL{nKB;%Fh`DB?vbRH<@4BA)r_`b)DA{d>YrxEgR!_sil$A+T@X~ zX;bG8OR%Ds$?bg<_pC*hLc8>^$_2&nV3&_~{Eg-Ocj5Ej=O2=OFb3iI{$B2vtNA52 z^8VgN%kb<@3sX}3f{{Z>(tL+>^w|VDW7D3gdly~sm(u3nDBpU>=hY*+F!igc$MI_D zw9;NT>gJ>W-g|!M32zLPLi&(1O8tBF@Yh^z(|xCc(+vQ`U{|1LIQUT8W8DhOwV=-T ztowC2k@tViVv!;b;#!X&|1gQk@uw|M82%KtOD)Cd_RZtKh^mJVXDdHi>1CnbiJFcY zsU}}l@vDz*g*i?*6U8(sl^YxZMTkGHL^BDAyM6fgU+e6Jx^k~$dgLPW>kQ8louv2x@pP$g4TKIlLsYo*$FmAkIbeV+eSUu8}( z&u`K7{%m)RLsK*~N(OL8L|W7Yg6*3I6ziKwwa~fdToiIHnZ6d3SZOaXZria1Wx_0% zp}6;`BMZ;}ggrV)I~?2Jil7rXR4=IU=^E4~Y95X`%O!i+DC@%Xj`&`b2FJ?Lo82%g zz&Oc{zR(Y8q=3vM2dVaO))2K2!nD*gqHh|ybY}f z)g7gW)E}c?L=7ZD-WSHz=<+dPjN`Hw(XmsdBr6?ijba((iNW=4itAH_$!>dbYy9z* zHEH?2J+<2aBI2h*iI(lc;J}Lae&(cW$ES;YV$(}>|JS|=JlS{Zpr4k(D%poRN<2@+ zeK|gg3eC5QEPJn(zKu~atd?oTo78t4UoILf5xlou;K5J7lWTQYQ}@_Df9yT?PTU5m zB_I6{T)*sE5x6n!npn z#T3(Ca^d1S22pL7tkXV?4<{-=`*QAGXQt_wqL2T7ecI6-eLY=!>zmbWTBYxA?cUDl z;xgy^huh26Z(%>(WgT4fcv?V|@6Xt5-~UIi2h8Bv_)p=vbI7l=E0!7+&gl15HdH+P zT4iR(hT9?$PHPVMUg?^(ch3$VpN#DjChdw_#B1X2sA+hkPi^aKQ^VU0vfRGjacM7^ z^Fr4w`?F`av$CP%PqWf(rs4Y^@*fX$V7E(aQN6bMM`PWiqVuaurDT&Ye>*C$QQ3%j z$M$j)!^j-Fn>n=x^~X-jcW$UZ{A=-2oBft&TO?L&N^36V)UxvG*LwTlc@6*Nsj;u7 zmG?wXoIEq@-UVQ13>UY*Zk2Wnh`mgo2 zzxsI%rTQM7-W&IK{kFKieD9MNz-iNu%lG}fdG5yUg`U!EIUXlYgsXmO7HwWw(XcT$*oGFI@7M9#ePz}Vv9;{pYZ`0e6;SetGe^;epEhPH&~y zH+o4kVzW;PMt<*T|6=?=?`+8GrB{#6o}y>0-G1|QP)X_)Z`18vV#nFczQ;d`Y}LK{ zF5fJkH+ivGb!qUoX%mUFwsgvli;TNXtL?^_k0NHjmj}HfuvumK`wL9i6%EO31yCR~x6e9?HI!CiCUX zhI_idm)C#N4R?5=v^!wcq6gjTo2ReqG@JRGQQ>4AkM)M5pLZRdpEU8%*SVrm=O(DN zT|D=a@x~jSg%cKAW!~GMSru}5sll6|&9MeAKg3sVTj5Y9`P%)jA4D_daHX~tks8Fk{Ee88TO^_iQS&x$7H6! zyWmiu_F5+%hKwr)Uyq(WcI6KD?wD(wSs%9FdB^&4@$SD9PW{VpeLqL+t90a>^vIo_ zYxRotiqdzS_xaxYNpbyOVfn9{1b_OeHP`rGIJ9X&`u6{IdOY7#xKgv0|NePXGt=Dj u;NwW?8~>~7t}O$O@4T(!ZHoQcVQaODWpl#v*$dsomd`!$I-7xyd;kFam&OPH literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/organ2.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/organ2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..43b22f8354cee8f7a6eea1df9eb312f57dee36b8 GIT binary patch literal 18946 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 F2>=m?oZkQd literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/retractor1.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/retractor1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..70625c961cf982d3bdb93e106b91fd4a410211d1 GIT binary patch literal 11537 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/retractor2.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/retractor2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..94548ec2504ae8da2ab7c9bc7348f2284491a6ef GIT binary patch literal 9915 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Shitmed/Medical/Surgery/scalpel2.ogg b/Resources/Audio/_Shitmed/Medical/Surgery/scalpel2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7335f3d9cefa069550ecbac001fea9e997b21f8e GIT binary patch literal 13098 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 +# Organ Manipulation +These surgeries allow you to remove or replace organs from a patient for healthy ones. Which can help treat conditions on their bodies. + +## Anatomy +Normally a body has the following organs: + + + + + + + + + + + + + +Certain species might have more or less organs, such as Diona having a combined organ that serves multiple functions, but this is the rough outline of what you'll see. +To remove an organ, you'll need to apply the respective Organ Removal surgery on it, which will then remove it without harming the patient. + +However if you want to transplant an organ, you'll need to apply the respective Organ Transplant surgery where it originally was. + +## What does each organ transplant do? + +- Transplanting a [color=#a4885c]brain[/color] will allow the patient to take over another body. An excellent alternative to cloning if you can afford to spare another body. +- Transplanting a [color=#a4885c]liver[/color] will cure severe poisoning from a patient's body. +- Transplanting [color=#a4885c]lungs[/color] will help cure patients from severe asphyxiation. +- Transplanting a [color=#a4885c]heart[/color] will cure a patient's body of rot and decay. +- Transplanting [color=#a4885c]eyes[/color] will allow the patient to see again, and heal any eye damage. + +## Where do I get more organs? + +Normally when your patients come in needing new organs, they'll need to get a new one, as their old ones will be either missing, or damaged beyond repair. +For this you can use the Medical Biofabricator with some Biomass. Which can manufacture Biosynthetic organs for all species. + + + + + + + +By default, every Chief Medical Officer has access to a Medical Biofabricator board in their locker. + +## Why didn't the organ transplant +## do anything? + +Your patient's body rejected the organ as it is in a bad shape, try using a fresh organ from a donor, or getting a new one from the Medical Biofabricator. + + diff --git a/Resources/ServerInfo/_Shitmed/Guidebook/Medical/PartManipulation.xml b/Resources/ServerInfo/_Shitmed/Guidebook/Medical/PartManipulation.xml new file mode 100644 index 00000000000..2de5facee63 --- /dev/null +++ b/Resources/ServerInfo/_Shitmed/Guidebook/Medical/PartManipulation.xml @@ -0,0 +1,51 @@ + +# Part Manipulation +This is how you will turn felinids into humans, or vice versa if you're feeling particularly cruel. + +## Anatomy +Normally a body has 10 main parts. Those being: + + + + + + + + + + + + + + + + + + +Certain species might have more or less parts, such as tails, wings, or extra limbs, but this is the rough outline of what you'll see. +To detach a limb, you'll need to apply the Remove Part surgery on it, which will then remove it without harming the patient. + +However if you want to reattach the limb, you'll need to apply the Attach Part surgery where you want it attached. +Hands are attached to the arms, feet are attached to the legs. And everything else is attached to the torso. + + +## Where do I get more parts? + +Normally when your patients come in needing new limbs, they'll need to get a new one, as their old ones will be either missing, or damaged beyond repair. +For this you can use the Medical Biofabricator with some Biomass. Which can manufacture Biosynthetic limbs for all species. + + + + + + + +By default, every Chief Medical Officer has access to a Medical Biofabricator board in their locker. + +## I reattached my patient's limb, but +## it's not working? + +Your patient has taken enough damage to the point that their limb's nerves were badly damaged, and they need to be healed properly before it can work again. +For this you can try the Tend Wounds surgeries, or letting them use topicals on their wounds. + + diff --git a/Resources/ServerInfo/_Shitmed/Guidebook/Medical/Surgery.xml b/Resources/ServerInfo/_Shitmed/Guidebook/Medical/Surgery.xml new file mode 100644 index 00000000000..b37005e0038 --- /dev/null +++ b/Resources/ServerInfo/_Shitmed/Guidebook/Medical/Surgery.xml @@ -0,0 +1,40 @@ + +# Surgery +Your usual weekly activity. By performing surgical operations on your patients, you can heal wounds, remove or add body parts, organs, and more. + +## The Basics +To start surgery your patient needs to be laying down, and ideally sedated. + +If they are not sedated, they will be in a lot of pain, which decreases their mood, and will make surgical wounds worse. + + + + + + +You also need to wear protective gear such as a mask and gloves to prevent harming the patient due to contamination. + + + + + + +## Getting Started + +To engage in surgery, you'll need a set of surgical tools. + + + + + + + + + + + + + +Once you've got tools in hand, interact with your patient to begin surgery. You'll be able to choose which part you want to operate on. + + diff --git a/Resources/ServerInfo/_Shitmed/Guidebook/Medical/UtilitySurgeries.xml b/Resources/ServerInfo/_Shitmed/Guidebook/Medical/UtilitySurgeries.xml new file mode 100644 index 00000000000..0a6841e1f34 --- /dev/null +++ b/Resources/ServerInfo/_Shitmed/Guidebook/Medical/UtilitySurgeries.xml @@ -0,0 +1,24 @@ + +# Utility Surgeries + +## Tend Wounds + +Tend Wounds is a surgery that allows you to heal brute or burn damage from a patient without the need for topicals. +To begin you need to open an incision on the patient's body, and then apply a Hemostat to it until the part is fully healed. +At which point then you can close the incision with a Cautery. + + + + + + + +This surgery performs best the more damaged your patient is, especially if they are still alive. And allows you to bring otherwise unrecoverable +patients, such as the dumb Technical Assistant that just walked into the burn chamber. + +## Cavity Implant + +This surgery allows you to implant any Tiny or Small item into a patient's torso. To begin you need to open an incision, and then open their ribcage. +Your patient cannot access the implanted item normally, though there may be uses for this, such as hiding the Nuclear Authentication Disk. + + diff --git a/Resources/Textures/Interface/Ashen/target_doll.png b/Resources/Textures/Interface/Ashen/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eb2f52717b08c7124e99ddf4e2196a958b9362 GIT binary patch literal 422 zcmV;X0a^ZuP)B!WNgi#Ry4AL+$E_3_uFqG4dg>tn??69QH5lvm-Ll}lhpd9N#+YW% zasLXji1&+wmlEqi2;ZTeheu^_Y$rnaVE}n~a3r{2Cn*r|%S-3nOz1*N2_u>aRX`%5 z1hn{*z%>*?uj4?dHCEw-Q1+>9Q)euM(t%tZl+h3~0i}H8T=sKDX$U?EdG?W(P0}VjAg!8)cZ@$o{WHe@4;JDYw)l`f Q3jhEB07*qoM6N<$g4h?VQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Clockwork/target_doll.png b/Resources/Textures/Interface/Clockwork/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..8426d42299a09f42051f2e351fdc74b8f3b60c27 GIT binary patch literal 1219 zcmV;!1U&nRP)Z zPe>zI9LGPVGj?oJn=v?UD27c4%eEc#P+>(BHuchz*B*1&s|RrpUb?5<+hSRYUJ5-3 zg|fYMPi3J*h!h12RYLI~MwBw$Y0bFl32U(ZyI6w#^EX7zdS;E z)#yxq_uNQ}4@?`h#La9TmNh+*GAy%+mH-LxHaBhfPh<9i=*`1Ov+#vq#?y+0Nl+Nzq#)T ze)?p+q9vt(VDq>YA4y7jadylbTUpxF&Er;Jt$EyvFMc_$`(>z_%=~9bV`14yTV@l} z#ytXY=C?8m0FNH7RRA6@PU?>yu2oX;cN~Bt=PaJjDuK-binC*^EN$w$)rPmW?wkQo zw_3=jZ@XAjH5n}dF;8O~{ycD9^zq`P{&;axfBIy-lFurRs>w8adjgxUENup!#o00P zSw(O5_QX|9reBo+=vO6FP4<52;a-Lmu*@dV_5lbwNfZNh=L{_=aj>;VW;91(Y5>4{ z9&GIeEcP={w_0(*OnSIC5atpQ5ZZedBqda2$2@LTO68hfXwSX;ahtoh6C7;qQ7YFk zk6V>|R&fBD$2}gK5baN03aEWC$A9MHzo4t`oKd%06{zWjsR8cZc4;e>YwT7V6~H@h z863eRfRGc;F1~ z%>i^pLl~DbplWj9U05Cty-a(HT)AjkxAZI)1C8Am)p+V`xc9 z->o*{etA*sUdVv(WN_o%rEf3N`h%@KcJ^&bm>Qr|uHB2=IfQ&x(fxViGC#O71L5QY(NR&D8Xz;83)F`H#egV2qU!k(6%D0w zje?jf*Dht?+)OBgLa;(YcPbX>S0%(Z{o5@Z3o&*P1Hb?31g~U6O6Oec*U{F)%`x!tr*T-X zqiQndZ*)2%fVJvLdj3Juh-%ON_^Szxpy1p`eUW1y4tBFBWPbIn+kJI)M$;21Dlisnyww+$jRXH!SXObo-%vG~Kxbr`P3C6Yo=w%{ zfHSI^d{3lUKZ@i129SZywXB^VGM3rg2rDe)il=Eqk7&B!WNgi#Ry4AL+$E_3_uFqG4dg>tn??69QH5lvm-Ll}lhpd9N#+YW% zasLXji1&+wmlEqi2;ZTeheu^_Y$rnaVE}n~a3r{2Cn*r|%S-3nOz1*N2_u>aRX`%5 z1hn{*z%>*?uj4?dHCEw-Q1+>9Q)euM(t%tZl+h3~0i}H8T=sKDX$U?EdG?W(P0}VjAg!8)cZ@$o{WHe@4;JDYw)l`f Q3jhEB07*qoM6N<$g4h?VQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Minimalist/target_doll.png b/Resources/Textures/Interface/Minimalist/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eb2f52717b08c7124e99ddf4e2196a958b9362 GIT binary patch literal 422 zcmV;X0a^ZuP)B!WNgi#Ry4AL+$E_3_uFqG4dg>tn??69QH5lvm-Ll}lhpd9N#+YW% zasLXji1&+wmlEqi2;ZTeheu^_Y$rnaVE}n~a3r{2Cn*r|%S-3nOz1*N2_u>aRX`%5 z1hn{*z%>*?uj4?dHCEw-Q1+>9Q)euM(t%tZl+h3~0i}H8T=sKDX$U?EdG?W(P0}VjAg!8)cZ@$o{WHe@4;JDYw)l`f Q3jhEB07*qoM6N<$g4h?VQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Plasmafire/target_doll.png b/Resources/Textures/Interface/Plasmafire/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..57262d67028b03c02f37300c70b7c86d9dc066ae GIT binary patch literal 462 zcmV;<0WtoGP);043`B7PLs~nf6~#%~{Qq}W8ry{Zp#$fDv2@X5Rh2tbRk_oloEhx< zCj)n`O^pcvpZrpvT{39f%iFs*A%p-?&o23Y=|zUF zTR$Om1W4e8HKF(43_)ZNVGw<lAhm=O>#2=`?`MobCN^uYi$4=o6m1arbb!T_HUa{{cA`~|pL5lBu3 zh+72xw;I^3`*BTBr$d6CrD+Tsbzn1t_995GGd*K+xEJ5#m1x^(%&E zD~4ygLwLH`=&^~8ZJm!^7R!VaSgOhJj^huiJjU_=1B90xZ-OR$IRF3v07*qoM6N<$ Eg5+YkBme*a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Retro/target_doll.png b/Resources/Textures/Interface/Retro/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..a147539c3ae627b06ea0fcfe67a9228dd21ae5cd GIT binary patch literal 383 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/eyes_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/eyes_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..72a30d73b8426fed3a93dfa2b5fb3609c02b952d GIT binary patch literal 6856 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 q9~u)6+vB#bTBxqBu8|mMpA3Un$baVF literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/groin.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/groin.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1a3debdaaffb23acce3d308e55eef9bae1bfc4 GIT binary patch literal 5485 zcmeHLc~lcu7Y|fXS)>)INJV4ZaG7K#nIw~GB4|JoFo+OWY|CV30)u2>5==lUxWEy& zinIb&>)KXrK@^dytw;r1v2|BI)E;TA{itQJmQBT;?)J? zZ;2jfO|J{DNqjSL;(+ktqwJ}Z?;JmT^-}J_Kc*uW&Wud=d&BVvZ4wEqh%M?+zZI8%F9D%zIa0SNmtk0{m<2aE2l5M<5Lzh z&aGHo=qBD`Ejkeswz}{@Rkn*Ie!=u%w`&4C)vR_)QXE!QSt@8;&^g=#DsO9GQZ4q8 z{pO7K+g#DdGVpaRhb*V#W_YW{RI|0k8?%Yp30>0X`*&3o>K-`jm6zkX8ON4a+} zo^OuAeQ!m2^+B0YC!bk#|>k3CD+xs9XFZctp&qMszrj;Y;Wq&gEC zF>&q>(MjVs=k4hi1l5xWno0w-Lh-f>PsuxQ?*|1McdMA3TJ8J zWlgQ69~6;~T5p!+8^2rHWVp9+`6KdO;#62b(=LzLpKJ2pymRR6fwZ!mBFVUK5FUAIw%Z?p+tN za~)S);N`C476^3PTI2FN$NT^I`|8+3U0<%x$Y11cy*0LDa`~()GrBz6LK~-Mn zQ7WUy{{UTe^skUPp|O!ZA#0rps-5q3l9Qs9GjQ3g5o2HVFia^&Ci_oH zUWM)1>wm{%c)sts*sWLD_rxt{-tzmJnLM%h@`zB+h}C0UUJ>pO-0A5-To*^r9Q(8U z?)RgTy9Tjmew?&Cmvr&nyKzKN=cumcqQdPTuz9Ytcl=g;B(&Nz~GkPGvor0HOwVH8(z-F`YZ6dyjjTay?nM?o+1wtVNG$2c= z(Ms4Mqh*W(q8lTGwva4iwlXFo*MUjsOet0cj|b+tPy92OHJYdJMoSM1fDeJ4Fbfbq zEHD@Zy)7)(&?Nw*$Du#9uxP=)E{LWrrWBT>LzmD->zLjU6#3NNoWdqK!=Xq4okSae zss*fy^jR`Yt%-VS;h-R%F_@iJfb2e+R!0AftUkUuW}M;lb_AF|#qFd0BzC7V(9&q| z5EGf=a8Dhg;5pXEDHF+1xN}H~#273V=^;Iekr1j!5s1KO7?PlR9YKLaVN$vml-g*q z5=N4CKml+*18^ueYbwW`jKEuQs2#`+3K*ZAmvoYQ|;UFBJ z7Nu73gnam!Br1up>VX010mev~Y?fzJTE;-fSP2K8h*X3i7y{}Og+*di@=R$i&00V$ zI#3aqFA_Ru9Erg}IDlHhQKj?z`^W zB*xiHT&}Y%aDwa(!9pydDW{(Rt9yz}AdK-e*gtv-_KBSNlVZ@pLPSOgVF;Fy1cXvj zkU>m{L9m3Dh!L@jBuRZ=bc;!EwGk{mEgtX)xB><0x&hlzEFUXQ>KC=&^U(g+3-q)q}MI#h(}B|;%ei~G9!7sHb{!UIJi zME{NO5R8(@D4Ku}k_7!HlF|?+5y22C6AE=wL`Q)r|JLxNS{TNKQd}(kH^QS4874yX zplT2q1)&l>4e4|g4MwmYBS=gN13&t7#b39MgiQ=X6iCJ5I!Z@Y6%bKez&bezC}N@%w_V7j!)r1J9-WqPkwt^;`@*m-371 z`rGJofA*wL8^Pam8+eYd`)g=dpgf)dMuW_%1r`p+!^d&CaJFpq z1Hu7TwI*~xgU2AB39qZmJU$1aaCOKu?ZDcUvj<-Z4j#(6*s)DDUK-s$aN6Vd?rL;^}cK{s&?y(xCtV literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/groin_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/groin_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..313b6a1124c38adbcc7948afb59fd7ce4525b431 GIT binary patch literal 6452 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/head.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/head.png new file mode 100644 index 0000000000000000000000000000000000000000..9c645d2353c88f96bbf8e92fed127ce532d950d4 GIT binary patch literal 5663 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot.png new file mode 100644 index 0000000000000000000000000000000000000000..07da8e67b7544af6097d5fd978fd36a563621bb2 GIT binary patch literal 5462 zcmeHLdr%YC8V}VA%0uvhRjZN)z2alZZgw}>T@!gEJR$}WBdC3`*=!&{9wdPTM2jE{ zYVj(*mGLoh>!TI5ScKw>tAL>OQ58pQN3iAA2Zh_KB35wjNrH&e&fIav_AfKD$=P$h z?{~iMcYfbF*Ic*!GWvEbJgT!V(#zYn`Cd&c3s)0w4QXo;n*T%*aL z(WbIoOQwT41Xbh$3+>CKl{tZ#_AB-SmE zjy*hM(r)j_?;c;ejrQh;-kjZ-{BiPBx7lS?rZcDiQGN9KckAMpZ2oFV*2cZkF1Lb! zx@SK;8Ju$)zo`+4xK;FKkkumAF3 z#Ki|4PkLs0O^lNISEL3N9Y2*Q?J5WjxUhNc_@uDzVZnDAsYPnK|`CsdqcW+}8^Che9;#kGI>7bLv&ywaI?mMGlrWeWyEV8-w*NAHA$*05;@~UR3_3ey$l7V% zgBuo=<`kJL>qhPQXJez!lyhlYm#>&Te9-o3UWZL_?SALiNUkZdFOuiYzj5GTWJ6fg z)VMpbsej+Je!nkj{-WtaadlRj`N{o*Cf^UYEspy7{?|=SE#)<)GwrVVP0_R3F6{lh zyd>kdMVFe6EY0d@jyl$HqDyEyce)p8JlwixO~#e{gO;|aL#CT;@h6(k#%(Xw?4Zsc zy;pv*tF+?C^Vm}%MMC`J($FhAu5s}tTXt1OV_RIt?485aFXz0sE$?RQ2Gp%8A>&%* zgAKz=UCTp4JO@7v`*Qun_7S&bdEfh`MQ!?|^4HGdsO25oe_GbowX(Tz=kAk*KkS8z zvxY?bdD<95dEC|lW!mwH)pP5&w^*O~NrMWOdG>zdIaL2y_k$<=rf87d=|GnwagoI$`%w-^J;0)g$k1 z*rcg}YjRU+YIfEh$Xi`rHmod{+db$`drRqE-sEMQM=d^UGg`enmv)~2!I~4pN3XYU z8La$PP<&+HmWHxbA04_Y^>$4vio9^`$NjaKxc-JDJNuN!!x^351Vx-GM#r{{T>0}B z{lc^Fokh2Ax|q3>IJc@eG&@>MU;f)lzpB9Mp1P`*!>7@_aEhEee$r?U-Hc<%^l{VD zRuHB8#7Mw0 zt6y5rP*cNC)0VGeTzvPf9Us)~*VA!u>&_jf_3zBv^{}=gs4l1Mqh0gLf9Ygy=}S1z z6I*7dJe{7N(6#>2;wX;^E_t_3*QQ6Uf0A>4LPEEEvuDG)9xOk5qAh5Tq46E*vEa^a zw~qarjP}dH9w$F_C5XXw9ve<{{Mymcb+Y$^tL?YF3-V2ewki${=Wu*RYQbK#P%(#M z47xyCZBVg+Hk}ddRUD2u$Y!LO6xPC3v58u}gx6VpipSNeCA@fC0V|ABHc1~|u@;(Z)1~Uolug2O;8LJ%@8R6X9qFhUKAXzw zfT0m^ETMuh91}vMh$JAEB~Tn@1+-8t8~`!bqy?&^QwK(6 zhf)J5R77ARl}ZDkFad-S2n!J!Ap&V|4G2Yqt5g{3fKoG5xWS~O!E$PKbRx?)>JuFU zcEYKU7`cQe2!vnu#H7*|4R8Q8pw+7lR`bgtrB=tzx6pPz5fO?Yga9K@QhTeJyHWvwqaS2LNlh$mF_@GFL#l*l4~lE|>>pNuf>P5K zT1Hz~0168*3PC8CR0>cEMkoO~9R`g7_6D_9lllLw?d8K2I~P4tYXl0b9fAk6VMZfkB#GpYDQp4h4^;%?6FdN}Je_M8G593JBD}6*r)7siwXfjWvn2uLGbA zLJ$bXln6<|0tyxK_NevANa19G#v!11Q+a&(XDY)FXle`wcZ|QnV*K0BGTE=hH^_H&JV&Jum->U14 z(dGW~NuSk&zvou)98c8EdkWqGxT>NeWRAB1oTt+2PeE&_F>;Za!|@ntzg#%mO2&Xr zH;Y^m=62U(=qQ(WPxSovIp`wfvJmBv8;ZsduN>HiQ&W}8DY^dM;{Obid*$SGbw9eY vG+J0(kh|txYm7CUfF{RJx+JcD)BMa#-U6LS9tVyM%1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9f9e38df46d02146b3875717a9ff840faee264 GIT binary patch literal 5476 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/lefthand_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/lefthand_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff52eae555b870e68bb83de31a192057d27fdf5 GIT binary patch literal 6174 zcmeHLcT^Ku7Y`~OiAc4uMv5-NB$H%Pr759_AYeqKD3i$qA|$~ikf`i}sDKJ0C{1BS zY=|`5qN0K;AW|#~;)>V{7Lavu6|CO`EO@>>=R2NncmFcyOlIc3dw=iV-@W&}nOW!S z<33hrq7Dv+8|&%8@yE^@szXclf2*a>1BX*Tv4R^Y_lFgPXsJXXj6wZkl^ZR44t^9>DGF_n-?&r5z zb5=*i#uvwS?(#b2pncrv*})Xw2|0yQZ615(9qYo5=FPlU4`*)+U*76;Cajqj7g*I( zy{Y@Ar@_go5&WWa8Th!oM^M6*B|0IO3|=b6hNQ(P0!+^5SZg)zXI|evYC~M!*2Vg- zQaj2_mQ*E&A08j-GGNm)7aHPZJ0_gc`VLEkspoQFT==$|Qh>MWZ4HbS}5E+ZlNtdV=^rMq2dy7{ze zTUQww7x|o+l$NCvQ)t2}W3X*Zzl*9pDEZB>?Rxgn%h@}V%UTPUbM$s=!3Ohh{CK9? zu~frE9E@z%eZ8F-9#Hr|7b_8UFQZ;eLkuDbkHX_x%d zY$m?+9Y0&<_^Nrlu0MN7nhNxrCe)HzNdx;K; z-VU#d)f)KxDVBJ1dQ&mg$8LAto)-IEqY6@p_ugq$6+SW)KabDQ)jiJ0cx_y@usAI%>6Keg*IL_RP2}Z{_#o^3wpT;Z zNu2^Cf^n%Unq0~5dNQl%zFAP{Of^p{ElzC7g$D=YM>_`Ac3n5fTGWakbK1N*Uhc84 z>t~atn~y6PD+1nmPqpf3t)N}7PR38A!Cwh(^5nSF{O-O7Sz`s4zS-E4o}`wYEjSw$8&VOnDcfxN>s;IS z@wO3+ErUVu&gxp=~~M<4ei{?N>E&I^j&|Y z?=(|oQe9j(Y5UdY2gDu%X)MF9Z6i0oWa*@fsSS>KAZcz0_sN*BhTbE16lE!Z7 zuQ9Cpy%l#cNWFjQxpW)1QIu^)9q9Cn;p5gBWt>T;jP5+$_oTfZp$weYCtFTmElssP zeLA^yR`I;YxF*~kUqwjo@9JxnGj`mwQ~znNUP#HVq`IfMR%Nxc8vj!sW%qmXL??b> z*^hc#`B+T&X&e#vQW~6UbGHfaf2XXv694Ee?vYk`P2007FDx{ZkuiL60RZF0h?RnEO=}LJ@v(bcj*Hp;suCSD~PYg;nda&U0i%UU0gn{!z$1l*FnZo23`J5j=^~)0p z1EcTs+}icf!urP?qo6uvv;yDvLtpcCMS?GhdbuZe47Zh%d7wD=T>1LYiia+Ejfgal zmiD{*>LL5HR~+KvYIOVU`i?uf*JM&B+%jC(ohuHkn^Z^LmVJKtc4p)H%-L~1_V7jZ zbyJQJtKT#nyH#0BUG2tZ&6{jxqARkiBHK=!v1|=Rj)mC4tt&j2A z{4$~0JZ!)-NAFz58)$9ZcS@(7lBQ8ERnC1|uT?!@`AkWG{#-h!!DNnU(A{$K>9eO# zUz~ay+}3jwpR`t5k>_1ufWwV56k;1|p!ZxhA`uZ`zJ!Mom7-{D0mL0%f_x%Vv+@6NJSp$U=ir;OK_1$Q36DSh#=sq6vk349CZlxQoexg&vE+z zf!#S+M9AgQY!XSKP!JVVqC^@_BC}X55=bFYC;+Ab$d-%cuo4iR~np>Rezf|-B9{X+X=>_f_!mbW*XBSB(R?s;+?EL8Ke z`4U9PXAfTrSSVkBkO7(iW&#k6Mh0LS$^sw;%12O?MWNHFBcMFRGC3?pP!$vgP84D| zG%AlyV^Mhk8DhWy1R)3jGx$6J1gQcBjR7(Qh+qW7JgE??N;qnyS1Kqz28A%ld>%;V z0em_G0U$Du3NUFX3?Os?14LO2DxZN4LGcl`n?x#tv2+SWa5zee7KaZFs0e4z^7VAE zpb){&65l9TF2D@19uSK85{2yZ5LYNd=gVOgpJWD=OlCn4jZTIrEDHIvQUEHIVYR42 zC4)pNWoSf|7&aCTMlGzWR19E9jzz*>!4dirzEH6Ie`%}QhhRUPbPu5nn}7L`Xt<~5qsxZx zhHs;UL(N1W47CLtMutO>!LcZR$WIJwcnFDr#o;Knetam{k8S_ip~nhc*MBE3Ur7o!uKCiW%H#siU?Gd z2aGa+Oa?%ROJ=b#*07wA{`v5zWSB~aVF=(M*yIosr2;Ttzyx?q6k^fH43tczf9dZ3 z86KUBl>^9R(`f%jcoeMbVLHSFC@7r=KzwW=fKdtxU_Aj*1TaeglWBizcnmHGvZ)Z8 z2K^i1(HS%r4MI?WDWGH7V}LX)JURuSLsTAv!sjDc_u@M2!wBwd=j4^n^ vx|twsFeD7))vAS!*Kcfa?x_{9EYH~C797wt>b!x#m^seV)rV6)J1p@(UfmE) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftleg.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/leftleg.png new file mode 100644 index 0000000000000000000000000000000000000000..99dc24ce62ece522e0099552bfac0170da399f1d GIT binary patch literal 5488 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 T)k~kCmKb+uAE(kKVJZIsYnLPV literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/mouth.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..202f411874e1bfebf30b7edf2642593cc4424c14 GIT binary patch literal 5219 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 b`pNt`E{SyxIoSrb#0nndAF3|$owe{kU37F` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/mouth_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/mouth_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a5014f42ca3db0a388ddf896159d75a6c4cd5106 GIT binary patch literal 5208 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 Sge(HMy!hxOMeSrw(SHDU=oxna literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightarm_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightarm_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..7121c80830df2fa38f689ab9050edf0f918c64a1 GIT binary patch literal 6592 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/righthand.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/righthand.png new file mode 100644 index 0000000000000000000000000000000000000000..e71f8de80ed087cb7adea8ca430681c53120a505 GIT binary patch literal 5467 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/righthand_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/righthand_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d51910da1735eae1f8cd1ac6621aaba45d280ada GIT binary patch literal 6207 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 E0F#f?zyJUM literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightleg_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/rightleg_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..b0936de0a0988200facc73e57f9acb8fee7e2891 GIT binary patch literal 5908 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/torso.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..44297c96c3271250a96874abef4cacc3e397c34c GIT binary patch literal 5284 zcmeHKdsGuw8V>>@1bidl;u3>)6*|dGGUU}n(0~vzAtJu3GMSl>fxJitiHZuMR7CNC z1+-aFu@qRvTCIvyQ4tj%^?_Qeb=CDneX)uUwCd?iK*X~>XOCy={$XgI`bZ_3G9YJhkrhUIwGflUWH9>3A%iWww~Kl%8bK zGtDH6v{70H!*=n0(eN|Zhj=f1X4m9r4q9+96)vu<9v)O1R7||ywM}tSpzgY)Uf$#y z?|FO6yy#YsT(57IpOqHbgX2Rg%u#jMzq}JNv~1k8ihFCO{Z=Q)UvYYH`OR5Rez+g> z>T%y)m5U2s_k6S?Ja9|UsEaS=_PN-n;qju=O;gJC1Fzk6HDv9Uov6QmyLWy|<+IjM z?_otbBlJ{w)Pv@Ro_ngA`raBF!yeUZZ{YIh8(F?V-N;ouAMD$U|JZ)tv&$on>ZBV3 z8$F?MN~vE+(%iVar@hiA=kCn?Wxl=S$)(p3FV-IQdbMnIL36*_r+L%j2mW(IcnPw5 z+4tH_8_JfbZ|^BT96z2p!=tQt?Ci{G`8m-8u~0wa@JPeD^LU>5I0??oT6c-2o4|rd*V?ye9-f6I`b^#d~W%+`8owvX_W>PZK@BX#%I-SPT&@Ri0JAuLh#&r-H~mW-1t|F!n3 zh<>`P^&9r)Gbdf?(ydq7cu{u2if(6PR`H^60o(12OZkDcK-RE`%!KMXg^C@Zx8FYN zuh~9&Qov=GSG$f!j2N7k<)aEn{CeYs@WQ~^<(0blbDPSlqEZU&-`%o9Cu6s+ndntk zc;fixiD?gS-1+&$<-DH`M474NhWf=t@yYde-=n^zq29@|*5$zi`sZg{xE3u=u6s&V zP{&TJ*?A`UHfO-I=#!UsKRa_*@wXjkR;y$!)HfwJH@QwR#Q0N9N9uBx@$MA#zmLy8 z8Kf>%F7>ORbaBZ|VY6dS{h*?Gu5kC~dcKy`;WPxW@) zPxrpN&ZB0Z-)Y5zd8y38X}ca?S;_2k`HLH`Z#>PPToNuf^r}%^^G@z-AJ)xAZYk{> zkfVN>v9zZ9!}AY!KAF%I`q=k{*PMlWM@(P8Y=K+&m6mxIOvjRQOA0r>bZ0PJ7E*G# zS|OLeDF7gQ`|j4SM`g`6OHoCOI*L*cXAqB{kX>(bkI;v z{`{2v`%CI8v-7r9b+4MwYIXhBy{j9W*n{U5^__gsW=`+XJg52C<@8K7mw)bFv0K6k z-pZ}z#SK-9r*3JI_vory8gu;Y^@@5_diW<hzyk!JLR4mRL!Y*d8qp8xBK|nBPHUvz(M_(hEI1Qq5VTr7l<~N z_rJ*uDDwSriv67B%dqB#>HbHk(4ke0fl=PEi-KKx@hXR`_hw=j!{SE|`c-=8T2Sgs zPfNp%kgOHBi*Nbz!0^_fmk&0tE?H|S=rU$qOZ|@ULzz`m*NxeBzZt(|v@>2OT^*J3 zJTxuwX~E;kvCIK3*_Za!r^OaL%RDw9u~kvz-LT>%x-jFfw(wHZ(Ju0x5zT8Z?Yt#c z1!ba7lAm`KiQEn`SM7Q5@WF$pdtXgyymzHX&O*zU)ygfs7>ph$1$Lx~%FzZmy|ivnWEwo)D&lm1a4qqhe-R$g#6j3HYoO zTuiXThj~eD5&&QzX^dqv=#5s1O~!WONq013`NGjkCR%rzLe zojt5{)C>U99?&0pSQEg;&W$InrZfvqM$I6NbZ}<~0`KrQr&;vQbO@YF>PZ7IwSrlZ zcczS1DAgSv4hoVegW2f?$bQF?rnGO#dM7r=h%=qefdKao+;^1f?)qY0QX| z4k!T5p#TnyY7qhv2_Xa(3LzBL5RisXh#*|Z7itMUiHcFO6GWVa0;;^q4*a%9t;c9BZ~!$x83|Lm_3cmsWgy4Wn1fG5$VU(nPmBtYFrGL}@YZNNX|Vz= zI#3aq!*2`1u`m*l4xkouC=~!WJwP@RxrM}NlO@4q(#zP6pjZyij$tJzC<3FgNQ@={ zD9l482qJ;S2|PY{N?>6q3>uy6O$4Q#`QNM^<-?M;EqV-P1@q5zcD2>iSTeQkt?gA$ zIg5$Ka+ZYz!`o7@Vlzm>87IJM8^U#%F^L5GN4sF(^izKz27!YpE5(VI+xZwQXYPK)0H-bUJ1shbI9Z0arkvPOex(+LvnRyV0cUNXI$=%782& z7)?L`Upxs9W^+G$dO({npX7@n1a_oHh!9AF!x)5U2~t34v_PZccfuB)&~wAaE@_14zhMR0HuA%PkR-8$SGK?kCVI?zaQ!PNY{HY@Lt9r)%B6C z_hR6^j6bUDPovB0?NyjGg8#4S;G#R=Qb9hrBzM)sMn^iY%Z%spnt7n*X^xp>WiXh1 z9A6j48oNK}^q>{WD32zlXJ1bb-Adg`&^28VIXuC?aq}sp`}~NWIj4np`z<)wqMqfw z$1U(s;}~@;In;L~vqCWG`>QFhM?b2}^$Q(Y0)2M1IJIuvo?+{s>`8hQ{o96C%yM8s sth+rmZul3`?$G|Brs(YTHr*j_(?a*|EZ!XU*N)&6QL4zQ5sCAE2i`c7%>V!Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Doll/torso_hover.png b/Resources/Textures/_Shitmed/Interface/Targeting/Doll/torso_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..70f5e5969c0e4f785950a19a2f1c592bae45d605 GIT binary patch literal 5672 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 b(-6`!tD(BsYYi)bH_6-GSCl(5Y~{ZJA-QRJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_0.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2e46e3a8cf1db046c2c06ac090df412c212feb73 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z$Oe?FXU)|rTBV%O-?XRoK2VCaB*-tA;Xe?_Tu=ja)Jcw;s&1sCywwi w`Sk1%bzsP2)e&e2X5=ssEMZp!%Ed4+)UYtPAAVBv4XBO5)78&qol`;+0ARK(JOBUy literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6e3add67f7a291a76514fd82b795cf10e81070 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#04>|n9Q(u8AE9bL*Z9>51Ixyt1>IgIhGjbRRmar=VFVdQ&MBb@04ZiGk^lez literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7966fc14190edf38b2d63e198f3c2944052822 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#5pjmC}h}M$586WFrj3}JD?P6NswPK!+#)Ixyt1>IgIhGjbRRmar=VFVdQ&MBb@07$_r{Qv*} literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/groin.rsi/groin_4.png new file mode 100644 index 0000000000000000000000000000000000000000..cc36cf23ca46540663073a1f24171aa7d3b36643 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#3?bXuwmHi#89fqkYf4b3{Z--B*-tA;Xe?_Tu=j%1Yy=`evXSj*=k1V21w?aP?G(5m3y;)5S5wqBl7~ zf^~6&&w)cnP8~aT>e!JEZ$@QdVPlSs4@?>-&XsK`&|+XzYkH@!Btc{XH^WvthKvKX S_h$h0GkCiCxvXFVdQ&MBb@0EKBN5&!@I literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba1a77dfd9a8755f1793921a8c583cd40f5767e GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#L2(R|S1>Hw%aC5m zU{Q1NJy43VB*-tA!Qt7BG$2RY)5S4FV`6fGf;0!$f=`lDMFLq{rc4c(${{H&C=}py k`Ou3;9{af68ILkB%>2r9ye>3(0#F-+r>mdKI;Vst0Ak1|qyPW_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb55b4fe97f7c31bd11c3a899fd4ef2feb8b6bf GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aX}0#CNu0^#!#BV zQ215e11QB<666=m;PC858jz#y>EaloF)=woL7IbW!6(V7B7v+eQ>F$?<&cyX6bf*< keCWj^kA2+kj7J$5W`1QlUKg4?0jQ0^)78&qol`;+04^XV`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d797b40a16129e062c7a105896b1d9a0784102be GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aSjYC3K{m+F_ii- zOeop$4k*P~666=m;PC858jz#y>EaloF)=woL7IbW!6(V7B7v+eQ>F$?<&cyX6bf*< keCWj^kA2+kj7J$5W`1QlUKg4?0jQ0^)78&qol`;+087s&WdHyG literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_4.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc1678ce5dacc75e2bbeea26616cf509326c462 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aY_s;Y#8=BF_daD zq*%T<1C(Mc3GxeOaCmkj4am{FVdQ&MBb@0Pj^MSO5S3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_5.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f6caf62d4058d5de67d165425d3c4759984dfec1 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aV!ig*ctY+F_f|} z#J_VB1xhiN1o;IsI6S+N2IOdax;TbtOiWHtkmlf8@JVv2NFZy=l&JwzIV7b8g#w%| kAA0e~V;{FW<532NnO~WX*M%le0BU3KboFyt=akR{0DB!I`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_6.png new file mode 100644 index 0000000000000000000000000000000000000000..74b58c642bbb81375ac68067edc66aaa7dad4983 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#dU|@n!NGBHaaLAV z*XF-v1xhiN1o;IsI6S+N2IOdax;TbtOiWHtkmlf8@JVv2NFZy=l&JwzIV7b8g#w%| kAA0e~V;{FW<532NnO~WX*M%le0BU3KboFyt=akR{01!?lxBvhE literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_7.png new file mode 100644 index 0000000000000000000000000000000000000000..74b58c642bbb81375ac68067edc66aaa7dad4983 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#dU|@n!NGBHaaLAV z*XF-v1xhiN1o;IsI6S+N2IOdax;TbtOiWHtkmlf8@JVv2NFZy=l&JwzIV7b8g#w%| kAA0e~V;{FW<532NnO~WX*M%le0BU3KboFyt=akR{01!?lxBvhE literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/head_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4d024c61f7f2c0bc5fd3e850e0d7af7d2eb1c05f GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSBC!#3m6#m^z?#*gHJFp z#Kpz^XJD|hvJ(B-yc4K~u_VYZn8D%MjWi&~(9^{+L}Oxdf`T-M=7LW%eR={|Lwx22 zPSsf6wt$PHot1k*mZ96_Ln?6|`?%d1k1{X>JZ4Fr_DE+JP&0$4tDnm{r-UW|Q%fr_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/meta.json b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/meta.json new file mode 100644 index 00000000000..2c34f86c28e --- /dev/null +++ b/Resources/Textures/_Shitmed/Interface/Targeting/Status/head.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c7e14784b35b1a136351c396d3a546f461ee2451", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head_0" + }, + { + "name": "head_1" + }, + { + "name": "head_2" + }, + { + "name": "head_3" + }, + { + "name": "head_4" + }, + { + "name": "head_5" + }, + { + "name": "head_6" + }, + { + "name": "head_7" + }, + { + "name": "head_8" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_0.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_0.png new file mode 100644 index 0000000000000000000000000000000000000000..22c7982489b70ff16db2cb15624b07f8a3de7ca9 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z$Oe?FXU+X#I@Ja!$XpWS7tHYgze~V1MIcwr)5S5wqBl7~f^`dXPm73wV9-Gq4_0AC m(ViZbvk59MdIAlc7#W;zGsrAoyrCPYgTd3)&t;ucLK6V3)h4|F literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3b5d4c1c8dcde3933519ebbb0bc9dc4f9fbfc0 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z1jR8-UcvC|7`p{fkhvttFPP!~f0ux3ia@TKr;B5VMQ?I~1nU;&o)!@U!JvaK9<0KO mqCGtF)}#cW{_FFctbZ(2ZN`ppUXO@geCx^F(#J) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e4db19616792928b1dbebd853069562e1fe392fd GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#04>|n9LAUah@9}$XpWS7tHYgze~V1MIcwr)5S5wqBl7~f^`dXPm73wV9-Gq4_0AC m(ViZbvk59MdIAlc7#W;zGsrAoyrCPYgTd3)&t;ucLK6Up_9jLE literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a204a18a9cdece9985776c6faa1d9cb6a98d73 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#5pjmC}hwQnAHvxWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$Pz7|0TZw literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9e81508b33ad3544c5d44f04a6c14ef249e34c GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#3?bXuwm#i?SBLmWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$Pzlqb5TD literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_5.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_5.png new file mode 100644 index 0000000000000000000000000000000000000000..930a7b52ed1cb8bd36bb84e653a1c7d5cef2167a GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#IZ1}U}yNpwyO>($XpWS7tHYgze~V1MIcwr)5S5wqBl7~f^`dXPm73wV9-Gq4_0AC m(ViZbvk59MdIAlc7#W;zGsrAoyrCPYgTd3)&t;ucLK6UOk0ts5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_6.png new file mode 100644 index 0000000000000000000000000000000000000000..efc7380c270a1ef691f11aa0e478b2304e32c53e GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$PzVJ|+tQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_7.png new file mode 100644 index 0000000000000000000000000000000000000000..efc7380c270a1ef691f11aa0e478b2304e32c53e GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$PzVJ|+tQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftarm.rsi/leftarm_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a00a6b1822e796f1cb38c52e4aa16f445ed3115c GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`U5U|56jtvlr+T$J%I*Jj0`cw4C*55F3ycPa#zuyM m0S8WW__GR21l)}L!N?#c&Y<|GG;bqNIfJLGpUXO@geCy^pC?rS literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e10c8c48c228683e8de51710e707e4c86e4f41 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| zOkTkd6vwb^FT?wp{QW?2mXaX9V21zy|8LfH=m7GSJzX3_EP9g@Bv=waPKc#safyx;?UHx3vIVCg!04^>k`2YX_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..31feb63b7bcc2e66bdf2ae1d4f3453a2e4677947 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| zteDIY7sRl48N&qKEw_N;EG0pH!3_WZ|KF_Z&;jHtd%8G=So9_*NU$zW5V^o;U}$V) oC>U_yM2A1CutdPk$RCUhV&V*ne@gQ<0+lm(y85}Sb4q9e05}pT9smFU literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..274855e4194b5d05834a62a87f33995572ee10cd GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztSDrNb70t8$G{{hYYY@;DGBlmX88aA|7Kl>4j^CI)5S5wqBl7~f^~6%$OT3NLt`UD n!GHrNI{aCMB?4|n{$OMf6K7ETQ<}FCsGPym)z4*}Q$iB}i2Nnu literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e5dfefa166a79b05b1a4d0531a8aa8142235e7 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztgvB-Q)1Zb#GueH{Vq_Pr6kBNnBo8b|C@CkI)Hp-PZ!4!i{9h}3D(64A{Q7942_Kp n1p^M8=yQ nf&m9kbojFhO9b4E{K3c|CeEPvr!;RPP&tFAtDnm{r-UW|jmahn literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_6.png new file mode 100644 index 0000000000000000000000000000000000000000..9822dfba4cb714b81e32705f429ce563e2427f60 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CI)5S5wqBl7~f^~6%$OT3NLt`UD n!GHrNI{aCMB?4|n{$OMf6K7ETQ<}FCsGPym)z4*}Q$iB}4k9O| literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_7.png new file mode 100644 index 0000000000000000000000000000000000000000..9822dfba4cb714b81e32705f429ce563e2427f60 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CI)5S5wqBl7~f^~6%$OT3NLt`UD n!GHrNI{aCMB?4|n{$OMf6K7ETQ<}FCsGPym)z4*}Q$iB}4k9O| literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftfoot.rsi/leftfoot_8.png new file mode 100644 index 0000000000000000000000000000000000000000..bdaec2557cb5c485bc4173a6f4e7dd0e7b033cc6 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|Bm#UwTp9i| zoM2!G4h~+x0Aw=g>FLGA#m!`3cA7#LJ0G6+v7zO@pllEKr}&t;ucLK6UZOCzuV literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a7aea1b40fa2e1227e2ae1d7312ed50f16ba20 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z1jR8-UcvC|7`p{fkhvttFPP!~f0ux3ia@TMr;B5VMQ?I~1nc4kfrOMK6$Ss5Ol)pU epB5)LFfgc0WDuTEd}}38C4;A{pUXO@geCxP*CUDm literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_2.png new file mode 100644 index 0000000000000000000000000000000000000000..43c72f0b2109137d0a8072d0e27d424ce07263fd GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#04>|n9LAUah@9}$XpWS7tHYgze~V1MIcws)5S5wqBl7~f^~6&Ktf8Aih}=2CN?*w ePm2>A7#LJ0G6+v7zO@pllEKr}&t;ucLK6U2BqKQh literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3114a1995cdfbaca9693d435046fedbe1ede8c22 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#5pjmC}hwQnAHvxWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$PylWg@Zw literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_4.png new file mode 100644 index 0000000000000000000000000000000000000000..83c4daefabf1aa53bb56177cd30a59bc033f609c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#3?bXuwm#i?SBLmWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$Py|=_57( literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_5.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_5.png new file mode 100644 index 0000000000000000000000000000000000000000..06946c97c745f7ea70046dcb325f547a42003e6c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#IZ1}U}yNpwyO>($XpWS7tHYgze~V1MIcws)5S5wqBl7~f^~6&Ktf8Aih}=2CN?*w ePm2>A7#LJ0G6+v7zO@pllEKr}&t;ucLK6T!9U|=j literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2ed496616e2767b566168b4a5ab2d4156a6111 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$Py)L?ZqG literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_7.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2ed496616e2767b566168b4a5ab2d4156a6111 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$Py)L?ZqG literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/lefthand.rsi/lefthand_8.png new file mode 100644 index 0000000000000000000000000000000000000000..2b33680d43842bc7cab7aeaf2efd290ce5798e63 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`U5U|*9n7%x-ROYJa$9 iaB3t-v2eAiFff>|Wzg-ZUwjp)l)=;0&t;ucLK6T;uq8?W literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0c3e410daebde3b664a5051ee922b41c502ec5 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| zOkTkd6vwb^FT?wp{QW?2mXaX9V21zy|8LfH=m7HNJzX3_EP9g@Bv=4j^CN)5S5wqBl7~f^~7i1ZFokH?==p jGdML8q*%DxR2Udc*D~n#)GxjYRLbD#>gTe~DWM4f-pV7_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcd84fffdf08bb6afa4e24643e5754bb42ffe67 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztgvB-Q)1Zb#GueH{Vq_Pr6kBNnBo8b|C@CkI)Hq6PZ!4!i{9h}3D(646PVrH+|>SX j&EV8XkYeF#Q(<5*UCW@`Q@{8sP$`3_tDnm{r-UW|D`+I~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_5.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_5.png new file mode 100644 index 0000000000000000000000000000000000000000..4e302cda6492c72b10abe7adc4af9a0bd24bc0ef GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztYBw|V`13K#-OyhBN!;oQWE4B%<%vJ|INA%9YDUkr;B5VMQ?I~1nc623CwP8ZfbwH jW^igGNU?CWsW32@u4T~esb72*sFcCe)z4*}Q$iB};`<~1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_6.png new file mode 100644 index 0000000000000000000000000000000000000000..d36a43c441db820231e3346d15e4571c4bd66705 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i1ZFokH?==p jGdML8q*%DxR2Udc*D~n#)GxjYRLbD#>gTe~DWM4fT;wI1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d36a43c441db820231e3346d15e4571c4bd66705 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i1ZFokH?==p jGdML8q*%DxR2Udc*D~n#)GxjYRLbD#>gTe~DWM4fT;wI1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/leftleg.rsi/leftleg_8.png new file mode 100644 index 0000000000000000000000000000000000000000..75bd581d69b23e914f915868d69b5e8ad04b74ca GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|Bm#UwTp9i| zoM2!G4h~+x0Aw=g>FLGA#m!`3c|n9LAUah@9}$XpWS7tHYgze~V1MIcwx)5S5wqBl7~g7pe}Ps@{;948-#GfX+Y qnnB}y$93KwpO!fmTyBg43=FQU3^K=dELsfI#Ng@b=d#Wzp$PzZk128h literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_3.png new file mode 100644 index 0000000000000000000000000000000000000000..cd974fdeea6f52a03ae3e4c44048df5ec4d83f5e GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#5pjmC}hwQnAHvxWG)Hv3ugHL-zDIhB9N=;>Eak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPsEak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPs($XpWS7tHYgze~V1MIcwx)5S5wqBl7~g7pe}Ps@{;948-#GfX+Y qnnB}y$93KwpO!fmTyBg43=FQU3^K=dELsfI#Ng@b=d#Wzp$Pz7L@6c! literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightarm.rsi/rightarm_6.png new file mode 100644 index 0000000000000000000000000000000000000000..35eec2905a589c16da56548c94ff65c360ea589a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=;>Eak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPsEak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPs6cY~Ol5@kv8w?Y8HU9GlomO3X?7*3Wr$79>7uj}P+N$$f|7kg~ zBpHTHGAV|-41s(Mk$>La)Q!4fpY`lOI|IY-8QgErE&crvXd8p4tDnm{r-UW|y3ja{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..967639b3fd1ab59ac776dca393efce1f977b7148 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1jR8-UcsbP0l+XkKDcC65 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bff7d8016d0aa34190d2a21f08606564f3095d92 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#04>|n9Q(u8N-$0A|9YPOG%JlFvI`<|2OM8bO8BEo-U3d7QM*{60D08L@tOJ7#SHF nKboALq_lv6XT@8cBnAdydj_d1|GqT?RWo?H`njxgN@xNA|FkGb literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d74824df983c9e2c4571bd2ebe4fd5b0da4ee7d7 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#5pjmC}h}M$M8{N{wJU~OG%JlFvI`<|2OM8bO8BEo-U3d7QM*{60D08L@tOJ7#SHF nKboALq_lv6XT@8cBnAdydj_d1|GqT?RWo?H`njxgN@xNAAZ94R literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightfoot.rsi/rightfoot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..50f6abc2c3493932b95c919b9ec8e43fd3501e17 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#3?bXuwmHi#IV8bt}#%Yr6kBNnBo8b|C@CkI)Hp7PZ!4!i{9h}3D(64A{RsqjEoG8 nA5BhAQd+>kv*N8z5(9&4j^C2)5S5wqBl7~f^~6%$ORDtBO^oO mN0ZZ&lol}Xtaz)F#K0hI&meW>-?wI4j^C2)5S5wqBl7~f^~6%$ORDtBO^oO mN0ZZ&lol}Xtaz)F#K0hI&meW>-?wIEU|7Jw5EmEspMk;P^3h_T0``(1zhH*{V6e1)*>9kbx~Gd{h(&L5f&}a0 z1d$6O8w`v#8a|qso|2T7lzK3mL0KU1cH|KT2H7tRI&;<^Z31dx@O1TaS?83{1OTZc BG5G)h literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/meta.json b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/meta.json new file mode 100644 index 00000000000..61c5b77862c --- /dev/null +++ b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Edited by Mocho from the original tgstation sprites taken at commit https://github.com/tgstation/tgstation/commit/c7e14784b35b1a136351c396d3a546f461ee2451", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "righthand_0" + }, + { + "name": "righthand_1" + }, + { + "name": "righthand_2" + }, + { + "name": "righthand_3" + }, + { + "name": "righthand_4" + }, + { + "name": "righthand_5" + }, + { + "name": "righthand_6" + }, + { + "name": "righthand_7" + }, + { + "name": "righthand_8" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_0.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a69056bb651613cf0373d6463343d5a1a77732ec GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z$Oe?FXU+X#I@Ja!$XpWS7tHYgze~V1MIcwf)5S5wqBl7~f^{*2uz``GP>_QIt0OB< g56ctxg9n%yRO=apt55Wa1JyEky85}Sb4q9e0E{OhtN;K2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e14168b2e7d274acd23f5bd8ac0ffcc7b3bdf673 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z1jR8-UcvC|7`p{fkhvttFPP!~f0ux3ia@S{r;B5VMQ?I~1nXi3VFM#Wp&$nbR!3Hz g9+oHW2M;hasMa$GSD)w;2dZW8boFyt=akR{0D@;Ch5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b12b15e883b39f3f0b24ee9dfb8ea87d3c2a0deb GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#04>|n9LAUah@9}$XpWS7tHYgze~V1MIcwf)5S5wqBl7~f^{*2uz``GP>_QIt0OB< g56ctxg9n%yRO=apt55Wa1JyEky85}Sb4q9e0BRBEak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!06|3|t^fc4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_4.png new file mode 100644 index 0000000000000000000000000000000000000000..4afd3e7f53131f6cc8a2439b08eed334157435a3 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#3?bXuwm#i?SBLmWG)Hv3ugHL-zDIhB9N=#>Eak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!0A($XpWS7tHYgze~V1MIcwf)5S5wqBl7~f^{*2uz``GP>_QIt0OB< g56ctxg9n%yRO=apt55Wa1JyEky85}Sb4q9e08n!w=>Px# literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_6.png new file mode 100644 index 0000000000000000000000000000000000000000..87e8f18ef82614f9b10061639b22fd21f04193f2 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=#>Eak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!09L#q`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_7.png new file mode 100644 index 0000000000000000000000000000000000000000..87e8f18ef82614f9b10061639b22fd21f04193f2 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=#>Eak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!09L#q`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/righthand.rsi/righthand_8.png new file mode 100644 index 0000000000000000000000000000000000000000..797e0683e8b2b453220a4df0e6ae10ba30836206 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`S#U|I}ei(k> r$eA-8_gTc4xFjSvBMiCNQ z#W5tpJvl*wb+Mv>6cZYuY|A3y$;oiD;nV+^psWI2^X00Om&nhK^;u%Uux#4Q=IJuI z5nm@fWtiZ3f8O0iUCJlQ7(#Q{rHo!NWVJq7VF@&?#F>FX)0yqo?d7cbK>HXxUHx3v IIVCg!0E0I)jsO4v literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..786b0777c38cc7425ad85f8ca833f6798ccbce1c GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1jR8-Ucs|n9Q(u8N-$0A|9YPOG%JlFvI`<|2OM8bO8DCo-U3d7QM*{60D08J}|kdsi`q> j&EV8ZkjY?m7H42E+rXg1_{^gasFcCe)z4*}Q$iB}Iz%Jo literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9690690d72a2be8182a5b4fde5ffaac6c252e4 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#5pjmC}h}M$M8{N{wJU~OG%JlFvI`<|2OM8bO8DCo-U3d7QM*{60D08J}|kdsi`q> j&EV8ZkjY?m7H42E+rXg1_{^gasFcCe)z4*}Q$iB}S$rg3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ec62ccb0627d4b41348a43414fd1307746a28a83 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#3?bXuwmHi#IV8bt}#%Yr6kBNnBo8b|C@CkI)Hq6PZ!4!i{9h}3D(64ADGgTe~DWM4f16?CK literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_5.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d30e124e64d0a0410302091ffcc642193a22e52b GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#IZ1}U}xCN#&CA`))JsNOG%JlFvI`<|2OM8bO8DCo-U3d7QM*{60D08J}|kdsi`q> j&EV8ZkjY?m7H42E+rXg1_{^gasFcCe)z4*}Q$iB}2sk5G literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_6.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4ee1f90383d727ece0ef7e402bfc181671a459 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z=;`SN2M5Q+#eH#KZweG=DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i2PQW)H8m!# j8Jt=PG8wGS;tULC8yIvLpLrAll`?p``njxgN@xNA8!sb{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_7.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4ee1f90383d727ece0ef7e402bfc181671a459 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z=;`SN2M5Q+#eH#KZweG=DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i2PQW)H8m!# j8Jt=PG8wGS;tULC8yIvLpLrAll`?p``njxgN@xNA8!sb{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/rightleg.rsi/rightleg_8.png new file mode 100644 index 0000000000000000000000000000000000000000..70ccb309add238bae2e54d34edc459ea25e12070 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|L<4+6Tp9i| z=;`SN2M3>EU|7Jw5EmEspMk;P^3h_T0``(1zhH*{V6e1)*>9kbj;D)bh(&L5f&}a0 zgbz$^YH4bFxFTjm%=|d}z?oAX2e{1sa5aQ&2uM46ft4Zf7=z2<%H0A$eGHzielF{r G5}E+?-ZjSn literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/meta.json b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/meta.json new file mode 100644 index 00000000000..7baeebd0801 --- /dev/null +++ b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Edited by Mocho from the original tgstation sprites taken at commit https://github.com/tgstation/tgstation/commit/c7e14784b35b1a136351c396d3a546f461ee2451", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "torso_0" + }, + { + "name": "torso_1" + }, + { + "name": "torso_2" + }, + { + "name": "torso_3" + }, + { + "name": "torso_4" + }, + { + "name": "torso_5" + }, + { + "name": "torso_6" + }, + { + "name": "torso_7" + }, + { + "name": "torso_8" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_0.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b20ce001ba61861a3aa92b565589686fd607802f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z$Oe?FXU)|rTBV%O-?XRoK2VCaB*-tA;Xe?_Tu=jFVdQ&MBb@0LMEl AQ~&?~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_1.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_1.png new file mode 100644 index 0000000000000000000000000000000000000000..591b6a5bab5ae843376516c4b6ec7ff84745a0f7 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z1jR8-Ucsa)Jb_2}6&M!hw!x zMqy(PgNI=Uco;=yICwBBhcNnu3xybPwb?Q-Sl2PM?z*#lK2Rrvr>mdKI;Vst0HK&G A<^TWy literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_2.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_2.png new file mode 100644 index 0000000000000000000000000000000000000000..71f09fc7f6b9bd060464f2194375919c69f0f400 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#04>|n9Q(u8AE9bL*Z9>518F~p)bIYENegrUbr;Xp?; zqp&fD!NafvJd7eU96T76Lm2(Sg+dIt+H4sZtm_zBcimY&AE=YT)78&qol`;+0BA}p AJOBUy literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_3.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9f954321ca062b2e99e196306e10b6c1ef3e71 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#5pjmC}h}M$586WFrj3}JD?P6NswPK!+#)8F~p)bIYENegrUbr;Xp?; zqp&fD!NafvJd7eU96T76Lm2(Sg+dIt+H4sZtm_zBcimY&AE=YT)78&qol`;+0Ep%* ArvLx| literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_4.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ada865a05feb185577dd430bd00969d23bfcd6aa GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#3?bXuwmHi#89fqkYf4b3{Z--B*-tA;Xe?_Tu=jFVdQ&MBb@03{$Q Ang9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_5.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_5.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3a6ad7d0e9c1c43f6ed6e0beb727b9aebedead GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#IZ1}U}xCN#!$+_5dY3i6ez`7666=m@E-_dE~tS_((`n246*1pF(kU3Zqx2kK<-boFyt=akR{0H;nV AJpcdz literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_6.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_6.png new file mode 100644 index 0000000000000000000000000000000000000000..c289a454bdb5a9074999e863762f2703f3d301bc GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`SN2M5Q+#aUTdU7P=w6)448666=m@E-_dE~tS_((`n246*1pF(kU3Zqx2kK<-boFyt=akR{07$AT A`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_7.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c289a454bdb5a9074999e863762f2703f3d301bc GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`SN2M5Q+#aUTdU7P=w6)448666=m@E-_dE~tS_((`n246*1pF(kU3Zqx2kK<-boFyt=akR{07$AT A`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_8.png b/Resources/Textures/_Shitmed/Interface/Targeting/Status/torso.rsi/torso_8.png new file mode 100644 index 0000000000000000000000000000000000000000..eefec17cf6057f69452a6cb4da15774d87e6ad7d GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|Bm#UwTp9i| zEMQ;=4h}xSz@Vq6_n(0wE-uc>%1Yy=`evXSj*=k1V21w?aP?G(5m3y=)5S5wqBl7~ zg4Kkf$H(W4kB`m{QG<<}Hg4Qx_%MuN5}VQ;t{DflW}MvKG?6ohH7|UV!`cIndjk#5 aFfwR`GrXC!cS0-B90pHUKbLh*2~7YCBs|Li literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Misc/Pizza/parts.rsi/l_arm.png b/Resources/Textures/_Shitmed/Mobs/Species/Misc/Pizza/parts.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..d2838e8b7d4224fcd118e2980b1b694ba6091fe7 GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChBd@pN$vsfc@fYri+Mp$Pkj@Pqaa=7q%~N6#KSx-dZGpkw#sCee$r?&5`I zpZQ-rc%UG{&MqjkMPX5F*Y%(e*Ok^zc9xY{tUvu!<&~n`xRwLonV(L2{q>^Fq}`Wn zn1J>%DE^+Ue9FXiXV>lYzNA@O)2nRe3I5$A)Bkvv!n_8tue+2cv8=SH7xZ^XOH|5v zBNtU)`L9Nq!}-qJO4KFFM(J^R5u)uop{KNbmDUb4T`$BO$_>~Wy( zmt94hSe9*nAN;=ies-Di^4|v?Z7&9O`2Ssau&!#wlv11GQ}(aSmS3@Yc|A7GVddhS z+bSO_>-N`eTND4s^7FL+6(5$(^w@s=cELB1AF6Xrds}wxy?5xp3dpNa;Lzjywc~qz z_wBI$in$F-q}R=@nBDNgZ52>-I%fypy=_%TcC#GWej&G0-61KqOexk@XDI+|85 zZkFHtzqz@oIY1_+L^zNo_Q*D|KT%z!n=XjG5!?BA)z;ieyHyUwR@QkJ{e84o{Uz(9 z=|KA!4jjD~wO_St>$0fy**C1J?E0dQzF95tviIuASEA10>lh<;vMTr0*xuYF%lyE8 zQ|*E8$(xmHR`1T5`*Vt_Xj3l3o6{?Qil55UyL7yIUY?Qa$G&?JbJxVVskJO)ydw8= z`(%~-vrg%@v@!f>*Wa%(b>@PF2eW7SiNCa|JTERTyum7R@76g^8C7gg&T%F6R|s63 znRsjOf(aF#*=zj5)~~T=+%V}>@}@hu zS2i4a9qzK)yC&z>lhqM-Cpx+IyfI}7;It1qe@>9DboFyt=akR{00tQgI{*Lx literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png new file mode 100644 index 0000000000000000000000000000000000000000..f66bf6cdf9eb1aea9b77e8819b3f0cd71609ab3b GIT binary patch literal 432 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_openpanel.png b/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_openpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..cc174c7d8b9612da38c3952579702f93c9c01961 GIT binary patch literal 3981 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_unfill.png b/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/limbgrower_unfill.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa57f247e2a662abf1fa970c6cc3a0d8688aff1 GIT binary patch literal 9104 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 HE(!k!t;RL{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/meta.json b/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/meta.json new file mode 100644 index 00000000000..1b5f86463ff --- /dev/null +++ b/Resources/Textures/_Shitmed/Structures/Machines/limbgrower.rsi/meta.json @@ -0,0 +1,85 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at commit 85c26c1", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "limbgrower_fill", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_unfill", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_openpanel", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_idleoff", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "limbgrower_idleon", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_panelopen" + } + ] +} diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 882d74c6503..7b1ff4b54f2 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -69,25 +69,32 @@ binds: - function: ShuttleBrake type: State key: Space -# Camera +# Camera - Shitmed Change Start - function: CameraRotateLeft type: State key: NumpadNum7 + mod1: Control - function: CameraRotateRight type: State key: NumpadNum9 + mod1: Control - function: CameraReset type: State key: NumpadNum8 + mod1: Control - function: ZoomOut type: State key: NumpadNum4 + mod1: Control - function: ZoomIn type: State key: NumpadNum6 + mod1: Control - function: ResetZoom type: State key: NumpadNum5 + mod1: Control +# Shitmed Change End # Misc - function: ShowEscapeMenu type: State From e51a0fc0da7b68c36f2a1ecd4a2a41ae0fe5e2c2 Mon Sep 17 00:00:00 2001 From: Verm <32827189+Vermidia@users.noreply.github.com> Date: Mon, 19 Aug 2024 23:20:12 -0500 Subject: [PATCH 07/40] Mothroaches can now wear hamster-wearable clothes + pet inventory tweaks (#28956) * moth displacement + inventory tweaks * Fix off by 1 on the head sprites * Move files to main mothroach folder * Fix mask up a bit * Fix side mask sprites * Change format because it changed forever ago --- .../Catalog/Cargo/cargo_livestock.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 39 +++++++++++++++++- .../hamster_inventory_template.yml | 7 ++-- .../pet_inventory_template.yml | 5 +-- .../mothroach/displacement.rsi/eyes.png | Bin 0 -> 308 bytes .../mothroach/displacement.rsi/head.png | Bin 0 -> 703 bytes .../mothroach/displacement.rsi/mask.png | Bin 0 -> 731 bytes .../mothroach/displacement.rsi/meta.json | 35 ++++++++++++++++ .../mothroach/displacement.rsi/neck.png | Bin 0 -> 324 bytes .../displacement.rsi/suitstorage.png | Bin 0 -> 672 bytes .../mothroach.rsi/0-equipped-HELMET.png | Bin .../{ => mothroach}/mothroach.rsi/icon.png | Bin .../mothroach.rsi/inhand-left.png | Bin .../mothroach.rsi/inhand-right.png | Bin .../{ => mothroach}/mothroach.rsi/meta.json | 0 .../mothroach.rsi/mothroach-moving.png | Bin .../mothroach.rsi/mothroach.png | Bin .../mothroach.rsi/mothroach_dead.png | Bin .../mothroach.rsi/mothroach_lazy.png | Bin .../mothroach.rsi/mothroach_sleep.png | Bin 20 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/head.png create mode 100644 Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/mask.png create mode 100644 Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/neck.png create mode 100644 Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/suitstorage.png rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/0-equipped-HELMET.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/icon.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/inhand-left.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/inhand-right.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/meta.json (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/mothroach-moving.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/mothroach.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/mothroach_dead.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/mothroach_lazy.png (100%) rename Resources/Textures/Mobs/Animals/{ => mothroach}/mothroach.rsi/mothroach_sleep.png (100%) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml index f44cb61f737..667b83ec3fd 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml @@ -221,7 +221,7 @@ - type: cargoProduct id: LivestockMothroach icon: - sprite: Mobs/Animals/mothroach.rsi + sprite: Mobs/Animals/mothroach/mothroach.rsi state: mothroach product: CrateNPCMothroach cost: 5000 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index d09108d179d..63c086effdc 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -475,7 +475,7 @@ insertingState: inserting_mothroach - type: MothAccent - type: Sprite - sprite: Mobs/Animals/mothroach.rsi + sprite: Mobs/Animals/mothroach/mothroach.rsi layers: - map: ["enum.DamageStateVisualLayers.Base", "movement"] state: mothroach @@ -490,7 +490,7 @@ size: Normal - type: Clothing quickEquip: false - sprite: Mobs/Animals/mothroach.rsi + sprite: Mobs/Animals/mothroach/mothroach.rsi equippedPrefix: 0 slots: - HEAD @@ -573,6 +573,41 @@ - type: FireVisuals sprite: Mobs/Effects/onfire.rsi normalState: Mouse_burning + - type: Strippable + - type: UserInterface + interfaces: + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface + - type: InventorySlots + - type: Inventory + speciesId: hamster + templateId: hamster + displacements: + head: + sizeMaps: + 32: + sprite: Mobs/Animals/mothroach/displacement.rsi + state: head + mask: + sizeMaps: + 32: + sprite: Mobs/Animals/mothroach/displacement.rsi + state: mask + suitstorage: + sizeMaps: + 32: + sprite: Mobs/Animals/mothroach/displacement.rsi + state: suitstorage + eyes: + sizeMaps: + 32: + sprite: Mobs/Animals/mothroach/displacement.rsi + state: eyes + neck: + sizeMaps: + 32: + sprite: Mobs/Animals/mothroach/displacement.rsi + state: neck # 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 diff --git a/Resources/Prototypes/InventoryTemplates/hamster_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/hamster_inventory_template.yml index 3170417d9d7..f48ae94e692 100644 --- a/Resources/Prototypes/InventoryTemplates/hamster_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/hamster_inventory_template.yml @@ -15,7 +15,7 @@ slotTexture: neck slotFlags: NECK uiWindowPos: 0,1 - strippingWindowPos: 1,0 + strippingWindowPos: 0,1 displayName: Neck whitelist: tags: @@ -24,7 +24,7 @@ slotTexture: glasses slotFlags: EYES stripTime: 3 - uiWindowPos: 0,1 + uiWindowPos: 0,2 strippingWindowPos: 0,0 displayName: Eyes whitelist: @@ -33,9 +33,8 @@ - name: suitstorage slotTexture: suit_storage slotFlags: SUITSTORAGE - slotGroup: SecondHotbar stripTime: 3 - uiWindowPos: 2,0 + uiWindowPos: 1,0 strippingWindowPos: 2,5 displayName: Suit Storage whitelist: diff --git a/Resources/Prototypes/InventoryTemplates/pet_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/pet_inventory_template.yml index 1297b65d8d9..e6c2984221a 100644 --- a/Resources/Prototypes/InventoryTemplates/pet_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/pet_inventory_template.yml @@ -4,7 +4,7 @@ - name: mask slotTexture: mask slotFlags: MASK - uiWindowPos: 1,0 + uiWindowPos: 0,2 strippingWindowPos: 1,1 displayName: Mask whitelist: @@ -14,9 +14,8 @@ - name: suitstorage slotTexture: suit_storage slotFlags: SUITSTORAGE - slotGroup: SecondHotbar stripTime: 3 - uiWindowPos: 2,0 + uiWindowPos: 0,1 strippingWindowPos: 2,5 displayName: Suit Storage whitelist: diff --git a/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/eyes.png b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb7e553b6ed9d0251cb83b4fbb88f2ed109889b GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|-g&w>hE&XX zdu=0Evw?`)!|a!L%=KJrUhBPmcS%A^Ui`nYrG$-Tr{d|?k@I&MnCmX^WI(|Nr*~c5 zl(+TG{QgZPyE*%OzMPm7#WExI?yCESQGb{=cbgckb8WaOYXG8*L3%Rzopr0FAnD4gdfE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/head.png b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..d77878fdcc45e6870c6723d5fa0f58883e78eccd GIT binary patch literal 703 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>Y-x3^QF z$Z`9uRQ|;a+dA5;BTO_r98KCB^{y>oi`1>EWwq1$uBEuv(YyJAz}7EPzxcCwqqv(E za41R5uGUrDUK|?WbpC1i`S$nkYxtkf^MuplUjq)TU*mRN)A)P4+Twyy*cJ{ zRF_Bw{J3`MacSLVi`eJ--CsR27~h2XtKL2IQ7p{3%CExf#@y4>t{k(uHhssWpHnwH zF|>Rv(Zcb-UD2=8caz9RuXCr*-TGZ)df$lkQ^z3=gf_KhalV|UcZ&b9Ow9f1T3%4WGC9b8 z%SZOtf*A~~sxLW#AKHk75G+7{BSmoMDo(|gy4PD1v zHwa#P`M6xvb;A4ky`HoDs=88|*ZJw6f6TCjp_lmrlL?;#_XP_E-4D9OVY4;|{oFZK zl+UkYMYrE>`;F8~OL$lJ$TCvsO7RP%{b10yJZ-&t;lxw_feDkr)78&qol`;+ E01W;zzW@LL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/mask.png b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/mask.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb6ea0163df86c6cbab0be09430e19b7656aa8e GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d>Qb`Ho)PG(@xm{>Y-xA)-y zkz@7O)a}?sU1W?_SVRc0zSIzXvxskN)B2^onc6CbD!NMRn!242I+lDi{UQHCYljv` zlTwF;)$b^mM?05YQ2N$3`}5=7->v7=G+tP;GCJ<8L`2!S-s6jI-TBiL_TNdCw?t^6 z>B{PJSI)RJb-n)Frxluicvbk*>i_GOr5?V#aFt_4Nco*P8+;Bwi8>d!NB7Rc^vS0W zwI6C;$D>iR^h?Nr^IgV_`?br2KNfPVoENpMCpdLYdaQSa!;b4lpQ{SxzN(&Wv$a;< z8ePUOSD55-(PLsd>tvb4mD^Ij?azO4-TdsTijqp}HIKWLox}DtFM76gwW6u+F2(+n zyH5ShpBGn^V)5dhOzSQ6`}MDzf64yP`|;dZm9lW^+e>Sz}|pMRs0Kb zh0p1EM`ekh+rHrSLC;+$<5xzNY0PcA9-J|={hM?~49_O5dBsKioxDF?uW#7S|F>v= z?n`!4vkawezlwmt'?;uumf=j{wfz9s_^*67r?y`np|ald8~_ieuQ|FV_IK2IMX z7Hgk{O&`m6H6=RFo&V;M{`y6(<;KIGH5haq7Bg&N=w-UVWWwdZT@g85;Ckxr_owbh zcP_rmc}?cUo-6W~Q>5n|wA%gi+x;Y-Le7Y^E4$`vJ5=p0O4>00-`0xt?`QqJlkV{I z>^e;=hII_@H}y#*c9mdKI;Vst0QCGvIsgCw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/meta.json b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/meta.json new file mode 100644 index 00000000000..30fcee2998e --- /dev/null +++ b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Vermidia", + "size": { + "x": 32, + "y": 32 + }, + "load": { + "srgb": false + }, + "states": [ + { + "name": "head", + "directions": 4 + }, + { + "name": "mask", + "directions": 4 + }, + { + "name": "suitstorage", + "directions": 4 + }, + { + "name": "eyes", + "directions": 4 + }, + { + "name": "neck", + "directions": 4 + } + ] +} + diff --git a/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/neck.png b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/neck.png new file mode 100644 index 0000000000000000000000000000000000000000..c503f75e1d2e7ca9ee4a68d7f200d432ebec0060 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|{&~7MhE&XX zJKd41*+787{Alw2J7OPiw|=`Iw`6+SVk4b%4G$D2opf=%{a0-L4Ts-yi*shxuZd{6)Y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/suitstorage.png b/Resources/Textures/Mobs/Animals/mothroach/displacement.rsi/suitstorage.png new file mode 100644 index 0000000000000000000000000000000000000000..b37a81363fc85e7526f0d321a6fab397536be710 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>Y-x3^QF z$Z`9uRQ|;a+dA5;BTO_r98KCB^{y>oi`1>EWwq1$uBEuv(YyJAz}7EPzxcCwqqv(E za41R5uGUrDUK|?WbpC1i`S$nkYxtkf^MuplUjq)TU*mRN)A)P4+Twyy*cJ{ zRF_Bw{J3`MacSLVi`eJ--CsR27~h2XtKL2IQ7p{3%CExf#@y4>t{k(uHhssWpHnwH zF|>Rv(Zcb-UD2=8caz9RuXCr*-TGZ)df$lkQ^z3=gf_KhalV|UcZ&b9Ow9f1T3%4WGC9b8 z%SZOtf*A~~sxLW#5%AX2#WAE}&fDo51)Cjs4*aonOPVV(vn5%G>)J`bCCfKuwls%a zEI9G#XZ5j7#{~JGxpH5SXb@Xq$e`ITMB|C#?}{0{gvz W8i6x^I~oB!&fw|l=d#Wzp$P!H-XfU* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/0-equipped-HELMET.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/0-equipped-HELMET.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/0-equipped-HELMET.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/0-equipped-HELMET.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/icon.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/icon.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/icon.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/icon.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/inhand-left.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/inhand-left.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/inhand-left.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/inhand-right.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/inhand-right.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/inhand-right.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/meta.json b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/meta.json rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/meta.json diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach-moving.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach-moving.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach-moving.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach-moving.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach_dead.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach_dead.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach_dead.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach_dead.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach_lazy.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach_lazy.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach_lazy.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach_lazy.png diff --git a/Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach_sleep.png b/Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach_sleep.png similarity index 100% rename from Resources/Textures/Mobs/Animals/mothroach.rsi/mothroach_sleep.png rename to Resources/Textures/Mobs/Animals/mothroach/mothroach.rsi/mothroach_sleep.png From a9bc9cca49ec20d7b919d285c9efbd9be0d4be79 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Fri, 27 Dec 2024 16:49:23 +0000 Subject: [PATCH 08/40] update mothroach spawner icon --- .../Prototypes/Nyanotrasen/Entities/Markers/Spawners/mobs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/mobs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/mobs.yml index 6bc5c8e878a..9ff3915362e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/mobs.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/mobs.yml @@ -6,7 +6,7 @@ - type: Sprite layers: - state: green - - sprite: Mobs/Animals/mothroach.rsi + - sprite: Mobs/Animals/mothroach/mothroach.rsi state: mothroach - state: ai - type: ConditionalSpawner From 38da68a741ff4a9708260411f8f43f2d97d46105 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:36:48 +0000 Subject: [PATCH 09/40] surgery update (animal and moth surgery) (#882) * dont allow attaching invalid limbs * add more surgeries for organs and limbs * fix harpies being immune to surgery * update organs and shit * make a bunch of animals operatable * malf ai * fix slime --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Body/Systems/SharedBodySystem.Parts.cs | 12 +++ .../SurgeryPartRemovedConditionComponent.cs | 8 +- .../_Shitmed/Surgery/SharedSurgerySystem.cs | 6 ++ .../Prototypes/Body/Organs/Animal/animal.yml | 20 ++++ Resources/Prototypes/Body/Organs/arachnid.yml | 43 +++++++- Resources/Prototypes/Body/Organs/diona.yml | 20 +++- Resources/Prototypes/Body/Organs/moth.yml | 1 + Resources/Prototypes/Body/Organs/slime.yml | 2 + Resources/Prototypes/Body/Organs/vox.yml | 1 + .../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 + .../DeltaV/Entities/Mobs/Species/harpy.yml | 2 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 39 ++++++- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 5 + .../Entities/Mobs/NPCs/regalrat.yml | 10 ++ .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 5 + .../_Goobstation/Body/Parts/animal.yml | 10 ++ .../_Shitmed/Entities/Surgery/surgeries.yml | 101 ++++++++++++++++++ .../Entities/Surgery/surgery_steps.yml | 7 ++ 28 files changed, 300 insertions(+), 10 deletions(-) create mode 100644 Resources/Prototypes/_Goobstation/Body/Parts/animal.yml diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index 0930ac41ae5..eed0c897728 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -565,6 +565,18 @@ public bool CanAttachPart( && Containers.CanInsert(partId, container); } + ///

+ /// GoobStation: 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); + } + public bool AttachPartToRoot( EntityUid bodyId, EntityUid partId, diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs index f0dfc554e0e..0d0dbbfc39b 100644 --- a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs @@ -6,9 +6,15 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; [RegisterComponent, NetworkedComponent] public sealed partial class SurgeryPartRemovedConditionComponent : Component { + /// + /// GoobStation: 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/_Shitmed/Surgery/SharedSurgerySystem.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs index c4c13fbc1cb..e07630e8d72 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs @@ -171,6 +171,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/Resources/Prototypes/Body/Organs/Animal/animal.yml b/Resources/Prototypes/Body/Organs/Animal/animal.yml index e59aad9da3f..a5d964a5240 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 # GoobStation - type: Lung - type: Metabolizer removeEmpty: true @@ -73,6 +74,7 @@ - type: Sprite state: stomach - type: Organ + slotId: stomach # GoobStation - type: SolutionContainerManager solutions: stomach: @@ -116,12 +118,19 @@ - type: Sprite state: liver - type: Organ + slotId: liver # GoobStation - type: Metabolizer maxReagents: 1 metabolizerTypes: [ Animal ] groups: - id: Alcohol rateModifier: 0.1 + - type: Liver # GoobStation + - type: Tag # goob edit + tags: + - Meat + - Organ + - Liver - type: Item size: Small heldPrefix: liver @@ -135,6 +144,7 @@ - type: Sprite state: heart-on - type: Organ + slotId: heart # GoobStation - type: Metabolizer maxReagents: 2 metabolizerTypes: [ Animal ] @@ -142,9 +152,18 @@ - id: Medicine - id: Poison - id: Narcotic +<<<<<<< HEAD - type: Item size: Small heldPrefix: heart +======= + - type: Heart # GoobStation + - type: Tag # goob edit + tags: + - Meat + - Organ + - Heart +>>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) - type: entity id: OrganAnimalKidneys @@ -157,6 +176,7 @@ - state: kidney-l - state: kidney-r - type: Organ + slotId: kidneys # GoobStation - type: Metabolizer maxReagents: 5 metabolizerTypes: [ Animal ] diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index c7542ae1118..1a610f18514 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -34,9 +34,8 @@ - type: Sprite sprite: Mobs/Species/Arachnid/organs.rsi state: stomach - - type: Item - size: Small - heldPrefix: stomach + - type: Organ # GoobStation + slotId: stomach - type: Stomach updateInterval: 1.5 - type: SolutionContainerManager @@ -50,6 +49,9 @@ Quantity: 5 - type: Metabolizer updateInterval: 1.5 + - type: Item + size: Small + heldPrefix: stomach - type: entity id: OrganArachnidLungs @@ -61,6 +63,8 @@ layers: - state: lung-l - state: lung-r + - type: Organ # GoobStation + slotId: lungs - type: Lung - type: Metabolizer updateInterval: 1.5 @@ -105,6 +109,17 @@ - id: Medicine - id: Poison - id: Narcotic +<<<<<<< HEAD +======= + - type: Organ # GoobStation + slotId: heart + - type: Heart # GoobStation: Lets you transplant spider hearts into other species + - type: Tag # goob edit + tags: + - Meat + - Organ + - Heart +>>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) - type: entity id: OrganArachnidLiver @@ -125,6 +140,17 @@ groups: - id: Alcohol rateModifier: 0.1 # removes alcohol very slowly along with the stomach removing it as a drink +<<<<<<< HEAD +======= + - type: Organ # GoobStation + slotId: liver + - type: Liver # GoobStation + - type: Tag # goob edit + tags: + - Meat + - Organ + - Liver +>>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) - type: entity id: OrganArachnidKidneys @@ -157,9 +183,20 @@ layers: - state: eyeball-l - state: eyeball-r +<<<<<<< HEAD - type: Item size: Small heldPrefix: eyeballs +======= + - type: Organ # GoobStation + slotId: eyes + - type: Eyes # GoobStation + - type: Tag # goob edit + tags: + - Meat + - Organ + - Eyes +>>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) - type: entity id: OrganArachnidTongue diff --git a/Resources/Prototypes/Body/Organs/diona.yml b/Resources/Prototypes/Body/Organs/diona.yml index bf865a07fd9..45d8e4d533a 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: Organ # GoobStation + slotId: Brain + - type: Brain # GoobStation - type: SolutionContainerManager solutions: organ: @@ -62,6 +65,13 @@ layers: - state: eyeball-l - state: eyeball-r + - type: Organ # GoobStation + slotId: eyes + - type: Tag # goob edit + tags: + - Meat + - Organ + - Eyes - type: entity id: OrganDionaStomach @@ -80,6 +90,8 @@ reagents: - ReagentId: UncookedAnimalProteins Quantity: 5 + - type: Organ # GoobStation + slotId: stomach - type: Stomach - type: Metabolizer maxReagents: 6 @@ -105,9 +117,8 @@ components: - type: Sprite state: lungs - - type: Item - size: Small - heldPrefix: lungs + - type: Organ # GoobStation + slotId: lungs - type: Lung - type: Metabolizer removeEmpty: true @@ -127,6 +138,9 @@ Lung: maxVol: 100 canReact: False + - type: Item + size: Small + heldPrefix: lungs # Organs that turn into nymphs on removal - type: entity diff --git a/Resources/Prototypes/Body/Organs/moth.yml b/Resources/Prototypes/Body/Organs/moth.yml index bad1149fd42..4c9c47d13a5 100644 --- a/Resources/Prototypes/Body/Organs/moth.yml +++ b/Resources/Prototypes/Body/Organs/moth.yml @@ -2,6 +2,7 @@ id: OrganMothStomach parent: [OrganAnimalStomach, OrganHumanStomach] categories: [ HideSpawnMenu ] + name: moth stomach # GoobStation components: - type: Stomach specialDigestible: diff --git a/Resources/Prototypes/Body/Organs/slime.yml b/Resources/Prototypes/Body/Organs/slime.yml index ca22d25423c..daabdcc716f 100644 --- a/Resources/Prototypes/Body/Organs/slime.yml +++ b/Resources/Prototypes/Body/Organs/slime.yml @@ -49,6 +49,8 @@ layers: - state: lung-l-slime - state: lung-r-slime + - type: Organ # GoobStation + 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..4036ae011dc 100644 --- a/Resources/Prototypes/Body/Organs/vox.yml +++ b/Resources/Prototypes/Body/Organs/vox.yml @@ -3,6 +3,7 @@ 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" + name: vox lungs # GoobStation components: - type: Sprite sprite: Mobs/Species/Vox/organs.rsi diff --git a/Resources/Prototypes/Body/Prototypes/arachnid.yml b/Resources/Prototypes/Body/Prototypes/arachnid.yml index a3caa42a6eb..7036d7babf8 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 # GoobStation right arm: part: RightArmArachnid connections: diff --git a/Resources/Prototypes/Body/Prototypes/diona.yml b/Resources/Prototypes/Body/Prototypes/diona.yml index 12ca203988c..691f055ff43 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 # GoobStation organs: stomach: OrganDionaStomachNymph lungs: OrganDionaLungsNymph diff --git a/Resources/Prototypes/Body/Prototypes/dwarf.yml b/Resources/Prototypes/Body/Prototypes/dwarf.yml index 592492688b7..a580a02531b 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 # GoobStation organs: heart: OrganDwarfHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/gingerbread.yml b/Resources/Prototypes/Body/Prototypes/gingerbread.yml index d5355be6412..eaf6cf06da7 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 # GoobStation organs: heart: OrganHumanHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/human.yml b/Resources/Prototypes/Body/Prototypes/human.yml index 61bd14360c5..8b601530a9d 100644 --- a/Resources/Prototypes/Body/Prototypes/human.yml +++ b/Resources/Prototypes/Body/Prototypes/human.yml @@ -18,6 +18,7 @@ - left arm - right leg - left leg + - head # GoobStation organs: heart: OrganHumanHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/moth.yml b/Resources/Prototypes/Body/Prototypes/moth.yml index b3271834417..7bd7f0774c3 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 # GoobStation right arm: part: RightArmMoth connections: diff --git a/Resources/Prototypes/Body/Prototypes/primate.yml b/Resources/Prototypes/Body/Prototypes/primate.yml index 2af9273be4c..3b34fcab2ec 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: # GoobStation: put pun pun into a humans body + part: HeadAnimal + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes torso: part: TorsoAnimal connections: - hands - legs + - head # GoobStation organs: lungs: OrganAnimalLungs stomach: OrganAnimalStomach diff --git a/Resources/Prototypes/Body/Prototypes/reptilian.yml b/Resources/Prototypes/Body/Prototypes/reptilian.yml index 1e9ebd54a48..234351059c4 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 # GoobStation right arm: part: RightArmReptilian connections: diff --git a/Resources/Prototypes/Body/Prototypes/skeleton.yml b/Resources/Prototypes/Body/Prototypes/skeleton.yml index 16d08365610..f622c133aaf 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 # GoobStation right arm: part: RightArmSkeleton connections: diff --git a/Resources/Prototypes/Body/Prototypes/slime.yml b/Resources/Prototypes/Body/Prototypes/slime.yml index b57c5eceb44..ff7d9d62d62 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 # GoobStation organs: core: SentientSlimeCore lungs: OrganSlimeLungs diff --git a/Resources/Prototypes/Body/Prototypes/vox.yml b/Resources/Prototypes/Body/Prototypes/vox.yml index 2a1f6d9dca7..54f66af81ba 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 # GoobStation organs: heart: OrganHumanHeart lungs: OrganVoxLungs diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index 54af2dc1936..7bba170657b 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -30,6 +30,8 @@ type: HumanoidMarkingModifierBoundUserInterface enum.StrippingUiKey.Key: type: StrippableBoundUserInterface + enum.SurgeryUIKey.Key: # GoobStation + type: SurgeryBui - type: Sprite scale: 0.9, 0.9 layers: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 63c086effdc..ac0a4b79b48 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -560,6 +560,7 @@ - Mouse - type: Body prototype: Mothroach + - type: SurgeryTarget # GoobStation - type: TypingIndicator proto: moth - type: Destructible @@ -578,6 +579,8 @@ interfaces: enum.StrippingUiKey.Key: type: StrippableBoundUserInterface + enum.SurgeryUIKey.Key: # GoobStation + type: SurgeryBui - type: InventorySlots - type: Inventory speciesId: hamster @@ -866,6 +869,11 @@ - Passive - type: Body prototype: AnimalRuminant + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: HTN rootTask: task: RuminantCompound @@ -943,6 +951,11 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: entity name: goat @@ -1031,6 +1044,11 @@ - Passive - type: Body prototype: AnimalRuminant + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: NPCRetaliation attackMemoryLength: 5 - type: FactionException @@ -1249,9 +1267,8 @@ abstract: true components: - type: CombatMode - #- type: SurgeryTarget - # canOperate: false - #- type: Targeting + - type: SurgeryTarget # GoobStation + - type: Targeting # GoobStation - type: Inventory templateId: monkey speciesId: monkey @@ -1306,6 +1323,12 @@ - type: Body prototype: Primate requiredLegs: 1 # TODO: More than 1 leg + - type: UserInterface # GoobStation: Add SurgeryUIKey on top of stripping ui + interfaces: + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: CreamPied - type: FireVisuals sprite: Mobs/Effects/onfire.rsi @@ -1620,6 +1643,11 @@ components: - type: Body prototype: Mouse + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: GhostRole makeSentient: true allowSpeech: true @@ -2307,6 +2335,11 @@ - type: CombatMode - type: Body prototype: AnimalHemocyanin + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: MobThresholds thresholds: 0: Alive diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 0957ec0c964..2695d84b63c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -251,6 +251,11 @@ - type: Body prototype: Bloodsucker requiredLegs: 1 + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: Butcherable spawned: - id: FoodMeatFish diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 19d6cafd7b1..931bf46a4ce 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -60,6 +60,11 @@ - type: Body prototype: Rat requiredLegs: 1 # TODO: More than 1 leg + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: Hunger # probably should be prototyped thresholds: Overfed: 200 @@ -244,6 +249,11 @@ - type: Body prototype: Rat requiredLegs: 1 # TODO: More than 1 leg + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: Hunger # probably should be prototyped thresholds: Overfed: 200 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 09a58facd76..37c1b2612fc 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -93,6 +93,11 @@ - type: Body prototype: Slimes requiredLegs: 1 + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: MeleeWeapon altDisarm: false soundHit: diff --git a/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml b/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml new file mode 100644 index 00000000000..75985dfca30 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml @@ -0,0 +1,10 @@ +# 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 diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml index 7e52a0f2d65..7a3955e086a 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml @@ -76,6 +76,7 @@ - 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,9 +111,28 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: right arm part: Arm symmetry: Right +- 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: SurgeryAttachLeftLeg @@ -126,6 +147,7 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: left leg part: Leg symmetry: Left @@ -143,9 +165,28 @@ - type: SurgeryPartCondition part: Torso - type: SurgeryPartRemovedCondition + connection: right leg part: Leg symmetry: Right +- 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: SurgeryAttachLeftHand @@ -161,6 +202,7 @@ part: Arm symmetry: Left - type: SurgeryPartRemovedCondition + connection: left hand part: Hand symmetry: Left @@ -179,9 +221,28 @@ part: Arm symmetry: Right - type: SurgeryPartRemovedCondition + connection: right hand part: Hand symmetry: Right +- 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: SurgeryAttachLeftFoot @@ -197,6 +258,7 @@ part: Leg symmetry: Left - type: SurgeryPartRemovedCondition + connection: left foot part: Foot symmetry: Left @@ -215,6 +277,7 @@ part: Leg symmetry: Right - type: SurgeryPartRemovedCondition + connection: right foot part: Foot symmetry: Right @@ -432,6 +495,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/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index 870d1e81ffe..b4e32315448 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -434,6 +434,13 @@ sleepModifier: 1 isConsumable: true +- type: entity + parent: SurgeryStepInsertOrgan + id: SurgeryStepInsertStomach + name: Add stomach + categories: [ HideSpawnMenu ] + # no effect its just for minmaxing metabolism + - type: entity parent: SurgeryStepInsertOrgan id: SurgeryStepInsertLiver From 67b0a95b2f24d0ac7caf8493f887650a317299de Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 18 Nov 2024 00:23:43 +0000 Subject: [PATCH 10/40] add ghetto surgery real (#884) * move MatchstickComponent to shared * add Speed field to ISurgeryTool, add Tweezers and Tending tools * add support for ghetto surgery tools * use Tending and Tweezers for some steps * GHETTO SURGERY!!! * add qualities to fire axe * fix popups * :trollface: * disable coil hemostat * add examine verb for a tools uses * work# * round the speed to 2 decimal places * remove . * webedit ops * shitcode * undo breaking change * fix --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Client/Smoking/MatchstickSystem.cs | 5 ++ .../Light/Components/MatchstickComponent.cs | 29 --------- .../Light/EntitySystems/MatchboxSystem.cs | 1 + .../Light/EntitySystems/MatchstickSystem.cs | 18 +++-- Content.Shared/Body/Organ/OrganComponent.cs | 3 + Content.Shared/Body/Part/BodyPartComponent.cs | 3 + .../Smoking/Components/MatchstickComponent.cs | 28 ++++++++ .../Smoking/Systems/SharedMatchstickSystem.cs | 16 +++++ .../Surgery/SharedSurgerySystem.Steps.cs | 42 ++++++++---- .../Steps/SurgeryCanPerformStepEvent.cs | 4 +- .../Surgery/Tools/BoneGelComponent.cs | 5 +- .../Surgery/Tools/BoneSawComponent.cs | 4 +- .../Surgery/Tools/CauteryComponent.cs | 4 +- .../Surgery/Tools/HemostatComponent.cs | 4 +- .../Surgery/Tools/ISurgeryToolComponent.cs | 9 ++- .../Surgery/Tools/RetractorComponent.cs | 4 +- .../Surgery/Tools/ScalpelComponent.cs | 4 +- .../Surgery/Tools/SurgeryToolComponent.cs | 9 ++- .../Tools/SurgeryToolConditionsSystem.cs | 57 ++++++++++++++++ .../Surgery/Tools/SurgeryToolExamineSystem.cs | 65 +++++++++++++++++++ .../Surgery/Tools/SurgicalDrillComponent.cs | 4 +- .../Surgery/Tools/TendingComponent.cs | 15 +++++ .../Surgery/Tools/TweezersComponent.cs | 15 +++++ .../Locale/en-US/_Shitmed/surgery-tools.ftl | 10 +++ .../Entities/Objects/Materials/shards.yml | 7 ++ .../Prototypes/Entities/Objects/Misc/pen.yml | 7 ++ .../Entities/Objects/Misc/utensils.yml | 11 ++++ .../Objects/Specific/Hydroponics/tools.yml | 14 ++++ .../Objects/Specific/Medical/surgery.yml | 13 ++++ .../Entities/Objects/Tools/cable_coils.yml | 10 +++ .../Entities/Objects/Tools/crowbars.yml | 4 ++ .../Entities/Objects/Tools/lighters.yml | 7 ++ .../Entities/Objects/Tools/matches.yml | 7 ++ .../Entities/Objects/Tools/tools.yml | 22 +++++++ .../Entities/Objects/Tools/welders.yml | 7 ++ .../Weapons/Guns/Battery/battery_guns.yml | 10 +++ .../Objects/Weapons/Melee/armblade.yml | 7 ++ .../Objects/Weapons/Melee/chainsaw.yml | 7 ++ .../Objects/Weapons/Melee/e_sword.yml | 11 ++++ .../Objects/Weapons/Melee/fireaxe.yml | 7 ++ .../Entities/Objects/Weapons/Melee/knife.yml | 11 ++++ .../Entities/Surgery/surgery_steps.yml | 20 +++++- 42 files changed, 476 insertions(+), 64 deletions(-) create mode 100644 Content.Client/Smoking/MatchstickSystem.cs delete mode 100644 Content.Server/Light/Components/MatchstickComponent.cs create mode 100644 Content.Shared/Smoking/Components/MatchstickComponent.cs create mode 100644 Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs create mode 100644 Resources/Locale/en-US/_Shitmed/surgery-tools.ftl diff --git a/Content.Client/Smoking/MatchstickSystem.cs b/Content.Client/Smoking/MatchstickSystem.cs new file mode 100644 index 00000000000..9c241a2a8b1 --- /dev/null +++ b/Content.Client/Smoking/MatchstickSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Smoking.Systems; + +namespace Content.Client.Smoking; + +public sealed class MatchstickSystem : SharedMatchstickSystem; diff --git a/Content.Server/Light/Components/MatchstickComponent.cs b/Content.Server/Light/Components/MatchstickComponent.cs deleted file mode 100644 index 3c47f4c18b3..00000000000 --- a/Content.Server/Light/Components/MatchstickComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Content.Server.Light.EntitySystems; -using Content.Shared.Smoking; -using Robust.Shared.Audio; - -namespace Content.Server.Light.Components -{ - [RegisterComponent] - [Access(typeof(MatchstickSystem))] - public sealed partial class MatchstickComponent : Component - { - /// - /// Current state to matchstick. Can be Unlit, Lit or Burnt. - /// - [DataField("state")] - public SmokableState CurrentState = SmokableState.Unlit; - - /// - /// How long will matchstick last in seconds. - /// - [ViewVariables(VVAccess.ReadOnly)] - [DataField("duration")] - public int Duration = 10; - - /// - /// Sound played when you ignite the matchstick. - /// - [DataField("igniteSound", required: true)] public SoundSpecifier IgniteSound = default!; - } -} diff --git a/Content.Server/Light/EntitySystems/MatchboxSystem.cs b/Content.Server/Light/EntitySystems/MatchboxSystem.cs index 9a73e44f878..e4925c610dd 100644 --- a/Content.Server/Light/EntitySystems/MatchboxSystem.cs +++ b/Content.Server/Light/EntitySystems/MatchboxSystem.cs @@ -2,6 +2,7 @@ using Content.Server.Storage.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Smoking; +using Content.Shared.Smoking.Components; namespace Content.Server.Light.EntitySystems { diff --git a/Content.Server/Light/EntitySystems/MatchstickSystem.cs b/Content.Server/Light/EntitySystems/MatchstickSystem.cs index 96e4695784d..6748fa9ce66 100644 --- a/Content.Server/Light/EntitySystems/MatchstickSystem.cs +++ b/Content.Server/Light/EntitySystems/MatchstickSystem.cs @@ -1,9 +1,10 @@ using Content.Server.Atmos.EntitySystems; -using Content.Server.Light.Components; using Content.Shared.Audio; using Content.Shared.Interaction; using Content.Shared.Item; using Content.Shared.Smoking; +using Content.Shared.Smoking.Components; +using Content.Shared.Smoking.Systems; using Content.Shared.Temperature; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -12,7 +13,7 @@ namespace Content.Server.Light.EntitySystems { - public sealed class MatchstickSystem : EntitySystem + public sealed class MatchstickSystem : SharedMatchstickSystem { [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -84,18 +85,21 @@ public void Ignite(Entity matchstick, EntityUid user) _audio.PlayPvs(component.IgniteSound, matchstick, AudioParams.Default.WithVariation(0.125f).WithVolume(-0.125f)); // Change state - SetState(matchstick, component, SmokableState.Lit); + SetState((matchstick, component), SmokableState.Lit); _litMatches.Add(matchstick); matchstick.Owner.SpawnTimer(component.Duration * 1000, delegate { - SetState(matchstick, component, SmokableState.Burnt); + SetState((matchstick, component), SmokableState.Burnt); _litMatches.Remove(matchstick); }); } - private void SetState(EntityUid uid, MatchstickComponent component, SmokableState value) + public override bool SetState(Entity ent, SmokableState value) { - component.CurrentState = value; + if (!base.SetState(ent, value)) + return false; + + var (uid, component) = ent; if (_lights.TryGetLight(uid, out var pointLightComponent)) { @@ -119,6 +123,8 @@ private void SetState(EntityUid uid, MatchstickComponent component, SmokableStat { _appearance.SetData(uid, SmokingVisuals.Smoking, component.CurrentState, appearance); } + + return true; } } } diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 1ce8243f319..e2f6eb16123 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -27,6 +27,9 @@ public sealed partial class OrganComponent : Component, ISurgeryToolComponent // [DataField] public string ToolName { get; set; } = "An organ"; + [DataField] + public float Speed { get; set; } = 1f; + /// /// Shitmed Change: If true, the organ will not heal an entity when transplanted into them. /// diff --git a/Content.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index 45d8975fb1a..f7ef8e09667 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -46,6 +46,9 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField, AutoNetworkedField] public bool? Used { get; set; } = null; + [DataField] + public float Speed { get; set; } = 1f; + /// /// Shitmed Change: What's the max health this body part can have? /// diff --git a/Content.Shared/Smoking/Components/MatchstickComponent.cs b/Content.Shared/Smoking/Components/MatchstickComponent.cs new file mode 100644 index 00000000000..527553549b5 --- /dev/null +++ b/Content.Shared/Smoking/Components/MatchstickComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared.Smoking.Systems; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Smoking.Components; + +[RegisterComponent, NetworkedComponent, Access(typeof(SharedMatchstickSystem))] +[AutoGenerateComponentState] +public sealed partial class MatchstickComponent : Component +{ + /// + /// Current state to matchstick. Can be Unlit, Lit or Burnt. + /// + [DataField("state"), AutoNetworkedField] + public SmokableState CurrentState = SmokableState.Unlit; + + /// + /// How long will matchstick last in seconds. + /// + [DataField] + public int Duration = 10; + + /// + /// Sound played when you ignite the matchstick. + /// + [DataField(required: true)] + public SoundSpecifier IgniteSound = default!; +} diff --git a/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs b/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs new file mode 100644 index 00000000000..bda75c42d29 --- /dev/null +++ b/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs @@ -0,0 +1,16 @@ +using Content.Shared.Smoking.Components; + +namespace Content.Shared.Smoking.Systems; + +public abstract class SharedMatchstickSystem : EntitySystem +{ + public virtual bool SetState(Entity ent, SmokableState state) + { + if (ent.Comp.CurrentState == state) + return false; + + ent.Comp.CurrentState = state; + Dirty(ent); + return true; + } +} diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index b96b4f76a62..9d3ff4255f6 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -72,7 +72,7 @@ private void OnToolStep(Entity ent, ref SurgeryStepEvent a { foreach (var reg in ent.Comp.Tool.Values) { - if (!AnyHaveComp(args.Tools, reg.Component, out var tool)) + if (!AnyHaveComp(args.Tools, reg.Component, out var tool, out _)) return; if (_net.IsServer && @@ -195,21 +195,21 @@ private void OnToolCanPerform(Entity ent, ref SurgeryCanPe if (ent.Comp.Tool != null) { - args.ValidTools ??= new HashSet(); + args.ValidTools ??= new Dictionary(); foreach (var reg in ent.Comp.Tool.Values) { - if (!AnyHaveComp(args.Tools, reg.Component, out var withComp)) + if (!AnyHaveComp(args.Tools, reg.Component, out var tool, out var speed)) { args.Invalid = StepInvalidReason.MissingTool; - if (reg.Component is ISurgeryToolComponent tool) - args.Popup = $"You need {tool.ToolName} to perform this step!"; + if (reg.Component is ISurgeryToolComponent required) + args.Popup = $"You need {required.ToolName} to perform this step!"; return; } - args.ValidTools.Add(withComp); + args.ValidTools[tool] = speed; } } } @@ -593,9 +593,21 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S if (!CanPerformStep(user, body, part, step, true, out _, out _, out var validTools)) return; - if (_net.IsServer && validTools?.Count > 0) + // make the doafter longer for ghetto tools, or shorter for advanced ones + var speed = 1f; + var usedEv = new SurgeryToolUsedEvent(user, body); + foreach (var (tool, toolSpeed) in validTools!) { - foreach (var tool in validTools) + RaiseLocalEvent(tool, ref usedEv); + if (usedEv.Cancelled) + return; + + speed *= toolSpeed; + } + + if (_net.IsServer) + { + foreach (var tool in validTools.Keys) { if (TryComp(tool, out SurgeryToolComponent? toolComp) && toolComp.EndSound != null) @@ -609,8 +621,8 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S _rotateToFace.TryFaceCoordinates(user, _transform.GetMapCoordinates(body, xform).Position); var ev = new SurgeryDoAfterEvent(args.Surgery, args.Step); - // TODO: Make this serialized on a per surgery step basis, and also add penalties based on ghetto tools. - var duration = 2f; + // TODO: Move 2 seconds to a field of SurgeryStepComponent + var duration = 2f * speed; if (TryComp(user, out SurgerySpeedModifierComponent? surgerySpeedMod) && surgerySpeedMod is not null) duration = duration / surgerySpeedMod.SpeedModifier; @@ -687,7 +699,7 @@ public bool PreviousStepsComplete(EntityUid body, EntityUid part, Entity? validTools) + out Dictionary? validTools) { var type = BodyPartType.Other; if (TryComp(part, out BodyPartComponent? partComp)) @@ -741,18 +753,20 @@ public bool IsStepComplete(EntityUid body, EntityUid part, EntProtoId step, Enti return !ev.Cancelled; } - private bool AnyHaveComp(List tools, IComponent component, out EntityUid withComp) + private bool AnyHaveComp(List tools, IComponent component, out EntityUid withComp, out float speed) { foreach (var tool in tools) { - if (HasComp(tool, component.GetType())) + if (EntityManager.TryGetComponent(tool, component.GetType(), out var found) && found is ISurgeryToolComponent toolComp) { withComp = tool; + speed = toolComp.Speed; return true; } } - withComp = default; + withComp = EntityUid.Invalid; + speed = 1f; return false; } } diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs index 14217c5aa5b..d36c05b6d98 100644 --- a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryCanPerformStepEvent.cs @@ -10,5 +10,5 @@ public record struct SurgeryCanPerformStepEvent( SlotFlags TargetSlots, string? Popup = null, StepInvalidReason Invalid = StepInvalidReason.None, - HashSet? ValidTools = null -) : IInventoryRelayEvent; \ No newline at end of file + Dictionary? ValidTools = null +) : IInventoryRelayEvent; diff --git a/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs index e4a63f4c6e0..456c507793e 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs @@ -6,6 +6,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; public sealed partial class BoneGelComponent : Component, ISurgeryToolComponent { public string ToolName => "bone gel"; - public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs index a89b5356680..2f95be5125c 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs @@ -7,4 +7,6 @@ public sealed partial class BoneSawComponent : Component, ISurgeryToolComponent { public string ToolName => "a bone saw"; public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs index 92bffe6f95e..61b18bb452e 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/CauteryComponent.cs @@ -7,4 +7,6 @@ public sealed partial class CauteryComponent : Component, ISurgeryToolComponent { public string ToolName => "a cautery"; public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs index 56ef9e097a7..7ccfcdf1d7c 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/HemostatComponent.cs @@ -7,4 +7,6 @@ public sealed partial class HemostatComponent : Component, ISurgeryToolComponent { public string ToolName => "a hemostat"; public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs index 5338f3e1d66..c2b0676ffdf 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs @@ -8,4 +8,11 @@ public interface ISurgeryToolComponent // Mostly intended for discardable or non-reusable tools. [DataField] public bool? Used { get; set; } -} \ No newline at end of file + + /// + /// GoobStation: Multiply the step's doafter by this value. + /// This is per-type so you can have something that's a good scalpel but a bad retractor. + /// + [DataField] + public float Speed { get; set; } +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs index 828de906f57..ff8b699585a 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/RetractorComponent.cs @@ -7,4 +7,6 @@ public sealed partial class RetractorComponent : Component, ISurgeryToolComponen { public string ToolName => "a retractor"; public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs index cef2cc15fd0..9d96566b074 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs @@ -7,4 +7,6 @@ public sealed partial class ScalpelComponent : Component, ISurgeryToolComponent { public string ToolName => "a scalpel"; public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs index afa28af133e..0295d5192b9 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs @@ -13,4 +13,11 @@ public sealed partial class SurgeryToolComponent : Component [DataField, AutoNetworkedField] public SoundSpecifier? EndSound; -} \ No newline at end of file +} + +/// +/// GoobStation: Raised on a tool to see if it can be used in a surgery step. +/// If this is cancelled the step can't be completed. +/// +[ByRefEvent] +public record struct SurgeryToolUsedEvent(EntityUid User, EntityUid Target, bool Cancelled = false); diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs new file mode 100644 index 00000000000..4d1c1048653 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs @@ -0,0 +1,57 @@ +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Popups; +using Content.Shared.Smoking; +using Content.Shared.Smoking.Components; +using Content.Shared.Weapons.Ranged; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +/// +/// GoobStation: Prevents using esword or welder when off, laser when no charges. +/// +public sealed class SurgeryToolConditionsSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnToggleUsed); + SubscribeLocalEvent(OnGunUsed); + SubscribeLocalEvent(OnMatchUsed); + } + + private void OnToggleUsed(Entity ent, ref SurgeryToolUsedEvent args) + { + if (ent.Comp.Activated) + return; + + _popup.PopupEntity(Loc.GetString("surgery-tool-turn-on"), ent, args.User); + args.Cancelled = true; + } + + private void OnGunUsed(Entity ent, ref SurgeryToolUsedEvent args) + { + var coords = Transform(args.User).Coordinates; + var ev = new TakeAmmoEvent(1, new List<(EntityUid? Entity, IShootable Shootable)>(), coords, args.User); + if (ev.Ammo.Count > 0) + return; + + _popup.PopupEntity(Loc.GetString("surgery-tool-reload"), ent, args.User); + args.Cancelled = true; + } + + private void OnMatchUsed(Entity ent, ref SurgeryToolUsedEvent args) + { + var state = ent.Comp.CurrentState; + if (state == SmokableState.Lit) + return; + + var key = "surgery-tool-match-" + (state == SmokableState.Burnt ? "replace" : "light"); + _popup.PopupEntity(Loc.GetString(key), ent, args.User); + args.Cancelled = true; + } +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs new file mode 100644 index 00000000000..7426d4f88fa --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs @@ -0,0 +1,65 @@ +using Content.Shared.Body.Organ; +using Content.Shared.Body.Part; +using Content.Shared.Examine; +using Content.Shared.Verbs; +using Robust.Shared.Utility; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +/// +/// GoobStation: Examining a surgical or ghetto tool shows everything it can be used for. +/// +public sealed class SurgeryToolExamineSystem : EntitySystem +{ + [Dependency] private readonly ExamineSystemShared _examine = default!; + + public override void Initialize() + { + SubscribeLocalEvent>(OnGetVerbs); + + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + var msg = FormattedMessage.FromMarkupOrThrow(Loc.GetString("surgery-tool-header")); + msg.PushNewline(); + var ev = new SurgeryToolExaminedEvent(msg); + RaiseLocalEvent(ent, ref ev); + + _examine.AddDetailedExamineVerb(args, ent.Comp, ev.Message, + Loc.GetString("surgery-tool-examinable-verb-text"), "/Textures/Objects/Specific/Medical/Surgery/scalpel.rsi/scalpel.png", + Loc.GetString("surgery-tool-examinable-verb-message")); + } + + private void OnExamined(EntityUid uid, ISurgeryToolComponent comp, ref SurgeryToolExaminedEvent args) + { + var msg = args.Message; + var color = comp.Speed switch + { + < 1f => "red", + > 1f => "green", + _ => "white" + }; + var key = "surgery-tool-" + (comp.Used == true ? "used" : "unlimited"); + var speed = comp.Speed.ToString("N2"); // 2 decimal places to not get trolled by float + msg.PushMarkup(Loc.GetString(key, ("tool", comp.ToolName), ("speed", speed), ("color", color))); + } +} + +[ByRefEvent] +public record struct SurgeryToolExaminedEvent(FormattedMessage Message); diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs index 6fe0070dced..c47c7e2834b 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs @@ -7,4 +7,6 @@ public sealed partial class SurgicalDrillComponent : Component, ISurgeryToolComp { public string ToolName => "a surgical drill"; public bool? Used { get; set; } = null; -} \ No newline at end of file + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs new file mode 100644 index 00000000000..51596ae0002 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +/// +/// GoobStation: Like Hemostat but lets ghetto tools be used differently for clamping and tending wounds. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class TendingComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a wound tender"; + public bool? Used { get; set; } = null; + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs new file mode 100644 index 00000000000..068fb5bf463 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Medical.Surgery.Tools; + +/// +/// GoobStation: Like Hemostat but lets ghetto tools be used differently for clamping and removing organs. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class TweezersComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "tweezers"; + public bool? Used { get; set; } = null; + [DataField] + public float Speed { get; set; } = 1f; +} diff --git a/Resources/Locale/en-US/_Shitmed/surgery-tools.ftl b/Resources/Locale/en-US/_Shitmed/surgery-tools.ftl new file mode 100644 index 00000000000..c1d1f93524a --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/surgery-tools.ftl @@ -0,0 +1,10 @@ +surgery-tool-turn-on = Turn it on first! +surgery-tool-reload = Reload it first! +surgery-tool-match-light = Light it first! +surgery-tool-match-replace = Get a new match! + +surgery-tool-examinable-verb-text = Surgery Tool +surgery-tool-examinable-verb-message = Examine the uses of this tool in surgeries. +surgery-tool-header = This can be used in surgeries as: +surgery-tool-unlimited = - {$tool} at [color={$color}]{$speed}x[/color] speed +surgery-tool-used = - {$tool} at [color={$color}]{$speed}x[/color] speed, [color=red]then gets used up[/color] diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 718d1ad8e3f..2116405f142 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -78,6 +78,13 @@ - type: DeleteOnTrigger - type: StaticPrice price: 0 + - type: Scalpel # GoobStation + speed: 0.45 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/scalpel1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/scalpel2.ogg - type: entity parent: ShardBase diff --git a/Resources/Prototypes/Entities/Objects/Misc/pen.yml b/Resources/Prototypes/Entities/Objects/Misc/pen.yml index 55117e63602..fd64bffcbff 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/pen.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/pen.yml @@ -42,6 +42,13 @@ damage: types: Piercing: 3 + - type: Tending # GoobStation + speed: 0.55 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg #TODO: I want the luxury pen to write a cool font like Merriweather in the future. diff --git a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml index e735b2dcddc..b6d1ddecb22 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml @@ -8,6 +8,13 @@ - type: Item # TODO add inhand sprites for all utensils sprite: Objects/Misc/utensils.rsi - type: SpaceGarbage + - type: Tweezers # GoobStation: Any utensil can poorly remove organs + speed: 0.2 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg - type: entity parent: UtensilBase @@ -50,6 +57,8 @@ damage: types: Piercing: 5 + - type: Tweezers # GoobStation: Forks are better than spoons + speed: 0.35 - type: entity parent: UtensilBasePlastic @@ -62,6 +71,8 @@ - type: Utensil types: - Fork + - type: Tweezers # GoobStation: Forks are better than spoons + speed: 0.35 - type: entity parent: UtensilBase diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index d678ef3c8fb..c92f1b52530 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -40,6 +40,15 @@ - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 + - type: Retractor # GoobStation: Same as wirecutters + speed: 0.35 + - type: Hemostat + speed: 0.6 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor2.ogg - type: entity name: scythe @@ -87,6 +96,11 @@ Piercing: 2 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi + - type: BoneSaw # GoobStation + speed: 0.35 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/saw.ogg - type: entity name: spade diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index 1a1b148fbfe..c36f6587407 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -136,6 +136,8 @@ damage: types: Slash: 12 + - type: Scalpel # GoobStation + speed: 1.25 - type: entity name: laser scalpel @@ -147,6 +149,9 @@ state: laser - type: Item heldPrefix: laser + - type: Scalpel # GoobStation + speed: 1.5 + # TODO: prevent bleeding from incisions # Scissors @@ -190,6 +195,8 @@ endSound: path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg - type: Hemostat + - type: Tweezers # GoobStation + - type: Tending # GoobStation # Bone setter - Shitmed Change - type: entity @@ -265,6 +272,8 @@ path: /Audio/Weapons/bladeslice.ogg - type: Tool speedModifier: 0.5 + - type: BoneSaw # GoobStation + speed: 0.5 - type: entity name: circular saw @@ -284,6 +293,8 @@ path: /Audio/Items/drill_hit.ogg - type: Tool speedModifier: 1.5 + - type: BoneSaw # GoobStation + speed: 1.5 - type: entity name: advanced circular saw @@ -299,6 +310,8 @@ attackRate: 1.5 - type: Tool speedModifier: 2.0 + - type: BoneSaw # GoobStation + speed: 2 # ORGANS - SHITMED diff --git a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml index 7cc57faaa4b..78ba586fd5a 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml @@ -29,6 +29,16 @@ - type: PhysicalComposition materialComposition: Steel: 15 + # FIXME: Used isnt actually implemented so its still unlimited. + # Uncomment this when its implemented, and make sure it handles StackComponent right + #- type: Hemostat # GoobStation + # speed: 0.15 + #- type: SurgeryTool # GoobStation + # used: true + # startSound: + # path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg + # endSound: + # path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg - type: entity id: CableHVStack diff --git a/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml b/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml index 8655d53fb61..bb2a7450beb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml @@ -41,6 +41,10 @@ size: Normal shape: - 0,0,0,1 + - type: Tweezers # GoobStation + speed: 0.55 + - type: SurgeryTool # GoobStation + startSound: /Audio/Items/crowbar.ogg # Standard (grey) Crowbar - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml index c35d67e7eb4..6a3abea2c03 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml @@ -88,6 +88,13 @@ radius: 1.1 #smallest possible color: orange - type: ItemTogglePointLight + - type: Cautery # GoobStation + speed: 0.45 + - type: SurgeryTool # GoobStation + startSound: + collection: lighterOnSounds + endSound: + collection: lighterOffSounds - type: entity name: cheap lighter diff --git a/Resources/Prototypes/Entities/Objects/Tools/matches.yml b/Resources/Prototypes/Entities/Objects/Tools/matches.yml index e8601fcf355..3c2d3a28746 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/matches.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/matches.yml @@ -41,6 +41,13 @@ unlitIcon: match_unlit litIcon: match_lit burntIcon: match_burnt + - type: Cautery # GoobStation + speed: 0.2 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg + endSound: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg - type: entity parent: Matchstick diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index d0f2d2d7084..77cc64eb680 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -43,6 +43,19 @@ Steel: 100 - type: StaticPrice price: 30 + - type: Retractor # GoobStation + speed: 0.35 + - type: Hemostat # GoobStation + speed: 0.6 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/Items/wirecutter.ogg + params: + variation: 0.125 + endSound: + path: /Audio/Items/wirecutter.ogg + params: + variation: 0.125 - type: entity name: screwdriver @@ -87,6 +100,15 @@ Steel: 100 - type: StaticPrice price: 30 + - type: Retractor # GoobStation + speed: 0.45 + - type: Tending # GoobStation + speed: 0.65 + - type: SurgeryTool # GoobStation + startSound: + collection: Screwdriver + endSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor2.ogg - type: entity name: wrench diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 197dca00ff8..adf76533961 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -105,6 +105,13 @@ price: 40 - type: IgnitionSource temperature: 700 + - type: Cautery # GoobStation + speed: 0.7 + - type: SurgeryTool # GoobStation + startSound: + collection: Welder + endSound: + collection: WelderOff - type: entity name: industrial welding tool diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 4a2928897a8..7832a03b96d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -30,6 +30,11 @@ - type: Appearance - type: StaticPrice price: 500 + - type: Cautery # GoobStation + speed: 0.9 + - type: SurgeryTool # GoobStation + endSound: + path: /Audio/Weapons/Guns/Gunshots/laser.ogg - type: entity id: BaseWeaponPowerCell @@ -65,6 +70,11 @@ - type: ContainerContainer containers: gun_magazine: !type:ContainerSlot + - type: Cautery # GoobStation + speed: 0.9 + - type: SurgeryTool # GoobStation + endSound: + path: /Audio/Weapons/Guns/Gunshots/laser.ogg - type: entity id: BaseWeaponBatterySmall diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml index 398c04aee6e..44889209696 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml @@ -21,3 +21,10 @@ size: Normal sprite: Objects/Weapons/Melee/armblade.rsi - type: Prying + - type: Scalpel # GoobStation + speed: 0.3 + - type: BoneSaw # GoobStation + speed: 0.75 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/saw.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index bfdd94add6c..64f4393ba93 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -47,3 +47,10 @@ maxVol: 300 - type: UseDelay delay: 1 + - type: BoneSaw # GoobStation + speed: 0.5 # TODO: arm-mounted version becomes 0.65 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/Weapons/chainsawwield.ogg + endSound: + path: /Audio/Weapons/chainsaw.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index af9e299628e..04d982aec79 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -71,6 +71,17 @@ - type: Reflect - type: IgnitionSource temperature: 700 + - type: Scalpel # GoobStation + speed: 0.75 + - type: Cautery # GoobStation: you have to be very, very careful to cauterize with it + speed: 0.2 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/Weapons/ebladehum.ogg + endSound: + path: /Audio/Weapons/eblade1.ogg + params: + variation: 0.250 - type: entity name: energy sword diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index 53e5c114239..e00e812f879 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -50,6 +50,13 @@ stealGroup: FireAxe - type: IgniteOnMeleeHit fireStacks: -4 + - type: Scalpel # GoobStation + speed: 0.3 + - type: BoneSaw # GoobStation + speed: 0.5 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/saw.ogg - type: entity id: FireAxeFlaming diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index c307d0ffbe3..219a5aba9cb 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -27,6 +27,13 @@ - Slicing useSound: path: /Audio/Items/Culinary/chop.ogg + - type: Scalpel # GoobStation + speed: 0.65 + - type: SurgeryTool # GoobStation + startSound: + path: /Audio/_Shitmed/Medical/Surgery/scalpel1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/scalpel2.ogg - type: entity name: kitchen knife @@ -74,6 +81,10 @@ guides: - Chef - FoodRecipes + - type: Scalpel # GoobStation + speed: 0.3 + - type: BoneSaw # GoobStation: Better than tg 25% because its a cleaver its meant to hack off limbs + speed: 0.5 - type: entity name: combat knife diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index b4e32315448..5dffe537135 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -309,7 +309,7 @@ components: - type: SurgeryStep tool: - - type: Hemostat + - type: Tending - type: Sprite sprite: Objects/Specific/Medical/Surgery/scissors.rsi state: hemostat @@ -327,7 +327,7 @@ components: - type: SurgeryStep tool: - - type: Hemostat + - type: Tending - type: Sprite sprite: Objects/Specific/Medical/Surgery/scissors.rsi state: hemostat @@ -399,7 +399,7 @@ components: - type: SurgeryStep tool: - - type: Hemostat + - type: Tweezers - type: Sprite sprite: Objects/Specific/Medical/Surgery/scissors.rsi state: hemostat @@ -568,3 +568,17 @@ # - type: Sprite # sprite: _Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi # state: insertion + +#- type: entity +# parent: SurgeryStepBase +# id: SurgeryStepWingReconstruction +# name: Start wing reconstruction +# categories: [ HideSpawnMenu ] +# components: +# - type: SurgeryStep +# duration: 6 # On TG success chance is lower, so here the surgery slower +# tool: +# - type: Tending +# - type: ??? moth ops go here when wings can be destroyed +# - type: Sprite +# sprite: Interface/Emotes/chitter.png From a778a9b8d884d3312756f0b3232a9ab5729c1a2c Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 18 Nov 2024 01:27:12 +0000 Subject: [PATCH 11/40] they did surgery on a fish (#889) * add breathing immunity and organ status effects * they did surgery on a fish * fix error for installing parts on non-humanoids --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Body/Systems/RespiratorSystem.cs | 3 +- .../Body/Organ/StatusEffectOrganComponent.cs | 26 ++++++++++++ .../Body/Organ/StatusEffectOrganSystem.cs | 33 +++++++++++++++ .../Body/Systems/SharedBodySystem.Parts.cs | 3 +- .../Components/BreathingImmunityComponent.cs | 8 ++++ .../Prototypes/Entities/Mobs/NPCs/carp.yml | 7 ++++ .../_Goobstation/Body/Organs/Animal/space.yml | 17 ++++++++ .../_Goobstation/Body/Parts/animal.yml | 38 ++++++++++++++++++ .../Body/Prototypes/Animal/carp.yml | 17 ++++++++ .../_Goobstation/status_effects.yml | 3 ++ .../_Shitmed/Entities/Surgery/surgeries.yml | 18 +++++++++ Resources/Prototypes/status_effects.yml | 1 + .../Aliens/Carps/carp_parts.rsi/meta.json | 17 ++++++++ .../Mobs/Aliens/Carps/carp_parts.rsi/tail.png | Bin 0 -> 244 bytes .../Aliens/Carps/carp_parts.rsi/torso.png | Bin 0 -> 479 bytes 15 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 Content.Server/_Shitmed/Body/Organ/StatusEffectOrganComponent.cs create mode 100644 Content.Server/_Shitmed/Body/Organ/StatusEffectOrganSystem.cs create mode 100644 Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs create mode 100644 Resources/Prototypes/_Goobstation/Body/Organs/Animal/space.yml create mode 100644 Resources/Prototypes/_Goobstation/Body/Prototypes/Animal/carp.yml create mode 100644 Resources/Prototypes/_Goobstation/status_effects.yml create mode 100644 Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/meta.json create mode 100644 Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/tail.png create mode 100644 Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/torso.png diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index 046ba70cc19..9f56bedb4c3 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; +using Content.Shared._Shitmed.Body.Components; // GoobStation using Content.Shared._Shitmed.Body.Organ; // Shitmed Change using Content.Server.Chat.Systems; using Content.Server.EntityEffects.EffectConditions; @@ -72,7 +73,7 @@ public override void Update(float frameTime) respirator.NextUpdate += respirator.UpdateInterval; - if (_mobState.IsDead(uid)) + if (_mobState.IsDead(uid) || HasComp(uid)) // GoobStation: BreathingImmunity continue; // Begin DeltaV Code: Addition: diff --git a/Content.Server/_Shitmed/Body/Organ/StatusEffectOrganComponent.cs b/Content.Server/_Shitmed/Body/Organ/StatusEffectOrganComponent.cs new file mode 100644 index 00000000000..640f61d5e8e --- /dev/null +++ b/Content.Server/_Shitmed/Body/Organ/StatusEffectOrganComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.StatusEffect; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Server._Shitmed.Body.Organ; + +[RegisterComponent, Access(typeof(StatusEffectOrganSystem))] +[AutoGenerateComponentPause] +public sealed partial class StatusEffectOrganComponent : Component +{ + /// + /// List of status effects and components to refresh while the organ is installed. + /// + [DataField(required: true)] + public Dictionary, string> Refresh = new(); + + /// + /// How long to wait between each refresh. + /// Effects can only last at most this long once the organ is removed. + /// + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(5); + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] + public TimeSpan NextUpdate = TimeSpan.Zero; +} diff --git a/Content.Server/_Shitmed/Body/Organ/StatusEffectOrganSystem.cs b/Content.Server/_Shitmed/Body/Organ/StatusEffectOrganSystem.cs new file mode 100644 index 00000000000..b3394b7dd91 --- /dev/null +++ b/Content.Server/_Shitmed/Body/Organ/StatusEffectOrganSystem.cs @@ -0,0 +1,33 @@ +using Content.Shared.Body.Organ; +using Content.Shared.StatusEffect; +using Robust.Shared.Timing; + +namespace Content.Server._Shitmed.Body.Organ; + +public sealed class StatusEffectOrganSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly StatusEffectsSystem _effects = default!; + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + var now = _timing.CurTime; + while (query.MoveNext(out var uid, out var comp, out var organ)) + { + if (now < comp.NextUpdate || organ.Body is not {} body) + continue; + + comp.NextUpdate = now + comp.Delay; + if (!TryComp(body, out var effects)) + continue; + + foreach (var (key, component) in comp.Refresh) + { + _effects.TryAddStatusEffect(body, key, comp.Delay, refresh: true, component, effects); + } + } + } +} diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index eed0c897728..b28b0ca891d 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -106,12 +106,13 @@ private void EnablePart(Entity partEnt) public void ChangeSlotState(Entity partEnt, bool disable) { if (partEnt.Comp.Body is not null + && TryComp(partEnt.Comp.Body, out var inventory) // GoobStation: Prevent error for non-humanoids && GetBodyPartCount(partEnt.Comp.Body.Value, partEnt.Comp.PartType) == 1 && TryGetPartSlotContainerName(partEnt.Comp.PartType, out var containerNames)) { foreach (var containerName in containerNames) { - _inventorySystem.SetSlotStatus(partEnt.Comp.Body.Value, containerName, disable); + _inventorySystem.SetSlotStatus(partEnt.Comp.Body.Value, containerName, disable, inventory); // GoobStation: pass inventory var ev = new RefreshInventorySlotsEvent(containerName); RaiseLocalEvent(partEnt.Comp.Body.Value, ev); } diff --git a/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs b/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs new file mode 100644 index 00000000000..7add1f261ed --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared._Shitmed.Body.Components; + +/// +/// GoobStation: Disables a mobs need for air when this component is added. +/// It will neither breathe nor take airloss damage. +/// +[RegisterComponent] +public sealed partial class BreathingImmunityComponent : Component; diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 2695d84b63c..6b8c3d8810c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -86,6 +86,13 @@ interactFailureString: petting-failure-carp interactFailureSound: path: /Audio/Effects/bite.ogg + - type: Body # GoobStation: Special carp organs + prototype: Carp + - type: SurgeryTarget # GoobStation + - type: UserInterface # GoobStation + interfaces: + enum.SurgeryUIKey.Key: + type: SurgeryBui - type: entity parent: BaseMobCarp diff --git a/Resources/Prototypes/_Goobstation/Body/Organs/Animal/space.yml b/Resources/Prototypes/_Goobstation/Body/Organs/Animal/space.yml new file mode 100644 index 00000000000..d565a7f2e7f --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Body/Organs/Animal/space.yml @@ -0,0 +1,17 @@ +- type: entity + parent: OrganAnimalLungs + id: OrganSpaceAnimalLungs + name: space animal lungs + components: + - type: StatusEffectOrgan + refresh: + BreathingImmunity: BreathingImmunity + +- type: entity + parent: OrganAnimalHeart + id: OrganSpaceAnimalHeart + name: space animal heart + components: + - type: StatusEffectOrgan + refresh: + PressureImmunity: PressureImmunity diff --git a/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml b/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml index 75985dfca30..005a1744099 100644 --- a/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml +++ b/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml @@ -8,3 +8,41 @@ - type: Sprite layers: - state: head_m + +- type: entity + abstract: true + parent: PartAnimal + id: BaseCarpPart + components: + - type: Sprite + sprite: _Goobstation/Mobs/Aliens/Carps/carp_parts.rsi + +- type: entity + categories: [ HideSpawnMenu ] + parent: BaseCarpPart + id: TailCarp + name: carp tail + description: Unique glands in this tail let space carp fly in a vacuum. + components: + - type: Sprite + layers: + - state: tail + - type: BodyPart + partType: Tail + - type: MovementBodyPart + walkSpeed: 2.5 + sprintSpeed: 3.5 + # TODO: Make it actually needed. Legs are hardcoded to be the only parts that matter for movement. + # TODO: space flight stuff + +- type: entity + categories: [ HideSpawnMenu ] + parent: BaseCarpPart + id: TorsoCarp + name: carp torso + components: + - type: Sprite + layers: + - state: torso + - type: BodyPart + partType: Torso diff --git a/Resources/Prototypes/_Goobstation/Body/Prototypes/Animal/carp.yml b/Resources/Prototypes/_Goobstation/Body/Prototypes/Animal/carp.yml new file mode 100644 index 00000000000..81bf6a4bd5c --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Body/Prototypes/Animal/carp.yml @@ -0,0 +1,17 @@ +- type: body + id: Carp + name: carp + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - tail + organs: + lungs: OrganSpaceAnimalLungs # Immunity to airloss + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + heart: OrganSpaceAnimalHeart # Immunity to cold + kidneys: OrganAnimalKidneys + tail: + part: TailCarp diff --git a/Resources/Prototypes/_Goobstation/status_effects.yml b/Resources/Prototypes/_Goobstation/status_effects.yml new file mode 100644 index 00000000000..5e62d994021 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/status_effects.yml @@ -0,0 +1,3 @@ +- type: statusEffect + id: BreathingImmunity + alwaysAllowed: true # Used by space animal lungs to work on anything diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml index 7a3955e086a..6e24499c2fa 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml @@ -281,6 +281,24 @@ part: Foot symmetry: Right +- type: entity + parent: SurgeryBase + id: SurgeryAttachTail + name: Attach Tail + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenIncision + steps: + - SurgeryStepInsertFeature + - SurgeryStepSealWounds + - type: SurgeryPartCondition + part: Torso + - type: SurgeryPartRemovedCondition + connection: tail + part: Tail + symmetry: None + #- type: entity # parent: SurgeryBase # id: SurgeryAlienEmbryoRemoval diff --git a/Resources/Prototypes/status_effects.yml b/Resources/Prototypes/status_effects.yml index 49e5ccc5794..1eeaf93b095 100644 --- a/Resources/Prototypes/status_effects.yml +++ b/Resources/Prototypes/status_effects.yml @@ -36,6 +36,7 @@ - type: statusEffect id: PressureImmunity + alwaysAllowed: true # GoobStation: Used by space animal heart to work on anything - type: statusEffect id: Muted diff --git a/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/meta.json b/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/meta.json new file mode 100644 index 00000000000..cdecf550def --- /dev/null +++ b/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from and modified by deltanedas (github) for GoobStation", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "tail" + }, + { + "name": "torso" + } + ] +} diff --git a/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/tail.png b/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/tail.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0b9458102d2bc45fcb23a1299ec5d627695ab9 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7ehi z#W5tJ_3h--oX&~@uJ5@Sxo1wxIlz~5c&_Y?hOav|w>C!ZGFt5*By{LSv%rkaMGL>j z)Hftbw0%tOGj{UQ{A|akxWZ`tZYKr-K?Vln)tj%d7M%-rxpyim`xTS;Tc$L(o{tq% zdkwD?C4A7poqON4?wWY6Pv_9;3 n9Qsl0-tV8a(?B+<-(j%1;hefA>G*M=iy1s!{an^LB{Ts5fYV&u literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/torso.png b/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0f5ff82f052cdae7df742d3821405ddace5baa GIT binary patch literal 479 zcmV<50U-W~P)@dbnRWJ$1S(W2k3w>ckat()*(Rn@GV z9~JTnsbM%CkE5JP1EI_T4Dfh7fX|93rLfi}2Ap%rSf|rzko9K{Gz^;OInFt} z_iY8f0s~lU(ONe{KX7883mqFY%QA!ztX8W@Fo5?S7~ehbalkp(d%_HYgb*$Kdc7tv z?>(E%hTU%0!ljgGt(({DmF%p^p3labT002ovPDHLkV1juf(YOEr literal 0 HcmV?d00001 From bf33742d18feb8ad0e6123c92fffe2b0d53762b1 Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:38:06 -0400 Subject: [PATCH 12/40] Shitmed Update 1 - Forma de Goob (#897) * full fucking send * ope forgot to remove the EE scripts * fix test * fix shitcode fail * DELTA THAT VALUE IS NULLABLE * whoopsie daysie --- Content.Client/Smoking/MatchstickSystem.cs | 4 ++ Content.Server/Body/Systems/BodySystem.cs | 3 +- Content.Server/Body/Systems/BrainSystem.cs | 11 ++++- .../Body/Systems/RespiratorSystem.cs | 9 +++-- .../Light/EntitySystems/MatchboxSystem.cs | 2 +- .../Light/EntitySystems/MatchstickSystem.cs | 16 +++++--- .../_Shitmed/Body/Organ/HeartSystem.cs | 38 ++++++++++++++++++ .../DelayedDeath/DelayedDeathComponent.cs | 16 ++++++++ .../DelayedDeath/DelayedDeathSystem.cs | 28 +++++++++++++ .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 24 ++++------- Content.Shared/Body/Organ/OrganComponent.cs | 7 ++++ .../Body/Systems/SharedBodySystem.Body.cs | 1 + .../Body/Systems/SharedBodySystem.Organs.cs | 14 +++++-- .../Body/Systems/SharedBodySystem.Parts.cs | 6 +-- .../Inventory/InventorySystem.Slots.cs | 3 -- .../Smoking/Components/MatchstickComponent.cs | 4 ++ .../Smoking/Systems/SharedMatchstickSystem.cs | 4 +- .../Components/BreathingImmunityComponent.cs | 4 +- .../_Shitmed/Body/Organ/DebrainedComponent.cs | 1 - .../SharedBodySystem.PartAppearance.cs | 15 ++++--- .../SurgeryPartRemovedConditionComponent.cs | 2 +- .../Surgery/SharedSurgerySystem.Steps.cs | 37 ++++++++++------- .../Surgery/SurgeryStepDamageChangeEvent.cs | 9 +++++ .../Surgery/Tools/BoneGelComponent.cs | 2 + .../Surgery/Tools/ISurgeryToolComponent.cs | 8 ++-- .../Surgery/Tools/SurgeryToolComponent.cs | 4 +- .../Tools/SurgeryToolConditionsSystem.cs | 2 +- .../Surgery/Tools/SurgeryToolExamineSystem.cs | 2 +- .../Surgery/Tools/TendingComponent.cs | 2 +- .../Surgery/Tools/TweezersComponent.cs | 2 +- .../Prototypes/Body/Organs/Animal/animal.yml | 23 +++++------ Resources/Prototypes/Body/Organs/arachnid.yml | 31 +++++--------- Resources/Prototypes/Body/Organs/diona.yml | 10 ++--- Resources/Prototypes/Body/Organs/moth.yml | 2 +- Resources/Prototypes/Body/Organs/slime.yml | 4 +- Resources/Prototypes/Body/Organs/vox.yml | 2 +- Resources/Prototypes/Body/Parts/silicon.yml | 14 ++++++- .../Prototypes/Body/Prototypes/arachnid.yml | 2 +- .../Prototypes/Body/Prototypes/diona.yml | 2 +- .../Prototypes/Body/Prototypes/dwarf.yml | 2 +- .../Body/Prototypes/gingerbread.yml | 2 +- .../Prototypes/Body/Prototypes/human.yml | 2 +- Resources/Prototypes/Body/Prototypes/moth.yml | 2 +- .../Prototypes/Body/Prototypes/primate.yml | 4 +- .../Prototypes/Body/Prototypes/reptilian.yml | 2 +- .../Prototypes/Body/Prototypes/skeleton.yml | 2 +- .../Prototypes/Body/Prototypes/slime.yml | 2 +- Resources/Prototypes/Body/Prototypes/vox.yml | 2 +- .../DeltaV/Entities/Mobs/Species/harpy.yml | 2 +- .../Entities/Debugging/debug_sweps.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 30 +++++++------- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 10 ++--- .../Entities/Mobs/NPCs/regalrat.yml | 8 ++-- .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 4 +- .../Entities/Objects/Materials/shards.yml | 4 +- .../Prototypes/Entities/Objects/Misc/pen.yml | 4 +- .../Entities/Objects/Misc/utensils.yml | 8 ++-- .../Objects/Specific/Hydroponics/tools.yml | 8 ++-- .../Objects/Specific/Medical/surgery.yml | 16 ++++---- .../Entities/Objects/Tools/cable_coils.yml | 4 +- .../Entities/Objects/Tools/crowbars.yml | 4 +- .../Entities/Objects/Tools/lighters.yml | 4 +- .../Entities/Objects/Tools/matches.yml | 4 +- .../Entities/Objects/Tools/tools.yml | 12 +++--- .../Entities/Objects/Tools/welders.yml | 4 +- .../Weapons/Guns/Battery/battery_guns.yml | 8 ++-- .../Objects/Weapons/Melee/armblade.yml | 6 +-- .../Objects/Weapons/Melee/chainsaw.yml | 4 +- .../Objects/Weapons/Melee/e_sword.yml | 6 +-- .../Objects/Weapons/Melee/fireaxe.yml | 6 +-- .../Entities/Objects/Weapons/Melee/knife.yml | 8 ++-- .../Body/Organs/Animal/space.yml | 0 .../Body/Parts/animal.yml | 2 +- .../Body/Prototypes/Animal/carp.yml | 0 .../status_effects.yml | 2 +- Resources/Prototypes/status_effects.yml | 2 +- .../Aliens/Carps/carp_parts.rsi/meta.json | 0 .../Mobs/Aliens/Carps/carp_parts.rsi/tail.png | Bin .../Aliens/Carps/carp_parts.rsi/torso.png | Bin 79 files changed, 347 insertions(+), 215 deletions(-) create mode 100644 Content.Server/_Shitmed/Body/Organ/HeartSystem.cs create mode 100644 Content.Server/_Shitmed/DelayedDeath/DelayedDeathComponent.cs create mode 100644 Content.Server/_Shitmed/DelayedDeath/DelayedDeathSystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/SurgeryStepDamageChangeEvent.cs rename Resources/Prototypes/{_Goobstation => _Shitmed}/Body/Organs/Animal/space.yml (100%) rename Resources/Prototypes/{_Goobstation => _Shitmed}/Body/Parts/animal.yml (94%) rename Resources/Prototypes/{_Goobstation => _Shitmed}/Body/Prototypes/Animal/carp.yml (100%) rename Resources/Prototypes/{_Goobstation => _Shitmed}/status_effects.yml (93%) rename Resources/Textures/{_Goobstation => _Shitmed}/Mobs/Aliens/Carps/carp_parts.rsi/meta.json (100%) rename Resources/Textures/{_Goobstation => _Shitmed}/Mobs/Aliens/Carps/carp_parts.rsi/tail.png (100%) rename Resources/Textures/{_Goobstation => _Shitmed}/Mobs/Aliens/Carps/carp_parts.rsi/torso.png (100%) diff --git a/Content.Client/Smoking/MatchstickSystem.cs b/Content.Client/Smoking/MatchstickSystem.cs index 9c241a2a8b1..42b8b32b33e 100644 --- a/Content.Client/Smoking/MatchstickSystem.cs +++ b/Content.Client/Smoking/MatchstickSystem.cs @@ -1,5 +1,9 @@ +// Shitmed Change Start + using Content.Shared.Smoking.Systems; namespace Content.Client.Smoking; public sealed class MatchstickSystem : SharedMatchstickSystem; + +// Shitmed Change End \ No newline at end of file diff --git a/Content.Server/Body/Systems/BodySystem.cs b/Content.Server/Body/Systems/BodySystem.cs index 5952fc003a5..a2ef54c6133 100644 --- a/Content.Server/Body/Systems/BodySystem.cs +++ b/Content.Server/Body/Systems/BodySystem.cs @@ -165,7 +165,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 f40783ffb5c..f68ce386b28 100644 --- a/Content.Server/Body/Systems/BrainSystem.cs +++ b/Content.Server/Body/Systems/BrainSystem.cs @@ -2,17 +2,21 @@ using Content.Server.Ghost.Components; using Content.Shared.Body.Components; using Content.Shared.Body.Events; -using Content.Shared._Shitmed.Body.Organ; // Shitmed Change using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Pointing; +// Shitmed Change +using Content.Shared._Shitmed.Body.Organ; +using Content.Server._Shitmed.DelayedDeath; +using Content.Shared.Body.Systems; + namespace Content.Server.Body.Systems { public sealed class BrainSystem : EntitySystem { [Dependency] private readonly SharedMindSystem _mindSystem = default!; - + [Dependency] private readonly SharedBodySystem _bodySystem = default!; // Shitmed Change public override void Initialize() { base.Initialize(); @@ -30,6 +34,7 @@ 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) @@ -38,6 +43,8 @@ private void HandleAddition(EntityUid uid, BrainComponent _, ref OrganAddedToBod return; RemComp(args.Body); + if (_bodySystem.TryGetBodyOrganEntityComps(args.Body, out var _)) + RemComp(args.Body); HandleMind(args.Body, uid); } // Shitmed Change End diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index 9f56bedb4c3..420aaae8500 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -1,7 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; -using Content.Shared._Shitmed.Body.Components; // GoobStation +using Content.Shared._Shitmed.Body.Components; // Shitmed Change using Content.Shared._Shitmed.Body.Organ; // Shitmed Change using Content.Server.Chat.Systems; using Content.Server.EntityEffects.EffectConditions; @@ -21,6 +21,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Timing; + namespace Content.Server.Body.Systems; [UsedImplicitly] @@ -73,7 +74,7 @@ public override void Update(float frameTime) respirator.NextUpdate += respirator.UpdateInterval; - if (_mobState.IsDead(uid) || HasComp(uid)) // GoobStation: BreathingImmunity + if (_mobState.IsDead(uid) || HasComp(uid)) // Shitmed: BreathingImmunity continue; // Begin DeltaV Code: Addition: @@ -86,7 +87,7 @@ public override void Update(float frameTime) // End DeltaV Code UpdateSaturation(uid, multiplier * (float) respirator.UpdateInterval.TotalSeconds, respirator); // DeltaV: use multiplier instead of negating - if (!_mobState.IsIncapacitated(uid) || HasComp(uid)) // Shitmed Change - Cannot breathe in crit or when no brain. + if (!_mobState.IsIncapacitated(uid) && !HasComp(uid)) // Shitmed Change - Cannot breathe in crit or when no brain. { switch (respirator.Status) { @@ -304,7 +305,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.Server/Light/EntitySystems/MatchboxSystem.cs b/Content.Server/Light/EntitySystems/MatchboxSystem.cs index e4925c610dd..5b1d98beca4 100644 --- a/Content.Server/Light/EntitySystems/MatchboxSystem.cs +++ b/Content.Server/Light/EntitySystems/MatchboxSystem.cs @@ -2,7 +2,7 @@ using Content.Server.Storage.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Smoking; -using Content.Shared.Smoking.Components; +using Content.Shared.Smoking.Components; // Shitmed Change namespace Content.Server.Light.EntitySystems { diff --git a/Content.Server/Light/EntitySystems/MatchstickSystem.cs b/Content.Server/Light/EntitySystems/MatchstickSystem.cs index 6748fa9ce66..2219fb0588c 100644 --- a/Content.Server/Light/EntitySystems/MatchstickSystem.cs +++ b/Content.Server/Light/EntitySystems/MatchstickSystem.cs @@ -3,8 +3,8 @@ using Content.Shared.Interaction; using Content.Shared.Item; using Content.Shared.Smoking; -using Content.Shared.Smoking.Components; -using Content.Shared.Smoking.Systems; +using Content.Shared.Smoking.Components; // Shitmed Change +using Content.Shared.Smoking.Systems; // Shitmed Change using Content.Shared.Temperature; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -13,7 +13,7 @@ namespace Content.Server.Light.EntitySystems { - public sealed class MatchstickSystem : SharedMatchstickSystem + public sealed class MatchstickSystem : SharedMatchstickSystem // Shitmed Change { [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -85,15 +85,16 @@ public void Ignite(Entity matchstick, EntityUid user) _audio.PlayPvs(component.IgniteSound, matchstick, AudioParams.Default.WithVariation(0.125f).WithVolume(-0.125f)); // Change state - SetState((matchstick, component), SmokableState.Lit); + SetState((matchstick, component), SmokableState.Lit); // Shitmed Change _litMatches.Add(matchstick); matchstick.Owner.SpawnTimer(component.Duration * 1000, delegate { - SetState((matchstick, component), SmokableState.Burnt); + SetState((matchstick, component), SmokableState.Burnt); // Shitmed Change _litMatches.Remove(matchstick); }); } + // Shitmed Change Start public override bool SetState(Entity ent, SmokableState value) { if (!base.SetState(ent, value)) @@ -101,6 +102,8 @@ public override bool SetState(Entity ent, SmokableState val var (uid, component) = ent; + // Shitmed Change End + if (_lights.TryGetLight(uid, out var pointLightComponent)) { _lights.SetEnabled(uid, component.CurrentState == SmokableState.Lit, pointLightComponent); @@ -124,7 +127,8 @@ public override bool SetState(Entity ent, SmokableState val _appearance.SetData(uid, SmokingVisuals.Smoking, component.CurrentState, appearance); } - return true; + + return true; // Shitmed Change } } } diff --git a/Content.Server/_Shitmed/Body/Organ/HeartSystem.cs b/Content.Server/_Shitmed/Body/Organ/HeartSystem.cs new file mode 100644 index 00000000000..6a76fee77b3 --- /dev/null +++ b/Content.Server/_Shitmed/Body/Organ/HeartSystem.cs @@ -0,0 +1,38 @@ +using Content.Shared.Body.Events; +using Content.Server.Body.Components; +using Content.Shared.Body.Systems; +using Content.Shared._Shitmed.Body.Organ; +using Content.Server._Shitmed.DelayedDeath; + +namespace Content.Server._Shitmed.Body.Organ; + +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/_Shitmed/DelayedDeath/DelayedDeathComponent.cs b/Content.Server/_Shitmed/DelayedDeath/DelayedDeathComponent.cs new file mode 100644 index 00000000000..a844816c8ae --- /dev/null +++ b/Content.Server/_Shitmed/DelayedDeath/DelayedDeathComponent.cs @@ -0,0 +1,16 @@ +namespace Content.Server._Shitmed.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; +} diff --git a/Content.Server/_Shitmed/DelayedDeath/DelayedDeathSystem.cs b/Content.Server/_Shitmed/DelayedDeath/DelayedDeathSystem.cs new file mode 100644 index 00000000000..33517bc0480 --- /dev/null +++ b/Content.Server/_Shitmed/DelayedDeath/DelayedDeathSystem.cs @@ -0,0 +1,28 @@ +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Mobs.Systems; +using Robust.Shared.Prototypes; +namespace Content.Server._Shitmed.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); + } + } + } +} diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs index d8c52e3bdf7..34e02772c0b 100644 --- a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -47,8 +47,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); @@ -129,15 +131,8 @@ 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 OnSurgeryDamageChange(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; - var damageChange = ent.Comp.Damage; if (HasComp(args.Body)) damageChange = damageChange * ent.Comp.SleepModifier; @@ -145,17 +140,12 @@ private void OnSurgeryDamageChange(Entity en SetDamage(args.Body, damageChange, 0.5f, args.User, args.Part); } - private void OnSurgerySpecialDamageChange(Entity ent, ref SurgeryStepEvent args) + private void OnSurgerySpecialDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent 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) + && TryComp(ent, out BlindableComponent? blindComp) && blindComp.EyeDamage > 0) _blindableSystem.AdjustEyeDamage((args.Body, blindComp), -blindComp!.EyeDamage); } diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index e2f6eb16123..4a1847120a2 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -15,6 +15,13 @@ public sealed partial class OrganComponent : Component, ISurgeryToolComponent // [DataField, AutoNetworkedField] public EntityUid? Body; + /// + /// Shitmed Change:Relevant body this organ originally belonged to. + /// FOR WHATEVER FUCKING REASON AUTONETWORKING THIS CRASHES GIBTEST AAAAAAAAAAAAAAA + /// + [DataField] + public EntityUid? OriginalBody; + // Shitmed Change Start /// /// Shitmed Change: Shitcodey solution to not being able to know what name corresponds to each organ's slot ID diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 7ecc13fbcab..f246c381b7f 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -385,6 +385,7 @@ public virtual HashSet GibPart( if (IsPartRoot(bodyEnt, partId, part: part)) return gibs; + ChangeSlotState((partId, part), true); RemovePartChildren((partId, part), bodyEnt); foreach (var organ in GetPartOrgans(partId, part)) { diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index 6fc559cc6b0..c356c4be81d 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; // Shitmed Change using Robust.Shared.Containers; namespace Content.Shared.Body.Systems; @@ -20,10 +21,17 @@ private void AddOrgan( if (organEnt.Comp.Body is not null) { + organEnt.Comp.OriginalBody = organEnt.Comp.Body; // Shitmed Change var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref addedInBodyEv); } + // Shitmed Change Start + if (TryComp(parentPartUid, out DamageableComponent? damageable) + && damageable.TotalDamage > 200) + TrySetOrganUsed(organEnt, true, organEnt.Comp); + // Shitmed Change End + Dirty(organEnt, organEnt.Comp); } @@ -211,14 +219,14 @@ public bool TryGetBodyOrganEntityComps( } // Shitmed Change Start - + 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 b28b0ca891d..0389edbef25 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -106,13 +106,13 @@ private void EnablePart(Entity partEnt) public void ChangeSlotState(Entity partEnt, bool disable) { if (partEnt.Comp.Body is not null - && TryComp(partEnt.Comp.Body, out var inventory) // GoobStation: Prevent error for non-humanoids + && TryComp(partEnt.Comp.Body, out var inventory) // Prevent error for non-humanoids && GetBodyPartCount(partEnt.Comp.Body.Value, partEnt.Comp.PartType) == 1 && TryGetPartSlotContainerName(partEnt.Comp.PartType, out var containerNames)) { foreach (var containerName in containerNames) { - _inventorySystem.SetSlotStatus(partEnt.Comp.Body.Value, containerName, disable, inventory); // GoobStation: pass inventory + _inventorySystem.SetSlotStatus(partEnt.Comp.Body.Value, containerName, disable, inventory); var ev = new RefreshInventorySlotsEvent(containerName); RaiseLocalEvent(partEnt.Comp.Body.Value, ev); } @@ -567,7 +567,7 @@ public bool CanAttachPart( } /// - /// GoobStation: Returns true if this parentId supports attaching a new part to the specified slot. + /// Shitmed Change: Returns true if this parentId supports attaching a new part to the specified slot. /// public bool CanAttachToSlot( EntityUid parentId, diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index 95f80f86e43..574ffeedafb 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -338,10 +338,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/Content.Shared/Smoking/Components/MatchstickComponent.cs b/Content.Shared/Smoking/Components/MatchstickComponent.cs index 527553549b5..0d8c91bab5e 100644 --- a/Content.Shared/Smoking/Components/MatchstickComponent.cs +++ b/Content.Shared/Smoking/Components/MatchstickComponent.cs @@ -1,3 +1,5 @@ +// Shitmed Change Start + using Content.Shared.Smoking.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; @@ -26,3 +28,5 @@ public sealed partial class MatchstickComponent : Component [DataField(required: true)] public SoundSpecifier IgniteSound = default!; } + +// Shitmed Change End \ No newline at end of file diff --git a/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs b/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs index bda75c42d29..684a9647066 100644 --- a/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs +++ b/Content.Shared/Smoking/Systems/SharedMatchstickSystem.cs @@ -1,3 +1,4 @@ +// Shitmed Change Start using Content.Shared.Smoking.Components; namespace Content.Shared.Smoking.Systems; @@ -13,4 +14,5 @@ public virtual bool SetState(Entity ent, SmokableState stat Dirty(ent); return true; } -} +} +// Shitmed Change End diff --git a/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs b/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs index 7add1f261ed..b5cdac8614f 100644 --- a/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs +++ b/Content.Shared/_Shitmed/Body/Components/BreathingImmunityComponent.cs @@ -1,8 +1,8 @@ namespace Content.Shared._Shitmed.Body.Components; /// -/// GoobStation: Disables a mobs need for air when this component is added. -/// It will neither breathe nor take airloss damage. +/// Disables a mobs need for air when this component is added. +/// It will neither breathe nor take airloss damage. /// [RegisterComponent] public sealed partial class BreathingImmunityComponent : Component; diff --git a/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs b/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs index 9d07ca797d5..9f6e4d92c0b 100644 --- a/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs +++ b/Content.Shared/_Shitmed/Body/Organ/DebrainedComponent.cs @@ -4,4 +4,3 @@ namespace Content.Shared._Shitmed.Body.Organ; [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/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs index 199870fa6d3..8a9627e89e1 100644 --- a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs @@ -22,8 +22,8 @@ private void InitializePartAppearances() SubscribeLocalEvent(OnPartAppearanceStartup); SubscribeLocalEvent(HandleState); - SubscribeLocalEvent(OnPartAttachedToBody); - SubscribeLocalEvent(OnPartDroppedFromBody); + SubscribeLocalEvent(OnPartAttachedToBody); + SubscribeLocalEvent(OnPartDroppedFromBody); } private void OnPartAppearanceStartup(EntityUid uid, BodyPartAppearanceComponent component, ComponentStartup args) @@ -131,7 +131,7 @@ public void ModifyMarkings(EntityUid uid, private void HandleState(EntityUid uid, BodyPartAppearanceComponent component, ref AfterAutoHandleStateEvent args) => ApplyPartMarkings(uid, component); - private void OnPartAttachedToBody(EntityUid uid, BodyComponent component, ref BodyPartAttachedEvent args) + private void OnPartAttachedToBody(EntityUid uid, BodyComponent component, ref BodyPartAddedEvent args) { if (!TryComp(args.Part, out BodyPartAppearanceComponent? partAppearance) || !TryComp(uid, out HumanoidAppearanceComponent? bodyAppearance)) @@ -143,7 +143,7 @@ private void OnPartAttachedToBody(EntityUid uid, BodyComponent component, ref Bo UpdateAppearance(uid, partAppearance); } - private void OnPartDroppedFromBody(EntityUid uid, BodyComponent component, ref BodyPartDroppedEvent args) + private void OnPartDroppedFromBody(EntityUid uid, BodyComponent component, ref BodyPartRemovedEvent args) { if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.Part) @@ -166,7 +166,10 @@ protected void UpdateAppearance(EntityUid target, return; if (component.EyeColor != null) + { bodyAppearance.EyeColor = component.EyeColor.Value; + _humanoid.SetLayerVisibility(target, HumanoidVisualLayers.Eyes, true, true, bodyAppearance); + } if (component.Color != null) _humanoid.SetBaseLayerColor(target, component.Type, component.Color, true, bodyAppearance); @@ -177,7 +180,9 @@ protected void UpdateAppearance(EntityUid target, { _humanoid.SetLayerVisibility(target, visualLayer, true, true, bodyAppearance); foreach (var marking in markingList) - _humanoid.AddMarking(target, marking.MarkingId, marking.MarkingColors, false, true, bodyAppearance); + { + _humanoid.AddMarking(target, marking.MarkingId, marking.MarkingColors, true, true, bodyAppearance); + } } Dirty(target, bodyAppearance); diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs index 0d0dbbfc39b..16292a54dbc 100644 --- a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs @@ -7,7 +7,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; public sealed partial class SurgeryPartRemovedConditionComponent : Component { /// - /// GoobStation: Requires that the parent part can attach a new part to this slot. + /// Requires that the parent part can attach a new part to this slot. /// [DataField(required: true)] public string Connection = string.Empty; diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index 9d3ff4255f6..d628e554cdd 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -423,6 +423,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; } } @@ -593,26 +599,29 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S if (!CanPerformStep(user, body, part, step, true, out _, out _, out var validTools)) return; - // make the doafter longer for ghetto tools, or shorter for advanced ones var speed = 1f; var usedEv = new SurgeryToolUsedEvent(user, body); - foreach (var (tool, toolSpeed) in validTools!) + // We need to check for nullability because of surgeries that dont require a tool, like Cavity Implants + if (validTools?.Count > 0) { - RaiseLocalEvent(tool, ref usedEv); - if (usedEv.Cancelled) - return; + foreach (var (tool, toolSpeed) in validTools) + { + RaiseLocalEvent(tool, ref usedEv); + if (usedEv.Cancelled) + return; - speed *= toolSpeed; - } + speed *= toolSpeed; + } - if (_net.IsServer) - { - foreach (var tool in validTools.Keys) + if (_net.IsServer) { - if (TryComp(tool, out SurgeryToolComponent? toolComp) && - toolComp.EndSound != null) + foreach (var tool in validTools.Keys) { - _audio.PlayEntity(toolComp.StartSound, user, tool); + if (TryComp(tool, out SurgeryToolComponent? toolComp) && + toolComp.EndSound != null) + { + _audio.PlayEntity(toolComp.StartSound, user, tool); + } } } } @@ -622,7 +631,7 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S var ev = new SurgeryDoAfterEvent(args.Surgery, args.Step); // TODO: Move 2 seconds to a field of SurgeryStepComponent - var duration = 2f * speed; + var duration = 2f / speed; if (TryComp(user, out SurgerySpeedModifierComponent? surgerySpeedMod) && surgerySpeedMod is not null) duration = duration / surgerySpeedMod.SpeedModifier; diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryStepDamageChangeEvent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryStepDamageChangeEvent.cs new file mode 100644 index 00000000000..aca17499ce5 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SurgeryStepDamageChangeEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Damage; + +namespace Content.Shared._Shitmed.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/_Shitmed/Surgery/Tools/BoneGelComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs index 456c507793e..4c479e9b036 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneGelComponent.cs @@ -6,7 +6,9 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; public sealed partial class BoneGelComponent : Component, ISurgeryToolComponent { public string ToolName => "bone gel"; + public bool? Used { get; set; } = null; + [DataField] public float Speed { get; set; } = 1f; } diff --git a/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs index c2b0676ffdf..ecf06bd4703 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/ISurgeryToolComponent.cs @@ -5,13 +5,15 @@ public interface ISurgeryToolComponent [DataField] public string ToolName { get; } - // Mostly intended for discardable or non-reusable tools. + /// + /// Field intended for discardable or non-reusable tools. + /// [DataField] public bool? Used { get; set; } /// - /// GoobStation: Multiply the step's doafter by this value. - /// This is per-type so you can have something that's a good scalpel but a bad retractor. + /// Multiply the step's doafter by this value. + /// This is per-type so you can have something that's a good scalpel but a bad retractor. /// [DataField] public float Speed { get; set; } diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs index 0295d5192b9..6c78e9e3789 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolComponent.cs @@ -16,8 +16,8 @@ public sealed partial class SurgeryToolComponent : Component } /// -/// GoobStation: Raised on a tool to see if it can be used in a surgery step. -/// If this is cancelled the step can't be completed. +/// Raised on a tool to see if it can be used in a surgery step. +/// If this is cancelled the step can't be completed. /// [ByRefEvent] public record struct SurgeryToolUsedEvent(EntityUid User, EntityUid Target, bool Cancelled = false); diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs index 4d1c1048653..0c2ff64722c 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolConditionsSystem.cs @@ -9,7 +9,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; /// -/// GoobStation: Prevents using esword or welder when off, laser when no charges. +/// Prevents using esword or welder when off, laser when no charges. /// public sealed class SurgeryToolConditionsSystem : EntitySystem { diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs index 7426d4f88fa..753623127bb 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs @@ -7,7 +7,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; /// -/// GoobStation: Examining a surgical or ghetto tool shows everything it can be used for. +/// Examining a surgical or ghetto tool shows everything it can be used for. /// public sealed class SurgeryToolExamineSystem : EntitySystem { diff --git a/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs index 51596ae0002..1d4d9325a63 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/TendingComponent.cs @@ -3,7 +3,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; /// -/// GoobStation: Like Hemostat but lets ghetto tools be used differently for clamping and tending wounds. +/// Like Hemostat but lets ghetto tools be used differently for clamping and tending wounds. /// [RegisterComponent, NetworkedComponent] public sealed partial class TendingComponent : Component, ISurgeryToolComponent diff --git a/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs index 068fb5bf463..0b5f6f65e07 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/TweezersComponent.cs @@ -3,7 +3,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; /// -/// GoobStation: Like Hemostat but lets ghetto tools be used differently for clamping and removing organs. +/// Like Hemostat but lets ghetto tools be used differently for clamping and removing organs. /// [RegisterComponent, NetworkedComponent] public sealed partial class TweezersComponent : Component, ISurgeryToolComponent diff --git a/Resources/Prototypes/Body/Organs/Animal/animal.yml b/Resources/Prototypes/Body/Organs/Animal/animal.yml index a5d964a5240..28f4f4b5780 100644 --- a/Resources/Prototypes/Body/Organs/Animal/animal.yml +++ b/Resources/Prototypes/Body/Organs/Animal/animal.yml @@ -41,7 +41,7 @@ - state: lung-l - state: lung-r - type: Organ - slotId: lungs # GoobStation + slotId: lungs # Shitmed - type: Lung - type: Metabolizer removeEmpty: true @@ -74,7 +74,7 @@ - type: Sprite state: stomach - type: Organ - slotId: stomach # GoobStation + slotId: stomach # Shitmed - type: SolutionContainerManager solutions: stomach: @@ -118,14 +118,14 @@ - type: Sprite state: liver - type: Organ - slotId: liver # GoobStation + slotId: liver # Shitmed - type: Metabolizer maxReagents: 1 metabolizerTypes: [ Animal ] groups: - id: Alcohol rateModifier: 0.1 - - type: Liver # GoobStation + - type: Liver # Shitmed - type: Tag # goob edit tags: - Meat @@ -144,7 +144,7 @@ - type: Sprite state: heart-on - type: Organ - slotId: heart # GoobStation + slotId: heart # Shitmed - type: Metabolizer maxReagents: 2 metabolizerTypes: [ Animal ] @@ -152,18 +152,15 @@ - id: Medicine - id: Poison - id: Narcotic -<<<<<<< HEAD - - type: Item - size: Small - heldPrefix: heart -======= - - type: Heart # GoobStation + - type: Heart # Shitmed - type: Tag # goob edit tags: - Meat - Organ - Heart ->>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) + - type: Item + size: Small + heldPrefix: heart - type: entity id: OrganAnimalKidneys @@ -176,7 +173,7 @@ - state: kidney-l - state: kidney-r - type: Organ - slotId: kidneys # GoobStation + slotId: kidneys # Shitmed - type: Metabolizer maxReagents: 5 metabolizerTypes: [ Animal ] diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index 1a610f18514..04796164674 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -34,7 +34,7 @@ - type: Sprite sprite: Mobs/Species/Arachnid/organs.rsi state: stomach - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: stomach - type: Stomach updateInterval: 1.5 @@ -63,7 +63,7 @@ layers: - state: lung-l - state: lung-r - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: lungs - type: Lung - type: Metabolizer @@ -109,17 +109,14 @@ - id: Medicine - id: Poison - id: Narcotic -<<<<<<< HEAD -======= - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: heart - - type: Heart # GoobStation: Lets you transplant spider hearts into other species + - type: Heart # Shitmed: Lets you transplant spider hearts into other species - type: Tag # goob edit tags: - Meat - Organ - Heart ->>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) - type: entity id: OrganArachnidLiver @@ -140,17 +137,14 @@ groups: - id: Alcohol rateModifier: 0.1 # removes alcohol very slowly along with the stomach removing it as a drink -<<<<<<< HEAD -======= - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: liver - - type: Liver # GoobStation + - type: Liver # Shitmed - type: Tag # goob edit tags: - Meat - Organ - Liver ->>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) - type: entity id: OrganArachnidKidneys @@ -183,20 +177,17 @@ layers: - state: eyeball-l - state: eyeball-r -<<<<<<< HEAD - - type: Item - size: Small - heldPrefix: eyeballs -======= - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: eyes - - type: Eyes # GoobStation + - type: Eyes # Shitmed - type: Tag # goob edit tags: - Meat - Organ - Eyes ->>>>>>> f00571107f (surgery update (animal and moth surgery) (#882)) + - type: Item + size: Small + heldPrefix: eyeballs - type: entity id: OrganArachnidTongue diff --git a/Resources/Prototypes/Body/Organs/diona.yml b/Resources/Prototypes/Body/Organs/diona.yml index 45d8e4d533a..369581645a3 100644 --- a/Resources/Prototypes/Body/Organs/diona.yml +++ b/Resources/Prototypes/Body/Organs/diona.yml @@ -36,9 +36,9 @@ heldPrefix: brain - type: Sprite state: brain - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: Brain - - type: Brain # GoobStation + - type: Brain # Shitmed - type: SolutionContainerManager solutions: organ: @@ -65,7 +65,7 @@ layers: - state: eyeball-l - state: eyeball-r - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: eyes - type: Tag # goob edit tags: @@ -90,7 +90,7 @@ reagents: - ReagentId: UncookedAnimalProteins Quantity: 5 - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: stomach - type: Stomach - type: Metabolizer @@ -117,7 +117,7 @@ components: - type: Sprite state: lungs - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: lungs - type: Lung - type: Metabolizer diff --git a/Resources/Prototypes/Body/Organs/moth.yml b/Resources/Prototypes/Body/Organs/moth.yml index 4c9c47d13a5..969470b07c2 100644 --- a/Resources/Prototypes/Body/Organs/moth.yml +++ b/Resources/Prototypes/Body/Organs/moth.yml @@ -2,7 +2,7 @@ id: OrganMothStomach parent: [OrganAnimalStomach, OrganHumanStomach] categories: [ HideSpawnMenu ] - name: moth stomach # GoobStation + name: moth stomach # Shitmed components: - type: Stomach specialDigestible: diff --git a/Resources/Prototypes/Body/Organs/slime.yml b/Resources/Prototypes/Body/Organs/slime.yml index daabdcc716f..84450ad74dd 100644 --- a/Resources/Prototypes/Body/Organs/slime.yml +++ b/Resources/Prototypes/Body/Organs/slime.yml @@ -37,7 +37,7 @@ size: Small heldPrefix: brain - + - type: entity id: OrganSlimeLungs parent: BaseHumanOrgan @@ -49,7 +49,7 @@ layers: - state: lung-l-slime - state: lung-r-slime - - type: Organ # GoobStation + - type: Organ # Shitmed slotId: lungs - type: Lung alert: LowNitrogen diff --git a/Resources/Prototypes/Body/Organs/vox.yml b/Resources/Prototypes/Body/Organs/vox.yml index 4036ae011dc..e3fda8a57be 100644 --- a/Resources/Prototypes/Body/Organs/vox.yml +++ b/Resources/Prototypes/Body/Organs/vox.yml @@ -3,7 +3,7 @@ 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" - name: vox lungs # GoobStation + name: vox lungs # Shitmed components: - type: Sprite sprite: Mobs/Species/Vox/organs.rsi diff --git a/Resources/Prototypes/Body/Parts/silicon.yml b/Resources/Prototypes/Body/Parts/silicon.yml index 3b0f2540963..a0e5e341cba 100644 --- a/Resources/Prototypes/Body/Parts/silicon.yml +++ b/Resources/Prototypes/Body/Parts/silicon.yml @@ -26,6 +26,14 @@ guides: - Cyborgs - Robotics + # Shitmed Change Start + - type: SurgeryTool + startSound: + path: /Audio/_Shitmed/Medical/Surgery/organ1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/organ2.ogg + - type: Gibbable + # Shitmed Change End - type: entity id: LeftArmBorg @@ -33,7 +41,7 @@ name: cyborg left arm components: - type: BodyPart - partType: Hand + partType: Arm # Shitmed Change symmetry: Left - type: Sprite state: borg_l_arm @@ -51,7 +59,7 @@ name: cyborg right arm components: - type: BodyPart - partType: Hand + partType: Arm # Shitmed Change symmetry: Right - type: Sprite state: borg_r_arm @@ -80,6 +88,7 @@ - Trash - BorgLeg - BorgLLeg + - type: MovementBodyPart # Shitmed Change - type: entity id: RightLegBorg @@ -98,6 +107,7 @@ - Trash - BorgLeg - BorgRLeg + - type: MovementBodyPart # Shitmed Change - type: entity id: LightHeadBorg diff --git a/Resources/Prototypes/Body/Prototypes/arachnid.yml b/Resources/Prototypes/Body/Prototypes/arachnid.yml index 7036d7babf8..43062719303 100644 --- a/Resources/Prototypes/Body/Prototypes/arachnid.yml +++ b/Resources/Prototypes/Body/Prototypes/arachnid.yml @@ -23,7 +23,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed right arm: part: RightArmArachnid connections: diff --git a/Resources/Prototypes/Body/Prototypes/diona.yml b/Resources/Prototypes/Body/Prototypes/diona.yml index 691f055ff43..01335587b4e 100644 --- a/Resources/Prototypes/Body/Prototypes/diona.yml +++ b/Resources/Prototypes/Body/Prototypes/diona.yml @@ -16,7 +16,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed organs: stomach: OrganDionaStomachNymph lungs: OrganDionaLungsNymph diff --git a/Resources/Prototypes/Body/Prototypes/dwarf.yml b/Resources/Prototypes/Body/Prototypes/dwarf.yml index a580a02531b..5dc18ef739c 100644 --- a/Resources/Prototypes/Body/Prototypes/dwarf.yml +++ b/Resources/Prototypes/Body/Prototypes/dwarf.yml @@ -17,7 +17,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed organs: heart: OrganDwarfHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/gingerbread.yml b/Resources/Prototypes/Body/Prototypes/gingerbread.yml index eaf6cf06da7..c5823dbce6b 100644 --- a/Resources/Prototypes/Body/Prototypes/gingerbread.yml +++ b/Resources/Prototypes/Body/Prototypes/gingerbread.yml @@ -17,7 +17,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed organs: heart: OrganHumanHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/human.yml b/Resources/Prototypes/Body/Prototypes/human.yml index 8b601530a9d..00f1a3c31b5 100644 --- a/Resources/Prototypes/Body/Prototypes/human.yml +++ b/Resources/Prototypes/Body/Prototypes/human.yml @@ -18,7 +18,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed organs: heart: OrganHumanHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Body/Prototypes/moth.yml b/Resources/Prototypes/Body/Prototypes/moth.yml index 7bd7f0774c3..c28192e249c 100644 --- a/Resources/Prototypes/Body/Prototypes/moth.yml +++ b/Resources/Prototypes/Body/Prototypes/moth.yml @@ -23,7 +23,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed right arm: part: RightArmMoth connections: diff --git a/Resources/Prototypes/Body/Prototypes/primate.yml b/Resources/Prototypes/Body/Prototypes/primate.yml index 3b34fcab2ec..db7a1f6680a 100644 --- a/Resources/Prototypes/Body/Prototypes/primate.yml +++ b/Resources/Prototypes/Body/Prototypes/primate.yml @@ -3,7 +3,7 @@ name: "primate" root: torso slots: - head: # GoobStation: put pun pun into a humans body + head: # Shitmed: put pun pun into a humans body part: HeadAnimal connections: - torso @@ -15,7 +15,7 @@ connections: - hands - legs - - head # GoobStation + - head # Shitmed organs: lungs: OrganAnimalLungs stomach: OrganAnimalStomach diff --git a/Resources/Prototypes/Body/Prototypes/reptilian.yml b/Resources/Prototypes/Body/Prototypes/reptilian.yml index 234351059c4..7f53d3e3ceb 100644 --- a/Resources/Prototypes/Body/Prototypes/reptilian.yml +++ b/Resources/Prototypes/Body/Prototypes/reptilian.yml @@ -23,7 +23,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed right arm: part: RightArmReptilian connections: diff --git a/Resources/Prototypes/Body/Prototypes/skeleton.yml b/Resources/Prototypes/Body/Prototypes/skeleton.yml index f622c133aaf..856518cc98c 100644 --- a/Resources/Prototypes/Body/Prototypes/skeleton.yml +++ b/Resources/Prototypes/Body/Prototypes/skeleton.yml @@ -14,7 +14,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed right arm: part: RightArmSkeleton connections: diff --git a/Resources/Prototypes/Body/Prototypes/slime.yml b/Resources/Prototypes/Body/Prototypes/slime.yml index ff7d9d62d62..b74c239b850 100644 --- a/Resources/Prototypes/Body/Prototypes/slime.yml +++ b/Resources/Prototypes/Body/Prototypes/slime.yml @@ -14,7 +14,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed organs: core: SentientSlimeCore lungs: OrganSlimeLungs diff --git a/Resources/Prototypes/Body/Prototypes/vox.yml b/Resources/Prototypes/Body/Prototypes/vox.yml index 54f66af81ba..d919a2a91a3 100644 --- a/Resources/Prototypes/Body/Prototypes/vox.yml +++ b/Resources/Prototypes/Body/Prototypes/vox.yml @@ -17,7 +17,7 @@ - left arm - right leg - left leg - - head # GoobStation + - head # Shitmed organs: heart: OrganHumanHeart lungs: OrganVoxLungs diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index 7bba170657b..0d2262b2000 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -30,7 +30,7 @@ type: HumanoidMarkingModifierBoundUserInterface enum.StrippingUiKey.Key: type: StrippableBoundUserInterface - enum.SurgeryUIKey.Key: # GoobStation + enum.SurgeryUIKey.Key: # Shitmed type: SurgeryBui - type: Sprite scale: 0.9, 0.9 diff --git a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml index e56d01d357d..2a7d3a79896 100644 --- a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml +++ b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml @@ -180,4 +180,4 @@ types: Slash: 200 -# Shitmed Change End \ No newline at end of file +# Shitmed Change End diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index ac0a4b79b48..11a3a8d0c6c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -560,7 +560,7 @@ - Mouse - type: Body prototype: Mothroach - - type: SurgeryTarget # GoobStation + - type: SurgeryTarget # Shitmed - type: TypingIndicator proto: moth - type: Destructible @@ -579,7 +579,7 @@ interfaces: enum.StrippingUiKey.Key: type: StrippableBoundUserInterface - enum.SurgeryUIKey.Key: # GoobStation + enum.SurgeryUIKey.Key: # Shitmed type: SurgeryBui - type: InventorySlots - type: Inventory @@ -869,8 +869,8 @@ - Passive - type: Body prototype: AnimalRuminant - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui @@ -951,8 +951,8 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui @@ -1044,8 +1044,8 @@ - Passive - type: Body prototype: AnimalRuminant - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui @@ -1267,8 +1267,8 @@ abstract: true components: - type: CombatMode - - type: SurgeryTarget # GoobStation - - type: Targeting # GoobStation + - type: SurgeryTarget # Shitmed + - type: Targeting # Shitmed - type: Inventory templateId: monkey speciesId: monkey @@ -1323,7 +1323,7 @@ - type: Body prototype: Primate requiredLegs: 1 # TODO: More than 1 leg - - type: UserInterface # GoobStation: Add SurgeryUIKey on top of stripping ui + - type: UserInterface # Shitmed: Add SurgeryUIKey on top of stripping ui interfaces: enum.StrippingUiKey.Key: type: StrippableBoundUserInterface @@ -1643,8 +1643,8 @@ components: - type: Body prototype: Mouse - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui @@ -2335,8 +2335,8 @@ - type: CombatMode - type: Body prototype: AnimalHemocyanin - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 6b8c3d8810c..52d9de26b28 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -86,10 +86,10 @@ interactFailureString: petting-failure-carp interactFailureSound: path: /Audio/Effects/bite.ogg - - type: Body # GoobStation: Special carp organs + - type: Body # Shitmed: Special carp organs prototype: Carp - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui @@ -258,8 +258,8 @@ - type: Body prototype: Bloodsucker requiredLegs: 1 - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 931bf46a4ce..ac0c40676c0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -60,8 +60,8 @@ - type: Body prototype: Rat requiredLegs: 1 # TODO: More than 1 leg - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui @@ -249,8 +249,8 @@ - type: Body prototype: Rat requiredLegs: 1 # TODO: More than 1 leg - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 37c1b2612fc..d822ee888a3 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -93,8 +93,8 @@ - type: Body prototype: Slimes requiredLegs: 1 - - type: SurgeryTarget # GoobStation - - type: UserInterface # GoobStation + - type: SurgeryTarget # Shitmed + - type: UserInterface # Shitmed interfaces: enum.SurgeryUIKey.Key: type: SurgeryBui diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 2116405f142..8fc9f09bb15 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -78,9 +78,9 @@ - type: DeleteOnTrigger - type: StaticPrice price: 0 - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 0.45 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/scalpel1.ogg endSound: diff --git a/Resources/Prototypes/Entities/Objects/Misc/pen.yml b/Resources/Prototypes/Entities/Objects/Misc/pen.yml index fd64bffcbff..45f90f9603b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/pen.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/pen.yml @@ -42,9 +42,9 @@ damage: types: Piercing: 3 - - type: Tending # GoobStation + - type: Tending # Shitmed speed: 0.55 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg endSound: diff --git a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml index b6d1ddecb22..c1c3fc9877c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml @@ -8,9 +8,9 @@ - type: Item # TODO add inhand sprites for all utensils sprite: Objects/Misc/utensils.rsi - type: SpaceGarbage - - type: Tweezers # GoobStation: Any utensil can poorly remove organs + - type: Tweezers # Shitmed: Any utensil can poorly remove organs speed: 0.2 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg endSound: @@ -57,7 +57,7 @@ damage: types: Piercing: 5 - - type: Tweezers # GoobStation: Forks are better than spoons + - type: Tweezers # Shitmed: Forks are better than spoons speed: 0.35 - type: entity @@ -71,7 +71,7 @@ - type: Utensil types: - Fork - - type: Tweezers # GoobStation: Forks are better than spoons + - type: Tweezers # Shitmed: Forks are better than spoons speed: 0.35 - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index c92f1b52530..fe7e0400af6 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -40,11 +40,11 @@ - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 - - type: Retractor # GoobStation: Same as wirecutters + - type: Retractor # Shitmed: Same as wirecutters speed: 0.35 - type: Hemostat speed: 0.6 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg endSound: @@ -96,9 +96,9 @@ Piercing: 2 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 0.35 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/saw.ogg diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index c36f6587407..e3c358b47af 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -136,7 +136,7 @@ damage: types: Slash: 12 - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 1.25 - type: entity @@ -149,7 +149,7 @@ state: laser - type: Item heldPrefix: laser - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 1.5 # TODO: prevent bleeding from incisions @@ -188,15 +188,15 @@ heldPrefix: hemostat sprite: Objects/Specific/Medical/Surgery/scissors.rsi # Shitmed Change storedRotation: 90 - # Shitmed CHange + # Shitmed Change - type: SurgeryTool startSound: path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg endSound: path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg - type: Hemostat - - type: Tweezers # GoobStation - - type: Tending # GoobStation + - type: Tweezers # Shitmed + - type: Tending # Shitmed # Bone setter - Shitmed Change - type: entity @@ -272,7 +272,7 @@ path: /Audio/Weapons/bladeslice.ogg - type: Tool speedModifier: 0.5 - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 0.5 - type: entity @@ -293,7 +293,7 @@ path: /Audio/Items/drill_hit.ogg - type: Tool speedModifier: 1.5 - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 1.5 - type: entity @@ -310,7 +310,7 @@ attackRate: 1.5 - type: Tool speedModifier: 2.0 - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 2 # ORGANS - SHITMED diff --git a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml index 78ba586fd5a..3fddd6b2884 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml @@ -31,9 +31,9 @@ Steel: 15 # FIXME: Used isnt actually implemented so its still unlimited. # Uncomment this when its implemented, and make sure it handles StackComponent right - #- type: Hemostat # GoobStation + #- type: Hemostat # Shitmed # speed: 0.15 - #- type: SurgeryTool # GoobStation + #- type: SurgeryTool # Shitmed # used: true # startSound: # path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml b/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml index bb2a7450beb..31a6b8ef060 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/crowbars.yml @@ -41,9 +41,9 @@ size: Normal shape: - 0,0,0,1 - - type: Tweezers # GoobStation + - type: Tweezers # Shitmed speed: 0.55 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: /Audio/Items/crowbar.ogg # Standard (grey) Crowbar diff --git a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml index 6a3abea2c03..94f501260b8 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml @@ -88,9 +88,9 @@ radius: 1.1 #smallest possible color: orange - type: ItemTogglePointLight - - type: Cautery # GoobStation + - type: Cautery # Shitmed speed: 0.45 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: collection: lighterOnSounds endSound: diff --git a/Resources/Prototypes/Entities/Objects/Tools/matches.yml b/Resources/Prototypes/Entities/Objects/Tools/matches.yml index 3c2d3a28746..46be9da7f83 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/matches.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/matches.yml @@ -41,9 +41,9 @@ unlitIcon: match_unlit litIcon: match_lit burntIcon: match_burnt - - type: Cautery # GoobStation + - type: Cautery # Shitmed speed: 0.2 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg endSound: diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index 77cc64eb680..d872b82b93b 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -43,11 +43,11 @@ Steel: 100 - type: StaticPrice price: 30 - - type: Retractor # GoobStation + - type: Retractor # Shitmed speed: 0.35 - - type: Hemostat # GoobStation + - type: Hemostat # Shitmed speed: 0.6 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/Items/wirecutter.ogg params: @@ -100,11 +100,11 @@ Steel: 100 - type: StaticPrice price: 30 - - type: Retractor # GoobStation + - type: Retractor # Shitmed speed: 0.45 - - type: Tending # GoobStation + - type: Tending # Shitmed speed: 0.65 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: collection: Screwdriver endSound: diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index adf76533961..b834068ee9e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -105,9 +105,9 @@ price: 40 - type: IgnitionSource temperature: 700 - - type: Cautery # GoobStation + - type: Cautery # Shitmed speed: 0.7 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: collection: Welder endSound: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 7832a03b96d..3e3d9ade859 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -30,9 +30,9 @@ - type: Appearance - type: StaticPrice price: 500 - - type: Cautery # GoobStation + - type: Cautery # Shitmed speed: 0.9 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed endSound: path: /Audio/Weapons/Guns/Gunshots/laser.ogg @@ -70,9 +70,9 @@ - type: ContainerContainer containers: gun_magazine: !type:ContainerSlot - - type: Cautery # GoobStation + - type: Cautery # Shitmed speed: 0.9 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed endSound: path: /Audio/Weapons/Guns/Gunshots/laser.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml index 44889209696..8b4cbe5b967 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml @@ -21,10 +21,10 @@ size: Normal sprite: Objects/Weapons/Melee/armblade.rsi - type: Prying - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 0.3 - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 0.75 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/saw.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index 64f4393ba93..48d840ef870 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -47,9 +47,9 @@ maxVol: 300 - type: UseDelay delay: 1 - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 0.5 # TODO: arm-mounted version becomes 0.65 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/Weapons/chainsawwield.ogg endSound: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 04d982aec79..72a8c957c62 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -71,11 +71,11 @@ - type: Reflect - type: IgnitionSource temperature: 700 - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 0.75 - - type: Cautery # GoobStation: you have to be very, very careful to cauterize with it + - type: Cautery # Shitmed: you have to be very, very careful to cauterize with it speed: 0.2 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/Weapons/ebladehum.ogg endSound: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index e00e812f879..7f0ec0fea18 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -50,11 +50,11 @@ stealGroup: FireAxe - type: IgniteOnMeleeHit fireStacks: -4 - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 0.3 - - type: BoneSaw # GoobStation + - type: BoneSaw # Shitmed speed: 0.5 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/saw.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 219a5aba9cb..cca26e92138 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -27,9 +27,9 @@ - Slicing useSound: path: /Audio/Items/Culinary/chop.ogg - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 0.65 - - type: SurgeryTool # GoobStation + - type: SurgeryTool # Shitmed startSound: path: /Audio/_Shitmed/Medical/Surgery/scalpel1.ogg endSound: @@ -81,9 +81,9 @@ guides: - Chef - FoodRecipes - - type: Scalpel # GoobStation + - type: Scalpel # Shitmed speed: 0.3 - - type: BoneSaw # GoobStation: Better than tg 25% because its a cleaver its meant to hack off limbs + - type: BoneSaw # Shitmed: Better than tg 25% because its a cleaver its meant to hack off limbs speed: 0.5 - type: entity diff --git a/Resources/Prototypes/_Goobstation/Body/Organs/Animal/space.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml similarity index 100% rename from Resources/Prototypes/_Goobstation/Body/Organs/Animal/space.yml rename to Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml diff --git a/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml b/Resources/Prototypes/_Shitmed/Body/Parts/animal.yml similarity index 94% rename from Resources/Prototypes/_Goobstation/Body/Parts/animal.yml rename to Resources/Prototypes/_Shitmed/Body/Parts/animal.yml index 005a1744099..91c452ee961 100644 --- a/Resources/Prototypes/_Goobstation/Body/Parts/animal.yml +++ b/Resources/Prototypes/_Shitmed/Body/Parts/animal.yml @@ -15,7 +15,7 @@ id: BaseCarpPart components: - type: Sprite - sprite: _Goobstation/Mobs/Aliens/Carps/carp_parts.rsi + sprite: _Shitmed/Mobs/Aliens/Carps/carp_parts.rsi - type: entity categories: [ HideSpawnMenu ] diff --git a/Resources/Prototypes/_Goobstation/Body/Prototypes/Animal/carp.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/carp.yml similarity index 100% rename from Resources/Prototypes/_Goobstation/Body/Prototypes/Animal/carp.yml rename to Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/carp.yml diff --git a/Resources/Prototypes/_Goobstation/status_effects.yml b/Resources/Prototypes/_Shitmed/status_effects.yml similarity index 93% rename from Resources/Prototypes/_Goobstation/status_effects.yml rename to Resources/Prototypes/_Shitmed/status_effects.yml index 5e62d994021..7ffdb3e907c 100644 --- a/Resources/Prototypes/_Goobstation/status_effects.yml +++ b/Resources/Prototypes/_Shitmed/status_effects.yml @@ -1,3 +1,3 @@ - type: statusEffect id: BreathingImmunity - alwaysAllowed: true # Used by space animal lungs to work on anything + alwaysAllowed: true # Used by space animal lungs to work on anything \ No newline at end of file diff --git a/Resources/Prototypes/status_effects.yml b/Resources/Prototypes/status_effects.yml index 1eeaf93b095..293b3c8311f 100644 --- a/Resources/Prototypes/status_effects.yml +++ b/Resources/Prototypes/status_effects.yml @@ -36,7 +36,7 @@ - type: statusEffect id: PressureImmunity - alwaysAllowed: true # GoobStation: Used by space animal heart to work on anything + alwaysAllowed: true # Shitmed: Used by space animal heart to work on anything - type: statusEffect id: Muted diff --git a/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Aliens/Carps/carp_parts.rsi/meta.json similarity index 100% rename from Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/meta.json rename to Resources/Textures/_Shitmed/Mobs/Aliens/Carps/carp_parts.rsi/meta.json diff --git a/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/tail.png b/Resources/Textures/_Shitmed/Mobs/Aliens/Carps/carp_parts.rsi/tail.png similarity index 100% rename from Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/tail.png rename to Resources/Textures/_Shitmed/Mobs/Aliens/Carps/carp_parts.rsi/tail.png diff --git a/Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/torso.png b/Resources/Textures/_Shitmed/Mobs/Aliens/Carps/carp_parts.rsi/torso.png similarity index 100% rename from Resources/Textures/_Goobstation/Mobs/Aliens/Carps/carp_parts.rsi/torso.png rename to Resources/Textures/_Shitmed/Mobs/Aliens/Carps/carp_parts.rsi/torso.png From f8c086466cd205462c5b5a93284731d5ec6b94e1 Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Fri, 22 Nov 2024 10:07:11 -0400 Subject: [PATCH 13/40] Hotfix for broken organ transplants (#933) * full fucking send * ope forgot to remove the EE scripts * fix test * fix shitcode fail * DELTA THAT VALUE IS NULLABLE * whoopsie daysie * fixed??? --- Content.Shared/Body/Systems/SharedBodySystem.Organs.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index c356c4be81d..d1c4049e1ca 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -21,7 +21,6 @@ private void AddOrgan( if (organEnt.Comp.Body is not null) { - organEnt.Comp.OriginalBody = organEnt.Comp.Body; // Shitmed Change var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref addedInBodyEv); } @@ -42,6 +41,7 @@ private void RemoveOrgan(Entity organEnt, EntityUid parentPartUi if (organEnt.Comp.Body is { Valid: true } bodyUid) { + organEnt.Comp.OriginalBody = organEnt.Comp.Body; // Shitmed Change var removedInBodyEv = new OrganRemovedFromBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref removedInBodyEv); } From c8ad050c69bffc7a832a64fdb1a52ccc8bb28610 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 23 Nov 2024 09:35:56 +0000 Subject: [PATCH 14/40] allow cloning living people (#932) * allow cloning living people * fix client --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Server/Cloning/CloningConsoleSystem.cs | 2 +- Content.Server/Cloning/CloningSystem.cs | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Content.Server/Cloning/CloningConsoleSystem.cs b/Content.Server/Cloning/CloningConsoleSystem.cs index ad0d642f547..8e8bf9ca838 100644 --- a/Content.Server/Cloning/CloningConsoleSystem.cs +++ b/Content.Server/Cloning/CloningConsoleSystem.cs @@ -213,7 +213,7 @@ private CloningConsoleBoundUserInterfaceState GetUserInterfaceState(CloningConso { scanBodyInfo = MetaData(scanBody.Value).EntityName; - if (!_mobStateSystem.IsDead(scanBody.Value)) + if (false) // GoobStation: Lets you clone living people { clonerStatus = ClonerStatus.ScannerOccupantAlive; } diff --git a/Content.Server/Cloning/CloningSystem.cs b/Content.Server/Cloning/CloningSystem.cs index ab593b607c8..4b7dfc7082b 100644 --- a/Content.Server/Cloning/CloningSystem.cs +++ b/Content.Server/Cloning/CloningSystem.cs @@ -150,7 +150,8 @@ public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity Date: Sat, 23 Nov 2024 17:28:39 +0000 Subject: [PATCH 15/40] fix borg limbs and make borg legs good (#916) * fix borg limbs * 25% speed boost * add container automatically i hope --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Body/Systems/SharedBodySystem.Parts.cs | 6 ++++ Resources/Prototypes/Body/Parts/silicon.yml | 30 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index 0389edbef25..be7041865e7 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -50,6 +50,12 @@ private void OnMapInit(Entity ent, ref MapInitEvent args) _slots.AddItemSlot(ent, ent.Comp.ContainerName, ent.Comp.ItemInsertionSlot); Dirty(ent, ent.Comp); } + // Shitmed Change Start + foreach (var connection in ent.Comp.Children.Keys) + { + Containers.EnsureContainer(ent, GetPartSlotContainerId(connection)); + } + // Shitmed Change End } private void OnBodyPartRemove(Entity ent, ref ComponentRemove args) diff --git a/Resources/Prototypes/Body/Parts/silicon.yml b/Resources/Prototypes/Body/Parts/silicon.yml index a0e5e341cba..d10e7a6991c 100644 --- a/Resources/Prototypes/Body/Parts/silicon.yml +++ b/Resources/Prototypes/Body/Parts/silicon.yml @@ -43,6 +43,11 @@ - type: BodyPart partType: Arm # Shitmed Change symmetry: Left + toolName: "a left arm" # Shitmed Change + children: # Shitmed Change + left hand: + id: "left hand" + type: Hand - type: Sprite state: borg_l_arm - type: Icon @@ -61,6 +66,11 @@ - type: BodyPart partType: Arm # Shitmed Change symmetry: Right + toolName: "a right arm" # Shitmed Change + children: # Shitmed Change + right hand: + id: "right hand" + type: Hand - type: Sprite state: borg_r_arm - type: Icon @@ -79,6 +89,11 @@ - type: BodyPart partType: Leg symmetry: Left + toolName: "a left leg" # Shitmed Change + children: # Shitmed Change + left foot: + id: "left foot" + type: Foot - type: Sprite state: borg_l_leg - type: Icon @@ -88,7 +103,9 @@ - Trash - BorgLeg - BorgLLeg - - type: MovementBodyPart # Shitmed Change + - type: MovementBodyPart # Shitmed Change: 25% speed boost + walkSpeed: 3.125 + sprintSpeed: 5.625 - type: entity id: RightLegBorg @@ -98,6 +115,11 @@ - type: BodyPart partType: Leg symmetry: Right + toolName: "a right leg" # Shitmed Change + children: # Shitmed Change + right foot: + id: "right foot" + type: Foot - type: Sprite state: borg_r_leg - type: Icon @@ -107,7 +129,9 @@ - Trash - BorgLeg - BorgRLeg - - type: MovementBodyPart # Shitmed Change + - type: MovementBodyPart # Shitmed Change: 25% speed boost + walkSpeed: 3.125 + sprintSpeed: 5.625 - type: entity id: LightHeadBorg @@ -116,6 +140,7 @@ components: - type: BodyPart partType: Head + toolName: "a head" # Shitmed Change - type: Sprite state: borg_head - type: Icon @@ -132,6 +157,7 @@ components: - type: BodyPart partType: Torso + toolName: "a torso" # Shitmed Change - type: Sprite state: borg_chest - type: Icon From 7eb7900db147b6f44758b14022cd73057552f644 Mon Sep 17 00:00:00 2001 From: Skubman Date: Fri, 22 Nov 2024 03:38:08 +0800 Subject: [PATCH 16/40] Shitmed Surgery Popups (EE Port) (#918) feat(shitmed): add surgery popups --- .../Surgery/SharedSurgerySystem.Steps.cs | 17 +++++- .../Locale/en-US/_Shitmed/surgery-popup.ftl | 52 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 Resources/Locale/en-US/_Shitmed/surgery-popup.ftl diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index d628e554cdd..f08b83ca871 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/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._Shitmed.Medical.Surgery.Conditions; using Content.Shared._Shitmed.Medical.Surgery.Effects.Step; using Content.Shared._Shitmed.Medical.Surgery.Steps; @@ -646,7 +647,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/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl b/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl new file mode 100644 index 00000000000..8ded2fcaec9 --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/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}. From fd11cee0e0b4b7377daa0207e62b842687e95dbb Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Sun, 24 Nov 2024 21:02:23 -0400 Subject: [PATCH 17/40] Shitmed Update 2 - bottom text (#956) * full fucking send * ope forgot to remove the EE scripts * fix test * fix shitcode fail * DELTA THAT VALUE IS NULLABLE * whoopsie daysie * fixed??? * chat is this real --- Content.Client/Input/ContentContexts.cs | 4 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 14 +- .../_Shitmed/Targeting/TargetingSystem.cs | 16 +- .../Body/Components/BrainComponent.cs | 5 + Content.Server/Body/Systems/BodySystem.cs | 10 + Content.Server/Body/Systems/BrainSystem.cs | 55 +++- .../Thresholds/Behaviors/BurnBodyBehavior.cs | 15 +- .../_Shitmed/Body/Systems/DebrainedSystem.cs | 62 ++++ .../_Shitmed/Body/Systems/EyesSystem.cs | 87 ++++++ .../_Shitmed/Cybernetics/CyberneticsSystem.cs | 55 ++++ .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 5 +- Content.Shared/Body/Organ/OrganComponent.cs | 32 ++- Content.Shared/Body/Part/BodyPartComponent.cs | 39 ++- .../Body/Systems/SharedBodySystem.Body.cs | 25 +- .../Body/Systems/SharedBodySystem.Organs.cs | 79 +++++- .../Body/Systems/SharedBodySystem.Parts.cs | 47 ++- .../Body/Systems/SharedBodySystem.cs | 3 +- .../Damage/Systems/DamageableSystem.cs | 44 ++- .../Damage/Systems/SharedGodmodeSystem.cs | 9 + .../Eye/Blinding/Systems/BlindableSystem.cs | 13 + Content.Shared/Input/ContentKeyFunctions.cs | 6 +- .../Overlays/ShowHealthBarsComponent.cs | 8 + .../Overlays/ShowHealthIconsComponent.cs | 9 + .../Prying/Components/PryingComponent.cs | 6 +- .../_Shitmed/Body/Events/BodyPartEvents.cs | 2 + .../_Shitmed/Body/Organ/OrganEvents.cs | 13 + .../Systems/SharedBodySystem.Targeting.cs | 5 +- .../BodyEffects/BodyPartEffectComponent.cs | 26 ++ .../BodyEffects/BodyPartEffectSystem.cs | 96 +++++++ .../BodyEffects/OrganEffectComponent.cs | 27 ++ .../_Shitmed/BodyEffects/OrganEffectSystem.cs | 110 ++++++++ .../Subsystems/GenerateChildPartComponent.cs | 18 ++ .../Subsystems/GenerateChildPartSystem.cs | 69 +++++ .../Cybernetics/CyberneticsComponent.cs | 16 ++ .../SurgeryComponentConditionComponent.cs | 17 ++ .../Surgery/SharedSurgerySystem.Steps.cs | 45 ++- .../_Shitmed/Surgery/SharedSurgerySystem.cs | 18 +- .../Surgery/Steps/SurgeryStepComponent.cs | 6 + .../Surgery/Tools/BoneSetterComponent.cs | 8 +- ...calDrillComponent.cs => DrillComponent.cs} | 6 +- .../Surgery/Tools/SurgeryToolExamineSystem.cs | 2 +- .../_White/Standing/SharedLayingDownSystem.cs | 4 +- .../Locale/en-US/_Shitmed/surgery-popup.ftl | 1 + .../Locale/en-US/research/technologies.ftl | 5 + .../Prototypes/DeltaV/Body/Organs/harpy.yml | 2 + .../DeltaV/Body/Parts/vulpkanin.yml | 2 +- .../DeltaV/Body/Prototypes/harpy.yml | 1 + .../DeltaV/Body/Prototypes/rodentia.yml | 1 + .../DeltaV/Body/Prototypes/vulpkanin.yml | 1 + .../Entities/Mobs/Cyborgs/borg_chassis.yml | 2 +- .../Prototypes/Entities/Objects/Misc/pen.yml | 14 +- .../Objects/Specific/Medical/surgery.yml | 267 ++++++++++-------- .../Specific/Robotics/borg_modules.yml | 41 +++ .../Entities/Structures/Machines/lathe.yml | 20 ++ .../Entities/Body/Prototypes/felinid.yml | 1 + .../Prototypes/Recipes/Lathes/medical.yml | 55 +++- .../Prototypes/Recipes/Lathes/robotics.yml | 83 ++++++ .../Prototypes/Recipes/Lathes/security.yml | 14 + .../Prototypes/Research/civilianservices.yml | 32 ++- .../_Shitmed/Body/Organs/Animal/space.yml | 12 +- .../_Shitmed/Body/Organs/cybernetic.yml | 51 ++++ .../_Shitmed/Body/Organs/generic.yml | 23 ++ .../_Shitmed/Body/Parts/cybernetic.yml | 169 +++++++++++ .../_Shitmed/Body/Parts/generic.yml | 79 ++++++ .../_Shitmed/Entities/Surgery/surgeries.yml | 36 ++- .../Entities/Surgery/surgery_steps.yml | 110 ++++++-- .../_Shitmed/Species/cybernetics.yml | 47 +++ .../actions_borg.rsi/adv-surgery-module.png | Bin 0 -> 509 bytes .../Actions/actions_borg.rsi/meta.json | 6 + .../actions_borg.rsi/surgery-module.png | Bin 0 -> 475 bytes .../borgmodule.rsi/icon-advanced-surgery.png | Bin 0 -> 254 bytes .../Robotics/borgmodule.rsi/icon-surgery.png | Bin 0 -> 258 bytes .../Robotics/borgmodule.rsi/meta.json | 6 + .../bishop/bishop_alt1.rsi/head.png | Bin 0 -> 1059 bytes .../bishop/bishop_alt1.rsi/meta.json | 15 + .../bishop/bishop_main.rsi/head.png | Bin 0 -> 645 bytes .../bishop/bishop_main.rsi/l_arm-combined.png | Bin 0 -> 388 bytes .../bishop/bishop_main.rsi/l_arm-primary.png | Bin 0 -> 456 bytes .../bishop_main.rsi/l_arm-secondary.png | Bin 0 -> 348 bytes .../bishop/bishop_main.rsi/l_arm-tertiary.png | Bin 0 -> 217 bytes .../bishop/bishop_main.rsi/l_foot.png | Bin 0 -> 325 bytes .../bishop/bishop_main.rsi/l_hand.png | Bin 0 -> 385 bytes .../bishop/bishop_main.rsi/l_leg-combined.png | Bin 0 -> 523 bytes .../bishop/bishop_main.rsi/l_leg-primary.png | Bin 0 -> 620 bytes .../bishop_main.rsi/l_leg-secondary.png | Bin 0 -> 478 bytes .../bishop/bishop_main.rsi/meta.json | 95 +++++++ .../bishop/bishop_main.rsi/r_arm-combined.png | Bin 0 -> 401 bytes .../bishop/bishop_main.rsi/r_arm-primary.png | Bin 0 -> 473 bytes .../bishop_main.rsi/r_arm-secondary.png | Bin 0 -> 353 bytes .../bishop/bishop_main.rsi/r_arm-tertiary.png | Bin 0 -> 219 bytes .../bishop/bishop_main.rsi/r_foot.png | Bin 0 -> 328 bytes .../bishop/bishop_main.rsi/r_hand.png | Bin 0 -> 380 bytes .../bishop/bishop_main.rsi/r_leg-combined.png | Bin 0 -> 525 bytes .../bishop/bishop_main.rsi/r_leg-primary.png | Bin 0 -> 611 bytes .../bishop_main.rsi/r_leg-secondary.png | Bin 0 -> 319 bytes .../bishop/bishop_main.rsi/torso-primary.png | Bin 0 -> 1281 bytes .../bishop_main.rsi/torso-secondary.png | Bin 0 -> 481 bytes .../bishop/bishop_monitor.rsi/head-2.png | Bin 0 -> 371 bytes .../bishop/bishop_monitor.rsi/head.png | Bin 0 -> 630 bytes .../bishop/bishop_monitor.rsi/meta.json | 19 ++ .../hesphiastos_alt1.rsi/head-1.png | Bin 0 -> 6948 bytes .../hesphiastos_alt1.rsi/head-2.png | Bin 0 -> 6871 bytes .../hesphiastos_alt1.rsi/head-3.png | Bin 0 -> 6916 bytes .../hesphiastos_alt1.rsi/meta.json | 23 ++ .../hesphiastos_main.rsi/l_arm-1.png | Bin 0 -> 487 bytes .../hesphiastos_main.rsi/l_arm-2.png | Bin 0 -> 258 bytes .../hesphiastos_main.rsi/l_foot-1.png | Bin 0 -> 390 bytes .../hesphiastos_main.rsi/l_foot-2.png | Bin 0 -> 392 bytes .../hesphiastos_main.rsi/l_hand-1.png | Bin 0 -> 379 bytes .../hesphiastos_main.rsi/l_hand-2.png | Bin 0 -> 380 bytes .../hesphiastos_main.rsi/l_leg-1.png | Bin 0 -> 535 bytes .../hesphiastos_main.rsi/l_leg-2.png | Bin 0 -> 538 bytes .../hesphiastos_main.rsi/meta.json | 83 ++++++ .../hesphiastos_main.rsi/r_arm-1.png | Bin 0 -> 491 bytes .../hesphiastos_main.rsi/r_arm-2.png | Bin 0 -> 248 bytes .../hesphiastos_main.rsi/r_foot-1.png | Bin 0 -> 390 bytes .../hesphiastos_main.rsi/r_foot-2.png | Bin 0 -> 391 bytes .../hesphiastos_main.rsi/r_hand-1.png | Bin 0 -> 382 bytes .../hesphiastos_main.rsi/r_hand-2.png | Bin 0 -> 381 bytes .../hesphiastos_main.rsi/r_leg-1.png | Bin 0 -> 536 bytes .../hesphiastos_main.rsi/r_leg-2.png | Bin 0 -> 538 bytes .../hesphiastos_main.rsi/torso-1.png | Bin 0 -> 813 bytes .../hesphiastos_main.rsi/torso-2.png | Bin 0 -> 807 bytes .../hesphiastos_monitor.rsi/head-1.png | Bin 0 -> 330 bytes .../hesphiastos_monitor.rsi/head-2.png | Bin 0 -> 565 bytes .../hesphiastos_monitor.rsi/meta.json | 19 ++ .../morpheus/morpheus_alt1.rsi/head.png | Bin 0 -> 871 bytes .../morpheus/morpheus_alt1.rsi/meta.json | 15 + .../morpheus/morpheus_main.rsi/head.png | Bin 0 -> 679 bytes .../morpheus/morpheus_main.rsi/l_arm.png | Bin 0 -> 594 bytes .../morpheus/morpheus_main.rsi/l_foot.png | Bin 0 -> 383 bytes .../morpheus/morpheus_main.rsi/l_hand.png | Bin 0 -> 444 bytes .../morpheus/morpheus_main.rsi/l_leg.png | Bin 0 -> 612 bytes .../morpheus/morpheus_main.rsi/meta.json | 51 ++++ .../morpheus/morpheus_main.rsi/r_arm.png | Bin 0 -> 557 bytes .../morpheus/morpheus_main.rsi/r_foot.png | Bin 0 -> 387 bytes .../morpheus/morpheus_main.rsi/r_hand.png | Bin 0 -> 444 bytes .../morpheus/morpheus_main.rsi/r_leg.png | Bin 0 -> 611 bytes .../morpheus/morpheus_main.rsi/torso.png | Bin 0 -> 758 bytes .../shellguard/shellguard_alt1.rsi/head-1.png | Bin 0 -> 6405 bytes .../shellguard/shellguard_alt1.rsi/head-2.png | Bin 0 -> 6791 bytes .../shellguard/shellguard_alt1.rsi/meta.json | 19 ++ .../shellguard_main.rsi/l_arm-1.png | Bin 0 -> 453 bytes .../shellguard_main.rsi/l_arm-2.png | Bin 0 -> 455 bytes .../shellguard_main.rsi/l_foot-1.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/l_foot-2.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/l_hand-1.png | Bin 0 -> 365 bytes .../shellguard_main.rsi/l_hand-2.png | Bin 0 -> 363 bytes .../shellguard_main.rsi/l_leg-1.png | Bin 0 -> 475 bytes .../shellguard_main.rsi/l_leg-2.png | Bin 0 -> 459 bytes .../shellguard/shellguard_main.rsi/meta.json | 83 ++++++ .../shellguard_main.rsi/r_arm-1.png | Bin 0 -> 455 bytes .../shellguard_main.rsi/r_arm-2.png | Bin 0 -> 452 bytes .../shellguard_main.rsi/r_foot-1.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/r_foot-2.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/r_hand-1.png | Bin 0 -> 367 bytes .../shellguard_main.rsi/r_hand-2.png | Bin 0 -> 368 bytes .../shellguard_main.rsi/r_leg-1.png | Bin 0 -> 461 bytes .../shellguard_main.rsi/r_leg-2.png | Bin 0 -> 449 bytes .../shellguard_main.rsi/torso-1.png | Bin 0 -> 707 bytes .../shellguard_main.rsi/torso-2.png | Bin 0 -> 708 bytes .../shellguard_monitor.rsi/head-1.png | Bin 0 -> 466 bytes .../shellguard_monitor.rsi/head-2.png | Bin 0 -> 500 bytes .../shellguard_monitor.rsi/meta.json | 19 ++ .../wardtakahashi_alt1.rsi/head.png | Bin 0 -> 6829 bytes .../wardtakahashi_alt1.rsi/meta.json | 15 + .../wardtakahashi_main.rsi/head.png | Bin 0 -> 6426 bytes .../wardtakahashi_main.rsi/l_arm.png | Bin 0 -> 505 bytes .../wardtakahashi_main.rsi/l_foot.png | Bin 0 -> 340 bytes .../wardtakahashi_main.rsi/l_hand.png | Bin 0 -> 372 bytes .../wardtakahashi_main.rsi/l_leg.png | Bin 0 -> 572 bytes .../wardtakahashi_main.rsi/meta.json | 51 ++++ .../wardtakahashi_main.rsi/r_arm.png | Bin 0 -> 507 bytes .../wardtakahashi_main.rsi/r_foot.png | Bin 0 -> 337 bytes .../wardtakahashi_main.rsi/r_hand.png | Bin 0 -> 378 bytes .../wardtakahashi_main.rsi/r_leg.png | Bin 0 -> 553 bytes .../wardtakahashi_main.rsi/torso.png | Bin 0 -> 961 bytes .../wardtakahashi_monitor.rsi/head.png | Bin 0 -> 773 bytes .../wardtakahashi_monitor.rsi/meta.json | 15 + .../Cybernetics/xion/xion_alt1.rsi/head-1.png | Bin 0 -> 6832 bytes .../Cybernetics/xion/xion_alt1.rsi/head-2.png | Bin 0 -> 6889 bytes .../Cybernetics/xion/xion_alt1.rsi/meta.json | 19 ++ .../xion/xion_main.rsi/l_arm-1.png | Bin 0 -> 474 bytes .../xion/xion_main.rsi/l_arm-2.png | Bin 0 -> 467 bytes .../xion/xion_main.rsi/l_foot-1.png | Bin 0 -> 370 bytes .../xion/xion_main.rsi/l_foot-2.png | Bin 0 -> 370 bytes .../xion/xion_main.rsi/l_hand-1.png | Bin 0 -> 391 bytes .../xion/xion_main.rsi/l_hand-2.png | Bin 0 -> 388 bytes .../xion/xion_main.rsi/l_leg-1.png | Bin 0 -> 537 bytes .../xion/xion_main.rsi/l_leg-2.png | Bin 0 -> 535 bytes .../Cybernetics/xion/xion_main.rsi/meta.json | 82 ++++++ .../xion/xion_main.rsi/r_arm-1.png | Bin 0 -> 466 bytes .../xion/xion_main.rsi/r_arm-2.png | Bin 0 -> 460 bytes .../xion/xion_main.rsi/r_foot-1.png | Bin 0 -> 368 bytes .../xion/xion_main.rsi/r_foot-2.png | Bin 0 -> 367 bytes .../xion/xion_main.rsi/r_hand-1.png | Bin 0 -> 388 bytes .../xion/xion_main.rsi/r_hand-2.png | Bin 0 -> 387 bytes .../xion/xion_main.rsi/r_leg-1.png | Bin 0 -> 536 bytes .../xion/xion_main.rsi/r_leg-2.png | Bin 0 -> 533 bytes .../xion/xion_main.rsi/torso-1.png | Bin 0 -> 843 bytes .../xion/xion_main.rsi/torso-2.png | Bin 0 -> 841 bytes .../xion/xion_monitor.rsi/head-1.png | Bin 0 -> 6857 bytes .../xion/xion_monitor.rsi/head-2.png | Bin 0 -> 6466 bytes .../xion/xion_monitor.rsi/meta.json | 19 ++ .../zenghu/zenghu_main.rsi/groin.png | Bin 0 -> 5522 bytes .../zenghu/zenghu_main.rsi/head-1.png | Bin 0 -> 6588 bytes .../zenghu/zenghu_main.rsi/head-2.png | Bin 0 -> 6535 bytes .../zenghu/zenghu_main.rsi/l_arm-1.png | Bin 0 -> 5779 bytes .../zenghu/zenghu_main.rsi/l_arm-2.png | Bin 0 -> 5670 bytes .../zenghu/zenghu_main.rsi/l_foot-1.png | Bin 0 -> 5646 bytes .../zenghu/zenghu_main.rsi/l_foot-2.png | Bin 0 -> 5256 bytes .../zenghu/zenghu_main.rsi/l_hand-1.png | Bin 0 -> 5434 bytes .../zenghu/zenghu_main.rsi/l_hand-2.png | Bin 0 -> 5337 bytes .../zenghu/zenghu_main.rsi/l_leg-1.png | Bin 0 -> 5949 bytes .../zenghu/zenghu_main.rsi/l_leg-2.png | Bin 0 -> 5845 bytes .../zenghu/zenghu_main.rsi/meta.json | 95 +++++++ .../zenghu/zenghu_main.rsi/r_arm-1.png | Bin 0 -> 5824 bytes .../zenghu/zenghu_main.rsi/r_arm-2.png | Bin 0 -> 5666 bytes .../zenghu/zenghu_main.rsi/r_foot-1.png | Bin 0 -> 5688 bytes .../zenghu/zenghu_main.rsi/r_foot-2.png | Bin 0 -> 5256 bytes .../zenghu/zenghu_main.rsi/r_hand-1.png | Bin 0 -> 5597 bytes .../zenghu/zenghu_main.rsi/r_hand-2.png | Bin 0 -> 5349 bytes .../zenghu/zenghu_main.rsi/r_leg-1.png | Bin 0 -> 5899 bytes .../zenghu/zenghu_main.rsi/r_leg-2.png | Bin 0 -> 5805 bytes .../zenghu/zenghu_main.rsi/torso-1.png | Bin 0 -> 7778 bytes .../zenghu/zenghu_main.rsi/torso-2.png | Bin 0 -> 7157 bytes .../Mobs/Species/IPC/organs.rsi/ears.png | Bin 0 -> 418 bytes .../Mobs/Species/IPC/organs.rsi/eyeball-l.png | Bin 0 -> 4215 bytes .../Mobs/Species/IPC/organs.rsi/eyeball-r.png | Bin 0 -> 4202 bytes .../Mobs/Species/IPC/organs.rsi/eyes.png | Bin 0 -> 1047 bytes .../Mobs/Species/IPC/organs.rsi/heart-off.png | Bin 0 -> 260 bytes .../Mobs/Species/IPC/organs.rsi/heart-on.png | Bin 0 -> 491 bytes .../Mobs/Species/IPC/organs.rsi/meta.json | 50 ++++ .../Mobs/Species/IPC/organs.rsi/microcell.png | Bin 0 -> 334 bytes .../Mobs/Species/IPC/organs.rsi/tongue.png | Bin 0 -> 516 bytes .../Mobs/Species/IPC/parts.rsi/full.png | Bin 0 -> 2437 bytes .../Mobs/Species/IPC/parts.rsi/head_f.png | Bin 0 -> 885 bytes .../Mobs/Species/IPC/parts.rsi/head_m.png | Bin 0 -> 885 bytes .../Mobs/Species/IPC/parts.rsi/l_arm.png | Bin 0 -> 657 bytes .../Mobs/Species/IPC/parts.rsi/l_foot.png | Bin 0 -> 572 bytes .../Mobs/Species/IPC/parts.rsi/l_hand.png | Bin 0 -> 679 bytes .../Mobs/Species/IPC/parts.rsi/l_leg.png | Bin 0 -> 628 bytes .../Mobs/Species/IPC/parts.rsi/meta.json | 62 ++++ .../Mobs/Species/IPC/parts.rsi/r_arm.png | Bin 0 -> 737 bytes .../Mobs/Species/IPC/parts.rsi/r_foot.png | Bin 0 -> 562 bytes .../Mobs/Species/IPC/parts.rsi/r_hand.png | Bin 0 -> 780 bytes .../Mobs/Species/IPC/parts.rsi/r_leg.png | Bin 0 -> 636 bytes .../Mobs/Species/IPC/parts.rsi/torso_f.png | Bin 0 -> 1306 bytes .../Mobs/Species/IPC/parts.rsi/torso_m.png | Bin 0 -> 1232 bytes .../adv-retractor.rsi/adv-retractor-on.png | Bin 0 -> 220 bytes .../adv-retractor.rsi/adv-retractor.png | Bin 0 -> 254 bytes .../adv-retractor.rsi/inhand-left-on.png | Bin 0 -> 397 bytes .../Surgery/adv-retractor.rsi/inhand-left.png | Bin 0 -> 400 bytes .../adv-retractor.rsi/inhand-right-on.png | Bin 0 -> 421 bytes .../adv-retractor.rsi/inhand-right.png | Bin 0 -> 405 bytes .../Surgery/adv-retractor.rsi/meta.json | 33 +++ .../Medical/Surgery/bone-gel.rsi/bone-gel.png | Bin 0 -> 258 bytes .../Surgery/bone-gel.rsi/inhand-left.png | Bin 0 -> 418 bytes .../Surgery/bone-gel.rsi/inhand-right.png | Bin 0 -> 431 bytes .../Medical/Surgery/bone-gel.rsi/meta.json | 22 ++ .../Medical/Surgery/bone_gel.rsi/bone-gel.png | Bin 432 -> 0 bytes .../Surgery/bone_gel.rsi/bone-gel_0.png | Bin 391 -> 0 bytes .../Surgery/bone_gel.rsi/bone-gel_25.png | Bin 444 -> 0 bytes .../Surgery/bone_gel.rsi/bone-gel_50.png | Bin 456 -> 0 bytes .../Surgery/bone_gel.rsi/bone-gel_75.png | Bin 444 -> 0 bytes .../Medical/Surgery/bone_gel.rsi/meta.json | 29 -- .../bone_gel.rsi/predator_bone-gel.png | Bin 585 -> 0 bytes .../Surgery/bonesetter.rsi/bonesetter.png | Bin 581 -> 287 bytes .../Surgery/bonesetter.rsi/inhand-left.png | Bin 0 -> 486 bytes .../Surgery/bonesetter.rsi/inhand-right.png | Bin 0 -> 474 bytes .../Medical/Surgery/bonesetter.rsi/meta.json | 35 ++- .../bonesetter.rsi/predator_bonesetter.png | Bin 489 -> 0 bytes .../Medical/Surgery/cautery.rsi/cautery.png | Bin 0 -> 238 bytes .../Surgery/cautery.rsi/inhand-left.png | Bin 0 -> 420 bytes .../Surgery/cautery.rsi/inhand-right.png | Bin 0 -> 430 bytes .../Medical/Surgery/cautery.rsi/meta.json | 22 ++ .../Surgery/circular-saw.rsi/circular-saw.png | Bin 0 -> 273 bytes .../Surgery/circular-saw.rsi/inhand-left.png | Bin 0 -> 666 bytes .../Surgery/circular-saw.rsi/inhand-right.png | Bin 0 -> 668 bytes .../Surgery/circular-saw.rsi/meta.json | 22 ++ .../Medical/Surgery/drapes.rsi/drapes.png | Bin 0 -> 228 bytes .../Surgery/drapes.rsi/inhand-left.png | Bin 0 -> 460 bytes .../Surgery/drapes.rsi/inhand-right.png | Bin 0 -> 462 bytes .../Medical/Surgery/drapes.rsi/meta.json | 22 ++ .../Medical/Surgery/drill.rsi/drill.png | Bin 0 -> 702 bytes .../Medical/Surgery/drill.rsi/inhand-left.png | Bin 0 -> 685 bytes .../Surgery/drill.rsi/inhand-right.png | Bin 0 -> 689 bytes .../Medical/Surgery/drill.rsi/meta.json | 22 ++ .../Surgery/e-cautery.rsi/e-cautery-on.png | Bin 0 -> 234 bytes .../Surgery/e-cautery.rsi/e-cautery.png | Bin 0 -> 244 bytes .../Surgery/e-cautery.rsi/inhand-left-on.png | Bin 0 -> 481 bytes .../Surgery/e-cautery.rsi/inhand-left.png | Bin 0 -> 462 bytes .../Surgery/e-cautery.rsi/inhand-right-on.png | Bin 0 -> 496 bytes .../Surgery/e-cautery.rsi/inhand-right.png | Bin 0 -> 475 bytes .../Medical/Surgery/e-cautery.rsi/meta.json | 33 +++ .../Surgery/e-scalpel.rsi/e-scalpel-on.png | Bin 0 -> 537 bytes .../Surgery/e-scalpel.rsi/e-scalpel.png | Bin 0 -> 218 bytes .../Surgery/e-scalpel.rsi/inhand-left-on.png | Bin 0 -> 503 bytes .../Surgery/e-scalpel.rsi/inhand-left.png | Bin 0 -> 487 bytes .../Surgery/e-scalpel.rsi/inhand-right-on.png | Bin 0 -> 505 bytes .../Surgery/e-scalpel.rsi/inhand-right.png | Bin 0 -> 480 bytes .../Medical/Surgery/e-scalpel.rsi/meta.json | 39 +++ .../Medical/Surgery/hemostat.rsi/hemostat.png | Bin 0 -> 261 bytes .../Surgery/hemostat.rsi/inhand-left.png | Bin 0 -> 374 bytes .../Surgery/hemostat.rsi/inhand-right.png | Bin 0 -> 385 bytes .../Medical/Surgery/hemostat.rsi/meta.json | 22 ++ .../Surgery/omnimed.rsi/inhand-left.png | Bin 0 -> 593 bytes .../Surgery/omnimed.rsi/inhand-right.png | Bin 0 -> 585 bytes .../Medical/Surgery/omnimed.rsi/meta.json | 22 ++ .../Medical/Surgery/omnimed.rsi/omnimed.png | Bin 0 -> 271 bytes .../Surgery/retractor.rsi/inhand-left.png | Bin 0 -> 480 bytes .../Surgery/retractor.rsi/inhand-right.png | Bin 0 -> 486 bytes .../Medical/Surgery/retractor.rsi/meta.json | 22 ++ .../Surgery/retractor.rsi/retractor.png | Bin 0 -> 304 bytes .../Surgery/scalpel.rsi/inhand-left.png | Bin 0 -> 424 bytes .../Surgery/scalpel.rsi/inhand-right.png | Bin 0 -> 433 bytes .../Medical/Surgery/scalpel.rsi/meta.json | 22 ++ .../Medical/Surgery/scalpel.rsi/scalpel.png | Bin 0 -> 194 bytes Resources/keybinds.yml | 8 - 319 files changed, 3151 insertions(+), 290 deletions(-) create mode 100644 Content.Server/_Shitmed/Body/Systems/DebrainedSystem.cs create mode 100644 Content.Server/_Shitmed/Body/Systems/EyesSystem.cs create mode 100644 Content.Server/_Shitmed/Cybernetics/CyberneticsSystem.cs create mode 100644 Content.Shared/_Shitmed/Body/Organ/OrganEvents.cs create mode 100644 Content.Shared/_Shitmed/BodyEffects/BodyPartEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/BodyEffects/BodyPartEffectSystem.cs create mode 100644 Content.Shared/_Shitmed/BodyEffects/OrganEffectComponent.cs create mode 100644 Content.Shared/_Shitmed/BodyEffects/OrganEffectSystem.cs create mode 100644 Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartComponent.cs create mode 100644 Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs create mode 100644 Content.Shared/_Shitmed/Cybernetics/CyberneticsComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs rename Content.Shared/_Shitmed/Surgery/Tools/{SurgicalDrillComponent.cs => DrillComponent.cs} (63%) create mode 100644 Resources/Prototypes/_Shitmed/Body/Organs/cybernetic.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Organs/generic.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Parts/generic.yml create mode 100644 Resources/Prototypes/_Shitmed/Species/cybernetics.yml create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/adv-surgery-module.png create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/surgery-module.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-advanced-surgery.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-surgery.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_alt1.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_alt1.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-combined.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-primary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-secondary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-tertiary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-combined.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-primary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-secondary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-combined.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-primary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-secondary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-tertiary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-combined.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-primary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-secondary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/torso-primary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/torso-secondary.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-3.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/torso-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/torso-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_monitor.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_monitor.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_monitor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_alt1.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_alt1.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_leg.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_leg.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/torso.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/torso-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/torso-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_monitor.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_monitor.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_monitor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_alt1.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_alt1.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/l_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/l_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/l_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/l_leg.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_leg.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/torso.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_monitor.rsi/head.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_monitor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/torso-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/torso-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/groin.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/head-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/head-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/torso-1.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/torso-2.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/ears.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/eyeball-l.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/eyeball-r.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/eyes.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/heart-off.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/heart-on.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/microcell.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/tongue.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/full.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/head_f.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/head_m.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_leg.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_arm.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_foot.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_hand.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_leg.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/torso_f.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/torso_m.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/adv-retractor-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/adv-retractor.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-left-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-right-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/bone-gel.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/meta.json delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_0.png delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_25.png delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_50.png delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_75.png delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/meta.json delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/predator_bone-gel.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/inhand-right.png delete mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/predator_bonesetter.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/cautery.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/circular-saw.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/drapes.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drill.rsi/drill.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drill.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drill.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drill.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/e-cautery-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/e-cautery.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-left-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-right-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/e-scalpel-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/e-scalpel.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-left-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-right-on.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/hemostat.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/omnimed.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/retractor.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/scalpel.png diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 5261229c510..09123267f4a 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -89,9 +89,13 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.TargetHead); human.AddFunction(ContentKeyFunctions.TargetTorso); human.AddFunction(ContentKeyFunctions.TargetLeftArm); + human.AddFunction(ContentKeyFunctions.TargetLeftHand); human.AddFunction(ContentKeyFunctions.TargetRightArm); + human.AddFunction(ContentKeyFunctions.TargetRightHand); human.AddFunction(ContentKeyFunctions.TargetLeftLeg); + human.AddFunction(ContentKeyFunctions.TargetLeftFoot); human.AddFunction(ContentKeyFunctions.TargetRightLeg); + human.AddFunction(ContentKeyFunctions.TargetRightFoot); // Shitmed Change End // actions should be common (for ghosts, mobs, etc) diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 4bbf2c279b7..3bd6ab01faa 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -243,11 +243,15 @@ void AddCheckBox(string checkBoxName, bool currentState, Action>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) AddHeader("ui-options-header-shuttle"); AddButton(ContentKeyFunctions.ShuttleStrafeUp); diff --git a/Content.Client/_Shitmed/Targeting/TargetingSystem.cs b/Content.Client/_Shitmed/Targeting/TargetingSystem.cs index f0e4d07b4c5..6b4bcbfbb44 100644 --- a/Content.Client/_Shitmed/Targeting/TargetingSystem.cs +++ b/Content.Client/_Shitmed/Targeting/TargetingSystem.cs @@ -32,20 +32,20 @@ public override void Initialize() InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.Torso))) .Bind(ContentKeyFunctions.TargetLeftArm, InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftArm))) -/* .Bind(ContentKeyFunctions.TargetLeftHand, - InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftHand))) SOON :TM: */ + .Bind(ContentKeyFunctions.TargetLeftHand, + InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftHand))) .Bind(ContentKeyFunctions.TargetRightArm, InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightArm))) -/* .Bind(ContentKeyFunctions.TargetRightHand, - InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightHand)))*/ + .Bind(ContentKeyFunctions.TargetRightHand, + InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightHand))) .Bind(ContentKeyFunctions.TargetLeftLeg, InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftLeg))) -/* .Bind(ContentKeyFunctions.TargetLeftFoot, - InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftFoot)))*/ + .Bind(ContentKeyFunctions.TargetLeftFoot, + InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftFoot))) .Bind(ContentKeyFunctions.TargetRightLeg, InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightLeg))) -/* .Bind(ContentKeyFunctions.TargetRightFoot, - InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightFoot)))*/ + .Bind(ContentKeyFunctions.TargetRightFoot, + InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightFoot))) .Register(); } diff --git a/Content.Server/Body/Components/BrainComponent.cs b/Content.Server/Body/Components/BrainComponent.cs index 004ff24eaff..441bcd31549 100644 --- a/Content.Server/Body/Components/BrainComponent.cs +++ b/Content.Server/Body/Components/BrainComponent.cs @@ -5,5 +5,10 @@ namespace Content.Server.Body.Components [RegisterComponent, Access(typeof(BrainSystem))] public sealed partial class BrainComponent : Component { + /// + /// Shitmed Change: Is this brain currently controlling the entity? + /// + [DataField] + public bool Active = true; } } diff --git a/Content.Server/Body/Systems/BodySystem.cs b/Content.Server/Body/Systems/BodySystem.cs index a2ef54c6133..9014d3fe232 100644 --- a/Content.Server/Body/Systems/BodySystem.cs +++ b/Content.Server/Body/Systems/BodySystem.cs @@ -171,6 +171,16 @@ public override HashSet GibPart( return gibs; } + public override bool BurnPart(EntityUid partId, BodyPartComponent? part = null) + { + if (!Resolve(partId, ref part, logMissing: false) + || TerminatingOrDeleted(partId) + || EntityManager.IsQueuedForDeletion(partId)) + return false; + + return base.BurnPart(partId, part); + } + protected override void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component) { return; diff --git a/Content.Server/Body/Systems/BrainSystem.cs b/Content.Server/Body/Systems/BrainSystem.cs index f68ce386b28..d62f884650f 100644 --- a/Content.Server/Body/Systems/BrainSystem.cs +++ b/Content.Server/Body/Systems/BrainSystem.cs @@ -27,29 +27,34 @@ public override void Initialize() SubscribeLocalEvent(OnPointAttempt); } - private void HandleRemoval(EntityUid uid, BrainComponent _, ref OrganRemovedFromBodyEvent args) + private void HandleRemoval(EntityUid uid, BrainComponent brain, ref OrganRemovedFromBodyEvent args) { if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.OldBody)) return; - // Prevents revival, should kill the user within a given timespan too. - EnsureComp(args.OldBody); - EnsureComp(args.OldBody); - HandleMind(uid, args.OldBody); + brain.Active = false; + if (!CheckOtherBrains(args.OldBody)) + { + // Prevents revival, should kill the user within a given timespan too. + EnsureComp(args.OldBody); + HandleMind(uid, args.OldBody); + } } - private void HandleAddition(EntityUid uid, BrainComponent _, ref OrganAddedToBodyEvent args) + + private void HandleAddition(EntityUid uid, BrainComponent brain, 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); + if (!CheckOtherBrains(args.Body)) + { + RemComp(args.Body); + HandleMind(args.Body, uid, brain); + } } - // Shitmed Change End - private void HandleMind(EntityUid newEntity, EntityUid oldEntity) + + private void HandleMind(EntityUid newEntity, EntityUid oldEntity, BrainComponent? brain = null) { if (TerminatingOrDeleted(newEntity) || TerminatingOrDeleted(oldEntity)) return; @@ -65,8 +70,34 @@ private void HandleMind(EntityUid newEntity, EntityUid oldEntity) return; _mindSystem.TransferTo(mindId, newEntity, mind: mind); + if (brain != null) + brain.Active = true; + } + + private bool CheckOtherBrains(EntityUid entity) + { + var hasOtherBrains = false; + if (TryComp(entity, out var body)) + { + if (TryComp(entity, out var bodyBrain)) + hasOtherBrains = true; + else + { + foreach (var (organ, _) in _bodySystem.GetBodyOrgans(entity, body)) + { + if (TryComp(organ, out var brain) && brain.Active) + { + hasOtherBrains = true; + break; + } + } + } + } + + return hasOtherBrains; } + // Shitmed Change End private void OnPointAttempt(Entity ent, ref PointAttemptEvent args) { args.Cancel(); diff --git a/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs b/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs index f0499dc6a2d..4a2a3d1f730 100644 --- a/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs +++ b/Content.Server/Destructible/Thresholds/Behaviors/BurnBodyBehavior.cs @@ -1,4 +1,5 @@ using Content.Shared.Body.Components; +using Content.Shared.Body.Part; // Shitmed Change using Content.Shared.Inventory; using Content.Shared.Popups; using JetBrains.Annotations; @@ -25,8 +26,16 @@ public void Execute(EntityUid bodyId, DestructibleSystem system, EntityUid? caus } } - sharedPopupSystem.PopupCoordinates(Loc.GetString("bodyburn-text-others", ("name", bodyId)), transformSystem.GetMoverCoordinates(bodyId), PopupType.LargeCaution); - - system.EntityManager.QueueDeleteEntity(bodyId); + if (system.EntityManager.TryGetComponent(bodyId, out var bodyPart)) + { + if (bodyPart.CanSever + && system.BodySystem.BurnPart(bodyId, bodyPart)) + sharedPopupSystem.PopupCoordinates(Loc.GetString("bodyburn-text-others", ("name", bodyId)), transformSystem.GetMoverCoordinates(bodyId), PopupType.LargeCaution); + } + else + { + sharedPopupSystem.PopupCoordinates(Loc.GetString("bodyburn-text-others", ("name", bodyId)), transformSystem.GetMoverCoordinates(bodyId), PopupType.LargeCaution); + system.EntityManager.QueueDeleteEntity(bodyId); + } } } diff --git a/Content.Server/_Shitmed/Body/Systems/DebrainedSystem.cs b/Content.Server/_Shitmed/Body/Systems/DebrainedSystem.cs new file mode 100644 index 00000000000..8b3ccba079f --- /dev/null +++ b/Content.Server/_Shitmed/Body/Systems/DebrainedSystem.cs @@ -0,0 +1,62 @@ +using Content.Server._Shitmed.DelayedDeath; +using Content.Shared._Shitmed.Body.Organ; +using Content.Shared.Body.Systems; +using Content.Shared.Mind; +using Content.Server.Popups; +using Content.Shared.Speech; +using Content.Shared.Standing; +using Content.Shared.Stunnable; + +namespace Content.Server._Shitmed.Body.Systems; + +/// +/// This system handles behavior on entities when they lose their head or their brains are removed. +/// MindComponent fuckery should still be mainly handled on BrainSystem as usual. +/// +public sealed class DebrainedSystem : EntitySystem +{ + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly StandingStateSystem _standingSystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentRemove); + SubscribeLocalEvent(OnSpeakAttempt); + SubscribeLocalEvent(OnStandAttempt); + } + + private void OnComponentInit(EntityUid uid, DebrainedComponent _, ComponentInit args) + { + if (TerminatingOrDeleted(uid)) + return; + + EnsureComp(uid); + EnsureComp(uid); + _standingSystem.Down(uid); + } + + private void OnComponentRemove(EntityUid uid, DebrainedComponent _, ComponentRemove args) + { + if (TerminatingOrDeleted(uid)) + return; + + RemComp(uid); + RemComp(uid); + if (_bodySystem.TryGetBodyOrganEntityComps(uid, out var _)) + RemComp(uid); + } + + private void OnSpeakAttempt(EntityUid uid, DebrainedComponent _, SpeakAttemptEvent args) + { + _popupSystem.PopupEntity(Loc.GetString("speech-muted"), uid, uid); + args.Cancel(); + } + + private void OnStandAttempt(EntityUid uid, DebrainedComponent _, StandAttemptEvent args) + { + args.Cancel(); + } +} diff --git a/Content.Server/_Shitmed/Body/Systems/EyesSystem.cs b/Content.Server/_Shitmed/Body/Systems/EyesSystem.cs new file mode 100644 index 00000000000..9a10e875b7b --- /dev/null +++ b/Content.Server/_Shitmed/Body/Systems/EyesSystem.cs @@ -0,0 +1,87 @@ +using Content.Server.Body.Components; +using Content.Shared.Body.Components; +using Content.Shared.Body.Events; +using Content.Shared._Shitmed.Body.Organ; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Eye.Blinding.Systems; + +namespace Content.Server.Body.Systems +{ + public sealed class EyesSystem : EntitySystem + { + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [Dependency] private readonly BodySystem _bodySystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnOrganEnabled); + SubscribeLocalEvent(OnOrganDisabled); + } + + private void HandleSight(EntityUid newEntity, EntityUid oldEntity) + { + if (TerminatingOrDeleted(newEntity) || TerminatingOrDeleted(oldEntity)) + return; + + BlindableComponent? newSight; + BlindableComponent? oldSight; + //transfer existing component to organ + if (!TryComp(newEntity, out newSight)) + newSight = EnsureComp(newEntity); + + if (!TryComp(oldEntity, out oldSight)) + oldSight = EnsureComp(oldEntity); + + //give new sight all values of old sight + _blindableSystem.TransferBlindness(newSight, oldSight, newEntity); + + var hasOtherEyes = false; + //check for other eye components on owning body and owning body organs (if old entity has a body) + if (TryComp(oldEntity, out var body)) + { + if (TryComp(oldEntity, out var bodyEyes)) //some bodies see through their skin!!! (slimes) + hasOtherEyes = true; + else + { + foreach (var (organ, _) in _bodySystem.GetBodyOrgans(oldEntity, body)) + { + if (TryComp(organ, out var eyes)) + { + hasOtherEyes = true; + break; + } + } + //TODO (MS14): Should we do this for body parts too? might be a little overpowered but could be funny/interesting + } + } + + //if there are no existing eye components for the old entity - set old sight to be blind otherwise leave it as is + if (!hasOtherEyes && !TryComp(oldEntity, out var self)) + _blindableSystem.AdjustEyeDamage((oldEntity, oldSight), oldSight.MaxDamage); + + } + + private void OnOrganEnabled(EntityUid uid, EyesComponent component, OrganEnabledEvent args) + { + if (TerminatingOrDeleted(uid) + || args.Organ.Comp.Body is not { Valid: true } body) + return; + + RemComp(body); + HandleSight(uid, body); + } + + private void OnOrganDisabled(EntityUid uid, EyesComponent component, OrganDisabledEvent args) + { + if (TerminatingOrDeleted(uid) + || args.Organ.Comp.Body is not { Valid: true } body) + return; + + EnsureComp(body); + HandleSight(body, uid); + } + } +} diff --git a/Content.Server/_Shitmed/Cybernetics/CyberneticsSystem.cs b/Content.Server/_Shitmed/Cybernetics/CyberneticsSystem.cs new file mode 100644 index 00000000000..386bfc9de8c --- /dev/null +++ b/Content.Server/_Shitmed/Cybernetics/CyberneticsSystem.cs @@ -0,0 +1,55 @@ +using Content.Server.Emp; +using Content.Shared.Body.Part; +using Content.Shared.Body.Organ; +using Content.Shared._Shitmed.Body.Organ; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared._Shitmed.Cybernetics; + +namespace Content.Server._Shitmed.Cybernetics; + +internal sealed class CyberneticsSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); + } + private void OnEmpPulse(Entity cyberEnt, ref EmpPulseEvent ev) + { + if (!cyberEnt.Comp.Disabled) + { + ev.Affected = true; + ev.Disabled = true; + cyberEnt.Comp.Disabled = true; + + if (HasComp(cyberEnt)) + { + var disableEvent = new OrganEnableChangedEvent(false); + RaiseLocalEvent(cyberEnt, ref disableEvent); + } + else if (HasComp(cyberEnt)) + { + var disableEvent = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(cyberEnt, ref disableEvent); + } + } + } + + private void OnEmpDisabledRemoved(Entity cyberEnt, ref EmpDisabledRemoved ev) + { + if (cyberEnt.Comp.Disabled) + { + cyberEnt.Comp.Disabled = false; + if (HasComp(cyberEnt)) + { + var enableEvent = new OrganEnableChangedEvent(true); + RaiseLocalEvent(cyberEnt, ref enableEvent); + } + else if (HasComp(cyberEnt)) + { + var enableEvent = new BodyPartEnableChangedEvent(true); + RaiseLocalEvent(cyberEnt, ref enableEvent); + } + } + } +} diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs index 34e02772c0b..8538b407f65 100644 --- a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -142,12 +142,13 @@ private void OnSurgeryDamageChange(Entity en private void OnSurgerySpecialDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent args) { + // Im killing this shit soon too, inshallah. 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" + /*else if (ent.Comp.DamageType == "Eye" && TryComp(ent, out BlindableComponent? blindComp) && blindComp.EyeDamage > 0) - _blindableSystem.AdjustEyeDamage((args.Body, blindComp), -blindComp!.EyeDamage); + _blindableSystem.AdjustEyeDamage((args.Body, blindComp), -blindComp!.EyeDamage);*/ } private void OnStepScreamComplete(Entity ent, ref SurgeryStepEvent args) diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 4a1847120a2..34dc4abf1a6 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.Body.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; // Shitmed Change using Content.Shared._Shitmed.Medical.Surgery.Tools; // Shitmed Change namespace Content.Shared.Body.Organ; @@ -28,13 +29,13 @@ public sealed partial class OrganComponent : Component, ISurgeryToolComponent // /// without referencing the prototype or hardcoding. /// - [DataField] + [DataField, AlwaysPushInheritance] public string SlotId = ""; - [DataField] + [DataField, AlwaysPushInheritance] public string ToolName { get; set; } = "An organ"; - [DataField] + [DataField, AlwaysPushInheritance] public float Speed { get; set; } = 1f; /// @@ -42,5 +43,30 @@ public sealed partial class OrganComponent : Component, ISurgeryToolComponent // /// [DataField, AutoNetworkedField] public bool? Used { get; set; } + + + /// + /// When attached, the organ will ensure these components on the entity, and delete them on removal. + /// + [DataField] + public ComponentRegistry? OnAdd; + + /// + /// When removed, the organ will ensure these components on the entity, and add them on removal. + /// + [DataField] + public ComponentRegistry? OnRemove; + + /// + /// Is this organ working or not? + /// + [DataField, AutoNetworkedField] + public bool Enabled = true; + + /// + /// Can this organ be enabled or disabled? Used mostly for prop, damaged or useless organs. + /// + [DataField] + public bool CanEnable = true; // Shitmed Change End } diff --git a/Content.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index f7ef8e09667..ec260399f06 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -11,6 +11,7 @@ using Content.Shared.FixedPoint; using Content.Shared._Shitmed.Medical.Surgery.Tools; using Content.Shared._Shitmed.Targeting; +using Robust.Shared.Prototypes; namespace Content.Shared.Body.Part; @@ -40,13 +41,13 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField, AutoNetworkedField] public FixedPoint2 VitalDamage = 100; - [DataField] + [DataField, AlwaysPushInheritance] public string ToolName { get; set; } = "A body part"; [DataField, AutoNetworkedField] public bool? Used { get; set; } = null; - [DataField] + [DataField, AlwaysPushInheritance] public float Speed { get; set; } = 1f; /// @@ -55,6 +56,12 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField] public float MinIntegrity; + /// + /// Whether this body part can be severed or not + /// + [DataField, AutoNetworkedField] + public bool CanSever = true; + /// /// Shitmed Change: Whether this body part is enabled or not. /// @@ -67,6 +74,12 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField] public bool CanEnable = true; + /// + /// Whether this body part can attach children or not. + /// + [DataField] + public bool CanAttachChildren = true; + /// /// Shitmed Change: How long it takes to run another self heal tick on the body part. /// @@ -113,7 +126,7 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent /// /// Shitmed Change: The ID of the base layer for this body part. /// - [DataField, AutoNetworkedField] + [DataField, AutoNetworkedField, AlwaysPushInheritance] public string? BaseLayerId; /// @@ -133,11 +146,11 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent { TargetIntegrity.Healthy, 10 }, }; - // Shitmed Change End - [DataField, AutoNetworkedField] + [DataField, AutoNetworkedField, AlwaysPushInheritance] public BodyPartType PartType = BodyPartType.Other; + // TODO BODY Replace with a simulation of organs /// /// Whether or not the owning will die if all @@ -146,9 +159,23 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField("vital"), AutoNetworkedField] public bool IsVital; - [DataField, AutoNetworkedField] + [DataField, AutoNetworkedField, AlwaysPushInheritance] public BodyPartSymmetry Symmetry = BodyPartSymmetry.None; + /// + /// When attached, the part will ensure these components on the entity, and delete them on removal. + /// + [DataField, AlwaysPushInheritance] + public ComponentRegistry? OnAdd; + + /// + /// When removed, the part will ensure these components on the entity, and add them on removal. + /// + [DataField, AlwaysPushInheritance] + public ComponentRegistry? OnRemove; + + // Shitmed Change End + /// /// Child body parts attached to this body part. /// diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index f246c381b7f..9f54aacdd62 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -27,7 +27,6 @@ using Content.Shared.Standing; using Content.Shared._Shitmed.Targeting; using Robust.Shared.Timing; - namespace Content.Shared.Body.Systems; public partial class SharedBodySystem @@ -366,7 +365,7 @@ public virtual HashSet GibBody( // Shitmed Change Start - public virtual HashSet GibPart( + public virtual HashSet GibPart( EntityUid partId, BodyPartComponent? part = null, bool launchGibs = true, @@ -382,7 +381,7 @@ public virtual HashSet GibPart( if (part.Body is { } bodyEnt) { - if (IsPartRoot(bodyEnt, partId, part: part)) + if (IsPartRoot(bodyEnt, partId, part: part) || !part.CanSever) return gibs; ChangeSlotState((partId, part), true); @@ -414,6 +413,26 @@ public virtual HashSet GibPart( return gibs; } + public virtual bool BurnPart(EntityUid partId, + BodyPartComponent? part = null) + { + if (!Resolve(partId, ref part, logMissing: false)) + return false; + + if (part.Body is { } bodyEnt) + { + if (IsPartRoot(bodyEnt, partId, part: part)) + return false; + + ChangeSlotState((partId, part), true); + RemovePartChildren((partId, part), bodyEnt); + QueueDel(partId); + return true; + } + + return false; + } + private void OnProfileLoadFinished(EntityUid uid, BodyComponent component, ProfileLoadFinishedEvent args) { if (!HasComp(uid) diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index d1c4049e1ca..cc892e0e778 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -3,13 +3,35 @@ using Content.Shared.Body.Events; using Content.Shared.Body.Organ; using Content.Shared.Body.Part; -using Content.Shared.Damage; // Shitmed Change using Robust.Shared.Containers; +// Shitmed Change + +using Content.Shared.Damage; +using Content.Shared._Shitmed.BodyEffects; +using Content.Shared._Shitmed.Body.Events; +using Content.Shared._Shitmed.Body.Organ; + namespace Content.Shared.Body.Systems; public partial class SharedBodySystem { + // Shitmed Change Start + + private void InitializeOrgans() + { + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnOrganEnableChanged); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (ent.Comp.OnAdd is not null || ent.Comp.OnRemove is not null) + EnsureComp(ent); + } + + // Shitmed Change End + private void AddOrgan( Entity organEnt, EntityUid bodyUid, @@ -21,11 +43,14 @@ private void AddOrgan( if (organEnt.Comp.Body is not null) { + // Shitmed Change Start + organEnt.Comp.OriginalBody = organEnt.Comp.Body; var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref addedInBodyEv); + var organEnabledEv = new OrganEnableChangedEvent(true); + RaiseLocalEvent(organEnt, ref organEnabledEv); } - // Shitmed Change Start if (TryComp(parentPartUid, out DamageableComponent? damageable) && damageable.TotalDamage > 200) TrySetOrganUsed(organEnt, true, organEnt.Comp); @@ -41,7 +66,11 @@ private void RemoveOrgan(Entity organEnt, EntityUid parentPartUi if (organEnt.Comp.Body is { Valid: true } bodyUid) { - organEnt.Comp.OriginalBody = organEnt.Comp.Body; // Shitmed Change + // Shitmed Change Start + organEnt.Comp.OriginalBody = organEnt.Comp.Body; + var organDisabledEv = new OrganEnableChangedEvent(false); + RaiseLocalEvent(organEnt, ref organDisabledEv); + // Shitmed Change End var removedInBodyEv = new OrganRemovedFromBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref removedInBodyEv); } @@ -231,5 +260,49 @@ public bool TrySetOrganUsed(EntityUid organId, bool used, OrganComponent? organ return true; } + private void OnOrganEnableChanged(Entity organEnt, ref OrganEnableChangedEvent args) + { + if (!organEnt.Comp.CanEnable && args.Enabled) + return; + + organEnt.Comp.Enabled = args.Enabled; + + if (args.Enabled) + EnableOrgan(organEnt); + else + DisableOrgan(organEnt); + + if (organEnt.Comp.Body is { Valid: true } bodyEnt) + RaiseLocalEvent(organEnt, new OrganComponentsModifyEvent(bodyEnt, args.Enabled)); + + Dirty(organEnt, organEnt.Comp); + } + + private void EnableOrgan(Entity organEnt) + { + if (!TryComp(organEnt.Comp.Body, out BodyComponent? body)) + return; + + // I hate having to hardcode these checks so much. + if (HasComp(organEnt)) + { + var ev = new OrganEnabledEvent(organEnt); + RaiseLocalEvent(organEnt, ref ev); + } + } + + private void DisableOrgan(Entity organEnt) + { + if (!TryComp(organEnt.Comp.Body, out BodyComponent? body)) + return; + + // I hate having to hardcode these checks so much. + if (HasComp(organEnt)) + { + var ev = new OrganDisabledEvent(organEnt); + RaiseLocalEvent(organEnt, ref ev); + } + } + // Shitmed Change End } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index be7041865e7..1dcc1cbd86b 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -11,12 +11,13 @@ using Robust.Shared.Utility; // Shitmed Change Start -using Content.Shared.Humanoid; using Content.Shared._Shitmed.Body.Events; using Content.Shared._Shitmed.Body.Part; +using Content.Shared._Shitmed.BodyEffects; +using Content.Shared._Shitmed.Targeting.Events; +using Content.Shared.Humanoid; using Content.Shared.Inventory; using Content.Shared.Random; -using Content.Shared._Shitmed.Targeting.Events; namespace Content.Shared.Body.Systems; @@ -50,12 +51,14 @@ private void OnMapInit(Entity ent, ref MapInitEvent args) _slots.AddItemSlot(ent, ent.Comp.ContainerName, ent.Comp.ItemInsertionSlot); Dirty(ent, ent.Comp); } - // Shitmed Change Start + + if (ent.Comp.OnAdd is not null || ent.Comp.OnRemove is not null) + EnsureComp(ent); + foreach (var connection in ent.Comp.Children.Keys) { Containers.EnsureContainer(ent, GetPartSlotContainerId(connection)); } - // Shitmed Change End } private void OnBodyPartRemove(Entity ent, ref ComponentRemove args) @@ -70,12 +73,21 @@ private void OnPartEnableChanged(Entity partEnt, ref BodyPart return; partEnt.Comp.Enabled = args.Enabled; - Dirty(partEnt, partEnt.Comp); if (args.Enabled) + { EnablePart(partEnt); + if (partEnt.Comp.Body is { Valid: true } bodyEnt) + RaiseLocalEvent(partEnt, new BodyPartComponentsModifyEvent(bodyEnt, true)); + } else + { DisablePart(partEnt); + if (partEnt.Comp.Body is { Valid: true } bodyEnt) + RaiseLocalEvent(partEnt, new BodyPartComponentsModifyEvent(bodyEnt, false)); + } + + Dirty(partEnt, partEnt.Comp); } private void EnablePart(Entity partEnt) @@ -301,6 +313,9 @@ protected virtual void AddPart( Dirty(partEnt, partEnt.Comp); partEnt.Comp.Body = bodyEnt; + if (partEnt.Comp.Enabled && partEnt.Comp.Body is { Valid: true } body) // Shitmed Change + RaiseLocalEvent(partEnt, new BodyPartComponentsModifyEvent(body, true)); + var ev = new BodyPartAddedEvent(slotId, partEnt); RaiseLocalEvent(bodyEnt, ref ev); @@ -314,8 +329,14 @@ protected virtual void RemovePart( { Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false); Dirty(partEnt, partEnt.Comp); - partEnt.Comp.OriginalBody = partEnt.Comp.Body; // Shitmed Change - partEnt.Comp.ParentSlot = null; // Shitmed Change + + // Shitmed Change Start + partEnt.Comp.OriginalBody = partEnt.Comp.Body; + if (partEnt.Comp.Body is { Valid: true } body) + RaiseLocalEvent(partEnt, new BodyPartComponentsModifyEvent(body, false)); + partEnt.Comp.ParentSlot = null; + // Shitmed Change End + var ev = new BodyPartRemovedEvent(slotId, partEnt); RaiseLocalEvent(bodyEnt, ref ev); @@ -975,8 +996,8 @@ private bool TryGetPartSlotContainerName(BodyPartType partType, out HashSet new() { "gloves" }, - BodyPartType.Leg => new() { "shoes" }, + BodyPartType.Hand => new() { "gloves" }, + BodyPartType.Foot => new() { "shoes" }, BodyPartType.Head => new() { "eyes", "ears", "head", "mask" }, _ => new() }; @@ -997,6 +1018,14 @@ public int GetBodyPartCount(EntityUid bodyId, BodyPartType partType, BodyCompone return count; } + public string GetSlotFromBodyPart(BodyPartComponent part) + { + if (part.Symmetry != BodyPartSymmetry.None) + return $"{part.Symmetry.ToString().ToLower()} {part.PartType.ToString().ToLower()}"; + else + return part.PartType.ToString().ToLower(); + } + // Shitmed Change End /// diff --git a/Content.Shared/Body/Systems/SharedBodySystem.cs b/Content.Shared/Body/Systems/SharedBodySystem.cs index f31b20b0adc..96951a3ef66 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Body.Part; // Shitmed Change using Content.Shared.Damage; using Content.Shared.Movement.Systems; using Content.Shared.Standing; @@ -42,7 +43,7 @@ public override void Initialize() InitializeBody(); InitializeParts(); - + InitializeOrgans(); // Shitmed Change Start // To try and mitigate the server load due to integrity checks, we set up a Job Queue. InitializeIntegrityQueue(); diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 9a64426e1f2..5ea893e37b2 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -24,7 +24,7 @@ public sealed class DamageableSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly INetManager _netMan = default!; - [Dependency] private readonly SharedBodySystem _body = default!; // Shitmed Change + [Dependency] private readonly SharedBodySystem _body = default!; // Shitmed Change [Dependency] private readonly IRobustRandom _random = default!; // Shitmed Change [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; @@ -146,13 +146,21 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp return damage; } - var before = new BeforeDamageChangedEvent(damage, origin, targetPart, canSever ?? true, canEvade ?? false, partMultiplier ?? 1.00f); // Shitmed Change + var before = new BeforeDamageChangedEvent(damage, origin, targetPart); // Shitmed Change RaiseLocalEvent(uid.Value, ref before); - if (before.Cancelled - || before.Evaded) // Shitmed Change + if (before.Cancelled) return null; + // Shitmed Change Start + var partDamage = new TryChangePartDamageEvent(damage, origin, targetPart, canSever ?? true, canEvade ?? false, partMultiplier ?? 1.00f); + RaiseLocalEvent(uid.Value, ref partDamage); + + if (partDamage.Evaded || partDamage.Cancelled) + return null; + + // Shitmed Change End + // Apply resistances if (!ignoreResistances) { @@ -224,6 +232,19 @@ public void SetAllDamage(EntityUid uid, DamageableComponent component, FixedPoin // Setting damage does not count as 'dealing' damage, even if it is set to a larger value, so we pass an // empty damage delta. DamageChanged(uid, component, new DamageSpecifier()); + + // Shitmed Change Start + if (HasComp(uid)) + { + foreach (var (part, _) in _body.GetBodyChildren(uid)) + { + if (!TryComp(part, out DamageableComponent? damageComp)) + continue; + + SetAllDamage(part, damageComp, newValue); + } + } + // Shitmed Change End } public void SetDamageModifierSetId(EntityUid uid, string damageModifierSetId, DamageableComponent? comp = null) @@ -267,11 +288,6 @@ private void OnRejuvenate(EntityUid uid, DamageableComponent component, Rejuvena TryComp(uid, out var thresholds); _mobThreshold.SetAllowRevives(uid, true, thresholds); // do this so that the state changes when we set the damage SetAllDamage(uid, component, 0); - // Shitmed Start - if (HasComp(uid)) - foreach (var part in _body.GetBodyChildren(uid)) - RaiseLocalEvent(part.Id, new RejuvenateEvent()); - // Shitmed End _mobThreshold.SetAllowRevives(uid, false, thresholds); } @@ -303,6 +319,16 @@ private void DamageableHandleState(EntityUid uid, DamageableComponent component, /// [ByRefEvent] public record struct BeforeDamageChangedEvent( + DamageSpecifier Damage, + EntityUid? Origin = null, + TargetBodyPart? TargetPart = null, // Shitmed Change + bool Cancelled = false); + + /// + /// Shitmed Change: Raised on parts before damage is done so we can cancel the damage if they evade. + /// + [ByRefEvent] + public record struct TryChangePartDamageEvent( DamageSpecifier Damage, EntityUid? Origin = null, // Shitmed Change diff --git a/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs b/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs index 20e29ef4341..e5ce90eca2f 100644 --- a/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs +++ b/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Rejuvenate; using Content.Shared.Slippery; using Content.Shared.StatusEffect; +using Content.Shared.Body.Systems; // Shitmed Change namespace Content.Shared.Damage.Systems; @@ -9,6 +10,8 @@ public abstract class SharedGodmodeSystem : EntitySystem { [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedBodySystem _bodySystem = default!; // Shitmed Change + public override void Initialize() { base.Initialize(); @@ -50,6 +53,9 @@ public virtual void EnableGodmode(EntityUid uid, GodmodeComponent? godmode = nul // Rejuv to cover other stuff RaiseLocalEvent(uid, new RejuvenateEvent()); + + foreach (var (id, _) in _bodySystem.GetBodyChildren(uid)) // Shitmed Change + EnableGodmode(id); } public virtual void DisableGodmode(EntityUid uid, GodmodeComponent? godmode = null) @@ -63,6 +69,9 @@ public virtual void DisableGodmode(EntityUid uid, GodmodeComponent? godmode = nu } RemComp(uid); + + foreach (var (id, _) in _bodySystem.GetBodyChildren(uid)) // Shitmed Change + DisableGodmode(id); } /// diff --git a/Content.Shared/Eye/Blinding/Systems/BlindableSystem.cs b/Content.Shared/Eye/Blinding/Systems/BlindableSystem.cs index 24eed3adcf5..e6bd075cffb 100644 --- a/Content.Shared/Eye/Blinding/Systems/BlindableSystem.cs +++ b/Content.Shared/Eye/Blinding/Systems/BlindableSystem.cs @@ -87,6 +87,19 @@ public void SetMinDamage(Entity blindable, int amount) blindable.Comp.MinDamage = amount; UpdateEyeDamage(blindable, false); } + + // Shitmed Change Start + public void TransferBlindness(BlindableComponent newSight, BlindableComponent oldSight, EntityUid newEntity) + { + newSight.IsBlind = oldSight.IsBlind; + newSight.EyeDamage = oldSight.EyeDamage; + newSight.LightSetup = oldSight.LightSetup; + newSight.GraceFrame = oldSight.GraceFrame; + newSight.MinDamage = oldSight.MinDamage; + newSight.MaxDamage = oldSight.MaxDamage; + UpdateEyeDamage((newEntity, newSight), true); + } + // Shitmed Change End } /// diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index a7093119d41..9ae5f9e17d5 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -65,11 +65,15 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction TargetHead = "TargetHead"; public static readonly BoundKeyFunction TargetTorso = "TargetTorso"; public static readonly BoundKeyFunction TargetLeftArm = "TargetLeftArm"; + public static readonly BoundKeyFunction TargetLeftHand = "TargetLeftHand"; public static readonly BoundKeyFunction TargetRightArm = "TargetRightArm"; + public static readonly BoundKeyFunction TargetRightHand = "TargetRightHand"; public static readonly BoundKeyFunction TargetLeftLeg = "TargetLeftLeg"; + public static readonly BoundKeyFunction TargetLeftFoot = "TargetLeftFoot"; public static readonly BoundKeyFunction TargetRightLeg = "TargetRightLeg"; - + public static readonly BoundKeyFunction TargetRightFoot = "TargetRightFoot"; // Shitmed Change End + public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp"; public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown"; public static readonly BoundKeyFunction ArcadeLeft = "ArcadeLeft"; diff --git a/Content.Shared/Overlays/ShowHealthBarsComponent.cs b/Content.Shared/Overlays/ShowHealthBarsComponent.cs index 3f27885db18..8344686d2de 100644 --- a/Content.Shared/Overlays/ShowHealthBarsComponent.cs +++ b/Content.Shared/Overlays/ShowHealthBarsComponent.cs @@ -8,15 +8,23 @@ namespace Content.Shared.Overlays; /// /// This component allows you to see health bars above damageable mobs. /// +<<<<<<< HEAD [RegisterComponent, NetworkedComponent] [AutoGenerateComponentState(true)] +======= +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Shitmed Change +>>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public sealed partial class ShowHealthBarsComponent : Component { /// /// Displays health bars of the damage containers. /// +<<<<<<< HEAD [DataField] [AutoNetworkedField] +======= + [DataField, AutoNetworkedField] // Shitmed Change +>>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public List> DamageContainers = new() { "Biological" diff --git a/Content.Shared/Overlays/ShowHealthIconsComponent.cs b/Content.Shared/Overlays/ShowHealthIconsComponent.cs index bc8b5419d2a..5f32614b7ee 100644 --- a/Content.Shared/Overlays/ShowHealthIconsComponent.cs +++ b/Content.Shared/Overlays/ShowHealthIconsComponent.cs @@ -7,15 +7,24 @@ namespace Content.Shared.Overlays; /// /// This component allows you to see health status icons above damageable mobs. /// +<<<<<<< HEAD [RegisterComponent, NetworkedComponent] [AutoGenerateComponentState(true)] +======= +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Shitmed Change + +>>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public sealed partial class ShowHealthIconsComponent : Component { /// /// Displays health status icons of the damage containers. /// +<<<<<<< HEAD [DataField] [AutoNetworkedField] +======= + [DataField, AutoNetworkedField] // Shitmed Change +>>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public List> DamageContainers = new() { "Biological" diff --git a/Content.Shared/Prying/Components/PryingComponent.cs b/Content.Shared/Prying/Components/PryingComponent.cs index 93713e52c67..ed6a2818c5d 100644 --- a/Content.Shared/Prying/Components/PryingComponent.cs +++ b/Content.Shared/Prying/Components/PryingComponent.cs @@ -3,13 +3,13 @@ namespace Content.Shared.Prying.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Shitmed Change public sealed partial class PryingComponent : Component { /// /// Whether the entity can pry open powered doors /// - [DataField] + [DataField, AutoNetworkedField] // Shitmed Change public bool PryPowered; /// @@ -22,7 +22,7 @@ public sealed partial class PryingComponent : Component /// Modifier on the prying time. /// Lower values result in more time. /// - [DataField] + [DataField, AutoNetworkedField] // Shitmed Change public float SpeedModifier = 1.0f; /// diff --git a/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs b/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs index 4a97049882b..3f65fc37b19 100644 --- a/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs +++ b/Content.Shared/_Shitmed/Body/Events/BodyPartEvents.cs @@ -26,3 +26,5 @@ namespace Content.Shared._Shitmed.Body.Events; [ByRefEvent] public readonly record struct BodyPartDisabledEvent(Entity Part); + +public readonly record struct BodyPartComponentsModifyEvent(EntityUid Body, bool Add); diff --git a/Content.Shared/_Shitmed/Body/Organ/OrganEvents.cs b/Content.Shared/_Shitmed/Body/Organ/OrganEvents.cs new file mode 100644 index 00000000000..4126b4d13a4 --- /dev/null +++ b/Content.Shared/_Shitmed/Body/Organ/OrganEvents.cs @@ -0,0 +1,13 @@ +using Content.Shared.Body.Organ; +namespace Content.Shared._Shitmed.Body.Organ; + +public readonly record struct OrganComponentsModifyEvent(EntityUid Body, bool Add); + +[ByRefEvent] +public readonly record struct OrganEnableChangedEvent(bool Enabled); + +[ByRefEvent] +public readonly record struct OrganEnabledEvent(Entity Organ); + +[ByRefEvent] +public readonly record struct OrganDisabledEvent(Entity Organ); diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs index 89bf2a0232e..b13ca80a97e 100644 --- a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs @@ -64,7 +64,7 @@ public IntegrityJob(SharedBodySystem self, Entity ent, double private void InitializeIntegrityQueue() { _queryTargeting = GetEntityQuery(); - SubscribeLocalEvent(OnBeforeDamageChanged); + SubscribeLocalEvent(OnTryChangePartDamage); SubscribeLocalEvent(OnBodyDamageModify); SubscribeLocalEvent(OnPartDamageModify); SubscribeLocalEvent(OnDamageChanged); @@ -106,7 +106,7 @@ public override void Update(float frameTime) } } - private void OnBeforeDamageChanged(Entity ent, ref BeforeDamageChangedEvent args) + private void OnTryChangePartDamage(Entity ent, ref TryChangePartDamageEvent args) { // If our target has a TargetingComponent, that means they will take limb damage // And if their attacker also has one, then we use that part. @@ -223,6 +223,7 @@ private void OnDamageChanged(Entity partEnt, ref DamageChange var delta = args.DamageDelta; if (args.CanSever + && partEnt.Comp.CanSever && partIdSlot is not null && delta != null && !HasComp(partEnt) diff --git a/Content.Shared/_Shitmed/BodyEffects/BodyPartEffectComponent.cs b/Content.Shared/_Shitmed/BodyEffects/BodyPartEffectComponent.cs new file mode 100644 index 00000000000..be6ab40a2d2 --- /dev/null +++ b/Content.Shared/_Shitmed/BodyEffects/BodyPartEffectComponent.cs @@ -0,0 +1,26 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared._Shitmed.BodyEffects; + +[RegisterComponent, NetworkedComponent] +[AutoGenerateComponentPause] +public sealed partial class BodyPartEffectComponent : Component +{ + /// + /// The components that are active on the part and will be refreshed every 5s + /// + [DataField] + public ComponentRegistry Active = new(); + + /// + /// How long to wait between each refresh. + /// Effects can only last at most this long once the organ is removed. + /// + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(5); + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] + public TimeSpan NextUpdate = TimeSpan.Zero; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/BodyEffects/BodyPartEffectSystem.cs b/Content.Shared/_Shitmed/BodyEffects/BodyPartEffectSystem.cs new file mode 100644 index 00000000000..96cdae1d78f --- /dev/null +++ b/Content.Shared/_Shitmed/BodyEffects/BodyPartEffectSystem.cs @@ -0,0 +1,96 @@ +using Content.Shared._Shitmed.Body.Events; +using Content.Shared.Body.Part; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; +using Robust.Shared.Timing; +using System.Linq; + +namespace Content.Shared._Shitmed.BodyEffects; +public partial class BodyPartEffectSystem : EntitySystem +{ + [Dependency] private readonly IComponentFactory _compFactory = default!; + [Dependency] private readonly ISerializationManager _serManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPartComponentsModify); + } + + // While I would love to kill this function, problem is that if we happen to have two parts that add the same + // effect, removing one will remove both of them, since we cant tell what the source of a Component is. + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + var now = _gameTiming.CurTime; + while (query.MoveNext(out var uid, out var comp, out var part)) + { + if (now < comp.NextUpdate || !comp.Active.Any() || part.Body is not { } body) + continue; + + comp.NextUpdate = now + comp.Delay; + AddComponents(body, uid, comp.Active); + } + } + + private void OnPartComponentsModify(Entity partEnt, + ref BodyPartComponentsModifyEvent ev) + { + if (partEnt.Comp.OnAdd != null) + { + if (ev.Add) + AddComponents(ev.Body, partEnt, partEnt.Comp.OnAdd); + else + RemoveComponents(ev.Body, partEnt, partEnt.Comp.OnAdd); + } + + if (partEnt.Comp.OnRemove != null) + { + if (ev.Add) + AddComponents(ev.Body, partEnt, partEnt.Comp.OnRemove); + else + RemoveComponents(ev.Body, partEnt, partEnt.Comp.OnRemove); + } + + Dirty(partEnt, partEnt.Comp); + } + + private void AddComponents(EntityUid body, + EntityUid part, + ComponentRegistry reg, + BodyPartEffectComponent? effectComp = null) + { + if (!Resolve(part, ref effectComp, logMissing: false)) + return; + + foreach (var (key, comp) in reg) + { + var compType = comp.Component.GetType(); + if (HasComp(body, compType)) + continue; + + var newComp = (Component) _serManager.CreateCopy(comp.Component, notNullableOverride: true); + EntityManager.AddComponent(body, newComp, true); + + effectComp.Active[key] = comp; + } + } + + private void RemoveComponents(EntityUid body, + EntityUid part, + ComponentRegistry reg, + BodyPartEffectComponent? effectComp = null) + { + if (!Resolve(part, ref effectComp, logMissing: false)) + return; + + foreach (var (key, comp) in reg) + { + RemComp(body, comp.Component.GetType()); + effectComp.Active.Remove(key); + } + } +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/BodyEffects/OrganEffectComponent.cs b/Content.Shared/_Shitmed/BodyEffects/OrganEffectComponent.cs new file mode 100644 index 00000000000..c0c627b8f0b --- /dev/null +++ b/Content.Shared/_Shitmed/BodyEffects/OrganEffectComponent.cs @@ -0,0 +1,27 @@ +// We keep this clone of the other component since I don't know yet if I'll need organ specific functions in the future. +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared._Shitmed.BodyEffects; + +[RegisterComponent, NetworkedComponent] +[AutoGenerateComponentPause] +public sealed partial class OrganEffectComponent : Component +{ + /// + /// The components that are active on the part and will be refreshed every 5s + /// + [DataField] + public ComponentRegistry Active = new(); + + /// + /// How long to wait between each refresh. + /// Effects can only last at most this long once the organ is removed. + /// + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(5); + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] + public TimeSpan NextUpdate = TimeSpan.Zero; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/BodyEffects/OrganEffectSystem.cs b/Content.Shared/_Shitmed/BodyEffects/OrganEffectSystem.cs new file mode 100644 index 00000000000..6b290f1955b --- /dev/null +++ b/Content.Shared/_Shitmed/BodyEffects/OrganEffectSystem.cs @@ -0,0 +1,110 @@ +// We keep this clone of the other system since I don't know yet if I'll need organ specific functions in the future. +// will delete or refactor as time goes on. +using Content.Shared._Shitmed.Body.Organ; +using Content.Shared.Body.Organ; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; +using Robust.Shared.Timing; +using System.Linq; +using Robust.Shared.Network; + + +namespace Content.Shared._Shitmed.BodyEffects; +public partial class OrganEffectSystem : EntitySystem +{ + [Dependency] private readonly IComponentFactory _compFactory = default!; + [Dependency] private readonly ISerializationManager _serManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly INetManager _net = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnOrganComponentsModify); + } + + // While I would love to kill this function, problem is that if we happen to have two parts that add the same + // effect, removing one will remove both of them, since we cant tell what the source of a Component is. + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (!_net.IsServer) // TODO: Kill this once I figure out whats breaking the Diagnostic Cybernetics. + return; + + var query = EntityQueryEnumerator(); + var now = _gameTiming.CurTime; + while (query.MoveNext(out var uid, out var comp, out var part)) + { + if (now < comp.NextUpdate || !comp.Active.Any() || part.Body is not { } body) + continue; + + comp.NextUpdate = now + comp.Delay; + AddComponents(body, uid, comp.Active); + } + } + + private void OnOrganComponentsModify(Entity organEnt, + ref OrganComponentsModifyEvent ev) + { + if (!_net.IsServer) // TODO: Kill this once I figure out whats breaking the Diagnostic Cybernetics. + return; + + if (organEnt.Comp.OnAdd != null) + { + if (ev.Add) + AddComponents(ev.Body, organEnt, organEnt.Comp.OnAdd); + else + RemoveComponents(ev.Body, organEnt, organEnt.Comp.OnAdd); + } + + if (organEnt.Comp.OnRemove != null) + { + if (ev.Add) + AddComponents(ev.Body, organEnt, organEnt.Comp.OnRemove); + else + RemoveComponents(ev.Body, organEnt, organEnt.Comp.OnRemove); + } + } + + private void AddComponents(EntityUid body, + EntityUid part, + ComponentRegistry reg, + OrganEffectComponent? effectComp = null) + { + if (!Resolve(part, ref effectComp, logMissing: false)) + return; + + foreach (var (key, comp) in reg) + { + var compType = comp.Component.GetType(); + if (HasComp(body, compType)) + continue; + + var newComp = (Component) _serManager.CreateCopy(comp.Component, notNullableOverride: true); + newComp.Owner = body; + EntityManager.AddComponent(body, newComp, true); + effectComp.Active[key] = comp; + if (newComp.NetSyncEnabled) + { + Dirty(body, newComp); + Dirty(part, effectComp); + } + } + } + + private void RemoveComponents(EntityUid body, + EntityUid part, + ComponentRegistry reg, + OrganEffectComponent? effectComp = null) + { + if (!Resolve(part, ref effectComp, logMissing: false)) + return; + + foreach (var (key, comp) in reg) + { + RemComp(body, comp.Component.GetType()); + effectComp.Active.Remove(key); + } + } +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartComponent.cs b/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartComponent.cs new file mode 100644 index 00000000000..e581867fc30 --- /dev/null +++ b/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartComponent.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.BodyEffects.Subsystems; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class GenerateChildPartComponent : Component +{ + + [DataField(required: true)] + public EntProtoId Id = ""; + + [DataField, AutoNetworkedField] + public EntityUid? ChildPart; + + [DataField] + public bool Active = false; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs b/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs new file mode 100644 index 00000000000..00215048e73 --- /dev/null +++ b/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs @@ -0,0 +1,69 @@ +using Content.Shared.Body.Part; +using Content.Shared.Body.Systems; +using Content.Shared._Shitmed.Body.Events; +using Robust.Shared.Map; +using Robust.Shared.Timing; +using Robust.Shared.Network; +using System.Numerics; + +namespace Content.Shared._Shitmed.BodyEffects.Subsystems; + +public sealed class GenerateChildPartSystem : EntitySystem +{ + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPartComponentsModify); + } + + private void OnPartComponentsModify(EntityUid uid, GenerateChildPartComponent component, ref BodyPartComponentsModifyEvent args) + { + if (args.Add) + CreatePart(uid, component); + //else + //DeletePart(uid, component); + } + + private void CreatePart(EntityUid uid, GenerateChildPartComponent component) + { + if (!TryComp(uid, out BodyPartComponent? partComp) + || partComp.Body is null + || component.Active) + return; + + // I pinky swear to also move this to the server side properly next update :) + if (_net.IsServer) + { + var childPart = Spawn(component.Id, new EntityCoordinates(partComp.Body.Value, Vector2.Zero)); + + if (!TryComp(childPart, out BodyPartComponent? childPartComp)) + return; + + var slotName = _bodySystem.GetSlotFromBodyPart(childPartComp); + _bodySystem.TryCreatePartSlot(uid, slotName, childPartComp.PartType, out var _); + _bodySystem.AttachPart(uid, slotName, childPart, partComp, childPartComp); + component.ChildPart = childPart; + component.Active = true; + Dirty(childPart, childPartComp); + } + + _bodySystem.ChangeSlotState((uid, partComp), false); + } + + // Still unusued, gotta figure out what I want to do with this function outside of fuckery with mantis blades. + private void DeletePart(EntityUid uid, GenerateChildPartComponent component) + { + if (!TryComp(uid, out BodyPartComponent? partComp)) + return; + + _bodySystem.ChangeSlotState((uid, partComp), true); + var ev = new BodyPartDroppedEvent((uid, partComp)); + RaiseLocalEvent(uid, ref ev); + QueueDel(uid); + } +} + diff --git a/Content.Shared/_Shitmed/Cybernetics/CyberneticsComponent.cs b/Content.Shared/_Shitmed/Cybernetics/CyberneticsComponent.cs new file mode 100644 index 00000000000..43c1588c2a6 --- /dev/null +++ b/Content.Shared/_Shitmed/Cybernetics/CyberneticsComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Shitmed.Cybernetics; + +/// +/// Component for cybernetic implants that can be installed in entities +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class CyberneticsComponent : Component +{ + /// + /// Is the cybernetic implant disabled by EMPs, etc? + /// + [DataField, AutoNetworkedField] + public bool Disabled = false; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs new file mode 100644 index 00000000000..af03fbf912c --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +// Quite the redundant name eh? +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryComponentConditionComponent : Component +{ + [DataField] + public ComponentRegistry Component; + + [DataField] + public bool Inverse; + +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index f08b83ca871..ea7d184f2e8 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -104,6 +104,17 @@ private void OnToolStep(Entity ent, ref SurgeryStepEvent a } } + if (ent.Comp.BodyAdd != null) + { + foreach (var reg in ent.Comp.BodyAdd.Values) + { + var compType = reg.Component.GetType(); + if (HasComp(args.Body, compType)) + continue; + AddComp(args.Body, _compFactory.GetComponent(compType)); + } + } + if (ent.Comp.BodyRemove != null) { foreach (var reg in ent.Comp.BodyRemove.Values) @@ -151,6 +162,18 @@ private void OnToolCheck(Entity ent, ref SurgeryStepComple } } + if (ent.Comp.BodyAdd != null) + { + foreach (var reg in ent.Comp.BodyAdd.Values) + { + if (!HasComp(args.Body, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + if (ent.Comp.BodyRemove != null) { foreach (var reg in ent.Comp.BodyRemove.Values) @@ -253,12 +276,9 @@ private void OnTendWoundsStep(Entity ent, ref bonus *= 0.2; var adjustedDamage = new DamageSpecifier(ent.Comp.Damage); - var bonusPerType = bonus / group.Length; foreach (var type in group) - { - adjustedDamage.DamageDict[type] -= bonusPerType; - } + adjustedDamage.DamageDict[type] -= bonus; var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 0.5f); RaiseLocalEvent(args.Body, ref ev); @@ -619,7 +639,7 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S foreach (var tool in validTools.Keys) { if (TryComp(tool, out SurgeryToolComponent? toolComp) && - toolComp.EndSound != null) + toolComp.StartSound != null) { _audio.PlayEntity(toolComp.StartSound, user, tool); } @@ -632,7 +652,8 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S var ev = new SurgeryDoAfterEvent(args.Surgery, args.Step); // TODO: Move 2 seconds to a field of SurgeryStepComponent - var duration = 2f / speed; + var duration = GetSurgeryDuration(step, user, body, speed); + if (TryComp(user, out SurgerySpeedModifierComponent? surgerySpeedMod) && surgerySpeedMod is not null) duration = duration / surgerySpeedMod.SpeedModifier; @@ -664,6 +685,18 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S } } + private float GetSurgeryDuration(EntityUid surgeryStep, EntityUid user, EntityUid target, float toolSpeed) + { + if (!TryComp(surgeryStep, out SurgeryStepComponent? stepComp)) + return 2f; // Shouldnt really happen but just a failsafe. + + var speed = toolSpeed; + + if (TryComp(user, out SurgerySpeedModifierComponent? surgerySpeedMod)) + speed *= surgerySpeedMod.SpeedModifier; + + return stepComp.Duration / speed; + } private (Entity Surgery, int Step)? GetNextStep(EntityUid body, EntityUid part, Entity surgery, List requirements) { if (!Resolve(surgery, ref surgery.Comp)) diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs index e07630e8d72..f5f58789d1b 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs @@ -58,6 +58,7 @@ public override void Initialize() SubscribeLocalEvent(OnTargetDoAfter); SubscribeLocalEvent(OnCloseIncisionValid); //SubscribeLocalEvent(OnLarvaValid); + SubscribeLocalEvent(OnComponentConditionValid); SubscribeLocalEvent(OnPartConditionValid); SubscribeLocalEvent(OnOrganConditionValid); SubscribeLocalEvent(OnWoundedValid); @@ -127,6 +128,21 @@ private void OnWoundedValid(Entity ent, ref Su if (infected != null && infected.SpawnedLarva != null) args.Cancelled = true; }*/ + + private void OnComponentConditionValid(Entity ent, ref SurgeryValidEvent args) + { + var present = true; + foreach (var reg in ent.Comp.Component.Values) + { + var compType = reg.Component.GetType(); + if (!HasComp(args.Part, compType)) + present = false; + } + + if (ent.Comp.Inverse ? present : !present) + args.Cancelled = true; + } + private void OnPartConditionValid(Entity ent, ref SurgeryValidEvent args) { if (!TryComp(args.Part, out var part)) @@ -177,7 +193,7 @@ private void OnPartRemovedConditionValid(Entity "a bone setter"; + public bool? Used { get; set; } = null; + [DataField] + public float Speed { get; set; } = 1f; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/DrillComponent.cs similarity index 63% rename from Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs rename to Content.Shared/_Shitmed/Surgery/Tools/DrillComponent.cs index c47c7e2834b..919307e8989 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgicalDrillComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/DrillComponent.cs @@ -3,10 +3,10 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; [RegisterComponent, NetworkedComponent] -public sealed partial class SurgicalDrillComponent : Component, ISurgeryToolComponent +public sealed partial class DrillComponent : Component, ISurgeryToolComponent { - public string ToolName => "a surgical drill"; + public string ToolName => "a drill"; public bool? Used { get; set; } = null; [DataField] public float Speed { get; set; } = 1f; -} +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs index 753623127bb..5d4b7a9fdfa 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/SurgeryToolExamineSystem.cs @@ -23,7 +23,7 @@ public override void Initialize() SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnExamined); - SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnExamined); diff --git a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs index 94d10322766..ea17c23881b 100644 --- a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs +++ b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared._Shitmed.Body.Organ; // Shitmed Change using Content.Shared.Body.Components; // Shitmed Change using Content.Shared.DoAfter; using Content.Shared.Gravity; @@ -120,7 +121,8 @@ standingState.CurrentState is not StandingState.Lying || TerminatingOrDeleted(uid) || // Shitmed Change !TryComp(uid, out var body) || - body.LegEntities.Count == 0) + body.LegEntities.Count == 0 || + HasComp(uid)) return false; var args = new DoAfterArgs(EntityManager, uid, layingDown.StandingUpTime, new StandingUpDoAfterEvent(), uid) diff --git a/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl b/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl index 8ded2fcaec9..dd49176148b 100644 --- a/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl +++ b/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl @@ -50,3 +50,4 @@ surgery-popup-step-SurgeryStepInsertHeart = {$user} is inserting a heart into {$ 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}. +surgery-popup-step-SurgeryStepLobotomize = {$user} is drilling a hole into {$target}'s {$part}. \ No newline at end of file diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 91a803da6ea..9387ce7c625 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -71,3 +71,8 @@ research-technology-advanced-spray = Advanced Spray research-technology-bluespace-cargo-transport = Bluespace Cargo Transport research-technology-quantum-fiber-weaving = Quantum Fiber Weaving research-technology-bluespace-chemistry = Bluespace Chemistry + +## Shitmed Change +research-technology-advanced-treatment = Advanced Treatment +research-technology-high-end-surgery = High End Surgical Tools +research-technology-cybernetic-enhancements = Cybernetic Enhancements \ No newline at end of file diff --git a/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml b/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml index adc626bc114..d573ce0dfba 100644 --- a/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml +++ b/Resources/Prototypes/DeltaV/Body/Organs/harpy.yml @@ -9,6 +9,8 @@ - state: lung-l - state: lung-r - type: Lung + - type: Organ + slotId: lungs - type: Metabolizer updateInterval: 2.0 removeEmpty: true diff --git a/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml b/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml index 7ac267b6be2..e0413ce9b0e 100644 --- a/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml @@ -7,7 +7,7 @@ abstract: true components: - type: Damageable - damageContainer: Biological + damageContainer: OrganicPart # Shitmed Change - type: BodyPart - type: ContainerContainer containers: diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml index 25988f4a3a8..057a0e65ad1 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml @@ -17,6 +17,7 @@ - left arm - right leg - left leg + - head # Shitmed Change organs: heart: OrganHumanHeart lungs: OrganHarpyLungs diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/rodentia.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/rodentia.yml index 0e62f397940..726db8632e9 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/rodentia.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/rodentia.yml @@ -23,6 +23,7 @@ - left arm - right leg - left leg + - head # Shitmed Change right arm: part: RightArmRodentia connections: diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml index cdf787e4736..b4ca82231da 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/vulpkanin.yml @@ -23,6 +23,7 @@ - left arm - right leg - left leg + - head # Shitmed Change right arm: part: RightArmVulpkanin connections: diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml index 87b8d54a977..208b8eb4eb4 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml @@ -218,4 +218,4 @@ interactSuccessString: petting-success-derelict-cyborg interactFailureString: petting-failure-derelict-cyborg interactSuccessSound: - path: /Audio/Ambience/Objects/periodic_beep.ogg \ No newline at end of file + path: /Audio/Ambience/Objects/periodic_beep.ogg diff --git a/Resources/Prototypes/Entities/Objects/Misc/pen.yml b/Resources/Prototypes/Entities/Objects/Misc/pen.yml index 45f90f9603b..6e02f4be241 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/pen.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/pen.yml @@ -42,13 +42,13 @@ damage: types: Piercing: 3 - - type: Tending # Shitmed - speed: 0.55 - - type: SurgeryTool # Shitmed - startSound: - path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg - endSound: - path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg +# - type: Tending # Shitmed TODO: Uncomment this when surgeries arent tied to interaction events, but verbs. +# speed: 0.55 +# - type: SurgeryTool # Shitmed +# startSound: +# path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg +# endSound: +# path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg #TODO: I want the luxury pen to write a cool font like Merriweather in the future. diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index e3c358b47af..8a1198d7767 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -1,3 +1,5 @@ +# Im not even gonna bother marking this file with Shitmed Change(s), I'm fucking with almost everything. + # Base - type: entity @@ -11,7 +13,7 @@ - type: Tag tags: - SurgeryTool - - type: SurgeryTool # Shitmed Change + - type: SurgeryTool # Cautery @@ -22,10 +24,10 @@ description: A surgical tool used to cauterize open wounds. components: - type: Sprite - sprite: Objects/Specific/Medical/Surgery/cautery.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi state: cautery - type: Item - sprite: Objects/Specific/Medical/Surgery/cautery.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi storedRotation: 90 - type: MeleeWeapon damage: @@ -50,10 +52,10 @@ description: A surgical drill for making holes into hard material. components: - type: Sprite - sprite: Objects/Specific/Medical/Surgery/drill.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi state: drill - type: Item - sprite: Objects/Specific/Medical/Surgery/drill.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi shape: - 0,0,1,0 - 1,1,1,1 @@ -69,7 +71,7 @@ - type: SurgeryTool startSound: path: /Audio/_Shitmed/Medical/Surgery/saw.ogg - - type: SurgicalDrill + - type: Drill # Scalpel @@ -89,10 +91,10 @@ types: - Knife - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi state: scalpel - type: Item - sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi storedRotation: 90 - type: MeleeWeapon wideAnimationRotation: 90 @@ -118,8 +120,11 @@ description: A pointy piece of glass, abraded to an edge and wrapped in tape for a handle. # Could become a decent tool or weapon with right tool mods. components: - type: Sprite + sprite: Objects/Specific/Medical/Surgery/scalpel.rsi state: shiv - type: Item + sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + storedRotation: 90 heldPrefix: shiv - type: entity @@ -129,8 +134,11 @@ description: Made of more expensive materials, sharper and generally more reliable. components: - type: Sprite + sprite: Objects/Specific/Medical/Surgery/scalpel.rsi state: advanced - type: Item + sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + storedRotation: 90 heldPrefix: advanced - type: MeleeWeapon damage: @@ -146,14 +154,17 @@ description: A scalpel which uses a directed laser to slice instead of a blade, for more precise surgery while also cauterizing as it cuts. components: - type: Sprite + sprite: Objects/Specific/Medical/Surgery/scalpel.rsi state: laser - type: Item + sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + storedRotation: 90 heldPrefix: laser - type: Scalpel # Shitmed speed: 1.5 # TODO: prevent bleeding from incisions -# Scissors +# Retractor - type: entity name: retractor @@ -162,10 +173,10 @@ description: A surgical tool used to hold open incisions. components: - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor - type: Item - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi storedRotation: 90 # Shitmed Change - type: SurgeryTool @@ -175,6 +186,8 @@ path: /Audio/_Shitmed/Medical/Surgery/retractor2.ogg - type: Retractor +# Hemostat + - type: entity name: hemostat id: Hemostat @@ -182,11 +195,11 @@ description: A surgical tool used to compress blood vessels to prevent bleeding. components: - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi # Shitmed Change + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi # Shitmed Change state: hemostat - type: Item heldPrefix: hemostat - sprite: Objects/Specific/Medical/Surgery/scissors.rsi # Shitmed Change + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi # Shitmed Change storedRotation: 90 # Shitmed Change - type: SurgeryTool @@ -220,7 +233,7 @@ description: A container for bone gel that often needs to be refilled from a specialized machine. components: - type: Sprite - sprite: _Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi state: bone-gel - type: BoneGel @@ -282,9 +295,11 @@ description: For heavy duty cutting. components: - type: Sprite - state: electric + sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi + state: circular-saw - type: Item - heldPrefix: electric + size: Normal + sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi - type: MeleeWeapon damage: groups: @@ -303,8 +318,12 @@ description: You think you can cut anything with it. components: - type: Sprite + sprite: Objects/Specific/Medical/Surgery/saw.rsi state: advanced - type: Item + size: Normal + sprite: Objects/Specific/Medical/Surgery/saw.rsi + storedRotation: 90 heldPrefix: advanced - type: MeleeWeapon attackRate: 1.5 @@ -313,111 +332,135 @@ - type: BoneSaw # Shitmed speed: 2 -# ORGANS - SHITMED - -- type: entity - parent: OrganHumanHeart - id: BioSynthHeart - name: bio-synthetic heart - description: This heart can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: OrganHumanLiver - id: BioSynthLiver - name: bio-synthetic liver - description: This liver can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: OrganHumanLungs - id: BioSynthLungs - name: bio-synthetic lungs - description: These lungs can be transplanted into any living organism and it will adapt to its recipient. +# Shitmed Tools - type: entity - parent: OrganHumanEyes - id: BioSynthEyes - name: bio-synthetic eyes - description: These eyes can be transplanted into any living organism and it will adapt to its recipient. - - -# PARTS - SHITMED - -- type: entity - parent: LeftArmHuman - id: BioSynthLeftArm - name: bio-synthetic left arm - description: This left arm can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: RightArmHuman - id: BioSynthRightArm - name: bio-synthetic right arm - description: This right arm can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: LeftHandHuman - id: BioSynthLeftHand - name: bio-synthetic left hand - description: This left hand can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: RightHandHuman - id: BioSynthRightHand - name: bio-synthetic right hand - description: This right hand can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: LeftLegHuman - id: BioSynthLeftLeg - name: bio-synthetic left leg - description: This left leg can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: RightLegHuman - id: BioSynthRightLeg - name: bio-synthetic right leg - description: This right leg can be transplanted into any living organism and it will adapt to its recipient. - -- type: entity - parent: LeftFootHuman - id: BioSynthLeftFoot - name: bio-synthetic left foot - description: This left foot can be transplanted into any living organism and it will adapt to its recipient. + name: searing tool + id: EnergyCautery + parent: Cautery + description: A cautery with an energy tip, also serves as a drill in its powered state. + components: + - type: Sprite + sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi + state: e-cautery-on + - type: Item + sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi + inhandVisuals: + left: + - state: inhand-left-on + right: + - state: inhand-right-on + - type: SurgeryTool + startSound: + path: /Audio/_Shitmed/Medical/Surgery/cautery1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/cautery2.ogg + - type: MeleeWeapon + damage: + types: + Piercing: 10 + Heat: 1 + - type: Cautery + speed: 1.5 + - type: Drill + speed: 1.5 - type: entity - parent: RightFootHuman - id: BioSynthRightFoot - name: bio-synthetic right foot - description: This right foot can be transplanted into any living organism and it will adapt to its recipient. - -# JOKE ITEMS - SHITMED + name: energy scalpel + id: EnergyScalpel + parent: Scalpel + description: A scalpel which uses an energy blade, also serves as a saw in its powered state. + components: + - type: Sprite + sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi + state: e-scalpel-on + - type: Item + sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi + inhandVisuals: + left: + - state: inhand-left-on + right: + - state: inhand-right-on + - type: SurgeryTool + startSound: + path: /Audio/_Shitmed/Medical/Surgery/scalpel1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/scalpel2.ogg + - type: MeleeWeapon + damage: + types: + Slash: 10 + Heat: 1 + - type: Scalpel + speed: 1.5 + - type: BoneSaw + speed: 1.5 - type: entity - parent: LeftArmHuman - id: PizzaLeftArm - name: pizza left arm - description: For when you want to turn someone into a Space John's. + name: mechanical pinches + id: AdvancedRetractor + parent: Retractor + description: A retractor with mechanical pinches, also serves as a hemostat in its powered state. components: - - type: BodyPart - partType: Arm - symmetry: Left - toolName: "a left arm" - baseLayerId: MobPizzaLArm - type: Sprite - sprite: _Shitmed/Mobs/Species/Misc/Pizza/parts.rsi - state: "l_arm" + sprite: _Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi + state: adv-retractor-on + - type: Item + sprite: _Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi + inhandVisuals: + left: + - state: inhand-left-on + right: + - state: inhand-right-on + - type: SurgeryTool + startSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor2.ogg + - type: MeleeWeapon + damage: + types: + Slash: 6.5 + Heat: 1 + - type: Hemostat + speed: 1.5 + - type: Retractor + speed: 1.5 + - type: Tweezers + speed: 1.5 + - type: Tending + speed: 1.5 - type: entity - parent: RightArmHuman - id: PizzaRightArm - name: pizza right arm - description: For when you want to turn someone into a Space John's. + name: medical multitool + id: OmnimedTool + parent: BaseToolSurgery components: - - type: BodyPart - partType: Arm - symmetry: Right - toolName: "a right arm" - baseLayerId: MobPizzaRArm - type: Sprite - sprite: _Shitmed/Mobs/Species/Misc/Pizza/parts.rsi - state: "r_arm" + sprite: _Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi + state: omnimed + - type: Item + sprite: _Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi + - type: SurgeryTool + startSound: + path: /Audio/_Shitmed/Medical/Surgery/saw.ogg + - type: Hemostat + speed: 2 + - type: Scalpel + speed: 2 + - type: Drill + speed: 2 + - type: BoneSetter + speed: 2 + - type: Retractor + speed: 2 + - type: Cautery + speed: 2 + - type: BoneGel + speed: 2 + - type: BoneSaw + speed: 2 + - type: Tweezers + speed: 2 + - type: Tending + speed: 2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index b179c7aa042..644bac105e0 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -654,3 +654,44 @@ - type: Construction # DeltaV: construction for adding explosive payload to the dud version graph: BorgModuleMartyr node: live + +# Shitmed Modules + +- type: entity + id: BorgModuleSurgery + parent: [ BaseBorgModuleMedical, BaseProviderBorgModule ] + name: surgery cyborg module + components: + - type: Sprite + layers: + - state: medical + - state: icon-surgery + - type: ItemBorgModule + items: + - Scalpel + - Drill + - Hemostat + - Retractor + - Cautery + - SawElectric + - BoneGel + - type: BorgModuleIcon + icon: { sprite: Interface/Actions/actions_borg.rsi, state: surgery-module } + +- type: entity + id: BorgModuleAdvancedSurgery + parent: [ BaseBorgModuleMedical, BaseProviderBorgModule ] + name: advanced surgery cyborg module + components: + - type: Sprite + layers: + - state: medical + - state: icon-advanced-surgery + - type: ItemBorgModule + items: + - EnergyScalpel + - EnergyCautery + - AdvancedRetractor + - BoneGel + - type: BorgModuleIcon + icon: { sprite: Interface/Actions/actions_borg.rsi, state: adv-surgery-module } diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 6d70c4538bb..f217e2ba773 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -377,6 +377,9 @@ - PowerCellHyper - FireExtinguisherBluespace # End DeltaV additions + - EnergyScalpel # Shitmed Change + - EnergyCautery # Shitmed Change + - AdvancedRetractor # Shitmed Change - type: EmagLatheRecipes emagDynamicRecipes: - BorgModuleFauna @@ -649,6 +652,7 @@ - RightLegBorg - LightHeadBorg - TorsoBorg + - BorgModuleSurgery # Shitmed Change dynamicRecipes: - ProximitySensor - BorgModuleAdvancedCleaning @@ -687,6 +691,14 @@ - BorgModuleSecurityChase - BorgModuleSecurityEscalate - JetpackVoid + # Shitmed Change + - BorgModuleAdvancedSurgery + - JawsOfLifeLeftArm + - JawsOfLifeRightArm + - SpeedLeftLeg + - SpeedRightLeg + - BasicCyberneticEyes + # Shitmed End - type: EmagLatheRecipes emagDynamicRecipes: - ClothingOuterHardsuitJuggernautReverseEngineered @@ -912,6 +924,8 @@ - WeaponColdCannon - WeaponBeamCannon # End DeltaV additions + - SecurityCyberneticEyes # Shitmed Change + - MedicalCyberneticEyes # Shitmed Change - type: MaterialStorage whitelist: tags: @@ -1048,6 +1062,12 @@ - ClothingEyesHudMedical # Nyano - ChemicalPayload # Nyano - SyringeCryostasis + # Shitmed Change + - EnergyScalpel + - EnergyCautery + - AdvancedRetractor + - OmnimedTool + - MedicalCyberneticEyes - type: Machine board: MedicalTechFabCircuitboard - type: StealTarget diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml index a09f3b6ab7f..f7c4276d532 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/felinid.yml @@ -17,6 +17,7 @@ - left arm - right leg - left leg + - head # Shitmed Change organs: heart: OrganAnimalHeart lungs: OrganHumanLungs diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index ea3414a87ec..da8564dac11 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -226,11 +226,62 @@ Steel: 100 Plastic: 100 -# Shitmed Change +# Shitmed Recipes + - type: latheRecipe id: BoneGel result: BoneGel completetime: 2 materials: Plastic: 200 - Plasma: 200 \ No newline at end of file + Plasma: 200 + +- type: latheRecipe + id: MedicalCyberneticEyes + result: MedicalCyberneticEyes + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: EnergyScalpel + result: EnergyScalpel + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Gold: 150 + +- type: latheRecipe + id: AdvancedRetractor + result: AdvancedRetractor + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Silver: 150 + +- type: latheRecipe + id: EnergyCautery + result: EnergyCautery + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Plasma: 150 + +- type: latheRecipe + id: OmnimedTool + result: OmnimedTool + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Gold: 150 + Silver: 150 + Plasma: 150 \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index 36ceff065b3..b761ed54e7f 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -202,3 +202,86 @@ parent: BaseBorgModuleRecipe id: BorgModuleHarvesting result: BorgModuleHarvesting + +# Shitmed Recipes + +- type: latheRecipe + id: BorgModuleSurgery + result: BorgModuleSurgery + category: Robotics + completetime: 3 + materials: + Steel: 250 + Glass: 250 + Plastic: 250 + +- type: latheRecipe + id: BorgModuleAdvancedSurgery + result: BorgModuleAdvancedSurgery + category: Robotics + completetime: 3 + materials: + Steel: 500 + Glass: 500 + Plastic: 250 + Gold: 50 + +- type: latheRecipe + id: JawsOfLifeLeftArm + result: JawsOfLifeLeftArm + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: JawsOfLifeRightArm + result: JawsOfLifeRightArm + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: SpeedLeftLeg + result: SpeedLeftLeg + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: SpeedRightLeg + result: SpeedRightLeg + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: BasicCyberneticEyes + result: BasicCyberneticEyes + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index ac695f314a0..d850691584d 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -714,3 +714,17 @@ Plastic: 1000 Plasma: 500 Glass: 500 + +# Shitmed Recipes + +- type: latheRecipe + id: SecurityCyberneticEyes + result: SecurityCyberneticEyes + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index fd2fa5a206e..b4cf857cd9d 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -130,18 +130,42 @@ - CryostasisBeaker - SyringeCryostasis +# Shitmed Change Start - type: technology - id: MechanizedTreatment - name: research-technology-mechanized-treatment + id: AdvancedTreatment + name: research-technology-advanced-treatment icon: - sprite: Mobs/Silicon/chassis.rsi - state: medical + sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi + state: e-scalpel-on discipline: CivilianServices tier: 2 cost: 5000 recipeUnlocks: - BorgModuleAdvancedTreatment - BorgModuleDefibrillator + - EnergyScalpel + - EnergyCautery + - AdvancedRetractor + - BorgModuleAdvancedSurgery + +- type: technology + id: CyberneticEnhancements + name: research-technology-cybernetic-enhancements + icon: + sprite: _Shitmed/Mobs/Species/IPC/organs.rsi + state: eyes + discipline: CivilianServices + tier: 2 + cost: 15000 + recipeUnlocks: + - JawsOfLifeLeftArm + - JawsOfLifeRightArm + - SpeedLeftLeg + - SpeedRightLeg + - BasicCyberneticEyes + - SecurityCyberneticEyes + - MedicalCyberneticEyes +# Shitmed Change End - type: technology id: AdvancedCleaning diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml index d565a7f2e7f..1c9777d5870 100644 --- a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml +++ b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml @@ -3,15 +3,15 @@ id: OrganSpaceAnimalLungs name: space animal lungs components: - - type: StatusEffectOrgan - refresh: - BreathingImmunity: BreathingImmunity + - type: Organ + onAdd: + - type: BreathingImmunity - type: entity parent: OrganAnimalHeart id: OrganSpaceAnimalHeart name: space animal heart components: - - type: StatusEffectOrgan - refresh: - PressureImmunity: PressureImmunity + - type: Organ + onAdd: + - type: PressureImmunity \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/cybernetic.yml b/Resources/Prototypes/_Shitmed/Body/Organs/cybernetic.yml new file mode 100644 index 00000000000..514920257c1 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Organs/cybernetic.yml @@ -0,0 +1,51 @@ +- type: entity + parent: OrganHumanEyes + abstract: true + id: BaseCyberneticEyes + components: + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/IPC/organs.rsi + state: "eyes" + +- type: entity + parent: BaseCyberneticEyes + id: BasicCyberneticEyes + name: cybernetic eyes + description: A pair of cybernetic eyes that enhance your vision, and protect you from eye damage. + components: + - type: Organ + onAdd: + - type: FlashImmunity + - type: EyeProtection + +- type: entity + parent: BaseCyberneticEyes + id: SecurityCyberneticEyes + name: cybernetic security eyes + description: A pair of cybernetic eyes that enhance your vision, featuring an integrated SecHUD. + components: + - type: Organ + onAdd: + - type: FlashImmunity + - type: EyeProtection + - type: ShowJobIcons + - type: ShowMindShieldIcons + - type: ShowCriminalRecordIcons + +- type: entity + parent: BaseCyberneticEyes + id: MedicalCyberneticEyes + name: cybernetic diagnostic eyes + description: A pair of cybernetic eyes that enhance your vision, featuring an integrated MedHUD. + components: + - type: Organ + onAdd: + - type: FlashImmunity + - type: EyeProtection + - type: ShowHealthBars + damageContainers: + - Biological + - type: ShowHealthIcons + damageContainers: + - Biological \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/generic.yml b/Resources/Prototypes/_Shitmed/Body/Organs/generic.yml new file mode 100644 index 00000000000..68dc80b3ab3 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Organs/generic.yml @@ -0,0 +1,23 @@ +- type: entity + parent: OrganHumanHeart + id: BioSynthHeart + name: bio-synthetic heart + description: This heart can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: OrganHumanLiver + id: BioSynthLiver + name: bio-synthetic liver + description: This liver can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: OrganHumanLungs + id: BioSynthLungs + name: bio-synthetic lungs + description: These lungs can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: OrganHumanEyes + id: BioSynthEyes + name: bio-synthetic eyes + description: These eyes can be transplanted into any living organism and it will adapt to its recipient. \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml b/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml new file mode 100644 index 00000000000..6e85a42b87c --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml @@ -0,0 +1,169 @@ +- type: entity + id: LeftArmCybernetic + parent: LeftArmHuman + abstract: true + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopLArm + - type: GenerateChildPart + id: LeftHandCybernetic + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_arm-combined" + +- type: entity + id: RightArmCybernetic + parent: RightArmHuman + abstract: true + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopRArm + - type: GenerateChildPart + id: RightHandCybernetic + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_arm-combined" + +- type: entity + id: LeftLegCybernetic + parent: LeftLegHuman + abstract: true + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopLLeg + - type: GenerateChildPart + id: LeftFootCybernetic + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_leg-combined" + +- type: entity + id: RightLegCybernetic + parent: RightLegHuman + abstract: true + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopRLeg + - type: GenerateChildPart + id: RightFootCybernetic + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_leg-combined" + +- type: entity + id: LeftHandCybernetic + parent: LeftHandHuman + name: cybernetic left hand + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopLHand + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_hand" + +- type: entity + id: RightHandCybernetic + parent: RightHandHuman + name: cybernetic right hand + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopRHand + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_hand" + +- type: entity + id: LeftFootCybernetic + parent: LeftFootHuman + name: cybernetic left foot + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopLFoot + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_foot" + +- type: entity + id: RightFootCybernetic + parent: RightFootHuman + name: cybernetic right foot + components: + - type: Damageable + damageContainer: Silicon + - type: BodyPart + baseLayerId: MobCyberneticBishopRFoot + - type: Cybernetics + - type: Sprite + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_foot" + +- type: entity + parent: LeftArmCybernetic + id: JawsOfLifeLeftArm + name: J.W.L left arm + description: A cybernetic left arm with the ability to pry doors open. + components: + - type: BodyPart + onAdd: + - type: Prying + speedModifier: 1.5 + pryPowered: true + +- type: entity + parent: RightArmCybernetic + id: JawsOfLifeRightArm + name: J.W.L right arm + description: A cybernetic right arm with the ability to pry doors open. + components: + - type: BodyPart + onAdd: + - type: Prying + speedModifier: 1.5 + pryPowered: true + +- type: entity + parent: LeftLegCybernetic + id: SpeedLeftLeg + name: S.P.E.E.D left leg + description: A cybernetic left leg that allows its wearer to run faster. + components: + - type: MovementBodyPart + walkSpeed: 3.125 + sprintSpeed: 5.625 + - type: BodyPart + onAdd: + - type: NoSlip + +- type: entity + parent: RightLegCybernetic + id: SpeedRightLeg + name: S.P.E.E.D right leg + description: A cybernetic left leg that allows its wearer to run faster. + components: + - type: MovementBodyPart + walkSpeed: 3.125 + sprintSpeed: 5.625 + - type: BodyPart + onAdd: + - type: NoSlip \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml b/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml new file mode 100644 index 00000000000..d01c105fd61 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml @@ -0,0 +1,79 @@ +- type: entity + parent: LeftArmHuman + id: BioSynthLeftArm + name: bio-synthetic left arm + description: This left arm can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: RightArmHuman + id: BioSynthRightArm + name: bio-synthetic right arm + description: This right arm can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: LeftHandHuman + id: BioSynthLeftHand + name: bio-synthetic left hand + description: This left hand can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: RightHandHuman + id: BioSynthRightHand + name: bio-synthetic right hand + description: This right hand can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: LeftLegHuman + id: BioSynthLeftLeg + name: bio-synthetic left leg + description: This left leg can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: RightLegHuman + id: BioSynthRightLeg + name: bio-synthetic right leg + description: This right leg can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: LeftFootHuman + id: BioSynthLeftFoot + name: bio-synthetic left foot + description: This left foot can be transplanted into any living organism and it will adapt to its recipient. + +- type: entity + parent: RightFootHuman + id: BioSynthRightFoot + name: bio-synthetic right foot + description: This right foot can be transplanted into any living organism and it will adapt to its recipient. + +# JOKE ITEMS + +- type: entity + parent: LeftArmHuman + id: PizzaLeftArm + name: pizza left arm + description: For when you want to turn someone into a Space John's. + components: + - type: BodyPart + partType: Arm + symmetry: Left + toolName: "a left arm" + baseLayerId: MobPizzaLArm + - type: Sprite + sprite: _Shitmed/Mobs/Species/Misc/Pizza/parts.rsi + state: "l_arm" + +- type: entity + parent: RightArmHuman + id: PizzaRightArm + name: pizza right arm + description: For when you want to turn someone into a Space John's. + components: + - type: BodyPart + partType: Arm + symmetry: Right + toolName: "a right arm" + baseLayerId: MobPizzaRArm + - type: Sprite + sprite: _Shitmed/Mobs/Species/Misc/Pizza/parts.rsi + state: "r_arm" diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml index 6e24499c2fa..a547f17ae91 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml @@ -398,7 +398,6 @@ inverse: true reattaching: true - - type: entity parent: SurgeryBase id: SurgeryRemoveHeart @@ -589,6 +588,41 @@ inverse: true reattaching: true +- type: entity + parent: SurgeryBase + id: SurgeryLobotomize + name: Lobotomize + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenIncision + steps: + - SurgeryStepLobotomize + - SurgeryStepCloseIncision + - type: SurgeryComponentCondition + component: + - type: OhioAccent + inverse: true + - type: SurgeryPartCondition + part: Head + +- type: entity + parent: SurgeryBase + id: SurgeryMendBrainTissue + name: Mend brain tissue + categories: [ HideSpawnMenu ] + components: + - type: Surgery + requirement: SurgeryOpenIncision + steps: + - SurgeryStepMendBrainTissue + - SurgeryStepCloseIncision + - type: SurgeryComponentCondition + component: + - type: OhioAccent + - type: SurgeryPartCondition + part: Head + # Fluff/Joke Surgeries #- type: entity diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index 5dffe537135..1b655968dd0 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -15,8 +15,9 @@ - type: Scalpel add: - type: IncisionOpen + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi state: scalpel - type: SurgeryDamageChangeEffect damage: @@ -36,8 +37,9 @@ - type: Hemostat add: - type: BleedersClamped + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat - type: SurgeryDamageChangeEffect damage: @@ -56,8 +58,9 @@ - type: Retractor add: - type: SkinRetracted + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor - type: entity @@ -71,9 +74,10 @@ - type: BoneSaw add: - type: RibcageSawed + duration: 4 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/saw.rsi - state: saw + sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi + state: circular-saw - type: SurgeryStepEmoteEffect - type: entity @@ -87,8 +91,9 @@ - type: Retractor add: - type: RibcageOpen + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor #- type: entity @@ -137,8 +142,9 @@ - type: Retractor remove: - type: RibcageOpen + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor - type: entity @@ -152,8 +158,9 @@ - type: BoneGel remove: - type: RibcageSawed + duration: 2 - type: Sprite - sprite: _Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi state: bone-gel - type: entity @@ -173,8 +180,9 @@ - type: IncisionOpen - type: BodyPartReattached - type: InternalBleedersClamped + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/cautery.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi state: cautery - type: SurgeryDamageChangeEffect damage: @@ -194,6 +202,7 @@ - type: SurgeryStep tool: - type: BodyPart + duration: 6 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi state: insertion @@ -213,9 +222,10 @@ - type: BleedersClamped - type: IncisionOpen - type: InternalBleedersClamped + duration: 2 - type: SurgeryAffixPartStep - type: Sprite - sprite: Objects/Specific/Medical/Surgery/cautery.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi state: cautery - type: SurgeryStepEmoteEffect - type: SurgeryDamageChangeEffect @@ -237,9 +247,10 @@ - type: BoneSaw add: - type: BodyPartSawed + duration: 4 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/saw.rsi - state: saw + sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi + state: circular-saw - type: SurgeryStepEmoteEffect - type: entity @@ -253,8 +264,9 @@ - type: Hemostat add: - type: InternalBleedersClamped + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat - type: SurgeryDamageChangeEffect damage: @@ -277,9 +289,10 @@ - type: BleedersClamped - type: InternalBleedersClamped - type: IncisionOpen + duration: 8 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/saw.rsi - state: saw + sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi + state: circular-saw - type: SurgeryRemovePartStep - type: SurgeryStepEmoteEffect @@ -296,8 +309,9 @@ - type: Scalpel add: - type: IncisionOpen + duration: 3 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scalpel.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi state: scalpel - type: SurgeryStepEmoteEffect @@ -310,8 +324,9 @@ - type: SurgeryStep tool: - type: Tending + duration: 1 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat - type: SurgeryTendWoundsEffect damage: @@ -328,8 +343,9 @@ - type: SurgeryStep tool: - type: Tending + duration: 1 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat - type: SurgeryTendWoundsEffect mainGroup: Burn @@ -349,8 +365,9 @@ - type: Cautery remove: - type: IncisionOpen + duration: 2 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/cautery.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi state: cautery - type: SurgeryDamageChangeEffect damage: @@ -368,6 +385,7 @@ categories: [ HideSpawnMenu ] components: - type: SurgeryStep + duration: 4 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi state: insertion @@ -382,6 +400,7 @@ categories: [ HideSpawnMenu ] components: - type: SurgeryStep + duration: 4 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi state: insertion @@ -400,8 +419,9 @@ - type: SurgeryStep tool: - type: Tweezers + duration: 8 - type: Sprite - sprite: Objects/Specific/Medical/Surgery/scissors.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat - type: SurgeryRemoveOrganStep - type: SurgeryStepEmoteEffect @@ -415,6 +435,7 @@ - type: SurgeryStep tool: - type: Organ + duration: 6 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/manipulation.rsi state: insertion @@ -459,10 +480,6 @@ id: SurgeryStepInsertEyes name: Add eyes categories: [ HideSpawnMenu ] - components: - - type: SurgerySpecialDamageChangeEffect - damageType: Eye - isConsumable: true - type: entity parent: SurgeryStepInsertOrgan @@ -483,9 +500,10 @@ - type: SurgeryStep tool: - type: Cautery + duration: 2 - type: SurgeryAffixOrganStep - type: Sprite - sprite: Objects/Specific/Medical/Surgery/cautery.rsi + sprite: _Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi state: cautery - type: SurgeryStepEmoteEffect - type: SurgeryDamageChangeEffect @@ -494,6 +512,48 @@ Heat: -5 sleepModifier: 2 +- type: entity + parent: SurgeryStepBase + id: SurgeryStepLobotomize + name: Lobotomize patient + categories: [ HideSpawnMenu ] + components: + - type: SurgeryStep + tool: + - type: Drill + bodyAdd: + - type: OhioAccent + - type: RatvarianLanguage + - type: SlurredAccent + duration: 5 + - type: Sprite + sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi + state: drill + - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect + damage: + types: + Piercing: 10 + +- type: entity + parent: SurgeryStepBase + id: SurgeryStepMendBrainTissue + name: Mend brain tissue + categories: [ HideSpawnMenu ] + components: + - type: SurgeryStep + tool: + - type: Hemostat + duration: 5 + bodyRemove: + - type: OhioAccent + - type: RatvarianLanguage + - type: SlurredAccent + - type: Sprite + sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi + state: drill + - type: SurgeryStepEmoteEffect + # The lengths I go to just for a joke... I HATE HARDCODING AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # Maybe I should modify species prototypes to include tails and ears properly... diff --git a/Resources/Prototypes/_Shitmed/Species/cybernetics.yml b/Resources/Prototypes/_Shitmed/Species/cybernetics.yml new file mode 100644 index 00000000000..4b945e40895 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Species/cybernetics.yml @@ -0,0 +1,47 @@ +- type: humanoidBaseSprite + id: MobCyberneticBishopLArm + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_arm-combined" + +- type: humanoidBaseSprite + id: MobCyberneticBishopRArm + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_arm-combined" + +- type: humanoidBaseSprite + id: MobCyberneticBishopLLeg + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_leg-combined" + +- type: humanoidBaseSprite + id: MobCyberneticBishopRLeg + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_leg-combined" + +- type: humanoidBaseSprite + id: MobCyberneticBishopLHand + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_hand" + +- type: humanoidBaseSprite + id: MobCyberneticBishopRHand + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_hand" + +- type: humanoidBaseSprite + id: MobCyberneticBishopLFoot + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "l_foot" + +- type: humanoidBaseSprite + id: MobCyberneticBishopRFoot + baseSprite: + sprite: _Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi + state: "r_foot" \ No newline at end of file diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/adv-surgery-module.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/adv-surgery-module.png new file mode 100644 index 0000000000000000000000000000000000000000..df4b715569b0841f37f1362d89e47718ebaa4cc1 GIT binary patch literal 509 zcmVQBw!-qe#^ql&cOfgH?y-d@ZS-iE753F(gtF&n5asi99%WhN>rSRBn&DugWd?O zq!^=|L{$PM!h^IF+p4HmCy;uiodgB~1A&3RVPGgSj?e^BzOUU zlBb6lhCx9+GfYF3P0WrCQc0UWT`<~jvL8>fd$``5f%L@@V~fkUS{I3(P5i{Idd&jT zm-xO%{^}9^If0wYLMVjeILM5$AU=Muo+=B^}jz&el7y|Kpd>^!{_Q=~7g zqF4N!jkULmWv#43uniTiW>Qq00000NkvXXu0mjf&qm!x literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json index 7fb1027c9e9..cabb9fda52e 100644 --- a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json @@ -61,6 +61,12 @@ { "name":"treatment-module" }, + { + "name":"surgery-module" + }, + { + "name":"adv-surgery-module" + }, { "name":"adv-diagnosis-module" }, diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/surgery-module.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/surgery-module.png new file mode 100644 index 0000000000000000000000000000000000000000..4b333eba52a1a9436835e2df5a05841588a47ff3 GIT binary patch literal 475 zcmV<10VMv3P)?gjz+k1u1B4T63@e zqy!BiYQe-s=Rg+2|7Xt0$0U;hCSC07K-07#Qc$&8Wsv}ZITewl$R`v+K{y#OHHRd{ zJ%SLC0KQ5yNK|j_&@dW6?;uSH0)l`bAPB?~D3=%MT0llsVc9kmS;orJ2Bv4rFii); zq38GUy6w176bUl*IJOH(VlXWWgT4-%?yX&)q1Lz<&Hq~h+dI2hUEe~nki|<^hb+lx z+%{nvCJe(sux;9wfn2@>#$@U(fbVbIoKe5)@{k5R$BHEzOW^2uA8I}aZEcfG2lP}5 z@`WPqn|FA4x`OAqqX`rheZ5Da-XRfzY$i*_j$gAV2v@iF{JFNqSp$a$dpMo1V7a0} zVhr{ACEAZS_)Gox7PMYFXq}(L*2k9k4hRB*fFST40sg<9*1;suzaPznJ^<`Osq>c9 RpDh3Y002ovPDHLkV1l-*#X|r9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-advanced-surgery.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-advanced-surgery.png new file mode 100644 index 0000000000000000000000000000000000000000..291a889e4c196d0d2367f1828dd9b7bc28c5732f GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}J3L(+Ln2y} z6C_v{Cy4Yk1sZU%Nf=C8<>=}8(w>=_`S9@oTb`ZU=Sq8+^>>Ew8XVaFOK4|QAOpAM ztQnj64M2cnzV(?8VQHqWd7M>@|HL%MAD$YuvIl_R!@E$q!ykV(h7_`# zyH0xwbDkR`&{@n3v6EGA*53V_4)gmdKI;Vst0H|4Ah5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-surgery.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-surgery.png new file mode 100644 index 0000000000000000000000000000000000000000..8147a74b761d6cfc353859aab5531fd960172694 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dpunnLn2z= zURua?C_v=c$Nh^=rfuwSZ22uxeo*6D>+EZ59!anH#iq3>%am)A=-Sevo%)yzj}TBYUz8wS&uGd zbSRw3_Mm9zkw=e|PMtm-7#Nt?Jl*wQaB%R7_3OW%xG&PMcCD_UoLt|WIWji(_Q}P? z!B3t)ujXa?>FVN=P*O7Gujafxdu)RLU1CsES3mmkqv5%8=N>$M+*PetuzH-M{Pq|Nfo(I4dJ#!nf&61~xW2mo8ua_~S>%jvW?XzJE_HC=gh_ zeEEqJCm#HqH&5=gg2i0FiIXNBk}k85;o#$Y#`EIs+f<3on>QcI+wT3-oAJiYn~oV7 z8jl`7{%Jo``qu5+k1MseZrapz-fG%1h8G0ns?;Omo1w0FO3^~?zGS6 z;N)~nPgiGSV=E{xPyhLB|F7Npi+1mxZSGgt)7v}qoB3C<1tI6po_+f9@87*oSN_+Z zsK508)2B<_U(aAlNMY>VzJ2@NvhQGBTegUtK7Cs5=j?w1Mt;9rTUr0KWL$nX|M=?{ z{)rlTybN95%ngq&F)Y|&!hnlw#JXVFGPi)tI|8C^dt#-3tdm&6IAP=6yyr}sp{aIu zb^!qa4#9__1vJ{OT?@0Zu{m)4y7w4fTX*c}QP%$+AuG?GI`v74 zrK@qziRq_4IdRCy%6^nNswUkm((vX@&a$^9R{y`Tm6VhyXlQWEoH;WiFV8J8abZS& z{&tq8!w&^~eSIUMqm$1sS)%ez$S~>U>(`GZQnlPJ^)r|%m6Vo#+_7{itE#GMM0|Yv z{Q2_bT{~j*B2=SxuU*@_7Z@uye?NWN`dmY;%Qq~Dp{%@IP*jxlmC!)P;Ns%q zX?6TN_@kuvvaVXS>IbhwI%DeH{x9qk_N{jNKY8A-U?GM<@W#p literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_alt1.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_alt1.rsi/meta.json new file mode 100644 index 00000000000..9f87381cd87 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_alt1.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/head.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..a89de820f47b7fe179103b15e1ac71035fec8be0 GIT binary patch literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$} zr;B4q#hkaZ_Ioiq3LLXPsKu4Z${l}z-9uPcWYP5uxIdq4^6XE=oWo~Ne*U>&ySeE}OY;9Gp6}``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIZ00!$B+ufx3?7YS{($Aee?{D?mt$*z{CEK zCp4zbdP0>9=R5_E4NI7M8Q80CudJGOJST42zxuj;6B3z|>;-`)GKihpRPv~CeN6FX zlbwq+eB{GEn}j=E*tS->?O+b)ti_eHwB`16Z``#`wM%K^6_Z|_(@J)GI@x2dznndJ z^>T;jrtY7c7V)oJwQAQEhPmO_?oV-#^Emz~;g~2LoBA?5c8$zQxtcWD1c$Pjx=m z9awF1+k3}Z&Kb`mKiN#*oVU5bqEFRR=;Wq1SMKDBCEWDn==<&C+a2j>^immQ+z<0Q Y29E!;8{FnRx&z{Sy85}Sb4q9e0AszG+yDRo literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-primary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-primary.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6b133523baaee7428621568d8281fd76caa594 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_s6| zPZ!6KinzD8Hu|+V2ps#kv%7QZ->W8JYHE9$`WyNei0V5(GLG<8XkP`zVi+}@^;BHj$bnBjTUvgj3+3K~gt9l;a z5OMr$a(z#vd}HOj{?y1>iZ7m-`WM%JsZNxgwQS{^GV9AXbWShHjlO)w`NlQ(tUwW? zxpVCNmM{A{YjI`z)-4}r|K0MvU3~k#)qo%2hk1Hs5<-SQ&f$qyf+IJ-;5ye*W2TR8~UtPq|*AX}rT_6Cu}& zN$0LIusAAwzy12`<>z-7&3y2h&c7bNSOdGZB+D74ul|1cjbd>_d85Ak%Jzu- Tua+NyQN!Tr>gTe~DWM4fe1XGS literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-secondary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..de40773897f6704157d83b8086179c8cbe353e66 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_nkx zPZ!6KinzD44hl9Ih_Eh>b;!QrD0;=wScFNmz^#Z~{q+ff{ilCU{Ik9Oc=wVg%8Z;I z4opH58dy{mpv(jN1uJ4gD{jv(lnK87UH-ly&*5vOv01mp=5EySE?k>lD8zQXv^8Jm z`2Ny!Hw`*;GOw8McJ4oW?(-a74ZHPR%%3h?HWB5o6*=?%@~1C{<{LCjTXl%R>Pzg; z({(KGwOrndGN_8_u4lYx=Jh*+Y-U(--GAlM)AvOtNIFXveBI8%vL+JUCo5(i;AUet Vn8)VO1`I6*22WQ%mvv4FO#qHZe9r&? literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-tertiary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_arm-tertiary.png new file mode 100644 index 0000000000000000000000000000000000000000..7b83ecf161b3b2c235fb638276713a2982e673c1 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anMpkTMB zi(^Pd+}m3lc@HS?xH^_4E%%u{m&a?W+SGc-CB^3_mu`_eETG`fz`)4F!hv99a9=T9 zEnCTYY44M~`D=HXA6g@Kr0#zS52`9meF`5=|8D%U-SwT|CGVGl2>F6F2bfL@i3hAZ SbF>HOECx?kKbLh*2~7Y(8$VV6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..534085a97c31ddaa896b6e69d1efdcdeac7bfa07 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1H8_ zi(^Q|oVT|&@-{mNuwLAl63DSu;37Ath?5JWiIaASgNIAf;nrz$e|+=!S1%-_vPNQV z$G1)kc85943g;LFo-=e5GaRvGcqGG6$k%`=yotFa_PdpSTcXGL(pY2P%gqVb=aj}? z{%g^9y=Q`@qI$yp@?ZO&TlAI8jhiUAu0MZP+qT@5tF+E`3kfC6OZSSNw)8~xX67jt z@5;}8@E5>p1%}PPtq;UjGwx4wf6J9Jx8YJX<9(O+Tq&$S?r`7O)_ZB4?V9cuxQT literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_hand.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..771cd025a865b938f010cfe3539816c6bbad58e4 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TS6 zr;B4q#hkad6xTI7h_pVu9N=%Trjd04$LRwbxUL;y+aMvNqwTPffrXRX;ep|v51*ng zZdr8ZjPRV#KkrSm-|l$kj-wx=0}hnKf97+I|0I?`5k(HBBZW2A*4YwmwXxwnk306g z54`^MW#oK|n+>_Q=h@$KxnBCA_J8?2Z9k?npL=vp8~9GXI43o7!ZOWS%Nn(>G0S8} zi5$JRP50C$lc<~f&%dAd+%oci^JHFw+Jf-S_bx^=JP{!V9r$+Oab3ge<}?2HzwhV| z2)%l}eZ}+}4aaL+jMuPp92WS0_K987SB7={o8xERbKh|!{(#CaRi+sM3=@K3=r^O~ XwOIMn{ZWO$FlF#`^>bP0l+XkKAAy`p literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-combined.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-combined.png new file mode 100644 index 0000000000000000000000000000000000000000..915b2af4d37aa4cd5b55f573c7c67326925572d6 GIT binary patch literal 523 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxdomsjv*C{Z*OhvV+@pFeXx0UZ&*oIzT;w1 z{sjRqUv60>(C@JRl6Hs7(uE%xw4!8LSzC8onqTxWn|-(b-JQFSYC3(M|1o}-agM(O z4o%EV z?KDC7K>X9P-HL3_Y~=V`CjGK+*mYM=s+TS4#@n(LVXH0V`Z*L&a6ZsBkl<;OJ^lW} zv+J)-U66p$@i4LfQ&P=>O^+=o+ua+Z*Y32i;bh9A*B|57Pv5ofU+2Su7ZDRTtJ=*! zzfW7H|M&(2-ZSh0D?@7h&r3fqHIZ`N`BOZvd(WoIRNMTU;s(pP_n zhy5n~V9@b-s^NX%`De*eeTB}MXP)uQIU03l*6oMC|H_r>KhOpXochCMVDc=^;Zlj! zSNVNR(@(R8JrjN~r+b(9gd;v_#cb!4l+@;*jNIkA&+6A6VB9fyy85}Sb4q9e07Eb1 A^Z)<= literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-primary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-primary.png new file mode 100644 index 0000000000000000000000000000000000000000..05f568654e6829574e3315245bdc121ee767f18c GIT binary patch literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_mZM zPZ!6KinzD4Y`d5o1zJz18j2bx=P&GB`9k%~)e|8+N0c+(iSmdXJmKPKbHGK|->j2u z)|YqE+YU~>`tn_7`t+xwCQ4V%zh0lcNJ~(Pa{>cy)L`4Fz!9?kdhoZ2&je5OTRjte zIWPaE-b=aJXWi!dEiZBBms`TVj~)%8yHfJOj>8k1THpy1#q<{r9IcOeQ@onz_eq;e?-o z^X{z;TYa)_|MaY_uUZ?Y^Bq|IB=z~{$aU9OZ!fyW@Zr#Qb}zQ(#x1vVTOa%0Y<4;R zI8ds$ZM)GmhPqWf{s}g6)!C=hw;z7G{q|aO1|JtD6$b){pEE)0clgI08Jp$$9(~fd z^0sVggpSwFm}x(2=JgzJKm0ITeR2E~^~s%wI%I+$S@cbge3)ZaTqUl4kRf3G^~sjD zdVTj_mb{vB+Vg9=z&6*C+&@V+?>Ff`xWXuKH^)r)?F{aJZHeNH?8crF3{R47@H6~9 z{BXeq&L8#Fak`K8$(cBCo7{b`HzT8P9$&nk_{n1Z2NzQpFh<3km1?-h;CS)&UWUEK z544V$_+7vFo8!U)#vM7!BbYBZUCgU|$9jkPP#4d>`iz3i+TaIYlpE{)9x%7Rxx!n> SU|9xCJ`A3&elF{r5}E)b{|Q|H literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-secondary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/l_leg-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..a96f9eb3854571d6e9017bc38ff670b71213b2b3 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_s6n zo-U3d6>)E88RoSZ2)MRu#4sM@&B(~KU}rtP;DO8?#?G#623B2O^975RFrDlS@7xll z8TFn=@x)J$kk{{L{(n|2?cBo7;=n)v{o`bGf3-O`TB@z_lTCPOY;d5+Bis5{D>J3M zCbdiny7Jw2X{Og_n{J&womb+M?tjmWy{^2?=vMOm^2McU-S>ROY@;WqN={AvnLT;` z`u(}mJJ)?M^1LVk7Wc1*Zao+J&$#BCzLM1w zj+i6dt9cm`5;uFautb>nOcPaUXg#YWD3ox~ATn$MgP2*ji${a&;gm>6ridFlLW+!H zypvN|Ingyt{E_4mA5s?Uo+uF{;<|i+``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIW+1k!xm2i?Yhd;vd#PNc@vppO@QyWwhCHj&M z?0>@3l(1&iDHmpw<@O;qNr}16=_I4fdCR?w%Ukc=>EKQ)=X_+2a4w zE?4~7z3=_f*H$~b?(%NfqP^khtCAn;_rEV)m%XzqmiL2=f6R5!zopr0FLCVg8%>k literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-primary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-primary.png new file mode 100644 index 0000000000000000000000000000000000000000..c8087d3fc19c55b867a9f3b6c28020a6279977f5 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_s7% zPZ!6KinzD8HhLWn5IOeovXaHl^mmU`IBHqt7uq?^{ba;C|KLp@wntAUXihRMc`-*d z<>jN2vw~cUX3SfbIZOLL_uQ&?C(G-7mlwN6a40k|FhPk6Y8#@~&f#}bKPlO^P`m38 zH^bSLmDRsDZi$?hs^>ZB->h%b-jyo@#ny6&Ptz%s@s6A}?b7D!E`chJ0yBzzZfk{Z z{OK`k*|WA}jVpU*-To!^XKv+B9rNt#&WjTxzdV=~J?qc!u-DQHW}h~nxN6n6uaZ~4 z&k8S&4*MPd;M3K;clPaGzWVEtOF25GK+$&Je~*pM&fSqy7t?S2_TQ+utErRc?Bn~X!%_R1I z@8yT{eZ{(4bIhc@^Yyd%m@5A4n0?28z53>xXSxqZI?1st;H}-GpU`M<{f(aQPImj_ m&z?00b-;rP&t;ucLK6UM!Ovp= literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-secondary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_arm-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf2346bd8402df7b3ab688de95085780abd5250 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_nl9 zPZ!6KinzBoH}W<+2)JC_yqm!>^@3ooL#o1x28rJ~ik1%L&B_w>L1s59t(6p6ALfnjS_SvNM_)EssB`+s9np)=D(|%=a^&7tE3bbxE&jTxdC|%5ukLxyU8G_6 z@ZPMAtkZd_wp{tX@AM{>?|w`@k0n;E+7C_w( z+=^!g^S;=X*Zu$QTn9hKBM)BHm#eF6QfOdc;y@5PIQKB@Hq+NHzT0XJ3^N8#S3j3^ HP6anMpkS}3 zi(^Pd+}m3lc@HS?xH^_4E%%u{cMgZ9C@b&8AD0Xde%@)awvvTIK*6DbfsqNpP;1;( zrMmIW>$jn$>Ae4Svr6{=_3Xavg{lZc+i}h}yAR5n-%`@}ao#~{YaEh+|AZ?TTm;1f UB*It>fevHvboFyt=akR{0JRA`w*UYD literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fbe8635ea509fb178f489345fd83302fa00872 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1F+h zi(^Q|oVT|Oxta|a+#ZH&$Q@a2Q7JBN+cBB_gHqg4VGFCB5sxD@mUM18^uJ!wxUGU+O!vKl=;dwhGw=-dq!^)#_VUztdKE-!RAcXH59La1Xu@b!z){xc3V^+x2SS aA#M|$=*+@9%C^8zVDNPHb6Mw<&;$VKczSFA literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_hand.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..db11be34056caa261ef3119fdf034b840280accd GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR; zr;B4q#hkad7VE z{r7)!G|OxDHa&Q!u$%!GTE~C9@XqwqgC@QbZH&3M?|pdQwdlrX9cP*29ESxmXIVXe z!xM1b^i9g`Z3orO;(uSfR%&Z=O;VvtNyW2i-RlRFE9XsoZux7UJy38#rc|_DwE#<; zPJQy{HLJ3=ch{f0|MG*{k8_^?&d#)at;tZtMGPwV#{KQzUY*n4-*|4^xG(p9v1o$$ z``hyx!~NKI6rFGA{hPa-Ic8`21M&5*?0<3p*pdD~)Rxu3j}eOc><%z*F$miebYuTK QU~n>cy85}Sb4q9e0O5I)y8r+H literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-combined.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-combined.png new file mode 100644 index 0000000000000000000000000000000000000000..a035dd862652e2af236f707e6e8aad17567c2b84 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxka8Xjv*C{Z*MK^JLDk2@?hs_R_}t0drUmj zJ}_{I$jMAo;OJ+NYjt<<2#_$aVc_azW^C$umui;TWU;w^N7>OD&)}Oc=jWcaZ|H!7 zKe+}HJ3jw>BcS*!$&Tfh+k)ed8}H_cUlo|qzEh`8AY=F4M^$?l-Oby5Htln3li~5K ztxj8`T3s)2?ugN|kl}mrwW@>j^OV!65iGn5Zof_18<%V&w>WIIBHNil8@a&s*AoT* z@K@N)f0p@wx{7CwUiShPv$@&T-th-Zm{wfP`dJ-V?NlaOQ5fzi)8P7{ zYR(Q7-^*9_+x%vF!~5jz-qianM1_mZk zPZ!6KinzD4_GU2!3bY;<$T{lg@!WdJg=1mYrf=|Ce0STX)*lR-TQ+{;Wa-vvnyR_w zBjcJJrvz)>jD@Y{^H?1_T8$&?yNnfX-bT&*Z@Y8nA`hGM#fcKjw*2&*-`;mHL1Aai zxsWJR#_pp|YLh!dR)+>}&Q^8wSDS1&HJp(n{$5c0d-;_L94hnA&z4e~%OZREWe8Vm z)5Va&s233hSg@To%{wtS@yn%hYrE_$M8Jn56cI(wU5)oYCUYeYB_KNeS5&=f%t;9-HJ*tx3dCM4TGnvpUXO@ GgeCyqUi{|( literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-secondary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/r_leg-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..7a406c931877e43e809f8b57ded0ca46a6918e63 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anMpx{SO z7srr_xVN`9@*XzeaS2q7_E?>%vVP&sC7dDJ1v5)n8b34sTzOXJZ^g?XE_oIK2L?tQ z!~=hpxQX9olIPs3&RpC2OiA)$`t_)b6W2e#fAQts@{%LJeqK<`UR$QGoZm3lp=jX; ze}$Rp=6nrzJ&$l-WH8(jE5p0Ny0b!2N`Y;A_hQB}bwPa><|7Zv3QZ2YQ+d>y(I9b0 zuaE7pJvq?ljRCr$PnoVe&MHt7QH?b*1F^A9)Fev21Ui4VZCH0^XOu-bP zXdp)wmjnZW-U=a*TOgPch#z;?B1j@6OQ0v?A<|<#1UCuPMpzPZh-jc_eBIyBXFFK} z`#!VX6?F!dcjuj%=l_5H^ZCw4zO};LRu(7dG!2$F}%jM+ohgB(FEL!k0=LH|UGV-|rMB&U@0yXCaU^FLvA7+MJW;1>Tcx#W$0k zoSaOT9=(|?zVg5gMzn;fA766fSi!S8@8<)*wYAlC!TfXYCS$+dN$G;8r>AD;v75OC z_#|+i+TY#Xb*+GSh%@z+!D)5A9y_KMfcgUi1J3DdD}N-HUKCVoM>wk@G z1>l!TrHa2pLqoE;xmk&KcXyldgIa(hG7bF`0mtX&=G=75lXz$_3qYUm>+5rPItml_ zXN6EQS<0Q9oVZ$7Jf6gP9}>(0=oCc1zxDg=RQrGR+#EtCOBryebplIZ0`X9MvjBk3 z&dydA9Lxm7l}r{V>dEu8@iQ-klr#g~`1rV6juL2s6B83sC=}}P%T#t|X66h&tH5S; z!3xolkr6lb>C@yvotgRY(vLF#f1PGy@u)ylASw_Qhzdjnq5@HYs6bR8Di9Tj3Pc5> z0{;&MOy>ef^6RHpTHgEi(y1@c`ue)r&eM>$dN=B;w+~yN|LERd7TaOOKUk5GUp{w7 zW9-dyM$fKnKA#V>XJK5<%Ql!|vPsH*AjjnL#dV`45%Z>~l%0R|=BNx89ynkrzD`FMFwk`hH`S%OAQ@x_Xlf%)6pR6U#*dPT1EHHfzaH3+UAWJZ} z08WFn*;g(jY~4xo^OBU_SxcnB!@<2W#$ov=o`X?6i=Y+2sr2l}7T;Z7TMKw>o+hZx z&quuS&9#P~5?5nr*Hcbb1xx}k@NpWfHLv#r0Bz;h5nhO&#jgnO*aWJ z|MJgg22CH3Gy2dI+N@;B2ZnzipxWtbjT>>cJ(b17`XQ+I4$F+*jUf*f>AP5FnV1f+? zLZ}F)E>IqUF8~gx0#h407h69>thGgc#n8nM@01VR;ApXH{&+d>YY@O@e-WOy><;-F rw1^e+Mg^h*QGuvHR3Iww-%{XjDa=i7S5~3G00000NkvXXu0mjfnxA9f literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/torso-secondary.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_main.rsi/torso-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..4e61c144a95ad7eedfc9f805a421bce36392ee5e GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_s8- zo-U3d6>)E8IrcRh@VH*S_{M_qjiu=G2O@KtZNDe-t0$a&;q96wsbNv*aktJav~%PB z`ExfIocpN6D5L;GKm3@?J#SUc^FFiq_P1L5>8U^U+Y4pmG{h8M0d-+V{G|NA2 z9>R8-r@L`>*+^b#3>SkZB=Kp_tTj}@G z&eKn}DKP}>cBlyHI~70o&mv`$buYIci2EJ$N$kMO?rZ$Et-%KnWt2Rf& zG0izr3g;WHh-yRabRCcE{4qOT@fHZw!Cd{}wUn$Nk$w9}fQan-6%55>MpW_)T?VA`M( zFLLy<4deIk$DSE(a$8fn>B19cM;qCDv)JDDo=sNypC$6%c%@M3fk3C|`>$nem1D2> zDa!RO{OXkc>C%$(xAbqRJpQn+l&9JB!F?o;OXk;vd$@? F2>{%v%)9^q literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/head-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3cb6e9e36d48f65477bec2129e69b4c19b861b GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_nk| zPZ!6KinzD84)Qe_@H9M3+9NQp;d}e>2gi07JYl--yZT_yQSZot!+*Se=Db|+`eskE@XZFv)`#T0TmH>U zUh;+g&RS0X!wRLb-j_|HCSElvy>@ENJSVTx8+Q~8eSWbkzLb6Mw<&;$UMYm{LC literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/head.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..a175f4dfcec5179babaf11fdfc901aa32596ec42 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_mY# zPZ!6KinzD4^j9-EiX1(De6`!`t4lm*U-eJeberYic_j|B-6#DMt|;ALIjCkfS>no; z{PTxmul=7l(e>fn#?=_{0wtdkLN<@7-yeUq0==+HSUG zl3|4XR|$n(F?!86bHtu}{`td6{_*w$8#wJ|@&E5Ws?=mZ*Kcw9or}je_y5xueo(i+ ze8;P=yKd*0ZPfg=_@YMD^t9&xck{$OW%$}RTOX_aQh%etfB9wK$<>e7{7?U^`%$Ik z^z(GPN$*$cCv1({8MLxQoZ;T`yVqWCmF_?8xHhc&yUZ8Ecb7F7)C^?!Vi#ZR_LFLzgxDuG;!^O zPrqM17r3U}9HaLHK5Ws^5b7}d{By^hF@52`10PO0_pQ+}NZ9a3h_%hZjKFw? zy5y@_Ur*V;`n*HpVfnLrmz{Io*f}sdTv&6!x^vSuyN#9kVc+e(Z#mCV<25~&=d3s$ fZ#J%1`M{p*A$^ClQ8f~nkQh8&{an^LB{Ts5mMjqA literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/meta.json new file mode 100644 index 00000000000..ea5456fea10 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/bishop/bishop_monitor.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..51a3c40058f8894b6c959dbecc8626d926e679a1 GIT binary patch literal 6948 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-3.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/head-3.png new file mode 100644 index 0000000000000000000000000000000000000000..e59e1c1d38299df73afea368dde37d6c84aaf76e GIT binary patch literal 6916 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/meta.json new file mode 100644 index 00000000000..5e35e7226fd --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_alt1.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + }, + { + "name": "head-3", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..54ecbe2832103864ec199ae58cdd5506734c9210 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op+}xBjv*QM-rm^Qd&ohc_2K;vzM4=A zrz0UuCo^5&bQr}jF>>ZQu&+DvB&B~s#@k4h=<-LkFZ|n!U&l-EUUm#1baTRx|Cqt^stPXSExJffXpmup$N{sG|9=rQ> z?z5gRclA-voG%+G?y=zcxruh0qYRGM&2!+7F)sef#Cc#^c3JL3=0Bezl4i?PW|$jq z-v5?$VWIom4_6IqfWB2Nag8WRNi0dVN-jzTQVd20MkcxjX1a#PA%><_CPr4qCfWuD zRt5&T&cRhE8glbfGSez?YlxA1eGI5U18ze}W^QV6Nn&mRLXSy^p{13vk(D9T685l} QnLs@Zp00i_>zopr0DEVu6aWAK literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_arm-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_arm-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a529d9ebb60d80e91cb18c0ed73aaa3086c603 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;iT< zi(^Pd+}oRuTrCDXtQQ_l-E;ZQ7VG>guE)5VcC7Z3)YezH;p+UU?&-G-^;;peROa89>-v9iUUC7j+S?YFrG4H>#&8X@)mYx^4=eSJ$TglU12KWD` zZ@240=!F}C#87Y4p7>|AK(z8ty^lXuySPWB^MBZ*OcAY&H;Zx%mE!?gb{l zkQH6Z2SZo17e7i=Xf!r*{uIAv@6Nz7?nx@1lT_}$Dg2^P!PweaUiHEwk?Gmvk24c{ z7YG?H6BeAhV50Av{|CYss|iotw&dT&Mv!_>@!OUU&YLht&$T_cOS0l$O$PtPyTWT` zHyU$4scPcic+*`qMQrw0pkq`^Tq8nXaL6h@q*KiIJ7D ziMD}(m4Sh-b8r=khTQy=%(P0}8e-&L9|LO8fZI@#nVVW%l9*e7&|?x}XlZ3^WMv4o UggtC#CQuK9r>mdKI;Vst07Qy^6951J literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_foot-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6be2024018bd9bac40ed11789decda14a2c67b6f GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op=M7P$B>MBZ*OemZ8i{bz34t&bQ4pi z#FfJrTQv6^_7zsi=xJ2yD(R2juYdY(eW!}&Bo$A4Gnv?i@JX7*(+=-mJyElGQhD1u zpX3Nuu9PL_j$8pReYeyiPajJf~v>~E8A+aBB| zx#LsAzIhLrqt^z@2LGG%0_Yso64!{5l*E!$tK_0oAjM#0U}U0eV5Vzm9Aao{WnyGy zY@%&oU}a#S>l|E#q9HdwB{QuOw}u$G*T;YwG~hOrWag$8mn7yEAoQ4o7+P8x8(A4b VEnyFvnF-Xx;OXk;vd$@?2>|UKe>4C9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_hand-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..87466284b3b0e5d79be803608eff7b55ea7f64bd GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op)yYw$B>MBZ*LsrZBP(!xp=W?1FN%T z&}7?7ha(y}SbTc^&sE>eJtu;bf#HGmp$9R=zjaRQEzi+5@7-|CeQ}Vhmgc!#jn3aL z-)wr5d{6m`$U1LEps5W1QZK}B+fr3#<2pS0pyXF5jM7H$OUuhhf1RriHxX z&L2LqfE=Y-;u=wsl30>zm0Xkxq!^40j7)S5%ybQnLkvx=OpL6IO|%URtPBivor9}T zH00)|WTsW()(|82`WR4y2Hb{{%-q!ClEmBsgdUR+LrW`TBP&CwCG24{Gl6;-JYD@< J);T3K0RTI?cYFW< literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b871a17933379e4aa2af10587051df8f69f64522 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op>j_b$B>MBZ*N@WZBXE8dHBj=M^mB9 zjFYlAAKqbzYLa^V-!|UsviUh428IXLlb$_0bUxg3?@gnXTAL2N>X!?XS($WPmwm$$ zoznBORZcJDZVCIq^KB{6Tn2{!MlaV}SS`D*&GM@;@NL|~M%FUx>2J^KTlX?DY>EAK zL0jL0+2j~dp=yb1L`h0wNvc(HQ7VvPFfuSQ(KRsBH8c(}G_^7@vNAT&HZZUk0qV`&?3Gy&$!I?Y*q|QWwcv8k3Xw#^VH4t2dB;Qi2ha^rDS^hP_Pmh)R%lu zKVUff{>}3>cWl?3^l@usRK9ss^5BjMXC(F{S3SSO`)A*wT<;61S(`Q|J~#&hEO|a*?TL5nHM<*6exG*WF5~^Yghjds zy?-!esQVpFUF%l?3^3Ia*NBpo#FA92AvZrIGp!Q0h8Vfm$AB6%;5L+G=B5^xB<2<%^q7PgT3Q(!Ss6ktVGo;` Q3Dm>j>FVdQ&MBb@00)}KG5`Po literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_leg-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/l_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..90b10eb4be5ca5fe2ca3551817781542555569e8 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS@v42+_lE{-7?_uk$xEIQ=C!+K%AWLicM zpLq1!fafZH&JPzpQL$q(J-*-pOWrrJWyi1jJ2p*bstjM4_-ucaP*ks`ih~OfJP~zy z7cqTfvd)SsDiV*UrO6g`=`b!vyU`?m8L4~|SLF>%;t zW1G%&(XuhZr15Id0k-!y6a+)%AE~p~EI3$bSoAS|gKKlkx*{f7A*meg%^*8mT>ib- ze|=TNeu;Y@_sM_f&z6`S_{77gox4VNg7_1MzIm%lgr@SAhHwqt&XLHXepW3}tG zPt@8w(^ZU*sFDdCZ&VYd2Oi?Yn)z zC%kF;2Ub1*in&iuSkDKBnQDn^L`h0wNvc(HQ7VvPFfuSQ(KRsBH8c(}G_^7@vNAT& zHZZUBQ;SOya|;l9OhODTt&EMV455~= Tht13c>S6G7^>bP0l+XkKhFZZt literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/meta.json new file mode 100644 index 00000000000..9f4ca1ee51f --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/meta.json @@ -0,0 +1,83 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + }, + { + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5e770056ed95b2be02fcbb0d7613006849cc9abc GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op=X{hjv*QM-d^9hu_-{H^`ZPRz71ST z$BRq~-$_VEvZ+eUxY4$r`LK8d^Ru+$A*?kv?XJzAQ+3Lx-QBCgotE~k*Q?efePy-- zWBAtT6YSZw&fehpUu$+|#V?bv*DGddTdc}EXOmtU~I|)5%V+OjnqP zOq#WF{wqQ8gC?(MevZ#_yeQ%DSp81$5uS#ozxUfGH9g~R@R<1W>=_`)Nk~1>b;~4^ zf4bKk$Nh@lQT$WIx}t;MKYja9IJ?fG_d?e3j-x>a>C$zqmDjtOKMVe<4?NI%RfDx8 z=)wMplMU VOW4C^W&-svc)I$ztaD0e0syVctYug4O8oM+kA+`2PDW_93>(~krd92yuHnOHak zpo}_}V-iz&imd<7F_u~|x&Cd;4!dZPBgK{5SKZn?Z9iYtGrLdad^v3>df=KNjK=!L z+oi=;8O!thZf^|jU#|N#>)z@zzqM!MkAAd7wkwEb->pM>-Q`-hB7v@E@O1TaS?83{ F1OQqJQR4sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8994994011cfefe211374497fa902ea729f1135b GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op+-*^$B>MBZ*OemJ!Bx_dhxVGB$jClkZcu{rMWZkA0Gg=OmTCH*?=_Fxbq{|M#`?A=w#`72oVM zRi<9h5dX8`0>{)P)lo|)ZvV(?H(Bay(|Zq)jxWsdTn)k}>ykI5N2vdPSr9Pa=#KH4 z$$w|E{;FydZ;NwxH$Kk#8R!_*64!{5l*E!$tK_0oAjM#0U}U0eV5Vzm9Aao{WnyGy zY@%&oU}a#S>l|E#q9HdwB{QuOw}u$G*T;YwG~hOrWag$8mn7yEAoQ4o7+P8x8(A4b VEnyFvnF-Xx;OXk;vd$@?2>`20frkJ9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_foot-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca884025fd3c36feb1979700a5936c746cf279f GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op(alk$B>MBZ*OemJ!HV(a`Cf7f?}09~V6;u=wsl30>zm0Xkxq!^40j7)S5%ybQnLkvx=OpL6I zO|%URtPBivor9}TH00)|WTsW()(|82`WR4y2Hb{{%-q!ClEmBsgdUR+LrW`TBP&Cw VCG24{Gl6;-JYD@<);T3K0RWh)f^Pr- literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_hand-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..13a46c2e09224bbaf474425dc80ec05ae3bd87a6 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op-N8|$B>MBZ*LsrZBXE8eYm_(D(0X; z-$&yv*fY=NQH3Mt7E4?cvRM!1&vSp{I~p zdZGB~ZH29lK&7fBt`Q|Ei6yC4$wjF^iowXh$VAt`OxMsj#L(2r#K_9nMBBi?%D_O^ zIk*Z%LvDUbW?Cg~4KZ@Bj{!Akz-=hW%uOvWNz5%k=rIW~w6rodvND8P!X7p=6R3y5 M)78&qol`;+0O1UHCjbBd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d203e571fca443a39a9168e1ff8fdccc6294f559 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op$bnI$B>MBZ*LsrZBXE8edslZE!?1o z*?4FF;|+&DuRAzlMpOHL>q`M%mZHWC3=RJ~XUzy#3$2_Y5UOe`-2U5Xo>zOmq#*bPbI|3{9;}jI4}Jv<(cb3=DLg zgR4+9|rxAfqED` MUHx3vIVCg!0F;z@p8x;= literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_leg-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb762db0c49173c4d6e14939e3a4a896dde6ceec GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS@v42;5_E{-7?_uk$x%xg9fIrh^*Nle8*WvS``a4U;=S;E(m) zKP7ACua$q3zVBUA_Nfog`xp=3wl!=jJU-iSN#D=dS2_P*bKKv~6Pw~Id3(XLV<9Sc z^3Uw?J=$xvOHFFQ(=&EI|1eaa<8ID0InX*UGq|C1o_EPny|9>BZ>QVjNlvofP`d4W z`Dq3JFRW*t`yI`WxRVYHG1U^+h?11Vl2ohYqEsNoU}RuqqHAELYiJx|Xli9*WMyok zZD3$!V4&+9T!o?`H$NpatrE9}7`fNSfEqO5Hk4%MrWThZ<`y9In1mQwS{WNz8A2^# T51W|@)WhKE>gTe~DWM4fT3*sB literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_leg-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/r_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..16f0ee16471f110c804c23e9fd2a66de7521f018 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS@v42+_lE{-7?_uk&HUDxCw!ur7Y*pXwU z0Y0W1>$D%5inUytx`8Eodg4Q_j5P5Z&ZRnkI$L=j8mZ}5KG*)aQzmc04siiNAow{u ztLoY6XOaD3(Y5 z!t&y!ap?hd>ka>EeoWV`3wW@_;s9Ut8-b3A{Dn{SR|o_o?BBz9W3hw7)P<8eK;Vz{ z+2mQD+77o>|%>D8VHrA6a#wK<<#0kpYj6D9Q?bywKZ$;llx2XjtPSp}9IGAuV z-^RuKL(_ykYLW{MF-pI_%*Y@uqsDeQr9nB0r<;i!C8<`)MX5lF!N|bKMAyJf*U&h`(A3Jr$jaD6 z+rYrez(ChIxC%u>ZhlH;S|x4`F>9ZF$poWv@$lbGK5;f T9yT)*sE5JR)z4*}Q$iB}rB=o3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/torso-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/hesphiastos/hesphiastos_main.rsi/torso-1.png new file mode 100644 index 0000000000000000000000000000000000000000..45fb93052e45ded9eb7fd6f376db6c0cd0306672 GIT binary patch literal 813 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 F1OPHk_Sygd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..468d4f38989f23dee11211ac4e86d1baf6529a0d GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR> zr;B4q#hkaZ4sx~_2)ORw#O^KNy@5x1Lzwgi9&dqzN@>EL4&S!THmv^fzwyPL57pTQi!2Qh2e<@1BOH#la39qmf`u$x~CsaI`7=j`?w?b zc9!Rcb+6ZLcek4^df|JmNJHkVoY?EfRhIm)IDc7pS$o4X3qJ0nielfVwAlQZq5fp| zr>Y~Rk&KDok`1qic^us-{P@`q&H3DU%Nx=IO&`COV8LxYs=HYKNBxs%WBk1@JbS{4 zC(@6lXm#Pz41hx~;DcCpSf_@Q$!Yi&#QdWVw_l=FCna&OyRlm2jW fZ#YA1uTVb2zJdsb`BuQdV_@)f^>bP0l+XkKvgVHW literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_hand.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..05df57f392f65c0bc4a3ee49cfc12139662f24dc GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R58 zr;B4q#hkaZ47*w#c-sEA>aJn6&OUfaxPIow$~jyoH;7u;R+*q(>^-7}rq|8v=bmN&#Y2(Wlu7RkN6NknH- zz_g{ycL;6Zw&>HWUixg(PhtNZY_5ikcwC1p6~^cq_+#DcBfBhwHgGLC8f+Y#G~pp{ z`sXjNY?!LKjuh&co%tXg8mh>1*!wfb8>U4XhvJ>P_gnRU=y>&eSN})ScsLr@q_c8T+9?Mu9%AhJp}=mc>j8GNKF*S1@q6vpQI4F(9OZ zWj05x-4M4v+N0-ea*o`tl#@pl59mzy7MbkD_jF;+?YGw&9GTi1#C(^nU|6zj%JXck z1Amo{KNgIfHuLq@Sw+$_f><}OqzF1pKKWVZ_g}e{kvd{8O004|-nhqf{<*Mk!T$Rf z-$tc0EuTEoM@>(E-xI}-y8ZmthFbocZ@-=7sqyIX$BGR{ zQ!2S{Y%{a~<;T%rxm#>MmThnN`!&-jPg`Via{HrSKV0p^ZpbywnVe;`@1HmU zFSZD49|(CjS-wBKI6d-Np3`}iWR@8>bK0)IZaw|f>ASDqz30Y@FP@k$$|ifpEwmy2 zPl3f3A*rMDg)U2YO=q(_I-czx0-p+ z)t2ciMjS{ma9DpmdyW1BdyW4kR;7zYgMR-$$dtEz_HTi(wvE?&!x`sFh}Uu+bO~kP z{P0-)!||t2H|iZ^dNE^{(m|2rPhJ||xk9SgvV?UW{H@!4tfOrA+eyDSa-Q1Dw9%G% Z|F00XiyyiDIDyHA!PC{xWt~$(69BkT1;zjX literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/meta.json new file mode 100644 index 00000000000..118c3f613c0 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_arm.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..27ba8e0d26357c9cd54b49afee0af39e0b6bd72d GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VoI zPZ!6KiaBp*ZOl7lAkbF7c*`R}iG-C}Y}@uQCcQay;@ZUJFK#SPcynyVQfWc|g8~az z1zqRrYJ%^9LI|G&QcQsi!)c+d8p z-P^dbSf_N0D%-qUYvwU&$qja`kJlarF{Yoq{NwINV-7+8xi8G8)%5*-EWTW=|9WIo zFzcD;#cQr-|K3pRsBv<#O=9re;1iGE^6p5~7vo-T8e`@-SwHQw`oWv5&PzJdTDH$K{0O}|=HYUj4; z4Z-sd)a^gMU}^ItwaM!DL=QaSZ)d)>=;V{m?F?%3RXCSB&KKVGNVUON$mibkKei=% zST?Y>uGM(6hhwFGLyS~E&;WVAt%iysdcDWDGj(-OnJe+1saCKF(>ae=YnTh=_FPHv ST=p3l{|uh4elF{r5}E*Bx9Y|K literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b3dd55b59026035583a8bfd48f79ac1ea367ef GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR} zr;B4q#hkaZF0O1b5OHy@l%J+BEkV*OVXaw$L57pTQi!2Qg#le+P7tG5AKO%e^P6=~2TfV-($M?3 zBlmXJ#Dv)EM+I3c^EhWLJ9(|t_5OD~hOGtj(q)48MGNV1pE%ksc)ajO2=D6mCW`%) z>!!S))^eI@PsaUUc5PSJFa6e3O5SdG87$0w+qn0){Gsr>mdKI;Vst0C~`p2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_hand.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..716f604b4f387a9b358ce1ac595529e3a544b54f GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R58 zr;B4q#hkaZ4A;3jh_wBmzQ;-T;!07jPT3A#jkjm{RHURg@U*(FD19fhb5eNh;n~L@ z+s7*{o*{Gm`3%ixHO(@j3`HRfCjuE2+*uotIS*!@dG>45%pVqvfg)!kr!8EirOheN z>R}++o;aaea_yS9&L^{$y_~c@@!qM*%}hs@u}pof=W}_B$BNfg#qX9i6v|BBsN=o5 zA$;>Q$>STZ{^@7B_teWH|?R?qKPlpzAO_!%62~}Zf3pnzWm6s#~%-TtxBCM zt+GI)>&U({DMpUdQZL?NS;>@RQ}X9-JY#fP+o?78-~Z-Z{Ge?2&W%0qt-mwOx2e5; zs;E2hYv++;$$xAWLJr+#(#X`Rm3sT?_@q6HdyfD3;ZzarkmGs%;j!iaS#fv_?&l4x z0rMvuTcq*FeSb|xR@VEQ#hY0IK4s3@H7!K*!FB(hyU8CuR=oMubo}weyGxV88C3mc zA8oTbI;Cdb^Sm6U=m!6PHFk@6b3S$Y-kZ>(wt;oa%st1$9fUb^7^l?i3}3Ld?_!SG z;ky0#CA`xb9u{=Ot-t;&j&WAK)!bbli*{~UcTgzcZs);F&-$i=2?>77gCD=%z!DO5 zaZRq~{D!bQUKNs-8(0Fkcc~rx{(OHN=ax@jpX|Jy%rUK@%6{JE>Cc@$msri6{_$tc crlbFv%PuooIrTjj1g07WPgg&ebxsLQ0P@TVYXATM literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/torso.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/morpheus/morpheus_main.rsi/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..49afe13d65a365fe22ea3cf4c557e16fb93ced6f GIT binary patch literal 758 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V0v zPZ!6KinzD4e6x%k1=>zOI5bybN3re;rw?q8SnqJ$JK$W&e6Uyi1J^r|lGlC$M|yYv ze6}{f>V=PxN4UBzXQi~$ZKJQ>LrVLXM71=tcr?J!gM6WkKi4+={#*B~#(u8fGmBY* z3|{O-vT5u+-!@;&2P$ zqj~93v(7H_SsrXT|NJgD*CkSVAJ%UW=UT8aZvEz?Ns2$$eB*C#u6X@GXbTG?!&Tjc zi^9sx92(z?`U2A?oSk-h>8^wOiC>v?cUA)l`R*pFWA+!MwwZm zU-I=7=9%(*?OF21*G{@k%&dR^^7#}|gV|@}ZmwT5dE<)90bd_|_6A=0F6Rp=_e(gM>eeJq-u|9r zr%S}`&&wuXj-7Z=o8xe`@{BK%2`}FBPOpr)?pf!{F0kebFJryNr{F(7PR&@+4NFQ5 eERzI&uwOXuwqf-uCP!dGX7F_Nb6Mw<&;$UDQd#N% literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/head-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d89df4071be0d30eeea7a57f83e7371d4d68c478 GIT binary patch literal 6405 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 GV*UqI>d~A4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/meta.json new file mode 100644 index 00000000000..576edfc9c56 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_alt1.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99.", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5694178c58933a862b04536be83366913290b86 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKrvi*LB%Ip#z>Sjv*QM-d^9x+iW1fdf~ms)O(Lk z)G;Xf&*hffw%(zwmF?NOfDJK;=UmqLPvl}SSh{v5?~96=>Yv{UarRrMhKWmD(BHHE zxqyzqr6d+55Gd;Sy>tI7bE(~8zc)?anCw`d*4Wha=kb?Y`wmQzn|e8H_MhYCGrDC8 zuZN#M^~d@3ScwaHO8U0s$uV~sf;=yqe@mKi|5sFt`!l%yn~>+L*o!bQ!5iAD`OLF0|P4q16}9fDijU5`6-!cmAEy;$h|%W)Sv;kp(HamwYVfP jw*aBXB*f6t%Gkonz!+kQWTp8ApdJQKS3j3^P6v%V8m z_cU~$nOGRJtf*{5wf;obD~7GJO(vF1VpU{_*Jg5$yecUmIPw36Lo%6%Z*6v3{Ben* z!CW4b3GLwq5^B#xXJo8nKfO+1#<~sZHjn-1aWQNNP1iDb%voe~bXv2~{d4m^^cWWI zpICgD|H6Mx7Z6x-MY*Uf)Bazdcpk&Oz3=iR1T4Nt?brX-c)7p#<*j`O+R~p~`B=Z; zne-diU7c&+toynrq-t%xkM{14jw3Y;-WkrF$_u9%0DYrc;u=wsl30>zm0Xkxq!^40 zj7)S5%ybQnLkvx=OpL6IO|%URtPBivor9}TH00)|WTsW()(|82`WR4y2Hb{{%-q!C llEmBsgdUR+LrW`T3o8StC3o&|+5z=2c)I$ztaD0e0svMBpm_iQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee57febec2d28c0e8f13b90d9bbc3537c230e8e GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-ri8;JD|YBdLgd)xAeP1 ztp#&$up}`VZSvhSU7=q1)h}hB(g**&rqyVdE>2B5EoJ*FWs!S-)zfW%_CNjkDrFJh zOkHcBk_La<{h#E0Bi^&QNmn&}%}X%3E-bVEtb1i&=XndDylRPSL`h0wNvc(HQ7VvP zFfuSQ(KRsBH8c(}G_^7@vNAT&HZZUB nQ;SOya|;l9OhODTt&AgTe~DWM4fwZd?_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_foot-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..fcdf5bf6504450677c875fc392fc0fe47a0e3dac GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-rm^AdBA|jC2;M-ztV3P zwO)zsVtJ(0+T*+7p?yK+A+6FhpjrloH|ryR>wZ=A;VNDlwADrH>8@h$Z~f0JKQgZ~ zX9me1`1x%8pOu`C?>gi=`WxKi{gP#SkX1~?xL4gZpbaRmTH+c}l9E`GYL#4+3Zxi} z42(>44a{^6jYAAgtxSxpj7_u+46FPv9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_hand-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..381573480ff6d90351ae0af543bddb3e9fce2159 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLK&Vejv*QM-riU!c))jzs4e5DN?Po4sDLDOO!(2OYkJ}dm73XaG{Nc;&Oicye z@M+QBj6hWkA672C8~gB;ocy$R_Ww_B-R-2U$HuVXJ3~R5A$OnR5l u8Z_WGlw{_n7MCRE79jMPgcw>{8CzHxKrOj*kJApQhr!d;&t;ucLK6UTb#hMt literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c502e77a18f8d3cbdda261fb671b01f55e2a062d GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLTR2Zjv*QM-ri6YI-nrnd~wTmhwFt! z?>31aTDnN?nvUuJmuGSu+?arNMP2{!#mdG$vz)X#+BNi zckUDcn#RE3?z_IMb@#8D$zNjZ_t|gPo|0t9(6Cj!ZJM%FrasGipbFIz*NBpo#FA92 zAvZrIGp!Q0h8Vfm$AB6% s;5L+G=B5^xB<2<%^q7PgT3Q)fSQ$VqxpR-x4ycF0)78&qol`;+05H#TLI3~& literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_leg-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/l_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bee8acb480870cfb33dffe1e0a276e229de035 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLf1T9978hhy`AC6b=ZK1<*A+f|Ci-W z^MzmdPnz?4+LJA|Q=FJGQ#>_IHWYt6s=c;VUt7?LL$O7`X&u7{>$7L~1sQf(>1w#G zWW2q5smSIpdfZ)cX@M2F^_tIe_irmW#UoJFx#+F9$)85e44YNAD?Lk?ba%CJ>MYg% zXMbVp(k*vP^lPK+XPQWTlB+4u#rnI|pt=&%b6IImA0u zAFpM7P#196<9K??A5Xc99a49BE3zbnJKnHud%M=w(Q?}U^A)F_&pYspb;8qv=}v`a z*MUA%Epd$~Nl7e8wMs5Z1yT$~21X{j24=d3#vz8LRwhPP#wOYZ237_Jy3WB>C>nC} zQ!>*kachW?dwmS3K?80>NoHtS|DP}`=-#~3Jpa%=2hVj6*!X;om>c{I{F3r* zR@~zEQ@IT^K?Vx`^nJLya+!38={FW1^9j$StDClc{K#eU?z~0p!P+N}vy0CrMcm%@ zzK}UQJ>?hUGHH+F&#RgqTKzln|LJP=6V(h8qx}7>8q$9QeWY6A8c~vxSdwa$T$Bo= z7>o>zOmq#*bPbI|3{9;}jI4}Jv<(cb3=DLggR4+9AvZrIGp!Q0h8Vfm$AB6%;5L+G=B5^x kB<2<%^q7PgT3Q)fSQ$VqxpR-x4ycF0)78&qol`;+0KkVsn>+iN=5ER_0bU0?`BcAM=|3X@Pm?QtQ zc{nfAc33obr-690;zdCPW5dm5zf}(f?T&eWDw*K}AIF1rzUQs~o(TOddcA&o+5W#W zmaJ?u4C?kbKl4{m0)f@;r=PVkwpH(DU^Z%h<@}4Y(=x+H|8Aezybh_$+jsqadg4Dz z-o)l#tL$%e$XmdKI;Vst0H{ct4FCWD literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..da79cffbc9ba45c8d060d1bc1ce9cde58b8df52e GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-rg|eI$*%#92l$oJ-$Xf z{={sn7N_F@?aL0=Pq?Tgr^^Xc%FwW1O3rRdh*s;Rvb-OM&Tvl6DpfI=GcW)6zw)pz zK#PFjN6dcZ4Anh5-pHG6;n{n-Zfoie2KEs5%A<_CPr4qCfWuDRt5&T&cRhE8glbfGSez?YlxA1eGI5U18ze}W^QV6 lNn&mRLXSy^p{13vg_Qx+k~{Y}?SOh1JYD@<);T3K0RVN%Z65#t literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_foot-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..90b5deb87c4f8e2843cc28b6ee6204d88595d703 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-rm^AdqhEizv z_i8miP)P&-&G#JJgyM3(@v}#@?LAw!HT4Ih=K|y2O?O$Y0_9apTq8nXaL6h@q*KiIJ7DiMD}(m4Sh-b8r=khTQy=%(P0}8e-&L9|LO8fZI@# onVVW%l9*e7&|?x}XlZ3^VPycdn|8N9+vRX0k5zQm+Yg%@ZuBi;DldDq z=+(RhT9QCD3?G7nJ5Bc={8(2KwMycZXQ@4F=9@}}AIDfDxD2@yytjfJqFUk_QIe8a zl4_M)lnSI6j0}uSbPddO4UIz#O|49ftc*>x4GgRd40N4?t57uL=BH$)RpQnVBlr3k vP=f~ChLX(O)Z&uF+yaCilMq8oD`N{Q1E?i;?s3`y^)Pt4`njxgN@xNAZ##1j literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cc6b71a6792ccfb7e68aa9b429132e47a62c4a GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLfM`!jv*QM-ri6YYB1n&x!4*V^0?~L zJyr2l(JWjCO_~&D{Le|BG&d|)6{z@*5C8W?H)9W9KFy%GTXaqSCTAeSIz;%vthqZ@ z>{4GbiwCHP;m69CF0<! zC8<`)MX5lF!N|bKMAyJf*U&h`(A3Jr$jaD6+rYrez(ChIxC%u>ZhlH;S|x4`F>9ZF$poWv@*7^GJslg=N_jWP!EHrtDnm{r-UW|!~b$? literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_leg-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1bc5a60daabe0bfa7b3e84e9e99e45e4e6efad GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLMJ?3978hhy`8a<_pkvEi)Qa(Mc&@W zk#DZdJi5-VRq%kT%T1MuOMYatc>H+Y9N^p~;KZTWBJgQF!~Kt|=C2oBy=4gp@9Gz} z`bTwUYvi4>itF-C%Wvsn==;=e@LK%9o0PZqwneY1YehVMF|Xs(Shi{U9KJWHT7Nm_ zD&-$EmQgz22{ll9k#beQ{S7V0jE^=suslzxzr? z;)Xzv?HRrslmAZr^jOz<w7FGsOOYYp`v;*p4@O1TaS?83{1OV-er8xiq literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_leg-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_main.rsi/r_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b85c3213d4cba71eed8143258bd0d9d531c8a2 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLVG-2978hhy`5pm*J8lK;yZ7$`y!k6 z?Fw1}jvZqKrTt3_rp{+N)9{m$Dock5t{?8~^3PpRllx zr;1)IIwz>aR&XT#(2Dp4X*H|tbA!(?_|3mF!{(Iw)s)Ti47n!+rzN+Xs@m6No4_3C z2QrJnpv@@k{f;;FFLEU3O#kb9|EAHGqxanlF4xO%k8Vq`bu(d+l@sK3ynXmiL+wrb z&iw5>lU4VBi2qi??Eiz|w}9VjIe%?epgF1~t`Q|Ei6yC4$wjF^iowXh$VAt`OxMsj z#L(2r#K_9nMBBi?%D_O^Ik*Z%LvDUbW?Cg~4KZ@Bj{!Akz-=hW%uOvWNz5%k=rIW~ cw6rp|urh#Ja_1hW9Z(O0r>mdKI;Vst0N#FOrqfn|5uv{(tw5I?Kh&3|XtW zq=F~2ipm=${65R3dV$F_Kqgmuh6DGLEnBucnfzy>dGggyg}b(gxn=Mln8x(tt;Btw zof^Cc+*sP)|71S&Gs2R0f5NZ3e~$iGD|4T@vf_*Thr5LpD%#?KjWcWPckgScn^r%q z|Eiy;tgNi)?hck`AJ50QT-vzm!=EnAe@`UL(pDbRS$w?UoP@dx6g()uGlTi3>Ku{X zGyeSg{CnxCQ>(f^U3hp?FHir&k$*Yz(;Mz{Een>2J-_|Qo1Z2O+7C=E_JoT)@U^V& znz;C927g8Ak;Q$h9BPkVzAO6T`)|i(75qH$vTvi}=5faP>V5yMHR0^byYAXN-!)?V zzZ!(gS2VOI?(gU1mlfS^dnd!G;nJF>_6zD8Y`A4EwoH2RWXTErMA!54Uo~EQf8Zd` zt2EiE2cC(Pc%{zK@tI$~W{<)2`4c95u>ZjNczgXq?WdW?fsw0P;u=wsl30>zm0Xkx zq!^40j7)S5%ybQnLkumfOpUFK4YdsntPBjqq*uhEXvob^$xN%nts&h_;2}_h2Hb{{ q%-q!ClEmBsgdUR+LrW`T3o8Q?h$VOKaoPd(FnGH9xvXSy!*yulGG4sLOu2 zDCGRD6xN2Vjen2MdU`Hb|?yCT;7UYgl&foZQc z?zwdG^y$@?vm2RDe=!zrEz+6Ww9otAqLW58S;>93M5aHSWV9|s3+Vcwl?Q&r?G|z0 zwK*;}_vQEb_9mfX-TJR`|5!+KgmG=R-+OzyrNFMHE!-Es)%Y)Nt`t9@Trl5q(TB$^ zjB-AUn=_TyKf5Tyae1OcyikLu>GqOR7QerLD}6rBk!;Mf*|xmUX7b%xHSgZVjp)`RBWH8Q^Q)h&D{nT8)mNLniMcehEFuksrthySQw$|anM1_s6! zPZ!6KinzD89P^qD1RMgFuM#=O6#Z`c0ndm@Yj&`EtCZboo_jiER@aik(>(!~yzWmD zm9#PbX8h_HZ(|z+lUQTrJm*!>pDLbvz1{czaTTxCw`X@`mb>2G#v3`!^{vsh^4XIu z)v|hbY%x7h^~Phjt&7>J+3|}Ol{H={zrFcpx>m_6?g`(oeM{r5`1)tvYp2L*=BFoY zwE1o#>=1js=+((@x2w-H$sZMQ6>LlFIR4o1)cT&iXIU1w&RS-vGk@T6|;Crm3sLqA4J@4FtERe!kd*wsBRr_AWVWpBfQ`@%mM ZLe@V!_)Bk(1u&8rJYD@<);T3K0RU%m%I5$8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_monitor.rsi/head-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/shellguard/shellguard_monitor.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5ffd6c10e8c2025bcab45baf913d4a4d4be840 GIT binary patch literal 500 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 E0WeuTx&QzG literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/l_arm.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5f646e36e93793a6792a6fef2f4ece375e2a3b GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vn~ zPZ!6KiaBp*ZCu;zz|&U0WV=&X2g}VS){F@&A{qpZ7^DpxwM3-c5}33cl2|t#w(Zfl zWP7)8TE&fcX5MQ*4&X)n;n)ld+^(6X3GK}M9};R*(h`nqEurTst~D zbCy8c!r}?*YtK)zIjGdow`P+L|MAS*VxE&O=$;nz*zlLbR*t{wce|MH`SqbGWt=)2 zI2LR#UGinWrPfFNFX0l00vR!V;m+z{p~ZlZ(ql3Wc#(D6eMc9Avu@=pw}~9moZ*5E z*I&2VoL~D~Xq}Qm#_h7(Oxq@__%Y2|X1F@@+Pt~Uvst9hY*@*p&S>(d!0nO6v-?a} ze!u@Mm)?9WRD^Zas!dX-3RW?!OKe@d-D^wV%d!2BEiQCEwm6slzb0o=u&#pLzo^Lj?LE7ecHAkR_uN|f+P?Q6 z*I6w-DZfGI^xj7ax3^uKb;r24>BOmBZCQ-h726gqV^4K^trOqWk<3UG3RZm(U(D#A za@%It@%d6K?guD8I5Vwc{musUQ2ceJ+57?Zau}t%H43KlqRqT1v;#&W|CvSbuy?rcO&*;P_p)WCS zcCCvvtGl?L;e;kJsNwkr0VkQ`hNmt6&AsxQV;$qPRL96^H_v^t_uSk6Kdh(*I3k3$k>7rvQVI!PC{xWt~$( F697Rp}uaMJo=P_%3{39k;6Ef`C9$(91_Pc8gUm**$jUWaJVuVKL}D@FXed=&AV| zYQqjV-#NR&r}6U3mctJNQh66-9J}n~dcfwqr^8y!0~Jv#I3CQo^ZvVr<*z51Tq_oA z;`r3PIJk;y!{<#8^a}qURXQ=zGc=%zYr^TLi*C(36}#Z|u9Ez|{eN0!EU6OR5Gz@G z>|)o#AV!}y&P7bK=Bj7)A5wMO>-PI!ItNytAUt_ajnVh=67z%GZ~OkueH*W{{{Bqn zX)>FV(zz3!w&7xzu3Y3%Y-?8HB))miB) su&b%e->G=dQ~xthZ+UjyT#$1XFgY-Iy85}Sb4q9e0Q9H#)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/meta.json new file mode 100644 index 00000000000..f30906990a5 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_arm.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..24e15d419add82acb47ad75991fcaa480bb302a6 GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vn) zPZ!6KiaBp*9qc`1AmD0$X`2K0#7Rag7+v%=6?zN09yl?3gdEUxIb~`7;^6E3QQp-z zN^Ra8O?wvmh>TtB^Y3 zPQq5bvo#0$4uKu)!!RY8X@QI|1EycVQcGkHxq5bfXWg$TBrr+7tx@L7X;1lK=`(hMoDWuW+f8$5JNf%miJe(tj1r?y-R7GQigqfP_Z@%i z{dYHd=ZnkUv*vBT?d|__Nq54w_pCE2DkKygYxqu7{;yxE^;U%g%`H`o^WR>c Wf9zw^$#1~eWbkzLb6Mw<&;$VP)YIVr literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..f04c2fd7a6452ea43d42a3d9ec057485521fcc10 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|O(o zr;B4q#hkadE^;;-h`2oreqm(Qrft#oc}HKih2Jf0UY7ZjZnPixUmu{e?@1L){3P>7 zG7N=$4HoPUbC?y*F$z3q=qP45V#$ChoXu4*FTLw^p-j&0Z%H!OWA6W)v211Lx>XE6 z4_+_rWlz8V{l`*Ar6rZ~*6&Q(XOo@Vv5Mj2F=w4g%sonJn$J&dzP5_1p#Jj48ycr> zRz3UVEQGMo&SLJUPJ3{N~5PE2H&pv(xAxE9BEIN{em_i3pdO$?7M z>?zZ+5)ib#{)q_5(fc|4*j3>c0@dVlj3XRofTbG){Q` z@ARfE8~wX?MmL_tfiVFY$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_leg.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..653101e63afc2dba2c588d7a13c3c68741ed8d73 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vo2 zPZ!6KiaBp*8TK_B2)No`l53XglxbEHe;^?;r?shhiSI$frX#5l`%;ysaPhO~oZXZ3 zQS8kbn;iAiKlo1>G6wW; z6R$4*BIj`W{dZ~2gEjNcKY#zd!Qg1zdhwv9p8*F{y&I}6bRF8;I(OO2Pv%D-n*Nx?T*LS1h7zOBzTD{RTI&Dy z97x^pqfqAVjI*=Wy-r)nGLb>-|Iw@K&s?8ok!W`*Z)yeShnL>FHl_srD@l22Q7rzL8a89xytY%_^&H1~gIZfq)%j`ctTs{$K4BOh*w_@L0S#7sn zUGP)RVaMxDvbEQZEMBi^@@V+~=y6lA%(Ck220-~Rp8 V{3{I=8-Q`o;OXk;vd$@?2>>Xg?}`8b literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/torso.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_main.rsi/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1bd42ca6cf6a01b57ef981fb9b2d359ff22b4d GIT binary patch literal 961 zcmV;y13vtTP)n>3aA3A zfGY5xD)38UcP5i@a=Dy|#bV}kI+^8iX*QdUXslQ8sqZWJEYdK%)9ILOHfze|@`d|k zGBK;w%Cy_1S#QeSkF;?c9sjYfk#9@hg1KdhewU%UsvXgat?ywd)bkrLy-vin9JRKYKlX1gSm(bX7IK(Y{u4aQjGVtDg3XarjHQNkPDmOaB9+FL(Vsph} z(Sjus2{RgvOr*&P0kbGkqFSw9LglmB%(mi&$V386r&9~o?RGCB;72lfsn_eyVzIdDE_oD-_5dVF`b&_A)F@6rU%3N zU-f$SdFP)A<)5;xzFzZx`&)kJgdW-B&u@JT+r8ladv-le>FdY-U$1GHwtD~O345;R z+?VdZ7-G%P@^%{c6i(^>hngjvWwK=l?*5kk`Q`7e`R#Vc%F9zjVnrFmw}h?sTzv6^ z>4kb;2EPlAH{QDY{`hJ0HQ0Fm`F6VuwaJ}U^R89g`n4}!;^5@}6BKicX8pX7Yc_l3 zOKzT!)mOjpL_}pCynmZ@*6w3FIfZ_F3%z1rB{appH^9>&;J<)X@0FKLEFKLwkb+uc z#MC((j7+lH_r~dmomug(`{<&RX`34__t)7Su%45^yFejv^4GZU;m7XW{$;byP;R-K zylLf;vRfBgwta3athoGY^*_;LvUyvh_T8U1}1VMC4ZH4}aHP ze;xPY^YY#O*)x9J-P5V@^Hb)9qRwRT1Kd)3GUq#LF$fegy}nwe{-EK|*XeH?TcLo$`cfc@K0wH@nPR_D!zGB>PKdmi+JRb3arHPO(g~ rm@%QGZutw%mok$5SVBff=>vychiBo!m>X|_>6*dQ)z4*}Q$iB}Lg8x6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_monitor.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_monitor.rsi/meta.json new file mode 100644 index 00000000000..9f87381cd87 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/wardtakahashi/wardtakahashi_monitor.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/head-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3943fac0db8fd59bada58d5a5832f077a5b269 GIT binary patch literal 6832 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 GBmW0Xxc`Iz literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/head-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..baf6e438f8192b2d45e70f9f22580e33be77c1ec GIT binary patch literal 6889 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 F_#Y#eCxie1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/meta.json new file mode 100644 index 00000000000..576edfc9c56 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_alt1.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99.", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..48cf08df0799c71f1214d1c90ad4b07416d46be2 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRf@0=Wb4*&{aMBZ*OemZFb;cy-*+6wWc6@ zNgA)%f&@ORt{$iPoGYB>Pis2G-SiS+xT@(wO8|5zo1t2c`Iz37?$ z*22|iL26oV#=^9;*E1R-pEce4@Ngb?(Gf1KGZDd=Y^K*u78l99$A{GB8wK-apl$`nP=o>+gwwC$OE`Xg5P?cSpyYpA1tvyf!$7J@^Ck zplXS0L`h0wNvc(HQ7VvPFfuSQ(KRsBH8c(}G_^7@vNAT&HZZUBQ;SOya|;l9OhODTt&AR$B>MBZ*MFVY<3W6eK_C8C2EJ+ zqReJCfh OGIo$7icJmISTLSPEZp5HX~ARX65{Qjj8$mHV!T>|6F_Qwx$WM-MA_B z(+mga1x8mwS)}^en7rTcl*)SZaGu{A!R?)PZHIYtm+84FoV+n>TW!BTI=Lg*)TwZ> ze}+P5>h9RQ1G7_i2j@3bvNN!~n)`nB;|CTEf7}(6K)`)#W&D2D-#wLy+~4LaMF*K! zr*VJl&tYb;y1ZZ1{pROK+fURT;)_VyyZH@Bhy7btM<_CPr4qCfWuDRt5&T&cRhE8glbfGSez?YlxA1eGI5U s18ze}W^QV6Nn&mRLXSy^p{13vrIjhvlIlM>peSJQboFyt=akR{09yQ;Gynhq literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..38b28406ac520501b1c3712c4707cce715612492 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRf@0=Wb4*P_CzoV@Srmw>LKOHYkX+JnW7(kTBk$ zA?h7qaN=fG5>rQD_y5(E;-7Yv3jtL#F#H#n`E%_`YC!NDKJLCeshPKa`LEhEsmt~U z=WYwl)pnb}iWv57t9z=idgnFUInKTF7F^~(Q^xF`YoqBUCI zZ#;h&8tM9WCNEgkhmBvg>op(7nHTs;d}V2_OV}oD(e;(Z`b&lE&ckJU?*SF5mbgZg zq$HN4S|t~y0x1R~10xe%12bJi;}AnrD-$CtV-sxy11kdqUFYB`6b-rgDVb@NxHZJc yy*>uipaHj`Br`X)xFj*R0HMbu#L&{p*wV_>6k^HU?(_>Fr+d2kxvX~=c< literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_hand-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..72a1d92d83f62f96c802c53ff862a40f432eb554 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LQS47jv*QM-rm?K*r34E`tX5Rk^=?1-dG!hJs+FnQy&)5GvZQV_ zRx?a=?b~9uF7B;|cLjH&tj$y=plXIc-h1^6{`VcvYX5!jfbD^MKeyb{+Zv~Mf&a^= zFI?*v88S5N5}v$Hh3`dJK_gJPYKdz^NlIc#s#S7PDv)9@GB7gHH89gPG!8K|wK6fX zGB(jRFt9Q(&~*;3LeY?$pOTqYiCaUA-0NdN4H|G8N-}d(i%Sx73lMrtLJTdfj4iE9 XO(B-t?M}Y{)WhKE>gTe~DWM4fZ%%_o literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d61d58b478abf8b0d8400a4873add0d512ed9bfe GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LiL_5jv*QM-rm^F+hD-c@{l{af;BCH z-|f^4O^JqSdOQsVl@pjg*5~?dda9?+$iPr@{7=!klhc0RTfgkmf|DXs<$^o|)ucBz zY~>+L*o!bQ!5iAD`OLF z0|P4q16}9fDijU5`6-!cmAEy;$h|%W)Sv;kp(HamwYVfPw*aBXB*f6t%GlD%)D&XL T-R|@YKs^keu6{1-oD!MB&B{Au*P1vvJ8|DRcq${)JuxxS+5giE&pi!JM+NJm6<@vCaNcF||JC>RoH=(+ z%($Tg2u{>H{EIu&`u}8;^pXUwPHCM@Nm2jSzx&WO@2Jp=o6Pek?kIU|q!n=cz_x>2 zIhGr&v@^Fe9k9-SIRD9wO9wJ_o>W(s-;BA_d1Tf_v7RHTUmQ}CyZ1M34E6nbpk=Oc z+(BjjjRJxo@N;unEAzDN>IG_x1+TvlUov68`j4RbxoY=B=G6Bou9i=CS(;&zt*B;N&Yt#WLH6p+ z!WZTp_|ACgb}HK$p>?XjAX6=IjVMV;EJ?LWE=mPb3`Pb?4J45&c^ZbM0CZfbE!Vr~IKk4cE3rIoRzm8mJj VlDpmM7l3*gJYD@<);T3K0RZ?Y%`5-_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_leg-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/l_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..89106d6420b51af0765861f1f4035871a3081924 GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-Lj7#M{-T^vI)?!CRSFptSmfbBuOM{Tpx zcNX7wmhS{3+H-yRFSFc!XT5;KLuL_E>xi4S{F}9EKOEOhn8H#t_oNUbcX8_RduuK==1uBj zH#54h>Y~3vKEscxh0Xew+Za-&NCa!gS-x}02yD_UA}^B2io^3Sl?EbGT(4%U!E-I zjbf(7=66nt#P_k>DQ>zXTqAJ1UF=88au&vFzl19e{`0SX=UQXg7|8to($UF_xh&K- zyk!(v?;3^aix%nxXX_dG&#K^rq2GpPdx1l66H?_DVF}DDr$0Wqi(#qJ<%G4BM$=&Ys Q3qU;#p00i_>zopr0ABRJX#fBK literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/meta.json new file mode 100644 index 00000000000..35c1cad74bd --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/meta.json @@ -0,0 +1,82 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + },{ + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0409bb02fe10e39a0aa15711986a2ec0eee3c974 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LT5c)978hhy}iCrwAn#`<$`6LOVkdt zMVXJK90J(+CI)>7Y2dOGa}?gu$tMsoaj(mna+y7;`S0gSIJmg{6P&p|ZDVYfg;h?L zOY-foq?ES?jk6}64BGy*=fwqwCp~4$-@W1xnr^W0&%ghHNr!~C8SmI*&&RO-#i8%g zFAnwk^E{WYy3?@u*6ip9h0J|f>!nuQur|A}*lK?MJ7obuAehK}%;IhHm#&v?{8dN4 zY)z{F$+vz+-n1M4tUR8279D*aKF{&)g@*h9^S~Kmf)j1xc3<||V9B9S0`!<_iEBhj zN@7W>RdP`(kYX@0Ff!3KFw-?O4ly*fGBL6;HqkaPure^vbq=mV(U6;;l9^VCTSJW8 y>tjF-8gLs*GILXlOA>Pn5PD2P3@xpUEv-yVA(q_jPQL)u!{F)a=d#Wzp$P!}wWVkP literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_arm-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_arm-2.png new file mode 100644 index 0000000000000000000000000000000000000000..061988dbcd42c494755607ae168b8f38b53a7e1f GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LdQK_978hhy}iDXx7k31<-%dFiK2Vl zvaTgCay=_>pBVUJX2U7wB})@Hcg+`SosiJt*EgkF_SmnQ+dC{ATwLlVMqZo6IB~;@ zjtOQPo7|l<7Bsp~HQIPIW!{B`<0)^C?TB7qzfDkeVWW_8TJ`4oU50>RnrA?0dGY{r#31 z^VT?3?>k|6bFz%_3jI6F#qTVbrvg%aVtxfv^i%V#jb2_8fnHKAag8WRNi0dVN-jzT zQVd20MkcxjX1a#PA%><_CPr4qCfWuDRt5&T&cRhE8glbfGSez?YlxA1eGI5U18ze} qW^QV6Nn&mRLXSy^p{13vrIo2E#FD$+=@)={7(8A5T-G@yGywoH4X7~y literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8b2b141aac76424ec9435115ceb6125ca20be5 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LfM`!jv*QM-rhLKc|bwH<>EoTZ3fvJ z0{t@&HMjb3ajaONV)>^$L}J?Bw;n*%3=DrlE&e11S?qp&gyZ2l8wo|*`EO3UhQ2++ zbR{ITF*LO@F|sl?(Kax!GBD6}4z5Dckei>9nO2EgLyX+( xV?YfWa2rZ8b5n~;5_1a>dQ3tLEv<|#txQcJmfY=5zW~(3;OXk;vd$@?2>@94a>@Vz literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_foot-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..74d17c3c7344fc756198dfaaa2b12d86523f883f GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LRp?Jjv*QM-rhLK$)L#Na`B*E&~5ElOQ!uU3^o9^dI$_ZJ^?)(s3$_G@UTH+c}l9E`G zYL#4+3Zxi}42(>44a{^6jYAAgtxSxpj7_u+46Fe2^izS~{XWBt6gTv}t&)>D^jx2^L(@F~ck zvsRAbULix8r3#-szY@@y45}rr5hW>!C8<`)MX5lF!N|bKMAyJf*U&h`(A3Jr$jaD6 z+rYrez(ChIxC%u>ZhlH;S|x4`F>9ZF$poWv@*7|GBt%* Ua<@DE0#FZwr>mdKI;Vst0ByB;-2eap literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4e6c3e1674f9c6d2b59c2ae1c7e55ae35c3caa GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LUo=ljv*QM-rm^A+n^xO`j9<(LzD3a zc4b4gR^}U*5?2ceEwbGDV?UoqU-{FyK-)gppPpWNJ?(Z({Qdd;u91!hAG}_$V9lkw z@k}b=(I&6#R&9H-Y|^a_t9gKCGi*rSs%i0QaeMmgrk^hkGq^_Hep^{qEq9uipaHj`Br`X)xFj*R0HMbu#L&{p*wV_>6k^HU S?(_>lJq(_%elF{r5}E*5c7D46 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_leg-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef9033cc0f5c4d42fda7abc5c1240c5d5f000b4 GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-Lj7#M{;T^vI)?!CQXnC0Xs!1h40Qrtsz zp2G*3_Z&CRT|0Gy^}m=xd+8`kPd_FPz11R8xyhk5701)no1%k(K+iMg8Z5Kr{bmEPN8# z;jw?hmnYl)`OY#;tDI*?3@xsg}4#l%yn~>+L*o!bQ!5iAD`OLF z0|P4q16}9fDijU5`6-!cmAEy;$h|%W)Sv;kp(HamwYVfPw*aBXB*f6t%GlD%)D&XL T-R|@YKs^keu6{1-oD!MtS57qP zHi_D#qsH+>Xt%QpIhN%w_5SXMZuS)mhni>0Dh;`S$R( z|F5OLOL`~gNSaCjgG;ru)Tkvdue;C`~+T;#>Q8V&P|AsUC_LN{buQH@tYGH_MN_5zk&C*y=S13E0-1! z)QKEFYp?S6Ls@{5_>*!y@c z7u)?mao~WC@@3}f`N}7Ho4dDUaXK7W_bHt9xW>P^FZUkho}07Mze-`%cdoeYlRdc_ zU$iR8EEkZf*sVPOuGIgAz{Szp8S@ua3veIcT)#{~koA!W%K??;ik7VP3@=hE^$xB- zYd?w2=EPz)H>Uny0UN|EJ__Go9sTfqu>8C$o#FfjPruki%=qD_v+qo!+etr1?l{v= z@!hH+Q1C}sWwq&3gHWT?<;;S`wx!diOh^fo;+$(?*t+(l;9|d|=qQ7>ovZuj*4=#Z ze&Po2iPe(JpA{{cUL*W&>I9wB$*%W3-+b^g5ZVxtS^93{CY}t@IU+K;e^j3@-oK;s ziPD>;!t3Mxt-P+dYt|M?tPW;q%&52O39>ltc<^M6$HcddH?Bt~X~=E*TQI}vLfxck zi3cLZjHPt+s#PsEn#>QG|M}ME=BDrs5q>*&*%us2>YNm0cV{irk%lkkL8gLs*GILXlOA>Pn5PD2P3@xpU aEv-yVA(q_jPQL)u!{F)a=d#Wzp$PyB@m2-^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/torso-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_main.rsi/torso-2.png new file mode 100644 index 0000000000000000000000000000000000000000..70271b0c3a2c5679cfb028d25a26a8aa94f9f7be GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$np`|x978hhy`6D3_pyP1+kFW=m0hP& z4IH!**sBA?&y_7?y~C(2AP_f2>d9)}B@=EkYyMYQmLhZ_ZW{jv6^}n{&V21^oKwA) zep>vdbZyHL`>heC6?0^|wemM|t$CrU+7@U1u;_g8BGxrlK>E`5o?lBJT4j0f_}5eS z`$wtzUcO&y49)Xih&fHYbX%f+_lo;Ab$7GX)!E*fhTLDzx9t6|>he!tw)EUGdKGur zR-IvU-TK9SR<}>QX;l8Md*W=f@>~g<2Zr6hj^1d~`8QYcf42UYU17DG*qy%m9XRs@-6uGJB&0(+8IS%ik2*Y!u#LB_EXX-QmV{X(z3BCsM_OFWiYZ zU68P=aPh%}&F)R1&c(rBr)W$sNMN^MY<@W5?ys55Y{I%re-&&_S#Z5=*^e1VlQS|R z&MjtTugbOHu9&kY{rREY79S5pPK)*EV^mj4|9OGAZPLydhQp2gw%r|*GZ)@*{-Tz( z^nd&Hm*)1p+EY*cKOFC4p|s@evz?s4B&J&88c~vxSdwa$T$Bo=7>o>zOmq#*bPbI| z3@xloO{@&fwG9lc3=FOsH728I$jwj5OsmALVM)H_eV_&nxD6$lxv9k^iMa&`JtiTB dmR81=R;H#9OYU~3UjXW1@O1TaS?83{1OTF{Uqt`_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/head-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e48ad79298c6e13b4296e34a13b53acbae2d7c59 GIT binary patch literal 6857 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/head-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1903f4bcc911f1c41ae013d3a156f7e752136e GIT binary patch literal 6466 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 KVN+t|6ZJn^tZj4v literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/meta.json new file mode 100644 index 00000000000..9d2654d15cb --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/xion/xion_monitor.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/groin.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/groin.png new file mode 100644 index 0000000000000000000000000000000000000000..29ae064b0d64cb554d41e5663ab8f75afcf5002f GIT binary patch literal 5522 zcmeHLX;c&05)L4NK@A`eL_mo_QGu)^AqhdYuxgNfSLt**p@A$UAw+bP$KtNIATEQ0 zBQPL{h=2-iAcFgX3yy;@DlQ|U2&gy;`Z@s>&zp1J@timR>^`0DTes@FRo|^!w>xVB z1AHbLSQwyCsEK~QoM7bcroQyi$Zr{(+=)Wzx~7FjDuRJjtW+iuz)28Ru|x`CAr&k@ zp;W&=kBpHy%$hJPG>y`pq~9o0?Xz<}*DvP`&hM#`6!*mZk>QMjYT5jc%8xgXwe+?p)+-mTCbkV0+$mGG ztq*$@8`mu(c30(wG#%A4Ce))#!}mUzm3~d`bl3D)8qa<|qpQJXpK&IkaQ-^hl;HzcEvnw5a>&2)Y`g?UR1ZwNVZP*g{OX(&5ah~BuH-BMaj0{O`xZ`_fJjn_vioN3n zuDw3x!s&QS{3=HslP&(i(#&e~A(>f^^<~qgrSrBp;JiZ1s845Zi!I9C+q|21yNFpD zA9SmXyOc|d*jJoTQG2WN=u8F|E{4l1YCES_>(qhDv+13BIn@45qzl)Ad@O(Dy}!hU z^7d6G-&c2`Hv5h@?&SN~>S;$iN;R(|;06rIc^ zChJ-=k2Op#ymD94XGT5Mwc*soSZVjkb9a3@=Ypao=DSu^J^NRE5P15jqj0p)o zg>B*Q0nky^9hzX@Qz*|eT6p=j zTkKDTk^a$dEDk3J-^V58Bzbpq2e(h__hGX@w`!buFDo%Iu+Bkm;!FEAEv?SIy*uEW z^#g~lZ8B+F)E|{7Gxbf4^&Y4)(BIFk${1&|v2g9evIeUKE*^hW;4^g(+HS|PQCgl? z=vG$D4V6k8&bydSaHg{|CAz3d*V;1chx7HzPDJnsCZ9a7f{ zhlegN239q0uB|iH+89_cS~pyT902w zvxz$1F^o6sJ~n9a^OVWk*Gp@x+)|vP@a67H`72T4_uAf=mFJ(KKR{MLOztm9o^hR1 zpWpnk-De8}&(HpRz@ zUwLl(iMCr^JqhQ03>8fD#?>}@7JYh)PS)t0Xt?H%R=gyJzr4NKW;{5p`*lWJU-}|U z#mUeam-UY+GIfsDGsj2$pp(ZbJsRrz_8$Cj7Q4JB*(1nms%?+nna8Hx|0YJVuQfS{ z^TJE3~stY%E+I`dGquzVjx$ zy4nMU(#nQCJp=tbJwKIFq=4rCxY@zi4ZE&4v#d__N3-<(7Kko(G z#rddC;XVJv_x34qZ??XQju}5yYq-6kIVEQ6VEVM~rUDjxA?qvO)IFMT#yWzSf5!bv z`%~;1Wkie1WpN~6irPItjtfpbK8r5_VLnUq$fHwf01x2dK`M!ir&8!ncz`Kz#5+YlCKF)N z0fy5Uhy^kj$x0w;tXFC%J_1FfJ2Gh$8i)rO3?2eS72p{VkB%pisC)*A#NgBE6b%#~ zWO++uA^@3ASOf?mqEsx@bf^huxd-~W;3x#r7fE0epb#Ji$Qppfd`YVOOIIi?f2lkN-4k@1&kL?de|1WF!hjWm;B&0@l0HOqnpfFmKu0VTxO_=#YRbb;}J zSO_8YV>Dqu$>G0A1_s@cN+*M4Jdebr;i)7V1J4AICY9>MVA5%1h#>&JMwd$jic~-b zxeE~<5w4H~)o_KKJvvo$zSd8Tht%_cP=+Tl@M9>$5l4e1sw>8)XxYU7;)AVG7*k>p zyAc^ux{yjp{9Fo0`BE31fAAQchktMc1p50R-^A~Cy1vu(O$>aK^7riePS-av@J-6! zv+Msxm%*2hDM*aG0i`0JO5)`<#>i(Dnm5mfgYws$<6;aE$q!QBC^-s+IitR`w%KDW z5uu*KkL#uPr#^ZzifXAVn1qNL{W$KS$RCiulQB)$32s59_1P|-n1(CESMTlC;m0{S z?zZwuaNbl?6a3*P2OK{s*I^?9t2qvw85A3Bre7Vnkv6BfICtoX;qe2B)sbNf^?{{_ z9pqXkWI80g+y-0 zlN0vtl8dKji9%fxJnV6zUADqHaQ&)*&Kxsw)o^i8;?y*G_|ONo&_WA^k}?gS3d7J& S6MR>zA^f}oI0ro9GX4YG*1?d8U7c7V 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 W*3v=I13XwL#NOJ4RAsq6?tcI=B#w&! literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/head-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..14e7e83c2fdbcc9c65205c02ae586db287e21ed7 GIT binary patch literal 6535 zcmeHKdo+~m_a7;Q$T?Cj)ik=G=02DiM7b2X--T)}?=Xy+X=a#lDY-^2Nv95?DA%Y+ z2`MFYR3bvI3Ax`Q6-j>Ys8gNw`>yp{XRY7&zh=EN^FI68`}6Gm*?T|hd7`Z?_pFjs zl7v7Yt4#MA*@FKD!mq?~@E3BZ%mD(C=nb%U=Gl_?P&S7}qcZ>~&z}uI0Rf!`fe6~i z|8({1B+3{s5>9Lgon1~)xm)O1pMJbs`46|E^@FcQXGSVZ6BEsPMeh+HGF@NlE1MT$ zD%Z95+n(LOUwv(GUX}t;`+fQ1r@0SK#O^_)-nH3UuJYxHn=7qAxr3d5=^b9l&*^UpkLNnmN$4C_53ft3DNFNPbe!z<}@s? zRYn?@Z&W+FVMgT4%e2K$W%IF)lJyC*>NWko3)5xq=Dh7Khq~Y8?Bw_KajiGrGQMz; zwdml~+=o3dV=v+BpBljJ??lHNC;GUr&pxwn_JYgqx}2%J!hqcozHRYg^8=#nJgcK~ z6U~#{w4-FQWXFo0t>KEj{?3=e6==B6iAO5LL>{lWzNt<$@I(&~qu){DU0&=84E8H3 z>BjhH2hI20)!Ef-dw)LvE;+(|lXD^ZK|(PrG9>Edw%obpv*YjP>e+G7B>0oFu(*5i zfzhWHPMWQjeSRt=c{DBTKua-X6L~Ziy)zV&JC}51>d$cKtKVxR4c5OfO-C8r8&pv+ ziIjf~TdCRFVlEdP8L1)|6Ih}}qgD3F7jAk9*`6gGyx9TY#I02ybi4j0#dTuKS$mGU z@rgAL5jKgZcNiO8#tmz>*mL0yURSPsP}ra8IpCObqkaEqnx4*fK8-Inv$HBnHEzsA z5i{a>$!ZAuqPEyP*|((4$@#F2zN5?a5wCn!Wk#c=&g6CAWtX2*ZgvB`vB20kUuzuM zw81&}Q;?|UV!DEit(NtH+$sAvJ}X)Mo0Vx01-EG^LQEuFCbG@ph}r!FZ0%KrniDE0 zj56)1G8vjwBI~lC?1$)#QsONB&a`Y4@2r}H4N8}@U>~u}gBc|StDc3mrbQ?;ZBIO+ zv|sj2@XX~4*REcBWkUW#zWIEK5n!A0;aS!2wD0N-?xy~wgDoig7DVW|@`W7@PGjuG z+wZH#?7mFgOns&n?V?Fgu=6&b-0^m?I<#J_G`O&MX6qk4#UyvKL(4?;%8vMKr#Ni6 z=Ee9bS13d2;zVa1%5>~<6GK)r@sPPEvEt4sEdTL&?^fhidG{T-_-m@h*I+60Rbjp# z##T&@jt7}I?66g^I((~WRLPsc4jl}?_wZSLfh$G*T~cs}+qt)!46_` z&Yo)3S*%_ZBPP}MyzoXr@#;C{g+kQF3QD7Q+Z)ANF#|KhJ*Yn>B(8TLfNPr6XSbq@ z)s!%M=yGi+-0A_iw%HM>V`EPY&Qj_r=OAlu8s_&DtqfSF(|^WV5M*WgTpr#KQ@m81FR~UKY=(FID%~F+c6^owPno_Zl zz#D~QnL~=5RkE$5@Fyk>oKU^fQ#08+SJ3-DZpL>d;$0)AVnrt+4vu1itR5$;UNcTt z1vaot_mluIeCX6FAYq}GrH^^9`*G-SOM93G5Q(RH0HKi{_lN7a<*nA z54YKT*j%#O_Cw7L28Jwdo;A>?;No=deu!?M!0@t5lgqXMuWFT#%-zW>ZTG|e_)h0D z54ozMPaRu5gF-eRt%(`}ksZu(Py zGi~&&crMzRDT9ldg^N`le@%YX8hc+6=hPF!4 zb?EKutkxF#Gi{K*CmpI-NvaS2q;ZV0N0n@pLcWm3BU)6n=L;Ni4`KN;;;VuJ+8 +/// Prevents the entity from causing toxin damage to entities it does surgery on. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SanitizedComponent : Component { } diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index ea7d184f2e8..cc097358dfa 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -125,13 +125,16 @@ private void OnToolStep(Entity ent, ref SurgeryStepEvent a //if (!HasComp(args.Body)) // //RaiseLocalEvent(args.Body, new MoodEffectEvent("SurgeryPain")); - // No mood on Goob :( + // No mood on Goob :( if (!_inventory.TryGetSlotEntity(args.User, "gloves", out var _) - || !_inventory.TryGetSlotEntity(args.User, "mask", out var _)) + || !_inventory.TryGetSlotEntity(args.User, "mask", out var _)) { - var sepsis = new DamageSpecifier(_prototypes.Index("Poison"), 5); - var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 0.5f); - RaiseLocalEvent(args.Body, ref ev); + if (!HasComp(args.User)) + { + var sepsis = new DamageSpecifier(_prototypes.Index("Poison"), 5); + var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 0.5f); + RaiseLocalEvent(args.Body, ref ev); + } } } diff --git a/Resources/Prototypes/Body/Parts/silicon.yml b/Resources/Prototypes/Body/Parts/silicon.yml index d10e7a6991c..ba185c49c90 100644 --- a/Resources/Prototypes/Body/Parts/silicon.yml +++ b/Resources/Prototypes/Body/Parts/silicon.yml @@ -94,6 +94,7 @@ left foot: id: "left foot" type: Foot + - type: MovementBodyPart - type: Sprite state: borg_l_leg - type: Icon @@ -103,9 +104,6 @@ - Trash - BorgLeg - BorgLLeg - - type: MovementBodyPart # Shitmed Change: 25% speed boost - walkSpeed: 3.125 - sprintSpeed: 5.625 - type: entity id: RightLegBorg @@ -120,6 +118,7 @@ right foot: id: "right foot" type: Foot + - type: MovementBodyPart - type: Sprite state: borg_r_leg - type: Icon diff --git a/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml b/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml index 6e85a42b87c..c4298ed57c6 100644 --- a/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml +++ b/Resources/Prototypes/_Shitmed/Body/Parts/cybernetic.yml @@ -154,6 +154,7 @@ - type: BodyPart onAdd: - type: NoSlip + - type: ProtectedFromStepTriggers - type: entity parent: RightLegCybernetic @@ -166,4 +167,5 @@ sprintSpeed: 5.625 - type: BodyPart onAdd: - - type: NoSlip \ No newline at end of file + - type: NoSlip + - type: ProtectedFromStepTriggers diff --git a/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml b/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml index d01c105fd61..2f82d6cbd5d 100644 --- a/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml +++ b/Resources/Prototypes/_Shitmed/Body/Parts/generic.yml @@ -3,12 +3,24 @@ id: BioSynthLeftArm name: bio-synthetic left arm description: This left arm can be transplanted into any living organism and it will adapt to its recipient. + components: + - type: BodyPart + children: + left hand: + id: "left hand" + type: Hand - type: entity parent: RightArmHuman id: BioSynthRightArm name: bio-synthetic right arm description: This right arm can be transplanted into any living organism and it will adapt to its recipient. + components: + - type: BodyPart + children: + right hand: + id: "right hand" + type: Hand - type: entity parent: LeftHandHuman @@ -27,12 +39,24 @@ id: BioSynthLeftLeg name: bio-synthetic left leg description: This left leg can be transplanted into any living organism and it will adapt to its recipient. + components: + - type: BodyPart + children: + left foot: + id: "left foot" + type: Foot - type: entity parent: RightLegHuman id: BioSynthRightLeg name: bio-synthetic right leg description: This right leg can be transplanted into any living organism and it will adapt to its recipient. + components: + - type: BodyPart + children: + right foot: + id: "right foot" + type: Foot - type: entity parent: LeftFootHuman From 80b726539c540f464645d7ba3165106f397b6435 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Tue, 26 Nov 2024 14:02:54 +0000 Subject: [PATCH 19/40] fix surgerytarget check (#972) Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs index 8538b407f65..cbd2fba7dfb 100644 --- a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -109,8 +109,7 @@ private void OnToolAfterInteract(Entity ent, ref AfterInte if (args.Handled || !args.CanReach || args.Target == null - || !HasComp(args.Target) - || !TryComp(args.User, out var surgery) + || !TryComp(args.Target, out var surgery) || !surgery.CanOperate || !IsLyingDown(args.Target.Value, args.User)) { From 81e7366e9a010dc586d39db31d12084e8b361d9c Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Tue, 26 Nov 2024 14:03:23 +0000 Subject: [PATCH 20/40] surgery changes for autodoc (#969) Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 23 +------- .../Surgery/SharedSurgerySystem.Steps.cs | 54 +++++++++++-------- .../_Shitmed/Surgery/SharedSurgerySystem.cs | 45 +++++++++++++++- .../_Shitmed/Surgery/SurgeryStepEvent.cs | 4 +- 4 files changed, 78 insertions(+), 48 deletions(-) diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs index cbd2fba7dfb..65ca8c023b7 100644 --- a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -17,7 +17,6 @@ using Content.Shared._Shitmed.Medical.Surgery.Steps; using Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; using Content.Shared._Shitmed.Medical.Surgery.Tools; -using Content.Shared.Prototypes; using Robust.Server.GameObjects; using Robust.Shared.Configuration; using Robust.Shared.Player; @@ -39,8 +38,6 @@ public sealed class SurgerySystem : SharedSurgerySystem [Dependency] private readonly RottingSystem _rot = default!; [Dependency] private readonly BlindableSystem _blindableSystem = default!; - private readonly List _surgeries = new(); - public override void Initialize() { base.Initialize(); @@ -53,14 +50,12 @@ public override void Initialize() SubscribeLocalEvent(OnSurgeryDamageChange); SubscribeLocalEvent(OnStepScreamComplete); SubscribeLocalEvent(OnStepSpawnComplete); - SubscribeLocalEvent(OnPrototypesReloaded); - LoadPrototypes(); } protected override void RefreshUI(EntityUid body) { var surgeries = new Dictionary>(); - foreach (var surgery in _surgeries) + foreach (var surgery in AllSurgeries) { if (GetSingleton(surgery) is not { } surgeryEnt) continue; @@ -159,20 +154,4 @@ private void OnStepScreamComplete(Entity ent, r } private void OnStepSpawnComplete(Entity ent, ref SurgeryStepEvent args) => SpawnAtPosition(ent.Comp.Entity, Transform(args.Body).Coordinates); - - private void OnPrototypesReloaded(PrototypesReloadedEventArgs args) - { - if (!args.WasModified()) - return; - - LoadPrototypes(); - } - - private void LoadPrototypes() - { - _surgeries.Clear(); - foreach (var entity in _prototypes.EnumeratePrototypes()) - if (entity.HasComponent()) - _surgeries.Add(new EntProtoId(entity.ID)); - } } diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index cc097358dfa..51b289efcb5 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -609,19 +609,28 @@ private void OnRemoveMarkingCheck(Entity ent, private void OnSurgeryTargetStepChosen(Entity ent, ref SurgeryStepChosenBuiMsg args) { var user = args.Actor; - if (GetEntity(args.Entity) is not { Valid: true } body || - GetEntity(args.Part) is not { Valid: true } targetPart || - !IsSurgeryValid(body, targetPart, args.Surgery, args.Step, user, out var surgery, out var part, out var step)) + if (GetEntity(args.Entity) is {} body && + GetEntity(args.Part) is {} targetPart) { - return; + TryDoSurgeryStep(body, targetPart, user, args.Surgery, args.Step); } + } - if (!PreviousStepsComplete(body, part, surgery, args.Step) || - IsStepComplete(body, part, args.Step, surgery)) - return; + /// + /// Do a surgery step on a part, if it can be done. + /// Returns true if it succeeded. + /// + public bool TryDoSurgeryStep(EntityUid body, EntityUid targetPart, EntityUid user, EntProtoId surgeryId, EntProtoId stepId) + { + if (!IsSurgeryValid(body, targetPart, surgeryId, stepId, user, out var surgery, out var part, out var step)) + return false; + + if (!PreviousStepsComplete(body, part, surgery, stepId) || + IsStepComplete(body, part, stepId, surgery)) + return false; if (!CanPerformStep(user, body, part, step, true, out _, out _, out var validTools)) - return; + return false; var speed = 1f; var usedEv = new SurgeryToolUsedEvent(user, body); @@ -632,7 +641,7 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S { RaiseLocalEvent(tool, ref usedEv); if (usedEv.Cancelled) - return; + return false; speed *= toolSpeed; } @@ -653,7 +662,7 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S if (TryComp(body, out TransformComponent? xform)) _rotateToFace.TryFaceCoordinates(user, _transform.GetMapCoordinates(body, xform).Position); - var ev = new SurgeryDoAfterEvent(args.Surgery, args.Step); + var ev = new SurgeryDoAfterEvent(surgeryId, stepId); // TODO: Move 2 seconds to a field of SurgeryStepComponent var duration = GetSurgeryDuration(step, user, body, speed); @@ -671,21 +680,22 @@ private void OnSurgeryTargetStepChosen(Entity ent, ref S BreakOnHandChange = true, }; - if (_doAfter.TryStartDoAfter(doAfter)) - { - var userName = Identity.Entity(user, EntityManager); - var targetName = Identity.Entity(ent.Owner, EntityManager); + if (!_doAfter.TryStartDoAfter(doAfter)) + return false; - var locName = $"surgery-popup-procedure-{args.Surgery}-step-{args.Step}"; - var locResult = Loc.GetString(locName, - ("user", userName), ("target", targetName), ("part", part)); + var userName = Identity.Entity(user, EntityManager); + var targetName = Identity.Entity(body, EntityManager); - if (locResult == locName) - locResult = Loc.GetString($"surgery-popup-step-{args.Step}", - ("user", userName), ("target", targetName), ("part", part)); + var locName = $"surgery-popup-procedure-{surgeryId}-step-{stepId}"; + var locResult = Loc.GetString(locName, + ("user", userName), ("target", targetName), ("part", part)); - _popup.PopupEntity(locResult, user); - } + if (locResult == locName) + locResult = Loc.GetString($"surgery-popup-step-{stepId}", + ("user", userName), ("target", targetName), ("part", part)); + + _popup.PopupEntity(locResult, user); + return true; } private float GetSurgeryDuration(EntityUid surgeryStep, EntityUid user, EntityUid target, float toolSpeed) diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs index f5f58789d1b..66b81311859 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs @@ -19,6 +19,7 @@ using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Popups; +using Content.Shared.Prototypes; using Content.Shared.Standing; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; @@ -47,8 +48,20 @@ public abstract partial class SharedSurgerySystem : EntitySystem [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + /// + /// Cache of all surgery prototypes' singleton entities. + /// Cleared after a prototype reload. + /// private readonly Dictionary _surgeries = new(); + private readonly List _allSurgeries = new(); + + /// + /// Every surgery entity prototype id. + /// Kept in sync with prototype reloads. + /// + public IReadOnlyList AllSurgeries => _allSurgeries; + public override void Initialize() { base.Initialize(); @@ -66,8 +79,11 @@ public override void Initialize() SubscribeLocalEvent(OnPartPresentConditionValid); SubscribeLocalEvent(OnMarkingPresentValid); //SubscribeLocalEvent(OnRemoveLarva); + SubscribeLocalEvent(OnPrototypesReloaded); InitializeSteps(); + + LoadPrototypes(); } private void OnRoundRestartCleanup(RoundRestartCleanupEvent ev) @@ -91,9 +107,11 @@ private void OnTargetDoAfter(Entity ent, ref SurgeryDoAf return; } - args.Repeat = (HasComp(step) && !IsStepComplete(ent, part, args.Step, surgery)); - var ev = new SurgeryStepEvent(args.User, ent, part, GetTools(args.User), surgery); + var complete = IsStepComplete(ent, part, args.Step, surgery); + args.Repeat = HasComp(step) && !complete; + var ev = new SurgeryStepEvent(args.User, ent, part, GetTools(args.User), surgery, step, complete); RaiseLocalEvent(step, ref ev); + RaiseLocalEvent(args.User, ref ev); RefreshUI(ent); } @@ -302,4 +320,27 @@ public bool IsLyingDown(EntityUid entity, EntityUid user) protected virtual void RefreshUI(EntityUid body) { } + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs args) + { + if (!args.WasModified()) + return; + + LoadPrototypes(); + } + + private void LoadPrototypes() + { + // Cache is probably invalid so delete it + foreach (var uid in _surgeries.Values) + { + Del(uid); + } + _surgeries.Clear(); + + _allSurgeries.Clear(); + foreach (var entity in _prototypes.EnumeratePrototypes()) + if (entity.HasComponent()) + _allSurgeries.Add(new EntProtoId(entity.ID)); + } } diff --git a/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs b/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs index 37301ac81bc..1ba39493a22 100644 --- a/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs +++ b/Content.Shared/_Shitmed/Surgery/SurgeryStepEvent.cs @@ -1,7 +1,7 @@ namespace Content.Shared._Shitmed.Medical.Surgery; /// -/// Raised on the step entity. +/// Raised on the step entity and the user after doing a step. /// [ByRefEvent] -public record struct SurgeryStepEvent(EntityUid User, EntityUid Body, EntityUid Part, List Tools, EntityUid Surgery); \ No newline at end of file +public record struct SurgeryStepEvent(EntityUid User, EntityUid Body, EntityUid Part, List Tools, EntityUid Surgery, EntityUid Step, bool Complete); From dc703f6adb8cc033e88c41ab5fcafd43ad1bd0df Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:46:37 +0000 Subject: [PATCH 21/40] make any sharp item a ghetto surgery tool (#990) Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Kitchen/Components/SharpComponent.cs | 12 +++++ .../Medical/Surgery/GhettoSurgerySystem.cs | 50 +++++++++++++++++++ .../Surgery/Tools/BoneSawComponent.cs | 4 +- .../Surgery/Tools/ScalpelComponent.cs | 4 +- 4 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 Content.Server/_Shitmed/Medical/Surgery/GhettoSurgerySystem.cs diff --git a/Content.Server/Kitchen/Components/SharpComponent.cs b/Content.Server/Kitchen/Components/SharpComponent.cs index c67c3b8a4d4..a5d19c8b512 100644 --- a/Content.Server/Kitchen/Components/SharpComponent.cs +++ b/Content.Server/Kitchen/Components/SharpComponent.cs @@ -12,4 +12,16 @@ public sealed partial class SharpComponent : Component [DataField("butcherDelayModifier")] public float ButcherDelayModifier = 1.0f; + + /// + /// Shitmed: Whether this item had ScalpelComponent before sharp was added. + /// + [DataField] + public bool HadScalpel; + + /// + /// Shitmed: Whether this item had BoneSawComponent before sharp was added. + /// + [DataField] + public bool HadBoneSaw; } diff --git a/Content.Server/_Shitmed/Medical/Surgery/GhettoSurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/GhettoSurgerySystem.cs new file mode 100644 index 00000000000..cacf90817a0 --- /dev/null +++ b/Content.Server/_Shitmed/Medical/Surgery/GhettoSurgerySystem.cs @@ -0,0 +1,50 @@ +using Content.Server.Kitchen.Components; +using Content.Shared._Shitmed.Medical.Surgery.Tools; + +namespace Content.Server._Shitmed.Medical.Surgery; + +/// +/// Makes all sharp things usable for incisions and sawing through bones, though worse than any other kind of ghetto analogue. +/// +public sealed partial class GhettoSurgerySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSharpInit); + SubscribeLocalEvent(OnSharpShutdown); + } + + private void OnSharpInit(Entity ent, ref MapInitEvent args) + { + if (EnsureComp(ent, out var scalpel)) + { + ent.Comp.HadScalpel = true; + } + else + { + scalpel.Speed = 0.3f; + Dirty(ent.Owner, scalpel); + } + + if (EnsureComp(ent, out var saw)) + { + ent.Comp.HadBoneSaw = true; + } + else + { + saw.Speed = 0.2f; + Dirty(ent.Owner, saw); + } + } + + private void OnSharpShutdown(Entity ent, ref ComponentShutdown args) + { + if (ent.Comp.HadScalpel) + RemComp(ent); + + if (ent.Comp.HadBoneSaw) + RemComp(ent); + } +} diff --git a/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs index 2f95be5125c..67a7056a5a9 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/BoneSawComponent.cs @@ -2,11 +2,11 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class BoneSawComponent : Component, ISurgeryToolComponent { public string ToolName => "a bone saw"; public bool? Used { get; set; } = null; - [DataField] + [DataField, AutoNetworkedField] public float Speed { get; set; } = 1f; } diff --git a/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs b/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs index 9d96566b074..2c50343e05f 100644 --- a/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Tools/ScalpelComponent.cs @@ -2,11 +2,11 @@ namespace Content.Shared._Shitmed.Medical.Surgery.Tools; -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ScalpelComponent : Component, ISurgeryToolComponent { public string ToolName => "a scalpel"; public bool? Used { get; set; } = null; - [DataField] + [DataField, AutoNetworkedField] public float Speed { get; set; } = 1f; } From a3ccc297e60c0c400cd9bda7098f9af6b6838bbd Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:21:19 -0400 Subject: [PATCH 22/40] Major Shitmed Bugfixes (#1003) --- .../Inventory/ClientInventorySystem.cs | 12 --- .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 3 - .../Screens/DefaultGameScreen.xaml.cs | 8 +- .../Systems/Alerts/Widgets/AlertsUI.xaml | 2 +- .../Systems/Alerts/Widgets/AlertsUI.xaml.cs | 1 + .../Body/Commands/AddHandCommand.cs | 5 +- .../Body/Commands/AttachBodyPartCommand.cs | 9 +- .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 44 ++++++---- .../_Shitmed/Targeting/TargetingSystem.cs | 1 + Content.Shared/Body/Part/BodyPartComponent.cs | 6 +- .../Body/Systems/SharedBodySystem.Body.cs | 33 ++++++-- .../Body/Systems/SharedBodySystem.Organs.cs | 10 +-- .../Body/Systems/SharedBodySystem.Parts.cs | 81 ++++++++++++------ .../Inventory/InventorySystem.Equip.cs | 1 - .../Inventory/InventorySystem.Slots.cs | 19 ++--- .../Body/Part/BodyPartAppearanceComponent.cs | 3 - .../SharedBodySystem.PartAppearance.cs | 9 +- .../Systems/SharedBodySystem.Targeting.cs | 14 ++-- .../Subsystems/GenerateChildPartSystem.cs | 4 +- .../Surgery/SharedSurgerySystem.Steps.cs | 1 - Content.Shared/_Shitmed/Targeting/Events.cs | 10 --- .../en-US/_Shitmed/inventory/slot-popup.ftl | 1 + .../_Shitmed/{ => surgery}/surgery-popup.ftl | 0 .../_Shitmed/{ => surgery}/surgery-tools.ftl | 0 .../_Shitmed/{ => surgery}/surgery-ui.ftl | 2 + .../_Shitmed/technologies/technologies.ftl | 3 + .../Locale/en-US/research/technologies.ftl | 5 -- Resources/Prototypes/Body/Organs/arachnid.yml | 2 + Resources/Prototypes/Body/Organs/human.yml | 2 + Resources/Prototypes/Body/Parts/animal.yml | 3 + .../Catalog/Fills/Backpacks/duffelbag.yml | 2 +- .../Catalog/Fills/Crates/medical.yml | 2 +- .../Prototypes/Entities/Objects/Misc/pen.yml | 14 ++-- .../Prototypes/Recipes/Lathes/medical.yml | 60 -------------- .../Prototypes/Recipes/Lathes/robotics.yml | 83 ------------------- .../Prototypes/Recipes/Lathes/security.yml | 14 ---- .../Prototypes/Research/civilianservices.yml | 37 --------- .../_Shitmed/Recipes/Lathes/medical.yml | 59 +++++++++++++ .../_Shitmed/Recipes/Lathes/robotics.yml | 80 ++++++++++++++++++ .../_Shitmed/Recipes/Lathes/security.yml | 11 +++ .../_Shitmed/Research/civilianservices.yml | 52 ++++++++++++ 41 files changed, 385 insertions(+), 323 deletions(-) create mode 100644 Resources/Locale/en-US/_Shitmed/inventory/slot-popup.ftl rename Resources/Locale/en-US/_Shitmed/{ => surgery}/surgery-popup.ftl (100%) rename Resources/Locale/en-US/_Shitmed/{ => surgery}/surgery-tools.ftl (100%) rename Resources/Locale/en-US/_Shitmed/{ => surgery}/surgery-ui.ftl (87%) create mode 100644 Resources/Locale/en-US/_Shitmed/technologies/technologies.ftl create mode 100644 Resources/Prototypes/_Shitmed/Recipes/Lathes/medical.yml create mode 100644 Resources/Prototypes/_Shitmed/Recipes/Lathes/robotics.yml create mode 100644 Resources/Prototypes/_Shitmed/Recipes/Lathes/security.yml create mode 100644 Resources/Prototypes/_Shitmed/Research/civilianservices.yml diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index b14633bd0bd..f3442f8fd31 100644 --- a/Content.Client/Inventory/ClientInventorySystem.cs +++ b/Content.Client/Inventory/ClientInventorySystem.cs @@ -40,7 +40,6 @@ public override void Initialize() SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); - SubscribeLocalEvent(OnRefreshInventorySlots); // Shitmed Change SubscribeLocalEvent(OnShutdown); @@ -183,17 +182,6 @@ public void UpdateSlot(EntityUid owner, InventorySlotsComponent component, strin EntitySlotUpdate?.Invoke(newData); } - // Shitmed Change Start - public void OnRefreshInventorySlots(EntityUid owner, InventorySlotsComponent component, RefreshInventorySlotsEvent args) - { - if (!component.SlotData.TryGetValue(args.SlotName, out var slotData) - || _playerManager.LocalEntity != owner) - return; - - OnSlotRemoved?.Invoke(slotData); - } - // Shitmed Change End - public bool TryAddSlotDef(EntityUid owner, InventorySlotsComponent component, SlotDefinition newSlotDef) { SlotData newSlotData = newSlotDef; //convert to slotData diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 3bd6ab01faa..965f027ccff 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -262,14 +262,11 @@ void AddCheckBox(string checkBoxName, bool currentState, Action>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) AddHeader("ui-options-header-shuttle"); AddButton(ContentKeyFunctions.ShuttleStrafeUp); diff --git a/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs index 04fddea89b9..8f0ea8a36c9 100644 --- a/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs +++ b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs @@ -26,8 +26,8 @@ public DefaultGameScreen() Chat.OnResized += ChatOnResized; Chat.OnChatResizeFinish += ChatOnResizeFinish; - MainViewport.OnResized += ResizeActionContainer; + MainViewport.OnResized += ResizeAlertsContainer; Inventory.OnResized += ResizeActionContainer; } @@ -37,6 +37,12 @@ private void ResizeActionContainer() Actions.ActionsContainer.MaxGridHeight = MainViewport.Size.Y - indent; } + private void ResizeAlertsContainer() + { + float indent = Chat.Size.Y + Targeting.Size.Y + 120; + Alerts.AlertContainer.MaxGridHeight = Math.Max(MainViewport.Size.Y - indent, 1); + } + private void ChatOnResizeFinish(Vector2 _) { var marginBottom = Chat.GetValue(MarginBottomProperty); diff --git a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml index 8542914db86..a2da29e730e 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml +++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml @@ -5,7 +5,7 @@ - + diff --git a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs index d6a79a81c46..636fc8572fd 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs @@ -20,6 +20,7 @@ public sealed partial class AlertsUI : UIWidget public AlertsUI() { RobustXamlLoader.Load(this); + LayoutContainer.SetGrowHorizontal(this, LayoutContainer.GrowDirection.Begin); } public void SyncControls(AlertsSystem alertsSystem, diff --git a/Content.Server/Body/Commands/AddHandCommand.cs b/Content.Server/Body/Commands/AddHandCommand.cs index 3e006c539c7..eba8a7e5172 100644 --- a/Content.Server/Body/Commands/AddHandCommand.cs +++ b/Content.Server/Body/Commands/AddHandCommand.cs @@ -133,7 +133,10 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) if (attachAt == default) attachAt = bodySystem.GetBodyChildren(entity, body).First(); - var slotId = part.GetHashCode().ToString(); + // Shitmed Change Start + var slotId = $"{part.Symmetry.ToString().ToLower()} {part.GetHashCode().ToString()}"; + part.SlotId = part.GetHashCode().ToString(); + // Shitmed Change End if (!bodySystem.TryCreatePartSlotAndAttach(attachAt.Id, slotId, hand, BodyPartType.Hand, attachAt.Component, part)) { diff --git a/Content.Server/Body/Commands/AttachBodyPartCommand.cs b/Content.Server/Body/Commands/AttachBodyPartCommand.cs index 82f71619370..db8ad3c7db5 100644 --- a/Content.Server/Body/Commands/AttachBodyPartCommand.cs +++ b/Content.Server/Body/Commands/AttachBodyPartCommand.cs @@ -98,8 +98,15 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) return; } - var slotId = $"AttachBodyPartVerb-{partUid}"; + // Shitmed Change Start + var slotId = ""; + if (part.Symmetry != BodyPartSymmetry.None) + slotId = $"{part.Symmetry.ToString().ToLower()} {part.GetHashCode().ToString()}"; + else + slotId = $"{part.GetHashCode().ToString()}"; + part.SlotId = part.GetHashCode().ToString(); + // Shitmed Change End // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (body.RootContainer.ContainedEntity != null) { diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs index 65ca8c023b7..dc159188b55 100644 --- a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -23,6 +23,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; using System.Linq; +using Content.Shared.Verbs; namespace Content.Server._Shitmed.Medical.Surgery; @@ -42,7 +43,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnToolAfterInteract); + SubscribeLocalEvent>(OnUtilityVerb); SubscribeLocalEvent(OnSurgeryStepDamage); // 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. @@ -98,28 +99,41 @@ private void SetDamage(EntityUid body, targetPart: _body.GetTargetBodyPart(partComp)); } - private void OnToolAfterInteract(Entity ent, ref AfterInteractEvent args) + private void AttemptStartSurgery(Entity ent, EntityUid user, EntityUid target) { - var user = args.User; - if (args.Handled - || !args.CanReach - || args.Target == null - || !TryComp(args.Target, out var surgery) - || !surgery.CanOperate - || !IsLyingDown(args.Target.Value, args.User)) - { + if (!IsLyingDown(target, user)) return; - } - if (user == args.Target && !_config.GetCVar(CCVars.CanOperateOnSelf)) + if (user == target && !_config.GetCVar(CCVars.CanOperateOnSelf)) { _popup.PopupEntity(Loc.GetString("surgery-error-self-surgery"), user, user); return; } - args.Handled = true; - _ui.OpenUi(args.Target.Value, SurgeryUIKey.Key, user); - RefreshUI(args.Target.Value); + _ui.OpenUi(target, SurgeryUIKey.Key, user); + RefreshUI(target); + } + + private void OnUtilityVerb(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanInteract + || !args.CanAccess + || !HasComp(args.Target)) + return; + + var user = args.User; + var target = args.Target; + + var verb = new UtilityVerb() + { + Act = () => AttemptStartSurgery(ent, user, target), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Specific/Medical/Surgery/scalpel.rsi/"), "scalpel"), + Text = Loc.GetString("surgery-verb-text"), + Message = Loc.GetString("surgery-verb-message"), + DoContactInteraction = true + }; + + args.Verbs.Add(verb); } private void OnSurgeryStepDamage(Entity ent, ref SurgeryStepDamageEvent args) => diff --git a/Content.Server/_Shitmed/Targeting/TargetingSystem.cs b/Content.Server/_Shitmed/Targeting/TargetingSystem.cs index 0fcb0e7ed5a..889d8e7b301 100644 --- a/Content.Server/_Shitmed/Targeting/TargetingSystem.cs +++ b/Content.Server/_Shitmed/Targeting/TargetingSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Mobs; using Content.Shared._Shitmed.Targeting; using Content.Shared._Shitmed.Targeting.Events; +using Content.Shared.Body.Part; namespace Content.Server._Shitmed.Targeting; public sealed class TargetingSystem : SharedTargetingSystem diff --git a/Content.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index ec260399f06..2a7e3e5db3f 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -28,9 +28,6 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent // Shitmed Change Start - [DataField, AutoNetworkedField] - public EntityUid? OriginalBody; - [DataField, AutoNetworkedField] public BodyPartSlot? ParentSlot; @@ -44,6 +41,9 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField, AlwaysPushInheritance] public string ToolName { get; set; } = "A body part"; + [DataField, AlwaysPushInheritance] + public string SlotId = ""; + [DataField, AutoNetworkedField] public bool? Used { get; set; } = null; diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 9f54aacdd62..6a2796175a4 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -16,17 +16,19 @@ using Robust.Shared.Utility; // Shitmed Change +using Content.Shared._Shitmed.Body.Events; +using Content.Shared._Shitmed.Body.Part; +using Content.Shared._Shitmed.Humanoid.Events; +using Content.Shared._Shitmed.Targeting; using Content.Shared.Containers.ItemSlots; using Content.Shared.Damage; using Content.Shared.FixedPoint; using Content.Shared.Humanoid; -using Content.Shared._Shitmed.Humanoid.Events; -using Content.Shared._Shitmed.Body.Part; -using Content.Shared._Shitmed.Body.Events; +using Content.Shared.Inventory.Events; using Content.Shared.Rejuvenate; using Content.Shared.Standing; -using Content.Shared._Shitmed.Targeting; using Robust.Shared.Timing; + namespace Content.Shared.Body.Systems; public partial class SharedBodySystem @@ -58,6 +60,8 @@ private void InitializeBody() SubscribeLocalEvent(OnBodyCanDrag); SubscribeLocalEvent(OnStandAttempt); // Shitmed Change SubscribeLocalEvent(OnProfileLoadFinished); // Shitmed change + SubscribeLocalEvent(OnBeingEquippedAttempt); // Shitmed Change + } private void OnBodyInserted(Entity ent, ref EntInsertedIntoContainerMessage args) @@ -130,7 +134,6 @@ private void MapInitBody(EntityUid bodyEntity, BodyPrototype prototype) // This should already handle adding the entity to the root. var rootPartUid = SpawnInContainerOrDrop(protoRoot.Part, bodyEntity, BodyRootContainerId); var rootPart = Comp(rootPartUid); - rootPart.OriginalBody = bodyEntity; // Shitmed Change rootPart.Body = bodyEntity; Dirty(rootPartUid, rootPart); @@ -187,7 +190,6 @@ private void MapInitParts(EntityUid rootPartId, BodyPartComponent rootPart, Body var partSlot = CreatePartSlot(parentEntity, connection, childPartComponent.PartType, parentPartComponent); // Shitmed Change Start childPartComponent.ParentSlot = partSlot; - childPartComponent.OriginalBody = rootPart.Body; Dirty(childPart, childPartComponent); // Shitmed Change End var cont = Containers.GetContainer(parentEntity, GetPartSlotContainerId(connection)); @@ -384,7 +386,7 @@ public virtual HashSet GibPart( if (IsPartRoot(bodyEnt, partId, part: part) || !part.CanSever) return gibs; - ChangeSlotState((partId, part), true); + DropSlotContents((partId, part)); RemovePartChildren((partId, part), bodyEnt); foreach (var organ in GetPartOrgans(partId, part)) { @@ -424,7 +426,7 @@ public virtual bool BurnPart(EntityUid partId, if (IsPartRoot(bodyEnt, partId, part: part)) return false; - ChangeSlotState((partId, part), true); + DropSlotContents((partId, part)); RemovePartChildren((partId, part), bodyEnt); QueueDel(partId); return true; @@ -447,5 +449,20 @@ private void OnStandAttempt(Entity ent, ref StandAttemptEvent arg args.Cancel(); } + private void OnBeingEquippedAttempt(Entity ent, ref IsEquippingAttemptEvent args) + { + TryGetPartFromSlotContainer(args.Slot, out var bodyPart); + if (bodyPart is not null) + { + if (!GetBodyChildrenOfType(args.EquipTarget, bodyPart.Value).Any()) + { + if (_timing.IsFirstTimePredicted) + _popup.PopupEntity(Loc.GetString("equip-part-missing-error", + ("target", args.EquipTarget), ("part", bodyPart.Value.ToString())), args.Equipee, args.Equipee); + args.Cancel(); + } + } + } + // Shitmed Change End } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index cc892e0e778..7065284a1f0 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -44,16 +44,11 @@ private void AddOrgan( if (organEnt.Comp.Body is not null) { // Shitmed Change Start - organEnt.Comp.OriginalBody = organEnt.Comp.Body; var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref addedInBodyEv); var organEnabledEv = new OrganEnableChangedEvent(true); RaiseLocalEvent(organEnt, ref organEnabledEv); } - - if (TryComp(parentPartUid, out DamageableComponent? damageable) - && damageable.TotalDamage > 200) - TrySetOrganUsed(organEnt, true, organEnt.Comp); // Shitmed Change End Dirty(organEnt, organEnt.Comp); @@ -75,6 +70,11 @@ private void RemoveOrgan(Entity organEnt, EntityUid parentPartUi RaiseLocalEvent(organEnt, ref removedInBodyEv); } + if (parentPartUid is { Valid: true } + && TryComp(parentPartUid, out DamageableComponent? damageable) + && damageable.TotalDamage > 200) + TrySetOrganUsed(organEnt, true, organEnt.Comp); + organEnt.Comp.Body = null; Dirty(organEnt, organEnt.Comp); } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index 1dcc1cbd86b..fabad1ecd34 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -34,7 +34,7 @@ private void InitializeParts() SubscribeLocalEvent(OnBodyPartInserted); SubscribeLocalEvent(OnBodyPartRemoved); - // Shitmed Change Start + // Shitmed Change Start SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnBodyPartRemove); SubscribeLocalEvent(OnAmputateAttempt); @@ -117,11 +117,10 @@ private void EnablePart(Entity partEnt) } /// - /// This function handles disabling or enabling equipment slots when an entity is - /// missing all of a given part type, or they get one added to them. - /// It is called right before dropping a part, or right after adding one. + /// Shitmed Change: This function handles dropping the items in an entity's slots if they lose all of a given part. + /// Such as their hands, feet, head, etc. /// - public void ChangeSlotState(Entity partEnt, bool disable) + public void DropSlotContents(Entity partEnt) { if (partEnt.Comp.Body is not null && TryComp(partEnt.Comp.Body, out var inventory) // Prevent error for non-humanoids @@ -129,11 +128,7 @@ public void ChangeSlotState(Entity partEnt, bool disable) && TryGetPartSlotContainerName(partEnt.Comp.PartType, out var containerNames)) { foreach (var containerName in containerNames) - { - _inventorySystem.SetSlotStatus(partEnt.Comp.Body.Value, containerName, disable, inventory); - var ev = new RefreshInventorySlotsEvent(containerName); - RaiseLocalEvent(partEnt.Comp.Body.Value, ev); - } + _inventorySystem.DropSlotContents(partEnt.Comp.Body.Value, containerName, inventory); } } @@ -199,7 +194,7 @@ slot.ContainedEntity is { } childEntity && protected virtual void DropPart(Entity partEnt) { - ChangeSlotState(partEnt, true); + DropSlotContents(partEnt); // I don't know if this can cause issues, since any part that's being detached HAS to have a Body. // though I really just want the compiler to shut the fuck up. var body = partEnt.Comp.Body.GetValueOrDefault(); @@ -228,14 +223,17 @@ private void OnBodyPartInserted(Entity ent, ref EntInsertedIn if (ent.Comp.Body is null) return; - if (TryComp(insertedUid, out BodyPartComponent? part)) + if (TryComp(insertedUid, out BodyPartComponent? part) && slotId.Contains(PartSlotContainerIdPrefix + GetSlotFromBodyPart(part))) // Shitmed Change { AddPart(ent.Comp.Body.Value, (insertedUid, part), slotId); RecursiveBodyUpdate((insertedUid, part), ent.Comp.Body.Value); + CheckBodyPart((insertedUid, part), GetTargetBodyPart(part), false); // Shitmed Change } - if (TryComp(insertedUid, out OrganComponent? organ)) + if (TryComp(insertedUid, out OrganComponent? organ) && slotId.Contains(OrganSlotContainerIdPrefix + organ.SlotId)) // Shitmed Change + { AddOrgan((insertedUid, organ), ent.Comp.Body.Value, ent); + } } private void OnBodyPartRemoved(Entity ent, ref EntRemovedFromContainerMessage args) @@ -244,18 +242,32 @@ private void OnBodyPartRemoved(Entity ent, ref EntRemovedFrom var removedUid = args.Entity; var slotId = args.Container.ID; - DebugTools.Assert(!TryComp(removedUid, out BodyPartComponent? b) || b.Body == ent.Comp.Body); - DebugTools.Assert(!TryComp(removedUid, out OrganComponent? o) || o.Body == ent.Comp.Body); - - if (TryComp(removedUid, out BodyPartComponent? part) && part.Body is not null) + // Shitmed Change Start + if (TryComp(removedUid, out BodyPartComponent? part)) { - CheckBodyPart((removedUid, part), GetTargetBodyPart(part), true); // Shitmed Change - RemovePart(part.Body.Value, (removedUid, part), slotId); - RecursiveBodyUpdate((removedUid, part), null); + if (!slotId.Contains(PartSlotContainerIdPrefix + GetSlotFromBodyPart(part))) + return; + + DebugTools.Assert(part.Body == ent.Comp.Body); + + if (part.Body is not null) + { + CheckBodyPart((removedUid, part), GetTargetBodyPart(part), true); + RemovePart(part.Body.Value, (removedUid, part), slotId); + RecursiveBodyUpdate((removedUid, part), null); + } } if (TryComp(removedUid, out OrganComponent? organ)) + { + if (!slotId.Contains(OrganSlotContainerIdPrefix + organ.SlotId)) + return; + + DebugTools.Assert(organ.Body == ent.Comp.Body); + RemoveOrgan((removedUid, organ), ent); + } + // Shitmed Change End } private void RecursiveBodyUpdate(Entity ent, EntityUid? bodyUid) @@ -331,7 +343,6 @@ protected virtual void RemovePart( Dirty(partEnt, partEnt.Comp); // Shitmed Change Start - partEnt.Comp.OriginalBody = partEnt.Comp.Body; if (partEnt.Comp.Body is { Valid: true } body) RaiseLocalEvent(partEnt, new BodyPartComponentsModifyEvent(body, false)); partEnt.Comp.ParentSlot = null; @@ -1004,6 +1015,18 @@ private bool TryGetPartSlotContainerName(BodyPartType partType, out HashSet 0; } + private bool TryGetPartFromSlotContainer(string slot, out BodyPartType? partType) + { + partType = slot switch + { + "gloves" => BodyPartType.Hand, + "shoes" => BodyPartType.Foot, + "eyes" or "ears" or "head" or "mask" => BodyPartType.Head, + _ => null + }; + return partType is not null; + } + public int GetBodyPartCount(EntityUid bodyId, BodyPartType partType, BodyComponent? body = null) { if (!Resolve(bodyId, ref body, logMissing: false)) @@ -1018,12 +1041,22 @@ public int GetBodyPartCount(EntityUid bodyId, BodyPartType partType, BodyCompone return count; } - public string GetSlotFromBodyPart(BodyPartComponent part) + public string GetSlotFromBodyPart(BodyPartComponent? part) { + var slotName = ""; + + if (part is null) + return slotName; + + if (part.SlotId != "") + slotName = part.SlotId; + else + slotName = part.PartType.ToString().ToLower(); + if (part.Symmetry != BodyPartSymmetry.None) - return $"{part.Symmetry.ToString().ToLower()} {part.PartType.ToString().ToLower()}"; + return $"{part.Symmetry.ToString().ToLower()} {slotName}"; else - return part.PartType.ToString().ToLower(); + return slotName; } // Shitmed Change End diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 8158b8c2f62..e5a431a8135 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -43,7 +43,6 @@ private void InitializeEquip() //these events ensure that the client also gets its proper events raised when getting its containerstate updated SubscribeLocalEvent(OnEntInserted); SubscribeLocalEvent(OnEntRemoved); - SubscribeAllEvent(OnUseSlot); } diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index 574ffeedafb..d369f41d32c 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -318,7 +318,7 @@ public bool NextItem(out EntityUid item, [NotNullWhen(true)] out SlotDefinition? } // Shitmed Change Start - public void SetSlotStatus(EntityUid uid, string slotName, bool isDisabled, InventoryComponent? inventory = null) + public void DropSlotContents(EntityUid uid, string slotName, InventoryComponent? inventory = null) { if (!Resolve(uid, ref inventory)) return; @@ -328,18 +328,15 @@ public void SetSlotStatus(EntityUid uid, string slotName, bool isDisabled, Inven if (slot.Name != slotName) continue; - if (isDisabled) - { - if (!TryGetSlotContainer(uid, slotName, out var container, out _, inventory)) - break; + if (!TryGetSlotContainer(uid, slotName, out var container, out _, inventory)) + break; - if (container.ContainedEntity is { } entityUid && TryComp(entityUid, out TransformComponent? transform) && _gameTiming.IsFirstTimePredicted) - { - _transform.AttachToGridOrMap(entityUid, transform); - _randomHelper.RandomOffset(entityUid, 0.5f); - } + if (container.ContainedEntity is { } entityUid && TryComp(entityUid, out TransformComponent? transform) && _gameTiming.IsFirstTimePredicted) + { + _transform.AttachToGridOrMap(entityUid, transform); + _randomHelper.RandomOffset(entityUid, 0.5f); } - slot.Disabled = isDisabled; + break; } diff --git a/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs b/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs index a0150f82549..2e7da47fa58 100644 --- a/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs +++ b/Content.Shared/_Shitmed/Body/Part/BodyPartAppearanceComponent.cs @@ -39,7 +39,4 @@ public sealed partial class BodyPartAppearanceComponent : Component ///

zr#hb`D21d{=Y^@#8`CCUS$$M?ZpBPkhvA&;as+#eZ&{YBpTsMe-FnoYW538dlzO+C zSUCSYUBh=2VWn?hH&K&Ydd-iowSVYhbsHhMRMVSVYuJ+XsMu*7cp7drSG*n=W4c`gYl=FHwQRK$^xIlKZQu zyjvWU4Za}|eg3MqZM^dfC-Xd?H}WFomO6aD*Dqa%IOJm~q38DE2M+G24tlMz=9Ed|{?#IlGD%BeBUM>{F5GpybRG#Glx- z-SO#Hsz3QfP|Ie!`kyltJ0D$Fm5_aEei@+%945<^pj~Pd;$KBnV-LTMTb`>?`d7x* zI$yQYTjD7-aZ4Fx_`b%F?pc5> zJ=$HmS@TI35J#wfP(DVg^J2NTMD-<9M9w@=PL%3#@lARzTY(ZG4%Jib8eFA@8kRZA zg+_~*Ewg2m8?^YJUcFc8#b-}7j92Eu-YDsH*&WR3-*2rUHpg~n2Q&D}gAX&15`k-C zWoho>MwA+&^zim`0ei+%YD^7yGm^FY(x+*vB0DA|+;Kj6ByxXXIZRcpz9t+dwT|gs?F4)%n@J z7vHo`)yf{63|o_Qm3$)BwE6;8sh8t7s$8_g8^(*PYZGe<8ZhpEqk15X-psM|cpH96 zKed=9f9wwn^%W}!I=T!}eYWXz+c5A^ovHF}+<>DpV{!gECp9a-3+Put zZp|o@ifJf0U)5^~?7}WSQlIZQ-UoJ)%aHb3SkGhgj|ZzrJb}n9RT#xz|&@yxYbM@~N~4Q07| z>a<{6tl?9?mob-;=caDla#7y4R`+<&&K0&*lZ*D8(GoB93DQQoVvX8G$m7x z@_ryiy;QEB!yzcl!Md_xto+*1?ZD=fc@>PR^+mcq8$JYAzT8>&^x1yzQ(`XGC1>s5 zKVJT7Bk72Qa(!Wd`>E#73neF#EeY@HwU3J6w^+vo8KttoW1}A(JRUk*m=h^19|VcY zA_EA44_kPAgy`xE*d&TKz=M(j4?0s1HhH@e2BlN=U{0DAC=0eB;7Q*bzya(6EbS=) z-V_2AroU5CS3m>-d;lH^D)3=2xkP~;YzdbLz6-@j7<5U6=dA~Gwy=g8vN!+~hrl6F zaAN`84+GmN3DxCLX+&EilW!2Ena^*@DY6_5(q_IrJYbxc1;F8)*x0S-uEDjdL| z$pk!3Qxm6+{|U;J$>oul6hH_Cf+Of4jur|_AZb!G;b=fh8;-+jk>Mmfg$CE6;s6Sb zf+3Mm*q$P7(!}6VZ~{dO3&&{zR5*!-0^nFY20-DdSPYq@ zwFE__5KUMd9}<{Ox(~?%K(d)0OA|uEiMy;#^W9RdLE_Os1F#3^Oe%}d{V`=v z_W|s9Bq5(@Z48Eh*TjNuXlZHTG=C^L0vs+_i$YX13W3Ee%?J}i1j7NTB?&7P1Xz-T z(GU$e0Ex%q*t1v+J($obsL=BJv<28uR1%M5MB)J;C<=okqVPnNmOYw4L}7>+Z8!>) z{G`vK(rNzxm$tBdpt@g^zL(Ag*Y{r%eeEeb;PBVc*CB(x)J#z5QdLhNqzuz z$xjgL>lDS4#Pk5b{o`A~{w=5fhhiX*@!Hx{3I&eCXrbUZ8jb=dzkT~hdIivjJv%D}A)+zFB2x596HfxiAXKi~53-&_I;{k6!y;`bL_zv%i` z4E!tQU)A-Cu7AbAzf%5HUH@-%N&dJ@0Zi}�RfRxP1W^z-!hr^1eMr5HsEIm~w#z7kLUEp{g|YaMgxK0;Dk_l$Uf@NSZ)&v5-t*OX658v5!D{2~ zyi@ybkePvHLKiIF>yz%G$1_u}t7 zI)35(1NVinlXri|Vh4zu`M`=DC+0unEtpd0~hw@vFG`?L%r^a zTQ9|F*+SUa=8~1Smo)_dt80cY$pvsA@#Wcai-M8ykkh-jh1rj+J1vRo z&E+Ln4!pP+cxbsKF=QEx`!@NDB{V4H-oXUyvNLtQvD4^V*|D{J0z64Skv{4Q2&mYHVqA Jb@!pr{{fFOf4cwx literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..93064d56057e1914cbd90a0c7481a5dcb173ce79 GIT binary patch literal 5779 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 bQafR*5h-M*;T%VpBm~oADdU10XUl&8v`5f1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb9ec75e2c4986c643ce9db327df05a65d589f5 GIT binary patch literal 5646 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 i--lImWLj$a+~2q(F-$A|4V4qh(2A7!4;P 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_hand-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d0660f1bc15769051dc7884e65d25dd1e40da746 GIT binary patch literal 5434 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_leg-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/l_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce036704ffc199c011e4f49040c89f20854d628 GIT binary patch literal 5949 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 lyy=Gg{C4p7Wm0dEft%YnfnyM}y% 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/meta.json new file mode 100644 index 00000000000..bf863d580f6 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/meta.json @@ -0,0 +1,95 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version by Timemaster99", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + }, + { + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "groin", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + }, + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_arm-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd612a5d335c7cf85b024c32acf048cedaa7591 GIT binary patch literal 5824 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 SXBDQUaGI5aWs$j0%>Mv~8xZsW literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_arm-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_arm-2.png new file mode 100644 index 0000000000000000000000000000000000000000..69be000d9086749712af6c7668eff6fb67a2e28f GIT binary patch literal 5666 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 L`7-idB2xbY3SFu| literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_foot-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f1b5121d0dfa15be97a9d0b789cbdb79f3ee3e GIT binary patch literal 5688 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_foot-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a6fb2a71c8d05ef05dec6112a6deff4b07e97a GIT binary patch literal 5256 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_hand-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d557eae814aea4780a8c08c99b2c61373cba41 GIT binary patch literal 5349 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 B8rT2; literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_leg-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..effbab2037d55796d60576cd062c367f5bf0eded GIT binary patch literal 5899 zcmeHLcT`hZw+|q_2qFS18p41AlS%?fAkwP_5y3(FO>zSl2!S*LDj-rUh@yxf!9r7p z<_rR(h$sjQf?@+jY^V%aP!JTm?DLu>>> zd}BNyDF6OajrS3H^|REq(?$?ZqrF<}*ZhoPf$5%owSvBguCC6EKXyLt@6j8uPYHUZ z-Wu>wrLa7I&AE+XvBx`dijpL)r|JX`Hr#4mPiwm~dusRtl3@X?7(LJs{Fpl>(2vtH zN_gk!Q+#dHaW@^CB-Nk%~Y$!op z-FbvgD<#kAIf%_iNzR669nFrqZK=Fyj91f1twtVk7S8fn7@k^C>eOAJTjIgkeu@;T zb7Q%Q`wHb=lfsRv-lnR5IaY71mKc68Io_5r}IN&ed{ZQZTjOFIOcIG0_U7L>1 z)v3H(cFm7J68QVoz@Tw-V|rP44H0T+7_fc$WarIEQCHe+_l3}dGeDkkX^!=q^tZis ziTURB7p$Az=v&_%a&@h;9^W=E7#iuQ`gN_apZ609V$YAvEdtn=`UvnVGCZKd% z!(WBZGk6i2^(Y&i2M^PWt+eMko8d6tato={2={VHsnw{&2#vBJJ9&yO#ZE8$07XL^|K4Q*B(@Na0tu)3IXnmwJ*9l!i0Ox>vAW6J`}y;}^@8+Lfq9zkIRe?^6ct zSmU=0jj*?m*456>xpVflQnXn28a9M#9~vImUM&X z)-&Zxg$?1R&vh~c?2V#|H^U#7{aGr;`#;FA$o3APDbAR7?;aGR z>U6Hm>L-C8y~Osx7dQM}7}Ye2v_aWl_HOvK^sepu0A`y(%GSEx<&)<}%fOBfoH(8U{KDR(Pxodkjlm6mOWNG5!O|?kz%Dihu(4?z&*630Z zcWMzszdR&G*o6K^&$iU#*J<6*KZ=?Hd(N#*i9S6u)k`lHVRMQMM|FGs^a6z8QG3#_ z_1v6NycM)#|2t@}$$I*soXo6R=inAWqq3(QHzIH9?1AOu{*lIw*@bTmjK@2fJqaeF zOZdFjE7?4++w8G^x8Al7_O!a!i#sRmChZ8p$B$aN6kV$EZT3&O-G9el4Hup>;<7De zah3UW#B|lgRmNK`dDN(6?f1bXP!?os30uyjmUhq0n2tL`va9G_*9@tzDP9-#Jkvq> zl#vmZ*fBJ%I>wxdU7Eu!dU5@E-9KvD|0wI?HIXnA!Iy--PwZShm z$%b5-N4vwqj4w3X|*_3NjzRI+2xCm!PwMB>8FIrNa+aD2ZL}Q7RV9n^c;dt|;fXe9UvNMtAN>V#fMKV*66=IeCR9hi8HHO#{ok7pD@14eJ#aE|edZ z2kV+o4&50XYK;hd{~mGWIq!nmqfi%k40@de+>ELP9JW>NgS{M~`y`BO#9@9=JNm+mD$P&7`nU_RG}l#8eo7 z0}247m=hDrr;2GP87>ummWr_`q)bH+O+y9HeUQ#v9*87jh!`B&RSby;sAXzMJ06Qo z^>uOk3<0-js7Qezj*7)5BqU%GtT0?&1Qt)BP_Q@xmOwzm8fboEtN;+BWBDdhh))qZSWGM!19D(hK0GS^yCK~@ z={{dAq!dIzoH&^kO!jx00*L)DS>O34?U9A^ts}7cSKRNkzr-$6hPCK)stcDXl)C5X zLPJT%r?R+Ah((n>T9E)NYc_*|#xVdknuy1NXax^Q~7> zC>9LGB(QB5Ou!n=vIYS(5wIen8DtU}O=8;+nM5|pip>IL-msWdH!hC@!0CiIKm>@5 zi;a+VNC~Gp`gqb%1Ptz9iBAk5V8aIR9Drh3+ywr=U49S;TrB{keBx~g1PVN!4bFy4 z!c#tZEkj%b^7wEqN>TARj1@s#-4hN;tDxh#mC_B4yKp3NSx~zz0MiOXeqx^{I;)3B*Q#@cQw&V86(r z|4CffCoB8z&yfS!38Sg z3c2)is?5LFPlyDid4MTHa;KL?AIt{7jUwZr}|KI~))-z+h(-6t8mbipej z_UlsknJ?+0^I!aY&clCk1Q`0~AV0+KPr826^+OE&kn+#!`bpOhG4MmmKdbBijV`r+ z4^v<)yaP&rk4m8k$#3v6ONp`E-38$#`_2lQ4NFwxJl66N2(7cyOKy*))&f|lEbyee zDvzls>8q!THb5Z4Kz3C_qv1OE*1P`Z(B;+Dd4zuB?CJXKG9ceCsYoHTCAayRZO(o1 z`JJi45av)Lxo;|dWzQ8xeR7%%0daa|Nc;J|jVu>|rl~u~9-4uVQ?-w`-Uh}|3ez3j ud{UvW*Mh-0hDq`*+dMy>nANOy`iRYjm7y!H=9z<12v1jUms+RrwEqDZ8z8Fy literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_leg-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/r_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e22421eb82134075d6f36cb60830e06ee559ddf GIT binary patch literal 5805 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 C1^B!G literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/torso-1.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/torso-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1480d69865ccd73a96c70d51b96a6183ccb392 GIT binary patch literal 7778 zcmeHKc{G&$+aF8y5V9|Y#-LDRW|+a)myvaZs3|2th2t}x5 zm!+iaNm7<%DI~l@Jv}|={hjlk=bZQV-!pUWd+z&MKHuy5T-Wz|=8CYiFyiLi%LxDg zxJ`^v*34hst?Q4S%zGixYXkt`dggC)l5UOh0eVs?1fmBXNcZ!^1M$8@0s!DU@G`}Y zDud)fZTekC>U$oHX?W>DhBjyHf+|(yRolE=f6-=rL{6BWt|ks>FWOx9xv}|K;JbGU zFU#%0h8Tok#jp0 z#_M`?Mhcd>O3v>6klqq$7@gp^$7U|%p@!;=maay7wKaHko&TG9^Xf?xWc`u4Z{uzc z_irruv}CGEFZxav>v|6PW6{`a#U5R`+8Y_GhJswo3_7n(t8%$b8uVF5eR6P;&>a{JcYp`@}%gHy7mZ`0IxHMcrN$tF#ZRspMu15UL#f#TjRu zJ=^bhM9>=iYEPbJyyS*#>|VG#h}T5U7cCkLOFj%3aP}VX=guh?BBUo7rQxAo8k!+A=jAkC$u`<8EYU|S193#R3ZI~I!Hma-s~8urex=6*}m8DN2MCCT3diFgV)5( zqmdJ-W+e}Vob)4P6HlAo%CkM8l`ZC8_#nyN-Myn<^uau1JfyFBx-Lu-eN=1txjTjJ z+ZE_rW9b;BDc2Whot~H!LOQ;$Kgq$87%Fta-Y?Pi#GoZ9pu8bkWASL^*SX;gPgRjprY^mdmZHod3h_H3lfCFPR2dtaMg_*K^B zJMqQ)Xt;L~y$%YcmM>-(0=tdZX$BHaw>ic-10Kj+xFN_`j)-ux7z}Vsr$OR(r4HV1 zu0E&8Xkg0@_Y{rvNwIZoDw2?%>7u1Ltnq+j++K;ki_~L@YX%KYj)@yY53^N<%^FGN z$lR^UYYa}W3B4x5Is8ljV5c3~Rn!_iRC~>c&*%@0+p!(5(jIX?seSV7bBXL-i&beL zc%Sh*&61H4{&vk#9;G9l~%1?_{@%Mn&*bM za9YFJw0B1BA8E^&9A2u3=?p$!Th4pu;q=eCn4;DOMLF42=b;B*uZkIUTo5abm@dXb zD}31>IkJ`J-%`7eI1&HqaiGenBi94+M=q|)V+psv4ILp)yte8P4(F6}c{*SUDk+4*w~-5#rP(lSl;EIsOab;p~mH`h^% zmHADLW#K8PE9ELP#_Wd^4fx&410#Gi1@1h$rNxi6)P3To(@N@O9qGA2d!2oGNu+t$ z*-1s(C#52 zQcgVSpd4zxzxKYA7hgEzS~4y;GqC0H?n7et#sv1<)st=zaB&mr9`kScQpxk4UsCo9 z-!z)%G@N+lsyOKUo149_ua;S|9g+tTtUK-mTW7~5adc{{?=ehI6)0J%W=I@D+-sh0)=Mcl5@q?$Mp36P@5WQVJ& z;RndE;Zu6~CTVUc!T4+jzUS!MbUCTr_%YZQ^uAX|D@k;h=O<=Lb zf z0SO02&^L=NeNYySUp+va~5P@*8vowElQPB9O^kSdW4Rgi#1 zw#o0D>d@t#yN!r~kekTbjxU}%dF+cHgG?x`BH$d$E3!!=%@KZLYI`AQS@h~;K|#Vh zomRvLZ|wnHK7W_J$=qLJJ%kNcHSs)rd7)FB@P-hsRrZ&Rw-T*<@uhD5*T{wW`=nQ! z)+TbB#k14m_X{fe8u6Nyw3>z*mDwp4o<^oOm7ImQ`$||(!)&-6E`+dq^qnb5BpWYcR5|CwNwtr7pXFJq~qasC-7CgR!EY?CGn9m)26})}>j&FzP>`G8i7ZmSZ1VmL zm3rUVux3H-*zx0nK@O-mgWQ548CaimsfeM*IyP4|`rCl2QNP%P;a-;D@cOgg*K$@r zHAT(DG(P>#R|biG9}{bPCS*?H-usZ^Zl~^bsY<6zL{RwbwVc)PS@*t;i}&6Kc;pC< z=$Qq{YkcIF_I8n)Ho;qd9I(C}(^s6acY%zSIcK&5b+#{|y&$BzC8k%mZb+8*D9DC; zRLD%W zJPC^EbGw_V089)OOf*}J)&VaM6}fr?4E40Ju&->k@88>|%meaKlm;0oD8sHlt zUjN$L(iyUJ`(#|P!^+Bnk4aU9!4uBcnT^%b=ETAa zw4eGpfJ}nf7ahIV7V;Vwd@ZKL2Wp9T9+?_y%5leVnzrCOJ@f zKk9yHS0-R%3cXQ28*X|PWVOb@Csb9D!D|KkD92vrJdcOF#d(R7j;K z@s#M%Q?Dz)rw2k(;v-E@M13oqDa%T7JR~a_DNu0?4T^qqbcR%<5Fk5H*XY7r<>i|$ zsNvO|nbc$26((I~DYcKxIjhIM_p){s>3iFJ@UvJyJvS^_s1)R?ynMeH`_WS)Lqb4I zsXmg8wu^PS$b-W-;N4;G*XEh-$!2&{(4Dsp(g)q)dxv}9q|8X?dT@WqRlIhq9(Sj= zPNBgEn!GG>+&vA|s@F&N>t9>2@)_WXlz)pq_}*^pt4BN0uu^IocS87Mf#RI|p!Y-o zV0IDjP8g{Tm%|4wfvh5Nx8m1(Jh&Xy5-M6nkE=f!V1;>IUvg}#losK0cK>)-5rM7@ zduigRS=|H&-SDwfB-+|EUq;3(41YWIHLs@&&N5xxXlihZyC=otUZZ;1W}Q*oO3sI9%1qX;!Et-J@xlKJBfim@YCE*U${6Fe^aQP21R zE$gGTkR`KIX0lfUr_<+#?A7l3KU9Q~ebS7s;YQ`mG_v^W=Bo8j&-dDf9#gwmF6-6J z6|3%;5}O4GV3Q>NDr>*V3Q_fpG#F*{Hu*U^>|R2z3@BWv^7N)@+Efav?pXn*b% z(?wTx0DvWwXkcJzVqoy+V8a||QqRR{88_&PH#!}wFjU|<&g<1;sbR+}()dTzcm z-|35bi_G6AJil{(DL;=ka*(GiJC`>@AV!R?_tvPS9UVA++VkX_6g}y*)Pp?yk)b?E z8p%T3iN2TBatroO>`pmwD78xM_Jo4_a6&ya_Qi4Q(>IalMU!}qSV1@&D}6Cx&^@=@ zWaH<7y^T6ED+2H0TWwjTn^_esrI3N2bykLpQ!-Lr5A4X+U5+FLU16eIH^9}M@dILjt3&N{}5FRghvINCp0?_$5c4tTLZ?L08$h+h5Ap^HCG0qfkx)un;)C2#FkK~C) z|AHseezL&i1LBMEguoP`5E2RUy9bSK$Y6r}4Cp_4&}^6kJH#4Kqj*!XctZxBOqc#0 z0*C$O@99nT*iHwBh2TB#B&I2ixhm{$OB$J=Eq{4zQQ$%(d2V|#$^M%qok;kLtiQ#! zrP)sB_duBLzi|I%{b%mm#!M?TS{+5fdT)hig3O?MEdfQVl`CVZbn? znlczpARxdPXAB;UMIhiXRj4wa0K@$TWkROWF=Q-$3yKM@NMzz*uuLNrED}sm#$&*6 zRXiMwBw*oSI0mZ>bA}^TRpI#GAdXUr%&x?E{2tX76pjgnL^xwqoRtw^B|HoZhGUs1 z7&Rme40Fait2slJRNzSLHWUu4euP3LVVLD4k}xiKh$q=)Td_sBx}K$p7D!1E`j^Dg z14Ab;9hiH7NXAioXn(0}h$Q?mI%bPcn5vQzlMbX39ImW}P*M5I=s2EAWA@?}Dh#Tq zthBA!DvUZa9VWGytxjbEY|EM1s2fo67&?V&L!o$RfwqDIZh8JvqnR5DhoNIo7&@K_ z3RQxuL)FxwDmE~rI!s9&stkrQCBNBIa72RN|7E?keSn%jif&A#G1vFo7X8>$$M9Z1 z-hRA#5VtoI5V*Z9m{t6d0u95!|EM?<>xT;KiXpq;ndisPhW%4c{145bMnGWH)YPD0 zEEJ9h!x3;Lurm^)1jb;HcvUz8gLhVeZ?o_Vokk(heK1tKo(q#lCRfY`-R24?_p?;; zf4BE>#c$PtNf{Wb2L6jOI0*7HS;*Fj@n^Q0kpIPp=C;9aM-0>Nhm3i2F;7CsucPoM zU(8tlo1dR`_-`%&1pd3oKjQaay8fl>A2INcjQ{Pff9d*14E!VGf4l4djV{i=hABLm z`47m4IVutM_=hsbtewtgMks*k_Lu$C9;SrD)7Xv%0PsBBx>ynq@$6#?chODIhPyue zu~USLJ&q_=1^}?KnV|G+dYq$xbaGGlpt+!3G~veL3KZ(9wf$V)vkvqX%QlfbgFo!Fiz^gX!_*bdn}#lv zCQq01G39n$=@P45k(J8wdCw;89=HXa^xqKR%1R7!Wrr%GU%+#(x&|R9cM`~jGRm8` z3XW{pD(}g7R?e$WCIt%@IO|@4wJQngx4@dt_KA9CL3Zt2VX%pFo-b?gSD8FT4z_PQ z5fx0l-Y0uBsVUttpz3?f*t{=}bvv!Cn_3I;sC8TFnP(B*p2sKJD|06icEpz{nSydp zMQL+y|Hz(YDadWCi4IoUU;3=Q-kE(y;NEpB&mP~56rx>H1zVrJQWG7LD6cgtt8un| zG|1L-E~?zK1yD6el5lKFM#rH_zX4h;+HI$U8$QmTON$*^Hn-3`#abaY!lY&iX0*yL+V#rT!8-wi5Lf Y(JADo>XLce*0x?v3@uP4`e)An4@LUZ-v9sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/torso-2.png b/Resources/Textures/_Shitmed/Mobs/Species/Cybernetics/zenghu/zenghu_main.rsi/torso-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bffee42c20514207568ecf65d6f45bc958f939 GIT binary patch literal 7157 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/ears.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/ears.png new file mode 100644 index 0000000000000000000000000000000000000000..9966cc2ac2d83ac43d9d69f6ed1be7e72a3eef05 GIT binary patch literal 418 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 A^#A|> literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/eyes.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb6412e1c3757aa7e0c5d39147b7656e49a9dc3 GIT binary patch literal 1047 zcmV+y1nB#TP)U_Z!1?)S_8 z`}uu;|NP*nR*v9ahUK2BKLEI|0W6ZrS|pY2ZE_Qfq_Y1DfG%1VwC>;Lm6O?&sPRlu z&-XUD>-t;O1fYwy9rDWnYyhx-oA*XCn-T#m>2+lwXZbfm!vFxF?T}yo?c~%NK>*OZ zH^=7BgE^C9^#eGfiLm*Z#xq5YXNt*eN{sOSoUzknHsy@)e%T_a?5%^7B6}tzKYBVO zyGDa@RYzJma@P+{6qY6m>w4WoXrc)E_Za6PG*MV{ZH)5}V~!?@@YHedy4qHbfU2~L z9nnO%G~7210GmHM7r))@ohhfL-9rIcuUpzeVgAUZsPRmGjjjJ!-WK8gb06U{rH{Zp z6p(*7k)mpLfF?@3yQhbAbas*FdU^;=l(62t-s!I6K0*^ksN#U}xzK*fx6TD?wa#14 zOrP4Zr~g&HU4W`CLDMws>JE=R^uk|w_QWCpU__d70AI3v7Y z9+9S;okJmc-Jt-|gA-0OfYn^&h$g}+4g&z}+Ml36Au~INC;fYH{qhyiHX19qg{Ox? zvbqImzM)}u@Z36a17OweH*z4}-hXt!C2}Z8*YV7zO}O3CjNj82Q7kIRq$Xe1cxK#C z&qjE^JpHDmJ}2SIw`u$`JBRP5&K@(?mxlYsEs`4d_(B6a0(-Ht zx(d<#1U$abNsFY0OT&G!O3Ta`6-S^$lm)^7IsnX+-MQ1f`qtqNw>K~#`ns_4xQLqq z2R6TeM+y=$-=t9J4JC^oM-SBOfVn$eP~({x^U0?$&Rx$_psfZ|pT7hc?lqQK#& z`2ws>R+ReRdA|(nsvE%Q#0KdZ+D3!x+zqy{fZb=m1e;%glY0!SE2{wT(%sIlI)Ylj z^bzg!2FEwX*h|BGiwy@bhDB22UHe`cSYBENfHmR(-UIMK zHHiNNppVCJSplF!yV9GkB^MKWe?P8>1*r_|N z5fk63l&EvvXZ~Gt=-@&IRt*P6E&;|MFVkZk0!(|pJC{3XvQGb8diG8N^NTO}Y-_e| z(RwZx!H|{L6Zu*<|Mz_*m-PzI?_@ofc`f*9^=OaTt;{f*s|NA>;1wS&I&Ri$J70|#WQeg3b_0?ki_J51FaR7b5;OXk;vd$@? F2>>CHVJ83p literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/heart-on.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/heart-on.png new file mode 100644 index 0000000000000000000000000000000000000000..676a641989a8a0792243f9bd7d4cb4f8f1e87af0 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(y zxt=bLAr*7p&f3^{*g&E+{y~|=rP!&*QpG$TbKY6*JCW6Tb2X1ZQ*Qxpp1)KXwj%EDbW843Mb*KOeJAm^)$r?cD2zrt#|?Pal2$Sx~j}=d`QSRTOee z3dR4`%1M4W;~&SEedC|iW+I*=EHq`3H_$|1#*Wdc$6kRK=n<{r&enU)nE)d=Y~x*d+hJ6QtnPJ9di& hz5<}2gBx^?o5$$Oi@w&$wB}C literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/meta.json new file mode 100644 index 00000000000..2905c5cbd07 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/meta.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Yogstation", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "heart-off" + }, + { + "name": "heart-on", + "delays": [ + [ + 0.6, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "eyes" + }, + { + "name": "eyeball-r" + }, + { + "name": "tongue" + }, + { + "name": "eyeball-l" + }, + { + "name": "microcell", + "delays": [ + [ + 0.5, + 0.5 + ] + ] + }, + { + "name": "ears" + } + ] +} diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/microcell.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/microcell.png new file mode 100644 index 0000000000000000000000000000000000000000..18b692a5a99ea63a4f475dc30e5f69cdcb14608d GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZnt_3l z!PCVtq+-t78;abA0z_CJDBs9YGu)*V;d_cDmu=%rmd}$ezKSnE^UCZQe??y`+w-=&#}D1!9$V2I++HB)z`)2N5RiMoVgA0!?`|!RTG{aDVE1Ru z-G)K!8ug5qZ5Zmd$<1y^)S3D%kj>>H?>#l2>&4m2cJ*2*^gZ5kK5F&*uaR~NE1&IZ zbidu&wvOk)&g$Cxwk>I#4C}6QTfI2hf1r_7R#?)(sA)^dSKEJfU9Rp0^1ljxIVp26 zy}#anymn_peVtt^LzfN{he87bh-k=SKJvM7?cAr#(Xm?cC$1;h9jIye$?%!+8S@!- e4uu7W8u)vkl=0_xPqGCD5QC?ypUXO@geCyzPKN^k literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/tongue.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/organs.rsi/tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..dee2ed3b99fc35705f70b30b6541e506e72e896d GIT binary patch literal 516 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 D;qYS* literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/head_f.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..31d77176c96e36ee043c1f9e40a214715586ed4d GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdO}M*cF=3&%nUUfm60Gox(|3&`j79aH=3ESH?Dlzw&^|ETlFI!lyRPUUTiJZ>vfR% zz{iRs6*g`%$Hf@FR@rJSjpC2dOqG|HXJl~VSdz)5$ind8;X}s!{QNQli3`V%x6fA6 zXlZ!=du#H(_s$#>{a0{j9}ZV$$eeZP^PXFV=RZ$aw(|3W^UsaDSS1*m6b}5XDcjG| zBEWLMPi?Y&mP6tl&tLI93^!g?>2Eoy*e&A48$KAZ?+r_(C85T?~cDNY0k)u?! z=9xD4uigLNf0!Q?ePBJ?g{vE<+qX$DFefnZG%y-4upMAP;Y4k7Gj}@u^wawJxxcga zbmpIHU@N=2^~e6abL)>z4H9$kR6nD#`5`c2oZ1!8vE`bX=cJ%`$5qRhc`w~)#lx`p z;))d@|#6i7+1Nj;11o96*}K@Qi6em0tZvkEJlVC62VdJtFLkeothN$?A3!!H**x0 z9?9COb#?w}A(iEl0UQ&03{NTIxU7}UyNSj+NF>9Ca~81^gsCbKV#_Y@4p!u z&YwRoZ~0-%!~fBre)zNATUP&1CJlRNfrHLGZ9il5I>V@c6JnYefWXt$&t;ucLK6TW CC5b!$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/head_m.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..53d6069a283d5bfde9f07ec578d7e67338ea8dbf GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCMF=NbU38qCj$dBlc$SgNX4zUvo>bEHV|q1U#uy3 zR=VQ#gR>_m#qtYqJmKWxP2n(9&7Zh;ipEW&lGAfmu0Gx*KGE0NY`^2d$?t@uZ(nbH zeWmEV>hqjQJnqjwU!1t+{+BObTB5hb?Sh)GgV$*o{_KD&wFkep8q^y*~-rg&ObNqVwGTMQaJFlrffe; zivY_3KefsBSq_PJJb%UaFx+@mrN8B*W`l|E$4{S}UVpu1XK#O4g8BaU&1)9u87Xur zO$xd-Yms}nU~ZAfz4za5hPB+y3)gb$KFYLi`+-AY9e4AlZx`=oWmqt|*x_Q}MvhX^ znrGVFzjpt7|6zVq^nvwk7p`ucZr>)sz?{Iq)4*uJz;=KEg%h>S&D`nq(@*Q?=l;&x z)0uy+fvxQ7)*t)x&aFQ>HAu|CQ~iv}=7+$9acWmU$Chhmo|A&&9ak-1=Dl>I6%WJW ziz`-eJQZ`DSX`^nwJ1vSjzqIX-`g5HcBvIE;a3~7K6p-2@DyrE$Dh_eKC58YnMLao4{K4)BoV#|BRupzyD@v zIDh`Uyyb^25C2Dh`r*%dZ(036nKbO71r9p%wEc|H>kOm*O^9h?00K`}KbLh*2~7Yy CJ&HU4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_arm.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..4f042bf40e07391d9df13e6f861429a604924578 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCMF=Nyd~HppMil%&eO#)q~g}wS=Q@b83?r1D?jOr ztza$5Y2o8k(JEiLsVziMB-nM)dACbT7nMxxW8G0a`L>L*#yRDkd}b+bPD_40{rN0a zUF`Q?x#DfCX?Z*ij0OyB2N)z6m=hQ_Z%y^s`1$9ZdfTq6S*&YKJ2X1BZT;r?TisfQ zuh2;0e6fiyGsE7kW;51p-IhO#t#aP-Sf+E93_F}Px|C*oj?)a$z43Zap_LdFDbv!)Vw;wWOXnA*S^Vx=# zj%xf39SgSpGwxV;VA^|ut%~YiN?qkrGP_^&zh*R?D?h8&hE4K7`^^iVqL&1;8|MDh z>+@e~`&&-I>7KyO7(GvmsYl#8_??U8n>XL%DrN(Q+=ow^22YlrOkw!Lw5;HtIeTYD z$m3Wa(VrKB6IQLs}Y^zMIhV((r+H(FdU!M!)W7 zn)^PUdpvKuaG)qe*l%-dmPdiXv@K^l@P>gxr~`2t%s19^?fjweGSq240}yz+`njxgN@xNABcvKo literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9bede218091d867ae80afbc6e6e8263dcb0c30 GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vo)}JLjlYxQpq^FBxNX4zUw>GY8G7w>Vus`cY zO?RK)-3rEZH8UaKm=Z&~HeqSuPG;%g^tgi)r*407ZE1Ov#=R$MF{k#n{Pzi3v~>P* zTN4GocIIg^+B!BI4h&2J4Gb&_42-y#4XsDgPE5b{+Vqo+duS-bgDuxKTvO^xW)S%O z_ulEFaeCtEYh49cawnhIw8pyLMsE4Z2AlKo{HVAhGwG&A1nTx z7OmanI^jDb#7hnG?{81%Hkf{}f2;V9j_a~g*TMenW||Sq`hm${IoAPAPzWS^tY*|_ zu+u(xW5*n(LoZe;6~%YEhW2I&=NhcdVP;FJvLt zfBj~7n&+e^%nbrfsW(5_^#8pi`*=?J!OeH`rt`CIiPC*mDHpti=~~`)Nt2mH4BK)K zm)@N&v|}q{UCEl<+dn0mKmU}OeDX>7!Spl5!{Q&E2z2!qh5%dEqGHn(#s#taxZ|08o(e0Se){PhLw&u3q=;3zGPAxTk^B?X5ZsIfp^MwUtQi{(I4u?N9+$t&Wtyzg`2M%W{PX$-TeKe-&*W`)))C__i(R~G zb3N~$pVelw&!$XLc~Q1IXK&p96XuJzAInhpK*VK3(=Flu@|UZX+E({70D-5gpUXO@ GgeCyxA{#yc literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_leg.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..788f2769d430d38fc166ad9d96c98c19ff51b141 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vo{v%hJpMimi(bL5-q~g}w*@}}68Hlv~fAi*m zWPz=N=(_C=4`(#aDu3opblh=+D|JZ1oLQg{=0y*cpa65F9~^;{ZH zF6y7GuAdZcIM?rD>TieRy$l=;IM9ORZ#SPDfBp5>r>gC@B^i=--&OJrPOrD{oHYCG z`LxZ?nHU-@`p#C^xQV#lc>n!ewU1ZkBa3bMuG3Q2&t~$R6jPt#w)o=O?B42qI^L6? z?<_ZTkl|xza1e1l*S2@-B8@+tjN7iOPv+cmjic#+=lk21@zYcp5-enx8Unn2PG;>p z{&;)f10{i55{sua1)Zvx%J$ZzK=NcF*ID0dT!O&eva$D9>=xijn{q!O~3F{$6)?>-|Gw= r3LJWp2c|v$vs2K{##i-5?r)})t~FUclSNB_>4U-3)z4*}Q$iB}Ez1U! literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/meta.json new file mode 100644 index 00000000000..1463c57a060 --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 2, + "license": "CC-BY-SA-3.0", + "copyright": "Original drawn by @robustyanka on Discord, modified by @pspritechologist", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "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": "l_leg", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_arm.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1ff1ec9cf0b2332d27d4af863375b326ddeddd GIT binary patch literal 737 zcmV<70v`Q|P)-7SF9KwFTuLpoJmXC!Ha2%)C0BqZa5Tdy`Ac`V*o(IQqvgjLK zKwyj^ilQ=~zRT%!%E#;Vy4D;pD95!t45_rCCcf9U{;vR{C<0@w zF^8&j0TunKc3NePQ0e(i!%}U9D*8=bMs?j1%j!3~RNnQ{SsQ?^MI`{VCphNlYXi_# z%d8^SP@GcL-)R>Zl32QGYbdSN>`Tg07x-%chO#?E89)I3=mJLz0F}*&wqX_R(z+jz zO>Xa$R5756gTL8TW#X+g2YgbN8QF9f=*>b%N|_cuZ;c$%s!??gNaHw0k|f!o(k~+P z^})$fytg5Q$X-LibUJNy0i@&J$|b-#$Mt$e7=}oa#29+3RLX$c?S}1kn@7G-3azDf z(^;Te0tmw}e`nxuIKcP)LH;V7*EIcOgq{Tm00AHX1b_e#00KY&2mk>f03(!tpGFp( TMrgpu00000NkvXXu0mjfoE1Db literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_foot.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..2389c30aea5458ae633b88839ed9f2b51163d25a GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vok#Wgx9s>j8eoq(2kcwMxZyDw_8;Gzy_#ZlT z`yCZwY4Harn5I3et1Fd$_$2enNk;{l)IFsq)Mu>Fr2u4ZuP23Z_9p9^4xy>>MtI)4?CGB zsT}-T^)}}3#O?p*KV14=TFEuABc8vu^KWL}b!&>+IU9)6moXKbzdW7O zVERe^N$h{7E&Rv>^4f>@48P{QE8fLy!*k(z$^6T*4T>P&CVV{4=jxpJ%;ZpYYv)d~RE zD@RiZfyH8>eBTEE*tU&+zt3U=IG0+jmW!00&*uPuN~Mxa4XD@aux&fafR`63Wuirp z0l;W9LakO~ap&bT#WYPOr9`=0hUag}?yXlh0TheH zf8R%=5nR{RGF}Mr(5fMX(1zf;uGTd8GXsjnB8I~ulv0^hcFy_TAUNk*fnv8_j9m5s z_x1#lv03#D=lVOHPCA|7U(RLSFx{*FD@)~RM*pMt0y+Vp-QXujKQ#c)?*3BS4!@F9 zy81I+1>WXBB#-O*%M`)9)B#!s^Omxd0R$jJ0C{R~QURcIIPq*)=XUAn)}8`Ual57@ zjsbBT{LQX7g*R3WxTP$u)1X{5LXnYq>Kfm26-c!PWZ3}SJ9e|#Onx&20E@-q>itHe z@q>PrQ{Xon-y#FjSY5O-;5^djMqRs~w1i=Z-EN043}G0?O&fJ=`qDLGGMT6#2viUR zs?}<#%jeN2Y3BhzN~yZtu8OYD^~Kd~=o+(JF41T-P%4#RSr+#D{r|xXBee`L3qdWnx62PKP{3oldVtE9vM1 zfa5sq@_rbGSg+RrfNHg>U5FX|YmCkV2mk>f00e*l5C8)3q4EucqAv)4nq?LM0000< KMNUMnLSTY>1XA_@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_leg.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..f424b2efbcae1ef1e98d9baaaa55659971fecbdd GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vok#Wgx9s>gtr>Bc!NX4zUv-kI{au7MTzj(8x zmi&Qphc0!UJ9N!`f$_zbLl**n^6X=n%Go-1>Q;S+#3WZwM{|A$)w4N@ulIg5<9^4X zcYmdVV&mu8pPwi5ohaJrGXE`qRUV5211@B{x!+3scwx`wmnjS@Yajovd(9VqKCx?&fotFm-^Py>Is2+}1z6S>{Hxn@|2^Y@2-bkLcAIpX zpI2U5dcptll{#LA2AlI6BXk7X7BVX2uKDNus`K@(Wtt7QVjZ&ozO70;UAFt~{^ie# zb}}$bQrXC_aC+0Zmc2o*UZ$^}%`|D*O3uR{_Rrp*^;O=wKZq+evQ9M9a{l=;z*Q)>k1gA+v zK~#9!?VB%e+e{e1e>Y7r>IX2hw6HEDETA+rL1vXUDZq9?6qJ301Vsi-4JH*<8nS6< zCK)xPF|#H!e*hz!+zVD)?KV|&mdmua_efFdv(>x%-Sg*s&lBpaEzA8o;ZSw{0H2y}iZrJjUa(jG~CLEHMm&(P#u9hQr~r=RMD3y!00MFGHKu>hbbidqYl%X~g>CJ&J3Ia!u5pU;`k z=W0y=AWc&M27^J<7RPbZu3D<9YR0kO?|J|JJ*H_k?aG~?=XoMcQ{p&oK53fbd7d~w zKY#Y@vF#tgwr%n}XTRSAu;1^=^Bmi@PXl1RUXvsVX__{lBuTisx;lvl42MJU==7RZ z55th*a43{V0f5WPOIh1s6h(|iBQ7p3uq;agLN$QRX2Wv1WHy^M5LT-dMN!c2_tk4a z9LEGffN7cln5Ib(1jKO+z{A6XQUHU&K>q0L9(>5AZZ;dW8cF{eRTaMP*9&mEt#GaK_4fL5K{1_9MO9UVVMrXu zA`HWNPy!H7wct;~;4c6Q+qOkL*)Lzdh$qoN9O8rz)c{ddl>iuz$Kvt&=&St#Kv7kd zux-2P|0FL%yf;~XJ^1tlAzJGUjr*0nr@cHxS-%?){JHg-W|F541sG7V! z5YYfM01ZF`IHI%)gKf69iVj1y1{_;Nn+lQJ+uMI)Qf-dKm1%$~mDMJo0sJEX^t-@c zlD5b5+64YjQDD7Z(>6JKQ~)Y-0zU%%RbPidfBOfvChPiu^Ye2qE-u8=K^)r&uGj14 zf4i>BcDt295HvLk*Vor#GMThKEqZgv#3z%9bR36%zfW0~>~=ePy`BW5>$*xKfa|)l z*XzmMZbw;`^!t4r$6+#=NW(Csat&B47Gzn5@B2+IuFlP!N{XUjwOTQo%}A1j-EPNp zI^~e8RBH{WCvO-=)AmwwM3vNi)+XTl{y~|kwz)xqAZV_WBmuq`E1U{Kp6AaBGM+9( z5Cp9?v9$&`j`LF@B1saWD8jNVrRniU-y)(YYT(ym7zSloindzNIx(`@Y-GRRr`zoU z-_zrkWigx0$g)g%jeu#IvMfthtJSkwp)^hDcDpjqbD`7;0wPHgnIs8iSvF4a(GJCQ zI#qs#QG0ve_n(n+Ki*gA1ncs=+62CR`-TwWpfR)pU|E)M97k@qTkh}g zxxc>$zE^J5B{Qdxdg67G6lgX?Z5^@DzZ%o8!y14FpaEzA8h{3%0lZTA52ABh6?@6+ Q5C8xG07*qoM6N<$g75NHga7~l literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/torso_m.png b/Resources/Textures/_Shitmed/Mobs/Species/IPC/parts.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..df2588b562d64e65b33bceb18ea7dd26889339b2 GIT binary patch literal 1232 zcmV;>1TXuEP)>ya1YJo) zK~#9!?VGV`<4h38|NC)BTp$miP7rmr8+R_;x|J(+fdo=mP9a=5k6>3ug=H0ilmS=T zXK+A8aGF?M21G2WaX8oJlnc3Y5xwyE%SC;?q#YF?q z05kv%Km*VKGyo0Y%gVQXzwrJ0cl7&xPANrMmM~2duImB->GgW=K06!^5k=8aCp;Vu z0f6`WeL0pS2>_5Nig0;(sTKesg!g(qbUGc}+}vO?nc(#F6xY|+oKi~W^SM%sO{Y^1 z0C}E+F$T-BFr7{TfEPtUlzV{dx+sbQ05F+M002c%z;#_vN|n3pcsz#h`(TU#fP7sn z7WFKFmzNg+K&R7@V`-Yoan({)m7K?Bvq7`jgk@QBTseSU2p^vtjmEq2W3PVz@H`KU zF>E#)0KjImf#W#vJP*s|vK9a&%QC(@kYyPFkdFXVh_Jly2E#CrBng_$W<4I@I1cZ2 zyI_ogQVQ2~v3=$Mh-v_i zzK>Vep0m^ zJq;R$0mCrhd7gZKXc{~y22@prBuS8_DM^w;(7G|JTn0>c|NCKtu!305kv%;16Z*H2Ayat)jzF?Ey#MS{_mf{>!p&C8*2; zYB(3rOF#qAdjahM8o)mb;BRDsLzdl90X#oHqb{Jo(sc;*Z--9k`uduS{(wfKfo``; zb|-P{AQ(lF{M)|oW3^iGIF4nH!hAj_wVVl_oSg8oED;0&R;v}Bo}K{wIHuZKg|u2N zWnSR>K5w;J@?5apZll}nA`C;Arir(=H==Y2OePZqK_D(8006VuO!f@aAw^M$`#@w_ zhA<2f1cB^VPzoT=b4gpsXO|J_1_OB!u?vDy3fs1o-VkpCE1{H1_(Dw6L|K;VdxRKcyxnd?Tt!=!1>3eU z8jXL*=o{M0$mj?Q$_9j` zI;j{JI$AGNQ|k)~I#TZWI7sdP0$(jrU6peeF9NkNmIV0)GdMiEkp|=>d%8G=XiQ8_ zkoe>fATV`3i%3uqgYis6d_zT2jLeLLM2r#=f(p|UzRXa3v`8s~Bk=r& zS&cVMPDY$u5#_>=CNnu>^`ZrfgeGy#lu%YpF`mJDA?IKLJKuCZMh1r6?z~=(pQ8AH P)-iax`njxgN@xNAxPC+i literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/adv-retractor.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/adv-retractor.png new file mode 100644 index 0000000000000000000000000000000000000000..7df819a183ec39bacfcdd30b7765a0032971ccaa GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv^#Gp`*8>L*$jIpE8`=vC$_9j` zszon#QZX)cv{vnXG@Np)u#8ihZleC!^M@t5*+_1pV zB~_hy@^w8?adlNi#u;g8o1Ky!4||C2sO-r)-7;kgYp;M-Nf8e#D-Z9(Gy`dc+e$CE wf-@M(*p-=M)Z4sgO7L9Vlis7Q!p6kFa6X;4R4XuC5a=KVPgg&ebxsLQ0KXhhH2?qr literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-left-on.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-left-on.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2e8972821ee1557f396179b189f87ac8a00b79 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TSI zr;B4q#hkaZ47mg;KVh`t%s5&nTi>Bj9PljkT} z9bLrHq+-12&;PEHn{z8?rZOAzPEcl4aA$JpV`-4#WUv%sC{kf~;=yoYA_GW5J;q`8 zUER-r=7d(3Tg6YE`OiFWosKW$(WQU-+)A(nyLu?AxF^Uqzu| z{(1&wt)CuW8Rte4k5yyWlNv4-C-5E{%Ez(r8^E+ZJqlXScPtC`Yo|t!?lX5 zTzo>+&x>!1)>pRdU(29>Fmd|<^E6hQZx>8CpdQ@G`1V7aw|Mcw$H4Gq@O1TaS?83{ F1OReqo|FIp literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..9a93d2bb5fc5945ef09d4860560faa2a5fcc993c GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TRz zr;B4q#hkaZ4z6S}6mebuf%}KSuFHIO9ikDFG8px89wc+_XRO}9BzR}{%(;9w4th*+ z5D=d~^Y@)Q)n+q&?|J(f&1{^m-;vBHaGXh@kJUkjyTL+?p-_k6Q3S)0jSL_O^_T-6 zc4w{Mo_1mB`=Y(M>dS4zcE>LN_rFmu!D{yQ)NJuvyXzu37y+DX(v?*EpZYhPbZ z-VhsZKQY|ycyEK6LhkkZXOjZ1pTFv*+np7nnDkZHgfa8e&z(C>5)So+JJ~aT@=G}8 zvp(464oj@V5e4PPzwD8$$LTJhgkML)il{mlyfV*SO)BTI{*G+K#5Ii~k$)|Jys0WMLADLEfD1G(n8!(6&JYD@< J);T3K0RSAeq1*rf literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-right-on.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-right-on.png new file mode 100644 index 0000000000000000000000000000000000000000..f91961a9df3aa8347df9b2bd44a5ba9a56e26d34 GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R5Y zr;B4q#hkaZ47->NMcV2QN_Wh4mk{uOAbKPzT08q9b3{eM)V14hT|1>+!6f)bcgti; z=P$Y}Id?qM${wBgU;k8K()WFpGkNxGaqMGhkl|#o6k;e+VR+)faAG3E1Z74AcP0m* z#GK_!ReR6G>KzxmH|6}t8*?`+UR!;0z9mcef!!P*3;)e2^4Xv*^FQQ3@+Py)<+pd* zJ3roN(RfDo+wN;g@iullm~swXJboqD{C@8`rtZse5ifoyFoyB|J@~===g&{4Mc=Lt zPb!?%a^Yj3=!Gv&dS^W8U6H)u<;m%e|6%sybQn}Zi_@bvU18ftNheK4y9rau*>cYQ znf3qoo~0~5`fV7N1Qy85}Sb4q9e09WR$i~s-t literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..6444d084235a2774e056cba05235a803283dfc27 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TSG zr;B4q#hkaZ4ssqc5NWGF$k_5~t+L1w&N~aaEt+01$jLYqvbYyA3GS)hV6MBvQKj8O ze{1H_jZgpY_paus)Q^|TRLtinQek-F!Ej<*LW7)I-Mc< zTkQQx_q#TG`48IZ+zT@I|I3c#1e|UIO8oS6I5DqrTau}mz^3#CXCr!9TV6>P6yN^+ z&+7ZXeI{Z8tI`)(l+UfMkC)=+xNCeNY|VVWgA;6-bB|t17l8WuGu!F|H9eF0CQ1Us OnZeW5&t;ucLK6UUlAuul literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/meta.json new file mode 100644 index 00000000000..592796b3e08 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/adv-retractor.rsi/meta.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "adv-retractor" + }, + { + "name": "adv-retractor-on" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-left-on", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "inhand-right-on", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/bone-gel.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/bone-gel.png new file mode 100644 index 0000000000000000000000000000000000000000..ac425d8014c65360682ea0aa8b90317352a0d87e GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyW&u7St_Kbr*uH)H&!0bgdV12* z(u}HGl%m34y?T}K|GUqP{}(S_R9Sj&(#<<(zkmPv^Xu)6>y$j4_T}aLnxeB9XaZwN zkY6x^!?PP{Ku(pXi(`mI@7q&`LWd1FTmqAsnUqz2|C?^=IXCpxnUvYO|88&lZ`b?6 z`~LT2PQFE|55yDhxb8F!YrNYMwb+Uy=6tYhvq7;rH_H|8kn+|8)t?G@4o!akA)@h2 z=Rwhf<@W@|*^<-NHSoNPH4s?&PKjemhtxaOdx!s~e`jz?Wfc$Je2ow23IyIm{0DQOrli zwz%2ivJHm)0bg1?=DAB$C3^8+*rv;uXy3nq+aN=>s^RNbTeZcPMGB|>70;GylzXr^ zI&pXP4(Eh3$^pzzZZ^FAqxHqAy5F=v;7EXW($Xblobg=0;JT3)|iX zDja!dD3M^d&n;O#u<8D6YnHt( z=UJ)IaQ3sv((7cRX!5d2^yc4L7n`&-Lah2vZC$@1EAy0p$G;za7tHUZ;Lkt+ z>2ofSK5)iC=)lG^Jb%K49AdAh{WmglZ$IF-k3Ggu?vMMlnT*-F@2~r?oiH_i;D77c zHpaBgaqDOEOvp|zopr0MIn4*Z=?k literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/meta.json new file mode 100644 index 00000000000..48775ff522a --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "bone-gel" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png deleted file mode 100644 index f66bf6cdf9eb1aea9b77e8819b3f0cd71609ab3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;ykP)VQ!P3~dK!$;$qRv9CRT%t%)UfGl_SvPTGP zJNTa*M^F?3_wU?ixOM9hgPNKg*=CUJfBX2M(_jE z8DNgtuzn^&VR`F+VjV$p2%I>3nZd$XmqF23i{avO@QL{kgQy%2hTNHrrx{HAO@Yz!h2bGk9Zej7ZXpPO zECsQ*Pi|-M%&laQH`FA_9I_n%vKSqJ9FZ|^5q%s01IWGy0lI|%y5+DCdHsm^_$S)| zu=q!}oE$)w13(so0Hv0b?EsL)Fh_s@EJQ$nE@=SdYh>RehXPI0fG!sggW_KnaA5=T zDK^XWf%1Gnb$4mu02oNnH^eDN)4Bju#cJJp^nd5JgLu`E(lR1B1judsQOyC=2BQub abpQay3zG>w#k|=70000VQ!P3~dK!$;$qRv9CRT%t%)UfGl_SvPTGP zJNTa*M^F?3_wU?ixOM9hgPNKg*=CUJfBX2M(_jE z8DNgtuzn^&VR`F+VjV$p2%I>3nZd$XmqF23i{avVQ!P3~dK!$;$qRv9CRT%t%)UfGl_SvPTGP zJNTa*M^F?3_wU?ixOM9hgPNKg*=CUJfBX2M(_jE z8DNgtuzn^&VR`F+VjV$p2%I>3nZd$XmqF23i{avY_w?p_B&oewce;uwy-cXa_;kPfeaR3aM_?vmXquN zT`nF5#lI}TI^YY~r`Rmh2g>sS)!n6q17ILQ-w>x9O>+ULiq*RH=>N`b2l1*SrDa5N m2$0+MqnZP#4MrU>>Hq-vnwwVQ!P3~dK!$;$qRv9CRT%t%)UfGl_SvPTGP zJNTa*M^F?3_wU?ixOM9hgPNKg*=CUJfBX2M(_jE z8DNgtuzn^&VR`F+VjV$p2%I>3nZd$XmqF23i{avsS)!n6q17ILQ-w>x9P3r4&qfuO3R4k5FoehM>Pjf8;m+&)Bykn1(&uM)eu4e0000VQ!P3~dK!$;$qRv9CRT%t%)UfGl_SvPTGP zJNTa*M^F?3_wU?ixOM9hgPNKg*=CUJfBX2M(_jE z8DNgtuzn^&VR`F+VjV$p2%I>3nZd$XmqF23i{av+3c>X$AOx{ov%-%k^ zoxwA=62kxXg*Fa=0Z};~AU1{bAD)NMAV*}(TSSss6xRi3HlBw29t1!kKsN^_?HD(2Ydnh6q{xGKzTl(y1TS+01PDP8{(9sXfnX&I3m m0_3*+sOA7_gHZ>JIsgD|ZIr)=vS7Rb00003B@lXJo8&@^5KR&K1&oaTfJKE<(2`R(pR4EccK_e&tri~$@AVwt=XcI~ z-nUNrXSD&^0BrzA09*3rf>nGwuygt=0HM%`97zt*#Y(|)k;&zm?7dVmjaRD=0oMR9 zUtLerSF}dOiF4`>cIk3H-)j^v%qq_v5q8ueGAzgK#nJgQ{#Dzs;fS}Upskrhk z=6ad|{0Mu8MbUl?l{SXw!=q!h3z`CK<>(&3R-lD2;cB%IBAj+6S_WWY0L_HKgV1uP z)w=>{PO)K(PlcPx9RZ-dyP19UI6`*SxvAb30D60UQ9gN^PqLD-=Sz!8)d&L$nQxE> z0KSSLt{(f$7YpKe*B(jV03g2oguznp1%78pa)4g ziS zU?2wwF)E<&8BIh{1;iYS7%&7xPy`YS8QL6>1SC=u8Jdv=7=K$`1e1{k7$gG4Qc(mL zTTC-h1Q^7eBT!w!lwyh|Al4j$>NdrUFcDM{u{LK^V;M72jL?-hp_?MP0L>!rQ>aQ9 zQ+6t$nc|p?>N>`BF$XjyMd+p|+(EU7fq{3TBbvxP3jtICIdL=rkw!EvjA#nL008}4 W8z(3rkdgoZ00{s|MNUMnLSTZFmS7P8 delta 568 zcmV-80>}NI0>uQ77=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0005^NklY2rexd)R<7sf<(~RSWad` zgoF@AIY2syVzG_<_@uARqC-+MguzI5mV;VRJwMA0RXz)cBmb z&bj^+0Kr#QmuPmzN6C{j3K40lAuIt(rB^CE7R5QTx#kFjA;4C6T`Rwo$ur@ht8`Yp zpwz{&a)<_iNw-_`Py56@>PL#tC06&f(=R<=O^iPQ? z$Q7Pkl+NlCp??aZ0YF&(6X@u0mtZ?GAL#GXE^qG}Ahu(1YDb0+$Pfs^djI&;0s+6? zlnhC+c*`!Bj-eR@`eI>mPC#H%xL;b88 zvLU-Av2__S1Tu&HSWu$&2)rDooxLcHjtq*1xnCOdN z0VELIEoPh3u_vPXp20Q+2qs8YTL3&ARvF4;%=<$b01Me!ZA7_ot7o+Uc3iNMvL0yl zSwRVaTrp>cuzO7_bD$o=u9S|Ud}nk7K!<2T-T&9jX?+8-P)~H#OfyaZ0000 zPZ!6KiaBp*ZS-Px6lnX;tk~)=;Gr3_m}S0#m|XH{l!Yus{_{QhlX%iOzG za`TR*30+|=`90ln-QhPc&U62pr<`%-tMn?SCBd0d#}f(`nWe|=>DVf;P)$L<&Z_qK z-@9vHIiz&nO>WwRSYkiMD)8i^=##cs$}`9tl)auZ-<3-gDQ|WIsL$My&tEz4+yNa vY1+jQdB)(d(*=v9snxv49zksX!t{*uLH~gTe~DWM4fCWgh% literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/bonesetter.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9942e76d245ad340f50e5c2d91df9b3a912eb0 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R4^ zr;B4q#hkaZ_IfcpinN|@ns7*6Ac!lo<$-X9ppuxKtCZkTr|p8?TRlWrqz{^J5L)vm zvxbQ?YR6KE4~ExbQl%41(@baIw0)kvO|s4M{vAoSZ|53hI2kO37>ZOFo_H{vn8+|e znNh)=$)S&>VNML=*=J5xQnv0Z45lSk=QmU&o0_}lYCrguHbc$7+`_i2US_)Xf>XQm zA4adWymQZe|FeQs4Qqd>Y<+(-VYyJywXj&J92F8;!M`9-&1E-|xYQsaKN zE7Ff?ou2-pxctwX*R0v&H2uM5x98pl+N&Qom$sa_{%&`Fxmd!(|EEIT{1WWM?5y*Ha#_s5z7{6BzN zZ6%ZTaQHk^el`VQvV)_xZ$G`fx_+;hHCrvWy1eB3&Q7|S79tuTTbmbzl$-@(b2$)A0rvNH-TB4kkK>*8 zp&h`@?cG@8V*@m{w~83}&UVI4gOC+sGj}HY{CF=iLi)9e1|ZldJhUl1<-KNdamNHe z6z2Wh{6gUZ3R2S!K$M#I69Fh!Jf2hRR{;?9$KBJBy_O=xbG^Rdx4;YlvEL}%YbnP7 z0GJ2opLhvvH=8X#QVW@E?K18he*NGAIa zs77iB5RIUCFzuu?QY_%&3elVS&X48AEpX;4gzEt<{t ksJ_r}V(|1{=f5`m*WWRn&EcEe1hkaF)78&qol`;+08DOSA^-pY literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc6bd69467f0d5280509af48c389b57b2f07da5 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R52 zr;B4q#hkad?6a5xMOr@!pI~d+8$F?cC5ThWGj-yjAf01=IYvtaH!*pN#x#e{@==Y* z;JCqIl%Vbr_GohZ5qy>5Dj z@t42;!*v%OKJWYVe)cwt$IE>ftF~Xg@P6yXs*HoXIDT9CoOSeJwDRQ4v~}D!clP}k z*KhO4&14K&m;G>=bzybN=Gzopr07}EBt^fc4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/cautery.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1cc9c4d803a7ee8cbabd8049441b5b1f8396f3 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R4% zr;B4q#hkad4852g8CoBjKj6J|`zC9XLetcQE;;|(>`C`0t_l15 zeT%Ma+Iw1xP1q&3?7xi3z2CAE{DLQMYdrRDVX32lX8C-@$IbCghW0gr(!05S1Tjnq zCWsm?@b6grY5%u7*F6gwp0@Mf?fSRg=$ZB(@q*n)?w<2ZO=q)WueSfZH>F?u?p!^Y z1+R>mm#>xD_uSb|_V`Ecf>l<=57zC!FE_R5@6L*K ztDir=O1n-GF-h6H^P*bxQq|r^(o*L7hW0WtI(CLL7=gMNOM?7@862M7NCR@Fdb&7< zXiQ8_kYHWW5a{9Q=^1!~K`%k*5fjtFwx*`0W0|ZDjMpz*xR4OMe8GZ_js=m@5)vsk z4NQvb`~(FR6%`oWjte(Ac^R?KZk;-HcD0eYfdT8cEjui@xVT>5vn_s>^No$IPvN<7 z`Z^6w&3N`%$2Z7o2wc3h;>7Dmg<|h`rmOY3-7`)X;0xv~6?7=gY*#w#%*@bbr{O)J S!ekQAfefCmelF{r5}E)zi(bzF literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5a065550e90bf9f235d8226c0587c9699d3317 GIT binary patch literal 666 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$f zr;B4q#hkaZyuGCZMUMYxv~S`NtI2-k*Am3CG>n6*>DJWQue_E%%1&lwZW5W&#n0lp zVatxp?hCGhv8Fr{@z#NxHf_ASqC4+MzQT3OaHhzYJv)z|wcLMJ<;>j4JNM7oS^RJg z6NfvigM}8up+H7~KCXs>5Qdh;ObRlh3=dZ@fTeVp?v?RNSmpiwBUC83KJDct7eBs& ze~;%*uGncI9`Iw+eZPI{^IQ0iO>LQdM$e)^@4>Gh*-r%iE<5u1Lv6BT=ccI5yA0%_ z4!t-sY3HsV$(vuiuUPrH-j4gUvV+jK{Mo*T{{PARWgGRl@bbkl@d_d9{g=(UC*7-c z3$!sfxQ%0(|MwTm*0vm->1e%DK`0~U_3W&g8BxdgZSQ^k+ahPfKGrHWwZbXCT2o%h zX9P{T#&644GVj>M3a|QIcD7rNS9b4V%32+_V0Eq7>g@Xlrj~78vtBem&b+i<>effA zdzs=FBi2X=KWGhQSZcHM%Zq~bzR!=}<0#p;Zr{xx*==)cw(RLJ{mc2SH(d}7gmj*N#4Z4aa&wqO3r_Vqf1ZjuGn(p8>39OyyIWyi=ULzKb9!7 dfMW7F-#f`q58{q^Rsa(lgQu&X%Q~loCIEm1C+`3N literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e064d10b1231794e3e09b5c561e0b642383720 GIT binary patch literal 668 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$v zr;B4q#hkaZe6xiEMcVE={C9AS;iwDby*YK2h@**E8wca*me9(&>!R4$AR;wo zg>>@5rDwfd3Ie@$8?j6hxyxy!?JH_nqUiC`e!}ZH+^scdju=dqlsR9SFvG#9;GX*T zb3Aj5nVxkp7`U@ESSm4`5oAp0<6tOuVVI%JbU;Rs0VMT&JyY8HrJ{4q@2ztaU|MuN zUc2;}(!R7l-jMuwMiINIyV{F>s`Aa{#j8WOH>Fs*ls_nuK(hVcOmMjPetU3N;L4h&bjB@DGFM*mX$L*1T-DYUwp|dXj=WY zyAw{m)ODo&ge`4k{)l zM~)t4IG4^96cof+>eax#VuyyN=1z^ntP*n@xMJpm8r>mdKI;Vst0L7b8FaQ7m literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7531299f2a4973619455df6e2bb1919e961b3b15 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R57 zr;B4q#hkad_Ie#okU08Lc}L`tNA7|wg_m4omNa)idZN)JzHoB*f(N1&FCWQrC~?&3 zEaKpEWhva)EOKz^ijXDeE}9DzbT51^ddl*@YViC?@srakE^&Y4VZe<9vOj$K7Fx8$ z^8Vo&TX&RA_|o6kVEVqiq@myuw|8*HmDy7&qt*RS{(Z}RO#M_x;1ulzU#~4YtHnQ6 zz}U*+o42ib)RfBU>HRZi${s%cTRh2yy<*48<;T1ChMxK>_3roi`TrZrK8qSIV&33q z^X-g|J)7b@Mg>ABi6?d4v1E7l8!JtPuVvZjvzdr0>^X5DruVt1*+s^h#ZjJutF(7} zzAe}*z#*DYm1ktTDeQ5*W<$HS;+hNV``>fb&*M4}2UNX)o$dD}?T01*WtN^Qcqkdt z@Zaj=nm2bF{r2sDE#EwMQMs+da!H0qKy;G1hPkpauHkVWUv%sC{kf~;=yoY zBEtk_Mg?~!hd!1Du*8Ge8!Ahl>wUZKCcqJv|NgP?*H?aPX6j~_MV0ara1GR%Op2>#{JYQesmfm9=$GoJL941& z#RBfx6$buGW8FGS_DSo}FR!Q0@-|-WqjO+Vcy-N(KVRm(-rcCNEIwkU``%gib}`E~ zuD&d-lfU*G_vz*}NxzOTt@-;#Vvmi<@8l;gV%5A?7(I=DB&yBGHqeHI%R=!F%sFsgQu&X%Q~loCIE@KyqEw0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/meta.json new file mode 100644 index 00000000000..9c30d1b15d5 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drapes.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "drapes" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drill.rsi/drill.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/drill.rsi/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..1f141fb217ba1f91d86c0e8b11d65ee85f05a685 GIT binary patch literal 702 zcmV;v0zv(WP)AuCLZc!?g<=uJKn~tKc+9~=51u3k@vP+FK`@X| zqs7)hO(BX{s}Z8zZAz@ttd+%hFwl5#+HVtd#R!kgJQGw+}GW+s4%iHV8H z8e?f@kk{*F;c%GRu~-cGd|sR9_xqV32uRHQK&Ndl4%l+o(dW_Teq5N<^*MJZ-$9wa zMQe043LcF{St^x6AP}IwBuQA>c$h`bdq_+$7(^%(!ov&qu<7J!Tpt=npQB5+#?9MP zICE-0wM9|Jquz5|EL(hh+0s!9qVAIKjPDl7WD;(-n}YGhISz+|EdSnFw5q;0u-onA zmt`5%@@sU>*npt`7UYU1g133_(Xp5C>~dlvora~6D!Q>-Wo1>>pCX0!NO?nd?d zJozJ$2zZ9_6&JP$$8f^=2|N4u7_Rl9_?GOrD&UJaNo8nQf=ni3QG;t|AdyHwQGTBR zwG7PX^P%t{2dDy$4-RT`1;L?PYjo_F2p+uY3^dDj=OG5~Mc9=%_4{3Joqzi2GxTij zq3-`7E8}9EfY`^apmfWmTJya`aap*tBhf+4QL_uZC2d4HbQ0K=YZRIGQKJs zZ4;m@Et80PR$j^f!oWU1OO5B~SFKi<^!_tDJA8>5jcsWL>Y1G{k)3!_`0Kc~38;s^ ze#JS-(AUyiP=nuw&9-mUc6pDGJ$g`B^*_>90lQsRdO11#`L3~2M8lWxUl2u6XN_o^ kfWqAJA3WVKF7}1f+`G3u=H%Xg7w0caly>W?uSIBxv-EBrkzZ*rgHaYG9Q@q)~ZJ0ap;2ahk^zAQp#(bcS_ za@s#P=N5(QvBZeyD~fN}`E}{Xyt?iWka8ONQ^2r5ZtCz0Z&OQI{jY5k= zVFA}bfwqO3(@(Elw*Ky?H{XtL{5rSgtM7&K-;eJ6tJ=WzVQ=-F^81Vav*HXFXpl|d zmWaG#@Xgv+<)6KR_=mqAe_olmgWLAv!R!7XUMeS4vRra|q*t?}{@aTG3mRfR|JcJD z9CK*KzF6j}NxAZeJYx=v6fs_XmA&5M&eR&a*P;Ge2i$Jj0Zq7k*_h+7K(8CKd7j^_ z{OrK;Tf4srP2l>_dnES9#ff*eZDLp3u(|4veS&l3^umnvhIEy8Orif7Rx;f8xWl^Y zALA$24<<^v+(4n74VOE%R0o`Rcl$d7ck7#dVh)YKm_5R6!H}zYhCl6SC7liS{p~V#N0Eghf*&U|*%t}uUz*1>tNFpol^nLW zy&oIOHBAWq!@h`PnZm(lj-!th+hg^&Enw8#E83sD@4*zI8E@O>a`N2&?r?)w@{sxY zb7#^%pVKsOXKAohVmKqnn9#?;Q0&4mLz(G-j3C3a4hDnc8VT>N&RdlH;jQtbYhDcg zoZ(SgE9(|FeCI!(U}oQXw@xsT`(D7xkPwNs6=ACn``Pa-6EOFgfpLbJ}QRqc%{ zNUU=F`|I!3?m!2jjvvqEU6n037dPB{DD%s@Qf5x3F`n-K1szTp0Jo)%wo*^)wQDpdf{pIa5i@ z|K!qRujIGRWC{4TZrxp(dAId)L}ahekK6itZ!+hC1y3q2e0Z1o@xNS?bIUYtY1iXl zw@G>*$hhEe@^#L?Nt++3IWE(5sAgAd?R%YTJdI)QZsG8C_k#G}-F4d;iW*8>L*$jImj3(BhYJ_-m+ z)i<>Fx$$2uda09&aiODiUr^9b>#r3+#f&9Ee!&b5&u*jvIpv-%jv*QolM^Hg6grNj z3yC<08gM#=9-6bRLn|Td#=?d(=_S+WbSzTPC2^Gf)g+?doz}!6g%DYA~Z?K~{no(3}He5e-@iv-(b@yFE7EurM>hz~S*` c;|UxLENA)DPrB4E1v-Jj)78&qol`;+0M0l|;{X5v literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/e-cautery.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/e-cautery.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd5b0e97c085a12aeb4ea76fdbd621b29e09f54 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv-2k5u*8>L*=o{J#3(5wBrKd>;p?MapU~*b~tY)W}#81OOXn`1)>%+}UR(CDp*fF(iK}Mo!|D3Kx4jv_;%trGs1|+j~ zF(n3avWBoWI%;q^IlBhNKGkVi)!?ba5!$#aOK=raa0oBY?B+nz0(S0&S{B;B7+TL4 n7s{_lFq3wz5hGLVc(PTs!NLM>`w(5PAM}?ac9uz zX9$pETwufGP|4EpiGu+sQ5&-`z)1PEdPa_qb&&Bdsf3f#hhH}8TOGDK5L0>ZNMMiO z@_Ch4%e2CiwEs^HZJ7FLPvy5Rj`w|uyHl)hIQ*Sy%22#J<6Zdeh}C5ue~3iyzj%74 z_zu~K^HL4Q(LZZmsHqg`&r-U*aD9B!e?e56aXN{4+V;Ciw*S4KwsdZ`Y(i1Zp&fC8s$b3|zKs%j_}j+m?w_xd_mnm~af@3WyE(LD!}j^+ zhwC(&E>!RTb~ta!Pn)I_VjNM8#am{YJD-+&&@QArA*Py(m!)n3XT%%T9~(b8@y~zq oID`u0`T2P-r< z_*#`xCWmQgiX>e)deCtlTj5KwYClfP`~Mk>CdcnMS#Vyb$DKiQe^2 zYuV@azyE7f!7t_d*CW-sgHdJ~^Vh$t0$2WLy4-=oDX4DLVi%ah8#A%8=@g@m*c|l$ z#uMo*^LCX7TWZV1uYR%X5kt22>T~?BG9Fysy1RcB$Jx2M=66m!7fkwoU%9fd;g8!s zE9L8-g0?KY{qoN3BcD06q802<_y5{&%p7(6Se7$r4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-right-on.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-right-on.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbb5332060f03feb501816dd5820248a9a81f37 GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VnC zPZ!6KiaBp@*?S*$kU92IJwPNzWK}n>Q_GGm3U{x##vC6=T}->@xDD}#`EuUtzIRcUmx3iyTI_bn$7RLQP!<&x26kkWq-e1()%}v`|-YtyB_|Gd($60GFZHzopr08{hY-T(jq literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..fa95ce487dd4d157f5e7b837b95c5479d8447f02 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R5P zr;B4q#hkaZHhLWn5NZ40(7~}tV0Wuin}w*#?5+oT`xu z4z3^l+Fxzm+HKLdCbMv==!S~A2HSkewG~x!CNdn))YzT2`1;-rAN(&=zm+^9$yrgo zvwip0PPTiY%d2CvIDaMoEql8^S>?gQpBH~|xUYJt@?ycAAD{J-T#kJ_mhWJ|u_l3G z&ed113?!$06MIp+tkeH5$F!dxB3I;y8o07F$OtkNxiFj%WK?j+$x)xmaJP8B<+{&h zZ6)XTW-Sr=P;8fQ_kQ5!S&|xAYtQ5#c-6HwCZG2X#tQ%d literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/meta.json new file mode 100644 index 00000000000..4a4c2c11d67 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-cautery.rsi/meta.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "e-cautery" + }, + { + "name": "e-cautery-on" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-left-on", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "inhand-right-on", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/e-scalpel-on.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/e-scalpel-on.png new file mode 100644 index 0000000000000000000000000000000000000000..04a27c34bbb860d83a26371b4c4bea8b8dcf3924 GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZnt_4w zw5N+>NX4ADGxmEQb`Uup?{F|^qw@w07Zs=I35#Y&yE`s<`{2gO`XeBeCwuGBg9kwy zy1kcjxMfUXVYw~vCornOqOyFi)a(eyUfm!2oZsD3E`LAy`=Nt-C1-5lXkdV#Wx@`Z zFZslVv~Rmyrf_0fa_Ii&|JLk0Q@i(_vdf~4{Mm1Ai^-c`wMa1!TUb@e&iheEVul2pL5SGZ>;`0S@qrNoc9ft#=G1!R8{K@p7^2t}s;X;5XuG zmTDJRWy(Hzg+#&Q^H*LxGCp_t{f=pmm?JbLyI2qO@dw}8cKZ512b)tmbDCDfY@ z%pfw2$%}2nVwulu&;G?_uP&i`Ng~`P;lC^&nhYmObQM4tRL8JT=FzO T((h3PjB5r@S3j3^P6L*2n))}$mr-B+N<_H za#Atw3kveN@n1$KJRmIfNV#XBqqSP}QZdKPZ9pxIB|(0{3=Yq3qyagJo-U3d8WWQf zBoZA?+&FRKNTg?Az|9B)oe2x?EUkR@#PhPYsjjJRx>R~@QiA?>12Z#|LNPP3prD{G zzLW$F{mh`CEtWb5!F*#p) z8d^Ut+Fh~kSc+nJc1?wP+Y)YmNw!1C3$uyH*76_uuji!Pt%DTj_;Y*pL*Ep^pEjr8u#D3XR2%d z|K#L;Zn+_-)$A2h3hVl8)f_vk>uZ1NE^GO})4lYmyT~@~78Wh7JqBjC7l>hZA%@$9 z)gKhpUX{InuX?_YtN4Vg+wVH-hudHMdwNB`fKXhAo+Uo~S1o>O))FSC&Z~+6)yz*itd|H2c&*`Ue5JRb@|^tZo5I_9 h+maxm_JwI5V{c58!JJA?7GTUVc)I$ztaD0e0s!>!z_tJY literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-right-on.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-right-on.png new file mode 100644 index 0000000000000000000000000000000000000000..358f397c5e53ecdee587622ad481073fc1912431 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vn~ zPZ!6KiaBp**?J!i5NW&LWbbgr*Xm_}i@-}Ii-_3A3LJW`RxEy?FDO$QBFJ*^;5sSx z<4Ubcbz3YtW?%EOinDcEFr)5HP2i;OHr~@t``%Mme|X5!S;3vPK}M9JD1_leAR`86 z&Kb^#Svs>;SE;7&-nYJC=1tb%y}LKwE4aYIsb3;$U}lrGOx>$M`}s=F`+h5TWM%P+ zzhB!w@BID1hCN^3ugtx2%GyI)sP4$k<3Ij7p6B|;84-EgXsw%Yz9!%Mi+|24gzC)H zJI813^?|dZvhL9JV}j4-*ywTZ44JlHVd?%q31^ajiq1biJNEidmM8vq_h-*KTR-O)(e(>{tjYI+b`?;KRd_hh{ffYesY*_ba(gXwD-Tvf_o=BFzxx!JWF!IwDLP| ze+A5MXxaXD|MAu{+A16KU(`3`{0#rE58mtUN>zT96t>B}Cc490DLzpwZ+ zJG`UzzlUhT<@$cFOP{$Wo@ewtFRZe6zg&w$9~Xn=7p6LfKAo9m0g+csfN{y->FVdQ I&MBb@07nhd<^TWy literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..70a64d2b0e6b8b6718749584a5aad177130838d1 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VnE zPZ!6KiaBp*ZS*=EAkpf7&{IZacW1Dy6-Q7E3;W{D&65>gykP#p;8)8ae<09RfR#PH zw>eppl|9f~eS4Vo&bVssMu()?CY-94&!df0p4|Jay3_o_e`5uACWk(j1{qEUOCg3L z6^17s3@0WsOi*S7N%%cvd9!BC?BnO%G+%v9W?gf2o6qW>GC$ictNB%UuV9e=_5A~r z{a2|^BKQ0&>n`fdF*B^LG%<2^IB@UZ#+Tdoe>CN||Mq*4ti4Ghx%7DknkU`Ujmw!R?mr?_uxW4Rxp{G1p_W~$2e|Ef=P^dVi(6|^AYHz)&-$Wz!eRHd z`bP0l+XkKpPIco literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/meta.json new file mode 100644 index 00000000000..701445e8ab8 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi/meta.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "e-scalpel" + }, + { + "name": "e-scalpel-on", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-left-on", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "inhand-right-on", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/hemostat.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/hemostat.png new file mode 100644 index 0000000000000000000000000000000000000000..951d323a52fc4dba01f24877ccbee580d5cf50cc GIT binary patch literal 261 zcmV+g0s8)lP)Gw0m&Em7yV`{yPcmR=Ie&$yGZhM)g9kI}1ZMa&x>8Z$9< zN!%;i%etto-)Ft!1a$_&=)3uI=0(?v**Dk=e{B5`-o5J8wKw$*N-69&K1_`7Dz4;> z-u(XM#0|0ne|O$_ZR2#pxu8S#0jtb6F^NZO8jed<@iy5oHh@r7gL%xCA}?i0(Tl)< OWbkzLb6Mw<&;$S}hmG6- literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b83b2b02c0b93b94f7fd544712dd26266e0f8be5 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TS6 zr;B4q#hkaZ47m;&h_wB0x^PgsWAX0k8djAI{EB>!G`oWPA3ZUYIdU{GW{#{?XuRTs zkW1IvPW-R;wpOi-kNea%UGT(2h6&1y3hqn}eJl+!oD7yi3`HsoPdpev5|4EgHrt1| z?(-I~-2Qvj>68LrY zfWYTcp$Ap(yLFr=Dsx<$yN&Jb`r~g^4m54Q%W>7Ptk`8TW1FtZk=cyqWg(IeI3_YW rbH9sab=o5-QN%aZ5$Z#}y$$BZn+k;;y9GW2!<50()z4*}Q$iB}ml%(J literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/meta.json new file mode 100644 index 00000000000..afbaa9cd516 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "hemostat" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9d45bdb9f44531cc712ec31c89eb37b005ed18 GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|OJY zr;B4q#hkaZ&U-UCiX7kHRNoNWv>=$pk!7ya1imyW*ZAoBP9hQF4wK)N?zVsa@(tI#dGTA50_vr%=Ux5tIYw{2*3?OpuReGp z$e}k)uO`1*xWrt1a-{2IE89CiOO;yx3SV7u_xI{$Rpp+we+%{V-xs*5%wABgp4?oP zvtQ7XOE4k!zy}o}bN&}s*7rUtdG>rl|M?Y@)ceDNcC)HmL^5ufa{099{~iAEGpCgG z)Gh4_UH{c?)yEeZ-wIS3%np7^P&T={$IM9c|GC44e&z@N3#H3^QsaR5uK~B$fl>#` z4j7m+?h25aYjkpoi(zkKEW^@`K3Pm9oLL+ik7d|iGim6i1qmo@rUW)$og`gL-bxJB5i+ z!MEQ&&J&*%qQPg*S<8CC-v6NatI{{=#jhePq*~)WmK*!o)vse(W}zV`8_Tq*eYxMx ziuT2KIJvfqYyJ4vn!#iD@abFG(;KIJ4$)-eE8BimXF=_x!m>TrO@(){eBt?}mZ0x( zMRSZc|g%tFZ)I{T9thR%!4Gi2GVDUGh!)#xV=_imUg1UtC|G zAg%3rVeP-XLl(b8dstf5y${rmO_ccpRFkB^Xkse7+HmXJ(E9DJ>HC|`svitsVq3ZY vb`sEZXU-q%_caFoS+|F?2^tZ6)r|LJb&k1va53)yrVR#9S3j3^P6na*S0Ei0mZop+@#Oid^}CPd z*Y`^a=(zFwwr1v-+! M)78&qol`;+0GEtQ^Z)<= literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..a23bdae4c5b955ffe8519b516dadf79d9884a302 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VnE zPZ!6KiaBp*8G1Vr z590Rk3tSz0?EFlp!==)#N0b&l%a4`~x2bO6_hBiSZ-4jXOUrfgmn(K@KPqQRxcH|d zr%dwaTE#=vGm@1QHgA(Km+r0qU(1la=+{M&me9|aw*7Co^zmUtn<;zs?6_C6xISFn zPsswH=;Veq118p)*oB$rSFzm%c8e^cjKL-2bNy`d{4Ezopr0DhIl(f|Me literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..cced67007f51b69a3189eb9d6f7190721d24ee7b GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vm> zPZ!6KiaBp*8G0XfkU2VEp`@T7XhVSD!Llps6+|8F7_|ju~jz2rMtS_FI_*N;I(RR=8J0k6J69 z8e}*bEQJ_~R2ZIkFn}bC3z@>QxVP)zxhVd#+vO+6 z&hlTva(jPF-oc%FKZ{lTfA{O?TeBDT9$L~rZJK=gHZw$DIaf1@Jzuk8bz@lCf?$P} zr|U%2-bwIuVLA_+yANpS|KDrX-~9haoCf1I<+xqVUa7J(U$5&_*1zz&)c5hqUN@^- z3*0mq%f#Y-%XVq&C%l%Q8}sX7`|;JWE|t!*Roq8ric6fhtM^WFfkfup3rxo*ifc^g uSK7Zw{;j%1ahyWNkAtkT&Cmdw6F=)>m4r*yjRauCF?hQAxvXNVA literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/meta.json new file mode 100644 index 00000000000..a38e04dcfd2 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "retractor" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/retractor.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi/retractor.png new file mode 100644 index 0000000000000000000000000000000000000000..24e04fe613a51b552d14e725e578eeabf2686c84 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvl>na**8>L*NV`r^i(abQ`$)tj zMc>eV!pto{e}2s^?Y;HjRX|wk=A9S4UY->Ms%I<-@(X5gcy=QV$l2xT;uxYaF*!j& zoI`WrC&}Jk(Eyef(bk>-mN~K#0jzUmBzOW@B19xb0)0!xgd8?8WvEUzoYY`+!Ry)= zmKG-E1yf}oUKU_d<2kh`R_19YuYq)k#EdgcGs>py*EaGXh@kJUkjyTL+?p-_k6Q3S)0jSL`( zbaj@PxVuxPf6Y3y!`#>5wCCnS>?VwcFMs~sWTXFXmAZXNjr@xF2Y$a^X64e;{V`_+ zlb!uNrHYeYFAn|hUGDUs)2*ZZ_;RK%lLa20Pcz;S|FC;X$K!KJ{-637?1p$BX$j)SY3kV#Ofnoo@_}uFFcz&VVdN>#nv@zEq!wJ7P#sw z9KMhqXxFH?w}D63ibaHRE0D3)ie=0Egl*yz7N)j0?BYtPVw8Ng{rcYi+uI%E*`j@? kl%C&vi~ULhI2_LD-wo=@_|R<#3}prePgg&ebxsLQ0H?aEHUIzs literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/inhand-right.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4b405d90cfbbca8c33f26a07df8a2a1f630947 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R5S zr;B4q#hkad?ERP=WsZJyeUePQPPx-?Dj_v#vADsO zuxoKiAEs|OskVEQ^_g?8-c;WgDocEJc>dj#XDm-R8E~Rfp@gE+$MdeOj+>jT%~%un zX8#l8d(8~x{Kebn+*LRISyOuKzjnjiKmT?)p1S#CwSX7nrjz;h_a^=Qvi9$fyNWGL z4YD>;d=o!~+s{|D@e}9MaMxhE6Sug&>{jQ=^w>W3z0aq=<#+hFlgZ(_+Wb_G)c*2M zb_diM8*B)mAM*?>_7|*NFZt{<+X=P*;@-~zwfoN9d&3ofXa#KjCl@4LEh@E>=hmgq&#!N1TyXN%jnx-!)H?JuZrd2{Xzrxo f&!EsRm%x7EeY;8RsbP0l+XkKvg5RY literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/meta.json b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/meta.json new file mode 100644 index 00000000000..7cbc1208942 --- /dev/null +++ b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "scalpel" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/scalpel.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi/scalpel.png new file mode 100644 index 0000000000000000000000000000000000000000..44ec06e46319a765d5814f8eeb73d6e83931b1bb GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*1casLmiFo!+Hc-@ zal*_kKYxC`_2AX_DB&wWHH;-ee!&b5&u*jvIT4;Njv*QolM^IZO&FcL0v2dw9C#r0 zNJ=RzDk|zxP+ZWXS5jvdgiV|GPDVvVMMUb6kkG0nXAVpWlTgW$kdV;G(b3S!$vJRf p!K7(nS~)yP2OGM&neOgoWH`1$kgMo;jXTf|22WQ%mvv4FO#m))L>mAA literal 0 HcmV?d00001 diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 7b1ff4b54f2..662c8aa20b6 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -69,32 +69,24 @@ binds: - function: ShuttleBrake type: State key: Space -# Camera - Shitmed Change Start - function: CameraRotateLeft type: State key: NumpadNum7 - mod1: Control - function: CameraRotateRight type: State key: NumpadNum9 - mod1: Control - function: CameraReset type: State key: NumpadNum8 - mod1: Control - function: ZoomOut type: State key: NumpadNum4 - mod1: Control - function: ZoomIn type: State key: NumpadNum6 - mod1: Control - function: ResetZoom type: State key: NumpadNum5 - mod1: Control -# Shitmed Change End # Misc - function: ShowEscapeMenu type: State From 8ee865a7a4e8bd6adfa453fe59babb5d72d43a14 Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Tue, 26 Nov 2024 10:02:25 -0400 Subject: [PATCH 18/40] Minor Shitmed Bugfixes (#971) * full fucking send * ope forgot to remove the EE scripts * fix test * fix shitcode fail * DELTA THAT VALUE IS NULLABLE * whoopsie daysie * fixed??? * chat is this real * bugfixes * more bugfixes * goobmed --- .../_Shitmed/Surgery/SanitizedComponent.cs | 10 ++++++++ .../Surgery/SharedSurgerySystem.Steps.cs | 13 ++++++---- Resources/Prototypes/Body/Parts/silicon.yml | 5 ++-- .../_Shitmed/Body/Parts/cybernetic.yml | 4 +++- .../_Shitmed/Body/Parts/generic.yml | 24 +++++++++++++++++++ 5 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 Content.Shared/_Shitmed/Surgery/SanitizedComponent.cs diff --git a/Content.Shared/_Shitmed/Surgery/SanitizedComponent.cs b/Content.Shared/_Shitmed/Surgery/SanitizedComponent.cs new file mode 100644 index 00000000000..a9ebb11d370 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/SanitizedComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery; + +///

[DataField, AutoNetworkedField] public Color? EyeColor { get; set; } - - [DataField, AutoNetworkedField] - public EntityUid? OriginalBody { get; set; } } diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs index 8a9627e89e1..d29d2a94bef 100644 --- a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs @@ -32,19 +32,20 @@ private void OnPartAppearanceStartup(EntityUid uid, BodyPartAppearanceComponent || part.ToHumanoidLayers() is not { } relevantLayer) return; - if (part.OriginalBody == null - || TerminatingOrDeleted(part.OriginalBody.Value) - || !TryComp(part.OriginalBody.Value, out HumanoidAppearanceComponent? bodyAppearance)) + if (part.BaseLayerId != null) { component.ID = part.BaseLayerId; component.Type = relevantLayer; return; } + if (part.Body is not { Valid: true } body + || !TryComp(body, out HumanoidAppearanceComponent? bodyAppearance)) + return; + var customLayers = bodyAppearance.CustomBaseLayers; var spriteLayers = bodyAppearance.BaseLayers; component.Type = relevantLayer; - component.OriginalBody = part.OriginalBody.Value; part.Species = bodyAppearance.Species; diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs index b13ca80a97e..bdc3d4c7695 100644 --- a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs @@ -21,6 +21,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Content.Shared.Inventory; // Namespace has set accessors, leaving it on the default. namespace Content.Shared.Body.Systems; @@ -165,23 +166,20 @@ private void OnBodyDamageModify(Entity bodyEnt, ref DamageModifyE if (args.TargetPart != null) { var (targetType, _) = ConvertTargetBodyPart(args.TargetPart.Value); - args.Damage = args.Damage * GetPartDamageModifier(targetType); + args.Damage *= GetPartDamageModifier(targetType); } } private void OnPartDamageModify(Entity partEnt, ref DamageModifyEvent args) { if (partEnt.Comp.Body != null - && TryComp(partEnt.Comp.Body.Value, out DamageableComponent? damageable) - && damageable.DamageModifierSetId != null - && Prototypes.TryIndex(damageable.DamageModifierSetId, out var modifierSet)) - // TODO: We need to add a check to see if the given armor covers this part to cancel or not. - args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, modifierSet); + && TryComp(partEnt.Comp.Body.Value, out InventoryComponent? inventory)) + _inventory.RelayEvent((partEnt.Comp.Body.Value, inventory), ref args); if (Prototypes.TryIndex("PartDamage", out var partModifierSet)) args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, partModifierSet); - args.Damage = args.Damage * GetPartDamageModifier(partEnt.Comp.PartType); + args.Damage *= GetPartDamageModifier(partEnt.Comp.PartType); } private bool TryChangePartDamage(EntityUid entity, @@ -285,7 +283,7 @@ private static TargetBodyPart GetRandomPartSpread(IRobustRandom random, ushort t /// /// This should be called after body part damage was changed. /// - protected void CheckBodyPart( + public void CheckBodyPart( Entity partEnt, TargetBodyPart? targetPart, bool severed, diff --git a/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs b/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs index 00215048e73..4ebfc6b0ad6 100644 --- a/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs +++ b/Content.Shared/_Shitmed/BodyEffects/Subsystems/GenerateChildPartSystem.cs @@ -50,8 +50,6 @@ private void CreatePart(EntityUid uid, GenerateChildPartComponent component) component.Active = true; Dirty(childPart, childPartComp); } - - _bodySystem.ChangeSlotState((uid, partComp), false); } // Still unusued, gotta figure out what I want to do with this function outside of fuckery with mantis blades. @@ -60,7 +58,7 @@ private void DeletePart(EntityUid uid, GenerateChildPartComponent component) if (!TryComp(uid, out BodyPartComponent? partComp)) return; - _bodySystem.ChangeSlotState((uid, partComp), true); + _bodySystem.DropSlotContents((uid, partComp)); var ev = new BodyPartDroppedEvent((uid, partComp)); RaiseLocalEvent(uid, ref ev); QueueDel(uid); diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index 51b289efcb5..411584b4d02 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -362,7 +362,6 @@ private void OnAddPartStep(Entity ent, ref SurgeryS : removedComp.Part.ToString().ToLower(); _body.TryCreatePartSlot(args.Part, slotName, partComp.PartType, out var _); _body.AttachPart(args.Part, slotName, tool); - _body.ChangeSlotState((tool, partComp), false); EnsureComp(tool); var ev = new BodyPartAttachedEvent((tool, partComp)); RaiseLocalEvent(args.Body, ref ev); diff --git a/Content.Shared/_Shitmed/Targeting/Events.cs b/Content.Shared/_Shitmed/Targeting/Events.cs index 1b0d9564980..11a84cc4049 100644 --- a/Content.Shared/_Shitmed/Targeting/Events.cs +++ b/Content.Shared/_Shitmed/Targeting/Events.cs @@ -26,13 +26,3 @@ public TargetIntegrityChangeEvent(NetEntity uid, bool refreshUi = true) RefreshUi = refreshUi; } } - -public sealed class RefreshInventorySlotsEvent : EntityEventArgs -{ - public string SlotName { get; } - - public RefreshInventorySlotsEvent(string slotName) - { - SlotName = slotName; - } -} diff --git a/Resources/Locale/en-US/_Shitmed/inventory/slot-popup.ftl b/Resources/Locale/en-US/_Shitmed/inventory/slot-popup.ftl new file mode 100644 index 00000000000..d921423148c --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/inventory/slot-popup.ftl @@ -0,0 +1 @@ +equip-part-missing-error = {$target} is missing their {$part}! diff --git a/Resources/Locale/en-US/_Shitmed/surgery-popup.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl similarity index 100% rename from Resources/Locale/en-US/_Shitmed/surgery-popup.ftl rename to Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl diff --git a/Resources/Locale/en-US/_Shitmed/surgery-tools.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-tools.ftl similarity index 100% rename from Resources/Locale/en-US/_Shitmed/surgery-tools.ftl rename to Resources/Locale/en-US/_Shitmed/surgery/surgery-tools.ftl diff --git a/Resources/Locale/en-US/_Shitmed/surgery-ui.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-ui.ftl similarity index 87% rename from Resources/Locale/en-US/_Shitmed/surgery-ui.ftl rename to Resources/Locale/en-US/_Shitmed/surgery/surgery-ui.ftl index f09c9dc102a..415395f7815 100644 --- a/Resources/Locale/en-US/_Shitmed/surgery-ui.ftl +++ b/Resources/Locale/en-US/_Shitmed/surgery/surgery-ui.ftl @@ -1,3 +1,5 @@ +surgery-verb-text = Start surgery +surgery-verb-message = Begin surgery on this entity. surgery-ui-window-title = Surgery surgery-ui-window-require = Requires surgery-ui-window-parts = < Parts diff --git a/Resources/Locale/en-US/_Shitmed/technologies/technologies.ftl b/Resources/Locale/en-US/_Shitmed/technologies/technologies.ftl new file mode 100644 index 00000000000..d5db297ae29 --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/technologies/technologies.ftl @@ -0,0 +1,3 @@ +research-technology-advanced-treatment = Advanced Treatment +research-technology-high-end-surgery = High End Surgical Tools +research-technology-cybernetic-enhancements = Cybernetic Enhancements \ No newline at end of file diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 9387ce7c625..91a803da6ea 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -71,8 +71,3 @@ research-technology-advanced-spray = Advanced Spray research-technology-bluespace-cargo-transport = Bluespace Cargo Transport research-technology-quantum-fiber-weaving = Quantum Fiber Weaving research-technology-bluespace-chemistry = Bluespace Chemistry - -## Shitmed Change -research-technology-advanced-treatment = Advanced Treatment -research-technology-high-end-surgery = High End Surgical Tools -research-technology-cybernetic-enhancements = Cybernetic Enhancements \ No newline at end of file diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index 04796164674..3138083d540 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -153,6 +153,8 @@ description: "Filters toxins from the bloodstream." categories: [ HideSpawnMenu ] components: + - type: Organ # Shitmed + slotId: kidneys - type: Sprite layers: - state: kidney-l diff --git a/Resources/Prototypes/Body/Organs/human.yml b/Resources/Prototypes/Body/Organs/human.yml index 4f77171c234..bd19d42e0cf 100644 --- a/Resources/Prototypes/Body/Organs/human.yml +++ b/Resources/Prototypes/Body/Organs/human.yml @@ -250,6 +250,8 @@ name: kidneys description: "Filters toxins from the bloodstream." components: + - type: Organ # Shitmed + slotId: kidneys - type: Sprite layers: - state: kidney-l diff --git a/Resources/Prototypes/Body/Parts/animal.yml b/Resources/Prototypes/Body/Parts/animal.yml index abd34c0ef5a..a73552057be 100644 --- a/Resources/Prototypes/Body/Parts/animal.yml +++ b/Resources/Prototypes/Body/Parts/animal.yml @@ -45,6 +45,7 @@ - type: BodyPart partType: Hand symmetry: Left + slotId: hands # Shitmed - type: entity id: LegsAnimal @@ -58,6 +59,7 @@ - state: r_leg - type: BodyPart partType: Leg + slotId: legs # Shitmed - type: MovementBodyPart - type: entity @@ -72,6 +74,7 @@ - state: l_foot - type: BodyPart partType: Foot + slotId: feet # Shitmed - type: entity id: TorsoAnimal diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml index aec75988d16..bdbcbc53d0f 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml @@ -7,7 +7,7 @@ - type: StorageFill contents: - id: Hemostat - - id: Saw + - id: SawElectric # Shitmed Change - id: Drill - id: Cautery - id: Retractor diff --git a/Resources/Prototypes/Catalog/Fills/Crates/medical.yml b/Resources/Prototypes/Catalog/Fills/Crates/medical.yml index ae7ec3b9850..cc41906b2f4 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/medical.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/medical.yml @@ -65,7 +65,7 @@ - id: Retractor - id: Cautery - id: Drill - - id: Saw + - id: SawElectric # Shitmed Change - id: Hemostat - id: ClothingMaskSterile # Shitmed Change diff --git a/Resources/Prototypes/Entities/Objects/Misc/pen.yml b/Resources/Prototypes/Entities/Objects/Misc/pen.yml index 6e02f4be241..45f90f9603b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/pen.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/pen.yml @@ -42,13 +42,13 @@ damage: types: Piercing: 3 -# - type: Tending # Shitmed TODO: Uncomment this when surgeries arent tied to interaction events, but verbs. -# speed: 0.55 -# - type: SurgeryTool # Shitmed -# startSound: -# path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg -# endSound: -# path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg + - type: Tending # Shitmed + speed: 0.55 + - type: SurgeryTool # Shitmed + startSound: + path: /Audio/_Shitmed/Medical/Surgery/retractor1.ogg + endSound: + path: /Audio/_Shitmed/Medical/Surgery/hemostat1.ogg #TODO: I want the luxury pen to write a cool font like Merriweather in the future. diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index da8564dac11..5fce880c7de 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -225,63 +225,3 @@ materials: Steel: 100 Plastic: 100 - -# Shitmed Recipes - -- type: latheRecipe - id: BoneGel - result: BoneGel - completetime: 2 - materials: - Plastic: 200 - Plasma: 200 - -- type: latheRecipe - id: MedicalCyberneticEyes - result: MedicalCyberneticEyes - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 - -- type: latheRecipe - id: EnergyScalpel - result: EnergyScalpel - completetime: 2 - materials: - Steel: 600 - Glass: 150 - Gold: 150 - -- type: latheRecipe - id: AdvancedRetractor - result: AdvancedRetractor - completetime: 2 - materials: - Steel: 600 - Glass: 150 - Silver: 150 - -- type: latheRecipe - id: EnergyCautery - result: EnergyCautery - completetime: 2 - materials: - Steel: 600 - Glass: 150 - Plasma: 150 - -- type: latheRecipe - id: OmnimedTool - result: OmnimedTool - completetime: 2 - materials: - Steel: 600 - Glass: 150 - Gold: 150 - Silver: 150 - Plasma: 150 \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index b761ed54e7f..36ceff065b3 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -202,86 +202,3 @@ parent: BaseBorgModuleRecipe id: BorgModuleHarvesting result: BorgModuleHarvesting - -# Shitmed Recipes - -- type: latheRecipe - id: BorgModuleSurgery - result: BorgModuleSurgery - category: Robotics - completetime: 3 - materials: - Steel: 250 - Glass: 250 - Plastic: 250 - -- type: latheRecipe - id: BorgModuleAdvancedSurgery - result: BorgModuleAdvancedSurgery - category: Robotics - completetime: 3 - materials: - Steel: 500 - Glass: 500 - Plastic: 250 - Gold: 50 - -- type: latheRecipe - id: JawsOfLifeLeftArm - result: JawsOfLifeLeftArm - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 - -- type: latheRecipe - id: JawsOfLifeRightArm - result: JawsOfLifeRightArm - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 - -- type: latheRecipe - id: SpeedLeftLeg - result: SpeedLeftLeg - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 - -- type: latheRecipe - id: SpeedRightLeg - result: SpeedRightLeg - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 - -- type: latheRecipe - id: BasicCyberneticEyes - result: BasicCyberneticEyes - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index d850691584d..ac695f314a0 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -714,17 +714,3 @@ Plastic: 1000 Plasma: 500 Glass: 500 - -# Shitmed Recipes - -- type: latheRecipe - id: SecurityCyberneticEyes - result: SecurityCyberneticEyes - category: Robotics - completetime: 5 - materials: - Steel: 1000 - Glass: 500 - Plastic: 500 - Gold: 300 - Silver: 300 diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index b4cf857cd9d..227cb28746d 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -130,43 +130,6 @@ - CryostasisBeaker - SyringeCryostasis -# Shitmed Change Start -- type: technology - id: AdvancedTreatment - name: research-technology-advanced-treatment - icon: - sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi - state: e-scalpel-on - discipline: CivilianServices - tier: 2 - cost: 5000 - recipeUnlocks: - - BorgModuleAdvancedTreatment - - BorgModuleDefibrillator - - EnergyScalpel - - EnergyCautery - - AdvancedRetractor - - BorgModuleAdvancedSurgery - -- type: technology - id: CyberneticEnhancements - name: research-technology-cybernetic-enhancements - icon: - sprite: _Shitmed/Mobs/Species/IPC/organs.rsi - state: eyes - discipline: CivilianServices - tier: 2 - cost: 15000 - recipeUnlocks: - - JawsOfLifeLeftArm - - JawsOfLifeRightArm - - SpeedLeftLeg - - SpeedRightLeg - - BasicCyberneticEyes - - SecurityCyberneticEyes - - MedicalCyberneticEyes -# Shitmed Change End - - type: technology id: AdvancedCleaning name: research-technology-advanced-cleaning diff --git a/Resources/Prototypes/_Shitmed/Recipes/Lathes/medical.yml b/Resources/Prototypes/_Shitmed/Recipes/Lathes/medical.yml new file mode 100644 index 00000000000..fc1665cbaed --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Recipes/Lathes/medical.yml @@ -0,0 +1,59 @@ +# Shitmed Recipes + +- type: latheRecipe + id: BoneGel + result: BoneGel + completetime: 2 + materials: + Plastic: 200 + Plasma: 200 + +- type: latheRecipe + id: MedicalCyberneticEyes + result: MedicalCyberneticEyes + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: EnergyScalpel + result: EnergyScalpel + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Gold: 150 + +- type: latheRecipe + id: AdvancedRetractor + result: AdvancedRetractor + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Silver: 150 + +- type: latheRecipe + id: EnergyCautery + result: EnergyCautery + completetime: 2 + materials: + Steel: 600 + Glass: 150 + Plasma: 150 + +- type: latheRecipe + id: OmnimedTool + result: OmnimedTool + completetime: 2 + materials: + Steel: 1200 + Glass: 300 + Gold: 300 + Silver: 300 + Plasma: 300 diff --git a/Resources/Prototypes/_Shitmed/Recipes/Lathes/robotics.yml b/Resources/Prototypes/_Shitmed/Recipes/Lathes/robotics.yml new file mode 100644 index 00000000000..66b21379f0a --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Recipes/Lathes/robotics.yml @@ -0,0 +1,80 @@ +- type: latheRecipe + id: BorgModuleSurgery + result: BorgModuleSurgery + category: Robotics + completetime: 3 + materials: + Steel: 250 + Glass: 250 + Plastic: 250 + +- type: latheRecipe + id: BorgModuleAdvancedSurgery + result: BorgModuleAdvancedSurgery + category: Robotics + completetime: 3 + materials: + Steel: 500 + Glass: 500 + Plastic: 250 + Gold: 50 + +- type: latheRecipe + id: JawsOfLifeLeftArm + result: JawsOfLifeLeftArm + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: JawsOfLifeRightArm + result: JawsOfLifeRightArm + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: SpeedLeftLeg + result: SpeedLeftLeg + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: SpeedRightLeg + result: SpeedRightLeg + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 + +- type: latheRecipe + id: BasicCyberneticEyes + result: BasicCyberneticEyes + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Recipes/Lathes/security.yml b/Resources/Prototypes/_Shitmed/Recipes/Lathes/security.yml new file mode 100644 index 00000000000..3367add7e91 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Recipes/Lathes/security.yml @@ -0,0 +1,11 @@ +- type: latheRecipe + id: SecurityCyberneticEyes + result: SecurityCyberneticEyes + category: Robotics + completetime: 5 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Gold: 300 + Silver: 300 \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Research/civilianservices.yml b/Resources/Prototypes/_Shitmed/Research/civilianservices.yml new file mode 100644 index 00000000000..1e6c4d6b8a4 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Research/civilianservices.yml @@ -0,0 +1,52 @@ +# Tier 1 + +# Tier 2 + +- type: technology + id: AdvancedTreatment + name: research-technology-advanced-treatment + icon: + sprite: _Shitmed/Objects/Specific/Medical/Surgery/e-scalpel.rsi + state: e-scalpel-on + discipline: CivilianServices + tier: 2 + cost: 10000 + recipeUnlocks: + - BorgModuleAdvancedTreatment + - BorgModuleDefibrillator + - EnergyScalpel + - EnergyCautery + - AdvancedRetractor + - BorgModuleAdvancedSurgery + +- type: technology + id: CyberneticEnhancements + name: research-technology-cybernetic-enhancements + icon: + sprite: _Shitmed/Mobs/Species/IPC/organs.rsi + state: eyes + discipline: CivilianServices + tier: 2 + cost: 15000 + recipeUnlocks: + - JawsOfLifeLeftArm + - JawsOfLifeRightArm + - SpeedLeftLeg + - SpeedRightLeg + - BasicCyberneticEyes + - SecurityCyberneticEyes + - MedicalCyberneticEyes + +# Tier 3 + +- type: technology + id: HighEndSurgery + name: research-technology-high-end-surgery + icon: + sprite: _Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi + state: omnimed + discipline: CivilianServices + tier: 3 + cost: 10000 + recipeUnlocks: + - OmnimedTool \ No newline at end of file From f39c249948ed7bd0f099a93ae11c241076baa98c Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:03:20 +0000 Subject: [PATCH 23/40] add autodoc (#970) Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../_Shitmed/Autodoc/AddStepWindow.xaml | 14 + .../_Shitmed/Autodoc/AddStepWindow.xaml.cs | 138 +++++ .../Autodoc/AutodocBoundUserInterface.cs | 40 ++ .../Autodoc/AutodocProgramWindow.xaml | 19 + .../Autodoc/AutodocProgramWindow.xaml.cs | 169 ++++++ .../_Shitmed/Autodoc/AutodocWindow.xaml | 14 + .../_Shitmed/Autodoc/AutodocWindow.xaml.cs | 186 +++++++ .../_Shitmed/Autodoc/PickSurgeryWindow.xaml | 20 + .../Autodoc/PickSurgeryWindow.xaml.cs | 121 +++++ .../_Shitmed/Autodoc/Systems/AutodocSystem.cs | 5 + .../Autodoc/AutodocSafetyWireAction.cs | 37 ++ .../_Shitmed/Autodoc/Systems/AutodocSystem.cs | 51 ++ .../_Shitmed/Autodoc/AutodocSteps.cs | 238 ++++++++ Content.Shared/_Shitmed/Autodoc/AutodocUI.cs | 51 ++ .../Components/ActiveAutodocComponent.cs | 44 ++ .../Autodoc/Components/AutodocComponent.cs | 72 +++ .../Autodoc/Components/HandsFillComponent.cs | 17 + .../Autodoc/Systems/HandsFillSystem.cs | 39 ++ .../Autodoc/Systems/SharedAutodocSystem.cs | 506 ++++++++++++++++++ .../SurgeryHasBodyConditionComponent.cs | 9 + .../Surgery/SharedSurgerySystem.Steps.cs | 4 +- .../_Shitmed/Surgery/SharedSurgerySystem.cs | 19 +- .../_Shitmed/Surgery/SurgeryStepEvent.cs | 8 + Resources/Locale/en-US/_Shitmed/autodoc.ftl | 67 +++ .../en-US/_Shitmed/guidebook/guides.ftl | 5 + .../machine-linking/receiver_ports.ftl | 3 + .../en-US/_Shitmed/research/technologies.ftl | 1 + .../en-US/_Shitmed/wires/wire-names.ftl | 3 + Resources/Locale/en-US/guidebook/guides.ftl | 6 - .../Furniture/Tables/operating_table.yml | 9 + .../Entities/Structures/Machines/lathe.yml | 1 + Resources/Prototypes/Guidebook/medical.yml | 31 -- .../_Shitmed/DeviceLinking/sink_ports.yml | 4 + .../_Shitmed/DeviceLinking/source_ports.yml | 5 + .../Circuitboards/Machine/production.yml | 24 + .../Entities/Structures/Machines/autodoc.yml | 104 ++++ .../_Shitmed/Entities/Surgery/surgeries.yml | 1 + .../Prototypes/_Shitmed/Guidebook/medical.yml | 32 ++ .../_Shitmed/Recipes/Lathes/electronics.yml | 4 + .../_Shitmed/Research/civilianservices.yml | 12 + .../Prototypes/_Shitmed/Wires/layouts.yml | 5 + .../_Shitmed/Guidebook/Medical/Autodoc.xml | 42 ++ .../_Shitmed/Guidebook/Medical/Surgery.xml | 12 + .../Structures/Machines/autodoc.rsi/idle.png | Bin 0 -> 727 bytes .../Structures/Machines/autodoc.rsi/meta.json | 14 + 45 files changed, 2164 insertions(+), 42 deletions(-) create mode 100644 Content.Client/_Shitmed/Autodoc/AddStepWindow.xaml create mode 100644 Content.Client/_Shitmed/Autodoc/AddStepWindow.xaml.cs create mode 100644 Content.Client/_Shitmed/Autodoc/AutodocBoundUserInterface.cs create mode 100644 Content.Client/_Shitmed/Autodoc/AutodocProgramWindow.xaml create mode 100644 Content.Client/_Shitmed/Autodoc/AutodocProgramWindow.xaml.cs create mode 100644 Content.Client/_Shitmed/Autodoc/AutodocWindow.xaml create mode 100644 Content.Client/_Shitmed/Autodoc/AutodocWindow.xaml.cs create mode 100644 Content.Client/_Shitmed/Autodoc/PickSurgeryWindow.xaml create mode 100644 Content.Client/_Shitmed/Autodoc/PickSurgeryWindow.xaml.cs create mode 100644 Content.Client/_Shitmed/Autodoc/Systems/AutodocSystem.cs create mode 100644 Content.Server/_Shitmed/Autodoc/AutodocSafetyWireAction.cs create mode 100644 Content.Server/_Shitmed/Autodoc/Systems/AutodocSystem.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/AutodocSteps.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/AutodocUI.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/Components/ActiveAutodocComponent.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/Components/AutodocComponent.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/Components/HandsFillComponent.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/Systems/HandsFillSystem.cs create mode 100644 Content.Shared/_Shitmed/Autodoc/Systems/SharedAutodocSystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryHasBodyConditionComponent.cs create mode 100644 Resources/Locale/en-US/_Shitmed/autodoc.ftl create mode 100644 Resources/Locale/en-US/_Shitmed/guidebook/guides.ftl create mode 100644 Resources/Locale/en-US/_Shitmed/machine-linking/receiver_ports.ftl create mode 100644 Resources/Locale/en-US/_Shitmed/research/technologies.ftl create mode 100644 Resources/Locale/en-US/_Shitmed/wires/wire-names.ftl create mode 100644 Resources/Prototypes/_Shitmed/DeviceLinking/sink_ports.yml create mode 100644 Resources/Prototypes/_Shitmed/DeviceLinking/source_ports.yml create mode 100644 Resources/Prototypes/_Shitmed/Entities/Objects/Devices/Circuitboards/Machine/production.yml create mode 100644 Resources/Prototypes/_Shitmed/Entities/Structures/Machines/autodoc.yml create mode 100644 Resources/Prototypes/_Shitmed/Guidebook/medical.yml create mode 100644 Resources/Prototypes/_Shitmed/Recipes/Lathes/electronics.yml create mode 100644 Resources/Prototypes/_Shitmed/Wires/layouts.yml create mode 100644 Resources/ServerInfo/_Shitmed/Guidebook/Medical/Autodoc.xml create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/autodoc.rsi/idle.png create mode 100644 Resources/Textures/_Shitmed/Structures/Machines/autodoc.rsi/meta.json diff --git a/Content.Client/_Shitmed/Autodoc/AddStepWindow.xaml b/Content.Client/_Shitmed/Autodoc/AddStepWindow.xaml new file mode 100644 index 00000000000..2ae514e373e --- /dev/null +++ b/Content.Client/_Shitmed/Autodoc/AddStepWindow.xaml @@ -0,0 +1,14 @@ + + +
[DataField("blacklist")] public EntityWhitelist? Blacklist = null; - - /// - /// Shitmed Change: Is this slot disabled? Could be due to severing or other reasons. - /// - [DataField] public bool Disabled; } diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs index bdc3d4c7695..6e145b7303d 100644 --- a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs @@ -150,7 +150,7 @@ private void OnTryChangePartDamage(Entity ent, ref TryChangePartD if (targetPart == null) return; - if (!TryChangePartDamage(ent, args.Damage, args.CanSever, args.CanEvade, args.PartMultiplier, targetPart.Value) + if (!TryChangePartDamage(ent, args.Damage, args.IgnoreResistances, args.CanSever, args.CanEvade, args.PartMultiplier, targetPart.Value) && args.CanEvade) { if (_net.IsServer) @@ -184,6 +184,7 @@ private void OnPartDamageModify(Entity partEnt, ref DamageMod private bool TryChangePartDamage(EntityUid entity, DamageSpecifier damage, + bool ignoreResistances, bool canSever, bool canEvade, float partMultiplier, @@ -202,7 +203,7 @@ private bool TryChangePartDamage(EntityUid entity, if (canEvade && TryEvadeDamage(entity, GetEvadeChance(targetType))) continue; - var damageResult = _damageable.TryChangeDamage(part.FirstOrDefault().Id, damage * partMultiplier, canSever: canSever); + var damageResult = _damageable.TryChangeDamage(part.FirstOrDefault().Id, damage * partMultiplier, ignoreResistances, canSever: canSever); if (damageResult != null && damageResult.GetTotal() != 0) landed = true; } diff --git a/Resources/Prototypes/Body/Organs/diona.yml b/Resources/Prototypes/Body/Organs/diona.yml index 369581645a3..5d0fb674c9f 100644 --- a/Resources/Prototypes/Body/Organs/diona.yml +++ b/Resources/Prototypes/Body/Organs/diona.yml @@ -37,7 +37,7 @@ - type: Sprite state: brain - type: Organ # Shitmed - slotId: Brain + slotId: brain - type: Brain # Shitmed - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Body/Organs/slime.yml b/Resources/Prototypes/Body/Organs/slime.yml index 84450ad74dd..b1fbadf6a51 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 ] diff --git a/Resources/Prototypes/Body/Parts/animal.yml b/Resources/Prototypes/Body/Parts/animal.yml index a73552057be..351e2378311 100644 --- a/Resources/Prototypes/Body/Parts/animal.yml +++ b/Resources/Prototypes/Body/Parts/animal.yml @@ -44,7 +44,7 @@ - state: r_hand - type: BodyPart partType: Hand - symmetry: Left + #symmetry: Left slotId: hands # Shitmed - type: entity diff --git a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml index 2a7d3a79896..9ba7c85e1e1 100644 --- a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml +++ b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml @@ -129,55 +129,3 @@ damage: types: Blunt: 200 - -# Shitmed Change Start - -- type: entity - name: bang severer - parent: BaseItem - id: MeleeDebugSever - description: sever yer parts a week from now - suffix: DEBUG - components: - - type: Tag - tags: - - Debug - - type: Sprite - sprite: Objects/Weapons/Melee/debug.rsi - state: icon - - type: MeleeWeapon - damage: - types: - Slash: 20000 - clickPartDamageMultiplier: 10 - - type: Item - size: Tiny - sprite: Objects/Weapons/Melee/debug.rsi - -- type: entity - name: bang severer 100dmg - parent: MeleeDebugSever - id: MeleeDebugSever100 - components: - - type: Tag - tags: - - Debug - - type: MeleeWeapon - damage: - types: - Slash: 100 - -- type: entity - name: bang severer 200dmg - parent: MeleeDebugSever - id: MeleeDebugSever200 - components: - - type: Tag - tags: - - Debug - - type: MeleeWeapon - damage: - types: - Slash: 200 - -# Shitmed Change End diff --git a/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml b/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml index f2e83696f5b..85bb60fe6ea 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml @@ -13,6 +13,8 @@ state: operating_table - type: OperatingTable # Begin Shitmed Changes + - type: Machine + board: OperatingTableCircuitboard - type: DeviceList - type: DeviceNetwork deviceNetId: Wired diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index bc4e62fc4ac..4ecc8a7ee4b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -513,6 +513,7 @@ - CutterMachineCircuitboard - StationAnchorCircuitboard - SalvageMagnetMachineCircuitboard + - OperatingTableCircuitboard # Shitmed Change dynamicRecipes: - ThermomachineFreezerMachineCircuitBoard - HellfireFreezerMachineCircuitBoard diff --git a/Resources/Prototypes/_Shitmed/Entities/Debugging/debug_sweps.yml b/Resources/Prototypes/_Shitmed/Entities/Debugging/debug_sweps.yml new file mode 100644 index 00000000000..fa70fe7abb8 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Entities/Debugging/debug_sweps.yml @@ -0,0 +1,82 @@ +- type: entity + name: bang severer + parent: BaseItem + id: MeleeDebugSever + description: sever yer parts a week from now + suffix: DEBUG + components: + - type: Tag + tags: + - Debug + - type: Sprite + sprite: Objects/Weapons/Melee/debug.rsi + state: icon + - type: MeleeWeapon + damage: + types: + Slash: 20000 + clickPartDamageMultiplier: 10 + - type: Item + size: Tiny + sprite: Objects/Weapons/Melee/debug.rsi + +- type: entity + name: bang severer 100dmg + parent: MeleeDebugSever + id: MeleeDebugSever100 + components: + - type: Tag + tags: + - Debug + - type: MeleeWeapon + damage: + types: + Slash: 100 + +- type: entity + name: bang severer 200dmg + parent: MeleeDebugSever + id: MeleeDebugSever200 + components: + - type: Tag + tags: + - Debug + - type: MeleeWeapon + damage: + types: + Slash: 200 + +- type: entity + name: bang burner + parent: BaseItem + id: MeleeDebugBurner + description: burn yer parts + suffix: DEBUG + components: + - type: Tag + tags: + - Debug + - type: Sprite + sprite: Objects/Weapons/Melee/debug.rsi + state: icon + - type: MeleeWeapon + damage: + types: + Heat: 20000 + clickPartDamageMultiplier: 10 + - type: Item + size: Tiny + sprite: Objects/Weapons/Melee/debug.rsi + +- type: entity + name: bang burner 200dmg + parent: MeleeDebugBurner + id: MeleeDebugBurner200 + components: + - type: Tag + tags: + - Debug + - type: MeleeWeapon + damage: + types: + Heat: 200 diff --git a/Resources/Prototypes/_Shitmed/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/_Shitmed/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 6b73708ba82..e14223f0882 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -22,3 +22,16 @@ components: - type: MachineBoard prototype: AutodocSyndie + +- type: entity + parent: BaseMachineCircuitboard + id: OperatingTableCircuitboard + name: operating table machine board + description: A machine printed circuit board for an operating table. + components: + - type: MachineBoard + prototype: OperatingTable + stackRequirements: + Cable: 3 + Silver: 2 + Steel: 4 diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml index ac89c4dc356..438a91e4c12 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml @@ -186,7 +186,6 @@ - type: SurgeryPartRemovedCondition connection: hands part: Hand - symmetry: Left # shitcode i guess because of ui icons - type: entity parent: SurgeryBase diff --git a/Resources/Prototypes/_Shitmed/Recipes/Lathes/electronics.yml b/Resources/Prototypes/_Shitmed/Recipes/Lathes/electronics.yml index ccc2eb75d2a..77bd0ac5642 100644 --- a/Resources/Prototypes/_Shitmed/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/_Shitmed/Recipes/Lathes/electronics.yml @@ -2,3 +2,8 @@ parent: BaseGoldCircuitboardRecipe id: AutodocCircuitboard result: AutodocCircuitboard + +- type: latheRecipe + parent: BaseGoldCircuitboardRecipe + id: OperatingTableCircuitboard + result: OperatingTableCircuitboard diff --git a/Resources/Prototypes/_Shitmed/Research/civilianservices.yml b/Resources/Prototypes/_Shitmed/Research/civilianservices.yml index 6101c1c9fb3..3db90d8dc86 100644 --- a/Resources/Prototypes/_Shitmed/Research/civilianservices.yml +++ b/Resources/Prototypes/_Shitmed/Research/civilianservices.yml @@ -61,4 +61,4 @@ tier: 3 cost: 10000 recipeUnlocks: - - OmnimedTool \ No newline at end of file + - OmnimedTool From 468dc147479eecf2d5999291b029444222f0c321 Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Sun, 1 Dec 2024 21:26:58 -0400 Subject: [PATCH 25/40] Fix operating table test fail (#1041) --- .../Structures/Furniture/Tables/operating_table.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml b/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml index 85bb60fe6ea..668ecdca97f 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/Tables/operating_table.yml @@ -13,8 +13,18 @@ state: operating_table - type: OperatingTable # Begin Shitmed Changes + - type: Construction + graph: Machine + node: machine + containers: + - machine_board + - machine_parts - type: Machine board: OperatingTableCircuitboard + - type: ContainerContainer + containers: + machine_board: !type:Container + machine_parts: !type:Container - type: DeviceList - type: DeviceNetwork deviceNetId: Wired From 6104945b29c5c011285ece0a6dfc1f463c8bc9a7 Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:46:27 -0400 Subject: [PATCH 26/40] Yet another shitmed update (#1104) --- Content.Shared/Body/Organ/OrganComponent.cs | 5 +- .../Body/Systems/SharedBodySystem.Body.cs | 1 - .../Stealth/Components/StealthComponent.cs | 4 +- Content.Shared/Stealth/SharedStealthSystem.cs | 3 +- .../BatteryAmmoProviderComponent.cs | 4 +- .../Ranged/Systems/SharedGunSystem.Battery.cs | 11 +- .../Goliath/GoliathTentacleComponent.cs | 18 ++ .../Goliath/GoliathTentacleSystem.cs | 23 +++ .../SurgeryBodyComponentConditionComponent.cs | 24 +++ .../SurgeryComponentConditionComponent.cs | 17 -- .../SurgeryOrganOnAddConditionComponent.cs | 26 +++ .../SurgeryPartComponentConditionComponent.cs | 24 +++ .../Surgery/SharedSurgerySystem.Steps.cs | 74 ++++++++ .../_Shitmed/Surgery/SharedSurgerySystem.cs | 62 ++++++- .../Surgery/Steps/SurgeryStepComponent.cs | 18 ++ .../en-US/_Shitmed/surgery/surgery-popup.ftl | 3 +- .../Mobs/Customization/Markings/reptilian.yml | 14 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 98 +++++------ .../Entities/Mobs/NPCs/asteroid.yml | 2 + .../Entities/Mobs/NPCs/miscellaneous.yml | 20 +-- .../Prototypes/Entities/Mobs/NPCs/space.yml | 8 +- .../Entities/Mobs/Player/dragon.yml | 5 +- .../Entities/Mobs/Player/humanoid.yml | 5 + .../Objects/Specific/Medical/surgery.yml | 12 +- .../monkey_inventory_template.yml | 160 +++++++++++------- Resources/Prototypes/Roles/Antags/nukeops.yml | 1 + .../_Shitmed/Body/Actions/organactions.yml | 20 +++ .../_Shitmed/Body/Organs/Animal/animal.yml | 62 +++++++ .../_Shitmed/Body/Organs/Animal/kobold.yml | 119 +++++++++++++ .../_Shitmed/Body/Organs/Animal/monkey.yml | 119 +++++++++++++ .../_Shitmed/Body/Organs/Animal/space.yml | 66 +++++++- .../Body/Prototypes/Animal/dragon.yml | 21 +++ .../Body/Prototypes/Animal/goliath.yml | 21 +++ .../Body/Prototypes/Animal/kobold.yml | 51 ++++++ .../Body/Prototypes/Animal/laserraptor.yml | 26 +++ .../Body/Prototypes/Animal/monkey.yml | 51 ++++++ .../Body/Prototypes/Animal/spacecobra.yml | 21 +++ .../Entities/Mobs/Species/primate.yml | 41 +++++ .../_Shitmed/Entities/Surgery/surgeries.yml | 30 +++- .../Entities/Surgery/surgery_steps.yml | 33 ++-- .../Prototypes/_Shitmed/Species/kobold.yml | 148 ++++++++++++++++ .../Prototypes/_Shitmed/Species/monkey.yml | 144 ++++++++++++++++ .../Textures/Mobs/Animals/kobold.rsi/eyes.png | Bin 0 -> 126 bytes .../Textures/Mobs/Animals/kobold.rsi/full.png | Bin 0 -> 733 bytes .../Mobs/Animals/kobold.rsi/head_f.png | Bin 0 -> 653 bytes .../Mobs/Animals/kobold.rsi/head_m.png | Bin 0 -> 653 bytes .../Mobs/Animals/kobold.rsi/innerline.png | Bin 0 -> 10385 bytes .../Mobs/Animals/kobold.rsi/kobold.png | Bin 10385 -> 10720 bytes .../Mobs/Animals/kobold.rsi/l_arm.png | Bin 0 -> 278 bytes .../Mobs/Animals/kobold.rsi/l_foot.png | Bin 0 -> 231 bytes .../Mobs/Animals/kobold.rsi/l_hand.png | Bin 0 -> 267 bytes .../Mobs/Animals/kobold.rsi/l_leg.png | Bin 0 -> 253 bytes .../Mobs/Animals/kobold.rsi/meta.json | 65 ++++++- .../Mobs/Animals/kobold.rsi/r_arm.png | Bin 0 -> 313 bytes .../Mobs/Animals/kobold.rsi/r_foot.png | Bin 0 -> 239 bytes .../Mobs/Animals/kobold.rsi/r_hand.png | Bin 0 -> 275 bytes .../Mobs/Animals/kobold.rsi/r_leg.png | Bin 0 -> 256 bytes .../Textures/Mobs/Animals/kobold.rsi/tail.png | Bin 0 -> 531 bytes .../Mobs/Animals/kobold.rsi/torso_f.png | Bin 0 -> 605 bytes .../Mobs/Animals/kobold.rsi/torso_m.png | Bin 0 -> 605 bytes .../Textures/Mobs/Animals/monkey.rsi/eyes.png | Bin 0 -> 126 bytes .../Textures/Mobs/Animals/monkey.rsi/full.png | Bin 0 -> 519 bytes .../Mobs/Animals/monkey.rsi/head_f.png | Bin 0 -> 477 bytes .../Mobs/Animals/monkey.rsi/head_m.png | Bin 0 -> 477 bytes .../Mobs/Animals/monkey.rsi/l_arm.png | Bin 0 -> 238 bytes .../Mobs/Animals/monkey.rsi/l_foot.png | Bin 0 -> 211 bytes .../Mobs/Animals/monkey.rsi/l_hand.png | Bin 0 -> 188 bytes .../Mobs/Animals/monkey.rsi/l_leg.png | Bin 0 -> 255 bytes .../Mobs/Animals/monkey.rsi/meta.json | 85 ++++++++-- .../Mobs/Animals/monkey.rsi/r_arm.png | Bin 0 -> 261 bytes .../Mobs/Animals/monkey.rsi/r_foot.png | Bin 0 -> 214 bytes .../Mobs/Animals/monkey.rsi/r_hand.png | Bin 0 -> 191 bytes .../Mobs/Animals/monkey.rsi/r_leg.png | Bin 0 -> 256 bytes .../Textures/Mobs/Animals/monkey.rsi/tail.png | Bin 0 -> 360 bytes .../Mobs/Animals/monkey.rsi/torso_f.png | Bin 0 -> 465 bytes .../Mobs/Animals/monkey.rsi/torso_m.png | Bin 0 -> 465 bytes .../Cobra/organs.rsi/heart-inhand-left.png | Bin 0 -> 467 bytes .../Cobra/organs.rsi/heart-inhand-right.png | Bin 0 -> 472 bytes .../Space/Cobra/organs.rsi/heart-off.png | Bin 0 -> 314 bytes .../Space/Cobra/organs.rsi/heart-on.png | Bin 0 -> 459 bytes .../Species/Space/Cobra/organs.rsi/meta.json | 32 ++++ .../Goliath/organs.rsi/heart-inhand-left.png | Bin 0 -> 479 bytes .../Goliath/organs.rsi/heart-inhand-right.png | Bin 0 -> 481 bytes .../Space/Goliath/organs.rsi/heart-off.png | Bin 0 -> 319 bytes .../Space/Goliath/organs.rsi/heart-on.png | Bin 0 -> 517 bytes .../Space/Goliath/organs.rsi/meta.json | 32 ++++ .../Species/Space/LaserRaptor/eyeball-l.png | Bin 0 -> 364 bytes .../Species/Space/LaserRaptor/eyeball-r.png | Bin 0 -> 354 bytes .../LaserRaptor/eyeballs-inhand-left.png | Bin 0 -> 175 bytes .../LaserRaptor/eyeballs-inhand-right.png | Bin 0 -> 174 bytes .../Mobs/Species/Space/LaserRaptor/meta.json | 25 +++ .../Surgery/omnimed.rsi/evil-inhand-left.png | Bin 0 -> 459 bytes .../Surgery/omnimed.rsi/evil-inhand-right.png | Bin 0 -> 458 bytes .../Medical/Surgery/omnimed.rsi/evil.png | Bin 0 -> 316 bytes .../Medical/Surgery/omnimed.rsi/meta.json | 11 ++ 95 files changed, 1660 insertions(+), 205 deletions(-) create mode 100644 Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleComponent.cs create mode 100644 Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleSystem.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryBodyComponentConditionComponent.cs delete mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganOnAddConditionComponent.cs create mode 100644 Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartComponentConditionComponent.cs create mode 100644 Resources/Prototypes/_Shitmed/Body/Actions/organactions.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Organs/Animal/kobold.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Organs/Animal/monkey.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/dragon.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/goliath.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/kobold.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/laserraptor.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/monkey.yml create mode 100644 Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/spacecobra.yml create mode 100644 Resources/Prototypes/_Shitmed/Entities/Mobs/Species/primate.yml create mode 100644 Resources/Prototypes/_Shitmed/Species/kobold.yml create mode 100644 Resources/Prototypes/_Shitmed/Species/monkey.yml create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/full.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/head_f.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/innerline.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/tail.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/torso_f.png create mode 100644 Resources/Textures/Mobs/Animals/kobold.rsi/torso_m.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/full.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/head_f.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/tail.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/torso_f.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/torso_m.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-off.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-on.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/heart-inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/heart-inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/heart-off.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/heart-on.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/meta.json create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeball-l.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeball-r.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeballs-inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeballs-inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/meta.json create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/evil-inhand-left.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/evil-inhand-right.png create mode 100644 Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/evil.png diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 34dc4abf1a6..2f575952e9c 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -2,12 +2,13 @@ using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; // Shitmed Change +using Content.Shared._Shitmed.Medical.Surgery; // Shitmed Change using Content.Shared._Shitmed.Medical.Surgery.Tools; // Shitmed Change namespace Content.Shared.Body.Organ; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(SharedBodySystem))] +[Access(typeof(SharedBodySystem), typeof(SharedSurgerySystem))] // Shitmed Change public sealed partial class OrganComponent : Component, ISurgeryToolComponent // Shitmed Change { /// @@ -52,7 +53,7 @@ public sealed partial class OrganComponent : Component, ISurgeryToolComponent // public ComponentRegistry? OnAdd; /// - /// When removed, the organ will ensure these components on the entity, and add them on removal. + /// When removed, the organ will ensure these components on the entity, and delete them on insertion. /// [DataField] public ComponentRegistry? OnRemove; diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 89de3d68a5f..f3361872701 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -456,7 +456,6 @@ private void OnProfileLoadFinished(EntityUid uid, BodyComponent component, Profi || !Initialized(uid)) // We do this last one for urists on test envs. return; - Logger.Debug($"{ToPrettyString(uid)}: ProfileLoadFinished with {HasComp(uid)} and {component}"); foreach (var part in GetBodyChildren(uid, component)) EnsureComp(part.Id); } diff --git a/Content.Shared/Stealth/Components/StealthComponent.cs b/Content.Shared/Stealth/Components/StealthComponent.cs index 1a8a647768a..eb54df6f08a 100644 --- a/Content.Shared/Stealth/Components/StealthComponent.cs +++ b/Content.Shared/Stealth/Components/StealthComponent.cs @@ -79,12 +79,14 @@ public sealed class StealthComponentState : ComponentState { public readonly float Visibility; public readonly TimeSpan? LastUpdated; + public readonly float MaxVisibility; // Shitmed Change public readonly bool Enabled; - public StealthComponentState(float stealthLevel, TimeSpan? lastUpdated, bool enabled) + public StealthComponentState(float stealthLevel, TimeSpan? lastUpdated, float maxVisibility, bool enabled) { Visibility = stealthLevel; LastUpdated = lastUpdated; + MaxVisibility = maxVisibility; // Shitmed Change Enabled = enabled; } } diff --git a/Content.Shared/Stealth/SharedStealthSystem.cs b/Content.Shared/Stealth/SharedStealthSystem.cs index 1bab55589fd..fcf3e675d51 100644 --- a/Content.Shared/Stealth/SharedStealthSystem.cs +++ b/Content.Shared/Stealth/SharedStealthSystem.cs @@ -98,7 +98,7 @@ protected virtual void OnInit(EntityUid uid, StealthComponent component, Compone private void OnStealthGetState(EntityUid uid, StealthComponent component, ref ComponentGetState args) { - args.State = new StealthComponentState(component.LastVisibility, component.LastUpdated, component.Enabled); + args.State = new StealthComponentState(component.LastVisibility, component.LastUpdated, component.MaxVisibility, component.Enabled); // Shitmed Change } private void OnStealthHandleState(EntityUid uid, StealthComponent component, ref ComponentHandleState args) @@ -109,6 +109,7 @@ private void OnStealthHandleState(EntityUid uid, StealthComponent component, ref SetEnabled(uid, cast.Enabled, component); component.LastVisibility = cast.Visibility; component.LastUpdated = cast.LastUpdated; + component.MaxVisibility = cast.MaxVisibility; // Shitmed Change } private void OnMove(EntityUid uid, StealthOnMoveComponent component, ref MoveEvent args) diff --git a/Content.Shared/Weapons/Ranged/Components/BatteryAmmoProviderComponent.cs b/Content.Shared/Weapons/Ranged/Components/BatteryAmmoProviderComponent.cs index 605e169c38d..f46a5bfdd6b 100644 --- a/Content.Shared/Weapons/Ranged/Components/BatteryAmmoProviderComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/BatteryAmmoProviderComponent.cs @@ -5,7 +5,7 @@ public abstract partial class BatteryAmmoProviderComponent : AmmoProviderCompone /// /// How much battery it costs to fire once. /// - [DataField("fireCost"), ViewVariables(VVAccess.ReadWrite)] + [DataField("fireCost")] // Shitmed Change public float FireCost = 100; // Batteries aren't predicted which means we need to track the battery and manually count it ourselves woo! @@ -15,4 +15,4 @@ public abstract partial class BatteryAmmoProviderComponent : AmmoProviderCompone [ViewVariables(VVAccess.ReadWrite)] public int Capacity; -} +} \ No newline at end of file diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs index d6e741fed6e..88cd16d0975 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs @@ -36,16 +36,24 @@ private void OnBatteryHandleState(EntityUid uid, BatteryAmmoProviderComponent co component.Capacity = state.MaxShots; component.FireCost = state.FireCost; UpdateAmmoCount(uid, prediction: false); + + if (component is HitscanBatteryAmmoProviderComponent hitscan && state.Prototype != null) // Shitmed Change + hitscan.Prototype = state.Prototype; } private void OnBatteryGetState(EntityUid uid, BatteryAmmoProviderComponent component, ref ComponentGetState args) { - args.State = new BatteryAmmoProviderComponentState() + var state = new BatteryAmmoProviderComponentState() // Shitmed Change { Shots = component.Shots, MaxShots = component.Capacity, FireCost = component.FireCost, }; + + if (TryComp(uid, out var hitscan)) // Shitmed Change + state.Prototype = hitscan.Prototype; + + args.State = state; // Shitmed Change } private void OnBatteryExamine(EntityUid uid, BatteryAmmoProviderComponent component, ExaminedEvent args) @@ -116,5 +124,6 @@ private sealed class BatteryAmmoProviderComponentState : ComponentState public int Shots; public int MaxShots; public float FireCost; + public string? Prototype; // Shitmed Change } } diff --git a/Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleComponent.cs b/Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleComponent.cs new file mode 100644 index 00000000000..c81ffc7bcc6 --- /dev/null +++ b/Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleComponent.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared._Shitmed.GoliathTentacle; + +/// +/// Component that grants the entity the ability to use goliath tentacles. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class GoliathTentacleComponent : Component +{ + [DataField(customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? Action = "ActionGoliathTentacleCrew"; + + [DataField, AutoNetworkedField] + public EntityUid? ActionEntity; +} diff --git a/Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleSystem.cs b/Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleSystem.cs new file mode 100644 index 00000000000..a8525929cff --- /dev/null +++ b/Content.Shared/_Shitmed/Abilities/Goliath/GoliathTentacleSystem.cs @@ -0,0 +1,23 @@ +using Content.Shared.Actions; + +namespace Content.Shared._Shitmed.GoliathTentacle; + +internal sealed class GoliathTentacleSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + } + + private void OnStartup(EntityUid uid, GoliathTentacleComponent component, ComponentStartup args) + { + _actionsSystem.AddAction(uid, ref component.ActionEntity, component.Action); + } + + private void OnShutdown(EntityUid uid, GoliathTentacleComponent component, ComponentShutdown args) + { + _actionsSystem.RemoveAction(uid, component.ActionEntity); + } +} diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryBodyComponentConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryBodyComponentConditionComponent.cs new file mode 100644 index 00000000000..3d08e61e7c8 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryBodyComponentConditionComponent.cs @@ -0,0 +1,24 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +// +// What components are necessary in the body for the surgery to be valid. +// +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryBodyComponentConditionComponent : Component +{ + // + // The components to check for. + // + [DataField(required: true)] + public ComponentRegistry Components; + + // + // If true, the lack of these components will instead make the surgery valid. + // + [DataField] + public bool Inverse = false; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs deleted file mode 100644 index af03fbf912c..00000000000 --- a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryComponentConditionComponent.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Content.Shared.Body.Part; -using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; - -namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; - -// Quite the redundant name eh? -[RegisterComponent, NetworkedComponent] -public sealed partial class SurgeryComponentConditionComponent : Component -{ - [DataField] - public ComponentRegistry Component; - - [DataField] - public bool Inverse; - -} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganOnAddConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganOnAddConditionComponent.cs new file mode 100644 index 00000000000..407488f70d6 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryOrganOnAddConditionComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +// +// What components are necessary in the part's organs' OnAdd fields for the surgery to be valid. +// +// Not all components need to be present (or missing for Inverse = true). At least one component matching (or missing) can make the surgery valid. +// +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryOrganOnAddConditionComponent : Component +{ + // + // The components to check for on each organ, with the key being the organ's SlotId. + // + [DataField(required: true)] + public Dictionary Components; + + // + // If true, the lack of these components will instead make the surgery valid. + // + [DataField] + public bool Inverse = false; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartComponentConditionComponent.cs b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartComponentConditionComponent.cs new file mode 100644 index 00000000000..096715a9e82 --- /dev/null +++ b/Content.Shared/_Shitmed/Surgery/Conditions/SurgeryPartComponentConditionComponent.cs @@ -0,0 +1,24 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._Shitmed.Medical.Surgery.Conditions; + +// +// What components are necessary in the targeted body part for the surgery to be valid. +// +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartComponentConditionComponent : Component +{ + // + // The components to check for. + // + [DataField(required: true)] + public ComponentRegistry Components; + + // + // If true, the lack of these components will instead make the surgery valid. + // + [DataField] + public bool Inverse = false; +} \ No newline at end of file diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs index 3b8a9461525..a01077c77d2 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.Steps.cs @@ -4,6 +4,7 @@ using Content.Shared.Body.Part; using Content.Shared.Body.Organ; using Content.Shared.Body.Events; +using Content.Shared._Shitmed.BodyEffects; using Content.Shared._Shitmed.Body.Events; using Content.Shared.Buckle.Components; using Content.Shared.Containers.ItemSlots; @@ -123,6 +124,47 @@ private void OnToolStep(Entity ent, ref SurgeryStepEvent a } } + // Dude this fucking function is so bloated now what the fuck. + if (ent.Comp.AddOrganOnAdd != null) + { + var organSlotIdToOrgan = _body.GetPartOrgans(args.Part).ToDictionary(o => o.Item2.SlotId, o => o); + + foreach (var (organSlotId, compsToAdd) in ent.Comp.AddOrganOnAdd) + { + if (!organSlotIdToOrgan.TryGetValue(organSlotId, out var organValue)) + continue; + var (organId, organ) = organValue; + + organ.OnAdd ??= new(); + + foreach (var (key, compToAdd) in compsToAdd) + organ.OnAdd[key] = compToAdd; + + EnsureComp(organId); + RaiseLocalEvent(organId, new OrganComponentsModifyEvent(args.Body, true)); + } + } + + if (ent.Comp.RemoveOrganOnAdd != null) + { + var organSlotIdToOrgan = _body.GetPartOrgans(args.Part).ToDictionary(o => o.Item2.SlotId, o => o); + + foreach (var (organSlotId, compsToRemove) in ent.Comp.RemoveOrganOnAdd) + { + if (!organSlotIdToOrgan.TryGetValue(organSlotId, out var organValue) || + organValue.Item2.OnAdd == null) + continue; + var (organId, organ) = organValue; + + // Need to raise this event first before removing the component entries so + // OrganEffectSystem still knows which components on the body to remove + RaiseLocalEvent(organId, new OrganComponentsModifyEvent(args.Body, false)); + foreach (var key in compsToRemove.Keys) + organ.OnAdd.Remove(key); + } + } + + //if (!HasComp(args.Body)) // //RaiseLocalEvent(args.Body, new MoodEffectEvent("SurgeryPain")); // No mood on Goob :( @@ -188,6 +230,38 @@ private void OnToolCheck(Entity ent, ref SurgeryStepComple } } } + + if (ent.Comp.AddOrganOnAdd != null) + { + var organSlotIdToOrgan = _body.GetPartOrgans(args.Part).ToDictionary(o => o.Item2.SlotId, o => o.Item2); + foreach (var (organSlotId, compsToAdd) in ent.Comp.AddOrganOnAdd) + { + if (!organSlotIdToOrgan.TryGetValue(organSlotId, out var organ)) + continue; + + if (organ.OnAdd == null || compsToAdd.Keys.Any(key => !organ.OnAdd.ContainsKey(key))) + { + args.Cancelled = true; + return; + } + } + } + + if (ent.Comp.RemoveOrganOnAdd != null) + { + var organSlotIdToOrgan = _body.GetPartOrgans(args.Part).ToDictionary(o => o.Item2.SlotId, o => o.Item2); + foreach (var (organSlotId, compsToRemove) in ent.Comp.RemoveOrganOnAdd) + { + if (!organSlotIdToOrgan.TryGetValue(organSlotId, out var organ) || organ.OnAdd == null) + continue; + + if (compsToRemove.Keys.Any(key => organ.OnAdd.ContainsKey(key))) + { + args.Cancelled = true; + return; + } + } + } } private void OnToolCanPerform(Entity ent, ref SurgeryCanPerformStepEvent args) diff --git a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs index e05240cd367..fe12eed8fe7 100644 --- a/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs +++ b/Content.Shared/_Shitmed/Surgery/SharedSurgerySystem.cs @@ -71,7 +71,6 @@ public override void Initialize() SubscribeLocalEvent(OnTargetDoAfter); SubscribeLocalEvent(OnCloseIncisionValid); //SubscribeLocalEvent(OnLarvaValid); - SubscribeLocalEvent(OnComponentConditionValid); SubscribeLocalEvent(OnHasBodyConditionValid); SubscribeLocalEvent(OnPartConditionValid); SubscribeLocalEvent(OnOrganConditionValid); @@ -79,6 +78,9 @@ public override void Initialize() SubscribeLocalEvent(OnPartRemovedConditionValid); SubscribeLocalEvent(OnPartPresentConditionValid); SubscribeLocalEvent(OnMarkingPresentValid); + SubscribeLocalEvent(OnBodyComponentConditionValid); + SubscribeLocalEvent(OnPartComponentConditionValid); + SubscribeLocalEvent(OnOrganOnAddConditionValid); //SubscribeLocalEvent(OnRemoveLarva); SubscribeLocalEvent(OnPrototypesReloaded); @@ -154,13 +156,13 @@ private void OnWoundedValid(Entity ent, ref Su args.Cancelled = true; }*/ - private void OnComponentConditionValid(Entity ent, ref SurgeryValidEvent args) + private void OnBodyComponentConditionValid(Entity ent, ref SurgeryValidEvent args) { var present = true; - foreach (var reg in ent.Comp.Component.Values) + foreach (var reg in ent.Comp.Components.Values) { var compType = reg.Component.GetType(); - if (!HasComp(args.Part, compType)) + if (!HasComp(args.Body, compType)) present = false; } @@ -168,6 +170,58 @@ private void OnComponentConditionValid(Entity ent, ref SurgeryValidEvent args) + { + var present = true; + foreach (var reg in ent.Comp.Components.Values) + { + var compType = reg.Component.GetType(); + if (!HasComp(args.Part, compType)) + present = false; + } + if (ent.Comp.Inverse ? present : !present) + args.Cancelled = true; + } + + // This is literally a duplicate of the checks in OnToolCheck for SurgeryStepComponent.AddOrganOnAdd + private void OnOrganOnAddConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Part, out var part) + || part.Body != args.Body) + { + args.Cancelled = true; + return; + } + + var organSlotIdToOrgan = _body.GetPartOrgans(args.Part, part).ToDictionary(o => o.Item2.SlotId, o => o.Item2); + + var allOnAddFound = true; + var zeroOnAddFound = true; + + foreach (var (organSlotId, components) in ent.Comp.Components) + { + if (!organSlotIdToOrgan.TryGetValue(organSlotId, out var organ)) + continue; + + if (organ.OnAdd == null) + { + allOnAddFound = false; + continue; + } + + foreach (var key in components.Keys) + { + if (!organ.OnAdd.ContainsKey(key)) + allOnAddFound = false; + else + zeroOnAddFound = false; + } + } + + if (ent.Comp.Inverse ? allOnAddFound : zeroOnAddFound) + args.Cancelled = true; + } + private void OnHasBodyConditionValid(Entity ent, ref SurgeryValidEvent args) { if (CompOrNull(args.Part)?.Body == null) diff --git a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs index 7f1eed78649..fe3463a5d95 100644 --- a/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs +++ b/Content.Shared/_Shitmed/Surgery/Steps/SurgeryStepComponent.cs @@ -23,6 +23,24 @@ public sealed partial class SurgeryStepComponent : Component [DataField] public ComponentRegistry? BodyRemove; + /// + /// These components will be added to the body part's organs' OnAdd field. + /// Each key is the SlotId of the organ to look for. + /// + /// Used to make organs add components to whatever body it's residing in. + /// + [DataField] + public Dictionary? AddOrganOnAdd; + + /// + /// These components will be removed from the body part's organs' OnAdd field. + /// Each key is the SlotId of the organ to look for. + /// + /// Used to stop organs from adding components to whatever body it's residing in. + /// + [DataField] + public Dictionary? RemoveOrganOnAdd; + [DataField] public float Duration = 2f; } diff --git a/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl index dd49176148b..5d5c062f09a 100644 --- a/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl +++ b/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl @@ -50,4 +50,5 @@ surgery-popup-step-SurgeryStepInsertHeart = {$user} is inserting a heart into {$ 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}. -surgery-popup-step-SurgeryStepLobotomize = {$user} is drilling a hole into {$target}'s {$part}. \ No newline at end of file +surgery-popup-step-SurgeryStepLobotomize = {$user} is lobotomizing {$target}! +surgery-popup-step-SurgeryStepMendBrainTissue = {$user} is mending the brain tissue on {$target}'s {$part}. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml index 19768f8dc23..6e5a9cd64a2 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml @@ -262,7 +262,7 @@ id: LizardHornsArgali bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_argali @@ -271,7 +271,7 @@ id: LizardHornsAyrshire bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_ayrshire @@ -280,7 +280,7 @@ id: LizardHornsMyrsore bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_myrsore @@ -289,7 +289,7 @@ id: LizardHornsBighorn bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_bighorn @@ -298,7 +298,7 @@ id: LizardHornsDemonic bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_demonic @@ -307,7 +307,7 @@ id: LizardHornsKoboldEars bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_kobold_ears @@ -316,7 +316,7 @@ id: LizardHornsFloppyKoboldEars bodyPart: HeadSide markingCategory: HeadSide - speciesRestriction: [Reptilian] + speciesRestriction: [Reptilian, Kobold] # Shitmed Change sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_floppy_kobold_ears diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 11a3a8d0c6c..0403cf7c222 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1267,8 +1267,12 @@ abstract: true components: - type: CombatMode - - type: SurgeryTarget # Shitmed - - type: Targeting # Shitmed + # Shitmed Change Start + - type: SurgeryTarget + - type: Targeting + - type: HumanoidAppearance + species: Monkey + # Shitmed Change End - type: Inventory templateId: monkey speciesId: monkey @@ -1293,24 +1297,48 @@ - type: Sprite drawdepth: Mobs layers: - - map: ["enum.DamageStateVisualLayers.Base"] - state: monkey - sprite: Mobs/Animals/monkey.rsi - - map: [ "jumpsuit" ] - - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + # Shitmed Change Start + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] color: "#ffffff" sprite: Objects/Misc/handcuffs.rsi state: body-overlay-2 visible: false + - map: [ "gloves" ] + - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] - map: [ "id" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] - map: [ "mask" ] - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] - map: [ "clownedon" ] sprite: "Effects/creampie.rsi" state: "creampie_human" visible: false + # Shitmed Change End - type: Carriable #DeltaV - type: Hands - type: ComplexInteraction @@ -1320,10 +1348,10 @@ clownedon: True: {visible: true} False: {visible: false} - - type: Body - prototype: Primate - requiredLegs: 1 # TODO: More than 1 leg - - type: UserInterface # Shitmed: Add SurgeryUIKey on top of stripping ui + - type: Body # Shitmed Change + prototype: Monkey + requiredLegs: 2 + - type: UserInterface # Shitmed interfaces: enum.StrippingUiKey.Key: type: StrippableBoundUserInterface @@ -1477,6 +1505,13 @@ - type: LizardAccent - type: ReplacementAccent accent: kobold + # Shitmed Change Start + - type: HumanoidAppearance + species: Kobold + - type: Body + prototype: Kobold + requiredLegs: 2 + # Shitmed Change End - type: Speech speechSounds: Lizard speechVerb: Reptilian @@ -1521,47 +1556,6 @@ coldDamageThreshold: 285 currentTemperature: 310.15 specificHeat: 42 - - type: Sprite - drawdepth: Mobs - layers: - - map: ["enum.DamageStateVisualLayers.Base"] - sprite: Mobs/Animals/kobold.rsi - state: kobold - - map: [ "outline" ] - sprite: Mobs/Animals/kobold.rsi - state: outline - - map: [ "horns" ] - sprite: Mobs/Customization/reptilian_parts.rsi - state: horns_short - - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] - color: "#ffffff" - sprite: Objects/Misc/handcuffs.rsi - state: body-overlay-2 - visible: false - - map: [ "ears" ] - - map: [ "id" ] - - map: [ "mask" ] - - map: [ "head" ] - - map: [ "clownedon" ] - sprite: "Effects/creampie.rsi" - state: "creampie_human" - visible: false - - type: RandomSprite - getAllGroups: true - available: - - enum.DamageStateVisualLayers.Base: - kobold: KoboldColors - - horns: - horns_curled: KoboldHornColors - horns_ram: KoboldHornColors - horns_short: KoboldHornColors - horns_myrsore: KoboldHornColors - horns_bighorn: KoboldHornColors - horns_argali: KoboldHornColors - horns_ayrshire: KoboldHornColors - horns_floppy_kobold_ears: Inherit - horns_double: Inherit - horns_kobold_ears: Inherit - type: Butcherable butcheringType: Spike spawned: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index 2bd2a5f6d7c..58163410f49 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -38,6 +38,8 @@ name: goliath description: A massive beast that uses long tentacles to ensnare its prey, threatening them is not advised under any conditions. components: + - type: Body # Shitmed Change + prototype: Goliath - type: Sprite sprite: Mobs/Aliens/Asteroid/goliath.rsi layers: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index f10d03886a5..e425b1438b7 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -4,6 +4,8 @@ parent: SimpleMobBase description: From the Viking age. components: + - type: Body # Shitmed Change + prototype: LaserRaptor - type: NpcFactionMember factions: - SimpleHostile @@ -43,22 +45,6 @@ - type: Tag tags: - FootstepSound - - type: HitscanBatteryAmmoProvider - proto: RedLightLaser - fireCost: 50 - - type: BatterySelfRecharger - autoRecharge: true - autoRechargeRate: 50 - - type: Battery - maxCharge: 1000 - startingCharge: 1000 - - type: Gun - fireRate: 1 - useKey: false - selectedMode: SemiAuto - availableModes: - - SemiAuto - soundGunshot: /Audio/Weapons/Guns/Gunshots/laser_cannon.ogg - type: CombatMode - type: InteractionPopup successChance: 0.3 @@ -220,4 +206,4 @@ types: Blunt: 0.11 - type: StaticPrice - price: 400 \ No newline at end of file + price: 400 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 0dc96ba6f31..b603f300572 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -279,6 +279,8 @@ parent: MobSpaceBasic description: Long fangs and a glowing hood, and the alluring look begs to come closer. components: + - type: Body # Shitmed Change + prototype: SpaceCobra - type: Sprite drawdepth: Mobs sprite: Mobs/Animals/spacecobra.rsi @@ -356,12 +358,6 @@ radius: 1.1 energy: 1.5 color: "#4faffb" - - type: Stealth - enabledOnDeath: false - maxVisibility: 1.2 - - type: StealthOnMove - passiveVisibilityRate: -0.25 - movementVisibilityRate: 0.25 - type: entity id: MobCobraSpaceSalvage diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index c750b568b40..3389b2b81fb 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -6,6 +6,8 @@ description: A flying leviathan, loosely related to space carps. abstract: true components: + - type: Body # Shitmed + prototype: SpaceDragon - type: Bloodstream bloodMaxVolume: 650 - type: GhostRole @@ -159,9 +161,6 @@ components: - type: Dragon spawnRiftAction: ActionSpawnRift - - type: ActionGun - action: ActionDragonsBreath - gunProto: DragonsBreathGun - type: GuideHelp guides: - MinorAntagonists diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml index c73a2e6f935..94a32f5cb07 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml @@ -2,6 +2,11 @@ - type: randomHumanoidSettings id: EventHumanoid + # start-backmen: species + speciesBlacklist: + - Monkey + - Kobold + # end-backmen: species components: - type: RandomHumanoidAppearance randomizeName: false diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index 8a1198d7767..759bcf96d84 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -463,4 +463,14 @@ - type: Tweezers speed: 2 - type: Tending - speed: 2 \ No newline at end of file + speed: 2 + +- type: entity + parent: [ OmnimedTool, BaseSyndicateContraband ] + id: OmnimedToolSyndie + components: + - type: Sprite + state: evil + - type: Item + size: Small + heldPrefix: evil diff --git a/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml index 19875f7e1bf..02d98ad47ed 100644 --- a/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/monkey_inventory_template.yml @@ -1,60 +1,106 @@ +# This entire file will just be a merge conflict lol. + - type: inventoryTemplate id: monkey slots: - - name: head - slotTexture: head - slotFlags: HEAD - uiWindowPos: 1,2 - strippingWindowPos: 0,0 - displayName: Head - - name: ears - slotTexture: ears - slotFlags: EARS - stripTime: 3 - uiWindowPos: 0,2 - strippingWindowPos: 1,2 - displayName: Ears - - name: mask - slotTexture: mask - slotFlags: MASK - uiWindowPos: 0,1 - strippingWindowPos: 1,1 - displayName: Mask - - name: jumpsuit - slotTexture: uniform - slotFlags: INNERCLOTHING - stripTime: 6 - uiWindowPos: 1,0 - strippingWindowPos: 0,2 - displayName: Jumpsuit - - name: id - slotTexture: id - fullTextureName: template_small - slotFlags: IDCARD - slotGroup: SecondHotbar - stripTime: 6 - uiWindowPos: 2,1 - strippingWindowPos: 2,4 - dependsOn: jumpsuit - displayName: ID - - name: suitstorage - slotTexture: suit_storage - slotFlags: SUITSTORAGE - slotGroup: MainHotbar - stripTime: 3 - uiWindowPos: 2,0 - strippingWindowPos: 2,5 - dependsOn: outerClothing - dependsOnComponents: - - type: AllowSuitStorage - displayName: Suit Storage - - name: outerClothing - slotTexture: suit - slotFlags: OUTERCLOTHING - stripTime: 6 - uiWindowPos: 1,1 - strippingWindowPos: 1,3 - displayName: Suit - whitelist: - tags: - - MonkeyWearable + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,1 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + stripTime: 6 + uiWindowPos: 1,1 + strippingWindowPos: 1,2 + displayName: Suit + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,2 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 3 + uiWindowPos: 2,2 + strippingWindowPos: 2,0 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,3 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + fullTextureName: template_small + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + fullTextureName: template_small + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + dependsOnComponents: + - type: AllowSuitStorage + displayName: Suit Storage + - name: id + slotTexture: id + fullTextureName: template_small + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + fullTextureName: template_small + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + fullTextureName: template_small + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back \ No newline at end of file diff --git a/Resources/Prototypes/Roles/Antags/nukeops.yml b/Resources/Prototypes/Roles/Antags/nukeops.yml index ff86f314964..151b5f6bff7 100644 --- a/Resources/Prototypes/Roles/Antags/nukeops.yml +++ b/Resources/Prototypes/Roles/Antags/nukeops.yml @@ -109,6 +109,7 @@ - HandheldHealthAnalyzer - CombatMedipen - DeathAcidifierImplanter + - OmnimedToolSyndie # Shitmed #Lone Operative Gear - type: startingGear diff --git a/Resources/Prototypes/_Shitmed/Body/Actions/organactions.yml b/Resources/Prototypes/_Shitmed/Body/Actions/organactions.yml new file mode 100644 index 00000000000..2558266726e --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Actions/organactions.yml @@ -0,0 +1,20 @@ +# Technically goliath will also have these, but its HTN should not abuse it. +# Only player controlled ones would, and you could claim its a feature to throw salvies off at that point :trollface: +- type: entity + id: ActionGoliathTentacleCrew + name: "[color=red]Tentacle Slam[/color]" + description: Use your tentacles to grab and stun a target player! + components: + - type: EntityWorldTargetAction + raiseOnUser: true + icon: + sprite: Mobs/Aliens/Asteroid/goliath.rsi + state: goliath_tentacle_spawn + iconOn: + sprite: Mobs/Aliens/Asteroid/goliath.rsi + state: goliath_tentacle_wiggle + sound: + path: "/Audio/Weapons/slash.ogg" + event: !type:GoliathSummonTentacleAction + useDelay: 80 + range: 10 diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml new file mode 100644 index 00000000000..53485bfdc45 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml @@ -0,0 +1,62 @@ +- type: entity + id: OrganAnimalBrain + parent: BaseAnimalOrganUnGibbable + name: animal brain + description: "Not so intelligence, not so honk." + components: + - type: Sprite + state: brain + - type: Organ + slotId: brain + - type: Input + context: "ghost" + - type: Brain + - type: InputMover + - type: Examiner + - type: BlockMovement + - type: BadFood + - type: Tag + tags: + - Meat + - type: SolutionContainerManager + solutions: + organ: + reagents: + - ReagentId: Nutriment + Quantity: 10 + food: + maxVol: 5 + reagents: + - ReagentId: GreyMatter + Quantity: 5 + - type: FlavorProfile + flavors: + - people + - type: FoodSequenceElement + entries: + burger: + name: food-sequence-content-brain + taco: + name: food-sequence-content-brain + - type: Item + size: Small + heldPrefix: brain + +- type: entity + id: OrganAnimalEyes + parent: BaseAnimalOrgan + name: animal eyes + description: "I see you!" + components: + # start-backmen: surgery + - type: Organ + slotId: eyes + - type: Eyes + # end-backmen: surgery + - type: Sprite + layers: + - state: eyeball-l + - state: eyeball-r + - type: Item + size: Small + heldPrefix: eyeballs diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/kobold.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/kobold.yml new file mode 100644 index 00000000000..5493846e353 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/kobold.yml @@ -0,0 +1,119 @@ +# TODO: Add descriptions (many) + +- type: entity + id: PartKobold + parent: [BaseItem, BasePart] + name: "kobold body part" + abstract: true + components: + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 3 + - ReagentId: Blood + Quantity: 10 + +- type: entity + id: TorsoKobold + name: "kobold torso" + parent: [PartKobold, BaseTorso] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "torso_m" + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: Blood + Quantity: 20 + +- type: entity + id: HeadKobold + name: "kobold head" + parent: [PartKobold, BaseHead] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "head_m" + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 5 + - ReagentId: Blood + Quantity: 10 + +- type: entity + id: LeftArmKobold + name: "left kobold arm" + parent: [PartKobold, BaseLeftArm] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "l_arm" + +- type: entity + id: RightArmKobold + name: "right kobold arm" + parent: [PartKobold, BaseRightArm] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "r_arm" + +- type: entity + id: LeftHandKobold + name: "left kobold hand" + parent: [PartKobold, BaseLeftHand] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "l_hand" + +- type: entity + id: RightHandKobold + name: "right kobold hand" + parent: [PartKobold, BaseRightHand] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "r_hand" + +- type: entity + id: LeftLegKobold + name: "left kobold leg" + parent: [PartKobold, BaseLeftLeg] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "l_leg" + +- type: entity + id: RightLegKobold + name: "right kobold leg" + parent: [PartKobold, BaseRightLeg] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "r_leg" + +- type: entity + id: LeftFootKobold + name: "left kobold foot" + parent: [PartKobold, BaseLeftFoot] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "l_foot" + +- type: entity + id: RightFootKobold + name: "right kobold foot" + parent: [PartKobold, BaseRightFoot] + components: + - type: Sprite + sprite: Mobs/Animals/kobold.rsi + state: "r_foot" diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/monkey.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/monkey.yml new file mode 100644 index 00000000000..01b8aa4de8a --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/monkey.yml @@ -0,0 +1,119 @@ +# TODO: Add descriptions (many) + +- type: entity + id: PartMonkey + parent: [BaseItem, BasePart] + name: "monkey body part" + abstract: true + components: + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 3 + - ReagentId: Blood + Quantity: 10 + +- type: entity + id: TorsoMonkey + name: "monkey torso" + parent: [PartMonkey, BaseTorso] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "torso_m" + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: Blood + Quantity: 20 + +- type: entity + id: HeadMonkey + name: "monkey head" + parent: [PartMonkey, BaseHead] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "head_m" + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 5 + - ReagentId: Blood + Quantity: 10 + +- type: entity + id: LeftArmMonkey + name: "left monkey arm" + parent: [PartMonkey, BaseLeftArm] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "l_arm" + +- type: entity + id: RightArmMonkey + name: "right monkey arm" + parent: [PartMonkey, BaseRightArm] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "r_arm" + +- type: entity + id: LeftHandMonkey + name: "left monkey hand" + parent: [PartMonkey, BaseLeftHand] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "l_hand" + +- type: entity + id: RightHandMonkey + name: "right monkey hand" + parent: [PartMonkey, BaseRightHand] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "r_hand" + +- type: entity + id: LeftLegMonkey + name: "left monkey leg" + parent: [PartMonkey, BaseLeftLeg] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "l_leg" + +- type: entity + id: RightLegMonkey + name: "right monkey leg" + parent: [PartMonkey, BaseRightLeg] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "r_leg" + +- type: entity + id: LeftFootMonkey + name: "left monkey foot" + parent: [PartMonkey, BaseLeftFoot] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "l_foot" + +- type: entity + id: RightFootMonkey + name: "right monkey foot" + parent: [PartMonkey, BaseRightFoot] + components: + - type: Sprite + sprite: Mobs/Animals/monkey.rsi + state: "r_foot" diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml index 1c9777d5870..05c61ab31e9 100644 --- a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml +++ b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/space.yml @@ -14,4 +14,68 @@ components: - type: Organ onAdd: - - type: PressureImmunity \ No newline at end of file + - type: PressureImmunity + +- type: entity + parent: OrganAnimalHeart + id: OrganGoliathHeart + name: goliath heart + components: + - type: Organ + onAdd: + - type: GoliathTentacle + - type: Sprite + sprite: _Shitmed/Mobs/Species/Space/Goliath/organs.rsi + state: heart-on + +- type: entity + parent: OrganAnimalLungs + id: OrganDragonLungs + name: dragon lungs + components: + - type: Organ + onAdd: + - type: ActionGun + action: ActionDragonsBreath + gunProto: DragonsBreathGun + +- type: entity + parent: OrganHumanEyes + id: OrganLaserEyes + name: laser raptor eyes + components: + - type: Organ + onAdd: + - type: HitscanBatteryAmmoProvider + proto: RedLightLaser + fireCost: 50 + - type: BatterySelfRecharger + autoRecharge: true + autoRechargeRate: 25 + - type: Battery + maxCharge: 100 + startingCharge: 0 + - type: Gun + fireRate: 1 + useKey: false + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: /Audio/Weapons/Guns/Gunshots/laser_cannon.ogg + +- type: entity + parent: OrganAnimalHeart + id: OrganCobraHeart + name: cobra gland + components: + - type: Organ + onAdd: + - type: Stealth + enabledOnDeath: false + maxVisibility: 1.2 + - type: StealthOnMove + passiveVisibilityRate: -0.25 + movementVisibilityRate: 0.25 + - type: Sprite + sprite: _Shitmed/Mobs/Species/Space/Cobra/organs.rsi + state: heart-on diff --git a/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/dragon.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/dragon.yml new file mode 100644 index 00000000000..85bd9ea92d8 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/dragon.yml @@ -0,0 +1,21 @@ +- type: body + id: SpaceDragon + name: "space dragon" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganDragonLungs + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/goliath.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/goliath.yml new file mode 100644 index 00000000000..e13737817c6 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/goliath.yml @@ -0,0 +1,21 @@ +- type: body + id: Goliath + name: "goliath" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + heart: OrganGoliathHeart # Allows you to use a slower version of their tentacles. + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/kobold.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/kobold.yml new file mode 100644 index 00000000000..6cf15dae081 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/kobold.yml @@ -0,0 +1,51 @@ +# Shitmed - this is just a copy of human body but with animal organs. +- type: body + id: Kobold + name: "Kobold" + root: torso + slots: + head: + part: HeadKobold + connections: + - torso + organs: + brain: OrganAnimalBrain + eyes: OrganAnimalEyes + torso: + part: TorsoKobold + connections: + - right arm + - left arm + - right leg + - left leg + - head + organs: + heart: OrganAnimalHeart + lungs: OrganAnimalLungs + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + kidneys: OrganAnimalKidneys + right arm: + part: RightArmKobold + connections: + - right hand + left arm: + part: LeftArmKobold + connections: + - left hand + right hand: + part: RightHandKobold + left hand: + part: LeftHandKobold + right leg: + part: RightLegKobold + connections: + - right foot + left leg: + part: LeftLegKobold + connections: + - left foot + right foot: + part: RightFootKobold + left foot: + part: LeftFootKobold diff --git a/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/laserraptor.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/laserraptor.yml new file mode 100644 index 00000000000..1015b932142 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/laserraptor.yml @@ -0,0 +1,26 @@ +- type: body + id: LaserRaptor + name: "space dragon" + root: torso + slots: + head: + part: HeadAnimal + organs: + eyes: OrganLaserEyes + torso: + part: TorsoAnimal + connections: + - legs + - head + organs: + lungs: OrganAnimalLungs + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/monkey.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/monkey.yml new file mode 100644 index 00000000000..a34f3c3c42d --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/monkey.yml @@ -0,0 +1,51 @@ +# Shitmed - this is just a copy of human body but with animal organs. +- type: body + id: Monkey + name: "Monkey" + root: torso + slots: + head: + part: HeadMonkey + connections: + - torso + organs: + brain: OrganAnimalBrain + eyes: OrganAnimalEyes + torso: + part: TorsoMonkey + connections: + - right arm + - left arm + - right leg + - left leg + - head + organs: + heart: OrganAnimalHeart + lungs: OrganAnimalLungs + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + kidneys: OrganAnimalKidneys + right arm: + part: RightArmMonkey + connections: + - right hand + left arm: + part: LeftArmMonkey + connections: + - left hand + right hand: + part: RightHandMonkey + left hand: + part: LeftHandMonkey + right leg: + part: RightLegMonkey + connections: + - right foot + left leg: + part: LeftLegMonkey + connections: + - left foot + right foot: + part: RightFootMonkey + left foot: + part: LeftFootMonkey diff --git a/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/spacecobra.yml b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/spacecobra.yml new file mode 100644 index 00000000000..dfd98ca5303 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Body/Prototypes/Animal/spacecobra.yml @@ -0,0 +1,21 @@ +- type: body + id: SpaceCobra + name: "space cobra" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + heart: OrganCobraHeart # Allows you to become invisible. + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/_Shitmed/Entities/Mobs/Species/primate.yml b/Resources/Prototypes/_Shitmed/Entities/Mobs/Species/primate.yml new file mode 100644 index 00000000000..4a351bd6e86 --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Entities/Mobs/Species/primate.yml @@ -0,0 +1,41 @@ +- type: entity + save: false + parent: BaseSpeciesDummy + id: MobMonkeyDummy + categories: [ HideSpawnMenu ] + description: A dummy monkey meant to be used in character setup. + components: + - type: Icon + sprite: Mobs/Animals/monkey.rsi + state: full + - type: Appearance + - type: HumanoidAppearance + species: Monkey + - type: Body + prototype: Monkey + requiredLegs: 2 + - type: UserInterface + interfaces: + enum.HumanoidMarkingModifierKey.Key: # sure, this can go here too + type: HumanoidMarkingModifierBoundUserInterface + +- type: entity + save: false + parent: BaseSpeciesDummy + id: MobKoboldDummy + categories: [ HideSpawnMenu ] + description: A dummy kobold meant to be used in character setup. + components: + - type: Icon + sprite: Mobs/Animals/kobold.rsi + state: full + - type: Appearance + - type: HumanoidAppearance + species: Kobold + - type: Body + prototype: Kobold + requiredLegs: 2 + - type: UserInterface + interfaces: + enum.HumanoidMarkingModifierKey.Key: # sure, this can go here too + type: HumanoidMarkingModifierBoundUserInterface \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml index 438a91e4c12..cd20e14a2fd 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml @@ -599,9 +599,18 @@ steps: - SurgeryStepLobotomize - SurgeryStepCloseIncision - - type: SurgeryComponentCondition - component: - - type: OhioAccent + - type: SurgeryOrganCondition + organ: + - type: Brain + - type: SurgeryOrganOnAddCondition + components: + brain: + - type: OhioAccent + - type: RatvarianLanguage + - type: Clumsy + clumsyDamage: # Placeholder values to be able to initialize the component + types: + Blunt: 0 inverse: true - type: SurgeryPartCondition part: Head @@ -617,9 +626,18 @@ steps: - SurgeryStepMendBrainTissue - SurgeryStepCloseIncision - - type: SurgeryComponentCondition - component: - - type: OhioAccent + - type: SurgeryOrganCondition + organ: + - type: Brain + - type: SurgeryOrganOnAddCondition + components: + brain: + - type: OhioAccent + - type: RatvarianLanguage + - type: Clumsy + clumsyDamage: + types: + Blunt: 0 - type: SurgeryPartCondition part: Head diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index 1b655968dd0..97a693445ac 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -521,10 +521,17 @@ - type: SurgeryStep tool: - type: Drill - bodyAdd: - - type: OhioAccent - - type: RatvarianLanguage - - type: SlurredAccent + addOrganOnAdd: + brain: + - type: OhioAccent + - type: RatvarianLanguage + - type: Clumsy + clumsyDamage: + types: + Blunt: 5 + Piercing: 4 + groups: + Burn: 3 duration: 5 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi @@ -544,14 +551,18 @@ - type: SurgeryStep tool: - type: Hemostat - duration: 5 - bodyRemove: - - type: OhioAccent - - type: RatvarianLanguage - - type: SlurredAccent + duration: 4 + removeOrganOnAdd: + brain: + - type: OhioAccent + - type: RatvarianLanguage + - type: Clumsy + clumsyDamage: + types: + Blunt: 0 - type: Sprite - sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi - state: drill + sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi + state: hemostat - type: SurgeryStepEmoteEffect # The lengths I go to just for a joke... I HATE HARDCODING AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA diff --git a/Resources/Prototypes/_Shitmed/Species/kobold.yml b/Resources/Prototypes/_Shitmed/Species/kobold.yml new file mode 100644 index 00000000000..7d028bb451c --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Species/kobold.yml @@ -0,0 +1,148 @@ +- type: species + id: Kobold + name: species-name-kobold + roundStart: false # sad... + prototype: MobKobold + sprites: MobKoboldSprites + dollPrototype: MobKoboldDummy + skinColoration: Hues + defaultSkinTone: "#9a7c5a" + markingLimits: MobKoboldMarkingLimits + +- type: speciesBaseSprites + id: MobKoboldSprites + sprites: + Special: MobKoboldAnyMarking + Head: MobKoboldHead + Chest: MobKoboldTorso + Tail: MobKoboldTail + Eyes: MobKoboldEyes + HeadTop: MobKoboldHorns + LArm: MobKoboldLArm + RArm: MobKoboldRArm + LHand: MobKoboldLHand + RHand: MobKoboldRHand + LLeg: MobKoboldLLeg + RLeg: MobKoboldRLeg + LFoot: MobKoboldLFoot + RFoot: MobKoboldRFoot + +- type: humanoidBaseSprite + id: MobKoboldAnyMarking + +- type: humanoidBaseSprite + id: MobKoboldMarkingMatchSkin + markingsMatchSkin: true + +- type: humanoidBaseSprite + id: MobKoboldHorns + matchSkin: false + baseSprite: + sprite: Mobs/Customization/reptilian_parts.rsi + state: horns_short + +- type: humanoidBaseSprite + id: MobKoboldHead + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobKoboldHeadMale + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobKoboldHeadFemale + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: head_f + +- type: humanoidBaseSprite + id: MobKoboldTorso + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobKoboldTorsoMale + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobKoboldTorsoFemale + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: torso_f + +- type: humanoidBaseSprite + id: MobKoboldLLeg + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: l_leg + +- type: humanoidBaseSprite + id: MobKoboldLArm + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: l_arm + +- type: humanoidBaseSprite + id: MobKoboldLHand + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: l_hand + +- type: humanoidBaseSprite + id: MobKoboldLFoot + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: l_foot + +- type: humanoidBaseSprite + id: MobKoboldRLeg + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: r_leg + +- type: humanoidBaseSprite + id: MobKoboldRArm + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: r_arm + +- type: humanoidBaseSprite + id: MobKoboldRHand + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: r_hand + +- type: humanoidBaseSprite + id: MobKoboldRFoot + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: r_foot + +- type: humanoidBaseSprite + id: MobKoboldTail + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: tail + +- type: humanoidBaseSprite + id: MobKoboldEyes + baseSprite: + sprite: Mobs/Animals/kobold.rsi + state: eyes + +- type: markingPoints + id: MobKoboldMarkingLimits + points: + Special: # the cat ear joke + points: 1 + required: false + Chest: + points: 1 + required: false \ No newline at end of file diff --git a/Resources/Prototypes/_Shitmed/Species/monkey.yml b/Resources/Prototypes/_Shitmed/Species/monkey.yml new file mode 100644 index 00000000000..aa158efce2b --- /dev/null +++ b/Resources/Prototypes/_Shitmed/Species/monkey.yml @@ -0,0 +1,144 @@ +- type: species + id: Monkey + name: species-name-monkey + roundStart: false # sad... + prototype: MobMonkey + sprites: MobMonkeySprites + dollPrototype: MobMonkeyDummy + skinColoration: Hues + defaultSkinTone: "#ffffff" + markingLimits: MobMonkeyMarkingLimits + +- type: speciesBaseSprites + id: MobMonkeySprites + sprites: + Special: MobMonkeyAnyMarking + Head: MobMonkeyHead + HeadTop: MobMonkeyAnyMarking + Chest: MobMonkeyTorso + Tail: MobMonkeyTail + Eyes: MobMonkeyEyes + LArm: MobMonkeyLArm + RArm: MobMonkeyRArm + LHand: MobMonkeyLHand + RHand: MobMonkeyRHand + LLeg: MobMonkeyLLeg + RLeg: MobMonkeyRLeg + LFoot: MobMonkeyLFoot + RFoot: MobMonkeyRFoot + +- type: humanoidBaseSprite + id: MobMonkeyAnyMarking + +- type: humanoidBaseSprite + id: MobMonkeyMarkingMatchSkin + markingsMatchSkin: true + +- type: humanoidBaseSprite + id: MobMonkeyHead + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobMonkeyHeadMale + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobMonkeyHeadFemale + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: head_f + +- type: humanoidBaseSprite + id: MobMonkeyTorso + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobMonkeyTorsoMale + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobMonkeyTorsoFemale + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: torso_f + +- type: humanoidBaseSprite + id: MobMonkeyLLeg + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: l_leg + +- type: humanoidBaseSprite + id: MobMonkeyLArm + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: l_arm + +- type: humanoidBaseSprite + id: MobMonkeyLHand + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: l_hand + +- type: humanoidBaseSprite + id: MobMonkeyLFoot + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: l_foot + +- type: humanoidBaseSprite + id: MobMonkeyRLeg + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: r_leg + +- type: humanoidBaseSprite + id: MobMonkeyRArm + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: r_arm + +- type: humanoidBaseSprite + id: MobMonkeyRHand + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: r_hand + +- type: humanoidBaseSprite + id: MobMonkeyRFoot + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: r_foot + +- type: humanoidBaseSprite + id: MobMonkeyTail + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: tail + +- type: humanoidBaseSprite + id: MobMonkeyEyes + baseSprite: + sprite: Mobs/Animals/monkey.rsi + state: eyes + +- type: markingPoints + id: MobMonkeyMarkingLimits + points: + Special: # the cat ear joke + points: 1 # Corvax-Sponsors + required: false + HeadTop: + points: 1 + required: false + Chest: + points: 1 + required: false \ No newline at end of file diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/eyes.png b/Resources/Textures/Mobs/Animals/kobold.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..626bd2fa1ea91ad11f173317e9eaf530fe0b47ec GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|EIeHtLn`LH zy|s~-!GMFsuPx%mq|oHR9J=WmcL6QK@`V7n+@972*x6Vff&-JiEEL@ABBaTa87;{`cIhiv{LZm z{Rh^OoOk#aNJx4~vZaLt34#+$Z6{>sirg+2?$jN*D-QC7WoGuh_nkLy-pm`A;D5x{ z)>h=Tu?Z|wgKRdd{eCKy;_mJ)kh!jF%x7faIF1H5JUIMKcKYQMtu^g-+lbRBbm?@O z-Q8VOUvcvJWUSrU*&&@yo6rG<5s*^qXf#SPnPe%u6#VbF9q#Y%d47K8^77J%(|FGu z$I%-b8}xcTlF4MyUR_zV8;(|t_L0;x57K-F$o@TR& zhzp8^BBfGEzs>dz2YggcE9`&VNA*?k9eg^Va#}H^0z&41lu~bh*bc^zgGWSM1Y^}# zLI0SwS(a|KTA^>m z(6M@WcsO<(M=z!p0XRE5V`^%O+SeMHOopeYCkBJTQK!@SH`P!|sr_nKtyWoETSEwe z=Xq4CRbcc!FhwW_q?Ec?C;~7X4o62(2+q&X@xwhF4v9vMOUvsy;FsTAF2}d;-|(HV zZJS!H7EEqg7Kw!fiG>6hTte_dIrb;+cDpYc{`&IqUrK+HO)$X(6TF2V>5vn%!OY)E P00000NkvXXu0mjfkeFb~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/head_f.png b/Resources/Textures/Mobs/Animals/kobold.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6102a5b50117596e966f1453b4a4b1e2f0af01 GIT binary patch literal 653 zcmV;80&@L{P)Px%M@d9MRCt{2+QEw2Ko|$`e@&mjV^?s)bnpRWZX)8rOZOslp__wVyKhik4_nx- zJ?A0Z!uA2gqX#c;PO=9HA!JMR0dkd0PloE2(#fK*@c)4%GfC$Ah?BX@2N02|cDr5p zSNk=^e`ESUwOZBNb0GwRAjqzHo@YGXOX62575Ki7G);5IH+n!Rr2(Md>p#0T{62)% z8uR)5U@zei@r|aAloH);7x5~_&9|GKW2e)Bl+t84V^T`=dws;K_}Q=brI#!ITa%kN zn+;~O8Eo6e;A#K>7+ekT;5{IUB5XDr;{;6O$Ez6Y^*WpOg~H30ALHq&l+vwM3tW<1_&V_gvk1WAV3&~xjsLm82|vyW)qXi1eRrCxm*GOeBVc-(SYZ9ro$O4 z6bcB#aHns-O+-XQL_|bHL_|bHM2B+h`hdU1%$q~5`hfin$uv!mvM;!w$M$@iPo6xC z_XYvLwryN|y4dNv9p36g)&~4ZDW&&o1nz#^<=P{(Om21@M_+!vM6p;zk|aoy1g`7i z)ILR$BzSy${A!#*4z*hCx>zj2bzO+}0!fmfR4U=@!x=2gx?U_6|DA`?Kjt`&UM`mq zLZDu+0{~9mon+VVf8Jv>8Xa^NIF6&wKb~jpr(aL7EDO`=6k!+|e+IeMfbHJ=wnj(@ zfhdXq;NUMnDW#>9D3{BKq6p=3Ijd6&g1~qU$d#;8N^grJ(lpH$p<}KA0J7LpO8CBi nwD?3sL_|bHL_|bH^jiG}GLZ}3dqhLk00000NkvXXu0mjfAFD4G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/head_m.png b/Resources/Textures/Mobs/Animals/kobold.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6102a5b50117596e966f1453b4a4b1e2f0af01 GIT binary patch literal 653 zcmV;80&@L{P)Px%M@d9MRCt{2+QEw2Ko|$`e@&mjV^?s)bnpRWZX)8rOZOslp__wVyKhik4_nx- zJ?A0Z!uA2gqX#c;PO=9HA!JMR0dkd0PloE2(#fK*@c)4%GfC$Ah?BX@2N02|cDr5p zSNk=^e`ESUwOZBNb0GwRAjqzHo@YGXOX62575Ki7G);5IH+n!Rr2(Md>p#0T{62)% z8uR)5U@zei@r|aAloH);7x5~_&9|GKW2e)Bl+t84V^T`=dws;K_}Q=brI#!ITa%kN zn+;~O8Eo6e;A#K>7+ekT;5{IUB5XDr;{;6O$Ez6Y^*WpOg~H30ALHq&l+vwM3tW<1_&V_gvk1WAV3&~xjsLm82|vyW)qXi1eRrCxm*GOeBVc-(SYZ9ro$O4 z6bcB#aHns-O+-XQL_|bHL_|bHM2B+h`hdU1%$q~5`hfin$uv!mvM;!w$M$@iPo6xC z_XYvLwryN|y4dNv9p36g)&~4ZDW&&o1nz#^<=P{(Om21@M_+!vM6p;zk|aoy1g`7i z)ILR$BzSy${A!#*4z*hCx>zj2bzO+}0!fmfR4U=@!x=2gx?U_6|DA`?Kjt`&UM`mq zLZDu+0{~9mon+VVf8Jv>8Xa^NIF6&wKb~jpr(aL7EDO`=6k!+|e+IeMfbHJ=wnj(@ zfhdXq;NUMnDW#>9D3{BKq6p=3Ijd6&g1~qU$d#;8N^grJ(lpH$p<}KA0J7LpO8CBi nwD?3sL_|bHL_|bH^jiG}GLZ}3dqhLk00000NkvXXu0mjfAFD4G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/innerline.png b/Resources/Textures/Mobs/Animals/kobold.rsi/innerline.png new file mode 100644 index 0000000000000000000000000000000000000000..4be7d2591e14555ebc01585ffe422ba7f93494b7 GIT binary patch literal 10385 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 LNkvXXu0mjfsN}`2 delta 1639 zcmV-t2AKKaQ;|`yJ|cer32;bRa{vG+ng9SOngJI&A+i7f1}I5HK~#8N?VHO|<2n$A zm4y4fiZE{gtbjf5#)`**H(>>=fHxQd#r<{wAAg?wDaFUcY6W{v%~(|_W7*c<{Y&bW z)Qxk0d1;mDzqhwn_{#S7wmUgFak_rh&i?*>8N|rvRpYnElJ0*G_&ADy_4W0kk(0l# znin50NfI{>zL|g&EJ+poe13jT(&3+Q<-T8EweBc8z~9-~NnT%H$HJemNW8JJ0hn9s zt_?n0Tv*KhzU*B(o}Ztem)aEzrvGjc{=)piSoo$9FgrWzR##WuXY%QOUj7`qQqS`$ z3++Qb`1v38G5CL`5x{(VdU|qGQ&aB8+K)_Eu5bUmxwp4B$MY%+?W6en`}==jCMHa( z48AvwfYj}^(m9`f{P6gYDbAGwF+8u50NU^MdM=&!LonQ5U0u23<6|?vnYN{+C3ky! z>sqZ=rZfdosIQ}d`||QK1eL$H$YB}*SpCV#Nw>Vb?52OGr?WZ7k9(#C&n@8Ackuw& znwgoI3|~L)sgLnQ!35xPu=wp(I~xJ~tsnQ)bI*HL#X{c41IX?$25;u6Bo@z^9&KHN-&#Ftp`w0l^Z}nMK+B0xh7s}I8{?)zcxspol>#c!X#afkUjD}E3G^1nAXH}2x%q9tF90Q|V8 z9$UcQ@(xyEM!iqFw9iTtrJ4WwaZkPQEx18$5Z6OlSy^$Lo12-D!}zEm9QAUAdfy^Q z$h&wOrbDOG$wr|HM8x6;jQ}ZhcXyW=AoaSY0r!8@(*u;M2ml{<_wn)JK0ZGN(-8cW z{DkLLLl{KB+1Xj^`uf^&1pvl}0<1@`91IzH#HMS(DWkVK3 z07B9@!%r5!ch$=b5LXKIEJQ5eA4 z=P`ef^1(5?F$)Q5A7kv>AGu|bU}-am0F>9hABFj$Jc_HwsjF)4`w9t1R$n{ASP~|_ zI&=gS#ZhW*ZqD65+-FN&89C;pKioU*j?*G2W>;3$Yg&x?ejj|MCEfwgke(6@mgKv; zyUD{two@IsLo9TIQe0bKUHx5Gey&x$6b660Xx9e`xWKQLzy}8hStnM}DP^73JZ~6i z7-$%17-$%17-$&yUo%h|Ncd{0ytTFEPESvNTYf-)sa~3+P?nz%v>7Vu!a6oSbqt*- z0@4l0kZj|`=VO)pt{eq30sZJpl5R{Ac4AyP4~bP|jPJ4>1>`}7bVNqwC(!U>Qt>2>8QAd^*j^f4Pj9gx!N z#OEo5tE!a(!gGp9QCE3>02UWx zLtFp>M7X|ep|Y3=P@@DPC`wYm2re%E3YyeWzyi}xkciC_G^R1mFT$gX3z53u1JX zqQaCoIyx#nT!~S#=o_%W6h42lAQQ47qh&u3OaOx5?_r&d2O(C(!-Gakc#K3ZGzlyeo?sktz|4X968n|L)D3bx^Lp517b*TPpKpG1`rfx) zK)np{h39^n`2L+`y-4HJIm^qk)~gp3$a|HYQ91uP)GHt~ey-N%n9WSDmTl{*TA3St z*=93S+DS#j{j95AonEx1r^Y}#VV2s<_Iq0IR&M>w2r>{1{_KBusWLS7k4E-Ct3TYI z51w8$WvOb;qJ~6?re}9fRLF{-&s)S0`n6D|-eh+tQ?TOS)78&qol`;+00N|LMF0Q* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/l_foot.png b/Resources/Textures/Mobs/Animals/kobold.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8f9af0b08d2a81309cb7536b441c76130c3d78 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|7J9lkhE&XX zdu!v=Lk0pY0Y9rId0n)=(;3tLdIMJ>r(PPTM}-5!oSKXOccx7_zl;T_g@Hj{bE(Vy zsxNDg+ng_Sb6;!v>)PV2VwTSnWiNM3IL`m}x1GxO(Bme)no52kD?s2uoTlov(%w0r zFRc6(yY*V4@t^bN{YrUvy`wK(nzp?1kI&X?JO0F7DwJ{lwC~o9|BvM!%*``rVmJ^V Y!T9_)|=E1f>LRpd_i>vLBrqWXPpDLQ~Bp-N9yR%oH5vY-& z!T*Sa_qm-WzQKETUpAR4u{b+?l3v`xb+5hdf1k8u)v7(4@_+BkmSCG1d2`#@J-ZHS zZ&|lm_w=VOw(VU&kfL)> z3+rX}DHhz`_)o8Vj!=%2)0oO~n zKJu%+we8joh;|U!u)gQ<3&Ug4@0rdmnPSuO;Pj@LSqp#6ubj2)Qiqad`q|HGYVYgs r)sJ&H_p^4#hb7B0=gBbwwbegmUG`f$!!*bBG{_WBS3j3^P6DS1Dp zT~b{u%Ludq0&eiUueIAh|9z4B1AU+Sj}=?)?AuawZsoeyzEeJA$nL0%x%z!?kXK%( z!}hee2@{qq%RDn%;`^zP0|q?zwT;f@K7yL`$9{gBszYVEnCo1Sxt^|mF6*2UngE>1 Bg@phB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/r_foot.png b/Resources/Textures/Mobs/Animals/kobold.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9f3e77c9d562ad05ead457bc5db08d1adeec06 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|R(iTPhE&XX zd+VU@VF!V>i;l~d-VFNoz^TJScHN=&9RkxI6lWywSg4@qX~4Mf`?=Rwm+$@82h_*F z(4b%Se(RiRQGVWAuf5t{t+(}>-L0zk=38xJs|}3pWB06kef9poE&K0)YzBf4^*xU( zKI`mlKeOh{n#@`6=DnH!o#W;<-M;n5J33}P|EYMnB<<*w# z28M=kCyr@Bn*^HvTAx;5m8Gc~eD%?seM?rX(h?MW`8zJDXSa+~&&6HqgeSV+6LMw# z@Gs8n{N^Wf?u!4c(|i7AS*FnYy*j5i)i!U-EwB81{@X7nMzFCULZ)NYt*=E}3uV@3 z&f2f5*q(S}P5H&DKR0Ln{jGncbnnf`)oc&uOuqbcOXTOnR;S{@8V^XDi`wg}{MvZe P9%O{4tDnm{r-UW|6ytF- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/r_leg.png b/Resources/Textures/Mobs/Animals/kobold.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..e99fca61c956397db99b768c579d099b3b3e62cf GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|c6quuhE&XX zdutm~=dWSxRiv+%CpAohL1S;{U#}-g|8tP#+L9 z?7tMzw)cCb1e@n2oAb*ymq%SU^}e(%*Q)REmDj0~W#?XU{Zb2`zj}UaCgUWL@Tob9u_`ZD&t!dJ-kO=ljmryB^hi{=7qF?(>y}GNMizXZ0_A uul*=1ue%`gRXtzfxy<|DZ_uFs3c~AXbqhTGWsd_be-u$yV zIcX1LD?1jgC^{F!8sOzA;<{YbMmV`=^Ua)uwX6-3y9>UY(O8;dBlq~xW7a&o`&T|y z8%pq`m`EKgjWvriyV>kl@k}u0{(edKug~Wj54=Uyw+r7mlVmsl`Yzvp%Cpa;8T;g^ zGbk|hZ97)~yPkpJP1)}2oqf#7KDpxmS3fM!P+G6P;Qo7Ni#QHofLGP;W0ql>{iwD@ S|06J#89ZJ6T-G@yGywpuuIdZ` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/torso_f.png b/Resources/Textures/Mobs/Animals/kobold.rsi/torso_f.png new file mode 100644 index 0000000000000000000000000000000000000000..192d2b9849ec29a459a06aa9783a01e5c66f1a9c GIT binary patch literal 605 zcmV-j0;2tiP)Px%7fD1xRCt{2+A(h8Kokbx-vg!FjR03DC)i+off4lC0tIdY7jO<@Qm|R*kr6%K z3m_RGBnHSO>@8SEq2z@%Li>Lbg$uv;{AQTu4M0RhL`455NAgm?-_O_UHL@&&QVR8Y z9bp)XVo7v5o&53f(LS$MD~v`XQU0>zr8tf;=nw33_!>&Wh;6r9bYHqKI|HxgVK$qI zV~M)<{_{OQd>rhvSM%`vo^tw)?K@ez}lK rxvp#TYpoGQQQXh9YzPZ%_00000NkvXXu0mjfSqKLR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/kobold.rsi/torso_m.png b/Resources/Textures/Mobs/Animals/kobold.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..192d2b9849ec29a459a06aa9783a01e5c66f1a9c GIT binary patch literal 605 zcmV-j0;2tiP)Px%7fD1xRCt{2+A(h8Kokbx-vg!FjR03DC)i+off4lC0tIdY7jO<@Qm|R*kr6%K z3m_RGBnHSO>@8SEq2z@%Li>Lbg$uv;{AQTu4M0RhL`455NAgm?-_O_UHL@&&QVR8Y z9bp)XVo7v5o&53f(LS$MD~v`XQU0>zr8tf;=nw33_!>&Wh;6r9bYHqKI|HxgVK$qI zV~M)<{_{OQd>rhvSM%`vo^tw)?K@ez}lK rxvp#TYpoGQQQXh9YzPZ%_00000NkvXXu0mjfSqKLR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/eyes.png b/Resources/Textures/Mobs/Animals/monkey.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..573a605e91a45e8b76783633b9bdd1ebaf18b663 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|EIeHtLn`LH zy|s~-!GPm{!N30v*)Q+#Zd6dLJ}KPE(9pPMKTs729EhD=-(b!NW-oZlxOo;^;*4a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/full.png b/Resources/Textures/Mobs/Animals/monkey.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..c36e9abf8b8f3bec7ad2f8904b7326b938c36f7f GIT binary patch literal 519 zcmV+i0{H!jP)Px$!AV3xR9J=WmN8GlKorM+HO9dv#)U9+z%a1Yg&6$;Bn&L>os4mmk6?(O05&ET zc2^R=fJAPQ-MDlhF2(o-2JP%4)j$f1EK zL=FNtKdw$~oh!v{oKFYN8){{w=)>M_YI}HsNdnjR?*5#PpjJi>11R{j_JR+O2>{|s zVk7H=QHV4u`fUw9f&$v!sC-_cDBR*AaU2r_I_Gh##pTf*p!-69oQ;6f z5p=H9G_Vb`HuqgH&A@#5*dl5U@IXm(fER^5xh|C!9KDTtG{@<4SqXS1xZTN2x0_e8 zT@6Dk38p#aX~zp1h(cXLwX*)YnK`7jK8zRIt~4t7dcg*0)L36B literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/head_f.png b/Resources/Textures/Mobs/Animals/monkey.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..e84d4fbbb5f9d081bc23ed8ea79e54659ba59b6c GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zr+d0MhE&XX zd&}Pckb?xt!>)9j~a-ELRcv z$xu*Klkz(My*z`!l=r4gI%^eo{?yvZwuSGOZ^w1jg0SfMTcY_N)^2~Jk)a*!y?ob~ z-S3~pB~UM%tFJ>`UbCeFDN*1rFhllUrBqv%d|K&qV}5_r4%!OlHrEq`hKW-gnh zudM3HBe_jsQu&+o=*v!#lYV4>+ra9X)X_8LyP?dFyaZ{Lu+4`9o&Rodt?YUe7rijj z{P?reznO9--D&aLm6iSaRJ?c6WzI)w|J%NQ`SB`pvg5MC*HaSw Mp00i_>zopr0G24y$N&HU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/head_m.png b/Resources/Textures/Mobs/Animals/monkey.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..e84d4fbbb5f9d081bc23ed8ea79e54659ba59b6c GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zr+d0MhE&XX zd&}Pckb?xt!>)9j~a-ELRcv z$xu*Klkz(My*z`!l=r4gI%^eo{?yvZwuSGOZ^w1jg0SfMTcY_N)^2~Jk)a*!y?ob~ z-S3~pB~UM%tFJ>`UbCeFDN*1rFhllUrBqv%d|K&qV}5_r4%!OlHrEq`hKW-gnh zudM3HBe_jsQu&+o=*v!#lYV4>+ra9X)X_8LyP?dFyaZ{Lu+4`9o&Rodt?YUe7rijj z{P?reznO9--D&aLm6iSaRJ?c6WzI)w|J%NQ`SB`pvg5MC*HaSw Mp00i_>zopr0G24y$N&HU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/l_arm.png b/Resources/Textures/Mobs/Animals/monkey.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..b72718d59a50b6a3eee183c1e1b3ca685274d8bd GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|R(QHNhE&XX zdut=_Ap-%{3(Ol`t+;kg5fr|V+LCih?@Pz5TOu9P4q0j!eYwXFe{Fm0T~`K%16kXP zr`-G0KQr;OYLevbDI0nMpLy5iWii@%=|1?{H>2%OI8bQW!`buCa-ZPKDfHGYW(3;B zz_7r0>u%=E%?GcY7X1IGj6G}FrQI|5?8ABd$^#u-{^mJlF-F%lM=f8=KjGoO4riAs huQz=41Zr!Lt6@;ysburJXvs&AF`lk|F6*2UngFPxUT^>a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/l_foot.png b/Resources/Textures/Mobs/Animals/monkey.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..9856dd6faef0445c290d1fb95d13026530387295 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|dOcknLn`LH zy|s{+$x(#mg5pByC#Hqd+!k>EdANc}MXG)h(~1~3tKfkH$|CwPI|lV{I7`lzgIoqseDq!_VcZV`$bQ7Hfb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/l_hand.png b/Resources/Textures/Mobs/Animals/monkey.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac8ce3e608c687251deb4bcf59158a068b54510 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|$~;{hLn`LH zy=5ra;vnF9Q1gvI5>x8*Vo9xlCXOj*TqSNuN33`y_QCAN2Y(iz`UCPsbB(TRPPg2& zY4@3l>AN>c3mS$T+jl!|=I*`mi++7y|BeZ$3J5MNy54oWYIZ=Cd_m2zJmGK3dF)mB gKla{dXJDx4m2aPmdKI;Vst07+;=+5i9m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/l_leg.png b/Resources/Textures/Mobs/Animals/monkey.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..7907f130f4ccf8582e08f4fac96eeec7cef8c9e2 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|c6z!vhE&XX zdrOz^kb^+m!}TofD;=+zi0+um(wfusfTLPO@1X1sSN{tNA4^4L7;HtQWfZJ@IUm+u zne{iV{z(rD&esfK zFL*g+Yi-nh`FmT=&-)o18#n6#BSb%#{I9@vGt>Tj!4d7}&1=>jyI#Ki_-UK3ulGN_ q<$c^&>WakX`b|F>&g+BJewJpq#;h7>Y90XcB7>)^pUXO@geCyefM37> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json b/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json index b62cac749ad..d22ab1556c9 100644 --- a/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json +++ b/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json @@ -1,15 +1,74 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b , edited by Alekshhh", - "states": [ - { - "name": "monkey", - "directions": 4 - } - ] + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b , edited by Alekshhh, parts splitted up by Roudenn (GitHub)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "monkey", + "directions": 4 + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + }, + { + "name": "tail", + "directions": 4 + }, + { + "name": "eyes", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/r_arm.png b/Resources/Textures/Mobs/Animals/monkey.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..db4a7b639a925c6d260b7a99b87d7c16b898a180 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_ItWGhE&XX zdut=_Ap?1<#@*RF8K|*g z{W!ZU~<^n-bTz&X)1D+`eU#d~V);=#w~Y*PrPLF z_`+PWA?}0Yu6s*Q`|g%%EZVdA$mH8r5HnsJ6n4I(FE(YhZU)FePgg&ebxsLQ0FyOn A!T`SV--@&5M{_{RfuLsT zGC$4TulDWoe?I?3?OmO?Yx)0j5`TLp@w8t~-ExoN!22DH#u;jteZ1Gs0IBzM^>bP0 Hl+XkKm~&F- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/r_hand.png b/Resources/Textures/Mobs/Animals/monkey.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e27204944ebaacad15d4ad5efc50ac6bcc8e51 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Dm`5sLn`LH zy|t0I#es+Afbd&^ODt0-I+umksERnMswp|Y(0}lE!A!P2MZ2Ow#vbUb)DbN0SmB(K zzOyK0&hbyB=hi(v@G0_k@ZSq-e@5+_^-|N45vUFb{)K<@d(ii6d!~HBi94J*!Skc* h)4#vJ`5h=7m&pEENyElC&q@HK($m$?Wt~$(69AmXMt1-J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/r_leg.png b/Resources/Textures/Mobs/Animals/monkey.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..c470114e15d689def2bb01b8ba03e4675f3c60c4 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|c6quuhE&XX zdrOh;kb%U}kL(8%(*lgWS@}EzPN;G89SGdPQvN_}&H~3rg`zSHe|=3XoG#^^-1g!B z%rKq5ap}KRfMx)}gXNdq%u3qwy^3{<+H>xx~0`` ttoFrp1O=Dcr%(FJ@cvljWuTq|Q?@kyR1Li1l*$Uy>gnp|vd$@?2>{t>WNZKc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/tail.png b/Resources/Textures/Mobs/Animals/monkey.rsi/tail.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf07fb0ae89645accd3eeb21f7b16fd3dbe4dd9 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zl{{S>Ln`LH zy=CjiY$(w7P`{(Etxay}cflC9Th4D}cQknGZ74sXs1#V#@}(pjj(C;k5m^r zY&!8fWLo-O>&Np?X)^+iWng%)ZB0^g$tIf(cb7-3U*`C2)9yLXO{Q#}+bcOYXR{xF z?zK%-PF1G7n|2+rlB?-rkGHFj=a-n9v-`T1pHq(arQ7cHyOq|ZWlvr1_^otO-2LZe z+1uyHHl7dGGPy5mE4E*y;^yUMk?!-qmmCuW+Xp5-yceC`^3!zF6g{!*kJoCvH<&0@oVxgW3``OJULJP`M#x#c^McQqCfHSd~1H%r!grTWSyt0pUXO@geCwW Ct(h$V literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/torso_f.png b/Resources/Textures/Mobs/Animals/monkey.rsi/torso_f.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3c5ce5487eadfdf3ea0217bf7ebd232cd7322b GIT binary patch literal 465 zcmV;?0WSWDP)Px$i%CR5RCt{2+A(UwFcb#hmr^=3&@E(e!O*=&D4hyDL>EE#UZ4;Hy+BXkYZN>d zU888x5WJLtGh|T*qgsyLQa#HuZvGE~5`*%;$aV(#5di=I0KjpY`A&GgA+wmbj~6A; z%e(*gjh%nuJ3)OmL%WU-$>v;~pHWd(W1oEQ1=y5z0q(ddf0_}N&Drkujgg!0y#Pej zncwdAw3t_85$VUf`9wtaR_K$@T7duLlshr@SsyCjdjT$Q1wF1-L`0;urX)$K_v;0t8G5*G@5jg7qwmV ztLB8RmX)E|-h{dq9@Z7G4A7VmimhSEJPGV8;IM$$Mq7L#gi%U0UQ$Y00000NkvXX Hu0mjfccs+) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/torso_m.png b/Resources/Textures/Mobs/Animals/monkey.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3c5ce5487eadfdf3ea0217bf7ebd232cd7322b GIT binary patch literal 465 zcmV;?0WSWDP)Px$i%CR5RCt{2+A(UwFcb#hmr^=3&@E(e!O*=&D4hyDL>EE#UZ4;Hy+BXkYZN>d zU888x5WJLtGh|T*qgsyLQa#HuZvGE~5`*%;$aV(#5di=I0KjpY`A&GgA+wmbj~6A; z%e(*gjh%nuJ3)OmL%WU-$>v;~pHWd(W1oEQ1=y5z0q(ddf0_}N&Drkujgg!0y#Pej zncwdAw3t_85$VUf`9wtaR_K$@T7duLlshr@SsyCjdjT$Q1wF1-L`0;urX)$K_v;0t8G5*G@5jg7qwmV ztLB8RmX)E|-h{dq9@Z7G4A7VmimhSEJPGV8;IM$$Mq7L#gi%U0UQ$Y00000NkvXX Hu0mjfccs+) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-inhand-left.png b/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4fdc47c02209b9334661c1c039b2680be11cae GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL9r6oh?3y^w370~qEv=}#LT=BJwMkF1yeo4 z@6F#Q166EEjqptK^weVD0CHFvq!?Kl7=bJ=AeM%*L2l7tWCn{f0ojI(ObmQLItqw0 z+gZTk89+7&Bmgl;Ka57Pl7X3lVFEh?3sBy`$k>2!0mMv@de#LHb0z`VAixAPg$b-O z$kGDHg6c9fFaXIWFHt)ZUPja^)0UHsCRp z-oO?Rpd9P(E?IIy$KlNRgVnvl;?wrs(gPX7U~)qz&2-+%I8*bxpGwxeKE0FAG|Knc z?Yp(t0v3P$yXla9kCqKsA;W?5zmG`mE)}-zo%Lwf`_l`feINZcoB5q%@t5ll85`86 Z7BSCN*FRG*)kg!Q-qY33Wt~$(69E4ibg2LU literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-inhand-right.png b/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/heart-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9eaa8bae0f153c7cc545420601850caf8f327b GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL9r6oh?3y^w370~qEv=}#LT=BJwMkF1yeo4 z@6F#Q166EEjqptK^weVD0CHFvq!?Kl7=bJ=AeM%*L2l7tWCn{f0ojI(ObmQLItqw0 z+gZTk89+7&Bmgl;Ka57Pl7X3lVFEh?3sBy`$k>2!0mMv@de#LHb0z`VAixAPg$b-O z$kGDHg6c9fFaXIWFHt)ZTVJXE1ekiEd)NY~Yh+ zmcYAUL7$7id*wyN_tVD@F0t)=;2t4xTWeab^!oS>65BZ2 z9zQrV*LBMoRq_1?&a(X9Z}zgbqGF~bC(uX;I8YzSV;wfhCn#dF$hGuoZLb@<6OZrv z|4n51PTMm7RhtSQSRK}V&g!#0zES0@nSYnhihry2tmo~xe5Y=Y?e*u^9t0N7s@6VO z$@sR`dy+|gv`_rwJPz&T}SVawPqeKf8UL*=K0R(0t6yHtEY%EBwVpRw4&VQ&S(DA!}Ir_ zONioUVz`&LUU(Pl5lwl9g7PBOsHJN(`r8)SNVWZA`E&OA+J_F$k}hv*{d^^&cHNU8 z16}Jao)Od6M>k(#Idfc(VZqIJ$(Kq$-1zOVX-4?jY1{PnfB(5QwE2o014H*g5r%@A z;&n2svcguYHT0bjxdcS38~u0neX?CTuOV{ntPf!a7Ynb;vMZ}!`>QDFipJjyEA+z| zJ2KS2T{V#39VNUV)ZxWK>j-8+IJjuny~{q~a?(|K0n5vqT(A6PoGtdF;L4Vqi8{{; zE5G!m?e6!|+xn|6`)aGg2bLe_pD{kz_p#|{f>c)h0W*)ihyMj9{yz}!ub;GA+~X^I x#kbTC4NmnAPo96;ogn}3e`f~>ys-bx_?~5l>YWXGD}b@X;OXk;vd$@?2>?9{&fEY1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/meta.json new file mode 100644 index 00000000000..bfd6996bddb --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Space/Cobra/organs.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by wyvernrer (337793232195026944)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "heart-inhand-left", + "directions": 4 + }, + { + "name": "heart-inhand-right", + "directions": 4 + }, + { + "name": "heart-off" + }, + { + "name": "heart-on", + "delays": [ + [ + 0.6, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/heart-inhand-left.png b/Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/heart-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb1681adc97e277b3972ef13e75c5f4ee3d24d7 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`212l#}z7S|i^4G?;nXR^RR94I#R#qr}ninS!jFZe$YF#O)e7Yr2OEbxdd zW?jH>5lYndxU;>)L1XdYjX#r$Gbr~8MfMk=G zs2vIN`+Ek+O!IVc42f`mdu=1v0Rk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`212l#}z7S|i^4G?;nXR^RR94I#R#qr}ninS!jFZe$YF#O)e7Yr2OEbxdd zW?jH>5lYndxU;>)L1XdYjX#r$Gbr~8MfMk=G zs2vIN`+Ek+%WJkCEwx5!oBMrO!ZM>I=FP{ z!|WfImhSXB@_BdTXM6qUALJ&ecus<#x+@u%v=Px$zez+vRCt{2+P_NzVHgMSZ;@aU99)P*ChB-N1Z_EpxI{zT7)?okLbw|AX9Qtm zV?^r_4!X1yN{f)vB_V-uOAZZhgI!%tzTPja?`MDgKE6H=2=4z+Rsm}YLMyx zLsx%==TcdC@hi-dUv4P4J8PrdP=c%BVlyEOT@|T#M%+ZBqS#4xH9T-6{oJLODK6qH8*z()Eb z@cEz2H+vD(Ee*Bq?aXyZA9NORcs~gA0{qCA8Ub6~(g2KS(rp1@=P$_~_-?mM@hd#o z{{>;^6A=*+5fKp)5fRb9683(8*XC+JzzmKNjeIfFI-^NAnhdpV_aybv-UA zSaY=?;Rosc0Q+s;>_tM`5Ac%I2u!}s+ucA!L_|bHM04g7I3vWlX5kW600000NkvXX Hu0mjfr=#1_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/meta.json new file mode 100644 index 00000000000..bfd6996bddb --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Space/Goliath/organs.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by wyvernrer (337793232195026944)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "heart-inhand-left", + "directions": 4 + }, + { + "name": "heart-inhand-right", + "directions": 4 + }, + { + "name": "heart-off" + }, + { + "name": "heart-on", + "delays": [ + [ + 0.6, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeball-l.png b/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeball-l.png new file mode 100644 index 0000000000000000000000000000000000000000..14e728707a96ff43cf2e118f6d0d3681abcafff5 GIT binary patch literal 364 zcmV-y0h9iTP)p@G$ZbO+JRa(Y-sR21NopLg*T zMNvXfb4^vze|dRnh7XTlGF;z$0L4OB^iYy6@M@erv-iKhpF6|T=Pwz)ef`ex>gIih zV^dc!be}(p;s{UzB{w9P@L8UcoXa30BF~_$slvd|&&wd8rNm&J6~Rz$Xbq1RHbzEp z?jRT7bhYcc`(R6U`AIP_{Qt}F=kFVav*)icF#h?+up+k&u8tDl;|+ncuf8+vi8Wvl znR}lB>jFTOMRB!fDV9xfdK&iNO|VF)wHDm0000< KMNUMnLSTZYq^t7) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeball-r.png b/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeball-r.png new file mode 100644 index 0000000000000000000000000000000000000000..d18f4d4572511fc96b0b85503ff875353b14fb34 GIT binary patch literal 354 zcmV-o0iFJdP)0j6Lt-DVo}a0SXPQ;Fg0Ng6x<90W@<&p@9|AYOy(hi5iYb z(l;Z^au8sl)N(dPMh1Q)V?c2a68ndw=Fk8C3?Kjh!I}^$cEIa@zd;6r*`;Hd-{tL&5O7#>+0nBoc&tZmvd`ow5>*)6XFCU)&f9vRu|HxU8F5t`CoB#j+c?QRS zemtUIzCU(&GuTqsb@%@>PQ3bGc;=1&zkfXXf91$_q8vbR8jzQl0n-PberI5)vSRr3 z>mLI%GcyCfj5tyHDR#j9hflyX9~%>cP~S-g2Wd_)|Iy>8lp0MuIC6ON|9`)qf};XN zA3eO8{^dT%5%1sJ_?SPcUMOUBpw54Ym^xdS&>o9?z{xUic&GF(yE S*8ZUrNQI}XpUXO@geCxj06vib literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeballs-inhand-right.png b/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/eyeballs-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..4dfafd118d094ee7d309079fcfd50b503d69629f GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|GCW-zLn`LH zy|t0E!9jrK!207p!KXK}{WcMJbHwFCuiZtLCl76BtW3ziymtyvIRit*tlx&)&wV&{ zg}1bL+Trub{DB9y=~*uAa&@u%vrdE&tcJnC!WOa{-k~D`(@6+5D?=Ss3=^W RWw{Wfz|+;wWt~$(69BYSKK1|r literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/meta.json b/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/meta.json new file mode 100644 index 00000000000..a9447f20cda --- /dev/null +++ b/Resources/Textures/_Shitmed/Mobs/Species/Space/LaserRaptor/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by wyvernrer (337793232195026944)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "eyeballs-inhand-left", + "directions": 4 + }, + { + "name": "eyeballs-inhand-right", + "directions": 4 + }, + { + "name": "eyeball-l" + }, + { + "name": "eyeball-r" + } + ] +} diff --git a/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/evil-inhand-left.png b/Resources/Textures/_Shitmed/Objects/Specific/Medical/Surgery/omnimed.rsi/evil-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..90cd76871c22b82b095f08f419df64c76180c95a GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zTRmMILn`LH zy>&3_kb?;8h3vvqlg0)XmxT*DR-f7bBfoA&?9`-%0XY*K4qVGv(|z5wlQ$_k-AGyQ z-ObdA=K3=|&E7M)K!F(VapBIXLX)d~-(SAEA$G&9A6jQWY^*z;QPSW3^UtHLNlQ~U zRva{okAD9?yI9%$$beQ;TEXy~q#C zUw<`r-zob8D>FCi8{aptnlSVI=`AeL*ykPYifsoA{YIB}2ml!eL+Il{P<5j^l{v9U53tm4nW+^pd+_g%QDLBmi+*SKc yo@xuuRV|ZbTJ1aS^PlWkSbU;8x{*%g8<`S!-uLoW^@wxBZ!4p;)X4Q_~Ts!(|Z~QlyyR1*& z`0}Jx_xGP)vv=M$<2yMQCo%2TIP|)PlVL};$-0PTaogUmP>7IZxG;(7VcKlVZPV@) z+>T9+3i`?Y|HFCqgQq(D!$dEB6JDk&%CMu4xBlVbElY}S-?i^Q+;9CL*V5l_%ct}8 zZGK^XG29lXa|jxpWyO%-=6=RqnOFDQ~5$((_#!_4bZ0e~bE^ykELAZ2uwGiytk2 x?$$f0-*E1AY{{bNr|&GoV1cDBA5evONswPK!+)$` zLwE6gppqs}7sn8b-n)~$g&GVvoM-AdEZ_UT^6B;fZd-@V0q*lS-8%b(SAT1H!!g^y zB9!rvn9@471lt3lf{F7bO&5Mkuy?)3_2RS3VY4r*&v!h(B71~U$AN<}fcwRr{KI7# zvmCa$mM(m}&&}$J*Mc+k?qB$>eZF<@z3GK|U-b#EY|Z{3zF5Uz;?3gnM%5t& Date: Fri, 27 Dec 2024 17:48:54 +0000 Subject: [PATCH 27/40] random fixes --- .../Inventory/ClientInventorySystem.cs | 2 +- .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 10 +++------- Content.Server/Medical/HealthAnalyzerSystem.cs | 2 +- .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 3 ++- .../_White/Standing/LayingDownSystem.cs | 3 ++- Content.Shared/Body/Part/BodyPartComponent.cs | 2 +- .../Overlays/ShowHealthBarsComponent.cs | 10 ---------- .../Overlays/ShowHealthIconsComponent.cs | 11 ----------- Content.Shared/Standing/StandingStateSystem.cs | 2 +- Resources/ConfigPresets/DeltaV/deltav.toml | 3 +++ Resources/Prototypes/Body/Parts/silicon.yml | 3 --- Resources/Prototypes/_Goobstation/tags.yml | 11 +++++++++++ .../_Shitmed/Entities/Surgery/surgeries.yml | 16 ++++++++-------- .../_Shitmed/Entities/Surgery/surgery_steps.yml | 4 ++-- Resources/Prototypes/borg_types.yml | 3 +++ 15 files changed, 38 insertions(+), 47 deletions(-) create mode 100644 Resources/Prototypes/_Goobstation/tags.yml diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index f3442f8fd31..535428885ef 100644 --- a/Content.Client/Inventory/ClientInventorySystem.cs +++ b/Content.Client/Inventory/ClientInventorySystem.cs @@ -253,7 +253,7 @@ protected override void UpdateInventoryTemplate(Entity ent) public sealed class SlotData { [ViewVariables] // Shitmed Change - Mostly for debugging. - public readonly SlotDefinition SlotDef; + public SlotDefinition SlotDef; public EntityUid? HeldEntity => Container?.ContainedEntity; public bool Blocked; public bool Highlighted; diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 965f027ccff..ca57272669b 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -1,5 +1,6 @@ using System.Numerics; using Content.Client.Stylesheets; +using Content.Shared._Goobstation.CCVar; // GoobStation using Content.Shared.CCVar; using Content.Shared.Input; using Robust.Client.AutoGenerated; @@ -105,7 +106,7 @@ private void HandleStaticStorageUI(BaseButton.ButtonToggledEventArgs args) private void HandleToggleAutoGetUp(BaseButton.ButtonToggledEventArgs args) // WD EDIT { - _cfg.SetCVar(CCVars.AutoGetUp, args.Pressed); + _cfg.SetCVar(GoobCVars.AutoGetUp, args.Pressed); _cfg.SaveToFile(); } @@ -168,7 +169,7 @@ void AddCheckBox(string checkBoxName, bool currentState, Action ent, EntityUid use if (!IsLyingDown(target, user)) return; - if (user == target && !_config.GetCVar(CCVars.CanOperateOnSelf)) + if (user == target && !_config.GetCVar(GoobCVars.CanOperateOnSelf)) { _popup.PopupEntity(Loc.GetString("surgery-error-self-surgery"), user, user); return; diff --git a/Content.Server/_White/Standing/LayingDownSystem.cs b/Content.Server/_White/Standing/LayingDownSystem.cs index 95315c28c33..ad770cf0ae2 100644 --- a/Content.Server/_White/Standing/LayingDownSystem.cs +++ b/Content.Server/_White/Standing/LayingDownSystem.cs @@ -2,6 +2,7 @@ using Content.Shared._White.Standing; using Content.Shared.CCVar; using Robust.Shared.Configuration; +using Content.Shared._Goobstation.CCVar; namespace Content.Server.Standing; @@ -22,7 +23,7 @@ private void OnCheckAutoGetUp(CheckAutoGetUpEvent ev, EntitySessionEventArgs arg if (!TryComp(uid, out LayingDownComponent? layingDown)) return; - layingDown.AutoGetUp = _cfg.GetClientCVar(args.SenderSession.Channel, CCVars.AutoGetUp); + layingDown.AutoGetUp = _cfg.GetClientCVar(args.SenderSession.Channel, GoobCVars.AutoGetUp); Dirty(uid, layingDown); } } diff --git a/Content.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index 2a7e3e5db3f..ef5e7f08995 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -16,7 +16,7 @@ namespace Content.Shared.Body.Part; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(SharedBodySystem))] +//[Access(typeof(SharedBodySystem))] // goob edit - all access :godo: public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent // Shitmed Change { // Need to set this on container changes as it may be several transform parents up the hierarchy. diff --git a/Content.Shared/Overlays/ShowHealthBarsComponent.cs b/Content.Shared/Overlays/ShowHealthBarsComponent.cs index 8344686d2de..da1abad0686 100644 --- a/Content.Shared/Overlays/ShowHealthBarsComponent.cs +++ b/Content.Shared/Overlays/ShowHealthBarsComponent.cs @@ -8,23 +8,13 @@ namespace Content.Shared.Overlays; /// /// This component allows you to see health bars above damageable mobs. /// -<<<<<<< HEAD -[RegisterComponent, NetworkedComponent] -[AutoGenerateComponentState(true)] -======= [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Shitmed Change ->>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public sealed partial class ShowHealthBarsComponent : Component { /// /// Displays health bars of the damage containers. /// -<<<<<<< HEAD - [DataField] - [AutoNetworkedField] -======= [DataField, AutoNetworkedField] // Shitmed Change ->>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public List> DamageContainers = new() { "Biological" diff --git a/Content.Shared/Overlays/ShowHealthIconsComponent.cs b/Content.Shared/Overlays/ShowHealthIconsComponent.cs index 5f32614b7ee..43a68f9e84f 100644 --- a/Content.Shared/Overlays/ShowHealthIconsComponent.cs +++ b/Content.Shared/Overlays/ShowHealthIconsComponent.cs @@ -7,24 +7,13 @@ namespace Content.Shared.Overlays; /// /// This component allows you to see health status icons above damageable mobs. /// -<<<<<<< HEAD -[RegisterComponent, NetworkedComponent] -[AutoGenerateComponentState(true)] -======= [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Shitmed Change - ->>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public sealed partial class ShowHealthIconsComponent : Component { /// /// Displays health status icons of the damage containers. /// -<<<<<<< HEAD - [DataField] - [AutoNetworkedField] -======= [DataField, AutoNetworkedField] // Shitmed Change ->>>>>>> a3b45e4bd6 (Shitmed Update 2 - bottom text (#956)) public List> DamageContainers = new() { "Biological" diff --git a/Content.Shared/Standing/StandingStateSystem.cs b/Content.Shared/Standing/StandingStateSystem.cs index 9f7662bdbe8..6a701baf2bf 100644 --- a/Content.Shared/Standing/StandingStateSystem.cs +++ b/Content.Shared/Standing/StandingStateSystem.cs @@ -65,7 +65,7 @@ public bool Down(EntityUid uid, bool playSound = true, bool dropHeldItems = true return false; standingState.CurrentState = StandingState.Lying; - Dirty(standingState); + Dirty(uid, standingState); RaiseLocalEvent(uid, new DownedEvent(), false); // Seemed like the best place to put it diff --git a/Resources/ConfigPresets/DeltaV/deltav.toml b/Resources/ConfigPresets/DeltaV/deltav.toml index aa10fc199f8..e003bbd3295 100644 --- a/Resources/ConfigPresets/DeltaV/deltav.toml +++ b/Resources/ConfigPresets/DeltaV/deltav.toml @@ -81,3 +81,6 @@ auto_call_extension_time = 30 # next auto call at 2h30 [biomass] easy_mode = false # reclaimer can work on soul-ful bodies, mrp server + +[surgery] +can_operate_on_self = false # mrp... diff --git a/Resources/Prototypes/Body/Parts/silicon.yml b/Resources/Prototypes/Body/Parts/silicon.yml index ba185c49c90..2d30fe9fbbd 100644 --- a/Resources/Prototypes/Body/Parts/silicon.yml +++ b/Resources/Prototypes/Body/Parts/silicon.yml @@ -128,9 +128,6 @@ - Trash - BorgLeg - BorgRLeg - - type: MovementBodyPart # Shitmed Change: 25% speed boost - walkSpeed: 3.125 - sprintSpeed: 5.625 - type: entity id: LightHeadBorg diff --git a/Resources/Prototypes/_Goobstation/tags.yml b/Resources/Prototypes/_Goobstation/tags.yml new file mode 100644 index 00000000000..592e4f23a1a --- /dev/null +++ b/Resources/Prototypes/_Goobstation/tags.yml @@ -0,0 +1,11 @@ +- type: Tag + id: Heart + +- type: Tag + id: Liver + +- type: Tag + id: Lungs + +- type: Tag + id: Organ diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml index cd20e14a2fd..4823eb8baf3 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgeries.yml @@ -605,12 +605,12 @@ - type: SurgeryOrganOnAddCondition components: brain: - - type: OhioAccent + #- type: OhioAccent # DeltaV - type: RatvarianLanguage - type: Clumsy - clumsyDamage: # Placeholder values to be able to initialize the component - types: - Blunt: 0 + #clumsyDamage: # Placeholder values to be able to initialize the component + # types: + # Blunt: 0 inverse: true - type: SurgeryPartCondition part: Head @@ -632,12 +632,12 @@ - type: SurgeryOrganOnAddCondition components: brain: - - type: OhioAccent + #- type: OhioAccent # DeltaV - type: RatvarianLanguage - type: Clumsy - clumsyDamage: - types: - Blunt: 0 + #clumsyDamage: + # types: + # Blunt: 0 - type: SurgeryPartCondition part: Head diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index 97a693445ac..5ba6b3c4da7 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -523,7 +523,7 @@ - type: Drill addOrganOnAdd: brain: - - type: OhioAccent + #- type: OhioAccent # DeltaV - type: RatvarianLanguage - type: Clumsy clumsyDamage: @@ -554,7 +554,7 @@ duration: 4 removeOrganOnAdd: brain: - - type: OhioAccent + #- type: OhioAccent # DeltaV - type: RatvarianLanguage - type: Clumsy clumsyDamage: diff --git a/Resources/Prototypes/borg_types.yml b/Resources/Prototypes/borg_types.yml index 72b5c954eb8..99c5f4ee764 100644 --- a/Resources/Prototypes/borg_types.yml +++ b/Resources/Prototypes/borg_types.yml @@ -156,6 +156,7 @@ defaultModules: - BorgModuleTreatment + - BorgModuleSurgery # DeltaV radioChannels: - Science @@ -172,6 +173,8 @@ damageContainers: - Biological - type: FabricateCandy # Nyanotrasen - The medical cyborg can generate candies filled with medicine. + - type: SurgeryTarget # Shitmed + - type: Sanitized # Shitmed # Visual inventoryTemplateId: borgDutch From 26db19df6eac2eb9ed8293ce97cada076f548146 Mon Sep 17 00:00:00 2001 From: Piras314 Date: Wed, 18 Dec 2024 12:26:33 -0500 Subject: [PATCH 28/40] fix --- .../Entities/Surgery/surgery_steps.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index 5ba6b3c4da7..9e165e3c7ab 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -526,12 +526,12 @@ #- type: OhioAccent # DeltaV - type: RatvarianLanguage - type: Clumsy - clumsyDamage: - types: - Blunt: 5 - Piercing: 4 - groups: - Burn: 3 + # clumsyDamage: + # types: + # Blunt: 5 + # Piercing: 4 + # groups: + # Burn: 3 duration: 5 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/drill.rsi @@ -557,9 +557,9 @@ #- type: OhioAccent # DeltaV - type: RatvarianLanguage - type: Clumsy - clumsyDamage: - types: - Blunt: 0 + # clumsyDamage: + # types: + # Blunt: 0 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat From 6690cbe62758f38b6360a28957036241afdd6f56 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Fri, 27 Dec 2024 18:56:30 +0000 Subject: [PATCH 29/40] try fix test --- Resources/Prototypes/_Goobstation/tags.yml | 15 +++++++++++++++ .../_Shitmed/Body/Organs/Animal/animal.yml | 13 +++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/_Goobstation/tags.yml b/Resources/Prototypes/_Goobstation/tags.yml index 592e4f23a1a..52632e7bb81 100644 --- a/Resources/Prototypes/_Goobstation/tags.yml +++ b/Resources/Prototypes/_Goobstation/tags.yml @@ -1,6 +1,15 @@ +- type: Tag + id: Brain + +- type: Tag + id: Eyes + - type: Tag id: Heart +- type: Tag + id: Kidneys + - type: Tag id: Liver @@ -9,3 +18,9 @@ - type: Tag id: Organ + +- type: Tag + id: Stomach + +- type: Tag + id: Tongue diff --git a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml index 53485bfdc45..e06c91dd8bc 100644 --- a/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml +++ b/Resources/Prototypes/_Shitmed/Body/Organs/Animal/animal.yml @@ -32,12 +32,13 @@ - type: FlavorProfile flavors: - people - - type: FoodSequenceElement - entries: - burger: - name: food-sequence-content-brain - taco: - name: food-sequence-content-brain + # DeltaV + #- type: FoodSequenceElement + # entries: + # burger: + # name: food-sequence-content-brain + # taco: + # name: food-sequence-content-brain - type: Item size: Small heldPrefix: brain From 87e59d7cd11224049bbda06332ba1f21c528b0e2 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Fri, 27 Dec 2024 19:02:11 +0000 Subject: [PATCH 30/40] :trollface: --- Resources/Prototypes/_Goobstation/tags.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Resources/Prototypes/_Goobstation/tags.yml b/Resources/Prototypes/_Goobstation/tags.yml index 52632e7bb81..9a4c789d38b 100644 --- a/Resources/Prototypes/_Goobstation/tags.yml +++ b/Resources/Prototypes/_Goobstation/tags.yml @@ -1,6 +1,3 @@ -- type: Tag - id: Brain - - type: Tag id: Eyes From 1b7390fbf6c30ef7077ac664d8c6123a0cf2598b Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Sun, 29 Dec 2024 07:23:08 +0000 Subject: [PATCH 31/40] give borgs targeting --- Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index bd56cf41603..bfed31575e3 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -72,6 +72,7 @@ # Only used for NT borgs that can switch type, defined here to avoid copy-pasting the rest of this component. enum.BorgSwitchableTypeUiKey.SelectBorgType: type: BorgSelectTypeUserInterface + - type: Targeting # Shitmed Change - type: ActivatableUI key: enum.BorgUiKey.Key - type: SiliconLawBound From b83ee1b5c7a3fbd3bc5445dbcfcb37118d0437fe Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Tue, 31 Dec 2024 08:47:10 +0000 Subject: [PATCH 32/40] make mousetraps damage your feet --- .../Damage/Components/DamageUserOnTriggerComponent.cs | 7 +++++++ Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Content.Server/Damage/Components/DamageUserOnTriggerComponent.cs b/Content.Server/Damage/Components/DamageUserOnTriggerComponent.cs index 2a30374709b..22dc39aabd6 100644 --- a/Content.Server/Damage/Components/DamageUserOnTriggerComponent.cs +++ b/Content.Server/Damage/Components/DamageUserOnTriggerComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Damage; +using Content.Shared._Shitmed.Targeting; // Shitmed namespace Content.Server.Damage.Components; @@ -9,4 +10,10 @@ public sealed partial class DamageUserOnTriggerComponent : Component [DataField("damage", required: true)] public DamageSpecifier Damage = default!; + + /// + /// Shitmed Change: Lets mousetraps, etc. target the feet. + /// + [DataField] + public TargetBodyPart? TargetPart = TargetBodyPart.Feet; } diff --git a/Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs b/Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs index 5051751be9d..4510b1ec705 100644 --- a/Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs +++ b/Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs @@ -35,7 +35,7 @@ private bool OnDamageTrigger(EntityUid source, EntityUid target, DamageUserOnTri var ev = new BeforeDamageUserOnTriggerEvent(damage, target); RaiseLocalEvent(source, ev); - return _damageableSystem.TryChangeDamage(target, ev.Damage, component.IgnoreResistances, origin: source) is not null; + return _damageableSystem.TryChangeDamage(target, ev.Damage, component.IgnoreResistances, origin: source, targetPart: component.TargetPart) is not null; // Shitmed Change } } From 06fb0846f2facd09896632466a8bb15b0f1779f0 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Fri, 3 Jan 2025 21:19:58 +0000 Subject: [PATCH 33/40] make gun executions target the head --- Content.Server/_DV/Execution/ExecutionSystem.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Server/_DV/Execution/ExecutionSystem.cs b/Content.Server/_DV/Execution/ExecutionSystem.cs index 5de3332494b..8d4ba66cbc7 100644 --- a/Content.Server/_DV/Execution/ExecutionSystem.cs +++ b/Content.Server/_DV/Execution/ExecutionSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Interaction; using Content.Server.Kitchen.Components; using Content.Server.Weapons.Ranged.Systems; +using Content.Shared._Shitmed.Targeting; using Content.Shared.ActionBlocker; using Content.Shared.Clumsy; using Content.Shared.Damage; @@ -261,7 +262,7 @@ private void OnDoafterGun(EntityUid uid, GunComponent component, DoAfterEvent ar throw new ArgumentOutOfRangeException(); } - // Clumsy people have a chance to shoot themselves + // Clumsy people have a chance to shoot themselves (not in the head) if (!component.ClumsyProof && TryComp(attacker, out var clumsy) && _random.Prob(1f/3f)) @@ -276,7 +277,7 @@ private void OnDoafterGun(EntityUid uid, GunComponent component, DoAfterEvent ar } // Gun successfully fired, deal damage - _damageableSystem.TryChangeDamage(victim, damage * DamageModifier, true); + _damageableSystem.TryChangeDamage(victim, damage * DamageModifier, true, targetPart: TargetBodyPart.Head); _audioSystem.PlayEntity(component.SoundGunshot, Filter.Pvs(weapon), weapon, false, AudioParams.Default); // Popups From 410edccef7c27460a00034da6249ee55234555e5 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Sat, 4 Jan 2025 03:50:41 +0000 Subject: [PATCH 34/40] make limbs gib at 200 pierce --- Resources/Prototypes/Body/Parts/base.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Prototypes/Body/Parts/base.yml b/Resources/Prototypes/Body/Parts/base.yml index f2a67e4c91e..c7f43494a18 100644 --- a/Resources/Prototypes/Body/Parts/base.yml +++ b/Resources/Prototypes/Body/Parts/base.yml @@ -37,6 +37,12 @@ damage: 150 behaviors: - !type:GibPartBehavior { } + - trigger: + !type:DamageTypeTrigger + damageType: Piercing + damage: 200 + behaviors: + - !type:GibPartBehavior { } - trigger: !type:DamageTypeTrigger damageType: Heat From 11c1ba497577b0ea9560b87b523bbc51eb8271dc Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Sat, 4 Jan 2025 04:06:31 +0000 Subject: [PATCH 35/40] fix pierce not severing --- .../_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs index 6e145b7303d..b9af3337501 100644 --- a/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs +++ b/Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.Targeting.cs @@ -34,7 +34,7 @@ public partial class SharedBodySystem [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - private readonly string[] _severingDamageTypes = { "Slash", "Pierce", "Blunt" }; + private readonly ProtoId[] _severingDamageTypes = { "Slash", "Piercing", "Blunt" }; private const double IntegrityJobTime = 0.005; private readonly JobQueue _integrityJobQueue = new(IntegrityJobTime); public sealed class IntegrityJob : Job From 1aa77155e6be735e2886ba8597f3aa41bf053171 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Sat, 4 Jan 2025 04:06:55 +0000 Subject: [PATCH 36/40] remove funny thing --- Resources/Prototypes/Body/Parts/base.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Resources/Prototypes/Body/Parts/base.yml b/Resources/Prototypes/Body/Parts/base.yml index c7f43494a18..f2a67e4c91e 100644 --- a/Resources/Prototypes/Body/Parts/base.yml +++ b/Resources/Prototypes/Body/Parts/base.yml @@ -37,12 +37,6 @@ damage: 150 behaviors: - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 200 - behaviors: - - !type:GibPartBehavior { } - trigger: !type:DamageTypeTrigger damageType: Heat From d8ee2cb2106b32a55e0eab1b707281f893bbd5bc Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Sat, 4 Jan 2025 05:30:48 +0000 Subject: [PATCH 37/40] hopefully fix the laying down mispredicts --- Content.Shared/_White/Standing/SharedLayingDownSystem.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs index ea17c23881b..c772a1cb3f5 100644 --- a/Content.Shared/_White/Standing/SharedLayingDownSystem.cs +++ b/Content.Shared/_White/Standing/SharedLayingDownSystem.cs @@ -89,6 +89,7 @@ private void OnStandingUpDoAfter(EntityUid uid, StandingStateComponent component } component.CurrentState = StandingState.Standing; + Dirty(uid, component); } private void OnRefreshMovementSpeed(EntityUid uid, LayingDownComponent component, RefreshMovementSpeedModifiersEvent args) @@ -135,6 +136,7 @@ standingState.CurrentState is not StandingState.Lying || return false; standingState.CurrentState = StandingState.GettingUp; + Dirty(uid, standingState); return true; } From 57402795f2b3e3a8b6b11d1de2e8d3c10521fd24 Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Sat, 4 Jan 2025 05:39:38 +0000 Subject: [PATCH 38/40] evil surgery damage and change stuff to work for it --- .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 4 +- .../Entities/Surgery/surgery_steps.yml | 83 +++++++++++++++---- 2 files changed, 67 insertions(+), 20 deletions(-) diff --git a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs index c10789a01a2..5e3147533a9 100644 --- a/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs +++ b/Content.Server/_Shitmed/Medical/Surgery/SurgerySystem.cs @@ -49,7 +49,7 @@ public override void Initialize() // 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(OnSurgeryDamageChange); // DeltaV: Use SurgeryStepEvent so steps can actually damage the patient SubscribeLocalEvent(OnStepScreamComplete); SubscribeLocalEvent(OnStepSpawnComplete); } @@ -140,7 +140,7 @@ private void OnUtilityVerb(Entity ent, ref GetVerbsEvent ent, ref SurgeryStepDamageEvent args) => SetDamage(args.Body, args.Damage, args.PartMultiplier, args.User, args.Part); - private void OnSurgeryDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent args) + private void OnSurgeryDamageChange(Entity ent, ref SurgeryStepEvent args) // DeltaV { var damageChange = ent.Comp.Damage; if (HasComp(args.Body)) diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index 9e165e3c7ab..fa5c46e7e1e 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -1,6 +1,6 @@ - type: entity id: SurgeryStepBase - categories: [ HideSpawnMenu ] + abstract: true components: - type: SurgeryStep @@ -23,6 +23,7 @@ damage: types: Bloodloss: 10 + Slash: 3 # DeltaV sleepModifier: 0.5 - type: SurgeryStepEmoteEffect @@ -62,6 +63,10 @@ - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor + - type: SurgeryDamageChangeEffect # DeltaV + damage: + types: + Slash: 2 - type: entity parent: SurgeryStepBase @@ -79,6 +84,11 @@ sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi state: circular-saw - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect # DeltaV + sleepModifier: 0.25 # Highly invasive, large damage if the patient is wriggling around + damage: + types: + Slash: 20 - type: entity parent: SurgeryStepBase @@ -95,6 +105,10 @@ - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor + - type: SurgeryDamageChangeEffect # DeltaV + damage: + types: + Blunt: 10 #- type: entity # parent: SurgeryStepBase @@ -146,6 +160,11 @@ - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor + - type: SurgeryDamageChangeEffect # DeltaV: Reverse damage from SurgeryStepOpenBones + damage: + types: + Blunt: -5 + sleepModifier: 2 - type: entity parent: SurgeryStepBase @@ -162,6 +181,11 @@ - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/bone-gel.rsi state: bone-gel + - type: SurgeryDamageChangeEffect # DeltaV: Reverse damage from SurgeryStepSawBones + damage: + types: + Slash: -5 + sleepModifier: 2 - type: entity parent: SurgeryStepBase @@ -187,7 +211,7 @@ - type: SurgeryDamageChangeEffect damage: types: - Heat: -5 + Slash: -5 # DeltaV: Cauterizing closes incisions, not grafting skin sleepModifier: 2 - type: SurgeryStepEmoteEffect @@ -231,7 +255,7 @@ - type: SurgeryDamageChangeEffect damage: types: - Heat: -5 + Slash: -5 # DeltaV: Cauterizing closes incisions, not grafting skin sleepModifier: 2 # Feature Removal @@ -252,6 +276,10 @@ sprite: _Shitmed/Objects/Specific/Medical/Surgery/circular-saw.rsi state: circular-saw - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect # DeltaV + damage: + types: + Slash: 5 - type: entity parent: SurgeryStepBase @@ -295,6 +323,11 @@ state: circular-saw - type: SurgeryRemovePartStep - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect # DeltaV: Traumatic amputation is traumatic + sleepModifier: 0.25 + damage: + types: + Slash: 30 # Tend Wounds @@ -314,6 +347,10 @@ sprite: _Shitmed/Objects/Specific/Medical/Surgery/scalpel.rsi state: scalpel - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect # DeltaV + damage: + types: + Slash: 2 - type: entity parent: SurgeryStepBase @@ -372,7 +409,7 @@ - type: SurgeryDamageChangeEffect damage: types: - Heat: -5 + Slash: -1 # DeltaV: Cauterizing closes incisions, not grafting skin sleepModifier: 2 - type: SurgeryStepEmoteEffect @@ -392,6 +429,11 @@ - type: SurgeryStepCavityEffect action: Insert - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect # DeltaV + sleepModifier: 0.25 # Highly invasive, huge damage if the patient is wriggling around + damage: + types: + Blunt: 40 - type: entity parent: SurgeryStepBase @@ -425,6 +467,11 @@ state: hemostat - type: SurgeryRemoveOrganStep - type: SurgeryStepEmoteEffect + - type: SurgeryDamageChangeEffect # DeltaV + sleepModifier: 0.1 # Maints organ transplants are BAD + damage: + types: + Slash: 50 - type: entity parent: SurgeryStepBase @@ -447,13 +494,13 @@ id: SurgeryStepInsertLungs name: Add lungs categories: [ HideSpawnMenu ] - components: - - type: SurgeryDamageChangeEffect - damage: - types: - Asphyxiation: -2147483648 # Literally the max 32 bit value, if your patient has gone higher than this, maybe it's time to restart the round. - sleepModifier: 1 - isConsumable: true + #components: # DeltaV: This works regardless of origin body and is useless anyway. + #- type: SurgeryDamageChangeEffect + # damage: + # types: + # Asphyxiation: -2147483648 # Literally the max 32 bit value, if your patient has gone higher than this, maybe it's time to restart the round. + # sleepModifier: 1 + # isConsumable: true - type: entity parent: SurgeryStepInsertOrgan @@ -467,13 +514,13 @@ id: SurgeryStepInsertLiver name: Add liver categories: [ HideSpawnMenu ] - components: - - type: SurgeryDamageChangeEffect - damage: - types: - Poison: -2147483648 # Literally the max 32 bit value, if your patient has gone higher than this, maybe it's time to restart the round. - sleepModifier: 1 - isConsumable: true + #components: # DeltaV: This works regardless of origin body and needs rework, nor does it make any sense. + #- type: SurgeryDamageChangeEffect + # damage: + # types: + # Poison: -2147483648 # Literally the max 32 bit value, if your patient has gone higher than this, maybe it's time to restart the round. + # sleepModifier: 1 + # isConsumable: true - type: entity parent: SurgeryStepInsertOrgan From 7840ad75b7117d0974c613ab50b0dfea84826a3d Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Mon, 6 Jan 2025 02:59:38 +0000 Subject: [PATCH 39/40] spacing does 1/5 damage to limbs --- Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index 1f80a777b05..094ee5c9066 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -237,7 +237,7 @@ public override void Update(float frameTime) if (pressure <= Atmospherics.HazardLowPressure) { // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false, canSever: false); // Shitmed Change + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false, canSever: false, partMultiplier: 0.2f); // Shitmed Change if (!barotrauma.TakingDamage) { From 14c10a7a43bba6aa2fa98094a23d4d69797b1acb Mon Sep 17 00:00:00 2001 From: deltanedas <@deltanedas:kde.org> Date: Tue, 7 Jan 2025 16:57:01 +0000 Subject: [PATCH 40/40] nerf tending and ribcage ops --- .../_Shitmed/Entities/Surgery/surgery_steps.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml index fa5c46e7e1e..4b3c52dccfd 100644 --- a/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml +++ b/Resources/Prototypes/_Shitmed/Entities/Surgery/surgery_steps.yml @@ -101,7 +101,7 @@ - type: Retractor add: - type: RibcageOpen - duration: 2 + duration: 4 # DeltaV: was 2 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor @@ -156,7 +156,7 @@ - type: Retractor remove: - type: RibcageOpen - duration: 2 + duration: 4 # DeltaV: was 2 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/retractor.rsi state: retractor @@ -361,7 +361,7 @@ - type: SurgeryStep tool: - type: Tending - duration: 1 + duration: 3 # DeltaV: was 1 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat @@ -380,7 +380,7 @@ - type: SurgeryStep tool: - type: Tending - duration: 1 + duration: 3 # DeltaV: was 1 - type: Sprite sprite: _Shitmed/Objects/Specific/Medical/Surgery/hemostat.rsi state: hemostat