diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 7604f3e8e9..2676cf26a2 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) 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/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.Client/GameObjects/Components/Storage/ClientStorageComponent.cs b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs index 3084c2af1d..30773715a9 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; @@ -103,9 +104,11 @@ namespace Content.Client.GameObjects.Components.Storage private Control VSplitContainer; private VBoxContainer EntityList; private Label Information; - private Button AddItemButton; public ClientStorageComponent StorageEntity; + 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); public StorageWindow() @@ -113,7 +116,37 @@ namespace Content.Client.GameObjects.Components.Storage Title = "Storage Item"; RectClipContent = true; - VSplitContainer = new VBoxContainer(); + var containerButton = new ContainerButton + { + SizeFlagsHorizontal = 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; + + if (controlledEntity.TryGetComponent(out IHandsComponent hands)) + { + StorageEntity.SendNetworkMessage(new InsertEntityMessage()); + } + }; + + VSplitContainer = new VBoxContainer() + { + MouseFilter = MouseFilterMode.Ignore, + }; + containerButton.AddChild(VSplitContainer); Information = new Label { Text = "Items: 0 Volume: 0/0 Stuff", @@ -126,7 +159,7 @@ namespace Content.Client.GameObjects.Components.Storage SizeFlagsVertical = SizeFlags.FillExpand, SizeFlagsHorizontal = SizeFlags.FillExpand, HScrollEnabled = true, - VScrollEnabled = true + VScrollEnabled = true, }; EntityList = new VBoxContainer { @@ -135,16 +168,17 @@ 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); + listScrollContainer.OnMouseEntered += args => + { + innerContainerButton.PanelOverride = _HoveredBox; + }; + + listScrollContainer.OnMouseExited += args => + { + innerContainerButton.PanelOverride = _unHoveredBox; + }; } public override void Close() @@ -168,7 +202,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 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/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index ac6ab14c65..36a52aa7a5 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(); @@ -279,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), () => { @@ -295,12 +290,12 @@ 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(); }); 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.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)); } } 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/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 e72f56d26a..d8a53eb727 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -36,15 +36,15 @@ public const uint GALACTIC_MARKET = 1031; public const uint HUMANOID_APPEARANCE = 1032; public const uint INSTRUMENTS = 1033; - public const uint TOOL = 1034; - public const uint WELDER = 1035; - public const uint STACK = 1036; - public const uint HANDHELD_LIGHT = 1037; - public const uint PAPER = 1038; - public const uint REAGENT_INJECTOR = 1039; - public const uint GHOST = 1040; - public const uint MICROWAVE = 1041; - public const uint GRAVITY_GENERATOR = 1042; + public const uint WELDER = 1034; + public const uint STACK = 1035; + public const uint HANDHELD_LIGHT = 1036; + public const uint PAPER = 1037; + public const uint REAGENT_INJECTOR = 1038; + public const uint GHOST = 1039; + public const uint MICROWAVE = 1040; + public const uint GRAVITY_GENERATOR = 1041; + public const uint SURGERY = 1042; public const uint MULTITOOLS = 1043; } } 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/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; } } 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 c18ee7d92a..ae69da83b8 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/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/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/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/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 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 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/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 0000000000..a9bdc14b32 Binary files /dev/null and b/Resources/Textures/Clothing/Belts/suspenders.rsi/equipped-BELT.png differ diff --git a/Resources/Textures/Clothing/Belts/suspenders.rsi/icon.png b/Resources/Textures/Clothing/Belts/suspenders.rsi/icon.png new file mode 100644 index 0000000000..b4ff813557 Binary files /dev/null and b/Resources/Textures/Clothing/Belts/suspenders.rsi/icon.png differ 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 0000000000..776e6a1ff9 Binary files /dev/null and b/Resources/Textures/Clothing/Gloves/white.rsi/equipped-HAND.png differ diff --git a/Resources/Textures/Clothing/Gloves/white.rsi/icon.png b/Resources/Textures/Clothing/Gloves/white.rsi/icon.png new file mode 100644 index 0000000000..a59b2c401d Binary files /dev/null and b/Resources/Textures/Clothing/Gloves/white.rsi/icon.png differ 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 0000000000..49e6bc6907 Binary files /dev/null and b/Resources/Textures/Clothing/Gloves/white.rsi/inhand-left.png differ 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 0000000000..19fcfc5405 Binary files /dev/null and b/Resources/Textures/Clothing/Gloves/white.rsi/inhand-right.png differ 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 0000000000..bc45873777 Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/equipped-MASK.png differ 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 0000000000..065779910e Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/icon.png differ 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 0000000000..4efbdfc2a3 Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-left.png differ 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 0000000000..fa8af014a2 Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_gasalt.rsi/inhand-right.png differ 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 0000000000..0701011328 Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_joy.rsi/equipped-MASK.png differ 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 0000000000..b81dd2fb25 Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_joy.rsi/icon.png differ 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 0000000000..0dff034392 Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_mime.rsi/equipped-MASK.png differ 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 0000000000..76d6e5e4bf Binary files /dev/null and b/Resources/Textures/Clothing/Masks/mask_mime.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Masks/mask_mime.rsi/meta.json b/Resources/Textures/Clothing/Masks/mask_mime.rsi/meta.json new file mode 100644 index 0000000000..f9b8c223d5 --- /dev/null +++ b/Resources/Textures/Clothing/Masks/mask_mime.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/OuterClothing/bio.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/bio.rsi/meta.json index 117a2241ce..d69588617f 100644 --- a/Resources/Textures/Clothing/OuterClothing/bio.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/bio.rsi/meta.json @@ -1 +1,74 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/d71760fe0c0e9ea3a9aa8e9e794daf7e7f892d8c/icons/inventory/suit/mob.dmi", "states": [{"name": "equipped-OUTERCLOTHING", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "icon", "directions": 1, "delays": [[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]]}]} +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/d71760fe0c0e9ea3a9aa8e9e794daf7e7f892d8c/icons/inventory/suit/mob.dmi", + "states": [ + { + "name": "equipped-OUTERCLOTHING", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "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/Uniforms/uniform_mime.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..436ebe0bdb Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/icon.png new file mode 100644 index 0000000000..3c6f4de6e5 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-left.png new file mode 100644 index 0000000000..59518c35c3 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-left.png differ 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 0000000000..fa96803d56 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/uniform_mime.rsi/inhand-right.png differ 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/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 0000000000..51661693b2 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/head_m.png differ diff --git a/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_arm.png b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_arm.png new file mode 100644 index 0000000000..ff4522a4f2 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_arm.png differ 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 0000000000..ace230831a Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_foot.png differ 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 0000000000..0981260733 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_hand.png differ 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 0000000000..362a0eb943 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/l_leg.png differ 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 0000000000..f9024dbdba Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_arm.png differ 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 0000000000..8e93a2e157 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_foot.png differ 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 0000000000..b73ac3dd0b Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_hand.png differ 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 0000000000..cc7fc1a144 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/r_leg.png differ 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 0000000000..556a567143 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/BodyParts/basic_human.rsi/torso_m.png differ diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/brain_human.png b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/brain_human.png new file mode 100644 index 0000000000..ba49b3e5e6 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/brain_human.png differ diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/eyes_human.png b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/eyes_human.png new file mode 100644 index 0000000000..015d2c4094 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/eyes_human.png differ diff --git a/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/heart_human.png b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/heart_human.png new file mode 100644 index 0000000000..7c24e656b4 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/heart_human.png differ 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 0000000000..0b324e81ba Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/kidneys_human.png differ 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 0000000000..efa7e75f76 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/liver_human.png differ 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 0000000000..6e644517a7 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/basic_human.rsi/lungs_human.png differ 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 0000000000..c435aaf197 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/eyes_advanced.png differ 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 0000000000..2d2e8472ef Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/eyes_grey.png differ diff --git a/Resources/Textures/Objects/BodySystem/Organs/kidneys_advanced.png b/Resources/Textures/Objects/BodySystem/Organs/kidneys_advanced.png new file mode 100644 index 0000000000..2e8c150107 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/kidneys_advanced.png differ 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 0000000000..2186b3fe03 Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/lungs_advanced.png differ diff --git a/Resources/Textures/Objects/BodySystem/Organs/lungs_plasmaman.png b/Resources/Textures/Objects/BodySystem/Organs/lungs_plasmaman.png new file mode 100644 index 0000000000..1c6d2dc11a Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/lungs_plasmaman.png differ diff --git a/Resources/Textures/Objects/BodySystem/Organs/lungs_vox.png b/Resources/Textures/Objects/BodySystem/Organs/lungs_vox.png new file mode 100644 index 0000000000..780c33e52f Binary files /dev/null and b/Resources/Textures/Objects/BodySystem/Organs/lungs_vox.png differ 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 0000000000..b881550bda Binary files /dev/null and b/Resources/Textures/Objects/Instruments/accordion.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Instruments/accordion.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/accordion.rsi/inhand-right.png new file mode 100644 index 0000000000..b226a8d23b Binary files /dev/null and b/Resources/Textures/Objects/Instruments/accordion.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Instruments/accordion.rsi/meta.json b/Resources/Textures/Objects/Instruments/accordion.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/accordion.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/eguitar.png b/Resources/Textures/Objects/Instruments/eguitar.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/eguitar.png rename to Resources/Textures/Objects/Instruments/eguitar.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-left.png new file mode 100644 index 0000000000..2334d2e7ba Binary files /dev/null and b/Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-right.png new file mode 100644 index 0000000000..4290a49517 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/eguitar.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Instruments/eguitar.rsi/meta.json b/Resources/Textures/Objects/Instruments/eguitar.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/eguitar.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/glockenspiel.png b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Instruments/musician.rsi/glockenspiel.png rename to Resources/Textures/Objects/Instruments/glockenspiel.rsi/icon.png diff --git a/Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-left.png b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-left.png new file mode 100644 index 0000000000..c639ab4466 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-left.png differ 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 0000000000..a8af95f3ba Binary files /dev/null and b/Resources/Textures/Objects/Instruments/glockenspiel.rsi/inhand-right.png differ 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 0000000000..fa1da26b14 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/guitar.rsi/inhand-left.png differ 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 0000000000..ee9726be45 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/guitar.rsi/inhand-right.png differ 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 0000000000..ea8f77ae6e Binary files /dev/null and b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-left.png differ 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 0000000000..7eff932146 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/h_synthesizer.rsi/inhand-right.png differ 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 0000000000..30579b39a9 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-left.png differ 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 0000000000..84fc6627df Binary files /dev/null and b/Resources/Textures/Objects/Instruments/harmonica.rsi/inhand-right.png differ 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 0000000000..0931bc795b Binary files /dev/null and b/Resources/Textures/Objects/Instruments/recorder.rsi/inhand-left.png differ 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 0000000000..d9b1a320dc Binary files /dev/null and b/Resources/Textures/Objects/Instruments/recorder.rsi/inhand-right.png differ 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 0000000000..2940a0b881 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-right.png b/Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-right.png new file mode 100644 index 0000000000..1337780753 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/saxophone.rsi/inhand-right.png differ 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 0000000000..e517ae4541 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/trombone.rsi/inhand-left.png differ 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 0000000000..b27538920b Binary files /dev/null and b/Resources/Textures/Objects/Instruments/trombone.rsi/inhand-right.png differ 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 0000000000..1edf690c49 Binary files /dev/null and b/Resources/Textures/Objects/Instruments/violin.rsi/inhand-left.png differ 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 0000000000..f193a5efbd Binary files /dev/null and b/Resources/Textures/Objects/Instruments/violin.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Instruments/violin.rsi/meta.json b/Resources/Textures/Objects/Instruments/violin.rsi/meta.json new file mode 100644 index 0000000000..b4eb2638bb --- /dev/null +++ b/Resources/Textures/Objects/Instruments/violin.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/Surgery/surgery_tools.rsi/bone_saw.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/bone_saw.png new file mode 100644 index 0000000000..4bb2a6bba9 Binary files /dev/null and b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/bone_saw.png differ 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 0000000000..4c899a2bea Binary files /dev/null and b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/cautery.png differ diff --git a/Resources/Textures/Objects/Surgery/surgery_tools.rsi/drill.png b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/drill.png new file mode 100644 index 0000000000..d2a6d6d9c7 Binary files /dev/null and b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/drill.png differ 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 0000000000..1de7392928 Binary files /dev/null and b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/hemostat.png differ 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 0000000000..e207d8f12f Binary files /dev/null and b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/retractor.png differ 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 0000000000..56150cc16c Binary files /dev/null and b/Resources/Textures/Objects/Surgery/surgery_tools.rsi/scalpel.png differ diff --git a/RobustToolbox b/RobustToolbox index 65abe671aa..a72dd8c85b 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 65abe671aa7cabffceafe430d992c72b9566c652 +Subproject commit a72dd8c85bc1903ef98e709fc1a735bd5e667bdc diff --git a/SpaceStation14.sln b/SpaceStation14.sln index ccb629b7e1..16c8fedf49 100644 --- a/SpaceStation14.sln +++ b/SpaceStation14.sln @@ -52,22 +52,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MSBuild", "MSBuild", "{5040 EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{806ED41A-411B-4B3B-BEB6-DEC6DCA4C205}" -ProjectSection(SolutionItems) = preProject - Jenkinsfile = Jenkinsfile - Tools\generate_hashes.ps1 = Tools\generate_hashes.ps1 - Tools\package_release_build.py = Tools\package_release_build.py - Tools\run_travis.sh = Tools\run_travis.sh - .travis.yml = .travis.yml - .appveyor.yml = .appveyor.yml - Tools\gen_build_info.py = Tools\gen_build_info.py -EndProjectSection + ProjectSection(SolutionItems) = preProject + .appveyor.yml = .appveyor.yml + .travis.yml = .travis.yml + Tools\gen_build_info.py = Tools\gen_build_info.py + Tools\generate_hashes.ps1 = Tools\generate_hashes.ps1 + Jenkinsfile = Jenkinsfile + Tools\package_release_build.py = Tools\package_release_build.py + Tools\run_travis.sh = Tools\run_travis.sh + EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Robust.Shared.Scripting", "RobustToolbox\Robust.Shared.Scripting\Robust.Shared.Scripting.csproj", "{41B450C0-A361-4CD7-8121-7072B8995CFC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Robust.Shared.Scripting", "RobustToolbox\Robust.Shared.Scripting\Robust.Shared.Scripting.csproj", "{41B450C0-A361-4CD7-8121-7072B8995CFC}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{DDD55F86-0406-42E5-8443-93EDC6BB2D75}" -ProjectSection(SolutionItems) = preProject - RobustToolbox\Tools\download_natives.py = RobustToolbox\Tools\download_natives.py -EndProjectSection + ProjectSection(SolutionItems) = preProject + RobustToolbox\Tools\download_natives.py = RobustToolbox\Tools\download_natives.py + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -135,10 +135,10 @@ Global {45C9B43F-305D-4651-9863-F6384CBC847F}.Debug|x64.Build.0 = Debug|x64 {45C9B43F-305D-4651-9863-F6384CBC847F}.Release|x64.ActiveCfg = Release|x64 {45C9B43F-305D-4651-9863-F6384CBC847F}.Release|x64.Build.0 = Release|x64 - {41B450C0-A361-4CD7-8121-7072B8995CFC}.Debug|x64.ActiveCfg = Debug|Any CPU - {41B450C0-A361-4CD7-8121-7072B8995CFC}.Debug|x64.Build.0 = Debug|Any CPU - {41B450C0-A361-4CD7-8121-7072B8995CFC}.Release|x64.ActiveCfg = Release|Any CPU - {41B450C0-A361-4CD7-8121-7072B8995CFC}.Release|x64.Build.0 = Release|Any CPU + {41B450C0-A361-4CD7-8121-7072B8995CFC}.Debug|x64.ActiveCfg = Debug|x64 + {41B450C0-A361-4CD7-8121-7072B8995CFC}.Debug|x64.Build.0 = Debug|x64 + {41B450C0-A361-4CD7-8121-7072B8995CFC}.Release|x64.ActiveCfg = Release|x64 + {41B450C0-A361-4CD7-8121-7072B8995CFC}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE