diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index 497af47ef97..3442a2d34d0 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); // CorvaxNext: surgery SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent((_, comp, args) => @@ -182,17 +181,6 @@ public void UpdateSlot(EntityUid owner, InventorySlotsComponent component, strin EntitySlotUpdate?.Invoke(newData); } - // start-_CorvaxNext: surgery - 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); - } - // end-_CorvaxNext: surgery - public bool TryAddSlotDef(EntityUid owner, InventorySlotsComponent component, SlotDefinition newSlotDef) { SlotData newSlotData = newSlotDef; //convert to slotData diff --git a/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs index f960c897294..9e5b71230ad 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 8898d3a4361..330c794321d 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml +++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml @@ -4,7 +4,7 @@ MinSize="64 64"> - + 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/Backmen/Mood/MoodSystem.cs b/Content.Server/Backmen/Mood/MoodSystem.cs index 41a9d60996f..ac02c04a940 100644 --- a/Content.Server/Backmen/Mood/MoodSystem.cs +++ b/Content.Server/Backmen/Mood/MoodSystem.cs @@ -17,7 +17,7 @@ using Timer = Robust.Shared.Timing.Timer; using Robust.Shared.Player; using Robust.Shared.Configuration; -using Content.Shared._CorvaxNext.CCVar; +using Content.Shared._CorvaxNext.NextVars; using Content.Shared.Examine; using Content.Shared.Humanoid; @@ -141,10 +141,10 @@ private void OnRefreshMoveSpeed(EntityUid uid, MoodComponent component, RefreshM var modifier = Math.Clamp( (component.CurrentMoodLevel >= component.MoodThresholds[MoodThreshold.Neutral]) - ? _config.GetCVar(CCVars.MoodIncreasesSpeed) + ? _config.GetCVar(NextVars.MoodIncreasesSpeed) ? MathF.Pow(1.003f, component.CurrentMoodLevel - component.MoodThresholds[MoodThreshold.Neutral]) : 1 - : _config.GetCVar(CCVars.MoodDecreasesSpeed) + : _config.GetCVar(NextVars.MoodDecreasesSpeed) ? 2 - component.MoodThresholds[MoodThreshold.Neutral] / component.CurrentMoodLevel : 1, component.MinimumSpeedModifier, @@ -165,7 +165,7 @@ private void OnTraitStartup(EntityUid uid, MoodModifyTraitComponent component, C private void OnMoodEffect(EntityUid uid, MoodComponent component, MoodEffectEvent args) { - if (!_config.GetCVar(CCVars.MoodEnabled) + if (!_config.GetCVar(NextVars.MoodEnabled) || !_prototypeManager.TryIndex(args.EffectId, out var prototype)) return; @@ -312,7 +312,7 @@ private void RefreshMood(EntityUid uid, MoodComponent component) private void OnInit(EntityUid uid, MoodComponent component, ComponentStartup args) { - if (_config.GetCVar(CCVars.MoodModifiesThresholds) + if (_config.GetCVar(NextVars.MoodModifiesThresholds) && TryComp(uid, out var mobThresholdsComponent) && _mobThreshold.TryGetThresholdForState(uid, MobState.Critical, out var critThreshold, mobThresholdsComponent)) component.CritThresholdBeforeModify = critThreshold.Value; @@ -322,7 +322,7 @@ private void OnInit(EntityUid uid, MoodComponent component, ComponentStartup arg private void SetMood(EntityUid uid, float amount, MoodComponent? component = null, bool force = false, bool refresh = false) { - if (!_config.GetCVar(CCVars.MoodEnabled) + if (!_config.GetCVar(NextVars.MoodEnabled) || !Resolve(uid, ref component) || component.CurrentMoodThreshold == MoodThreshold.Dead && !refresh) return; @@ -403,7 +403,7 @@ private void RefreshShaders(EntityUid uid, int modifier) private void SetCritThreshold(EntityUid uid, MoodComponent component, int modifier) { - if (!_config.GetCVar(CCVars.MoodModifiesThresholds) + if (!_config.GetCVar(NextVars.MoodModifiesThresholds) || !TryComp(uid, out var mobThresholds) || !_mobThreshold.TryGetThresholdForState(uid, MobState.Critical, out var key)) return; 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/_CorvaxNext/Surgery/SurgerySystem.cs b/Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs index 9c760623efb..f9d69b57b81 100644 --- a/Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs +++ b/Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs @@ -21,6 +21,7 @@ using Content.Shared._CorvaxNext.Surgery.Tools; using Content.Shared.Bed.Sleep; using Content.Shared.Medical.Surgery; +using Content.Shared.Verbs; namespace Content.Server._CorvaxNext.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. @@ -101,30 +102,42 @@ 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 - || !HasComp(args.Target) - || !TryComp(args.User, out var surgery) - || !surgery.CanOperate - || !IsLyingDown(args.Target.Value, args.User)) - { + if (!IsLyingDown(target, user)) return; - } - if (user == args.Target && !_config.GetCVar(Shared._CorvaxNext.NextVars.NextVars.CanOperateOnSelf)) + if (user == target && !_config.GetCVar(Shared._CorvaxNext.NextVars.NextVars.CanOperateOnSelf)) + { _popup.PopupEntity(Loc.GetString("surgery-error-self-surgery"), user, user); return; } - args.Handled = true; - _ui.OpenUi(args.Target.Value, SurgeryUIKey.Key, user); - //Logger.Debug("UI opened"); - 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.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index addf5e22a0e..ab1bec30212 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -12,7 +12,7 @@ namespace Content.Shared.Body.Part; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(SharedBodySystem))] +//[Access(typeof(SharedBodySystem))] public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent { // Need to set this on container changes as it may be several transform parents up the hierarchy. @@ -23,9 +23,6 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent public EntityUid? Body; // start-_CorvaxNext: surgery - [DataField, AutoNetworkedField] - public EntityUid? OriginalBody; - [DataField, AutoNetworkedField] public BodyPartSlot? ParentSlot; // end-_CorvaxNext: surgery @@ -43,6 +40,9 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent [DataField, AlwaysPushInheritance] public string ToolName { get; set; } = "A body part"; + [DataField, AlwaysPushInheritance] + public string SlotId { get; set; } = ""; + [DataField, AutoNetworkedField] public bool? Used { get; set; } = null; @@ -158,7 +158,7 @@ public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent public bool IsVital; [DataField, AutoNetworkedField] - public BodyPartSymmetry Symmetry = BodyPartSymmetry.None; + public BodyPartSymmetry Symmetry { get; set; } = BodyPartSymmetry.None; /// /// When attached, the part will ensure these components on the entity, and delete them on removal. diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 0005d3c88d6..138291eff13 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -15,6 +15,7 @@ using Content.Shared.Humanoid; using Content.Shared.Humanoid.Events; using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; using Content.Shared.Rejuvenate; using Content.Shared.Silicons.Borgs.Components; using Content.Shared.Standing; @@ -24,6 +25,7 @@ using Robust.Shared.Map; using Robust.Shared.Utility; using Robust.Shared.Timing; + namespace Content.Shared.Body.Systems; public partial class SharedBodySystem @@ -52,8 +54,10 @@ private void InitializeBody() SubscribeLocalEvent(OnBodyInit); SubscribeLocalEvent(OnBodyMapInit); SubscribeLocalEvent(OnBodyCanDrag); - SubscribeLocalEvent(OnStandAttempt); // CorvaxNext: surgery - SubscribeLocalEvent(OnProfileLoadFinished); // CorvaxNext: surgery + + SubscribeLocalEvent(OnStandAttempt); + SubscribeLocalEvent(OnProfileLoadFinished); + SubscribeLocalEvent(OnBeingEquippedAttempt); } private void OnBodyInserted(Entity ent, ref EntInsertedIntoContainerMessage args) @@ -127,7 +131,6 @@ private void MapInitBody(EntityUid bodyEntity, BodyPrototype prototype) var rootPartUid = SpawnInContainerOrDrop(protoRoot.Part, bodyEntity, BodyRootContainerId); var rootPart = Comp(rootPartUid); rootPart.Body = bodyEntity; - rootPart.OriginalBody = bodyEntity; Dirty(rootPartUid, rootPart); // Setup the rest of the body entities. SetupOrgans((rootPartUid, rootPart), protoRoot.Organs); @@ -189,7 +192,6 @@ private void MapInitParts(EntityUid rootPartId, BodyPartComponent rootPart, Body var childPartComponent = Comp(childPart); var partSlot = CreatePartSlot(parentEntity, connection, childPartComponent.PartType, parentPartComponent); childPartComponent.ParentSlot = partSlot; - childPartComponent.OriginalBody = rootPart.Body; Dirty(childPart, childPartComponent); var cont = Containers.GetContainer(parentEntity, GetPartSlotContainerId(connection)); @@ -397,8 +399,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)) { @@ -437,7 +438,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; @@ -455,5 +456,22 @@ private void OnProfileLoadFinished(EntityUid uid, BodyComponent component, Profi foreach (var part in GetBodyChildren(uid, component)) EnsureComp(part.Id); } - // end-_CorvaxNext: surgery + + + 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 61083811a69..890b83e5341 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -73,7 +73,9 @@ private void RemoveOrgan(Entity organEnt, EntityUid parentPartUi RaiseLocalEvent(organEnt, ref removedInBodyEv); } - if (TryComp(parentPartUid, out DamageableComponent? damageable) // CorvaxNext: surgery + + if (parentPartUid is { Valid: true } + && TryComp(parentPartUid, out DamageableComponent? damageable) && damageable.TotalDamage > 200) TrySetOrganUsed(organEnt, true, organEnt.Comp); diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index 9718b036341..94ad56b7368 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -30,12 +30,15 @@ private void InitializeParts() // TODO: This doesn't handle comp removal on child ents. // If you modify this also see the Body partial for root parts. - SubscribeLocalEvent(OnMapInit); // CorvaxNext: surgery - SubscribeLocalEvent(OnBodyPartRemove); // CorvaxNext: surgery + SubscribeLocalEvent(OnBodyPartInserted); SubscribeLocalEvent(OnBodyPartRemoved); - SubscribeLocalEvent(OnAmputateAttempt); // CorvaxNext: surgery - SubscribeLocalEvent(OnPartEnableChanged); // CorvaxNext: surgery + + // Shitmed Change Start + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnBodyPartRemove); + SubscribeLocalEvent(OnAmputateAttempt); + SubscribeLocalEvent(OnPartEnableChanged); } // start-_CorvaxNext: surgery @@ -86,11 +89,10 @@ private void OnPartEnableChanged(Entity partEnt, ref BodyPart } /// - /// 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 @@ -98,11 +100,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); } } @@ -143,7 +141,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(); @@ -171,14 +169,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) @@ -186,18 +187,33 @@ private void OnBodyPartRemoved(Entity ent, ref EntRemovedFrom // Body part removed from another body part. 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); // CorvaxNext: surgery - 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) @@ -272,8 +288,8 @@ protected virtual void RemovePart( Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false); Dirty(partEnt, partEnt.Comp); - // start-_CorvaxNext: surgery Change Start - partEnt.Comp.OriginalBody = partEnt.Comp.Body; + + // Shitmed Change Start if (partEnt.Comp.Body is { Valid: true } body) RaiseLocalEvent(partEnt, new BodyPartComponentsModifyEvent(body, false)); partEnt.Comp.ParentSlot = null; @@ -1021,12 +1037,48 @@ private bool TryGetPartSlotContainerName(BodyPartType partType, out HashSet 0; } - public string GetSlotFromBodyPart(BodyPartComponent part) + 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)) + return 0; + + int count = 0; + foreach (var part in GetBodyChildren(bodyId, body)) + { + if (part.Component.PartType == partType) + count++; + } + return count; + } + + 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; } // end-_CorvaxNext: surgery Change End @@ -1099,22 +1151,5 @@ public bool TryGetBodyPartAdjacentPartsComponents( return false; } - // start-_CorvaxNext: surgery - - 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; - } - // end-_CorvaxNext: surgery - #endregion } diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index f089dfaf238..d9c1125a1e9 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -41,7 +41,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 c92da9cee2f..525bc9d9337 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -342,4 +342,31 @@ public bool NextItem(out EntityUid item, [NotNullWhen(true)] out SlotDefinition? return false; } } + + // Shitmed Change Start + public void DropSlotContents(EntityUid uid, string slotName, InventoryComponent? inventory = null) + { + if (!Resolve(uid, ref inventory)) + return; + + foreach (var slot in inventory.Slots) + { + if (slot.Name != slotName) + continue; + + 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); + } + + break; + } + + Dirty(uid, inventory); + } + // Shitmed Change End } diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs index c668a6bf7a1..be30156d7aa 100644 --- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs +++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Backmen.Standing; +using Content.Shared._CorvaxNext.Standing; using Content.Shared.Inventory; using Content.Shared.Movement.Components; using Content.Shared.Standing; @@ -10,7 +10,7 @@ public sealed class MovementSpeedModifierSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; - // start-backmen: layingdown + // start-_CorvaxNext: layingdown private EntityQuery _layerQuery; private EntityQuery _standingStateQuery; @@ -21,7 +21,7 @@ public override void Initialize() _layerQuery = GetEntityQuery(); _standingStateQuery = GetEntityQuery(); } - // end-backmen: layingdows + // end-_CorvaxNext: layingdows public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierComponent? move = null) { @@ -34,7 +34,7 @@ public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierCo var ev = new RefreshMovementSpeedModifiersEvent(); RaiseLocalEvent(uid, ev); - // start-backmen: layingdown + // start-_CorvaxNext: layingdown var walkSpeedModifier = ev.WalkSpeedModifier; var sprintSpeedModifier = ev.SprintSpeedModifier; // cap moving speed while laying @@ -45,7 +45,7 @@ public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierCo walkSpeedModifier = Math.Min(walkSpeedModifier, layingDown.SpeedModify); sprintSpeedModifier = Math.Min(sprintSpeedModifier, layingDown.SpeedModify); } - // end-backmen: layingdows + // end-_CorvaxNext: layingdows if (MathHelper.CloseTo(walkSpeedModifier, move.WalkSpeedModifier) && MathHelper.CloseTo(sprintSpeedModifier, move.SprintSpeedModifier)) diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index 427beb55e0f..c6499cd4cbb 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -13,7 +13,7 @@ using Content.Shared._CorvaxNext.Mood; using Robust.Shared.Network; using Robust.Shared.Configuration; -using Content.Shared._CorvaxNext.CCVar; +using Content.Shared._CorvaxNext.NextVars; namespace Content.Shared.Nutrition.EntitySystems; @@ -64,7 +64,7 @@ private void OnShutdown(EntityUid uid, HungerComponent component, ComponentShutd private void OnRefreshMovespeed(EntityUid uid, HungerComponent component, RefreshMovementSpeedModifiersEvent args) { - if (_config.GetCVar(CCVars.MoodEnabled) + if (_config.GetCVar(NextVars.MoodEnabled) || component.CurrentThreshold > HungerThreshold.Starving || _jetpack.IsUserFlying(uid)) return; @@ -130,7 +130,7 @@ private void DoHungerThresholdEffects(EntityUid uid, HungerComponent? component if (GetMovementThreshold(component.CurrentThreshold) != GetMovementThreshold(component.LastThreshold)) { - if (!_config.GetCVar(CCVars.MoodEnabled)) + if (!_config.GetCVar(NextVars.MoodEnabled)) _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); else if (_net.IsServer) { diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 7178d2e6d0b..cdf20b43cc4 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -11,7 +11,7 @@ using Robust.Shared.Utility; using Content.Shared._CorvaxNext.Mood; using Robust.Shared.Configuration; -using Content.Shared._CorvaxNext.CCVar; +using Content.Shared._CorvaxNext.NextVars; using System.Diagnostics.CodeAnalysis; namespace Content.Shared.Nutrition.EntitySystems; @@ -67,7 +67,7 @@ private void OnMapInit(EntityUid uid, ThirstComponent component, MapInitEvent ar private void OnRefreshMovespeed(EntityUid uid, ThirstComponent component, RefreshMovementSpeedModifiersEvent args) { // TODO: This should really be taken care of somewhere else - if (_config.GetCVar(CCVars.MoodEnabled) + if (_config.GetCVar(NextVars.MoodEnabled) || _jetpack.IsUserFlying(uid)) return; @@ -152,7 +152,7 @@ public bool TryGetStatusIconPrototype(ThirstComponent component, [NotNullWhen(tr private void UpdateEffects(EntityUid uid, ThirstComponent component) { - if (!_config.GetCVar(CCVars.MoodEnabled) + if (!_config.GetCVar(NextVars.MoodEnabled) && IsMovementThreshold(component.LastThirstThreshold) != IsMovementThreshold(component.CurrentThirstThreshold) && TryComp(uid, out MovementSpeedModifierComponent? movementSlowdownComponent)) { diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs index 31165801f38..0b440db3a41 100644 --- a/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs +++ b/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs @@ -38,7 +38,4 @@ public sealed partial class BodyPartAppearanceComponent : Component /// [DataField, AutoNetworkedField] public Color? EyeColor { get; set; } - - [DataField, AutoNetworkedField] - public EntityUid? OriginalBody { get; set; } } diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs index 67674086ad2..19d13592f6a 100644 --- a/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs +++ b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs @@ -32,19 +32,20 @@ private void OnPartAppearanceStartup(EntityUid uid, BodyPartAppearanceComponent 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/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs index 5e02e4f4465..1cfe9e6b3a7 100644 --- a/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs +++ b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs @@ -19,6 +19,7 @@ using Content.Shared._CorvaxNext.Surgery.Steps.Parts; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; +using Content.Shared.Inventory; // ReSharper disable once CheckNamespace namespace Content.Shared.Body.Systems; @@ -181,23 +182,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 - && _prototypeManager.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 (_prototypeManager.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, @@ -300,7 +298,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/_CorvaxNext/Surgery/Body/Subsystems/GenerateChildPartSystem.cs b/Content.Shared/_CorvaxNext/Surgery/Body/Subsystems/GenerateChildPartSystem.cs index 7956db8e964..7e3cc55b23d 100644 --- a/Content.Shared/_CorvaxNext/Surgery/Body/Subsystems/GenerateChildPartSystem.cs +++ b/Content.Shared/_CorvaxNext/Surgery/Body/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/_CorvaxNext/Surgery/SanitizedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/SanitizedComponent.cs new file mode 100644 index 00000000000..8731afc7b9a --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SanitizedComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery; + +/// +/// 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/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs index 15002494246..f6929c116e1 100644 --- a/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs +++ b/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs @@ -15,15 +15,15 @@ using Content.Shared.Popups; using Robust.Shared.Prototypes; using System.Linq; +using Content.Shared._CorvaxNext.Surgery; +using Content.Shared._CorvaxNext.Mood; using Content.Shared._CorvaxNext.Surgery.Body.Events; using Content.Shared._CorvaxNext.Surgery.Body.Organs; using Content.Shared._CorvaxNext.Surgery.Effects.Step; using Content.Shared._CorvaxNext.Surgery.Steps; using Content.Shared._CorvaxNext.Surgery.Steps.Parts; using Content.Shared._CorvaxNext.Surgery.Tools; -using Content.Shared._CorvaxNext.Mood; using Content.Shared.Containers.ItemSlots; -using Content.Shared.Medical.Surgery; using AmputateAttemptEvent = Content.Shared.Body.Events.AmputateAttemptEvent; namespace Content.Shared._CorvaxNext.Surgery; @@ -126,12 +126,15 @@ private void OnToolStep(Entity ent, ref SurgeryStepEvent a if (!HasComp(args.Body)) RaiseLocalEvent(args.Body, new MoodEffectEvent("SurgeryPain")); - if (!_inventory.TryGetSlotEntity(args.User, "gloves", out var gloves) - || !_inventory.TryGetSlotEntity(args.User, "mask", out var mask)) + 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); + 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/Content.Shared/_CorvaxNext/Targeting/Events.cs b/Content.Shared/_CorvaxNext/Targeting/Events.cs index fb51962a260..01c08c12c71 100644 --- a/Content.Shared/_CorvaxNext/Targeting/Events.cs +++ b/Content.Shared/_CorvaxNext/Targeting/Events.cs @@ -25,13 +25,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/_Goobstation/research/technologies.ftl b/Resources/Locale/en-US/_Goobstation/research/technologies.ftl new file mode 100644 index 00000000000..22240155729 --- /dev/null +++ b/Resources/Locale/en-US/_Goobstation/research/technologies.ftl @@ -0,0 +1,2 @@ +research-technology-weapon-plasma-rifle = Experimental plasma rifle +research-technology-medical-defense = Medical Control Gear \ No newline at end of file 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/surgery-popup.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl new file mode 100644 index 00000000000..dd49176148b --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/surgery/surgery-popup.ftl @@ -0,0 +1,53 @@ +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}. +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/_Shitmed/surgery/surgery-tools.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-tools.ftl new file mode 100644 index 00000000000..c1d1f93524a --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/surgery/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/Locale/en-US/_Shitmed/surgery/surgery-ui.ftl b/Resources/Locale/en-US/_Shitmed/surgery/surgery-ui.ftl new file mode 100644 index 00000000000..415395f7815 --- /dev/null +++ b/Resources/Locale/en-US/_Shitmed/surgery/surgery-ui.ftl @@ -0,0 +1,14 @@ +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 +surgery-ui-window-surgeries = < Surgeries +surgery-ui-window-steps = < Steps +surgery-ui-window-steps-error-skills = You have no surgical skills. +surgery-ui-window-steps-error-table = You need an operating table for this. +surgery-ui-window-steps-error-armor = You need to remove their armor! +surgery-ui-window-steps-error-tools = Missing tools. +surgery-error-laying = They need to be laying down! +surgery-error-self-surgery = You can't perform surgery on yourself! +surgery-part-damage-evaded = {$user} narrowly evaded! 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/_corvaxnext/surgery/surgery-ui.ftl b/Resources/Locale/en-US/_corvaxnext/surgery/surgery-ui.ftl index f09c9dc102a..415395f7815 100644 --- a/Resources/Locale/en-US/_corvaxnext/surgery/surgery-ui.ftl +++ b/Resources/Locale/en-US/_corvaxnext/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/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index c70ca9090a4..0b0970ec08f 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 - -## _CorvaxNext Change -research-technology-advanced-treatment = Advanced Treatment -research-technology-high-end-surgery = High End Surgical Tools -research-technology-cybernetic-enhancements = Cybernetic Enhancements diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index a65622b6649..056a4390b2f 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -150,6 +150,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 3166ef0baba..59a1a9a2f00 100644 --- a/Resources/Prototypes/Body/Organs/human.yml +++ b/Resources/Prototypes/Body/Organs/human.yml @@ -254,15 +254,17 @@ name: kidneys description: "Filters toxins from the bloodstream." components: - - type: Sprite - layers: - - state: kidney-l - - state: kidney-r - - type: Item - size: Small - heldPrefix: kidneys - # The kidneys just remove anything that doesn't currently have any metabolisms, as a stopgap. - - type: Metabolizer - maxReagents: 5 - metabolizerTypes: [Human] - removeEmpty: true + - type: Organ # Shitmed + slotId: kidneys + - type: Sprite + layers: + - state: kidney-l + - state: kidney-r + - type: Item + size: Small + heldPrefix: kidneys + # The kidneys just remove anything that doesn't currently have any metabolisms, as a stopgap. + - type: Metabolizer + maxReagents: 5 + metabolizerTypes: [Human] + removeEmpty: true diff --git a/Resources/Prototypes/Body/Parts/animal.yml b/Resources/Prototypes/Body/Parts/animal.yml index c5ab0068241..734e7e24ad0 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/Body/Parts/silicon.yml b/Resources/Prototypes/Body/Parts/silicon.yml index 5047940353b..b8b0ffd3405 100644 --- a/Resources/Prototypes/Body/Parts/silicon.yml +++ b/Resources/Prototypes/Body/Parts/silicon.yml @@ -76,6 +76,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 @@ -94,6 +99,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 diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml index 3b914cf822e..17053006bbe 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 fafadc983fd..c0c14e91685 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 # start-_CorvaxNext: surgery - id: BoneGel diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml index 8f8a116a4e3..a4d30386121 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml @@ -75,6 +75,7 @@ - type: SurgeryTarget - type: TTS # Corvax-TTS voice: TrainingRobot + - type: Sanitized - type: entity id: BorgChassisService diff --git a/Resources/Prototypes/Entities/Objects/Misc/pen.yml b/Resources/Prototypes/Entities/Objects/Misc/pen.yml index 694d19980c2..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 # _CorvaxNext TODO: Uncomment this when surgeries arent tied to interaction events, but verbs. -# speed: 0.55 -# - type: SurgeryTool # _CorvaxNext -# startSound: -# path: /Audio/_CorvaxNext/Medical/Surgery/retractor1.ogg -# endSound: -# path: /Audio/_CorvaxNext/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/Entities/Objects/Weapons/Throwable/throwing_stars.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml index 3cffe6e6617..82c81e36222 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml @@ -10,10 +10,10 @@ - state: icon map: ["base"] - type: Appearance - - type: HolidayVisuals - holidays: - festive: - - FestiveSeason +# - type: HolidayVisuals +# holidays: +# festive: +# - FestiveSeason - type: GenericVisualizer visuals: enum.HolidayVisuals.Holiday: diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index 392246eeec2..08250290ec7 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -215,55 +215,3 @@ materials: Steel: 100 Plastic: 100 - -# _CorvaxNext: surgery Recipes - -- 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 diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index f5011d4d417..f6579096f6e 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -196,85 +196,7 @@ id: BorgModuleHarvesting result: BorgModuleHarvesting -# _CorvaxNext: surgery 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 + parent: BaseBorgModuleRecipe + id: BorgModuleClowning + result: BorgModuleClowning diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index 55993b26a6b..f6f303e5e3b 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -676,17 +676,3 @@ Plastic: 1000 Plasma: 500 Glass: 500 - -# _CorvaxNext: surgery 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 bb146b09a33..5d813c787ed 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -132,43 +132,6 @@ - PrisonerBodyBag # Corvax-Next-AdvancedBodyBags - RadiationBodyBag # Corvax-Next-AdvancedBodyBags -# _CorvaxNext: surgery Change Start -- type: technology - id: AdvancedTreatment - name: research-technology-advanced-treatment - icon: - sprite: _CorvaxNext/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: _CorvaxNext/Mobs/Species/IPC/organs.rsi - state: eyes - discipline: CivilianServices - tier: 2 - cost: 15000 - recipeUnlocks: - - JawsOfLifeLeftArm - - JawsOfLifeRightArm - - SpeedLeftLeg - - SpeedRightLeg - - BasicCyberneticEyes - - SecurityCyberneticEyes - - MedicalCyberneticEyes -# _CorvaxNext: surgery Change End - - type: technology id: AdvancedCleaning name: research-technology-advanced-cleaning diff --git a/Resources/Prototypes/_Backmen/Recipes/Lathes/robotics.yml b/Resources/Prototypes/_Backmen/Recipes/Lathes/robotics.yml new file mode 100644 index 00000000000..980b4438f7b --- /dev/null +++ b/Resources/Prototypes/_Backmen/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 diff --git a/Resources/Prototypes/_Backmen/Recipes/Lathes/security.yml b/Resources/Prototypes/_Backmen/Recipes/Lathes/security.yml new file mode 100644 index 00000000000..b6b39268adc --- /dev/null +++ b/Resources/Prototypes/_Backmen/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 diff --git a/Resources/Prototypes/_Backmen/Research/civilianservices.yml b/Resources/Prototypes/_Backmen/Research/civilianservices.yml new file mode 100644 index 00000000000..f520d4cd89e --- /dev/null +++ b/Resources/Prototypes/_Backmen/Research/civilianservices.yml @@ -0,0 +1,50 @@ +# 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 diff --git a/Resources/Prototypes/_CorvaxNext/Body/Prototypes/cybernetic.yml b/Resources/Prototypes/_CorvaxNext/Body/Prototypes/cybernetic.yml index 4b334cdb3b2..5a469088b25 100644 --- a/Resources/Prototypes/_CorvaxNext/Body/Prototypes/cybernetic.yml +++ b/Resources/Prototypes/_CorvaxNext/Body/Prototypes/cybernetic.yml @@ -154,6 +154,7 @@ - type: BodyPart onAdd: - type: NoSlip + - type: ProtectedFromStepTriggers - type: entity parent: RightLegCybernetic @@ -167,3 +168,4 @@ - type: BodyPart onAdd: - type: NoSlip + - type: ProtectedFromStepTriggers diff --git a/Resources/Prototypes/_CorvaxNext/Body/Prototypes/generic.yml b/Resources/Prototypes/_CorvaxNext/Body/Prototypes/generic.yml index f3acb4b1333..2fb9c958915 100644 --- a/Resources/Prototypes/_CorvaxNext/Body/Prototypes/generic.yml +++ b/Resources/Prototypes/_CorvaxNext/Body/Prototypes/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 diff --git a/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/surgery.yml b/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/surgery.yml index 3195e494ede..29549ed5051 100644 --- a/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/surgery.yml +++ b/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/surgery.yml @@ -1,11 +1,61 @@ - type: latheRecipe id: BoneGel result: BoneGel - completetime: 10 + 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 + - type: latheRecipe id: SynthHeart result: BioSynthHeart