From 40ad366636946ee8012a8475472be50a72e8827b Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Wed, 6 May 2020 17:45:45 -0500 Subject: [PATCH 01/15] Various hotfixes and touchups to the microwave. - Stop a debug assertion from TryGetComponent on a deleted entity. - Add a dark overlay for when microwave is busy to UI. --- .../Kitchen/MicrowaveBoundUserInterface.cs | 16 ++++--- .../Components/Kitchen/MicrowaveMenu.cs | 42 +++++++++++++++---- .../Kitchen/KitchenMicrowaveComponent.cs | 17 +++----- .../Kitchen/SharedMicrowaveComponent.cs | 6 ++- 4 files changed, 53 insertions(+), 28 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index e93d016806..f7f34674fc 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -27,7 +27,7 @@ namespace Content.Client.GameObjects.Components.Kitchen public MicrowaveBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner,uiKey) { - + } protected override void Open() @@ -39,9 +39,9 @@ namespace Content.Client.GameObjects.Components.Kitchen _menu.StartButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveStartCookMessage()); _menu.EjectButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); _menu.IngredientsList.OnItemSelected += args => - { + { SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(_solids[args.ItemIndex])); - + }; _menu.IngredientsListReagents.OnItemSelected += args => @@ -49,7 +49,7 @@ namespace Content.Client.GameObjects.Components.Kitchen SendMessage( new SharedMicrowaveComponent.MicrowaveVaporizeReagentIndexedMessage(_reagents[args.ItemIndex])); }; - + _menu.OnCookTimeSelected += args => { var actualButton = args.Button as Button; @@ -80,6 +80,7 @@ namespace Content.Client.GameObjects.Components.Kitchen return; } + _menu.ToggleBusyDisableOverlayPanel(cstate.IsMicrowaveBusy); RefreshContentsDisplay(cstate.ReagentsReagents, cstate.ContainedSolids); } @@ -101,9 +102,12 @@ namespace Content.Client.GameObjects.Components.Kitchen _menu.IngredientsList.Clear(); foreach (var entityID in solids) { - var entity = _entityManager.GetEntity(entityID); + if (!_entityManager.TryGetEntity(entityID, out var entity)) + { + return; + } - if (entity.TryGetComponent(out IconComponent icon)) + if (!entity.Deleted && entity.TryGetComponent(out IconComponent icon)) { var solidItem = _menu.IngredientsList.AddItem(entity.Name, icon.Icon.Default); diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index a2a9e02625..d2160d1c4d 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -26,6 +26,11 @@ namespace Content.Client.GameObjects.Components.Kitchen public ButtonGroup CookTimeButtonGroup { get; } private VBoxContainer CookTimeButtonVbox { get; } + private VBoxContainer ButtonGridContainer { get; } + + private PanelContainer DisableCookingPanelOverlay { get;} + + public ItemList IngredientsList { get;} public ItemList IngredientsListReagents { get; } @@ -35,6 +40,16 @@ namespace Content.Client.GameObjects.Components.Kitchen { Owner = owner; Title = Loc.GetString("Microwave"); + DisableCookingPanelOverlay = new PanelContainer + { + MouseFilter = MouseFilterMode.Stop, + PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.60f)}, + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.Fill, + + }; + + var hSplit = new HBoxContainer { SizeFlagsHorizontal = SizeFlags.Fill, @@ -58,14 +73,14 @@ namespace Content.Client.GameObjects.Components.Kitchen SizeFlagsStretchRatio = 2, CustomMinimumSize = (100,128) }; - + hSplit.AddChild(IngredientsListReagents); //Padding between the lists. hSplit.AddChild(new Control { CustomMinimumSize = (0,5), }); - + hSplit.AddChild(IngredientsList); var vSplit = new VBoxContainer @@ -76,7 +91,7 @@ namespace Content.Client.GameObjects.Components.Kitchen hSplit.AddChild(vSplit); - var buttonGridContainer = new VBoxContainer + ButtonGridContainer = new VBoxContainer { Align = BoxContainer.AlignMode.Center, SizeFlagsStretchRatio = 3 @@ -96,10 +111,10 @@ namespace Content.Client.GameObjects.Components.Kitchen TextAlign = Label.AlignMode.Center, }; - buttonGridContainer.AddChild(StartButton); - buttonGridContainer.AddChild(EjectButton); - vSplit.AddChild(buttonGridContainer); - + ButtonGridContainer.AddChild(StartButton); + ButtonGridContainer.AddChild(EjectButton); + vSplit.AddChild(ButtonGridContainer); + //Padding vSplit.AddChild(new Control { @@ -114,6 +129,7 @@ namespace Content.Client.GameObjects.Components.Kitchen Align = BoxContainer.AlignMode.Center, }; + var index = 0; for (var i = 0; i <= 12; i++) { @@ -134,7 +150,8 @@ namespace Content.Client.GameObjects.Components.Kitchen var cookTimeOneSecondButton = (Button)CookTimeButtonVbox.GetChild(0); cookTimeOneSecondButton.Pressed = true; - + + _cookTimeInfoLabel = new Label { Text = Loc.GetString($"COOK TIME: {VisualCookTime}"), @@ -158,7 +175,7 @@ namespace Content.Client.GameObjects.Components.Kitchen Children = { - + new PanelContainer { PanelOverride = new StyleBoxFlat(){BackgroundColor = Color.Gray.WithAlpha(0.2f)}, @@ -199,8 +216,15 @@ namespace Content.Client.GameObjects.Components.Kitchen vSplit.AddChild(TimerFacePlate); Contents.AddChild(hSplit); + Contents.AddChild(DisableCookingPanelOverlay); } + public void ToggleBusyDisableOverlayPanel(bool shouldDisable) + { + DisableCookingPanelOverlay.Visible = shouldDisable; + } + + } } diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index ac6ab14c65..748a9c9c37 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -19,11 +19,9 @@ using Robust.Server.GameObjects.Components.Container; using Content.Server.GameObjects.Components.Power; using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.GameObjects; -using Robust.Shared.Prototypes; using Robust.Shared.Localization; using Content.Server.Interfaces; using Robust.Shared.Audio; -using YamlDotNet.Serialization.NodeTypeResolvers; namespace Content.Server.GameObjects.Components.Kitchen { @@ -76,7 +74,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private BoundUserInterface _userInterface; private Container _storage; - + public override void ExposeData(ObjectSerializer serializer) { @@ -101,7 +99,6 @@ namespace Content.Server.GameObjects.Components.Kitchen _audioSystem = _entitySystemManager.GetEntitySystem(); _userInterface = Owner.GetComponent() .GetBoundUserInterface(MicrowaveUiKey.Key); - _userInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; } @@ -137,7 +134,6 @@ namespace Content.Server.GameObjects.Components.Kitchen UpdateUserInterface(); } break; - case MicrowaveVaporizeReagentIndexedMessage msg: if (HasContents) { @@ -146,7 +142,6 @@ namespace Content.Server.GameObjects.Components.Kitchen UpdateUserInterface(); } break; - case MicrowaveSelectCookTimeMessage msg: _currentCookTimerTime = msg.newCookTime; ClickSound(); @@ -173,7 +168,7 @@ namespace Content.Server.GameObjects.Components.Kitchen solidsVisualList.Add(item.Uid); } - _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents, solidsVisualList)); + _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents, solidsVisualList, _busy)); } void IActivate.Activate(ActivateEventArgs eventArgs) @@ -246,7 +241,7 @@ namespace Content.Server.GameObjects.Components.Kitchen { return; } - + _busy = true; // Convert storage into Dictionary of ingredients var solidsDict = new Dictionary(); @@ -298,9 +293,9 @@ namespace Content.Server.GameObjects.Components.Kitchen _audioSystem.Play(_cookingCompleteSound); SetAppearance(MicrowaveVisualState.Idle); _busy = false; + UpdateUserInterface(); }); UpdateUserInterface(); - return; } private void VaporizeReagents() @@ -396,12 +391,12 @@ namespace Content.Server.GameObjects.Components.Kitchen return true; } - + private void ClickSound() { _audioSystem.Play("/Audio/machines/machine_switch.ogg", AudioParams.Default.WithVolume(-2f)); - + } } diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index 31349c86b5..cc53465caa 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -41,7 +41,7 @@ namespace Content.Shared.Kitchen EntityID = entityID; } } - + [Serializable, NetSerializable] public class MicrowaveVaporizeReagentIndexedMessage : BoundUserInterfaceMessage { @@ -70,10 +70,12 @@ namespace Content.Shared.Kitchen { public readonly IReadOnlyList ReagentsReagents; public readonly List ContainedSolids; - public MicrowaveUpdateUserInterfaceState(IReadOnlyList reagents, List solids) + public bool IsMicrowaveBusy; + public MicrowaveUpdateUserInterfaceState(IReadOnlyList reagents, List solids, bool busyStatus) { ReagentsReagents = reagents; ContainedSolids = solids; + IsMicrowaveBusy = busyStatus; } } From 80796df5a314c2bb246bb879de2ec94081607346 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 10 May 2020 21:38:50 -0500 Subject: [PATCH 02/15] Add placing items into storage when Storage UI is clicked with item in hand --- .../Storage/ClientStorageComponent.cs | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs index 3084c2af1d..2577b11594 100644 --- a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs +++ b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs @@ -32,7 +32,7 @@ namespace Content.Client.GameObjects.Components.Storage base.OnAdd(); Window = new StorageWindow() - {StorageEntity = this}; + {StorageEntity = this};1 } public override void OnRemove() @@ -103,7 +103,6 @@ namespace Content.Client.GameObjects.Components.Storage private Control VSplitContainer; private VBoxContainer EntityList; private Label Information; - private Button AddItemButton; public ClientStorageComponent StorageEntity; protected override Vector2? CustomSize => (180, 320); @@ -113,7 +112,23 @@ namespace Content.Client.GameObjects.Components.Storage Title = "Storage Item"; RectClipContent = true; + var containerButton = new ContainerButton + { + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.Fill + }; + containerButton.OnPressed += args => + { + var controlledEntity = IoCManager.Resolve().LocalPlayer.ControlledEntity; + + if (controlledEntity.TryGetComponent(out IHandsComponent hands)) + { + StorageEntity.SendNetworkMessage(new InsertEntityMessage()); + } + }; + VSplitContainer = new VBoxContainer(); + containerButton.AddChild(VSplitContainer); Information = new Label { Text = "Items: 0 Volume: 0/0 Stuff", @@ -135,16 +150,8 @@ namespace Content.Client.GameObjects.Components.Storage listScrollContainer.AddChild(EntityList); VSplitContainer.AddChild(listScrollContainer); - AddItemButton = new Button - { - Text = "Add Item", - ToggleMode = false, - SizeFlagsHorizontal = SizeFlags.FillExpand - }; - AddItemButton.OnPressed += OnAddItemButtonPressed; - VSplitContainer.AddChild(AddItemButton); + Contents.AddChild(containerButton); - Contents.AddChild(VSplitContainer); } public override void Close() @@ -168,7 +175,8 @@ namespace Content.Client.GameObjects.Components.Storage var button = new EntityButton() { - EntityuID = entityuid.Key + EntityuID = entityuid.Key, + MouseFilter = MouseFilterMode.Stop, }; button.ActualButton.OnToggled += OnItemButtonToggled; //Name and Size labels set From 3193a0a7b2b32b8573f47647567e59dcd1572796 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 10 May 2020 21:41:03 -0500 Subject: [PATCH 03/15] get rid of that 1!!! --- .../GameObjects/Components/Storage/ClientStorageComponent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs index 2577b11594..57229e6a35 100644 --- a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs +++ b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs @@ -32,7 +32,7 @@ namespace Content.Client.GameObjects.Components.Storage base.OnAdd(); Window = new StorageWindow() - {StorageEntity = this};1 + {StorageEntity = this}; } public override void OnRemove() @@ -126,7 +126,7 @@ namespace Content.Client.GameObjects.Components.Storage StorageEntity.SendNetworkMessage(new InsertEntityMessage()); } }; - + VSplitContainer = new VBoxContainer(); containerButton.AddChild(VSplitContainer); Information = new Label From 7d58baa0e0d7916ff94adae7065c78edbb5efce2 Mon Sep 17 00:00:00 2001 From: Clyybber Date: Mon, 11 May 2020 13:54:31 +0200 Subject: [PATCH 04/15] Fix #673 --- .../Components/Weapon/Melee/MeleeWeaponComponent.cs | 11 +++++------ Resources/Prototypes/Entities/Items/Weapons/spear.yml | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs index bd199311ca..32c9f4c127 100644 --- a/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs @@ -28,12 +28,12 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee [Dependency] private readonly IPhysicsManager _physicsManager; #pragma warning restore 649 - private int _damage = 1; - private float _range = 1; - private float _arcWidth = 90; + private int _damage; + private float _range; + private float _arcWidth; private string _arc; private string _hitSound; - private float _cooldownTime = 1f; + private float _cooldownTime; [ViewVariables(VVAccess.ReadWrite)] public string Arc @@ -122,9 +122,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee private HashSet ArcRayCast(Vector2 position, Angle angle, IEntity ignore) { - // Maybe make this increment count depend on the width/length? - const int increments = 5; var widthRad = Angle.FromDegrees(ArcWidth); + var increments = 1 + (35 * (int) Math.Ceiling(widthRad / (2 * Math.PI))); var increment = widthRad / increments; var baseAngle = angle - widthRad / 2; diff --git a/Resources/Prototypes/Entities/Items/Weapons/spear.yml b/Resources/Prototypes/Entities/Items/Weapons/spear.yml index b03cf7bba0..231b526832 100644 --- a/Resources/Prototypes/Entities/Items/Weapons/spear.yml +++ b/Resources/Prototypes/Entities/Items/Weapons/spear.yml @@ -13,7 +13,7 @@ - type: MeleeWeapon range: 1.5 - arcwidth: 10 + arcwidth: 0 arc: spear - type: Item From f3f7422129da53a34400e60f37d2e6522c63569a Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 11 May 2020 16:59:02 -0500 Subject: [PATCH 05/15] , AudioParams.Default to beep sounds. should fix global but probably doesnt --- .../Components/Kitchen/KitchenMicrowaveComponent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 748a9c9c37..36a52aa7a5 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -274,7 +274,7 @@ namespace Content.Server.GameObjects.Components.Kitchen (_currentCookTimerTime == (uint)recipeToCook.CookTime) ? true : false; SetAppearance(MicrowaveVisualState.Cooking); - _audioSystem.Play(_startCookingSound); + _audioSystem.Play(_startCookingSound, AudioParams.Default); Timer.Spawn((int)(_currentCookTimerTime * _cookTimeMultiplier), () => { @@ -290,7 +290,7 @@ namespace Content.Server.GameObjects.Components.Kitchen var entityToSpawn = goodMeal ? recipeToCook.Result : _badRecipeName; _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); - _audioSystem.Play(_cookingCompleteSound); + _audioSystem.Play(_cookingCompleteSound, AudioParams.Default); SetAppearance(MicrowaveVisualState.Idle); _busy = false; UpdateUserInterface(); From c04b283dfc3ef7c10c4279bd68c9d879fce6d178 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 11 May 2020 18:38:49 -0500 Subject: [PATCH 06/15] uses a visual cue to show that something can be put into the box --- .../Storage/ClientStorageComponent.cs | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs index 57229e6a35..4ed7faf73c 100644 --- a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs +++ b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Content.Shared.GameObjects.Components.Storage; using Content.Client.Interfaces.GameObjects; +using Robust.Client.Graphics.Drawing; using Robust.Client.Interfaces.GameObjects.Components; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; @@ -105,6 +106,9 @@ namespace Content.Client.GameObjects.Components.Storage private Label Information; public ClientStorageComponent StorageEntity; + private StyleBoxFlat _HoveredBox = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.7f)}; + private StyleBoxFlat _unHoveredBox = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.0f)}; + protected override Vector2? CustomSize => (180, 320); public StorageWindow() @@ -115,8 +119,19 @@ namespace Content.Client.GameObjects.Components.Storage var containerButton = new ContainerButton { SizeFlagsHorizontal = SizeFlags.Fill, - SizeFlagsVertical = SizeFlags.Fill + SizeFlagsVertical = SizeFlags.Fill, + MouseFilter = MouseFilterMode.Pass, }; + + var innerContainerButton = new PanelContainer + { + PanelOverride = _unHoveredBox, + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.Fill, + }; + + + containerButton.AddChild(innerContainerButton); containerButton.OnPressed += args => { var controlledEntity = IoCManager.Resolve().LocalPlayer.ControlledEntity; @@ -127,7 +142,10 @@ namespace Content.Client.GameObjects.Components.Storage } }; - VSplitContainer = new VBoxContainer(); + VSplitContainer = new VBoxContainer() + { + MouseFilter = MouseFilterMode.Ignore, + }; containerButton.AddChild(VSplitContainer); Information = new Label { @@ -141,7 +159,7 @@ namespace Content.Client.GameObjects.Components.Storage SizeFlagsVertical = SizeFlags.FillExpand, SizeFlagsHorizontal = SizeFlags.FillExpand, HScrollEnabled = true, - VScrollEnabled = true + VScrollEnabled = true, }; EntityList = new VBoxContainer { @@ -152,6 +170,15 @@ namespace Content.Client.GameObjects.Components.Storage Contents.AddChild(containerButton); + listScrollContainer.OnMouseEntered += args => + { + innerContainerButton.PanelOverride = _HoveredBox; + }; + + listScrollContainer.OnMouseExited += args => + { + innerContainerButton.PanelOverride = _unHoveredBox; + }; } public override void Close() From bb39a1d871fe1cc6d7266c4d8e23ec5c1d4abe61 Mon Sep 17 00:00:00 2001 From: FL-OZ <58238103+FL-OZ@users.noreply.github.com> Date: Mon, 11 May 2020 19:36:05 -0500 Subject: [PATCH 07/15] made it less dark --- .../GameObjects/Components/Storage/ClientStorageComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs index 4ed7faf73c..30773715a9 100644 --- a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs +++ b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs @@ -106,7 +106,7 @@ namespace Content.Client.GameObjects.Components.Storage private Label Information; public ClientStorageComponent StorageEntity; - private StyleBoxFlat _HoveredBox = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.7f)}; + private StyleBoxFlat _HoveredBox = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.35f)}; private StyleBoxFlat _unHoveredBox = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.0f)}; protected override Vector2? CustomSize => (180, 320); From a0e839a6ad701a96d010f4d56a41aede1f19eb43 Mon Sep 17 00:00:00 2001 From: Swept Date: Tue, 12 May 2020 02:08:39 -0700 Subject: [PATCH 08/15] Fluff --- .../Entities/Buildings/instruments.yml | 12 +- .../Entities/Items/Clothing/belts.yml | 25 ++- .../Entities/Items/Clothing/ears.yml | 6 +- .../Entities/Items/Clothing/eyes.yml | 16 +- .../Entities/Items/Clothing/gloves.yml | 13 ++ .../Entities/Items/Clothing/masks.yml | 71 ++++++-- .../Entities/Items/Clothing/uniforms.yml | 17 ++ .../Prototypes/Entities/Items/Instruments.yml | 95 ++++++++--- .../belt_utility.rsi/equipped-BELT.png | Bin .../{ => Belts}/belt_utility.rsi/meta.json | 0 .../belt_utility.rsi/utilitybelt.png | Bin .../Belts/suspenders.rsi/equipped-BELT.png | Bin 0 -> 286 bytes .../Clothing/Belts/suspenders.rsi/icon.png | Bin 0 -> 433 bytes .../Clothing/Belts/suspenders.rsi/meta.json | 38 +++++ .../headset.rsi/equipped-EARS.png | Bin .../{ => Earpieces}/headset.rsi/headset.png | Bin .../{ => Earpieces}/headset.rsi/meta.json | 0 .../meson_scanners.rsi/equipped-EYES.png | Bin .../meson_scanners.rsi/meson.png | Bin .../meson_scanners.rsi/meta.json | 0 .../sunglasses.rsi/equipped-EYES.png | Bin .../{ => Glasses}/sunglasses.rsi/meta.json | 0 .../{ => Glasses}/sunglasses.rsi/sun.png | Bin .../sunglasses.rsi/sunglasses.png | Bin .../sunglasses_sec.rsi/equipped-EYES.png | Bin .../{ => Glasses}/sunglasses_sec.rsi/icon.png | Bin .../sunglasses_sec.rsi/inhand-left.png | Bin .../sunglasses_sec.rsi/inhand-right.png | Bin .../sunglasses_sec.rsi/meta.json | 0 .../Gloves/white.rsi/equipped-HAND.png | Bin 0 -> 313 bytes .../Clothing/Gloves/white.rsi/icon.png | Bin 0 -> 220 bytes .../Clothing/Gloves/white.rsi/inhand-left.png | Bin 0 -> 404 bytes .../Gloves/white.rsi/inhand-right.png | Bin 0 -> 404 bytes .../Clothing/Gloves/white.rsi/meta.json | 60 +++++++ .../mask_breath.rsi/equipped-MASK.png | Bin .../mask_breath.rsi/icon.png} | Bin .../Clothing/Masks/mask_breath.rsi/meta.json | 38 +++++ .../mask_clown.rsi/equipped-MASK.png | Bin .../{ => Masks}/mask_clown.rsi/icon.png | Bin .../mask_clown.rsi/inhand-left.png | Bin .../mask_clown.rsi/inhand-right.png | Bin .../{ => Masks}/mask_clown.rsi/meta.json | 0 .../mask_gas.rsi}/equipped-MASK.png | Bin .../mask_gas.rsi/icon.png} | Bin .../mask_gas.rsi}/inhand-left.png | Bin .../mask_gas.rsi}/inhand-right.png | Bin .../mask_gas.rsi}/meta.json | 2 +- .../Masks/mask_gasalt.rsi/equipped-MASK.png | Bin 0 -> 871 bytes .../Clothing/Masks/mask_gasalt.rsi/icon.png | Bin 0 -> 581 bytes .../Masks/mask_gasalt.rsi/inhand-left.png | Bin 0 -> 337 bytes .../Masks/mask_gasalt.rsi/inhand-right.png | Bin 0 -> 341 bytes .../Clothing/Masks/mask_gasalt.rsi/meta.json | 46 ++++++ .../Masks/mask_joy.rsi/equipped-MASK.png | Bin 0 -> 369 bytes .../Clothing/Masks/mask_joy.rsi/icon.png | Bin 0 -> 321 bytes .../Clothing/Masks/mask_joy.rsi/meta.json | 33 ++++ .../Masks/mask_mime.rsi/equipped-MASK.png | Bin 0 -> 319 bytes .../Clothing/Masks/mask_mime.rsi/icon.png | Bin 0 -> 226 bytes .../Clothing/Masks/mask_mime.rsi/meta.json | 33 ++++ .../Clothing/OuterClothing/bio.rsi/meta.json | 75 ++++++++- .../equipped-INNERCLOTHING.png | Bin 0 -> 480 bytes .../Uniforms/uniform_mime.rsi/icon.png | Bin 0 -> 206 bytes .../Uniforms/uniform_mime.rsi/inhand-left.png | Bin 0 -> 381 bytes .../uniform_mime.rsi/inhand-right.png | Bin 0 -> 380 bytes .../Uniforms/uniform_mime.rsi/meta.json | 74 +++++++++ .../Clothing/mask_breath.rsi/meta.json | 1 - .../accordion.png => accordion.rsi/icon.png} | Bin .../Instruments/accordion.rsi/inhand-left.png | Bin 0 -> 516 bytes .../accordion.rsi/inhand-right.png | Bin 0 -> 516 bytes .../Instruments/accordion.rsi/meta.json | 56 +++++++ .../eguitar.png => eguitar.rsi/icon.png} | Bin .../Instruments/eguitar.rsi/inhand-left.png | Bin 0 -> 560 bytes .../Instruments/eguitar.rsi/inhand-right.png | Bin 0 -> 581 bytes .../Objects/Instruments/eguitar.rsi/meta.json | 56 +++++++ .../icon.png} | Bin .../glockenspiel.rsi/inhand-left.png | Bin 0 -> 509 bytes .../glockenspiel.rsi/inhand-right.png | Bin 0 -> 509 bytes .../Instruments/glockenspiel.rsi/meta.json | 56 +++++++ .../guitar.png => guitar.rsi/icon.png} | Bin .../Instruments/guitar.rsi/inhand-left.png | Bin 0 -> 631 bytes .../Instruments/guitar.rsi/inhand-right.png | Bin 0 -> 1329 bytes .../Objects/Instruments/guitar.rsi/meta.json | 56 +++++++ .../icon.png} | Bin .../h_synthesizer.rsi/inhand-left.png | Bin 0 -> 434 bytes .../h_synthesizer.rsi/inhand-right.png | Bin 0 -> 441 bytes .../Instruments/h_synthesizer.rsi/meta.json | 56 +++++++ .../harmonica.png => harmonica.rsi/icon.png} | Bin .../Instruments/harmonica.rsi/inhand-left.png | Bin 0 -> 319 bytes .../harmonica.rsi/inhand-right.png | Bin 0 -> 437 bytes .../Instruments/harmonica.rsi/meta.json | 56 +++++++ .../Instruments/musician.rsi/meta.json | 1 - .../bike_horn.png | Bin .../drum.png | Bin .../drum_bongo.png | Bin .../drum_makeshift.png | Bin .../otherinstruments.rsi/meta.json | 155 ++++++++++++++++++ .../minimoog-broken.png | Bin .../minimoog.png | Bin .../minimoogbroken.png | Bin .../piano-broken.png | Bin .../piano.png | Bin .../pianobroken.png | Bin .../synthesizer.png | Bin .../trumpet.png | Bin .../xylophone-broken.png | Bin .../xylophone.png | Bin .../recorder.png => recorder.rsi/icon.png} | Bin .../Instruments/recorder.rsi/inhand-left.png | Bin 0 -> 455 bytes .../Instruments/recorder.rsi/inhand-right.png | Bin 0 -> 459 bytes .../Instruments/recorder.rsi/meta.json | 56 +++++++ .../saxophone.png => saxophone.rsi/icon.png} | Bin .../Instruments/saxophone.rsi/inhand-left.png | Bin 0 -> 456 bytes .../saxophone.rsi/inhand-right.png | Bin 0 -> 462 bytes .../Instruments/saxophone.rsi/meta.json | 56 +++++++ .../trombone.png => trombone.rsi/icon.png} | Bin .../Instruments/trombone.rsi/inhand-left.png | Bin 0 -> 482 bytes .../Instruments/trombone.rsi/inhand-right.png | Bin 0 -> 478 bytes .../Instruments/trombone.rsi/meta.json | 56 +++++++ .../violin.png => violin.rsi/icon.png} | Bin .../Instruments/violin.rsi/inhand-left.png | Bin 0 -> 366 bytes .../Instruments/violin.rsi/inhand-right.png | Bin 0 -> 365 bytes .../Objects/Instruments/violin.rsi/meta.json | 56 +++++++ SpaceStation14.sln | 34 ++-- 122 files changed, 1326 insertions(+), 79 deletions(-) rename Resources/Textures/Clothing/{ => Belts}/belt_utility.rsi/equipped-BELT.png (100%) rename Resources/Textures/Clothing/{ => Belts}/belt_utility.rsi/meta.json (100%) rename Resources/Textures/Clothing/{ => Belts}/belt_utility.rsi/utilitybelt.png (100%) create mode 100644 Resources/Textures/Clothing/Belts/suspenders.rsi/equipped-BELT.png create mode 100644 Resources/Textures/Clothing/Belts/suspenders.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Belts/suspenders.rsi/meta.json rename Resources/Textures/Clothing/{ => Earpieces}/headset.rsi/equipped-EARS.png (100%) rename Resources/Textures/Clothing/{ => Earpieces}/headset.rsi/headset.png (100%) rename Resources/Textures/Clothing/{ => Earpieces}/headset.rsi/meta.json (100%) rename Resources/Textures/Clothing/{ => Glasses}/meson_scanners.rsi/equipped-EYES.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/meson_scanners.rsi/meson.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/meson_scanners.rsi/meta.json (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses.rsi/equipped-EYES.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses.rsi/meta.json (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses.rsi/sun.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses.rsi/sunglasses.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses_sec.rsi/equipped-EYES.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses_sec.rsi/icon.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses_sec.rsi/inhand-left.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses_sec.rsi/inhand-right.png (100%) rename Resources/Textures/Clothing/{ => Glasses}/sunglasses_sec.rsi/meta.json (100%) create mode 100644 Resources/Textures/Clothing/Gloves/white.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Clothing/Gloves/white.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Gloves/white.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Gloves/white.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Gloves/white.rsi/meta.json rename Resources/Textures/Clothing/{ => Masks}/mask_breath.rsi/equipped-MASK.png (100%) rename Resources/Textures/Clothing/{mask_breath.rsi/breath.png => Masks/mask_breath.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Clothing/Masks/mask_breath.rsi/meta.json rename Resources/Textures/Clothing/{ => Masks}/mask_clown.rsi/equipped-MASK.png (100%) rename Resources/Textures/Clothing/{ => Masks}/mask_clown.rsi/icon.png (100%) rename Resources/Textures/Clothing/{ => Masks}/mask_clown.rsi/inhand-left.png (100%) rename Resources/Textures/Clothing/{ => Masks}/mask_clown.rsi/inhand-right.png (100%) rename Resources/Textures/Clothing/{ => Masks}/mask_clown.rsi/meta.json (100%) rename Resources/Textures/Clothing/{gas_mask.rsi => Masks/mask_gas.rsi}/equipped-MASK.png (100%) rename Resources/Textures/Clothing/{gas_mask.rsi/gas_mask.png => Masks/mask_gas.rsi/icon.png} (100%) rename Resources/Textures/Clothing/{gas_mask.rsi => Masks/mask_gas.rsi}/inhand-left.png (100%) rename Resources/Textures/Clothing/{gas_mask.rsi => Masks/mask_gas.rsi}/inhand-right.png (100%) rename Resources/Textures/Clothing/{gas_mask.rsi => Masks/mask_gas.rsi}/meta.json (96%) create mode 100644 Resources/Textures/Clothing/Masks/mask_gasalt.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Masks/mask_gasalt.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Masks/mask_gasalt.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Masks/mask_joy.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Masks/mask_joy.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Masks/mask_joy.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Masks/mask_mime.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Masks/mask_mime.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Masks/mask_mime.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/meta.json delete mode 100644 Resources/Textures/Clothing/mask_breath.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/accordion.png => accordion.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/accordion.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/accordion.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/accordion.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/eguitar.png => eguitar.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/eguitar.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/glockenspiel.png => glockenspiel.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/glockenspiel.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/guitar.png => guitar.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/guitar.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/guitar.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/guitar.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/h_synthesizer.png => h_synthesizer.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/h_synthesizer.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/harmonica.png => harmonica.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/harmonica.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Instruments/musician.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/bike_horn.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/drum.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/drum_bongo.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/drum_makeshift.png (100%) create mode 100644 Resources/Textures/Objects/Instruments/otherinstruments.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/minimoog-broken.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/minimoog.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/minimoogbroken.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/piano-broken.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/piano.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/pianobroken.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/synthesizer.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/trumpet.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/xylophone-broken.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi => otherinstruments.rsi}/xylophone.png (100%) rename Resources/Textures/Objects/Instruments/{musician.rsi/recorder.png => recorder.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/recorder.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/recorder.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/recorder.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/saxophone.png => saxophone.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/saxophone.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/trombone.png => trombone.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/trombone.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/trombone.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/trombone.rsi/meta.json rename Resources/Textures/Objects/Instruments/{musician.rsi/violin.png => violin.rsi/icon.png} (100%) create mode 100644 Resources/Textures/Objects/Instruments/violin.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Instruments/violin.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Instruments/violin.rsi/meta.json diff --git a/Resources/Prototypes/Entities/Buildings/instruments.yml b/Resources/Prototypes/Entities/Buildings/instruments.yml index 2c6edf0355..22826ba0fe 100644 --- a/Resources/Prototypes/Entities/Buildings/instruments.yml +++ b/Resources/Prototypes/Entities/Buildings/instruments.yml @@ -35,10 +35,10 @@ - type: Instrument program: 1 - type: Sprite - sprite: Objects/Instruments/musician.rsi + sprite: Objects/Instruments/otherinstruments.rsi state: piano - type: Icon - sprite: Objects/Instruments/musician.rsi + sprite: Objects/Instruments/otherinstruments.rsi state: piano - type: entity @@ -49,10 +49,10 @@ - type: Instrument program: 7 - type: Sprite - sprite: Objects/Instruments/musician.rsi + sprite: Objects/Instruments/otherinstruments.rsi state: minimoog - type: Icon - sprite: Objects/Instruments/musician.rsi + sprite: Objects/Instruments/otherinstruments.rsi state: minimoog - type: entity @@ -63,8 +63,8 @@ - type: Instrument program: 13 - type: Sprite - sprite: Objects/Instruments/musician.rsi + sprite: Objects/Instruments/otherinstruments.rsi state: xylophone - type: Icon - sprite: Objects/Instruments/musician.rsi + sprite: Objects/Instruments/otherinstruments.rsi state: xylophone diff --git a/Resources/Prototypes/Entities/Items/Clothing/belts.yml b/Resources/Prototypes/Entities/Items/Clothing/belts.yml index 2994275e00..0137dc803a 100644 --- a/Resources/Prototypes/Entities/Items/Clothing/belts.yml +++ b/Resources/Prototypes/Entities/Items/Clothing/belts.yml @@ -6,7 +6,6 @@ - type: Clothing Slots: [belt] - - type: entity parent: BeltBase id: UtilityBeltClothing @@ -14,15 +13,15 @@ description: Belt for holding all your usual tools components: - type: Sprite - sprite: Clothing/belt_utility.rsi + sprite: Clothing/Belts/belt_utility.rsi state: utilitybelt - type: Icon - sprite: Clothing/belt_utility.rsi + sprite: Clothing/Belts/belt_utility.rsi state: utilitybelt - type: Clothing Size: 50 QuickEquip: false - sprite: Clothing/belt_utility.rsi + sprite: Clothing/Belts/belt_utility.rsi - type: Storage Capacity: 40 # Full tool loadout is 35, plus an extra @@ -31,4 +30,20 @@ parent: UtilityBeltClothing components: - type: UtilityBeltClothingFill - \ No newline at end of file + +- type: entity + parent: BeltBase + id: SuspendersClothing + name: Suspenders + description: For holding your pants up. + components: + - type: Sprite + sprite: Clothing/Belts/suspenders.rsi + state: icon + - type: Icon + sprite: Clothing/Belts/suspenders.rsi + state: icon + - type: Clothing + Size: 50 + QuickEquip: false + sprite: Clothing/Belts/suspenders.rsi diff --git a/Resources/Prototypes/Entities/Items/Clothing/ears.yml b/Resources/Prototypes/Entities/Items/Clothing/ears.yml index 18500c6fb0..79bcf9e2d1 100644 --- a/Resources/Prototypes/Entities/Items/Clothing/ears.yml +++ b/Resources/Prototypes/Entities/Items/Clothing/ears.yml @@ -5,12 +5,12 @@ description: The radio to keep up to date in real time with fun onboard station activities components: - type: Sprite - sprite: Clothing/headset.rsi + sprite: Clothing/Earpieces/headset.rsi state: headset - type: Icon - sprite: Clothing/headset.rsi + sprite: Clothing/Earpieces/headset.rsi state: headset - type: Clothing Slots: - ears - sprite: Clothing/headset.rsi + sprite: Clothing/Earpieces/headset.rsi diff --git a/Resources/Prototypes/Entities/Items/Clothing/eyes.yml b/Resources/Prototypes/Entities/Items/Clothing/eyes.yml index e9974afbf0..d18d06a3fa 100644 --- a/Resources/Prototypes/Entities/Items/Clothing/eyes.yml +++ b/Resources/Prototypes/Entities/Items/Clothing/eyes.yml @@ -17,10 +17,10 @@ sprite: Clothing/meson_scanners.rsi state: meson - type: Icon - sprite: Clothing/meson_scanners.rsi + sprite: Clothing/Glasses/meson_scanners.rsi state: meson - type: Clothing - sprite: Clothing/meson_scanners.rsi + sprite: Clothing/Glasses/meson_scanners.rsi - type: entity @@ -30,13 +30,13 @@ description: Useful both for security and cargonia components: - type: Sprite - sprite: Clothing/sunglasses.rsi + sprite: Clothing/Glasses/sunglasses.rsi state: sunglasses - type: Icon - sprite: Clothing/sunglasses.rsi + sprite: Clothing/Glasses/sunglasses.rsi state: sunglasses - type: Clothing - sprite: Clothing/sunglasses.rsi + sprite: Clothing/Glasses/sunglasses.rsi - type: entity parent: GlassesBase @@ -45,10 +45,10 @@ description: Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes. Often worn by budget security officers. components: - type: Sprite - sprite: Clothing/sunglasses_sec.rsi + sprite: Clothing/Glasses/sunglasses_sec.rsi state: icon - type: Icon - sprite: Clothing/sunglasses_sec.rsi + sprite: Clothing/Glasses/sunglasses_sec.rsi state: icon - type: Clothing - sprite: Clothing/sunglasses_sec.rsi \ No newline at end of file + sprite: Clothing/Glasses/sunglasses_sec.rsi diff --git a/Resources/Prototypes/Entities/Items/Clothing/gloves.yml b/Resources/Prototypes/Entities/Items/Clothing/gloves.yml index 2a6001bca3..d05475b187 100644 --- a/Resources/Prototypes/Entities/Items/Clothing/gloves.yml +++ b/Resources/Prototypes/Entities/Items/Clothing/gloves.yml @@ -766,6 +766,19 @@ - type: Clothing sprite: Clothing/Gloves/s_ninjan.rsi +- type: entity + parent: GlovesBase + id: GlovesWhite + name: White Gloves + description: + components: + - type: Sprite + sprite: Clothing/Gloves/white.rsi + - type: Icon + sprite: Clothing/Gloves/white.rsi + - type: Clothing + sprite: Clothing/Gloves/white.rsi + - type: entity parent: GlovesBase id: GlovesYellow diff --git a/Resources/Prototypes/Entities/Items/Clothing/masks.yml b/Resources/Prototypes/Entities/Items/Clothing/masks.yml index 392d4aa19f..599b6451ca 100644 --- a/Resources/Prototypes/Entities/Items/Clothing/masks.yml +++ b/Resources/Prototypes/Entities/Items/Clothing/masks.yml @@ -6,6 +6,20 @@ - type: Clothing Slots: [mask] +- type: entity + parent: MasksBase + id: OldGasMaskClothing + name: Old Gas Mask + description: An old, dusty mask. Yet still dutifully functional. + components: + - type: Sprite + sprite: Clothing/Masks/mask_gasalt.rsi + state: icon + - type: Icon + sprite: Clothing/Masks/mask_gasalt.rsi + state: icon + - type: Clothing + sprite: Clothing/Masks/mask_gasalt.rsi - type: entity parent: MasksBase @@ -14,14 +28,13 @@ description: Regulations require these to be stocked after the fourth coolant leak components: - type: Sprite - sprite: Clothing/gas_mask.rsi - state: gas_mask + sprite: Clothing/Masks/mask_gas.rsi + state: icon - type: Icon - sprite: Clothing/gas_mask.rsi - state: gas_mask + sprite: Clothing/Masks/mask_gas.rsi + state: icon - type: Clothing - sprite: Clothing/gas_mask.rsi - + sprite: Clothing/Masks/mask_gas.rsi - type: entity parent: MasksBase @@ -30,13 +43,13 @@ description: Might as well keep this on 24/7 components: - type: Sprite - sprite: Clothing/mask_breath.rsi - state: breath + sprite: Clothing/Masks/mask_breath.rsi + state: icon - type: Icon - sprite: Clothing/mask_breath.rsi - state: breath + sprite: Clothing/Masks/mask_breath.rsi + state: icon - type: Clothing - sprite: Clothing/mask_breath.rsi + sprite: Clothing/Masks/mask_breath.rsi - type: entity parent: MasksBase @@ -45,10 +58,40 @@ description: A true prankster's facial attire. A clown is incomplete without his wig and mask. components: - type: Sprite - sprite: Clothing/mask_clown.rsi + sprite: Clothing/Masks/mask_clown.rsi state: icon - type: Icon - sprite: Clothing/mask_clown.rsi + sprite: Clothing/Masks/mask_clown.rsi state: icon - type: Clothing - sprite: Clothing/mask_clown.rsi + sprite: Clothing/Masks/mask_clown.rsi + +- type: entity + parent: MasksBase + id: MaskJoy + name: Joy Mask + description: + components: + - type: Sprite + sprite: Clothing/Masks/mask_joy.rsi + state: icon + - type: Icon + sprite: Clothing/Masks/mask_joy.rsi + state: icon + - type: Clothing + sprite: Clothing/Masks/mask_joy.rsi + +- type: entity + parent: MasksBase + id: MaskMime + name: Mime Mask + description: + components: + - type: Sprite + sprite: Clothing/Masks/mask_mime.rsi + state: icon + - type: Icon + sprite: Clothing/Masks/mask_mime.rsi + state: icon + - type: Clothing + sprite: Clothing/Masks/mask_mime.rsi diff --git a/Resources/Prototypes/Entities/Items/Clothing/uniforms.yml b/Resources/Prototypes/Entities/Items/Clothing/uniforms.yml index 4624d07f09..612e55825c 100644 --- a/Resources/Prototypes/Entities/Items/Clothing/uniforms.yml +++ b/Resources/Prototypes/Entities/Items/Clothing/uniforms.yml @@ -245,6 +245,23 @@ - type: Clothing sprite: Clothing/Uniforms/uniform_rd.rsi +- type: entity + parent: UniformBase + id: UniformMime + name: Mime's Clothes + description: ... + components: + - type: Sprite + sprite: Clothing/Uniforms/uniform_mime.rsi + state: icon + + - type: Icon + sprite: Clothing/Uniforms/uniform_mime.rsi + state: icon + + - type: Clothing + sprite: Clothing/Uniforms/uniform_mime.rsi + - type: entity parent: UniformBase id: UniformHoS diff --git a/Resources/Prototypes/Entities/Items/Instruments.yml b/Resources/Prototypes/Entities/Items/Instruments.yml index 08db84188f..24b8e5565e 100644 --- a/Resources/Prototypes/Entities/Items/Instruments.yml +++ b/Resources/Prototypes/Entities/Items/Instruments.yml @@ -19,9 +19,15 @@ - type: Instrument program: 2 - type: Sprite - texture: Objects/Instruments/musician.rsi/h_synthesizer.png + sprite: Objects/Instruments/h_synthesizer.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/h_synthesizer.png + sprite: Objects/Instruments/h_synthesizer.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/h_synthesizer.rsi + - type: entity name: Acoustic Guitar @@ -31,9 +37,14 @@ - type: Instrument program: 25 - type: Sprite - texture: Objects/Instruments/musician.rsi/guitar.png + sprite: Objects/Instruments/guitar.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/guitar.png + sprite: Objects/Instruments/guitar.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/guitar.rsi - type: entity name: Violin @@ -43,9 +54,14 @@ - type: Instrument program: 40 - type: Sprite - texture: Objects/Instruments/musician.rsi/violin.png + sprite: Objects/Instruments/violin.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/violin.png + sprite: Objects/Instruments/violin.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/violin.rsi - type: entity name: Trumpet @@ -55,9 +71,9 @@ - type: Instrument program: 56 - type: Sprite - texture: Objects/Instruments/musician.rsi/trumpet.png + texture: Objects/Instruments/otherinstruments.rsi/trumpet.png - type: Icon - texture: Objects/Instruments/musician.rsi/trumpet.png + texture: Objects/Instruments/otherinstruments.rsi/trumpet.png - type: entity name: Electric Guitar @@ -67,9 +83,14 @@ - type: Instrument program: 27 - type: Sprite - texture: Objects/Instruments/musician.rsi/eguitar.png + sprite: Objects/Instruments/eguitar.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/eguitar.png + sprite: Objects/Instruments/eguitar.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/eguitar.rsi - type: entity name: Accordion @@ -79,9 +100,14 @@ - type: Instrument program: 21 - type: Sprite - texture: Objects/Instruments/musician.rsi/accordion.png + sprite: Objects/Instruments/accordion.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/accordion.png + sprite: Objects/Instruments/accordion.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/accordion.rsi - type: entity name: Harmonica @@ -91,9 +117,14 @@ - type: Instrument program: 22 - type: Sprite - texture: Objects/Instruments/musician.rsi/harmonica.png + sprite: Objects/Instruments/harmonica.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/harmonica.png + sprite: Objects/Instruments/harmonica.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/harmonica.rsi - type: entity name: Recorder @@ -103,9 +134,14 @@ - type: Instrument program: 74 - type: Sprite - texture: Objects/Instruments/musician.rsi/recorder.png + sprite: Objects/Instruments/recorder.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/recorder.png + sprite: Objects/Instruments/recorder.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/recorder.rsi - type: entity name: Trombone @@ -115,9 +151,14 @@ - type: Instrument program: 57 - type: Sprite - texture: Objects/Instruments/musician.rsi/trombone.png + sprite: Objects/Instruments/trombone.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/trombone.png + sprite: Objects/Instruments/trombone.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/trombone.rsi - type: entity name: Saxophone @@ -127,9 +168,14 @@ - type: Instrument program: 67 - type: Sprite - texture: Objects/Instruments/musician.rsi/saxophone.png + sprite: Objects/Instruments/saxophone.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/saxophone.png + sprite: Objects/Instruments/saxophone.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/saxophone.rsi - type: entity name: Glockenspiel @@ -139,6 +185,11 @@ - type: Instrument program: 9 - type: Sprite - texture: Objects/Instruments/musician.rsi/glockenspiel.png + sprite: Objects/Instruments/glockenspiel.rsi + state: icon - type: Icon - texture: Objects/Instruments/musician.rsi/glockenspiel.png + sprite: Objects/Instruments/glockenspiel.rsi + state: icon + - type: Item + Size: 24 + sprite: Objects/Instruments/glockenspiel.rsi diff --git a/Resources/Textures/Clothing/belt_utility.rsi/equipped-BELT.png b/Resources/Textures/Clothing/Belts/belt_utility.rsi/equipped-BELT.png similarity index 100% rename from Resources/Textures/Clothing/belt_utility.rsi/equipped-BELT.png rename to Resources/Textures/Clothing/Belts/belt_utility.rsi/equipped-BELT.png diff --git a/Resources/Textures/Clothing/belt_utility.rsi/meta.json b/Resources/Textures/Clothing/Belts/belt_utility.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/belt_utility.rsi/meta.json rename to Resources/Textures/Clothing/Belts/belt_utility.rsi/meta.json diff --git a/Resources/Textures/Clothing/belt_utility.rsi/utilitybelt.png b/Resources/Textures/Clothing/Belts/belt_utility.rsi/utilitybelt.png similarity index 100% rename from Resources/Textures/Clothing/belt_utility.rsi/utilitybelt.png rename to Resources/Textures/Clothing/Belts/belt_utility.rsi/utilitybelt.png diff --git a/Resources/Textures/Clothing/Belts/suspenders.rsi/equipped-BELT.png b/Resources/Textures/Clothing/Belts/suspenders.rsi/equipped-BELT.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bdc14b32363902d612a2c6346cb81c5f67117c GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-t_KbrXkcJyXlO8JVA!du zQv(!dED7=pW^j0RBMr#Os|txIaY-#sF3Kz@$;{7VV5pcA99B?N`u$6A!N;#pw7hk- z&Yd|Qydl)!qVa=AI_G^fPcjts^zN`Q4l=%M?4>a0(WE1jLKK2m?%1+J!Bn4hg?DGS zvFhd(5=$m`8?V(cG#5Q$_9Q5*;A=7CY+i<^Gi9QZS}di2HoJMcIEGmCCMQUE9cX0r z+Psi^!vanY4gsNrLI>dlx9zOXtbWdt&dz}^0u4MEbPh>GT*%nLqwI5_v5RSj0*h1U eqq0{QSQuEd*wt#egcN}$GI+ZBxvX$U4y((=)z00000NkvXXu0mjfcE`U5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Belts/suspenders.rsi/meta.json b/Resources/Textures/Clothing/Belts/suspenders.rsi/meta.json new file mode 100644 index 0000000000..5618dc6a77 --- /dev/null +++ b/Resources/Textures/Clothing/Belts/suspenders.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation", + "states": [ + { + "name": "equipped-BELT", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Clothing/headset.rsi/equipped-EARS.png b/Resources/Textures/Clothing/Earpieces/headset.rsi/equipped-EARS.png similarity index 100% rename from Resources/Textures/Clothing/headset.rsi/equipped-EARS.png rename to Resources/Textures/Clothing/Earpieces/headset.rsi/equipped-EARS.png diff --git a/Resources/Textures/Clothing/headset.rsi/headset.png b/Resources/Textures/Clothing/Earpieces/headset.rsi/headset.png similarity index 100% rename from Resources/Textures/Clothing/headset.rsi/headset.png rename to Resources/Textures/Clothing/Earpieces/headset.rsi/headset.png diff --git a/Resources/Textures/Clothing/headset.rsi/meta.json b/Resources/Textures/Clothing/Earpieces/headset.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/headset.rsi/meta.json rename to Resources/Textures/Clothing/Earpieces/headset.rsi/meta.json diff --git a/Resources/Textures/Clothing/meson_scanners.rsi/equipped-EYES.png b/Resources/Textures/Clothing/Glasses/meson_scanners.rsi/equipped-EYES.png similarity index 100% rename from Resources/Textures/Clothing/meson_scanners.rsi/equipped-EYES.png rename to Resources/Textures/Clothing/Glasses/meson_scanners.rsi/equipped-EYES.png diff --git a/Resources/Textures/Clothing/meson_scanners.rsi/meson.png b/Resources/Textures/Clothing/Glasses/meson_scanners.rsi/meson.png similarity index 100% rename from Resources/Textures/Clothing/meson_scanners.rsi/meson.png rename to Resources/Textures/Clothing/Glasses/meson_scanners.rsi/meson.png diff --git a/Resources/Textures/Clothing/meson_scanners.rsi/meta.json b/Resources/Textures/Clothing/Glasses/meson_scanners.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/meson_scanners.rsi/meta.json rename to Resources/Textures/Clothing/Glasses/meson_scanners.rsi/meta.json diff --git a/Resources/Textures/Clothing/sunglasses.rsi/equipped-EYES.png b/Resources/Textures/Clothing/Glasses/sunglasses.rsi/equipped-EYES.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses.rsi/equipped-EYES.png rename to Resources/Textures/Clothing/Glasses/sunglasses.rsi/equipped-EYES.png diff --git a/Resources/Textures/Clothing/sunglasses.rsi/meta.json b/Resources/Textures/Clothing/Glasses/sunglasses.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/sunglasses.rsi/meta.json rename to Resources/Textures/Clothing/Glasses/sunglasses.rsi/meta.json diff --git a/Resources/Textures/Clothing/sunglasses.rsi/sun.png b/Resources/Textures/Clothing/Glasses/sunglasses.rsi/sun.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses.rsi/sun.png rename to Resources/Textures/Clothing/Glasses/sunglasses.rsi/sun.png diff --git a/Resources/Textures/Clothing/sunglasses.rsi/sunglasses.png b/Resources/Textures/Clothing/Glasses/sunglasses.rsi/sunglasses.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses.rsi/sunglasses.png rename to Resources/Textures/Clothing/Glasses/sunglasses.rsi/sunglasses.png diff --git a/Resources/Textures/Clothing/sunglasses_sec.rsi/equipped-EYES.png b/Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/equipped-EYES.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses_sec.rsi/equipped-EYES.png rename to Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/equipped-EYES.png diff --git a/Resources/Textures/Clothing/sunglasses_sec.rsi/icon.png b/Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses_sec.rsi/icon.png rename to Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/icon.png diff --git a/Resources/Textures/Clothing/sunglasses_sec.rsi/inhand-left.png b/Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses_sec.rsi/inhand-left.png rename to Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/inhand-left.png diff --git a/Resources/Textures/Clothing/sunglasses_sec.rsi/inhand-right.png b/Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Clothing/sunglasses_sec.rsi/inhand-right.png rename to Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/inhand-right.png diff --git a/Resources/Textures/Clothing/sunglasses_sec.rsi/meta.json b/Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/sunglasses_sec.rsi/meta.json rename to Resources/Textures/Clothing/Glasses/sunglasses_sec.rsi/meta.json diff --git a/Resources/Textures/Clothing/Gloves/white.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Gloves/white.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..776e6a1ff992f188d4ce14da1168652609c779ed GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(iS0KH0%a;HD|DQNkb?a6|S*#yWg0UpXFPOpM*^M+HC#xzXqQoV&IJqdZpd>RtkAb0LPH8W4$S;_|;n|HeAg9{X#W6%<;@SR2-opkQEN9so)DQS1?Bfo(S-+ei@b(H} z7RA?=w%@9Ij!*xPt01}M4O_`Zr6^WZ|P|LYp%11ul+R;8Yuz$ED^9r1If&2KKHgHz@nHotNI{JcnY`yWDK3*J86 Q0dxj~r>mdKI;Vst095%^!~g&Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Gloves/white.rsi/inhand-left.png b/Resources/Textures/Clothing/Gloves/white.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..49e6bc6907229a5d68898eecd2a1f2d19fde485d GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV2t*3aSW-L^LCbPUW)t@F zm|qNArpUA&E)wyI;&b4Xz39A#C2-Ttt;c5;ezN0i+`xX%=6`@epMVpGVhe=$w0?)D z%I)ue4}aUWZhPjeMfXLe@0Z@~uf3P-YP%?N7Vp`|7WWEbL#KYemw$TGj&vc<-g?$R zW`iKb7H=g1{(@tIPB+>Te;9RM`5|#{iQJWKZ(aYCuX(-e`_#UE*CPxZvz}Lqm$LId>%o zAO5IZ%j7@L5-LHV5&EV)S)K; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Gloves/white.rsi/inhand-right.png b/Resources/Textures/Clothing/Gloves/white.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..19fcfc54056e423c3651e83ce571d716d785bd84 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV2t*3aSW-L^LCbDUW7oK#*{Qo!}#1k^|cPi()Q2q(UfrJP;3!!f)JJ3Mn2ne zZ=bfDp1PCg@PwsW&vfc9n>>4*;Sd_i-B)`*-9o?XP(=3h%vnBMO7EWB=WNh?e&?N= z1W&<{^OoC7VwVRU(*9XoA9Vd|-UrFgHtTEur+IzcGpk;-p{-EndbeVPQO1A1TM5x+ zr{Zl+&i~Dp{dSj2fv~+sP27f@g52tPA#YjzKRw^4oU@SGjBm5<)DQe;wyk_{=ljJ& zlm7&+Klq<3uK8#5IhzJ1kraVeGKjjzYP0qU-+Q{j?tyyHdU=kWstR9!H7YNXZ@luF z{alC8gsQ&>L<5mdKI;Vst0P!=R Ay8r+H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Gloves/white.rsi/meta.json b/Resources/Textures/Clothing/Gloves/white.rsi/meta.json new file mode 100644 index 0000000000..6d12c5653a --- /dev/null +++ b/Resources/Textures/Clothing/Gloves/white.rsi/meta.json @@ -0,0 +1,60 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/cb5bda251807e38fe5eae6b1def12f0c243b4d0a/icons/inventory/hands/mob.dmi", + "states": [ + { + "name": "equipped-HAND", + "directions": 4 + }, + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Clothing/mask_breath.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Masks/mask_breath.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/mask_breath.rsi/equipped-MASK.png rename to Resources/Textures/Clothing/Masks/mask_breath.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/mask_breath.rsi/breath.png b/Resources/Textures/Clothing/Masks/mask_breath.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/mask_breath.rsi/breath.png rename to Resources/Textures/Clothing/Masks/mask_breath.rsi/icon.png diff --git a/Resources/Textures/Clothing/Masks/mask_breath.rsi/meta.json b/Resources/Textures/Clothing/Masks/mask_breath.rsi/meta.json new file mode 100644 index 0000000000..06a2e40339 --- /dev/null +++ b/Resources/Textures/Clothing/Masks/mask_breath.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "equipped-MASK", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Clothing/mask_clown.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Masks/mask_clown.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/mask_clown.rsi/equipped-MASK.png rename to Resources/Textures/Clothing/Masks/mask_clown.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/mask_clown.rsi/icon.png b/Resources/Textures/Clothing/Masks/mask_clown.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/mask_clown.rsi/icon.png rename to Resources/Textures/Clothing/Masks/mask_clown.rsi/icon.png diff --git a/Resources/Textures/Clothing/mask_clown.rsi/inhand-left.png b/Resources/Textures/Clothing/Masks/mask_clown.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Clothing/mask_clown.rsi/inhand-left.png rename to Resources/Textures/Clothing/Masks/mask_clown.rsi/inhand-left.png diff --git a/Resources/Textures/Clothing/mask_clown.rsi/inhand-right.png b/Resources/Textures/Clothing/Masks/mask_clown.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Clothing/mask_clown.rsi/inhand-right.png rename to Resources/Textures/Clothing/Masks/mask_clown.rsi/inhand-right.png diff --git a/Resources/Textures/Clothing/mask_clown.rsi/meta.json b/Resources/Textures/Clothing/Masks/mask_clown.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/mask_clown.rsi/meta.json rename to Resources/Textures/Clothing/Masks/mask_clown.rsi/meta.json diff --git a/Resources/Textures/Clothing/gas_mask.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Masks/mask_gas.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/gas_mask.rsi/equipped-MASK.png rename to Resources/Textures/Clothing/Masks/mask_gas.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/gas_mask.rsi/gas_mask.png b/Resources/Textures/Clothing/Masks/mask_gas.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/gas_mask.rsi/gas_mask.png rename to Resources/Textures/Clothing/Masks/mask_gas.rsi/icon.png diff --git a/Resources/Textures/Clothing/gas_mask.rsi/inhand-left.png b/Resources/Textures/Clothing/Masks/mask_gas.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Clothing/gas_mask.rsi/inhand-left.png rename to Resources/Textures/Clothing/Masks/mask_gas.rsi/inhand-left.png diff --git a/Resources/Textures/Clothing/gas_mask.rsi/inhand-right.png b/Resources/Textures/Clothing/Masks/mask_gas.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Clothing/gas_mask.rsi/inhand-right.png rename to Resources/Textures/Clothing/Masks/mask_gas.rsi/inhand-right.png diff --git a/Resources/Textures/Clothing/gas_mask.rsi/meta.json b/Resources/Textures/Clothing/Masks/mask_gas.rsi/meta.json similarity index 96% rename from Resources/Textures/Clothing/gas_mask.rsi/meta.json rename to Resources/Textures/Clothing/Masks/mask_gas.rsi/meta.json index 631338dfa8..a30198f505 100644 --- a/Resources/Textures/Clothing/gas_mask.rsi/meta.json +++ b/Resources/Textures/Clothing/Masks/mask_gas.rsi/meta.json @@ -8,7 +8,7 @@ "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9f4bd6e0d5e457b6a36f3c505a8194116a666d6f", "states": [ { - "name": "gas_mask", + "name": "icon", "directions": 1, "delays": [ [ 1.0 ] ] }, diff --git a/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/equipped-MASK.png new file mode 100644 index 0000000000000000000000000000000000000000..bc458737774810dd6fb688f7c1126af6973c03d9 GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=#Z@5@B`&GO$wiq3C7Jno3=9=> zRFB(owHOGnU9c+d;(se%df9KYi%M&pBU9Ss2Kxz;Uw%cuc^%h%-r^@~-nWwDT2HMG zZdl)UCfMw3!X9=b%V|@-%3oX{*rUc8d3YV~%(WqmhbR5KR^Y<8c)8f)M-S5c?aR+e zz0B-9!OOtFwBFOjF{EP7+gXM=w;V*;>ci*GTqIuZ_^~HNKXJikQMb)$8>Z+=2OaY; z7k%&1b5l!Sve&5OL%suN4{}#Te`$8=@Y%=LbYO*=-(Qhgj7}YAw&k8UzOAR$IkLf~^7N($ z7JNFVZ)J0OF+DkXKSs{=db~M{QiCZ z!0*fRkC&hE+}wFEVFKfU-H#vt`BAj>)ctVR$cE>Y8y4&Dwdi~J+wOzno15EsPk%O$ z>z~TJ;=|X6jPsr^yqoub+lzB)o7Z^MI)81SAfWWQR(@?5_vM!&y>8450&R)9<;;pM z-|`3qZrB=^0qL%W4M#Sc!zPvMW!9h1&dh=*dMrYKj1si zD|SG(K^mb@OE@6Ce8;J%R&x)Jlo?9BCl}2znO%8zlkCbMV~1_0J2|$Ci(ED2ZV|Zo zmetiI7?^9;&Rswj?C(gJrN*G(d-+hd&ZWA8r7^!cYuq0IDE zp}Q=1)&4#Cm+8|^EzY1X-)>CWWUBR+?{xN-GgH=7zwxT)WOGb-^XN&r<+gkBs9wh( fMzfp6Kgj+(q;#US=1?*)=P-D>`njxgN@xNATu_YR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/icon.png b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..065779910e7dbc70a5678bbe9f0336a54558bf26 GIT binary patch literal 581 zcmV-L0=oT)P)|SN%?sq!C1;Gr&2=)${Gr_p9yI z^X=02n^-LXB63P8Tt3_^_eN(g*9VU-j$?4n5yvsE4<6m#=6aauy zd^20D+4;%S-SNINX^Ok!eaFsEo;I_^+C$WhSqq@L_nX;bz0KFpODSt-p;iX`-u{^8 z-?#bs`6g$f)^BLi6r zIT401Sq5t@L=-_yd%@s-#iW$roI^?p@%vBkCLY0B3zKCKVTfN^J0GV}28hUMt(gcz zTo5rLa`QX~=Nux6AfgD9$)xmGN|pV2o&x|bh*&k&M*trdqW24ZHoSOI6s2zv1Q-s7 zFlh>tWsM3^?Mmn&f*?Rq6!2SMtwoX~@Z(KOaidD8wPsauUyP)bt;B(rx8Xd`kt7L3 z7$S~ih%jsu20)AVfYzFsEQ6F1)wb<*+~^Ect@>-V75@~#|FWGw$vS`zVCMj@cFhNt Tf6&%B00000NkvXXu0mjf=`;zf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-left.png b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4efbdfc2a39951cfe9a85b82e4e83dee0d536564 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iWS0L@_=@}UwK4sFR$cPAr zH!V3iISl8Ev$L~{i;E2n4IiZyh5{8amIV0)GdMiEkp|@CR)s{AxTF>*7iAWdWaj5F zFjUM54l5`s{r)Am;N#aPTHd-^=gyoD-VkbV(fGk5o%24LCmD)*dUseD2N_>B_EMPh zXws2MAqv5owi_+%%r{y@cXk`AZeAg=q`%vEt%jkw=n=CgL16`7iy3G0Fw9Jo4zXIx zy9Q`+s;7%%h(~8~f&}a0gbPfJ7TtjivuzeLDfejRH2F3bWEg}fFHY1jV@-N0YQXxo zFJkQmlNM<+*44`4x(yq5ge8U=aJe1SSYUe~%0+>3$t5Ohhbdwf42!lLNM!{Qi~>uK b7BDb;5$BpzsLzoPw2;Bm)z4*}Q$iB}Ce?K< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-right.png b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8af014a21faa4d7c710ababb1ed07057f04f77 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iWS0L@_=@}Uw9vKlaWzr;u zH!a!O*$n54b8>Qui;E2n4VNEw?*l4gED7=pW^j0RBMr#OtqO@KaY-#sF3Kz@$;{7V zV5pcA99B?N`u$6A!N;#pw7hk-&Yd|Qydl)!qVa=AI_G^fPcjts^zN`Q4l=%M?4>a0 z(WE1jLKK2EZ8uujnQyd+?(8;J-Mm6#Nq@KTS`9;U(IaM0g2D>E7BkM~VVIdF9b&bX zcMZ_uOivfb5RcB}1PRu~2?k7zIZZtUfo^QBIb1$6i8>Q62;{i6bRBRxdP;kPrhr~^ zr%{zv(!}%)E*FVdQ&MBb@0B`DfdjJ3c literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/meta.json b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/meta.json new file mode 100644 index 0000000000..f8f285dfa4 --- /dev/null +++ b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/meta.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ [ 1.0 ] ] + }, + { + "name": "equipped-MASK", + "directions": 4, + "delays": [ + [ 1.0 ], + [ 1.0 ], + [ 1.0 ], + [ 1.0 ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ 1.0 ], + [ 1.0 ], + [ 1.0 ], + [ 1.0 ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ 1.0 ], + [ 1.0 ], + [ 1.0 ], + [ 1.0 ] + ] + } + ] +} diff --git a/Resources/Textures/Clothing/Masks/mask_joy.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Masks/mask_joy.rsi/equipped-MASK.png new file mode 100644 index 0000000000000000000000000000000000000000..070101132813fd7576c88931b27a73c8ee918028 GIT binary patch literal 369 zcmV-%0gnEOP)YCm3IO`08DOy`UFHA)0G3Ha zK~zYI?UXSJ!!Qg*EdrVS}R>ZwaX4}19HBYzK42)_cc zt~(x81%b391B=x0a|)Drg4E|Ng$=`6i%2U_HH7rqW7U9(mEjuF{@Zb!13m6!#{?`@ zf-&@}gls#cM-dI%4%o!A$G$LzL5?roYzxfKBHG<{Af4f68{n&Ood4ntgLn#6$LgBk P00000NkvXXu0mjf$PJem literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_joy.rsi/icon.png b/Resources/Textures/Clothing/Masks/mask_joy.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b81dd2fb25bc623c974b92d6c9a349da4d78aeff GIT binary patch literal 321 zcmV-H0lxl;P)fu%@w?gIh4DwNtoEV zGqC)}{)GXef1?1f);UQ!BdTFn1#`))rxKv45htq-cb4t4RZoFkGL&@!a3^iiCJ!83 z0~t;M_v3~#CQuz7PrUB?1O~u&u?43sks$iDFp(!-SXu1qGT-R`VNQ|0yoJ TKMjjw00000NkvXXu0mjfRL6qc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_joy.rsi/meta.json b/Resources/Textures/Clothing/Masks/mask_joy.rsi/meta.json new file mode 100644 index 0000000000..f9b8c223d5 --- /dev/null +++ b/Resources/Textures/Clothing/Masks/mask_joy.rsi/meta.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation", + "states": [ + { + "name": "icon", + "directions": 1, + }, + { + "name": "equipped-MASK", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Clothing/Masks/mask_mime.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Masks/mask_mime.rsi/equipped-MASK.png new file mode 100644 index 0000000000000000000000000000000000000000..0dff03439217b1f281883de13340583a5884db6b GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(i*8>L*G&D2-$^ZZV1I3JI zGHlqe!91V!E|9}m666=m;PC858jzD&6%tY6l3JWxlvz-cnV-kNP%$Sste~j$`v8E%wal&TdIAw{c&CMUB4z76frsqCiqHyw`btxuhN3`v^+zx6;XdHOcaYoqi zKtO^FkTyLQ@}OtRe@WjB8U~KfER(eo{M??+Ox%?y($kd4%&_7Z`@BerQxQPx7(8A5 KT-G@yGywqfdV5y@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Masks/mask_mime.rsi/icon.png b/Resources/Textures/Clothing/Masks/mask_mime.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..76d6e5e4bf7d9ae2ce9cae7f29f35e18960da853 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*8>L*eE$6T-@ku%?%V;2 zrKhJKJb2K?#%B8T>D}Gk%Xj_w2^3{43GxeOaCmkj4ah0-ba4#Pn3$X(5z-JC=)vIX z;Nj^h=-MbGprD<|#Hpdcsj-`7~(A32^1j9Xb$l#euraJLGy8ECH3 z(6rQ4;#A?%(&SvF7`gb$$wvmvCj;10RYlcRQ?dw1=b7fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+H#0X?iHkEOv#1!Phl?|m200038Nkl`m(x3X)4e=hJNPF@-)n(5iX!d(B+2a4drb^8x6%9K3TtC WB{7`8uifGR00005a~ z8XmX`&EV$vw(Qfdyj`BjbNyExPn+|4CF565>2u7h56olW>fzux$$iA(m&WXS`%*L} zglrIWP~*w_6y%WmuRTagBcfqBa0(WE1jLKK2E&5g~s?l9Tx(%EgS zx_O1flKyVvwHksNTq)8;n%X;l?QHO6W0-F*UHv>JWCzgV#hxyXAs(G?r#SK*R^VY_ ze9HLX8RG+am%sn-Z}PnrBz^k08vD0NQ;lXk-N2Wa^-Afe)TNgnGT8zco*WizuwgpV zc;CU-hUp_`?j_F!hTGNVo@z*rw6tV;zU8u_+1o4HKR$P@7p_vM4)co(^tzar^~%nv zarJlmNqd>B4w&vduv#k2yozN@w~azlOT3)X>zi8>4!vTG5Pa76qG9Kzopr0OP%wl>h($ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..fa96803d56c7e2b7cbf42bfdef502d2466445511 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e{s5m4S0D`pk&%)A|NpnQw~zTa z+XTpGED7=pW^j0RBMr#OtqO@KaY-#sF3Kz@$;{7VV5pcA99B?N`u$6A!N;#pw7hk- z&Yd|Qydl)!qVa=AI_G^fPcjts^zN`Q4l=%M?4>a0(WE1jLKK2E&5g~s?l9Tx(%EgS zx_O1flKyVvwHksNTq)8;n%X;l?QHO6W0-F*UHv>JWCzgVMV>B>As(G?ryS%xqQJv) zP&7e{!;jsQdHL)8E20BjbZ&k${+<|@vA5}KvS;STin)_MrCq(o&fMg9W=_J2>l1~; zvmZ>-FST#1bY8jE&^$Rn>)@M|0Ifau#J2CU7Tn@>=ABru>Ji&Djw_WO**sj`ebo9% z@U+L91Qz-)a7} X(*%9gjknzcx|YGy)z4*}Q$iB}Sqql- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/meta.json new file mode 100644 index 0000000000..43a137083a --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/meta.json @@ -0,0 +1,74 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/", + "states": [ + { + "name": "equipped-INNERCLOTHING", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Clothing/mask_breath.rsi/meta.json b/Resources/Textures/Clothing/mask_breath.rsi/meta.json deleted file mode 100644 index ecf72073c9..0000000000 --- a/Resources/Textures/Clothing/mask_breath.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 9a3a3a180344460263e8df7ea2565128e07b86b5", "states": [{"name": "breath", "directions": 1, "delays": [[1.0]]}, {"name": "equipped-MASK", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/accordion.png b/Resources/Textures/Objects/Instruments/accordion.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/accordion.png rename to Resources/Textures/Objects/Instruments/accordion.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/accordion.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/accordion.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b881550bda99ae46a5c59023311a6be1863f99ad GIT binary patch literal 516 zcmV+f0{i`mP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+F*!NECkfk;426Xr zb-1hV|FSFM+$EfL@z=6&OoXKE=K&IF*EKc$nnGNL7f^0Kk9@ z=yfCr6M#_)LEpnrCpdr+hZT?*polC%9ZW0Wn5v%$v50Nbh~vXS-Q#wQY?lQKfYfVc zd>yJ5ASVT!S%RnR;9@xNq{pBTUF*4S0hQT%0zN12x>jaQO-)UIEdI;?E+>ZI613}sa-#VCB^YYY)o9V!+ zUCvibK$^G2ih}Q8p0`9IWCtuLn4Lq&1lB&3s9WFEv`csR4+URntPB_c0000fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+F*!NECkfk;426Xr zb-1hV|FSFM+$EfL@z=6&OoXKE=K&IF*EKc$nnGNL7f^0Kk9@ z=yfCr6M#_)LEpnrCpdr+hZT?*polC%9ZW0Wn5v%$v50Nbh~vXS-Q#wQY?lQKfYfVc zd>yJ5ASVT!S%RnR;9@xNq{pBTUF*4S0hQT%0zN12x>jaQO-)UIEdI;?E+>ZI613}sa-#VCB^YYY)o9V!+ zUCvibK$^G2ih}Q8p0`9IWCtuLn4Lq&1lB&3s9WFEv`csR4+URntPB_c0000fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+HN7;mB(X?|i!&v&s2HS;i!-e#F*g;& zHsn%PaP@Nm8w>z@BO3piN*?O~00BHnL_t(YiS3k4PQx$|g(t!MEUTU%Z7+b*3s_>T zt}10=i)}WIx&WyNs^kDw3AbRw6g{;A`*3)m4*G_ui#4Zw ye;t7JT2em0;x52Y@gI0HH5xg5NO+?Dzw`z93_6<`^@&jc0000fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+HN7;mB(X?|i!&v&s2HS;i!-e#F*g;& zHsn%PaP@Nm8w>z@BO3piN*?O~00B`+L_t(YiS3lnO2a@9#wX3vgQqlkffirDzxP#U z5pNZe_M+e^IY^<0)Ob{|vfu;w1|GbNc>&+cNq21~=}IoW2>l94C-a+cvVj?Zowluz z{r83rAmYG*1MvC7$N@BLqksiMZUWw@x}pix7-YKzgaIHXrc~WRjP15$G1W^0h&iMS zq+{A%#yJeM&MhsWPXywnc_1E;NN->N# zV;hSXpge5oDLS#o)Jg2fLvnR$j~SzMMsoaq(vS7N7~wxGiH>TQRLg`zf_~7e!?WtjH;!6O(Rz^7jU)rUIH|rse3Les%xGH0dGihKUa#$}lEW;^ zfA@{8nfHrv-9mh%<)_^@w&cFxlYEh8i{{Xagy+RH%Xzj^a}y}%#^Dz2`hTwP)t-s0002+ z@bmim`Db)+(9zQ8=IG(!;`jIXg>eG%=7c~z01e$@$Uct0K37zgNKHQi-1W? zOH58kV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5DLp4YIXgA4xF9n%M~RCwC9|j)q?d~`ttc@!6~s2=QdV&Fa{-$U046yd z4mYUJKL7v#<4Ht8R9J=WmeCG_APhxOL<>`NQ|JEwOIHk8j8a8dGP7`r5_{Tf-&)3! zlCGvK=lJGX9>{qi=7e&-&U1q*kWkT_FE6)1RXfx}AY%>GEw+OwgSx>E>W1mCa@}_J zgc{r*=7bwq^<5ugFnsxY9Xa6R)6vr+c*NN_xe_LCo|Kf7bV22X5auE|K0*{E$H~tH zPUn*12ylDY-4E~&plAaHVz+n}NSaAFuE!ODX3ERp*BxlHCTPceCc!4})#BMC+Hl&sn{Oax8-);m%*kv#=*YGF8N&lfYPI(Fj=PMn_00000NkvXXu0mjfXD;ou literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..a8af95f3bae53ca6e887d97b4430d99bf6aa5ac1 GIT binary patch literal 509 zcmVP)t-s|NsB+ z@bmim`Db)+(9zQ8=IG(!;`jIXg>eG%=7c~z01e$@$Uct0K37zgNKHQi-1W? zOH58kV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5DLp4YIXgA4xF9n%M~RCwC9|j)q?d~`ttc@!6~s2=QdV&Fa{-$U046yd z4mYUJKL7v#<4Ht8R9J=WmeCG_APhxOL<>`NQ|JEwOIHk8j8a8dGP7`r5_{Tf-&)3! zlCGvK=lJGX9>{qi=7e&-&U1q*kWkT_FE6)1RXfx}AY%>GEw+OwgSx>E>W1mCa@}_J zgc{r*=7bwq^<5ugFnsxY9Xa6R)6vr+c*NN_xe_LCo|Kf7bV22X5auE|K0*{E$H~tH zPUn*12ylDY-4E~&plAaHVz+n}NSaAFuE!ODX3ERp*BxlHCTPceCc!4})#BMC+Hl&sn{Oax8-);m%*kv#=*YGF8N&lfYPI(Fj=PMn_00000NkvXXu0mjfQ@QY2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/glockenspiel.rsi/meta.json b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/guitar.png b/Resources/Textures/Objects/Instruments/guitar.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/guitar.png rename to Resources/Textures/Objects/Instruments/guitar.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/guitar.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/guitar.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1da26b1415a67226d7c282c7f1afadd1f6b40f GIT binary patch literal 631 zcmV--0*L*IP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;Zh zDainGjE%TBGg33tGfE(w;*!LYR3K9+y)?5Vu}F!FGbOXA7^I7fGp#5wHxYE63jkW@8k*T{(`5hv0aQsuK~z|U?Uw6q!ypWWA>oqIrG#$nSi8OdYtE)k6@tB> zbw4JJ6Df(X&xavWj1Wyte@(Kh%j+Z)=()gpqMjaCwSF#7G2kNYF@RzVr~~lxi>ggv z{aRm3FraVza^csR-wtqzC*yXzXBvU%Y<{~W06=R!B+R&XIOJA-@4>#T-{vLgbOVjk zNCFgWf3|)tN*V9m9x4E{bNNDgnBG%M%K_nV@BkTJUVX?zz4U$?00fXfp1^O4NDUzE zHDnh4D;uA0b!C)a62O5-=E|UlYXMD7O-=mC;dlJo_(uU-3HP}ADPVr#09zH_;~hi5 zVf=L)LI1y%xOD~wV9_6)F;0+#_vzN$n5EiuI5>y1qX8JdqzWWm0Gu!M@DZlK05BdV zeEVdYEFKslR1o9(Y%s^e1vkO3JO5H9Mre$1qodGt&D^Cqf?<2>X0+))>kCFw3r-^_ RcBTLT002ovPDHLkV1m7l1`7ZH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/guitar.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/guitar.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9726be4524093fb033bc210b47a664b70b1e9f GIT binary patch literal 1329 zcmV-11V=-0C=1w$2$suFc1a6I(v$T_TsPIMk10z?+`GWEmTNWy}pIhO^IQg+yXm0 zdP2%_onZ7;P3DzVBN$yvCI;D~{>kb!fKlwXs80o%RZ<3{C$lAggbYSQCC0_V&W=7> z=Ng)ZSg-Q{00ezWL_t(|ob6g)Xj4}l{!WwBYDPomy)KukdDx)AN*`J_1e3lvaN@LB z3ELjZEGUG*aG)>6jh2DX5;!t$^`Fqm5h1(WJp+N<%_G`7Zg ze7HMl{^#D?b9Zcazn74cd(ZFtefK-3x99gGlv4bk(IT3FXgC6hCLkJ)0HO(qh9iJz z0;1svAew+^a1)?cBD7B-w!T*ODTMY)d}FwIP2}|e+g!Y6s|`Em=jMRvc}ms_z_Flx zF8JXtC4lY(UUPEY1MGG{X&hccZ@Nv8IZb=QM}$o$0HBKi0IM9995(^_6hhlvz+_4% zXE&G=HY$RpzXGwaTo&-!ttC>q{@+x{C*F3~rvPw$=Ba5>`a9jU*?rUVl&}r4Pa%{! z!wgIbz!HD|=o=_J&;S5yZh}}?rUwJS=+Bf4?swCZ=dVK9>B7nLSMkl|vxbr>MSrK8 zwtI|S%S2!sW5*t;?DuQ8mKw&by9B0&BUQGFMnX6odIdAd-|*FqB-F0=5TE=BZ=D{+ z?5YbB@iDrb2gWa*#d6+Q0z6Qs*cUG$g=Q#-{vdh$kEYL=zAVM*z_TM8gq4Gy&0Y1Q1O?G#mj$6A%qY0MP_Q!x2C< z0nykp0$6RH;4Xk2T^vR*Jx__(qj##9xo^ujz$#1&U}p!&Mq$MT+#O)0LMsxc1UMEX z^q-aH*Le+AcI^Ojfl+XCKztxb*_k{mO!5Xh@-985kA-DgSphZ^-;@B8srqZoACTY= zNQe&v>Gx@1@YNQsdqpfPQ+C!Ljf9GcMVGn-<{o(Ha~ z9eAA0;ncS&Vx_^M5lVX&Zm0Fi?{2RLnySGk`EYk7j}O28v#dG8NPJ68Qmph`y6z6_ z(vwdv=5Pwuxc_1aa1$`(QpJ1 nO+Yjp0YnoJ4Mzac1VrOGPiXk~5r4q<00000NkvXXu0mjfMiO5j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/guitar.rsi/meta.json b/Resources/Textures/Objects/Instruments/guitar.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/guitar.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/h_synthesizer.png b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/h_synthesizer.png rename to Resources/Textures/Objects/Instruments/h_synthesizer.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8f77ae6e9f811a6a7d8fb0ad6755be5560cf39 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iWS0HU_YO1cT{^G@ppFe*l zCML$l#@@Jb!_Cdj(a}*~U!SkX0;q<8u_VYZn8D%MjWi%9t12X-#3i*jxhS)sBr`vc zfuUkfa9BZ6>GvSI(O!L@P<%>i^dNg>74h`Jjqbh)4RjMILP?2v6sS} zN0W|B3Q-7Nxx;9^igRbTvFhd(5=(&eS`9;U(IaM0g2D>E7Bfn7GuS#wxxABeJPEY* zq^FBxh(~8~f&}XomL4t%Cm$viO@TuuQ#>aov2wA9a0nKtELLK!V|B_r~BEunmUS0;t2XAs1LKD)`CQX_o)U`xGAjP4`$j7nOwa~k`IDk)9?-=B_Q_3miNe85CKY z7P5#KBxw~G@*Y@!V2x-bBXb**SctGhn%@JL&;wl>yayO&Tn`j2Q1W7a(~#XVosB_M W-uULDV@776fc13sb6Mw<&;$UfFOxU` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..7eff93214680def41743c8701d9604272bf2e893 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iW*Z=?jtE;Pg2M`mO22;zF8KKMiI%sn*10q1gExd4Tr__0Nawtd=1GR4p57f6#zDrHjlC4+ zJeqW5QiwwE${j}QRh&D!ja4_VkXQnw*J>D=iykq15)@YOwU|+wo59ve%H^G$BghFC zJY5_^JUWvTBv`MoIh~MkEfO)%Qn=yMG({^xVTD5=V=!Zv^2`{3>R za1CXV0}YHl`3z;OF$aAlW-vT%mTa08V0TzcA_B|~;x=GT7U^O7#h8=IHdWL>DCmHT z!@Y>k2~4a(A_lW}C1^Q3Gnl=6k*EKIIh~6RTsg`Z%4m?iSi@n8-VH|eJ!=jy?s$-T c)Ps@X(INeYkm&7`fPQ1}boFyt=akR{05`OtJOBUy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/meta.json b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/harmonica.png b/Resources/Textures/Objects/Instruments/harmonica.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/harmonica.png rename to Resources/Textures/Objects/Instruments/harmonica.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..30579b39a9bc8d525528821c891b9b56d163fd7f GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=MO7gYB`&GO$wiq3C7Jno3=9=> zRF7NpH7E$M9++i&wENpJ{8$U%VhLZ|H#W5=8%>l>HFgqc=43GDXTQ}OB58>L@yjPoBF zZS3r)J;kHF^o^k5+0QatuU&Z)=XbO5`e{pRBPFG%Z1?^C;zr^e{D!v7UR+>wO^*~Uvt~=)nf*RAFBRdcJiEUjCD>R^`5SN JF6*2UngF+GeQf{$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..84fc6627df9901a401a80deb7ba65cb5c0c55081 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=MO7gYB`&GO$wiq3C7Jno3=9=> zRF7NpH7E$M9++i&wENpJ{$xm74Yo90@m#tD3rOOPR)8%XTB5 zs#AIEwk}gHUc{Qgu>#Nrst4KU+!n(tL-tH>Pxx$LSwQ33onulG%w7LcF zfBP<5U3~oBS{<$rmHW%=qvqWa_<6KK*;L8wwv^^l9>Iy%?}QZEV{z*&{cA^5_gNLH RXahrn!PC{xWt~$(69Dk2rN00G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/harmonica.rsi/meta.json b/Resources/Textures/Objects/Instruments/harmonica.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/harmonica.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/meta.json b/Resources/Textures/Objects/Instruments/musician.rsi/meta.json deleted file mode 100644 index 966ed218b5..0000000000 --- a/Resources/Textures/Objects/Instruments/musician.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", "states": [{"name": "accordion", "directions": 1, "delays": [[1.0]]}, {"name": "bike_horn", "directions": 1, "delays": [[1.0]]}, {"name": "drum", "directions": 1, "delays": [[1.0]]}, {"name": "drum_bongo", "directions": 1, "delays": [[1.0]]}, {"name": "drum_makeshift", "directions": 1, "delays": [[1.0]]}, {"name": "glockenspiel", "directions": 1, "delays": [[1.0]]}, {"name": "guitar", "directions": 1, "delays": [[1.0]]}, {"name": "harmonica", "directions": 1, "delays": [[1.0]]}, {"name": "minimoog", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "minimoog-broken", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "piano", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "piano-broken", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "recorder", "directions": 1, "delays": [[1.0]]}, {"name": "saxophone", "directions": 1, "delays": [[1.0]]}, {"name": "trombone", "directions": 1, "delays": [[1.0]]}, {"name": "violin", "directions": 1, "delays": [[1.0]]}, {"name": "xylophone", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "xylophone-broken", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/bike_horn.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/bike_horn.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/bike_horn.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/bike_horn.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/drum.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/drum.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/drum.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/drum.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/drum_bongo.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/drum_bongo.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/drum_bongo.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/drum_bongo.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/drum_makeshift.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/drum_makeshift.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/drum_makeshift.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/drum_makeshift.png diff --git a/Resources/Textures/Objects/Instruments/otherinstruments.rsi/meta.json b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/meta.json new file mode 100644 index 0000000000..efd96412ac --- /dev/null +++ b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/meta.json @@ -0,0 +1,155 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "bike_horn", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "drum", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "drum_bongo", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "drum_makeshift", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "minimoog", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "minimoog-broken", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "piano", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "piano-broken", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "xylophone", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "xylophone-broken", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/minimoog-broken.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/minimoog-broken.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/minimoog-broken.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/minimoog-broken.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/minimoog.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/minimoog.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/minimoog.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/minimoog.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/minimoogbroken.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/minimoogbroken.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/minimoogbroken.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/minimoogbroken.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/piano-broken.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/piano-broken.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/piano-broken.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/piano-broken.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/piano.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/piano.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/piano.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/piano.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/pianobroken.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/pianobroken.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/pianobroken.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/pianobroken.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/synthesizer.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/synthesizer.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/synthesizer.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/synthesizer.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/trumpet.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/trumpet.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/trumpet.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/trumpet.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/xylophone-broken.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/xylophone-broken.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/xylophone-broken.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/xylophone-broken.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/xylophone.png b/Resources/Textures/Objects/Instruments/otherinstruments.rsi/xylophone.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/xylophone.png rename to Resources/Textures/Objects/Instruments/otherinstruments.rsi/xylophone.png diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/recorder.png b/Resources/Textures/Objects/Instruments/recorder.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/recorder.png rename to Resources/Textures/Objects/Instruments/recorder.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/recorder.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/recorder.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0931bc795b6baa2437a28b49c74a1d216bddafb7 GIT binary patch literal 455 zcmV;&0XY7NP)vP(L>q*QN*n0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sVFr$zbGZONQsLxC9|j)q>qa;ttc@!6~s2=QdV&Fa{-$S0Gsj~ zWK}bS$p8QV;Ymb6R7i>C)UghNKnw=pavEGs)VM;>=z1o`72m-Jz=c`#3G~U8tv_x2 zB}NDB#9hBMcR(xhQY37%7&~B+DKNG9VJ{H2r4<|X9HIjPfWvbj#mtt-0N8sDx*)C8 zx)xkZ*tL6F)R31^#Jq_|1ro)HfQ$FJdR3r@7{zxheB~PSlnls~f&U2Tqs#%&%lnT5 zaeAGDL=Th&1Iv903^2nK8ANs4sLq2W)tbh;tsNE8ke)D5+wit002ovPDHLkV1jGuw{`#k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/recorder.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/recorder.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b1a320dce3565c356afded20fcd17824e24dd7 GIT binary patch literal 459 zcmV;+0W|)JP)vP(L?Vc<%530004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sVFr$zbGZONQsLxC9|j)q>qa;ttc@!6~s2=QdV&Fa{-$S0Gsj~ zWK}bS$p8QVCm9Y+jKn#X^;c~3xG~%dXa3w4{Y77sczQ9d43qFD`E|awQ zhZ>pGe`@KMUR$6?^u97^_AVgD1pQ0clwc=bCWxON&6`ae}qSlzwVmwY}qX23KtpxgpCcN5&1}v5MKS}&8XmE4( z5N?R+KuuGDBeN^8=j=rRMC%AhM}ZjRSGUdFU_rQ$iwuh}JR#0V052t&8*|VY_ Bxm^GN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/recorder.rsi/meta.json b/Resources/Textures/Objects/Instruments/recorder.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/recorder.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/saxophone.png b/Resources/Textures/Objects/Instruments/saxophone.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/saxophone.png rename to Resources/Textures/Objects/Instruments/saxophone.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2940a0b88186d8cdc33e9c742d561f187f769c60 GIT binary patch literal 456 zcmV;(0XP1MP)R0d!JMQvg8b*k%9#0B(9z zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1};DIwAd0002nNklb%@X`oqZTE=ugh}B5pqSk8Dweq8ppV|b#~3Z9=)J`N0000};DIwAd0002tNklky+>bliX)O1JVupG9-Zb+7B5Wj_Vw}S7&(JkiziOAyA*9?UKv|ZBBT;1B z{o#4!3AJNb0H7o0(04pI&xE81*RaDNDZ&(X0Cpn?P!aQpi2q}4%B?q40RbuhcI>Dk z;^$a5>Ua#{0?@egMZyZ9y(h3pSO>oI1e8QOnkH|NxG+0@mhh0-gb^e3`uwUMQy2!F z00$vZg7#qIjyOmYLQFoM2w^r&Es-Va8Lu@M$LokUUT6{-_JAI!DgXcg07*qoM6N<$ Ef+0k}`~Uy| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/saxophone.rsi/meta.json b/Resources/Textures/Objects/Instruments/saxophone.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/saxophone.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/trombone.png b/Resources/Textures/Objects/Instruments/trombone.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/trombone.png rename to Resources/Textures/Objects/Instruments/trombone.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/trombone.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/trombone.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..e517ae45414be1871068f75373b89ddff9ece2ab GIT binary patch literal 482 zcmV<80UiE{P)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSq$oc(DL*e&iHkEOv#1!PkBc*{C^0t`#5UwoR&e!m0hO*1XHF*hzfuIIk)CcXUY%r+|VUIE7=++CKcwn}KiI(cFQ!h~Pq Y15gnm=JJ!j`Tzg`07*qoM6N<$f(+NkS^xk5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/trombone.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/trombone.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b27538920bc9033b225f7e5f817f3d5cd8e930dc GIT binary patch literal 478 zcmV<40U`d0P)|@RfGTl00DGTPE!Ct=GbNc003=zR9JLG zWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSq$oc(DL*e&iHkEOv#1!PkBc*{C^0t`#5UwoR&e!m0hNklYDn08WxZ zq;LS(C^`V&+nBIz5|08|Z7xr?h07Qa*riF6{$6STAV+U=#aj_)j^1X9KmqVEK>Q9; z`UMRL9a9Oc2R;sn1_)Or`wJC~NJ<49L=0pPqxoGF)Pzv+T1#NjyIuFUw-c7s7I#J6 z!oxfPr@})Mh!$^H#y$A*uCfERvCSc8%NA(HpDE3Hc;F;`7>}4pRfXHzq)ETj6Q;@` UP=YaJRR91007*qoM6N<$f_ak2v;Y7A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/trombone.rsi/meta.json b/Resources/Textures/Objects/Instruments/trombone.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/trombone.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/vgstation-coders/vgstation13 at 8d9c91e19cb52713c7f7f1804c2b6f7203f8d331", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Instruments/musician.rsi/violin.png b/Resources/Textures/Objects/Instruments/violin.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/violin.png rename to Resources/Textures/Objects/Instruments/violin.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/violin.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/violin.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..1edf690c49e05b84291e943b74971fa53688745e GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(iS0Fvp7)UUjNn`jA1V6sq z?b4GqFw6uBF_r}R1v5B2yO9RuWLJeml(?i8Cl_TFlw{`TF)&oj2@WeLD*gT?xZva0 zCtBXRTIbH358e=JaMAd|Bc1a;nkN~GdU|(Q7zY_&Huh4O^JvnMNg)csD|L+R)s6i- zyNy*huaH>M-EF*9!_Zvxh}n~%u!66}jI+5JqIXNp=XmP)7ijGSPZ!4!kIuJK_6jyA z@VGTzzITF2O6)^EllleOJN0b2485FNs*bOAs+i8t6|m}qt4V^}jN(I+1lLGkW{zUt zC(>fTP_eLm%K`-zj;3_sZ@VX4{cz|(cdUR`{FTyQ9IZ}{$DXjbP0 Hl+XkKL`aW8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Instruments/violin.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/violin.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f193a5efbdfcd98348497195509f905f2e60ad12 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(i*Z=?j1DP|88P23J0NMY4 ze7W1D*KIP*9w^FK666=m;PC858jzD+6%tY6l3JWxlvz-cnV-kNP%$Sste~j$`JdY zH7M}7E<6@{g<0bWbAz~nVd1lX%P*eP`gb8zxjySx{ORR z;{GAgJ0%huVtR!VCazy{U*4s5niSI!Z7m+3^qme0ZkjHE7uR3qu-nHkKG9R^rNd-~ zmU(+*jEZhwzTS3y())P}OXS(w4#w{Bm7H?$;5%KHd;hnU<(}f0G{dq}8t60zPgg&e IbxsLQ0F0cI8vp Date: Tue, 12 May 2020 14:45:35 +0200 Subject: [PATCH 09/15] Ignore some server-side only components on the client --- Content.Client/EntryPoint.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 7604f3e8e9..40fa3629de 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -144,7 +144,10 @@ namespace Content.Client "Mop", "Bucket", "Puddle", - "CanSpill" + "CanSpill", + "RandomPottedPlant", + "CommunicationsConsole", + "BarSign" }; foreach (var ignoreName in registerIgnore) From 69ce5763f3f3e6fb7840e05daca30b1445a17e3b Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Tue, 12 May 2020 18:36:41 +0200 Subject: [PATCH 10/15] Update submodule. --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 65abe671aa..b7f3627ef1 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 65abe671aa7cabffceafe430d992c72b9566c652 +Subproject commit b7f3627ef179c272152b89189002f1b34cc46355 From db0ae00e1fb1791e3354baabd3616da3d24a3cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Tue, 12 May 2020 21:24:39 +0200 Subject: [PATCH 11/15] Update Content.Client/EntryPoint.cs Co-authored-by: Clyybber --- Content.Client/EntryPoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 40fa3629de..2676cf26a2 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -147,7 +147,7 @@ namespace Content.Client "CanSpill", "RandomPottedPlant", "CommunicationsConsole", - "BarSign" + "BarSign", }; foreach (var ignoreName in registerIgnore) From 27d27f2b59e1af73aa25270881579fc7a4beb9f7 Mon Sep 17 00:00:00 2001 From: GlassEclipse <32942106+GlassEclipse@users.noreply.github.com> Date: Wed, 13 May 2020 14:48:49 -0500 Subject: [PATCH 12/15] Body System Part 1 POGGERS!!! (#855) --- .../BodyScannerBoundUserInterface.cs | 53 ++++ .../BodyScanner/BodyScannerDisplay.cs | 160 +++++++++++ .../Surgery/ClientSurgeryToolComponent.cs | 166 ++++++++++++ .../Health/BodySystem/BodyManagerComponent.cs | 248 ++++++++++++++++++ .../Health/BodySystem/BodyPart/BodyPart.cs | 226 ++++++++++++++++ .../BodyPart/DroppedBodyPartComponent.cs | 36 +++ .../BodySystem/BodyPreset/BodyPreset.cs | 38 +++ .../BodyScanner/BodyScannerComponent.cs | 71 +++++ .../BodySystem/BodyTemplate/BodyTemplate.cs | 88 +++++++ .../Mechanism/DroppedMechanismComponent.cs | 45 ++++ .../Health/BodySystem/Mechanism/Mechanism.cs | 106 ++++++++ .../Surgery/ServerSurgeryToolComponent.cs | 156 +++++++++++ .../SurgeryData/BiologicalSurgeryData.cs | 123 +++++++++ .../Surgery/SurgeryData/ISurgeryData.cs | 63 +++++ Content.Shared/GameObjects/ContentNetIDs.cs | 2 + .../BodyPart/BodyPartProperties/ArmLength.cs | 17 ++ .../BodySystem/BodyPart/BodyPartPrototype.cs | 95 +++++++ .../BodyPreset/BodyPresetPrototype.cs | 37 +++ .../BodyScanner/BodyScannerSharedValues.cs | 89 +++++++ .../BodyTemplate/BodyTemplatePrototype.cs | 72 +++++ .../Health/BodySystem/BodysystemValues.cs | 9 + .../Mechanism/MechanismPrototype.cs | 82 ++++++ .../Surgery/SharedSurgeryToolComponent.cs | 73 ++++++ .../AbstractDamageContainer.cs | 107 ++++++++ .../BiologicalDamageContainer.cs | 16 ++ .../BodySystem/BodyParts/humanoid_parts.yml | 102 +++++++ .../BodySystem/BodyPresets/basic_human.yml | 15 ++ .../BodySystem/BodyTemplates/humanoid.yml | 33 +++ .../BodySystem/BodyTemplates/quadrupedal.yml | 33 +++ .../Mechanisms/basic_human_organs.yml | 59 +++++ .../BodySystem/Mechanisms/basic_tests.yml | 20 ++ .../BodySystem/Surgery/surgery_tools.yml | 128 +++++++++ .../body_system_dropped_items_default.yml | 19 ++ .../Entities/Buildings/computers.yml | 18 +- Resources/Prototypes/Entities/Mobs/human.yml | 5 + .../BodyParts/basic_human.rsi/head_m.png | Bin 0 -> 573 bytes .../BodyParts/basic_human.rsi/l_arm.png | Bin 0 -> 307 bytes .../BodyParts/basic_human.rsi/l_foot.png | Bin 0 -> 211 bytes .../BodyParts/basic_human.rsi/l_hand.png | Bin 0 -> 294 bytes .../BodyParts/basic_human.rsi/l_leg.png | Bin 0 -> 275 bytes .../BodyParts/basic_human.rsi/meta.json | 81 ++++++ .../BodyParts/basic_human.rsi/r_arm.png | Bin 0 -> 327 bytes .../BodyParts/basic_human.rsi/r_foot.png | Bin 0 -> 276 bytes .../BodyParts/basic_human.rsi/r_hand.png | Bin 0 -> 266 bytes .../BodyParts/basic_human.rsi/r_leg.png | Bin 0 -> 275 bytes .../BodyParts/basic_human.rsi/torso_m.png | Bin 0 -> 1195 bytes .../Organs/basic_human.rsi/brain_human.png | Bin 0 -> 708 bytes .../Organs/basic_human.rsi/eyes_human.png | Bin 0 -> 160 bytes .../Organs/basic_human.rsi/heart_human.png | Bin 0 -> 155 bytes .../Organs/basic_human.rsi/kidneys_human.png | Bin 0 -> 193 bytes .../Organs/basic_human.rsi/liver_human.png | Bin 0 -> 174 bytes .../Organs/basic_human.rsi/lungs_human.png | Bin 0 -> 233 bytes .../Organs/basic_human.rsi/meta.json | 53 ++++ .../BodySystem/Organs/eyes_advanced.png | Bin 0 -> 163 bytes .../Objects/BodySystem/Organs/eyes_grey.png | Bin 0 -> 165 bytes .../BodySystem/Organs/kidneys_advanced.png | Bin 0 -> 197 bytes .../BodySystem/Organs/lungs_advanced.png | Bin 0 -> 336 bytes .../BodySystem/Organs/lungs_plasmaman.png | Bin 0 -> 233 bytes .../Objects/BodySystem/Organs/lungs_vox.png | Bin 0 -> 233 bytes .../Surgery/surgery_tools.rsi/bone_saw.png | Bin 0 -> 417 bytes .../Surgery/surgery_tools.rsi/cautery.png | Bin 0 -> 171 bytes .../Surgery/surgery_tools.rsi/drill.png | Bin 0 -> 272 bytes .../Surgery/surgery_tools.rsi/hemostat.png | Bin 0 -> 142 bytes .../Surgery/surgery_tools.rsi/meta.json | 51 ++++ .../Surgery/surgery_tools.rsi/retractor.png | Bin 0 -> 212 bytes .../Surgery/surgery_tools.rsi/scalpel.png | Bin 0 -> 342 bytes 66 files changed, 2794 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs create mode 100644 Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs create mode 100644 Content.Client/Health/BodySystem/Surgery/ClientSurgeryToolComponent.cs create mode 100644 Content.Server/Health/BodySystem/BodyManagerComponent.cs create mode 100644 Content.Server/Health/BodySystem/BodyPart/BodyPart.cs create mode 100644 Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs create mode 100644 Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs create mode 100644 Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs create mode 100644 Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs create mode 100644 Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs create mode 100644 Content.Server/Health/BodySystem/Mechanism/Mechanism.cs create mode 100644 Content.Server/Health/BodySystem/Surgery/ServerSurgeryToolComponent.cs create mode 100644 Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs create mode 100644 Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs create mode 100644 Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs create mode 100644 Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs create mode 100644 Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs create mode 100644 Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs create mode 100644 Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs create mode 100644 Content.Shared/Health/BodySystem/BodysystemValues.cs create mode 100644 Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs create mode 100644 Content.Shared/Health/BodySystem/Surgery/SharedSurgeryToolComponent.cs create mode 100644 Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs create mode 100644 Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs create mode 100644 Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml create mode 100644 Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml create mode 100644 Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml create mode 100644 Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml create mode 100644 Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml create mode 100644 Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml create mode 100644 Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml create mode 100644 Resources/Prototypes/BodySystem/body_system_dropped_items_default.yml create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/head_m.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_arm.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_foot.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_hand.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_leg.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/meta.json create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_arm.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_foot.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_hand.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_leg.png create mode 100644 Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/torso_m.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/brain_human.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/eyes_human.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/heart_human.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/kidneys_human.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/liver_human.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/lungs_human.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/meta.json create mode 100644 Resources/Textures/Objects/BodySystem/Organs/eyes_advanced.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/eyes_grey.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/kidneys_advanced.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/lungs_advanced.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/lungs_plasmaman.png create mode 100644 Resources/Textures/Objects/BodySystem/Organs/lungs_vox.png create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/bone_saw.png create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/cautery.png create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/drill.png create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/hemostat.png create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/meta.json create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/retractor.png create mode 100644 Resources/Textures/Objects/Surgery/surgery_tools.rsi/scalpel.png diff --git a/Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs b/Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs new file mode 100644 index 0000000000..382712cf84 --- /dev/null +++ b/Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs @@ -0,0 +1,53 @@ +using Content.Client.UserInterface; +using Content.Shared.BodySystem; +using Robust.Client.GameObjects.Components.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.ViewVariables; +using System.Collections.Generic; + +namespace Content.Client.BodySystem +{ + public class BodyScannerBoundUserInterface : BoundUserInterface + { + [ViewVariables] + private BodyScannerDisplay _display; + + [ViewVariables] + private BodyScannerTemplateData _template; + + [ViewVariables] + private Dictionary _parts; + + public BodyScannerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + _display = new BodyScannerDisplay(this); + _display.OnClose += Close; + _display.OpenCentered(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (!(state is BodyScannerInterfaceState scannerState)) + return; + + _template = scannerState.Template; + _parts = scannerState.Parts; + + _display.UpdateDisplay(_template, _parts); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + } + + } +} diff --git a/Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs b/Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs new file mode 100644 index 0000000000..0886b79c20 --- /dev/null +++ b/Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs @@ -0,0 +1,160 @@ +using Content.Client.BodySystem; +using Content.Shared.BodySystem; +using Robust.Client.Graphics.Drawing; +using Robust.Client.Interfaces.ResourceManagement; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.Utility; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.Utility; +using System; +using System.Collections.Generic; +using System.Globalization; +using static Robust.Client.UserInterface.Controls.ItemList; + +namespace Content.Client.UserInterface +{ + public sealed class BodyScannerDisplay : SS14Window + { + #pragma warning disable 649 + [Dependency] private readonly ILocalizationManager _loc; + #pragma warning restore 649 + + public BodyScannerBoundUserInterface Owner { get; private set; } + protected override Vector2? CustomSize => (800, 600); + private ItemList BodyPartList { get; } + private Label BodyPartLabel { get; } + private Label BodyPartHealth { get; } + private ItemList MechanismList { get; } + private RichTextLabel MechanismInfoLabel { get; } + + + private BodyScannerTemplateData _template; + private Dictionary _parts; + private List _slots; + private BodyScannerBodyPartData _currentBodyPart; + + + public BodyScannerDisplay(BodyScannerBoundUserInterface owner) + { + IoCManager.InjectDependencies(this); + Owner = owner; + Title = _loc.GetString("Body Scanner"); + + var hSplit = new HBoxContainer(); + Contents.AddChild(hSplit); + + //Left half + var scrollBox = new ScrollContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand, + }; + hSplit.AddChild(scrollBox); + BodyPartList = new ItemList { }; + scrollBox.AddChild(BodyPartList); + BodyPartList.OnItemSelected += BodyPartOnItemSelected; + + //Right half + var vSplit = new VBoxContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand, + }; + hSplit.AddChild(vSplit); + + //Top half of the right half + var limbBox = new VBoxContainer + { + SizeFlagsVertical = SizeFlags.FillExpand + }; + vSplit.AddChild(limbBox); + BodyPartLabel = new Label(); + limbBox.AddChild(BodyPartLabel); + var limbHealthHBox = new HBoxContainer(); + limbBox.AddChild(limbHealthHBox); + var healthLabel = new Label + { + Text = "Health: " + }; + limbHealthHBox.AddChild(healthLabel); + BodyPartHealth = new Label(); + limbHealthHBox.AddChild(BodyPartHealth); + var limbScroll = new ScrollContainer + { + SizeFlagsVertical = SizeFlags.FillExpand + }; + limbBox.AddChild(limbScroll); + MechanismList = new ItemList(); + limbScroll.AddChild(MechanismList); + MechanismList.OnItemSelected += MechanismOnItemSelected; + + //Bottom half of the right half + MechanismInfoLabel = new RichTextLabel + { + SizeFlagsVertical = SizeFlags.FillExpand + }; + vSplit.AddChild(MechanismInfoLabel); + } + + + public void UpdateDisplay(BodyScannerTemplateData template, Dictionary parts) + { + _template = template; + _parts = parts; + _slots = new List(); + foreach (var (key, value) in _parts) + { + _slots.Add(key); //We have to do this since ItemLists only return the index of what item is selected and dictionaries don't allow you to explicitly grab things by index. + //So we put the contents of the dictionary into a list so that we can grab the list by index. I don't know either. + BodyPartList.AddItem(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(key)); + } + } + + + public void BodyPartOnItemSelected(ItemListSelectedEventArgs args) + { + if(_parts.TryGetValue(_slots[args.ItemIndex], out _currentBodyPart)) { + UpdateBodyPartBox(_currentBodyPart, _slots[args.ItemIndex]); + } + } + private void UpdateBodyPartBox(BodyScannerBodyPartData part, string slotName) + { + BodyPartLabel.Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(slotName) + ": " + CultureInfo.CurrentCulture.TextInfo.ToTitleCase(part.Name); + BodyPartHealth.Text = part.CurrentDurability + "/" + part.MaxDurability; + + MechanismList.Clear(); + foreach (var mechanism in part.Mechanisms) { + MechanismList.AddItem(mechanism.Name); + } + } + + + public void MechanismOnItemSelected(ItemListSelectedEventArgs args) + { + UpdateMechanismBox(_currentBodyPart.Mechanisms[args.ItemIndex]); + } + private void UpdateMechanismBox(BodyScannerMechanismData mechanism) + { + //TODO: Make UI look less shit and clean up whatever the fuck this is lmao + if (mechanism != null) + { + string message = ""; + message += mechanism.Name; + message += "\nHealth: "; + message += mechanism.CurrentDurability; + message += "/"; + message += mechanism.MaxDurability; + message += "\n"; + message += mechanism.Description; + MechanismInfoLabel.SetMessage(message); + } + else + { + MechanismInfoLabel.SetMessage(""); + } + } + + + } +} diff --git a/Content.Client/Health/BodySystem/Surgery/ClientSurgeryToolComponent.cs b/Content.Client/Health/BodySystem/Surgery/ClientSurgeryToolComponent.cs new file mode 100644 index 0000000000..c9b1ce3333 --- /dev/null +++ b/Content.Client/Health/BodySystem/Surgery/ClientSurgeryToolComponent.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using Content.Shared.GameObjects.Components.Storage; +using Content.Client.Interfaces.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Players; +using Content.Shared.BodySystem; +using System.Globalization; + +namespace Content.Client.BodySystem +{ + [RegisterComponent] + public class ClientSurgeryToolComponent : SharedSurgeryToolComponent + { + private SurgeryToolWindow Window; + public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession session = null) + { + base.HandleNetworkMessage(message, channel, session); + + switch (message) + { + case OpenSurgeryUIMessage msg: + HandleOpenSurgeryUIMessage(); + break; + case CloseSurgeryUIMessage msg: + HandleCloseSurgeryUIMessage(); + break; + case UpdateSurgeryUIMessage msg: + HandleUpdateSurgeryUIMessage(msg); + break; + } + } + public override void OnAdd() + { + base.OnAdd(); + Window = new SurgeryToolWindow() { SurgeryToolEntity = this }; + } + + public override void OnRemove() + { + Window.Dispose(); + base.OnRemove(); + } + + private void HandleOpenSurgeryUIMessage() + { + Window.Open(); + } + private void HandleCloseSurgeryUIMessage() + { + Window.Close(); + } + private void HandleUpdateSurgeryUIMessage(UpdateSurgeryUIMessage surgeryUIState) + { + Window.BuildDisplay(surgeryUIState.Targets); + } + private class SurgeryToolWindow : SS14Window + { + private Control _VSplitContainer; + private VBoxContainer _bodyPartList; + public ClientSurgeryToolComponent SurgeryToolEntity; + + protected override Vector2? CustomSize => (300, 400); + + public SurgeryToolWindow() + { + Title = "Select surgery target..."; + RectClipContent = true; + + _VSplitContainer = new VBoxContainer(); + var listScrollContainer = new ScrollContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + HScrollEnabled = true, + VScrollEnabled = true + }; + _bodyPartList = new VBoxContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand + }; + listScrollContainer.AddChild(_bodyPartList); + _VSplitContainer.AddChild(listScrollContainer); + Contents.AddChild(_VSplitContainer); + } + + public override void Close() + { + SurgeryToolEntity.SendNetworkMessage(new CloseSurgeryUIMessage()); + base.Close(); + } + + public void BuildDisplay(Dictionary targets) + { + _bodyPartList.DisposeAllChildren(); + foreach (var(slotName, partname) in targets) + { + var button = new BodyPartButton(slotName); + button.ActualButton.OnToggled += OnButtonPressed; + button.LimbName.Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(slotName + " - " + partname); + + //button.SpriteView.Sprite = sprite; + + _bodyPartList.AddChild(button); + } + } + + private void OnButtonPressed(BaseButton.ButtonEventArgs args) + { + var parent = (BodyPartButton) args.Button.Parent; + SurgeryToolEntity.SendNetworkMessage(new SelectSurgeryUIMessage(parent.LimbSlotName)); + } + } + + private class BodyPartButton : PanelContainer + { + public Button ActualButton { get; } + public SpriteView SpriteView { get; } + public Control EntityControl { get; } + public Label LimbName { get; } + public string LimbSlotName { get; } + + public BodyPartButton(string slotName) + { + LimbSlotName = slotName; + ActualButton = new Button + { + SizeFlagsHorizontal = SizeFlags.FillExpand, + SizeFlagsVertical = SizeFlags.FillExpand, + ToggleMode = true, + MouseFilter = MouseFilterMode.Stop + }; + AddChild(ActualButton); + + var hBoxContainer = new HBoxContainer(); + SpriteView = new SpriteView + { + CustomMinimumSize = new Vector2(32.0f, 32.0f) + }; + LimbName = new Label + { + SizeFlagsVertical = SizeFlags.ShrinkCenter, + Text = "N/A", + }; + hBoxContainer.AddChild(SpriteView); + hBoxContainer.AddChild(LimbName); + + EntityControl = new Control + { + SizeFlagsHorizontal = SizeFlags.FillExpand + }; + hBoxContainer.AddChild(EntityControl); + AddChild(hBoxContainer); + } + } + } +} diff --git a/Content.Server/Health/BodySystem/BodyManagerComponent.cs b/Content.Server/Health/BodySystem/BodyManagerComponent.cs new file mode 100644 index 0000000000..a371fcdbd5 --- /dev/null +++ b/Content.Server/Health/BodySystem/BodyManagerComponent.cs @@ -0,0 +1,248 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using Content.Shared.BodySystem; +using Robust.Shared.ViewVariables; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Map; +using System.Linq; +using Content.Server.GameObjects.EntitySystems; + +namespace Content.Server.BodySystem { + + /// + /// Component representing the many BodyParts attached to each other. + /// + [RegisterComponent] + public class BodyManagerComponent : Component, IAttackHand { + + public sealed override string Name => "BodyManager"; +#pragma warning disable CS0649 + [Dependency] + private IPrototypeManager _prototypeManager; +#pragma warning restore + + [ViewVariables] + private BodyTemplate _template; + + [ViewVariables] + private Dictionary _partDictionary = new Dictionary(); + + /// + /// The BodyTemplate that this BodyManagerComponent is adhering to. + /// + public BodyTemplate Template => _template; + /// + /// Maps BodyTemplate slot name to the BodyPart object filling it (if there is one). + /// + public Dictionary PartDictionary => _partDictionary; + /// + /// List of all BodyParts in this body, taken from the keys of _parts. + /// + public IEnumerable Parts + { + get + { + return _partDictionary.Values; + } + } + + /// + /// Recursive search that returns whether a given BodyPart is connected to the center BodyPart. Not efficient (O(n^2)), but most bodies don't have a ton of BodyParts. + /// + protected bool ConnectedToCenterPart(BodyPart target) + { + List searchedSlots = new List { }; + if (TryGetSlotName(target, out string result)) + return false; + return ConnectedToCenterPartRecursion(searchedSlots, result); + } + + protected bool ConnectedToCenterPartRecursion(List searchedSlots, string slotName) + { + TryGetBodyPart(slotName, out BodyPart part); + if (part == GetCenterBodyPart()) + return true; + searchedSlots.Add(slotName); + if (TryGetBodyPartConnections(slotName, out List connections)) + { + foreach (string connection in connections) + { + if (!searchedSlots.Contains(connection) && ConnectedToCenterPartRecursion(searchedSlots, connection)) + return true; + } + } + return false; + + } + + /// + /// Returns the central BodyPart of this body based on the BodyTemplate. For humans, this is the torso. Returns null if not found. + /// + protected BodyPart GetCenterBodyPart() + { + _partDictionary.TryGetValue(_template.CenterSlot, out BodyPart center); + return center; + } + + /// + /// Grabs the BodyPart in the given slotName if there is one. Returns true if a BodyPart is found, false otherwise. If false, result will be null. + /// + protected bool TryGetBodyPart(string slotName, out BodyPart result) + { + return _partDictionary.TryGetValue(slotName, out result); + } + + /// + /// Grabs the slotName that the given BodyPart resides in. Returns true if the BodyPart is part of this body, false otherwise. If false, result will be null. + /// + protected bool TryGetSlotName(BodyPart part, out string result) + { + result = _partDictionary.FirstOrDefault(x => x.Value == part).Key; //We enforce that there is only one of each value in the dictionary, so we can iterate through the dictionary values to get the key from there. + return result == null; + } + + /// + /// Grabs the names of all connected slots to the given slotName from the template. Returns true if connections are found to the slotName, false otherwise. If false, connections will be null. + /// + protected bool TryGetBodyPartConnections(string slotName, out List connections) + { + return _template.Connections.TryGetValue(slotName, out connections); + } + + ///////// + ///////// Server-specific stuff + ///////// + + public bool AttackHand(AttackHandEventArgs eventArgs) + { + //TODO: remove organs? + return false; + } + + public override void ExposeData(ObjectSerializer serializer) { + base.ExposeData(serializer); + + string templateName = ""; + serializer.DataField(ref templateName, "BaseTemplate", "bodyTemplate.Humanoid"); + if (serializer.Reading) + { + if (!_prototypeManager.TryIndex(templateName, out BodyTemplatePrototype templateData)) + throw new InvalidOperationException("No BodyTemplatePrototype was found with the name " + templateName + " while loading a BodyTemplate!"); //Should never happen unless you fuck up the prototype. + + string presetName = ""; + serializer.DataField(ref presetName, "BasePreset", "bodyPreset.BasicHuman"); + if (!_prototypeManager.TryIndex(presetName, out BodyPresetPrototype presetData)) + throw new InvalidOperationException("No BodyPresetPrototype was found with the name " + presetName + " while loading a BodyPreset!"); //Should never happen unless you fuck up the prototype. + + _template = new BodyTemplate(templateData); + LoadBodyPreset(new BodyPreset(presetData)); + } + } + + /// + /// Loads the given preset - forcefully changes all limbs found in both the preset and this template! + /// + public void LoadBodyPreset(BodyPreset preset) + { + foreach (var (slotName, type) in _template.Slots) + { + if (!preset.PartIDs.TryGetValue(slotName, out string partID)) + { //For each slot in our BodyManagerComponent's template, try and grab what the ID of what the preset says should be inside it. + continue; //If the preset doesn't define anything for it, continue. + } + if (!_prototypeManager.TryIndex(partID, out BodyPartPrototype newPartData)) + { //Get the BodyPartPrototype corresponding to the BodyPart ID we grabbed. + throw new InvalidOperationException("BodyPart prototype with ID " + partID + " could not be found!"); + } + _partDictionary.Remove(slotName); //Try and remove an existing limb if that exists. + _partDictionary.Add(slotName, new BodyPart(newPartData)); //Add a new BodyPart with the BodyPartPrototype as a baseline to our BodyComponent. + } + } + + /// + /// Changes the current BodyTemplate to the new BodyTemplate. Attempts to keep previous BodyParts if there is a slot for them in both BodyTemplates. + /// + public void ChangeBodyTemplate(BodyTemplatePrototype newTemplate) + { + foreach (KeyValuePair part in _partDictionary) + { + //TODO: Make this work. + } + } + + /// + /// Grabs all limbs of the given type in this body. + /// + public List GetBodyPartsOfType(BodyPartType type) + { + List toReturn = new List(); + foreach (var (slotName, bodyPart) in _partDictionary) + { + if (bodyPart.PartType == type) + toReturn.Add(bodyPart); + } + return toReturn; + } + + /// + /// Disconnects the given BodyPart reference, potentially dropping other BodyParts if they were hanging off it. + /// + public void DisconnectBodyPart(BodyPart part, bool dropEntity) + { + if (!_partDictionary.ContainsValue(part)) + return; + if (part != null) + { + string slotName = _partDictionary.FirstOrDefault(x => x.Value == part).Key; + if (TryGetBodyPartConnections(slotName, out List connections)) //Call disconnect on all limbs that were hanging off this limb. + { + foreach (string connectionName in connections) //This loop is an unoptimized travesty. TODO: optimize to be less shit + { + if (TryGetBodyPart(connectionName, out BodyPart result) && !ConnectedToCenterPart(result)) + { + DisconnectBodyPartByName(connectionName, dropEntity); + } + } + } + _partDictionary.Remove(slotName); + if (dropEntity) + { + var partEntity = Owner.EntityManager.SpawnEntity("BaseDroppedBodyPart", Owner.Transform.GridPosition); + partEntity.GetComponent().TransferBodyPartData(part); + } + } + } + + /// + /// Internal string version of DisconnectBodyPart for performance purposes. + /// + private void DisconnectBodyPartByName(string name, bool dropEntity) + { + if (!TryGetBodyPart(name, out BodyPart part)) + return; + if (part != null) + { + if (TryGetBodyPartConnections(name, out List connections)) + { + foreach (string connectionName in connections) + { + if (TryGetBodyPart(connectionName, out BodyPart result) && !ConnectedToCenterPart(result)) + { + DisconnectBodyPartByName(connectionName, dropEntity); + } + } + } + _partDictionary.Remove(name); + if (dropEntity) + { + var partEntity = Owner.EntityManager.SpawnEntity("BaseDroppedBodyPart", Owner.Transform.GridPosition); + partEntity.GetComponent().TransferBodyPartData(part); + } + } + } + } +} diff --git a/Content.Server/Health/BodySystem/BodyPart/BodyPart.cs b/Content.Server/Health/BodySystem/BodyPart/BodyPart.cs new file mode 100644 index 0000000000..2d8f7d2495 --- /dev/null +++ b/Content.Server/Health/BodySystem/BodyPart/BodyPart.cs @@ -0,0 +1,226 @@ +using Content.Shared.BodySystem; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; + + + +namespace Content.Server.BodySystem +{ + + + /// + /// Data class representing a singular limb such as an arm or a leg. Typically held within a BodyManagerComponent, + /// which coordinates functions between BodyParts. + /// + public class BodyPart + { + + [ViewVariables] + private ISurgeryData _surgeryData; + + [ViewVariables] + private List _mechanisms = new List(); + + [ViewVariables] + private int _sizeUsed = 0; + + /// + /// Body part name. + /// + [ViewVariables] + public string Name { get; set; } + + /// + /// Plural version of this body part's name. + /// + [ViewVariables] + public string Plural { get; set; } + + /// + /// Path to the RSI that represents this BodyPart. + /// + [ViewVariables] + public string RSIPath { get; set; } + + /// + /// RSI state that represents this BodyPart. + /// + [ViewVariables] + public string RSIState { get; set; } + + /// + /// BodyPartType that this body part is considered. + /// + [ViewVariables] + public BodyPartType PartType { get; set; } + + /// + /// Max HP of this body part. + /// + [ViewVariables] + public int MaxDurability { get; set; } + + /// + /// Current HP of this body part based on sum of all damage types. + /// + [ViewVariables] + public int CurrentDurability => MaxDurability - CurrentDamages.Damage; + + /// + /// Current damage dealt to this BodyPart. + /// + [ViewVariables] + public AbstractDamageContainer CurrentDamages { get; set; } + + /// + /// At what HP this body part is completely destroyed. + /// + [ViewVariables] + public int DestroyThreshold { get; set; } + + /// + /// Armor of the body part against attacks. + /// + [ViewVariables] + public float Resistance { get; set; } + + /// + /// Determines many things: how many mechanisms can be fit inside a body part, fitting through tiny crevices, etc. + /// + [ViewVariables] + public int Size { get; set; } + + /// + /// What types of body parts this body part can attach to. For the most part, most limbs aren't universal and require extra work to attach between types. + /// + [ViewVariables] + public BodyPartCompatibility Compatibility { get; set; } + + /// + /// List of IExposeData properties, allowing for additional data classes to be attached to a limb, such as a "length" class to an arm. + /// + [ViewVariables] + public List Properties { get; set; } + + /// + /// List of all Mechanisms currently inside this BodyPart. + /// + [ViewVariables] + public List Mechanisms => _mechanisms; + + public BodyPart(){} + + public BodyPart(BodyPartPrototype data) + { + LoadFromPrototype(data); + } + + + + + /// + /// Attempts to add a Mechanism. Returns true if successful, false if there was an error (e.g. not enough room in BodyPart). Use InstallDroppedMechanism if you want to easily install an IEntity with a DroppedMechanismComponent. + /// + public bool InstallMechanism(Mechanism mechanism) + { + if (_sizeUsed + mechanism.Size > Size) + return false; //No space + _mechanisms.Add(mechanism); + _sizeUsed += mechanism.Size; + return true; + } + + /// + /// Attempts to install a DroppedMechanismComponent into the given limb, potentially deleting the dropped IEntity. Returns true if successful, false if there was an error (e.g. not enough room in BodyPart). + /// + public bool InstallDroppedMechanism(DroppedMechanismComponent droppedMechanism) + { + if (_sizeUsed + droppedMechanism.ContainedMechanism.Size > Size) + return false; //No space + InstallMechanism(droppedMechanism.ContainedMechanism); + droppedMechanism.Owner.Delete(); + return true; + } + + /// + /// Tries to remove the given Mechanism reference from the given BodyPart reference. Returns null if there was an error in spawning the entity or removing the mechanism, otherwise returns a reference to the DroppedMechanismComponent on the newly spawned entity. + /// + public DroppedMechanismComponent DropMechanism(IEntity dropLocation, Mechanism mechanismTarget) + { + if (!_mechanisms.Contains(mechanismTarget)) + return null; + _mechanisms.Remove(mechanismTarget); + _sizeUsed -= mechanismTarget.Size; + IEntityManager entityManager = IoCManager.Resolve(); + var mechanismEntity = entityManager.SpawnEntity("BaseDroppedMechanism", dropLocation.Transform.GridPosition); + var droppedMechanism = mechanismEntity.GetComponent(); + droppedMechanism.InitializeDroppedMechanism(mechanismTarget); + return droppedMechanism; + } + + /// + /// Tries to destroy the given Mechanism in the given BodyPart. Returns false if there was an error, true otherwise. Does NOT spawn a dropped entity. + /// + public bool DestroyMechanism(BodyPart bodyPartTarget, Mechanism mechanismTarget) + { + if (!_mechanisms.Contains(mechanismTarget)) + return false; + _mechanisms.Remove(mechanismTarget); + _sizeUsed -= mechanismTarget.Size; + return true; + } + + /// + /// Returns whether the given SurgertToolType can be used on the current state of this BodyPart (e.g. + /// + public bool SurgeryCheck(SurgeryToolType toolType) + { + return _surgeryData.CheckSurgery(toolType); + } + + /// + /// Attempts to perform surgery on this BodyPart with the given tool. Returns false if there was an error, true if successful. + /// + public bool AttemptSurgery(SurgeryToolType toolType, BodyManagerComponent target, IEntity performer) + { + return _surgeryData.PerformSurgery(toolType, target, performer); + } + + /// + /// Loads the given BodyPartPrototype - current data on this BodyPart will be overwritten! + /// + public virtual void LoadFromPrototype(BodyPartPrototype data) + { + Name = data.Name; + Plural = data.Plural; + PartType = data.PartType; + RSIPath = data.RSIPath; + RSIState = data.RSIState; + MaxDurability = data.Durability; + CurrentDamages = new BiologicalDamageContainer(); + Resistance = data.Resistance; + Size = data.Size; + Compatibility = data.Compatibility; + Properties = data.Properties; + //_surgeryData = (ISurgeryData) Activator.CreateInstance(null, data.SurgeryDataName); + //TODO: figure out a way to convert a string name in the YAML to the proper class (reflection won't work for reasons) + _surgeryData = new BiologicalSurgeryData(this); + IPrototypeManager prototypeManager = IoCManager.Resolve(); + foreach (string mechanismPrototypeID in data.Mechanisms) + { + if (!prototypeManager.TryIndex(mechanismPrototypeID, out MechanismPrototype mechanismData)) + { + throw new InvalidOperationException("No MechanismPrototype was found with the name " + mechanismPrototypeID + " while loading a BodyPartPrototype!"); + } + _mechanisms.Add(new Mechanism(mechanismData)); + } + + } + } +} diff --git a/Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs b/Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs new file mode 100644 index 0000000000..56c787034d --- /dev/null +++ b/Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs @@ -0,0 +1,36 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using Content.Shared.BodySystem; +using Robust.Shared.ViewVariables; +using System.Globalization; +using Robust.Server.GameObjects; + +namespace Content.Server.BodySystem { + + /// + /// Component containing the data for a dropped BodyPart entity. + /// + [RegisterComponent] + public class DroppedBodyPartComponent : Component { + + public sealed override string Name => "DroppedBodyPart"; + + [ViewVariables] + private BodyPart _containedBodyPart; + + public void TransferBodyPartData(BodyPart data) + { + _containedBodyPart = data; + Owner.Name = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(_containedBodyPart.Name); + if (Owner.TryGetComponent(out SpriteComponent component)) + { + component.LayerSetRSI(0, data.RSIPath); + component.LayerSetState(0, data.RSIState); + } + } + } +} diff --git a/Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs b/Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs new file mode 100644 index 0000000000..b8d9523de6 --- /dev/null +++ b/Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.BodySystem { + + /// + /// Stores data on what BodyPart(Prototypes) should fill a BodyTemplate. Used for loading complete body presets, like a "basic human" with all human limbs. + /// + public class BodyPreset { + private string _name; + private Dictionary _partIDs; + + [ViewVariables] + public string Name => _name; + + /// + /// Maps a template slot to the ID of the BodyPart that should fill it. E.g. "right arm" : "BodyPart.arm.basic_human". + /// + [ViewVariables] + public Dictionary PartIDs => _partIDs; + + public BodyPreset(BodyPresetPrototype data) + { + LoadFromPrototype(data); + } + + public virtual void LoadFromPrototype(BodyPresetPrototype data) + { + _name = data.Name; + _partIDs = data.PartIDs; + } + } +} diff --git a/Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs b/Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs new file mode 100644 index 0000000000..bcd47e7afa --- /dev/null +++ b/Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs @@ -0,0 +1,71 @@ +using Content.Server.GameObjects.EntitySystems; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Content.Shared.BodySystem; + + +namespace Content.Server.BodySystem +{ + [RegisterComponent] + [ComponentReference(typeof(IActivate))] + public class BodyScannerComponent : Component, IActivate + { + public sealed override string Name => "BodyScanner"; + + private BoundUserInterface _userInterface; + + public override void Initialize() + { + base.Initialize(); + _userInterface = Owner.GetComponent().GetBoundUserInterface(BodyScannerUiKey.Key); + _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; + } + + private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage serverMsg) + { + + } + + void IActivate.Activate(ActivateEventArgs eventArgs) + { + if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + { + return; + } + if (actor.playerSession.AttachedEntity.TryGetComponent(out BodyManagerComponent attempt)) + { + _userInterface.SetState(PrepareBodyScannerInterfaceState(attempt.Template, attempt.PartDictionary)); + } + _userInterface.Open(actor.playerSession); + } + + + /// + /// Copy BodyTemplate and BodyPart data into a common data class that the client can read. + /// + private BodyScannerInterfaceState PrepareBodyScannerInterfaceState(BodyTemplate template, Dictionary bodyParts) + { + Dictionary partsData = new Dictionary(); + foreach (var(slotname, bpart) in bodyParts) { + List mechanismData = new List(); + foreach (var mech in bpart.Mechanisms) + { + mechanismData.Add(new BodyScannerMechanismData(mech.Name, mech.Description, mech.RSIPath, mech.RSIState, mech.MaxDurability, mech.CurrentDurability)); + } + partsData.Add(slotname, new BodyScannerBodyPartData(bpart.Name, bpart.RSIPath, bpart.RSIState, bpart.MaxDurability, bpart.CurrentDurability, mechanismData)); + } + BodyScannerTemplateData templateData = new BodyScannerTemplateData(template.Name, template.Slots); + return new BodyScannerInterfaceState(partsData, templateData); + } + + } +} diff --git a/Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs b/Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs new file mode 100644 index 0000000000..93680973d4 --- /dev/null +++ b/Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.BodySystem { + + /// + /// This class is a data capsule representing the standard format of a body. For instance, the "humanoid" BodyTemplate + /// defines two arms, each connected to a torso and so on. Capable of loading data from a BodyTemplatePrototype. + /// + public class BodyTemplate { + + private int _hash; + private string _name; + private string _centerSlot; + private Dictionary _slots = new Dictionary(); + private Dictionary> _connections = new Dictionary>(); + + [ViewVariables] + public int Hash => _hash; + + [ViewVariables] + public string Name => _name; + + /// + /// The name of the center BodyPart. For humans, this is set to "torso". Used in many calculations. + /// + [ViewVariables] + public string CenterSlot => _centerSlot; + + /// + /// Maps all parts on this template to its BodyPartType. For instance, "right arm" is mapped to "BodyPartType.arm" on the humanoid template. + /// + [ViewVariables] + public Dictionary Slots => _slots; + + /// + /// Maps limb name to the list of their connections to other limbs. For instance, on the humanoid template "torso" is mapped to a list containing "right arm", "left arm", + /// "left leg", and "right leg". Only one of the limbs in a connection has to map it, i.e. humanoid template chooses to map "head" to "torso" and not the other way around. + /// + [ViewVariables] + public Dictionary> Connections => _connections; + + public BodyTemplate() + { + _name = "empty"; + } + + public BodyTemplate(BodyTemplatePrototype data) + { + LoadFromPrototype(data); + } + + /// + /// Somewhat costly operation. Stores an integer unique to this exact BodyTemplate in _hash when called. + /// + private void CacheHashCode() + { + int hash = 0; + foreach (var(key, value) in _slots) + { + hash = HashCode.Combine(hash, key.GetHashCode()); + } + foreach (var (key, value) in _connections) + { + hash = HashCode.Combine(hash, key.GetHashCode()); + foreach (var connection in value) + { + hash = HashCode.Combine(hash, connection.GetHashCode()); + } + } + _hash = hash; + } + + public virtual void LoadFromPrototype(BodyTemplatePrototype data) + { + _name = data.Name; + _centerSlot = data.CenterSlot; + _slots = data.Slots; + _connections = data.Connections; + CacheHashCode(); + } + } +} diff --git a/Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs b/Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs new file mode 100644 index 0000000000..95a007f226 --- /dev/null +++ b/Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs @@ -0,0 +1,45 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using Content.Shared.BodySystem; +using Robust.Shared.ViewVariables; +using System.Globalization; +using Robust.Server.GameObjects; + +namespace Content.Server.BodySystem { + + /// + /// Component containing the data for a dropped Mechanism entity. + /// + [RegisterComponent] + public class DroppedMechanismComponent : Component + { + + #pragma warning disable CS0649 + [Dependency] + private IPrototypeManager _prototypeManager; + #pragma warning restore + + public sealed override string Name => "DroppedMechanism"; + + [ViewVariables] + private Mechanism _containedMechanism; + + public Mechanism ContainedMechanism => _containedMechanism; + + public void InitializeDroppedMechanism(Mechanism data) + { + _containedMechanism = data; + Owner.Name = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(_containedMechanism.Name); + if (Owner.TryGetComponent(out SpriteComponent component)) + { + component.LayerSetRSI(0, data.RSIPath); + component.LayerSetState(0, data.RSIState); + } + } + } +} + diff --git a/Content.Server/Health/BodySystem/Mechanism/Mechanism.cs b/Content.Server/Health/BodySystem/Mechanism/Mechanism.cs new file mode 100644 index 0000000000..acc669e774 --- /dev/null +++ b/Content.Server/Health/BodySystem/Mechanism/Mechanism.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using Content.Shared.BodySystem; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + + + + +namespace Content.Server.BodySystem { + + /// + /// Data class representing a persistent item inside a BodyPart. This includes livers, eyes, cameras, brains, explosive implants, binary communicators, etc. + /// + public class Mechanism { + + [ViewVariables] + public string Name { get; set; } + + /// + /// Description shown in a mechanism installation console or when examining an uninstalled mechanism. + /// + [ViewVariables] + public string Description { get; set; } + + /// + /// The message to display upon examining a mob with this mechanism installed. If the string is empty (""), no message will be displayed. + /// + [ViewVariables] + public string ExamineMessage { get; set; } + + /// + /// Path to the RSI that represents this Mechanism. + /// + [ViewVariables] + public string RSIPath { get; set; } + + /// + /// RSI state that represents this Mechanism. + /// + [ViewVariables] + public string RSIState { get; set; } + + /// + /// Max HP of this mechanism. + /// + [ViewVariables] + public int MaxDurability { get; set; } + + /// + /// Current HP of this mechanism. + /// + [ViewVariables] + public int CurrentDurability { get; set; } + + /// + /// At what HP this mechanism is completely destroyed. + /// + [ViewVariables] + public int DestroyThreshold { get; set; } + + /// + /// Armor of this mechanism against attacks. + /// + [ViewVariables] + public int Resistance { get; set; } + + /// + /// Determines a handful of things - mostly whether this mechanism can fit into a BodyPart. + /// + [ViewVariables] + public int Size { get; set; } + + /// + /// What kind of BodyParts this mechanism can be installed into. + /// + [ViewVariables] + public BodyPartCompatibility Compatibility { get; set; } + + public Mechanism(MechanismPrototype data) + { + LoadFromPrototype(data); + } + + /// + /// Loads the given MechanismPrototype - current data on this Mechanism will be overwritten! + /// + public void LoadFromPrototype(MechanismPrototype data) + { + Name = data.Name; + Description = data.Description; + ExamineMessage = data.ExamineMessage; + RSIPath = data.RSIPath; + RSIState = data.RSIState; + MaxDurability = data.Durability; + CurrentDurability = MaxDurability; + DestroyThreshold = data.DestroyThreshold; + Resistance = data.Resistance; + Size = data.Size; + Compatibility = data.Compatibility; + } + } +} + diff --git a/Content.Server/Health/BodySystem/Surgery/ServerSurgeryToolComponent.cs b/Content.Server/Health/BodySystem/Surgery/ServerSurgeryToolComponent.cs new file mode 100644 index 0000000000..07bca79b8c --- /dev/null +++ b/Content.Server/Health/BodySystem/Surgery/ServerSurgeryToolComponent.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using Content.Server.BodySystem; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.BodySystem; +using Content.Shared.GameObjects; +using Content.Shared.GameObjects.Components.Items; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Server.Interfaces.Player; +using Robust.Server.Player; +using Robust.Shared.Enums; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Interfaces.Physics; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Maths; +using Robust.Shared.Players; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Weapon.Melee +{ + + [RegisterComponent] + public class ServerSurgeryToolComponent : SharedSurgeryToolComponent, IAfterAttack + { +#pragma warning disable 649 + [Dependency] private readonly IMapManager _mapManager; + [Dependency] private readonly IEntitySystemManager _entitySystemManager; + [Dependency] private readonly IPhysicsManager _physicsManager; +#pragma warning restore 649 + + public HashSet SubscribedSessions = new HashSet(); + private Dictionary _surgeryOptionsCache = new Dictionary(); + private BodyManagerComponent _targetCache; + private IEntity _performerCache; + + void IAfterAttack.AfterAttack(AfterAttackEventArgs eventArgs) + { + if (eventArgs.Attacked == null) + return; + if (eventArgs.Attacked.TryGetComponent(out BodySystem.BodyManagerComponent bodyManager)) + { + _surgeryOptionsCache.Clear(); + var toSend = new Dictionary(); + foreach (var(key, value) in bodyManager.PartDictionary) { + if (value.SurgeryCheck(_surgeryToolClass)) + { + _surgeryOptionsCache.Add(key, value); + toSend.Add(key, value.Name); + } + } + if (_surgeryOptionsCache.Count > 0) + { + OpenSurgeryUI(eventArgs.User); + UpdateSurgeryUI(eventArgs.User, toSend); + _performerCache = eventArgs.User; + _targetCache = bodyManager; + } + } + } + + /// + /// Called after the user selects a surgery target. + /// + void PerformSurgery(SelectSurgeryUIMessage msg) + { + //TODO: sanity checks to see whether user is in range, body is still same, etc etc + if (!_surgeryOptionsCache.TryGetValue(msg.TargetSlot, out BodyPart target)) + { + Logger.Debug("Error when trying to perform surgery on bodypart in slot " + msg.TargetSlot + ": it was not found!"); + throw new InvalidOperationException(); + } + if (!target.AttemptSurgery(_surgeryToolClass, _targetCache, _performerCache)) + { + Logger.Debug("Error when trying to perform surgery on bodypart " + target.Name + "!"); + throw new InvalidOperationException(); + } + CloseSurgeryUI(_performerCache); + } + + + public void OpenSurgeryUI(IEntity character) + { + var user_session = character.GetComponent().playerSession; + SubscribeSession(user_session); + SendNetworkMessage(new OpenSurgeryUIMessage(), user_session.ConnectedClient); + } + public void UpdateSurgeryUI(IEntity character, Dictionary options) + { + var user_session = character.GetComponent().playerSession; + if (user_session.AttachedEntity == null) + { + UnsubscribeSession(user_session); + return; + } + SendNetworkMessage(new UpdateSurgeryUIMessage(options), user_session.ConnectedClient); + } + public void CloseSurgeryUI(IEntity character) + { + var user_session = character.GetComponent().playerSession; + SubscribeSession(user_session); + SendNetworkMessage(new CloseSurgeryUIMessage(), user_session.ConnectedClient); + } + + public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession session = null) + { + base.HandleNetworkMessage(message, channel, session); + + if (session == null) + { + throw new ArgumentException(nameof(session)); + } + + switch (message) + { + case CloseSurgeryUIMessage msg: + UnsubscribeSession(session as IPlayerSession); + break; + case SelectSurgeryUIMessage msg: + PerformSurgery(msg); + break; + } + } + + + public void SubscribeSession(IPlayerSession session) + { + if (!SubscribedSessions.Contains(session)) + { + session.PlayerStatusChanged += HandlePlayerSessionChangeEvent; + SubscribedSessions.Add(session); + } + } + public void UnsubscribeSession(IPlayerSession session) + { + if (SubscribedSessions.Contains(session)) + { + SubscribedSessions.Remove(session); + SendNetworkMessage(new CloseSurgeryUIMessage(), session.ConnectedClient); + } + } + public void HandlePlayerSessionChangeEvent(object obj, SessionStatusEventArgs SSEA) + { + if (SSEA.NewStatus != SessionStatus.InGame) + { + UnsubscribeSession(SSEA.Session); + } + } + } +} diff --git a/Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs b/Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs new file mode 100644 index 0000000000..ee3b5b9800 --- /dev/null +++ b/Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using Content.Shared.BodySystem; +using Content.Shared.Interfaces; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Server.BodySystem { + + /// + /// Data class representing the surgery state of a biological entity. + /// + public class BiologicalSurgeryData : ISurgeryData { + + protected bool _skinOpened = false; + protected bool _vesselsClamped = false; + protected bool _skinRetracted = false; + protected Mechanism _targetOrgan; + + public BiologicalSurgeryData(BodyPart parent) : base(parent) { } + + public override SurgeryAction GetSurgeryStep(SurgeryToolType toolType) + { + if (_skinOpened) + { + if (_vesselsClamped) + { + if (_skinRetracted) + { + if (_targetOrgan != null && toolType == SurgeryToolType.VesselCompression) + return RemoveOrganSurgery; + if (toolType == SurgeryToolType.Incision) //_targetOrgan is potentially given a value by DisconnectOrganSurgery. + return DisconnectOrganSurgery; + else if (toolType == SurgeryToolType.Cauterization) + return CautizerizeIncisionSurgery; + } + else + { + if (toolType == SurgeryToolType.Retraction) + return RetractSkinSurgery; + else if (toolType == SurgeryToolType.Cauterization) + return CautizerizeIncisionSurgery; + } + } + else + { + if (toolType == SurgeryToolType.VesselCompression) + return ClampVesselsSurgery; + else if (toolType == SurgeryToolType.Cauterization) + return CautizerizeIncisionSurgery; + } + } + else + { + if (toolType == SurgeryToolType.Incision) + return OpenSkinSurgery; + } + return null; + } + + protected void OpenSkinSurgery(BodyManagerComponent target, IEntity performer) + { + ILocalizationManager localizationManager = IoCManager.Resolve(); + performer.PopupMessage(performer, localizationManager.GetString("Cut open the skin...")); + //Delay? + _skinOpened = true; + } + protected void ClampVesselsSurgery(BodyManagerComponent target, IEntity performer) + { + ILocalizationManager localizationManager = IoCManager.Resolve(); + performer.PopupMessage(performer, localizationManager.GetString("Clamp the vessels...")); + //Delay? + _vesselsClamped = true; + } + protected void RetractSkinSurgery(BodyManagerComponent target, IEntity performer) + { + ILocalizationManager localizationManager = IoCManager.Resolve(); + performer.PopupMessage(performer, localizationManager.GetString("Retract the skin...")); + //Delay? + _skinRetracted = true; + } + protected void CautizerizeIncisionSurgery(BodyManagerComponent target, IEntity performer) + { + ILocalizationManager localizationManager = IoCManager.Resolve(); + performer.PopupMessage(performer, localizationManager.GetString("Cauterize the incision...")); + //Delay? + _skinOpened = false; + _vesselsClamped = false; + _skinRetracted = false; + } + protected void DisconnectOrganSurgery(BodyManagerComponent target, IEntity performer) + { + Mechanism mechanismTarget = null; + //TODO: figureout popup, right now it just takes the first organ available if there is one + if (_parent.Mechanisms.Count > 0) + mechanismTarget = _parent.Mechanisms[0]; + if (mechanismTarget != null) + { + ILocalizationManager localizationManager = IoCManager.Resolve(); + performer.PopupMessage(performer, localizationManager.GetString("Detach the organ...")); + //Delay? + _targetOrgan = mechanismTarget; + } + + } + protected void RemoveOrganSurgery(BodyManagerComponent target, IEntity performer) + { + if (_targetOrgan != null) + { + ILocalizationManager localizationManager = IoCManager.Resolve(); + performer.PopupMessage(performer, localizationManager.GetString("Remove the organ...")); + //Delay? + _parent.DropMechanism(performer, _targetOrgan); + } + } + } +} diff --git a/Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs b/Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs new file mode 100644 index 0000000000..76b3e2d63a --- /dev/null +++ b/Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using Content.Shared.BodySystem; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Server.BodySystem { + + + + /// + /// This data class represents the state of a BodyPart in regards to everything surgery related - whether there's an incision on it, whether the bone is broken, etc. + /// + public abstract class ISurgeryData { + + /// + /// The BodyPart this surgeryData is attached to. The ISurgeryData class should not exist without a BodyPart that it represents, and will not work correctly without it. + /// + protected BodyPart _parent; + /// + /// The BodyPartType of the parent PartType. + /// + protected BodyPartType _parentType => _parent.PartType; + public delegate void SurgeryAction(BodyManagerComponent target, IEntity performer); + + public ISurgeryData(BodyPart parent) + { + _parent = parent; + } + + /// + /// Gets the delegate corresponding to the surgery step using the given SurgeryToolType. Returns null if no surgery step can be performed. + /// + public abstract SurgeryAction GetSurgeryStep(SurgeryToolType toolType); + + /// + /// Returns whether the given SurgeryToolType can be used to perform a surgery. + /// + public bool CheckSurgery(SurgeryToolType toolType) + { + return GetSurgeryStep(toolType) != null; + } + + /// + /// Attempts to perform surgery with the given tooltype. Returns whether the operation was successful. + /// + /// /// The SurgeryToolType used for this surgery. + /// /// The entity performing the surgery. + public bool PerformSurgery(SurgeryToolType toolType, BodyManagerComponent target, IEntity performer) + { + SurgeryAction step = GetSurgeryStep(toolType); + if (step == null) + return false; + step(target, performer); + return true; + } + + } +} diff --git a/Content.Shared/GameObjects/ContentNetIDs.cs b/Content.Shared/GameObjects/ContentNetIDs.cs index 854628acc0..48c9344b9a 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -44,5 +44,7 @@ public const uint GHOST = 1039; public const uint MICROWAVE = 1040; public const uint GRAVITY_GENERATOR = 1041; + public const uint SURGERY = 1042; + } } diff --git a/Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs b/Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs new file mode 100644 index 0000000000..5ae478412c --- /dev/null +++ b/Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs @@ -0,0 +1,17 @@ + + +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Serialization; +using System; + +namespace Content.Shared.BodySystem { + + [NetSerializable, Serializable] + class ArmLength : IExposeData { + private float _length; + + public void ExposeData(ObjectSerializer serializer){ + serializer.DataField(ref _length, "length", 2f); + } + } +} diff --git a/Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs b/Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs new file mode 100644 index 0000000000..4edc6a1d8d --- /dev/null +++ b/Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + + +namespace Content.Shared.BodySystem { + + + /// + /// Prototype for the BodyPart class. + /// + [Prototype("bodyPart")] + [NetSerializable, Serializable] + public class BodyPartPrototype : IPrototype, IIndexedPrototype { + private string _id; + private string _name; + private string _plural; + private string _rsiPath; + private string _rsiState; + private BodyPartType _partType; + private int _durability; + private int _destroyThreshold; + private float _resistance; + private int _size; + private BodyPartCompatibility _compatibility; + private string _surgeryDataName; + private List _properties; + private List _mechanisms; + + [ViewVariables] + public string ID => _id; + + [ViewVariables] + public string Name => _name; + + [ViewVariables] + public string Plural => _plural; + + [ViewVariables] + public string RSIPath => _rsiPath; + + [ViewVariables] + public string RSIState => _rsiState; + + [ViewVariables] + public BodyPartType PartType => _partType; + + [ViewVariables] + public int Durability => _durability; + + [ViewVariables] + public int DestroyThreshold => _destroyThreshold; + + [ViewVariables] + public float Resistance => _resistance; + + [ViewVariables] + public int Size => _size; + + [ViewVariables] + public BodyPartCompatibility Compatibility => _compatibility; + + [ViewVariables] + public string SurgeryDataName => _surgeryDataName; + + [ViewVariables] + public List Properties => _properties; + + [ViewVariables] + public List Mechanisms => _mechanisms; + + public virtual void LoadFrom(YamlMappingNode mapping){ + var serializer = YamlObjectSerializer.NewReader(mapping); + + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _plural, "plural", string.Empty); + serializer.DataField(ref _rsiPath, "rsiPath", string.Empty); + serializer.DataField(ref _rsiState, "rsiState", string.Empty); + serializer.DataField(ref _partType, "partType", BodyPartType.Other); + serializer.DataField(ref _surgeryDataName, "surgeryDataType", "BiologicalSurgeryData"); + serializer.DataField(ref _durability, "durability", 50); + serializer.DataField(ref _destroyThreshold, "destroyThreshold", -50); + serializer.DataField(ref _resistance, "resistance", 0f); + serializer.DataField(ref _size, "size", 0); + serializer.DataField(ref _compatibility, "compatibility", BodyPartCompatibility.Universal); + serializer.DataField(ref _properties, "properties", new List()); + serializer.DataField(ref _mechanisms, "mechanisms", new List()); + } + } +} diff --git a/Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs b/Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs new file mode 100644 index 0000000000..7020bdf84c --- /dev/null +++ b/Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.BodySystem { + + /// + /// Prototype for the BodyPreset class. + /// + [Prototype("bodyPreset")] + [NetSerializable, Serializable] + public class BodyPresetPrototype : IPrototype, IIndexedPrototype { + private string _id; + private string _name; + private Dictionary _partIDs; + + [ViewVariables] + public string ID => _id; + + [ViewVariables] + public string Name => _name; + + [ViewVariables] + public Dictionary PartIDs => _partIDs; + + public virtual void LoadFrom(YamlMappingNode mapping){ + var serializer = YamlObjectSerializer.NewReader(mapping); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _partIDs, "partIDs", new Dictionary()); + } + } +} diff --git a/Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs b/Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs new file mode 100644 index 0000000000..ef4611b5d9 --- /dev/null +++ b/Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs @@ -0,0 +1,89 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + + +namespace Content.Shared.BodySystem +{ + + + [NetSerializable, Serializable] + public enum BodyScannerUiKey + { + Key + } + + [NetSerializable, Serializable] + public class BodyScannerInterfaceState : BoundUserInterfaceState + { + public readonly Dictionary Parts; + public readonly BodyScannerTemplateData Template; + public BodyScannerInterfaceState(Dictionary parts, BodyScannerTemplateData template) + { + Template = template; + Parts = parts; + } + } + + [NetSerializable, Serializable] + public class BodyScannerBodyPartData + { + public readonly string Name; + public readonly string RSIPath; + public readonly string RSIState; + public readonly int MaxDurability; + public readonly int CurrentDurability; + public readonly List Mechanisms; + public BodyScannerBodyPartData(string name, string rsiPath, string rsiState, int maxDurability, int currentDurability, List mechanisms) + { + Name = name; + RSIPath = rsiPath; + RSIState = rsiState; + MaxDurability = maxDurability; + CurrentDurability = currentDurability; + Mechanisms = mechanisms; + } + } + + [NetSerializable, Serializable] + public class BodyScannerMechanismData + { + public readonly string Name; + public readonly string Description; + public readonly string RSIPath; + public readonly string RSIState; + public readonly int MaxDurability; + public readonly int CurrentDurability; + public BodyScannerMechanismData(string name, string description, string rsiPath, string rsiState, int maxDurability, int currentDurability) + { + Name = name; + Description = description; + RSIPath = rsiPath; + RSIState = rsiState; + MaxDurability = maxDurability; + CurrentDurability = currentDurability; + } + } + + [NetSerializable, Serializable] + public class BodyScannerTemplateData + { + public readonly string Name; + public readonly Dictionary Slots; + public BodyScannerTemplateData(string name, Dictionary slots) + { + Name = name; + Slots = slots; + } + } +} + + diff --git a/Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs b/Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs new file mode 100644 index 0000000000..aa49a59484 --- /dev/null +++ b/Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.BodySystem { + + /// + /// Prototype for the BodyTemplate class. + /// + [Prototype("bodyTemplate")] + [NetSerializable, Serializable] + public class BodyTemplatePrototype : IPrototype, IIndexedPrototype { + private string _id; + private string _name; + private string _centerSlot; + private Dictionary _slots; + private Dictionary> _connections; + + [ViewVariables] + public string ID => _id; + + [ViewVariables] + public string Name => _name; + + [ViewVariables] + public string CenterSlot => _centerSlot; + + [ViewVariables] + public Dictionary Slots => _slots; + + [ViewVariables] + public Dictionary> Connections => _connections; + + public virtual void LoadFrom(YamlMappingNode mapping){ + var serializer = YamlObjectSerializer.NewReader(mapping); + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _centerSlot, "centerSlot", string.Empty); + serializer.DataField(ref _slots, "slots", new Dictionary()); + serializer.DataField(ref _connections, "connections", new Dictionary>()); + + + //Our prototypes don't force the user to define a BodyPart connection twice. E.g. Head: Torso v.s. Torso: Head. + //The user only has to do one. We want it to be that way in the code, though, so this cleans that up. + Dictionary> cleanedConnections = new Dictionary>(); + foreach (var (targetSlotName, slotType) in _slots) + { + List tempConnections = new List(); + foreach (var (slotName, slotConnections) in _connections) + { + if (slotName == targetSlotName){ + foreach (string connection in slotConnections) { + if (!tempConnections.Contains(connection)) + tempConnections.Add(connection); + } + } + else if (slotConnections.Contains(slotName)) + { + tempConnections.Add(slotName); + } + } + if(tempConnections.Count > 0) + cleanedConnections.Add(targetSlotName, tempConnections); + } + _connections = cleanedConnections; + } + } +} diff --git a/Content.Shared/Health/BodySystem/BodysystemValues.cs b/Content.Shared/Health/BodySystem/BodysystemValues.cs new file mode 100644 index 0000000000..38518565b6 --- /dev/null +++ b/Content.Shared/Health/BodySystem/BodysystemValues.cs @@ -0,0 +1,9 @@ + +namespace Content.Shared.BodySystem +{ + public enum BodyPartCompatibility { Mechanical, Biological, Universal }; + public enum BodyPartType { Other, Torso, Head, Arm, Hand, Leg, Foot }; + public enum SurgeryToolType { Incision, Retraction, Cauterization, VesselCompression, Drilling, BoneSawing, Amputation } + + +} diff --git a/Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs b/Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs new file mode 100644 index 0000000000..206e5f28de --- /dev/null +++ b/Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + + + + +namespace Content.Shared.BodySystem { + + /// + /// Prototype for the Mechanism class. + /// + [Prototype("mechanism")] + [NetSerializable, Serializable] + public class MechanismPrototype : IPrototype, IIndexedPrototype { + private string _id; + private string _name; + private string _description; + private string _examineMessage; + private string _spritePath; + private string _rsiPath; + private string _rsiState; + private int _durability; + private int _destroyThreshold; + private int _resistance; + private int _size; + private BodyPartCompatibility _compatibility; + + [ViewVariables] + public string ID => _id; + + [ViewVariables] + public string Name => _name; + + [ViewVariables] + public string Description => _description; + + [ViewVariables] + public string ExamineMessage => _examineMessage; + + [ViewVariables] + public string RSIPath => _rsiPath; + + [ViewVariables] + public string RSIState => _rsiState; + + [ViewVariables] + public int Durability => _durability; + + [ViewVariables] + public int DestroyThreshold => _destroyThreshold; + + [ViewVariables] + public int Resistance => _resistance; + + [ViewVariables] + public int Size => _size; + + [ViewVariables] + public BodyPartCompatibility Compatibility => _compatibility; + + public virtual void LoadFrom(YamlMappingNode mapping){ + var serializer = YamlObjectSerializer.NewReader(mapping); + + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _description, "description", string.Empty); + serializer.DataField(ref _examineMessage, "examineMessage", string.Empty); + serializer.DataField(ref _rsiPath, "rsiPath", string.Empty); + serializer.DataField(ref _rsiState, "rsiState", string.Empty); + serializer.DataField(ref _durability, "durability", 0); + serializer.DataField(ref _destroyThreshold, "destroyThreshold", 0); + serializer.DataField(ref _resistance, "resistance", 0); + serializer.DataField(ref _size, "size", 2); + serializer.DataField(ref _compatibility, "compatibility", BodyPartCompatibility.Universal); + } + } +} + diff --git a/Content.Shared/Health/BodySystem/Surgery/SharedSurgeryToolComponent.cs b/Content.Shared/Health/BodySystem/Surgery/SharedSurgeryToolComponent.cs new file mode 100644 index 0000000000..3d6ad1738c --- /dev/null +++ b/Content.Shared/Health/BodySystem/Surgery/SharedSurgeryToolComponent.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using Content.Shared.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.BodySystem { + + + public class SharedSurgeryToolComponent : Component { + + protected SurgeryToolType _surgeryToolClass; + protected float _baseOperateTime; + public override string Name => "SurgeryTool"; + public override uint? NetID => ContentNetIDs.SURGERY; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref _surgeryToolClass, "surgeryToolClass", SurgeryToolType.Incision); + serializer.DataField(ref _baseOperateTime, "baseOperateTime", 5); + } + } + + [Serializable, NetSerializable] + public class OpenSurgeryUIMessage : ComponentMessage + { + public OpenSurgeryUIMessage() + { + Directed = true; + + } + } + + [Serializable, NetSerializable] + public class CloseSurgeryUIMessage : ComponentMessage + { + public CloseSurgeryUIMessage() + { + Directed = true; + } + } + + [Serializable, NetSerializable] + public class UpdateSurgeryUIMessage : ComponentMessage + { + public Dictionary Targets; + public UpdateSurgeryUIMessage(Dictionary targets) + { + Targets = targets; + Directed = true; + } + } + + [Serializable, NetSerializable] + public class SelectSurgeryUIMessage : ComponentMessage + { + public string TargetSlot; + public SelectSurgeryUIMessage(string target) + { + TargetSlot = target; + } + } + + + + +} + diff --git a/Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs b/Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs new file mode 100644 index 0000000000..99ae64b76f --- /dev/null +++ b/Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs @@ -0,0 +1,107 @@ +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Content.Shared.BodySystem +{ + public enum DamageClass { Brute, Burn, Toxin, Airloss } + public enum DamageType { Blunt, Piercing, Heat, Disintegration, Cellular, DNA, Airloss } + + public static class DamageContainerValues + { + public static readonly Dictionary> DamageClassToType = new Dictionary> + { + { DamageClass.Brute, new List{ DamageType.Blunt, DamageType.Piercing }}, + { DamageClass.Burn, new List{ DamageType.Heat, DamageType.Disintegration }}, + { DamageClass.Toxin, new List{ DamageType.Cellular, DamageType.DNA}}, + { DamageClass.Airloss, new List{ DamageType.Airloss }} + }; + public static readonly Dictionary DamageTypeToClass = new Dictionary + { + { DamageType.Blunt, DamageClass.Brute }, + { DamageType.Piercing, DamageClass.Brute }, + { DamageType.Heat, DamageClass.Burn }, + { DamageType.Disintegration, DamageClass.Burn }, + { DamageType.Cellular, DamageClass.Toxin }, + { DamageType.DNA, DamageClass.Toxin }, + { DamageType.Airloss, DamageClass.Airloss } + }; + } + + /// + /// Abstract class for all damage container classes. + /// + [NetSerializable, Serializable] + public abstract class AbstractDamageContainer + { + [ViewVariables] + abstract public List SupportedDamageClasses { get; } + + private Dictionary _damageList = new Dictionary(); + [ViewVariables] + public Dictionary DamageList => _damageList; + + /// + /// Sum of all damages kept on record. + /// + [ViewVariables] + public int Damage + { + get + { + return _damageList.Sum(x => x.Value); + } + } + + public AbstractDamageContainer() + { + foreach(DamageClass damageClass in SupportedDamageClasses){ + DamageContainerValues.DamageClassToType.TryGetValue(damageClass, out List childrenDamageTypes); + foreach (DamageType damageType in childrenDamageTypes) + { + _damageList.Add(damageType, 0); + } + } + } + + + + /// + /// Attempts to grab the damage value for the given DamageType - returns false if the container does not support that type. + /// + public bool TryGetDamageValue(DamageType type, out int damage) + { + return _damageList.TryGetValue(type, out damage); + } + + /// + /// Attempts to set the damage value for the given DamageType - returns false if the container does not support that type. + /// + public bool TrySetDamageValue(DamageType type, int target) + { + DamageContainerValues.DamageTypeToClass.TryGetValue(type, out DamageClass classType); + if (SupportedDamageClasses.Contains(classType)) + { + _damageList[type] = target; + return true; + } + return false; + } + + /// + /// Attempts to change the damage value for the given DamageType - returns false if the container does not support that type. + /// + public bool TryChangeDamageValue(DamageType type, int delta) + { + DamageContainerValues.DamageTypeToClass.TryGetValue(type, out DamageClass classType); + if (SupportedDamageClasses.Contains(classType)) + { + _damageList[type] = _damageList[type] + delta; + return true; + } + return false; + } + } +} diff --git a/Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs b/Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs new file mode 100644 index 0000000000..04741abb22 --- /dev/null +++ b/Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Content.Shared.BodySystem +{ + [NetSerializable, Serializable] + public class BiologicalDamageContainer : AbstractDamageContainer + { + public override List SupportedDamageClasses { + get { return new List { DamageClass.Brute, DamageClass.Burn, DamageClass.Toxin, DamageClass.Airloss }; } + } + } +} + diff --git a/Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml b/Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml new file mode 100644 index 0000000000..a7c2f70500 --- /dev/null +++ b/Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml @@ -0,0 +1,102 @@ +- type: bodyPart + id: bodyPart.Torso.BasicHuman + name: "human torso" + plural: "human torsos" + rsiPath: Objects/BodySystem/BodyParts/basic_human.rsi + rsiState: "torso_m" + partType: Torso + durability: 100 + destroyThreshold: -150 + resistance: 4.0 + size: 14 + compatibility: Biological + surgeryDataType: BiologicalsurgeryDataType + mechanisms: + - mechanism.Heart.BasicHuman + - mechanism.Lungs.BasicHuman + - mechanism.Liver.BasicHuman + - mechanism.Kidneys.BasicHuman + + +- type: bodyPart + id: bodyPart.Head.BasicHuman + name: "human head" + plural: "human heads" + rsiPath: Objects/BodySystem/BodyParts/basic_human.rsi + rsiState: head_m + partType: Head + durability: 50 + destroyThreshold: -120 + resistance: 7.0 + size: 7 + compatibility: Biological + surgeryDataType: BiologicalsurgeryDataType + mechanisms: + - mechanism.Brain.BasicHuman + - mechanism.Eyes.BasicHuman + + + +- type: bodyPart + id: bodyPart.Arm.BasicHuman + name: "human arm" + plural: "human arms" + rsiPath: Objects/BodySystem/BodyParts/basic_human.rsi + rsiState: r_arm + partType: Arm + durability: 40 + destroyThreshold: -80 + resistance: 3.0 + size: 5 + compatibility: Biological + surgeryDataType: BiologicalsurgeryDataType + properties: + - !type:ArmLength + length: 2.4 + + + +- type: bodyPart + id: bodyPart.Hand.BasicHuman + name: "human hand" + plural: "human hands" + rsiPath: Objects/BodySystem/BodyParts/basic_human.rsi + rsiState: r_hand + partType: Hand + durability: 30 + destroyThreshold: -60 + resistance: 2.0 + size: 3 + compatibility: Biological + surgeryDataType: BiologicalsurgeryDataType + + +- type: bodyPart + id: bodyPart.Leg.BasicHuman + name: "human leg" + plural: "human legs" + rsiPath: Objects/BodySystem/BodyParts/basic_human.rsi + rsiState: r_leg + partType: Leg + durability: 45 + destroyThreshold: -90 + resistance: 2.0 + size: 6 + compatibility: Biological + surgeryDataType: BiologicalsurgeryDataType + + +- type: bodyPart + id: bodyPart.Foot.BasicHuman + name: "human foot" + plural: "human feet" + rsiPath: Objects/BodySystem/BodyParts/basic_human.rsi + rsiState: r_foot + partType: Foot + durability: 30 + destroyThreshold: -60 + resistance: 3.0 + size: 2 + compatibility: Biological + surgeryDataType: BiologicalsurgeryDataType + \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml b/Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml new file mode 100644 index 0000000000..fca83e5392 --- /dev/null +++ b/Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml @@ -0,0 +1,15 @@ +- type: bodyPreset + name: "basic human" + id: bodyPreset.BasicHuman + partIDs: + head: bodyPart.Head.BasicHuman + torso: bodyPart.Torso.BasicHuman + right arm: bodyPart.Arm.BasicHuman + left arm: bodyPart.Arm.BasicHuman + right hand: bodyPart.Hand.BasicHuman + left hand: bodyPart.Hand.BasicHuman + right leg: bodyPart.Leg.BasicHuman + left leg: bodyPart.Leg.BasicHuman + right foot: bodyPart.Foot.BasicHuman + left foot: bodyPart.Foot.BasicHuman + \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml b/Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml new file mode 100644 index 0000000000..cbd22d75a1 --- /dev/null +++ b/Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml @@ -0,0 +1,33 @@ +- type: bodyTemplate + id: bodyTemplate.Humanoid + name: "humanoid" + centerSlot: "torso" + slots: + head: Head + torso: Torso + left arm: Arm + left hand: Hand + right arm: Arm + right hand: Hand + left leg: Leg + left foot: Foot + right leg: Leg + right foot: Foot + connections: + head: + - torso + torso: + - left arm + - right arm + - left leg + - right leg + left arm: + - left hand + right arm: + - right hand + left leg: + - left foot + right leg: + - right foot + + \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml b/Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml new file mode 100644 index 0000000000..7b1001c48f --- /dev/null +++ b/Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml @@ -0,0 +1,33 @@ +- type: bodyTemplate + id: bodyTemplate.Quadrupedal + name: "Quadrupedal" + centerSlot: "torso" + slots: + head: Head + torso: Torso + left front leg: Leg + left front paw: Foot + right front leg: Leg + right front paw: Foot + left hind leg: Leg + left hind paw: Foot + right hind leg: Leg + right hind paw: Foot + connections: + head: + - torso + torso: + - left front leg + - right front leg + - left hind leg + - right hind paw + left front leg: + - left front paw + right front leg: + - right front paw + left hind leg: + - left hind paw + right hind leg: + - right hind paw + + \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml b/Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml new file mode 100644 index 0000000000..a975c20462 --- /dev/null +++ b/Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml @@ -0,0 +1,59 @@ +- type: mechanism + id: mechanism.Brain.BasicHuman + name: "Human Brain" + rsiPath: Objects/BodySystem/Organs/basic_human.rsi + rsiState: "brain_human" + description: "The source of incredible, unending intelligence. Honk." + durability: 10 + size: 1 + compatibility: Biological + +- type: mechanism + id: mechanism.Eyes.BasicHuman + name: "Human Eyes" + rsiPath: Objects/BodySystem/Organs/basic_human.rsi + rsiState: "eyes_human" + description: "Ocular organ capable of turning light into a colorful visual." + durability: 10 + size: 1 + compatibility: Biological + +- type: mechanism + id: mechanism.Heart.BasicHuman + name: "Human Heart" + rsiPath: Objects/BodySystem/Organs/basic_human.rsi + rsiState: "heart_human" + description: "Pumps blood throughout a body. Essential for any entity with blood." + durability: 10 + size: 1 + compatibility: Biological + +- type: mechanism + id: mechanism.Lungs.BasicHuman + name: "Human Lungs" + rsiPath: Objects/BodySystem/Organs/basic_human.rsi + rsiState: "lungs_human" + description: "Filters oxygen from an atmosphere, which is then sent into the bloodstream to be used as an electron carrier." + durability: 13 + size: 1 + compatibility: Biological + +- type: mechanism + id: mechanism.Liver.BasicHuman + name: "Human Liver" + rsiPath: Objects/BodySystem/Organs/basic_human.rsi + rsiState: "liver_human" + description: "Filters impurities out of a bloodstream and provides other important functionality to a human." + durability: 15 + size: 1 + compatibility: Biological + +- type: mechanism + id: mechanism.Kidneys.BasicHuman + name: "Human Kidneys" + rsiPath: Objects/BodySystem/Organs/basic_human.rsi + rsiState: "kidneys_human" + description: "Filters toxins out of a bloodstream." + durability: 20 + size: 1 + compatibility: Biological \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml b/Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml new file mode 100644 index 0000000000..43aa45ee95 --- /dev/null +++ b/Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml @@ -0,0 +1,20 @@ +- type: mechanism + id: mechanism.EMPStriker + name: "EMP Striker" + description: "When activated, this arm implant will apply a small EMP on the target of a physical strike for 10 watts per use." + durability: 80 + size: 4 + compatibility: Universal + implantableParts: + - Arm + - Hand + + +- type: mechanism + id: mechanism.HonkModule + name: "HONK Module 3000" + description: "Mandatory implant for all clowns after the Genevo Convention of 2459." + durability: 50 + size: 3 + compatibility: Universal + \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml b/Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml new file mode 100644 index 0000000000..9ad96961d4 --- /dev/null +++ b/Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml @@ -0,0 +1,128 @@ +- type: entity + name: Scalpel + parent: BaseItem + id: scalpel + desc: A surgical tool used to make incisions into flesh. + components: + - type: SurgeryTool + surgeryToolClass: Incision + baseOperateTime: 3 + + - type: Sprite + sprite: Objects/Surgery/surgery_tools.rsi + state: scalpel + - type: Icon + sprite: Objects/Surgery/surgery_tools.rsi + state: scalpel + + - type: ItemCooldown + - type: MeleeWeapon + + + +- type: entity + name: Retractor + parent: BaseItem + id: retractor + desc: A surgical tool used to hold open incisions. + components: + - type: SurgeryTool + surgeryToolClass: Retraction + baseOperateTime: 3 + + - type: Sprite + sprite: Objects/Surgery/surgery_tools.rsi + state: retractor + - type: Icon + sprite: Objects/Surgery/surgery_tools.rsi + state: retractor + + - type: ItemCooldown + - type: MeleeWeapon + + + +- type: entity + name: Cautery + parent: BaseItem + id: cautery + desc: A surgical tool used to cauterize open wounds. + components: + - type: SurgeryTool + surgeryToolClass: Cauterization + baseOperateTime: 3 + + - type: Sprite + sprite: Objects/Surgery/surgery_tools.rsi + state: cautery + - type: Icon + sprite: Objects/Surgery/surgery_tools.rsi + state: cautery + + - type: ItemCooldown + - type: MeleeWeapon + + + +- type: entity + name: Drill + parent: BaseItem + id: drill + desc: A surgical drill for making holes into hard material. + components: + - type: SurgeryTool + surgeryToolClass: Drilling + baseOperateTime: 3 + + - type: Sprite + sprite: Objects/Surgery/surgery_tools.rsi + state: drill + - type: Icon + sprite: Objects/Surgery/surgery_tools.rsi + state: drill + + - type: ItemCooldown + - type: MeleeWeapon + + + +- type: entity + name: Bone Saw + parent: BaseItem + id: bone_saw + desc: A surgical tool used to cauterize open wounds. + components: + - type: SurgeryTool + surgeryToolClass: BoneSawing + baseOperateTime: 3 + + - type: Sprite + sprite: Objects/Surgery/surgery_tools.rsi + state: bone_saw + - type: Icon + sprite: Objects/Surgery/surgery_tools.rsi + state: bone_saw + + - type: ItemCooldown + - type: MeleeWeapon + +- type: entity + name: Hemostat + parent: BaseItem + id: hemostat + desc: A surgical tool used to compress blood vessels to prevent bleeding. + components: + - type: SurgeryTool + surgeryToolClass: VesselCompression + baseOperateTime: 3 + + - type: Sprite + sprite: Objects/Surgery/surgery_tools.rsi + state: hemostat + - type: Icon + sprite: Objects/Surgery/surgery_tools.rsi + state: hemostat + + - type: ItemCooldown + - type: MeleeWeapon + \ No newline at end of file diff --git a/Resources/Prototypes/BodySystem/body_system_dropped_items_default.yml b/Resources/Prototypes/BodySystem/body_system_dropped_items_default.yml new file mode 100644 index 0000000000..8b210eeabe --- /dev/null +++ b/Resources/Prototypes/BodySystem/body_system_dropped_items_default.yml @@ -0,0 +1,19 @@ +- type: entity + name: "BaseDroppedBodyPart" + parent: BaseItem + id: BaseDroppedBodyPart + components: + - type: DroppedBodyPart + - type: Sprite + texture: Objects\BodySystem\Organs\eyes_grey.png + - type: Icon + +- type: entity + name: "BaseDroppedMechanism" + parent: BaseItem + id: BaseDroppedMechanism + components: + - type: DroppedMechanism + - type: Sprite + texture: Objects\BodySystem\Organs\eyes_grey.png + - type: Icon \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Buildings/computers.yml b/Resources/Prototypes/Entities/Buildings/computers.yml index 3771493ff0..ac4b3c0924 100644 --- a/Resources/Prototypes/Entities/Buildings/computers.yml +++ b/Resources/Prototypes/Entities/Buildings/computers.yml @@ -165,7 +165,23 @@ - type: ComputerVisualizer2D key: id_key screen: id - + +- type: entity + id: computerBodyScanner + parent: ComputerBase + name: Body Scanner Computer + components: + - type: BodyScanner + - type: UserInterface + interfaces: + - key: enum.BodyScannerUiKey.Key + type: BodyScannerBoundUserInterface + - type: Appearance + visuals: + - type: ComputerVisualizer2D + key: generic_key + screen: generic + - type: entity id: ComputerComms parent: ComputerBase diff --git a/Resources/Prototypes/Entities/Mobs/human.yml b/Resources/Prototypes/Entities/Mobs/human.yml index 88e23fd6c0..34bebab229 100644 --- a/Resources/Prototypes/Entities/Mobs/human.yml +++ b/Resources/Prototypes/Entities/Mobs/human.yml @@ -110,6 +110,10 @@ - type: Species Template: Human HeatResistance: 323 + - type: BodyManager + BaseTemplate: bodyTemplate.Humanoid + BasePreset: bodyPreset.BasicHuman + - type: StatusEffectsUI - type: OverlayEffectsUI - type: HeatResistance @@ -235,3 +239,4 @@ - type: SpeciesVisualizer2D - type: HumanoidAppearance + \ No newline at end of file diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/head_m.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..51661693b29ad61c87eb19fe5ee728a5ed73bbcf GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}EufaSW-L^Y)fu{w)Uywg=bC zJY=LcyJUR~>1^YZl~_}e>?OXd?DesZEB7a824A&*u<^g5^X3#TX`!h`lQe?V6oSO$ z1-MM#1F!!I9{j%{ZlO=v^ zd~7Zz^l!gk+p_aF8-sz}?^QDP#mk>QQH^aDV5{2`{F@~?`E~x|?r?$h z_$iNOM>d~+^1Z&sFIIN_%vsYaIhgIYX|un4!kA#w5^EXIH9wPqAwi3cq2b%T#8+Ck zKZ_ka;KL*M|JTf#w4@G?LhIltrq(Rx?u)!#kEDd3o1U3FeMbD8jA*9TQ`IxBrCr+A zkv1cKuGZ1;do0{n-HO(0|NQ-N`~A8DN^CyNJ6_k;PpMZz0*n5iiaN*6@asIs8tr{W znP-Y@MeasjTK2i;Kv8GiC42WP@1MoXO+Pq&GJAv5)```XF~|1DPiJXZ6y5x^s_N9^ z)jmfVzMfuOYV&IT75)BeVSV=lUW$C(J%iz-&W5>0x2oHLLDYT@rU#yCf&+yFgjzMePdSMb71`Z%c$O;l92=M{Mso(MSJpzkhlC@@2i{N(0jRc-E>ZinLepp z@BII#7_H6lzalN5_WIb(C96!&t4%eCG!N+x+vCHaCAGdGOblc&2sG>u&%VEH?zfzD zgGpf*_Q}fi?S1q5)uz=mMFlmxW6EYPEm6ODdS}*qHvQwZca`NIPdZy^`6@g9{iC@$ ze!LppcYZeQ+mTk3b>Oe`2j3XukM&?fAMnRAS~B<_VD7&b2NLjf^>bP0l+XkKsB3_@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_foot.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..ace230831a46fdcf3a5ff34c3b16ec646e91cb12 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=vpiiKLn`LHy|j_@P=G}1#nl=& zj@)96aoAA6e0)R6k}22x9`H4B?`T-NQ84I;SI!YNeixhchWB=LaZEtnK=6T`t(Mt$ z@0(+vOVzIGY`?7MX>?bvy8QlI70<0Vp49DLVk_VErstRa+oe%ClT>`?u6rUltLmoh z?WLlY4%K!`bOnDs__-Tm6vKnl>wbrR&z3$sX=D5shDm`c$^WkX>jX)9y85}Sb4q9e E02h!|d;kCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_hand.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..0981260733ce090e3b63ef9d699084a224fac3ac GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Z#`WcLn`LHy}2>#uz`r%L;JGj z$5^&XN(iGkrj>CDJuP34i3PNglqowoAk<I?(S(i0AF7RsC)y2<9R;#1FNUHK)w*z(-2^Y^SO1GCDz mCcpc^&-$M2??0f{9clKFE*>ZNpD9cR8RY5e=d#Wzp$P!a4S=iw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_leg.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..362a0eb9438880d579c31cc409d8cb6aa108feb1 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>(`OLn`LHy|tICDL~@bNB8Mc zS9D)mF}1&2rkn5aLF(46UCj>Lx4mF0^3`l;4YNH*AiTqd^wsNHABtrfYe`k$Xa?HCwUcI)Ixh9%`3ldhPBu79e!k9U{s zfyY%+F^9bvw%`4={y&Fj(3EL$rFM0D*>@HFViLRP^SQusMcZXY28lPUX$2OGFXRZ6 Pg6!~g^>bP0l+XkKk+X1> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/meta.json b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/meta.json new file mode 100644 index 0000000000..d0c6866a45 --- /dev/null +++ b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/meta.json @@ -0,0 +1,81 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13", + "states": [ + { + "name": "head_m", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "torso_m", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "l_arm", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "r_arm", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "l_hand", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "r_hand", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "l_leg", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "r_leg", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "l_foot", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "r_foot", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_arm.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..f9024dbdba443e738232116f666420f29984625b GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVC3_3aSW-L^Y)f~UsHg<@sAgC zb2h}~zST8&XZnq6n%eE^j<>!#dz-Fb@NmrEE#Yl=%x&Y1fK{K{?3?QBP5JA1m__^TE>%#j!zB-e#W*ws`$!-IQV|`amTAthi2>>Ex9RFU=Qtt(keRt{!aW1KC){ XH#`Ax6BcoN0||J#`njxgN@xNA1x}FZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_foot.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..8e93a2e157a86dad6a5c49c1f4bd11862999eab4 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>@1PLn`LHy|tICDM8}sM`6*H zgyJ}d)y)rVOC+vne`x1p(??{_l+O-a_D@c8H4Z=yZN zANyXloO-8K=KOS<{a1bVt$w!8snl=n{Y`og>MU37kXdX0?p5$_F8&W?9@4D4rM81i N^>p=fS?83{1OO&}aufgn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_hand.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..b73ac3dd0b7261e4d6c7ab358925316ab0bc6d28 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=7d>4ZLn`LHy=BOC$U&g>p{ulF zgofCy$|jCO^G*g=G=6E^+s6KZNmJ(ybD5_ihx8&xj%58=9ueWp|HJjI`xAFbE(Mwb z1P#;ITukbn7XLislIr6HZyQxM-uV_Ssdw$}g3M1hhNygPELau2O{g$dYv@Or6;O<+t=W;_(J90Yrh-R z_T{ssoj&k${#@yTvwipS+0HG$l)ZQRC5@E-d_YIct7fR37g)_)9kmZ+f~TvW%Q~lo FCIHM}Xd3_k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_leg.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7fc1a1447061cadde06fe17df7f0510135562b GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>(`OLn`LHy=BPPWFXP@FkVQR zd4uPU2KN^ac=vS1bu3xDdG>OHgGUaY6+V&Gd2Fp8pPJ5=jL>`ODnCyjpT5jnkP&DI z2y8Kqij1CWR?=s-O>6DNRmIy*JWaj+_S0&w4<{doI81r+=+ZZ9iM2UXo}Bya$NEQ@ zi$hky1V}(MgGhO!S5^sIHa))i=xO8}u}d=7CawK8_d54k%@3PfEOcF5>b^a8-68!& z|3R7Ew~5LU>zUs9>VC}>Px&2h_BpQZ;zun7Kkk`nlkJLFjDHw2NbF!wa57r_{A9W< O$Z$_rKbLh*2~7YH!*8Pi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/torso_m.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..556a567143c51271aead12adc240ac1e85eb211d GIT binary patch literal 1195 zcmV;c1XTNpP)9w=%A&;yX;k}Azc4|bsMO0j9GJBo4*+z${$9?9?j@#DS7`v8GJ zAP@)y0!9u2$NN7?zVc}92h^8%E;7mmN69YX&+mT(07O1>kXqm4vc;=EweUIq`0jpS zeWr_ya=`%rCA)+{r$x&ni5YaCxz2L z$^|ExU#0uD*`V8MGDEk`+D<4zAo{l1gsjA&sA+nv|Jp*YYaxE=IntXYgRy zrkc#qpO?V{Y3%*N$x4yxtI1h<^QXtZ0s!QghWMrH0DxqEmDZF|7%2b*?^A!<@l6(^ zBk;UZMY>Xz{Q6Pt+8g!9UIR7(q$^d4w0ooW!_aZEKj^fOu2iKvoSo~x@yVGzqTm1h z$UWc;hV}=Y7R=fXlkMmzCy^WK*K4o<#IiSrj>ob$VAT)Muh*EwS?Sknup<)G*$>?U z$&Isoc^-E27xe2j=KhDN2@w44-oGCz+BDsiBGEUNv%nRA{|kfHR$vIZ?ud6436&mYyULXIU6)vgYevl1u(nw|@Cd0@uz0GI=y>A8OhTlIs9 z1*6}7!c_iWFbx^|fb(&6iw=3o{3^`a4rD!#C(GM(ybcTU=J)>Y8US}#l=VCS_kEQ=R zJaPm4`ayl*`Y39Y3sm@Ir8w~*5dGPeA^=x&^=u0I=A&(qKFYBGbH#S)GdH=tyf@ZwgE$p_{pFzB@C z`v22niIz`tk;JP-eAonr(so9Lxd{NkZC{(S%?1XY*4a1uJsy)IBkOrs^#eo_Gfb^v?aouG1M9?F$@0B$vmBxWYk5A^Fbdh>oico^I2@Fa5t#;L^>fbQLg=)Q8( zQo8mDE$^g07>iSH!>d8GyRVMWz59^M9#a6OQ*kQva(Nr}<9jq?%QhQG7>~G|U?E{V zqRCK-nuh)O9$qeQ18^VAbSlndkGTf4i#D2-DgZYnj=<9c^WxPaJ~S&;w2L;gEv`|3 z%)-2AdJg74P6+GYc4GJ`I&bTG(N9QZp3-Dmg1%N6!>`qQ@#8IGP7OL%VrxdC1d0f)Sd z*=7S%iyPr*i~AiQ+mpU|zy5jo0N{MS2Y9v5Q(qtu2m}|MzX0&>!~DJ$>i^Mj{eBw>UE3SFjDJvjD8z0+b~l7tkmUlh}JGp)h3SI77u^b+{-+w5 zUU0r&aj_;su_r>XCqu9&La-)6uqH#kUU0D|L#ib}t0h3TTWq&mZMR!&q$ED0BtE1h zJ+D}3uvclYSZJdpJ+D`2uvlrHB0H&6WvEnSs8nU0B0H&6WS1d1m?1f%QDCA`V4_iB zk{~yoPF<5AH(Ee8Y)wL%aAS{XTW3l?W=TGXVpdy0H<4*v7#~C000001bW%=J06^y0 zW&i*IMoC0LR5*>zk!w?eP!NV)yAU1kq?S^lnb=JX$}lrjgt9tjfdOn1QT}|kRqg02(c__Sn{UX)TjaL8=G7vi@2>Em(3Bl z%y!Nt+f9l#jhcJUp? z_qaR0D8n#J029n!&+HoyeRE>hmSx-INCVpt{+fo~@AAL*{AXa8$#CZXnKS>F zE&KofzcB-Yywm0gpaRB{AirP+hi5m^fE-It7sn8diOC5PcN`ivbTBE3_ISNuYT`PU zp>%2;;|iuT3pr2Jq&c&N=q@~$(bmSgm~(^F0_z+OCI-uyEE*D@-oFMK!rL*)GxUFRxBtyaZMhZ z@)saN+blaDmbHfQiV| z^RrfnG-xHPTGF5;Ak~uAk*%?7rCx=MWe+36(l0EBq7^Pq1nOt-boFyt=akR{00|#3 AEdT%j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/kidneys_human.png b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/kidneys_human.png new file mode 100644 index 0000000000000000000000000000000000000000..0b324e81bab1a52f0fddbfd17bff6c3103e8e046 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)*8>L*oLp9ZV{6;$j>uip zGyXq+FsIV%!;Om%Pac|Mes2;`8DmM1UoeBivm0qZPKc+AV~EDY?%I@k;hTCBJZum;H-mb`J;M}R4Z^9|1$p3D>9HW-C0h&pphpg}F5 oLG8eW20eib4eOX<6BaNs6ghKxZJe`_6KFnzr>mdKI;Vst051+gg8%>k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/liver_human.png b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/liver_human.png new file mode 100644 index 0000000000000000000000000000000000000000..efa7e75f768b607f33c743455be129c28b9266f1 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*e7JG(TyD|+xa1A~ zA$MyU|3825@Z_QYiE8XXHH;-ee!&b5&u*jvIWC?qjv*QolM^Hu9RdWVo?oJ~rbp?4 z)D)3d4M)-gdHuqI9Ih=~rSqm~P4iKYn=(f^#FB+Wyd!*MF0fqq!NViL)XdMoFsF_6 U=raZuYoK`yp00i_>zopr0Igd*E&u=k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/lungs_human.png b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/lungs_human.png new file mode 100644 index 0000000000000000000000000000000000000000..6e644517a7d5a8f960c4e5e62753bff86fb7b7ae GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*8>L*{D1!7!;Om{Y8xNs z75(p-@bKiJ|Fh>G4hXpvpB&3A@einyu_VYZn8D%MjWi&q($mE;L}Oxd!UA;x2l0Rf z5v-e=n~b{}Hcp;U%&@5`z})P5kP74FPXc0>i&RvXJzRKZ*+WJTDIx` zTgbsU?LrVc+w%(nI~E6|lWChL&2iS>}I fEU!V*2L=YN2@)@7nR~ec9l_w~>gTe~DWM4f=U`Ub literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/meta.json b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/meta.json new file mode 100644 index 0000000000..46bbb3c601 --- /dev/null +++ b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/meta.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13", + "states": [ + { + "name": "brain_human", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "eyes_human", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "heart_human", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "kidneys_human", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "liver_human", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "lungs_human", + "directions": 1, + "delays": [ + [1.0] + ] + }, + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/BodySystem/Organs/eyes_advanced.png b/Resources/Textures/Objects/BodySystem/Organs/eyes_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..c435aaf1974159297273745c143f21d6aeec4d58 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*{AXa8$#BNW$;rUL zfPo>6;mm&r2ZvX8n%jVC7)yfuf*Bm1-ADs+EInNuLo_BPCrI3JXxPxfq$t|s^@6F1 z>sW@;sdbDin9eNZJW-S8%od`%@MuO`8|z}u4N?oNb2yk7Qg*ULJl2|$0yKod)78&q Iol`;+06#!6wEzGB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/Organs/eyes_grey.png b/Resources/Textures/Objects/BodySystem/Organs/eyes_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2e8472ef26a691c2a4ea12feb6e9bb83e89e99 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(i*8>L*{AXa8$#BNO!C~35 zWu2X!+1c513-%TO6)=_r`2{mLJiCzwVS)*8>L*I5;@y=;#Co2OA{i zGo1PV@Z_NnH!l8v{(vPp&K9VQu_VYZn8D%MjWi%9!qdeuL}Oxdf<&4_fPjYq7uSIw zKF7{EY}>S1F~&iKMPq@G5{I||%jyCbApx=EgkZ52ZUYU?jm8^{H8mA(9zGb*m}O|~ r%)E-h-H~zDZK(?(1_EJ*7Z@1AlQ{MCAKZBaw1dIZ)z4*}Q$iB}d_O&d literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/BodySystem/Organs/lungs_advanced.png b/Resources/Textures/Objects/BodySystem/Organs/lungs_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..2186b3fe032dbeedb1a70973d277f84081a39930 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX#qYVt_Kbr`2YODhZ`5e!^3TC zYzzzx%+1Zcy}ixM%-r4G9UL5Vb#?Xi_3iBJ^z`&}baWgY9gU2P9-cg8VPRowYinX+ z;^E<8l3r|(ly6s1Ym`#RaOS^aaDqW{espwnaBy&Ze7v)>bN+9?LqHoDOM?7@862M7 zNCR?ac)B=-SoA)f5Y69Yz|(qMCeG>s16SOPMgRZ%-_moDzjoAJICt8Xmp{w4U7I1_ z^GG;h|LYA!PiM)Roy!fabzizZC-F5~K;t&%3$yFad#dvJhTKwQ?@oU&#C8*A5 zQ}9fSRWEo((-*-dUX8!B_?Qa9WR6Kc;TKe}yfxvow8!%u_8v{EXJq=_`w;Ptai;5@ fTRUCL*e17=l^{KZ<5>D;* zICQ4$;-gJZFSTEvW;|z=^+vxBe=Y)5GL{7S1v5B2yO9RuRC>BNhGMavWE-LEPKf4Vddn=#9_PU;Xy{8 zV+%PLr(FnQXM27jV26Y8i36Goj}L*{D1!7!;OpUw%ROM zX1?p7%fpk0_8$#uXw{i8&2Xz<_zs{-#*!evU3NZ5RHk+2@BK(9K-__ zM6hmdZZhs_*f@DYF~g>&0CThJK`M-wKM9CkE>cll_Hf~uWe*uWtehN~IBeHEJjlp% zY#|5Zv~JtXaX@q7u>$8=&CbjcR&!$?GRYiV=Fq5ltUy=hn5;w6Ce}l; fvb+XK9~c<8CP=)TW$xt)bOeK^tDnm{r-UW|5&c!F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/bone_saw.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/bone_saw.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb2a6bba912f97345cc9ef0a5497b58f6f459ba GIT binary patch literal 417 zcmV;S0bc%zP)Knd^?^9{ggd=! zHF0fi^YimvU0t%WvU78Dg@uJXIy&lSCbwcQib*G(ot-W#EM#P4Vq#)mUS3a6Pghr0 zOG`^oP*5u>Dk>!b9G`+9 z0tlc9A+*|2)CoyIln!=HNG~X%dVN%b;V6#B$_QFd5@Kql#GTF4Y_X&-G9v)U)q1nt zrTPAFJe7ttf|NOD{Cv6I?xj78Awg?E&OY@}7zI@Yy;b;S{XfD33DgOlg`)U)00000 LNkvXXu0mjfK7_A_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/cautery.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/cautery.png new file mode 100644 index 0000000000000000000000000000000000000000..4c899a2bea382ea39a6e272ea5c8737feaab921f GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*%slh|%$fh6QkAY> zzwYJbbC_ViJc9B3{$l=mUNsl4GMC3rX?w< z$)!-(J5`kRVU1#{vWgxvbAYMQ^n>o;3c{CO2^9G!m{H_R4f z5Hy|n>bCEe4G+1K=kQ#xxwX?{217>s#*l<;Tc#&dIxA)!6t+yC_nKc*=3n@XEgv@u zcpSgHh TNkzs$H!*m+`njxgN@xNAMYL^I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/hemostat.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/hemostat.png new file mode 100644 index 0000000000000000000000000000000000000000..1de7392928430e10380337296867c6c688f24d90 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*8>L*Oqnue`}XZADJi>( z?r#N(GnNGT1v5B2yO9Ru7bqCXp n6OJY<={eZY{_sG9I0M6*M6T-I1&0fOdKo-j{an^LB{Ts5=Tj|S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/meta.json b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/meta.json new file mode 100644 index 0000000000..065ba43164 --- /dev/null +++ b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "scalpel", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "retractor", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "bone_saw", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "hemostat", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "drill", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "cautery", + "directions": 1, + "delays": [ + [1.0] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/retractor.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/retractor.png new file mode 100644 index 0000000000000000000000000000000000000000..e207d8f12fb8c71df8b5bd5842adfc0aac1488a2 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*Oqnue^XARVmM!b- z?99#0Ww`TtF;JGVB*-tA!Qt7BG$5zI)5S4FV`6fGL`p-TfUkpxCxdT8;{=8_NuHh; zOiUVGGkSYjB_`?`iHM|#I2cWrJR#(^?ZgB|m4*~H7lxA_jDMJP^b}-!*f<(5I4H<_ zvU_V>n0SbTm4{~y(~6n}Re>RP%-JiLXZahl#9Uzgz{n7#$G-CC&;8jzyBR!P{an^L HB{Ts5H-|!2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/scalpel.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/scalpel.png new file mode 100644 index 0000000000000000000000000000000000000000..56150cc16c3d93b07a1326f4046959dc778db3a4 GIT binary patch literal 342 zcmV-c0jd6pP)=e90qhb@TiZLf?LP)r~ z#t#y>ov{cW7T%#CUNh4y>@GXM*@b0SS(b$)!$>r{00bZa0SG_<0uX=z0HopuudeU- zD1f*`#bODU7iYMCc#3RurzgLjI|C7=my5rh5`RpcZoN^@hdVInH30z5=T|tX+j&8| z-Gc9X7>{3JnkM@FUfBA+2giBGXf#X*K>)2am>I+b(hOz-GeZ+0lgVN+pTRH;5D{$K z&MO6|^|O4v3pdpYm=u1#J-Dv>j~hHkRx+8q?No78sLg-D=1~+1=V5=X_87a!ZKbRZ o0@wyQM3TJ$$Be}90RaeL1=Ns*cn`r=9RL6T07*qoM6N<$f;nf1C;$Ke literal 0 HcmV?d00001 From 15ba4f50a4cc3ac4eb43b171dfaa5b88999655bd Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 14 May 2020 00:40:10 +0200 Subject: [PATCH 13/15] Update submodule --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index b7f3627ef1..a72dd8c85b 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit b7f3627ef179c272152b89189002f1b34cc46355 +Subproject commit a72dd8c85bc1903ef98e709fc1a735bd5e667bdc From dd38d2f7633f64e8ab9558931fa8ecea6cfbd82c Mon Sep 17 00:00:00 2001 From: 20kdc Date: Sat, 16 May 2020 22:42:17 +0100 Subject: [PATCH 14/15] RotatableComponent: Fix "clockwise/counter-clockwise" verbs being swapped "Clockwise" actually rotated it counter-clockwise and vice versa. See response to https://discord.com/channels/310555209753690112/310555209753690112/711331672485789718 for confirmation that this is correct --- Content.Server/GameObjects/Components/RotatableComponent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/GameObjects/Components/RotatableComponent.cs b/Content.Server/GameObjects/Components/RotatableComponent.cs index 5707056e0e..4ff4d86f45 100644 --- a/Content.Server/GameObjects/Components/RotatableComponent.cs +++ b/Content.Server/GameObjects/Components/RotatableComponent.cs @@ -49,7 +49,7 @@ namespace Content.Server.GameObjects.Components protected override void Activate(IEntity user, RotatableComponent component) { - component.TryRotate(user, Angle.FromDegrees(90)); + component.TryRotate(user, Angle.FromDegrees(-90)); } } @@ -70,7 +70,7 @@ namespace Content.Server.GameObjects.Components protected override void Activate(IEntity user, RotatableComponent component) { - component.TryRotate(user, Angle.FromDegrees(-90)); + component.TryRotate(user, Angle.FromDegrees(90)); } } From 61e4a431a297c488f4ca6ab507c536b8c05e7eb9 Mon Sep 17 00:00:00 2001 From: chairbender Date: Sun, 17 May 2020 07:04:44 -0700 Subject: [PATCH 15/15] Remove TableParts, fix SmoothTile destruction bug (#918) --- .../IconSmoothing/IconSmoothComponent.cs | 3 +++ .../Prototypes/Entities/Buildings/table.yml | 5 +++-- .../Prototypes/Entities/Items/table_parts.yml | 17 ----------------- 3 files changed, 6 insertions(+), 19 deletions(-) delete mode 100644 Resources/Prototypes/Entities/Items/table_parts.yml diff --git a/Content.Client/GameObjects/Components/IconSmoothing/IconSmoothComponent.cs b/Content.Client/GameObjects/Components/IconSmoothing/IconSmoothComponent.cs index 586c91978f..54d2a99397 100644 --- a/Content.Client/GameObjects/Components/IconSmoothing/IconSmoothComponent.cs +++ b/Content.Client/GameObjects/Components/IconSmoothing/IconSmoothComponent.cs @@ -81,6 +81,9 @@ namespace Content.Client.GameObjects.Components.IconSmoothing base.Startup(); SnapGrid.OnPositionChanged += SnapGridOnPositionChanged; + // ensures lastposition initial value is populated on spawn. Just calling + // the hook here would cause a dirty event to fire needlessly + _lastPosition = (Owner.Transform.GridID, SnapGrid.Position); Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, new IconSmoothDirtyEvent(Owner,null, SnapGrid.Offset, Mode)); if (Mode == IconSmoothingMode.Corners) { diff --git a/Resources/Prototypes/Entities/Buildings/table.yml b/Resources/Prototypes/Entities/Buildings/table.yml index 13c343ea83..51931cd5b9 100644 --- a/Resources/Prototypes/Entities/Buildings/table.yml +++ b/Resources/Prototypes/Entities/Buildings/table.yml @@ -28,8 +28,9 @@ - type: Damageable - type: Destructible thresholdvalue: 50 - spawnondestroy: TableParts + spawnondestroy: SteelSheet1 +# TODO: drop wood instead of steel when destroyed when that's added - type: entity id: TableWood parent: Table @@ -41,4 +42,4 @@ - type: Damageable - type: Destructible thresholdvalue: 50 - spawnondestroy: TableParts + spawnondestroy: SteelSheet1 diff --git a/Resources/Prototypes/Entities/Items/table_parts.yml b/Resources/Prototypes/Entities/Items/table_parts.yml deleted file mode 100644 index ca95909b86..0000000000 --- a/Resources/Prototypes/Entities/Items/table_parts.yml +++ /dev/null @@ -1,17 +0,0 @@ -- type: entity - name: Table Parts - parent: BaseItem - id: TableParts - description: Parts of a table. - components: - - type: Sprite - sprite: Objects/Parts/table_parts.rsi - state: icon - - - type: Icon - sprite: Objects/Parts/table_parts.rsi - state: icon - - - type: Item - Size: 25 - sprite: Objects/Parts/table_parts.rsi