From a992be0266abf82143ef01722a21ac1d5a63ef35 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Tue, 20 Aug 2024 02:48:58 -0400 Subject: [PATCH 01/74] Luxurious Loadout Items (#753) # Description This PR adds the Blunt and Joint in the Smokeables category, the Station Map, Lantern, MRE Flask, and undepartmentalized flasks in the misc category, and it adds Cow Tools for the clown in the Jobs category for 3 points. Also found out the hard way that renaming your branch essentially deletes it, therefore closing your PR. Not doing that again! --- # Changelog :cl: - add: Several useful items have been added to loadouts - add: Cowtools are selectable for clown in the "Jobs" category of loadouts --------- Signed-off-by: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> --- .../Prototypes/Loadouts/Jobs/service.yml | 11 ++++ Resources/Prototypes/Loadouts/items.yml | 57 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 4e41f035d7b..74a7364e9a4 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -92,6 +92,17 @@ items: - BedsheetClown +- type: loadout + id: LoadoutServiceClownCowToolboxFilled + category: Jobs + cost: 3 + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - CowToolboxFilled + # Mime - type: loadout id: LoadoutServiceMimeOuterWinter diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 87ba2e71d42..5d42e9bb750 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -76,6 +76,21 @@ items: - SmokingPipeFilledTobacco +- type: loadout + id: LoadoutItemBlunt + category: Items + cost: 2 + items: + - Blunt + +- type: loadout + id: LoadoutItemJoint + category: Items + cost: 2 + items: + - Joint + + # Instruments - type: loadout id: LoadoutItemMicrophoneInstrument @@ -279,6 +294,13 @@ items: - LunchboxGenericFilledRandom +- type: loadout + id: LoadoutItemDrinkMREFlask + category: Items + cost: 2 + items: + - DrinkMREFlask + # Survival boxes - type: loadout id: LoadoutItemBoxSurvival @@ -540,3 +562,38 @@ cost: 3 items: - HandLabeler + +- type: loadout + id: LoadoutItemHandheldStationMap + category: Items + cost: 2 + items: + - HandheldStationMap + +- type: loadout + id: LoadoutItemLantern + category: Items + cost: 2 + items: + - Lantern + +- type: loadout + id: LoadoutItemDrinkShinyFlask + category: Items + cost: 1 + items: + - DrinkShinyFlask + +- type: loadout + id: LoadoutItemDrinkLithiumFlask + category: Items + cost: 1 + items: + - DrinkLithiumFlask + +- type: loadout + id: LoadoutItemDrinkVacuumFlask + category: Items + cost: 1 + items: + - DrinkVacuumFlask From 255793d169305f33a67b6c68fc8a2819a934d936 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 20 Aug 2024 06:49:23 +0000 Subject: [PATCH 02/74] Automatic Changelog Update (#753) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6ba4d21856f..0acd144cfb0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5397,3 +5397,11 @@ Entries: message: You no longer need to have a station record to publish news. id: 6270 time: '2024-08-18T18:11:10.0000000+00:00' +- author: ShatteredSwords + changes: + - type: Add + message: Several useful items have been added to loadouts + - type: Add + message: Cowtools are selectable for clown in the "Jobs" category of loadouts + id: 6271 + time: '2024-08-20T06:48:59.0000000+00:00' From f8e382b34a71800616833bc381b433b7b9cc5481 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 20 Aug 2024 04:16:05 -0400 Subject: [PATCH 03/74] Morale System (Port From White Dream) (#620) # Description This Feature has been graciously provided for Einstein Engines to port from the White Dream codebase. Mood is a system for tracking a character's current Mental State, which fluctuates throughout the round as a result of various events that can modify it. Each consisting of a single line event that can be trivially inserted into any other system, and a yml configured "Moodlet", which is applied to said character. Moodlets can be temporary or permanent, and can also modify a characters mood in either positive or negative directions. Things like, "Being Hungry", "Being Injured", "Petting a cute animal", "Being Hugged", all create a Moodlet. Mood can provide buffs or debuffs, primarily to movement speed. In fact Mood's movement speed modifier actually completely replaces the movement speed modifiers from Hunger & Thirst. Instead Hunger & Thirst create a negative moodlet that persists until you eat and drink, which _can_ give you a speed penalty. But you might for instance diminish the negative effects by seeking out other positive sources. Or they might just get worse, who knows what could happen? # Media Mood takes the form of a series of Moodlets, which modify your character's internal Mood stat. It's kinda like a healthbar, but for your mental state. Whenever you gain a moodlet, it appears in a popup. White text for standard moodlets, red text for negative moodlets. By clicking on your mood icon, text will show up displaying all of your currently active Moodlets. https://github.com/user-attachments/assets/3e9420bb-3a43-4d97-9127-31d704c15287 New traits! ![image](https://github.com/user-attachments/assets/4ddf968e-3dbd-44e1-a53e-79bb7b955d01) Permission from Codeowners: ![morale code permission](https://github.com/user-attachments/assets/c3d089fa-3e0f-4402-8757-c47e911c3554) # TODO - [x] Refactor the Crit Threshold modification, and Movement Speed Modification to make it more granular. # Changelog :cl: VMSolidus & Skubman - add: The Mood System has been ported from White Dream. Mood acts as a 3rd healthbar, alongside Health and Stamina, representing your character's current mental state. Having either high or low mood can modify certain physical attributes. - add: Mood modifies your Critical Threshold. Your critical threshold can be increased or decreased depending on how high or low your character's mood is. - add: Mood modifies your Movement Speed. Characters move faster when they have an overall high mood, and move slower when they have a lower mood. - add: Saturnine and Sanguine have been added to the list of Mental traits, both providing innate modifiers to a character's Morale. --------- Signed-off-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: Angelo Fallaria Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Overlays/SaturationScaleOverlay.cs | 39 ++ .../Overlays/SaturationScaleSystem.cs | 63 +++ .../Tests/Slipping/SlippingTest.cs | 4 +- Content.Server/Arcade/BlockGame/BlockGame.cs | 3 + .../SpaceVillainArcadeSystem.cs | 4 + .../Atmos/EntitySystems/BarotraumaSystem.cs | 7 +- .../Atmos/EntitySystems/FlammableSystem.cs | 3 + Content.Server/Bible/BibleSystem.cs | 3 + .../Body/Systems/RespiratorSystem.cs | 2 + .../GameTicking/Rules/TraitorRuleSystem.cs | 3 + .../Interaction/InteractionPopupSystem.cs | 13 + Content.Server/Medical/VomitSystem.cs | 3 + Content.Server/Mood/MoodComponent.cs | 111 +++++ Content.Server/Mood/MoodSystem.cs | 422 ++++++++++++++++++ .../Assorted/ModifyMoodTraitComponent.cs | 11 + Content.Shared/Alert/AlertCategory.cs | 1 + Content.Shared/Alert/AlertType.cs | 16 + Content.Shared/CCVar/CCVars.cs | 19 + Content.Shared/Contests/ContestsSystem.cs | 67 ++- Content.Shared/Cuffs/SharedCuffableSystem.cs | 7 + Content.Shared/Mood/MoodCategoryPrototype.cs | 13 + Content.Shared/Mood/MoodEffectPrototype.cs | 35 ++ Content.Shared/Mood/MoodEvents.cs | 59 +++ Content.Shared/Mood/SharedMoodComponent.cs | 15 + .../Nutrition/EntitySystems/HungerSystem.cs | 21 +- .../EntitySystems/SharedCreamPieSystem.cs | 6 + .../Nutrition/EntitySystems/ThirstSystem.cs | 15 +- .../Overlays/SaturationScaleComponent.cs | 6 + Content.Shared/Slippery/SlipperySystem.cs | 3 + Resources/Locale/en-US/mood/mood-alerts.ftl | 32 ++ Resources/Locale/en-US/mood/mood.ftl | 54 +++ Resources/Locale/en-US/traits/traits.ftl | 6 + Resources/Locale/ru-RU/mood/mood-alerts.ftl | 22 + Resources/Locale/ru-RU/mood/mood.ftl | 1 + Resources/Prototypes/Alerts/alerts.yml | 112 +++++ .../Prototypes/Entities/Mobs/Species/base.yml | 1 + Resources/Prototypes/Mood/categories.yml | 9 + Resources/Prototypes/Mood/genericNeeds.yml | 63 +++ .../Mood/genericNegativeEffects.yml | 45 ++ .../Mood/genericPositiveEffects.yml | 40 ++ Resources/Prototypes/Shaders/shaders.yml | 5 + Resources/Prototypes/Traits/neutral.yml | 36 ++ .../Interface/Alerts/mood.rsi/meta.json | 60 +++ .../Interface/Alerts/mood.rsi/mood1.png | Bin 0 -> 606 bytes .../Interface/Alerts/mood.rsi/mood2.png | Bin 0 -> 517 bytes .../Interface/Alerts/mood.rsi/mood3.png | Bin 0 -> 526 bytes .../Interface/Alerts/mood.rsi/mood4.png | Bin 0 -> 417 bytes .../Interface/Alerts/mood.rsi/mood5.png | Bin 0 -> 412 bytes .../Interface/Alerts/mood.rsi/mood6.png | Bin 0 -> 430 bytes .../Interface/Alerts/mood.rsi/mood7.png | Bin 0 -> 452 bytes .../Interface/Alerts/mood.rsi/mood8.png | Bin 0 -> 528 bytes .../Interface/Alerts/mood.rsi/mood9.png | Bin 0 -> 481 bytes .../Alerts/mood.rsi/mood_happiness_bad.png | Bin 0 -> 304 bytes .../Alerts/mood.rsi/mood_happiness_good.png | Bin 0 -> 343 bytes .../Interface/Alerts/mood.rsi/mood_insane.png | Bin 0 -> 3392 bytes .../Textures/Shaders/saturationscale.swsl | 12 + 56 files changed, 1456 insertions(+), 16 deletions(-) create mode 100644 Content.Client/Overlays/SaturationScaleOverlay.cs create mode 100644 Content.Client/Overlays/SaturationScaleSystem.cs create mode 100644 Content.Server/Mood/MoodComponent.cs create mode 100644 Content.Server/Mood/MoodSystem.cs create mode 100644 Content.Server/Traits/Assorted/ModifyMoodTraitComponent.cs create mode 100644 Content.Shared/Mood/MoodCategoryPrototype.cs create mode 100644 Content.Shared/Mood/MoodEffectPrototype.cs create mode 100644 Content.Shared/Mood/MoodEvents.cs create mode 100644 Content.Shared/Mood/SharedMoodComponent.cs create mode 100644 Content.Shared/Overlays/SaturationScaleComponent.cs create mode 100644 Resources/Locale/en-US/mood/mood-alerts.ftl create mode 100644 Resources/Locale/en-US/mood/mood.ftl create mode 100644 Resources/Locale/ru-RU/mood/mood-alerts.ftl create mode 100644 Resources/Locale/ru-RU/mood/mood.ftl create mode 100644 Resources/Prototypes/Mood/categories.yml create mode 100644 Resources/Prototypes/Mood/genericNeeds.yml create mode 100644 Resources/Prototypes/Mood/genericNegativeEffects.yml create mode 100644 Resources/Prototypes/Mood/genericPositiveEffects.yml create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/meta.json create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood1.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood2.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood3.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood4.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood5.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood6.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood7.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood8.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood9.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood_happiness_bad.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood_happiness_good.png create mode 100644 Resources/Textures/Interface/Alerts/mood.rsi/mood_insane.png create mode 100644 Resources/Textures/Shaders/saturationscale.swsl diff --git a/Content.Client/Overlays/SaturationScaleOverlay.cs b/Content.Client/Overlays/SaturationScaleOverlay.cs new file mode 100644 index 00000000000..199b54f8c9f --- /dev/null +++ b/Content.Client/Overlays/SaturationScaleOverlay.cs @@ -0,0 +1,39 @@ +using Robust.Client.Graphics; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; + +namespace Content.Client.Overlays; + +public sealed class SaturationScaleOverlay : Overlay +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public override bool RequestScreenTexture => true; + public override OverlaySpace Space => OverlaySpace.WorldSpace; + private readonly ShaderInstance _shader; + private const float Saturation = 0.5f; + + + public SaturationScaleOverlay() + { + IoCManager.InjectDependencies(this); + + _shader = _prototypeManager.Index("SaturationScale").InstanceUnique(); + } + + + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture == null) + return; + + _shader.SetParameter("SCREEN_TEXTURE", ScreenTexture); + _shader.SetParameter("saturation", Saturation); + + var handle = args.WorldHandle; + + handle.UseShader(_shader); + handle.DrawRect(args.WorldBounds, Color.White); + handle.UseShader(null); + } +} diff --git a/Content.Client/Overlays/SaturationScaleSystem.cs b/Content.Client/Overlays/SaturationScaleSystem.cs new file mode 100644 index 00000000000..57ce4d41682 --- /dev/null +++ b/Content.Client/Overlays/SaturationScaleSystem.cs @@ -0,0 +1,63 @@ +using Content.Shared.GameTicking; +using Content.Shared.Overlays; +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Player; + +namespace Content.Client.Overlays; + +public sealed class SaturationScaleSystem : EntitySystem +{ + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IOverlayManager _overlayMan = default!; + + private SaturationScaleOverlay _overlay = default!; + + + public override void Initialize() + { + base.Initialize(); + + _overlay = new(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); + + SubscribeNetworkEvent(RoundRestartCleanup); + } + + + private void RoundRestartCleanup(RoundRestartCleanupEvent ev) + { + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnPlayerDetached(EntityUid uid, SaturationScaleOverlayComponent component, PlayerDetachedEvent args) + { + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnPlayerAttached(EntityUid uid, SaturationScaleOverlayComponent component, PlayerAttachedEvent args) + { + _overlayMan.AddOverlay(_overlay); + } + + private void OnShutdown(EntityUid uid, SaturationScaleOverlayComponent component, ComponentShutdown args) + { + if (_player.LocalSession?.AttachedEntity != uid) + return; + + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnInit(EntityUid uid, SaturationScaleOverlayComponent component, ComponentInit args) + { + if (_player.LocalSession?.AttachedEntity != uid) + return; + + _overlayMan.AddOverlay(_overlay); + } +} diff --git a/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs b/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs index 511a720ed07..61dcc3331da 100644 --- a/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs +++ b/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs @@ -37,8 +37,8 @@ public async Task BananaSlipTest() var sprintWalks = sys.Config.GetCVar(CCVars.GamePressToSprint); await SpawnTarget("TrashBananaPeel"); - var modifier = Comp(Player).SprintSpeedModifier; - Assert.That(modifier, Is.EqualTo(1), "Player is not moving at full speed."); + // var modifier = Comp(Player).SprintSpeedModifier; + // Assert.That(modifier, Is.EqualTo(1), "Player is not moving at full speed."); // Yeeting this pointless Assert because it's not actually important. // Player is to the left of the banana peel and has not slipped. #pragma warning disable NUnit2045 diff --git a/Content.Server/Arcade/BlockGame/BlockGame.cs b/Content.Server/Arcade/BlockGame/BlockGame.cs index 3af1828d564..675776828f8 100644 --- a/Content.Server/Arcade/BlockGame/BlockGame.cs +++ b/Content.Server/Arcade/BlockGame/BlockGame.cs @@ -2,6 +2,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Random; using System.Linq; +using Content.Shared.Mood; namespace Content.Server.Arcade.BlockGame; @@ -82,6 +83,8 @@ private void InvokeGameover() { _highScorePlacement = _arcadeSystem.RegisterHighScore(meta.EntityName, Points); SendHighscoreUpdate(); + var ev = new MoodEffectEvent("ArcadePlay"); + _entityManager.EventBus.RaiseLocalEvent(meta.Owner, ev); } SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement)); } diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs index f60d88ebf78..a5ca626d131 100644 --- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs +++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.UserInterface; using Content.Server.Advertise; using Content.Server.Advertise.Components; +using Content.Shared.Mood; using static Content.Shared.Arcade.SharedSpaceVillainArcadeComponent; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -76,6 +77,9 @@ private void OnSVPlayerAction(EntityUid uid, SpaceVillainArcadeComponent compone if (!TryComp(uid, out var power) || !power.Powered) return; + if (msg.Session.AttachedEntity != null) + RaiseLocalEvent(msg.Session.AttachedEntity.Value, new MoodEffectEvent("ArcadePlay")); + switch (msg.PlayerAction) { case PlayerAction.Attack: diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index 948373940e4..9bea58330cd 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.FixedPoint; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; +using Content.Shared.Mood; using Robust.Shared.Containers; namespace Content.Server.Atmos.EntitySystems @@ -239,14 +240,16 @@ public override void Update(float frameTime) barotrauma.TakingDamage = true; _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); } - - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + RaiseLocalEvent(uid, new MoodEffectEvent("MobLowPressure")); + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); } else if (pressure >= Atmospherics.HazardHighPressure) { var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); + RaiseLocalEvent(uid, new MoodEffectEvent("MobHighPressure")); + if (!barotrauma.TakingDamage) { barotrauma.TakingDamage = true; diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index d34de937a41..7890b7751ac 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -23,6 +23,7 @@ using Content.Shared.Weapons.Melee.Events; using Content.Shared.FixedPoint; using Robust.Server.Audio; +using Content.Shared.Mood; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; @@ -410,10 +411,12 @@ public override void Update(float frameTime) if (!flammable.OnFire) { _alertsSystem.ClearAlert(uid, AlertType.Fire); + RaiseLocalEvent(uid, new MoodRemoveEffectEvent("OnFire")); continue; } _alertsSystem.ShowAlert(uid, AlertType.Fire); + RaiseLocalEvent(uid, new MoodEffectEvent("OnFire")); if (flammable.FireStacks > 0) { diff --git a/Content.Server/Bible/BibleSystem.cs b/Content.Server/Bible/BibleSystem.cs index c845b17230a..2798103cc1c 100644 --- a/Content.Server/Bible/BibleSystem.cs +++ b/Content.Server/Bible/BibleSystem.cs @@ -14,6 +14,7 @@ using Content.Shared.Popups; using Content.Shared.Timing; using Content.Shared.Verbs; +using Content.Shared.Mood; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Player; @@ -153,6 +154,8 @@ private void OnAfterInteract(EntityUid uid, BibleComponent component, AfterInter _audio.PlayPvs(component.HealSoundPath, args.User); _delay.TryResetDelay((uid, useDelay)); } + + RaiseLocalEvent(args.Target.Value, new MoodEffectEvent("GotBlessed")); } private void AddSummonVerb(EntityUid uid, SummonableComponent component, GetVerbsEvent args) diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index c7266e2c463..389e5fbab72 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Damage; using Content.Shared.Database; using Content.Shared.Mobs.Systems; +using Content.Shared.Mood; using JetBrains.Annotations; using Robust.Shared.Timing; @@ -177,6 +178,7 @@ private void TakeSuffocationDamage(Entity ent) { _alertsSystem.ShowAlert(ent, comp.Alert); } + RaiseLocalEvent(ent, new MoodEffectEvent("Suffocating")); } _damageableSys.TryChangeDamage(ent, ent.Comp.Damage, interruptsDoAfters: false); diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index fc9f0a9a9ff..a6f8522346f 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -21,6 +21,7 @@ using Robust.Shared.Timing; using System.Linq; using System.Text; +using Content.Shared.Mood; namespace Content.Server.GameTicking.Rules; @@ -199,6 +200,8 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool _npcFaction.RemoveFaction(traitor, component.NanoTrasenFaction, false); _npcFaction.AddFaction(traitor, component.SyndicateFaction); + RaiseLocalEvent(traitor, new MoodEffectEvent("TraitorFocused")); + // Give traitors their objectives if (giveObjectives) { diff --git a/Content.Server/Interaction/InteractionPopupSystem.cs b/Content.Server/Interaction/InteractionPopupSystem.cs index 77b76f898a7..a028598df03 100644 --- a/Content.Server/Interaction/InteractionPopupSystem.cs +++ b/Content.Server/Interaction/InteractionPopupSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Interaction; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Mood; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Player; @@ -78,7 +79,19 @@ private void SharedInteract( if (_random.Prob(component.SuccessChance)) { if (component.InteractSuccessString != null) + { msg = Loc.GetString(component.InteractSuccessString, ("target", Identity.Entity(uid, EntityManager))); // Success message (localized). + if (component.InteractSuccessString == "hugging-success-generic") + { + var ev = new MoodEffectEvent("BeingHugged"); + RaiseLocalEvent(target, ev); + } + else if (component.InteractSuccessString.Contains("petting-success-")) + { + var ev = new MoodEffectEvent("PetAnimal"); + RaiseLocalEvent(user, ev); + } + } if (component.InteractSuccessSound != null) sfx = component.InteractSuccessSound; diff --git a/Content.Server/Medical/VomitSystem.cs b/Content.Server/Medical/VomitSystem.cs index 8c3b15aed33..dc049b2a1d6 100644 --- a/Content.Server/Medical/VomitSystem.cs +++ b/Content.Server/Medical/VomitSystem.cs @@ -11,6 +11,7 @@ using Content.Shared.Nutrition.EntitySystems; using Content.Shared.StatusEffect; using Robust.Server.Audio; +using Content.Shared.Mood; using Robust.Shared.Audio; using Robust.Shared.Prototypes; @@ -94,6 +95,8 @@ public void Vomit(EntityUid uid, float thirstAdded = -40f, float hungerAdded = - // Force sound to play as spill doesn't work if solution is empty. _audio.PlayPvs("/Audio/Effects/Fluids/splat.ogg", uid, AudioParams.Default.WithVariation(0.2f).WithVolume(-4f)); _popup.PopupEntity(Loc.GetString("disease-vomit", ("person", Identity.Entity(uid, EntityManager))), uid); + + RaiseLocalEvent(uid, new MoodEffectEvent("MobVomit")); } } } diff --git a/Content.Server/Mood/MoodComponent.cs b/Content.Server/Mood/MoodComponent.cs new file mode 100644 index 00000000000..7fd4a7136f3 --- /dev/null +++ b/Content.Server/Mood/MoodComponent.cs @@ -0,0 +1,111 @@ +using Content.Shared.Alert; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Generic; + +namespace Content.Server.Mood; + +[RegisterComponent] +public sealed partial class MoodComponent : Component +{ + [DataField] + public float CurrentMoodLevel; + + [DataField] + public MoodThreshold CurrentMoodThreshold; + + [DataField] + public MoodThreshold LastThreshold; + + [ViewVariables(VVAccess.ReadOnly)] + public readonly Dictionary CategorisedEffects = new(); + + [ViewVariables(VVAccess.ReadOnly)] + public readonly Dictionary UncategorisedEffects = new(); + + /// + /// The formula for the movement speed modifier is SpeedBonusGrowth ^ (MoodLevel - MoodThreshold.Neutral). + /// Change this ONLY BY 0.001 AT A TIME. + /// + [DataField] + public float SpeedBonusGrowth = 1.003f; + + /// + /// The lowest point that low morale can multiply our movement speed by. Lowering speed follows a linear curve, rather than geometric. + /// + [DataField] + public float MinimumSpeedModifier = 0.75f; + + /// + /// The maximum amount that high morale can multiply our movement speed by. This follows a significantly slower geometric sequence. + /// + [DataField] + public float MaximumSpeedModifier = 1.15f; + + [DataField] + public float IncreaseCritThreshold = 1.2f; + + [DataField] + public float DecreaseCritThreshold = 0.9f; + + [ViewVariables(VVAccess.ReadOnly)] + public FixedPoint2 CritThresholdBeforeModify; + + [DataField(customTypeSerializer: typeof(DictionarySerializer))] + public Dictionary MoodThresholds = new() + { + { MoodThreshold.Perfect, 100f }, + { MoodThreshold.Exceptional, 80f }, + { MoodThreshold.Great, 70f }, + { MoodThreshold.Good, 60f }, + { MoodThreshold.Neutral, 50f }, + { MoodThreshold.Meh, 40f }, + { MoodThreshold.Bad, 30f }, + { MoodThreshold.Terrible, 20f }, + { MoodThreshold.Horrible, 10f }, + { MoodThreshold.Dead, 0f } + }; + + [DataField(customTypeSerializer: typeof(DictionarySerializer))] + public Dictionary MoodThresholdsAlerts = new() + { + { MoodThreshold.Dead, AlertType.MoodDead }, + { MoodThreshold.Horrible, AlertType.Horrible }, + { MoodThreshold.Terrible, AlertType.Terrible }, + { MoodThreshold.Bad, AlertType.Bad }, + { MoodThreshold.Meh, AlertType.Meh }, + { MoodThreshold.Neutral, AlertType.Neutral }, + { MoodThreshold.Good, AlertType.Good }, + { MoodThreshold.Great, AlertType.Great }, + { MoodThreshold.Exceptional, AlertType.Exceptional }, + { MoodThreshold.Perfect, AlertType.Perfect }, + { MoodThreshold.Insane, AlertType.Insane } + }; + + /// + /// These thresholds represent a percentage of Crit-Threshold, 0.8 corresponding with 80%. + /// + [DataField(customTypeSerializer: typeof(DictionarySerializer))] + public Dictionary HealthMoodEffectsThresholds = new() + { + { "HealthHeavyDamage", 0.8f }, + { "HealthSevereDamage", 0.5f }, + { "HealthLightDamage", 0.1f }, + { "HealthNoDamage", 0.05f } + }; +} + +[Serializable] +public enum MoodThreshold : ushort +{ + Insane = 1, + Horrible = 2, + Terrible = 3, + Bad = 4, + Meh = 5, + Neutral = 6, + Good = 7, + Great = 8, + Exceptional = 9, + Perfect = 10, + Dead = 0 +} diff --git a/Content.Server/Mood/MoodSystem.cs b/Content.Server/Mood/MoodSystem.cs new file mode 100644 index 00000000000..f0c293971a1 --- /dev/null +++ b/Content.Server/Mood/MoodSystem.cs @@ -0,0 +1,422 @@ +using Content.Server.Chat.Managers; +using Content.Server.Popups; +using Content.Shared.Alert; +using Content.Shared.Chat; +using Content.Shared.Damage; +using Content.Shared.FixedPoint; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Movement.Systems; +using Content.Shared.Mood; +using Content.Shared.Overlays; +using Content.Shared.Popups; +using Content.Shared.Traits.Assorted.Components; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; +using Timer = Robust.Shared.Timing.Timer; +using Robust.Server.Player; +using Robust.Shared.Player; +using Robust.Shared.Configuration; +using Content.Shared.CCVar; + +namespace Content.Server.Mood; + +public sealed class MoodSystem : EntitySystem +{ + [Dependency] private readonly AlertsSystem _alerts = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; + [Dependency] private readonly SharedJetpackSystem _jetpack = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnMoodEffect); + SubscribeLocalEvent(OnDamageChange); + SubscribeLocalEvent(OnRefreshMoveSpeed); + SubscribeLocalEvent(OnRemoveEffect); + + SubscribeLocalEvent(OnTraitStartup); + } + + + private void OnRemoveEffect(EntityUid uid, MoodComponent component, MoodRemoveEffectEvent args) + { + if (component.UncategorisedEffects.TryGetValue(args.EffectId, out _)) + RemoveTimedOutEffect(uid, args.EffectId); + else + foreach (var (category, id) in component.CategorisedEffects) + if (id == args.EffectId) + { + RemoveTimedOutEffect(uid, args.EffectId, category); + return; + } + } + + private void OnRefreshMoveSpeed(EntityUid uid, MoodComponent component, RefreshMovementSpeedModifiersEvent args) + { + if (component.CurrentMoodThreshold is > MoodThreshold.Meh and < MoodThreshold.Good or MoodThreshold.Dead + || _jetpack.IsUserFlying(uid)) + return; + + // This ridiculous math serves a purpose making high mood less impactful on movement speed than low mood + var modifier = + Math.Clamp( + (component.CurrentMoodLevel >= component.MoodThresholds[MoodThreshold.Neutral]) + ? _config.GetCVar(CCVars.MoodIncreasesSpeed) + ? MathF.Pow(1.003f, component.CurrentMoodLevel - component.MoodThresholds[MoodThreshold.Neutral]) + : 1 + : _config.GetCVar(CCVars.MoodDecreasesSpeed) + ? 2 - component.MoodThresholds[MoodThreshold.Neutral] / component.CurrentMoodLevel + : 1, + component.MinimumSpeedModifier, + component.MaximumSpeedModifier); + + args.ModifySpeed(1, modifier); + } + + private void OnTraitStartup(EntityUid uid, MoodModifyTraitComponent component, ComponentStartup args) + { + if (component.MoodId != null) + RaiseLocalEvent(uid, new MoodEffectEvent($"{component.MoodId}")); + } + + private void OnMoodEffect(EntityUid uid, MoodComponent component, MoodEffectEvent args) + { + if (!_config.GetCVar(CCVars.MoodEnabled) + || !_prototypeManager.TryIndex(args.EffectId, out var prototype)) + return; + + var ev = new OnMoodEffect(uid, args.EffectId, args.EffectModifier, args.EffectOffset); + RaiseLocalEvent(uid, ref ev); + + ApplyEffect(uid, component, prototype, ev.EffectModifier, ev.EffectOffset); + } + + private void ApplyEffect(EntityUid uid, MoodComponent component, MoodEffectPrototype prototype, float eventModifier = 1, float eventOffset = 0) + { + // Apply categorised effect + if (prototype.Category != null) + { + if (component.CategorisedEffects.TryGetValue(prototype.Category, out var oldPrototypeId)) + { + if (!_prototypeManager.TryIndex(oldPrototypeId, out var oldPrototype)) + return; + + if (prototype.ID != oldPrototype.ID) + { + SendEffectText(uid, prototype); + component.CategorisedEffects[prototype.Category] = prototype.ID; + } + } + else + { + component.CategorisedEffects.Add(prototype.Category, prototype.ID); + } + + if (prototype.Timeout != 0) + Timer.Spawn(TimeSpan.FromSeconds(prototype.Timeout), () => RemoveTimedOutEffect(uid, prototype.ID, prototype.Category)); + } + // Apply uncategorised effect + else + { + if (component.UncategorisedEffects.TryGetValue(prototype.ID, out _)) + return; + + var moodChange = prototype.MoodChange * eventModifier + eventOffset; + if (moodChange == 0) + return; + + SendEffectText(uid, prototype); + component.UncategorisedEffects.Add(prototype.ID, moodChange); + + if (prototype.Timeout != 0) + Timer.Spawn(TimeSpan.FromSeconds(prototype.Timeout), () => RemoveTimedOutEffect(uid, prototype.ID)); + } + + RefreshMood(uid, component); + } + + private void SendEffectText(EntityUid uid, MoodEffectPrototype prototype) + { + if (!prototype.Hidden) + _popup.PopupEntity(prototype.Description, uid, uid, (prototype.MoodChange > 0) ? PopupType.Medium : PopupType.MediumCaution); + } + + private void RemoveTimedOutEffect(EntityUid uid, string prototypeId, string? category = null) + { + if (!TryComp(uid, out var comp)) + return; + + if (category == null) + { + if (!comp.UncategorisedEffects.ContainsKey(prototypeId)) + return; + comp.UncategorisedEffects.Remove(prototypeId); + } + else + { + if (!comp.CategorisedEffects.TryGetValue(category, out var currentProtoId) + || currentProtoId != prototypeId + || !_prototypeManager.HasIndex(currentProtoId)) + return; + comp.CategorisedEffects.Remove(category); + } + + RefreshMood(uid, comp); + } + + private void OnMobStateChanged(EntityUid uid, MoodComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead && args.OldMobState != MobState.Dead) + { + var ev = new MoodEffectEvent("Dead"); + RaiseLocalEvent(uid, ev); + } + else if (args.OldMobState == MobState.Dead && args.NewMobState != MobState.Dead) + { + var ev = new MoodRemoveEffectEvent("Dead"); + RaiseLocalEvent(uid, ev); + } + RefreshMood(uid, component); + } + + // + // Recalculate the mood level of an entity by summing up all moodlets. + // + private void RefreshMood(EntityUid uid, MoodComponent component) + { + var amount = 0f; + + foreach (var (_, protoId) in component.CategorisedEffects) + { + if (!_prototypeManager.TryIndex(protoId, out var prototype)) + continue; + + amount += prototype.MoodChange; + } + + foreach (var (_, value) in component.UncategorisedEffects) + amount += value; + + SetMood(uid, amount, component, refresh: true); + } + + private void OnInit(EntityUid uid, MoodComponent component, ComponentStartup args) + { + if (TryComp(uid, out var mobThresholdsComponent) + && _mobThreshold.TryGetThresholdForState(uid, MobState.Critical, out var critThreshold, mobThresholdsComponent)) + component.CritThresholdBeforeModify = critThreshold.Value; + + EnsureComp(uid); + RefreshMood(uid, component); + } + + private void SetMood(EntityUid uid, float amount, MoodComponent? component = null, bool force = false, bool refresh = false) + { + if (!_config.GetCVar(CCVars.MoodEnabled) + || !Resolve(uid, ref component) + || component.CurrentMoodThreshold == MoodThreshold.Dead && !refresh) + return; + + var neutral = component.MoodThresholds[MoodThreshold.Neutral]; + var ev = new OnSetMoodEvent(uid, amount, false); + RaiseLocalEvent(uid, ref ev); + + if (ev.Cancelled) + return; + else + { + uid = ev.Receiver; + amount = ev.MoodChangedAmount; + } + + var newMoodLevel = amount + neutral; + if (!force) + newMoodLevel = Math.Clamp(amount + neutral, + component.MoodThresholds[MoodThreshold.Dead], + component.MoodThresholds[MoodThreshold.Perfect]); + + component.CurrentMoodLevel = newMoodLevel; + + if (TryComp(uid, out var mood)) + { + mood.CurrentMoodLevel = component.CurrentMoodLevel; + mood.NeutralMoodThreshold = component.MoodThresholds.GetValueOrDefault(MoodThreshold.Neutral); + } + + UpdateCurrentThreshold(uid, component); + } + + private void UpdateCurrentThreshold(EntityUid uid, MoodComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + + var calculatedThreshold = GetMoodThreshold(component); + if (calculatedThreshold == component.CurrentMoodThreshold) + return; + + component.CurrentMoodThreshold = calculatedThreshold; + + DoMoodThresholdsEffects(uid, component); + } + + private void DoMoodThresholdsEffects(EntityUid uid, MoodComponent? component = null, bool force = false) + { + if (!Resolve(uid, ref component) + || component.CurrentMoodThreshold == component.LastThreshold && !force) + return; + + var modifier = GetMovementThreshold(component.CurrentMoodThreshold); + + // Modify mob stats + if (modifier != GetMovementThreshold(component.LastThreshold)) + { + _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); + SetCritThreshold(uid, component, modifier); + RefreshShaders(uid, modifier); + } + + // Modify interface + if (component.MoodThresholdsAlerts.TryGetValue(component.CurrentMoodThreshold, out var alertId)) + _alerts.ShowAlert(uid, alertId); + else + _alerts.ClearAlertCategory(uid, AlertCategory.Mood); + + component.LastThreshold = component.CurrentMoodThreshold; + } + + private void RefreshShaders(EntityUid uid, int modifier) + { + if (modifier == -1) + EnsureComp(uid); + else + RemComp(uid); + } + + private void SetCritThreshold(EntityUid uid, MoodComponent component, int modifier) + { + if (!TryComp(uid, out var mobThresholds) + || !_mobThreshold.TryGetThresholdForState(uid, MobState.Critical, out var key)) + return; + + var newKey = modifier switch + { + 1 => FixedPoint2.New(key.Value.Float() * component.IncreaseCritThreshold), + -1 => FixedPoint2.New(key.Value.Float() * component.DecreaseCritThreshold), + _ => component.CritThresholdBeforeModify + }; + + component.CritThresholdBeforeModify = key.Value; + _mobThreshold.SetMobStateThreshold(uid, newKey, MobState.Critical, mobThresholds); + } + + private MoodThreshold GetMoodThreshold(MoodComponent component, float? moodLevel = null) + { + moodLevel ??= component.CurrentMoodLevel; + var result = MoodThreshold.Dead; + var value = component.MoodThresholds[MoodThreshold.Perfect]; + + foreach (var threshold in component.MoodThresholds) + if (threshold.Value <= value && threshold.Value >= moodLevel) + { + result = threshold.Key; + value = threshold.Value; + } + + return result; + } + + private int GetMovementThreshold(MoodThreshold threshold) + { + return threshold switch + { + >= MoodThreshold.Good => 1, + <= MoodThreshold.Meh => -1, + _ => 0 + }; + } + + private void OnDamageChange(EntityUid uid, MoodComponent component, DamageChangedEvent args) + { + if (!_mobThreshold.TryGetPercentageForState(uid, MobState.Critical, args.Damageable.TotalDamage, out var damage)) + return; + + var protoId = "HealthNoDamage"; + var value = component.HealthMoodEffectsThresholds["HealthNoDamage"]; + + foreach (var threshold in component.HealthMoodEffectsThresholds) + if (threshold.Value <= damage && threshold.Value >= value) + { + protoId = threshold.Key; + value = threshold.Value; + } + + var ev = new MoodEffectEvent(protoId); + RaiseLocalEvent(uid, ev); + } +} + +[UsedImplicitly] +[DataDefinition] +public sealed partial class ShowMoodEffects : IAlertClick +{ + public void AlertClicked(EntityUid uid) + { + var entityManager = IoCManager.Resolve(); + var prototypeManager = IoCManager.Resolve(); + var chatManager = IoCManager.Resolve(); + var playerManager = IoCManager.Resolve(); + + if (!entityManager.TryGetComponent(uid, out var comp) + || comp.CurrentMoodThreshold == MoodThreshold.Dead + || !playerManager.TryGetSessionByEntity(uid, out var session) + || session == null) + return; + + var msgStart = Loc.GetString("mood-show-effects-start"); + chatManager.ChatMessageToOne(ChatChannel.Emotes, msgStart, msgStart, EntityUid.Invalid, false, + session.Channel); + + foreach (var (_, protoId) in comp.CategorisedEffects) + { + if (!prototypeManager.TryIndex(protoId, out var proto) + || proto.Hidden) + continue; + + SendDescToChat(proto, session); + } + + foreach (var (protoId, _) in comp.UncategorisedEffects) + { + if (!prototypeManager.TryIndex(protoId, out var proto) + || proto.Hidden) + continue; + + SendDescToChat(proto, session); + } + } + + private void SendDescToChat(MoodEffectPrototype proto, ICommonSession session) + { + if (session == null) + return; + + var chatManager = IoCManager.Resolve(); + + var color = (proto.MoodChange > 0) ? "#008000" : "#BA0000"; + var msg = $"[font size=10][color={color}]{proto.Description}[/color][/font]"; + + chatManager.ChatMessageToOne(ChatChannel.Emotes, msg, msg, EntityUid.Invalid, false, + session.Channel); + } +} diff --git a/Content.Server/Traits/Assorted/ModifyMoodTraitComponent.cs b/Content.Server/Traits/Assorted/ModifyMoodTraitComponent.cs new file mode 100644 index 00000000000..f9ae3b36f3a --- /dev/null +++ b/Content.Server/Traits/Assorted/ModifyMoodTraitComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// Used for traits that add a starting moodlet. +/// +[RegisterComponent] +public sealed partial class MoodModifyTraitComponent : Component +{ + [DataField] + public string? MoodId = null; +} diff --git a/Content.Shared/Alert/AlertCategory.cs b/Content.Shared/Alert/AlertCategory.cs index 7450f585a4e..57a3e40f70e 100644 --- a/Content.Shared/Alert/AlertCategory.cs +++ b/Content.Shared/Alert/AlertCategory.cs @@ -10,6 +10,7 @@ public enum AlertCategory Breathing, Buckled, Health, + Mood, Internals, Stamina, Piloting, diff --git a/Content.Shared/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs index dc323dc64a8..1130e25b66d 100644 --- a/Content.Shared/Alert/AlertType.cs +++ b/Content.Shared/Alert/AlertType.cs @@ -25,6 +25,22 @@ public enum AlertType : byte HumanHealth, BorgBattery, BorgBatteryNone, + + // Mood + Bleeding, + Insane, + Horrible, + Terrible, + Bad, + Meh, + Neutral, + Good, + Great, + Exceptional, + Perfect, + MoodDead, + CultBuffed, + PilotingShuttle, Peckish, Starving, diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index ff2a915b1ba..19d0ca6461c 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2381,6 +2381,12 @@ public static readonly CVarDef public static readonly CVarDef DoMindContests = CVarDef.Create("contests.do_mind_contests", true, CVar.REPLICATED | CVar.SERVER); + /// + /// Toggles all MoodContest functions. All mood contests output 1f when false. + /// + public static readonly CVarDef DoMoodContests = + CVarDef.Create("contests.do_mood_contests", true, CVar.REPLICATED | CVar.SERVER); + /// /// The maximum amount that Mass Contests can modify a physics multiplier, given as a +/- percentage /// Default of 0.25f outputs between * 0.75f and 1.25f @@ -2438,5 +2444,18 @@ public static readonly CVarDef CVarDef.Create("supermatter.rads_modifier", 1f, CVar.SERVER); #endregion + + #region Mood System + + public static readonly CVarDef MoodEnabled = + CVarDef.Create("mood.enabled", true, CVar.SERVER); + + public static readonly CVarDef MoodIncreasesSpeed = + CVarDef.Create("mood.increases_speed", true, CVar.SERVER); + + public static readonly CVarDef MoodDecreasesSpeed = + CVarDef.Create("mood.decreases_speed", true, CVar.SERVER); + + #endregion } } diff --git a/Content.Shared/Contests/ContestsSystem.cs b/Content.Shared/Contests/ContestsSystem.cs index 47924f4d795..008e5e9ca97 100644 --- a/Content.Shared/Contests/ContestsSystem.cs +++ b/Content.Shared/Contests/ContestsSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Mood; using Robust.Shared.Configuration; using Robust.Shared.Physics.Components; @@ -251,6 +252,52 @@ public float MindContest(EntityUid performer, EntityUid target, bool bypassClamp #endregion + #region Mood Contests + + /// + /// Outputs the ratio of an Entity's mood level and its Neutral Mood threshold. + /// + /// + /// + /// + public float MoodContest(EntityUid performer, bool bypassClamp = false, float rangeFactor = 1f) + { + if (!_cfg.GetCVar(CCVars.DoContestsSystem) + || !_cfg.GetCVar(CCVars.DoMoodContests) + || !TryComp(performer, out var mood)) + return 1f; + + return _cfg.GetCVar(CCVars.AllowClampOverride) && bypassClamp + ? mood.CurrentMoodLevel / mood.NeutralMoodThreshold + : Math.Clamp(mood.CurrentMoodLevel / mood.NeutralMoodThreshold, + 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor, + 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor); + } + + /// + /// Outputs the ratio of mood level between two Entities. + /// + /// + /// + /// + /// + public float MoodContest(EntityUid performer, EntityUid target, bool bypassClamp = false, float rangeFactor = 1f) + { + if (!_cfg.GetCVar(CCVars.DoContestsSystem) + || !_cfg.GetCVar(CCVars.DoMoodContests) + || !TryComp(performer, out var performerMood) + || !TryComp(target, out var targetMood)) + return 1f; + + return _cfg.GetCVar(CCVars.AllowClampOverride) && bypassClamp + ? performerMood.CurrentMoodLevel / targetMood.CurrentMoodLevel + : Math.Clamp(performerMood.CurrentMoodLevel / targetMood.CurrentMoodLevel, + 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor, + 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor); + } + + #endregion + #region EVERY CONTESTS public float EveryContest( @@ -259,34 +306,40 @@ public float EveryContest( bool bypassClampStamina = false, bool bypassClampHealth = false, bool bypassClampMind = false, + bool bypassClampMood = false, float rangeFactorMass = 1f, float rangeFactorStamina = 1f, float rangeFactorHealth = 1f, float rangeFactorMind = 1f, + float rangeFactorMood = 1f, float weightMass = 1f, float weightStamina = 1f, float weightHealth = 1f, float weightMind = 1f, + float weightMood = 1f, bool sumOrMultiply = false) { if (!_cfg.GetCVar(CCVars.DoContestsSystem)) return 1f; - var weightTotal = weightMass + weightStamina + weightHealth + weightMind; + var weightTotal = weightMass + weightStamina + weightHealth + weightMind + weightMood; var massMultiplier = weightMass / weightTotal; var staminaMultiplier = weightStamina / weightTotal; var healthMultiplier = weightHealth / weightTotal; var mindMultiplier = weightMind / weightTotal; + var moodMultiplier = weightMood / weightTotal; return sumOrMultiply ? MassContest(performer, bypassClampMass, rangeFactorMass) * massMultiplier + StaminaContest(performer, bypassClampStamina, rangeFactorStamina) * staminaMultiplier + HealthContest(performer, bypassClampHealth, rangeFactorHealth) * healthMultiplier + MindContest(performer, bypassClampMind, rangeFactorMind) * mindMultiplier + + MoodContest(performer, bypassClampMood, rangeFactorMood) * moodMultiplier : MassContest(performer, bypassClampMass, rangeFactorMass) * massMultiplier * StaminaContest(performer, bypassClampStamina, rangeFactorStamina) * staminaMultiplier * HealthContest(performer, bypassClampHealth, rangeFactorHealth) * healthMultiplier - * MindContest(performer, bypassClampMind, rangeFactorMind) * mindMultiplier; + * MindContest(performer, bypassClampMind, rangeFactorMind) * mindMultiplier + * MoodContest(performer, bypassClampMood, rangeFactorMood) * moodMultiplier; } public float EveryContest( @@ -296,34 +349,40 @@ public float EveryContest( bool bypassClampStamina = false, bool bypassClampHealth = false, bool bypassClampMind = false, + bool bypassClampMood = false, float rangeFactorMass = 1f, float rangeFactorStamina = 1f, float rangeFactorHealth = 1f, float rangeFactorMind = 1f, + float rangeFactorMood = 1f, float weightMass = 1f, float weightStamina = 1f, float weightHealth = 1f, float weightMind = 1f, + float weightMood = 1f, bool sumOrMultiply = false) { if (!_cfg.GetCVar(CCVars.DoContestsSystem)) return 1f; - var weightTotal = weightMass + weightStamina + weightHealth + weightMind; + var weightTotal = weightMass + weightStamina + weightHealth + weightMind + weightMood; var massMultiplier = weightMass / weightTotal; var staminaMultiplier = weightStamina / weightTotal; var healthMultiplier = weightHealth / weightTotal; var mindMultiplier = weightMind / weightTotal; + var moodMultiplier = weightMood / weightTotal; return sumOrMultiply ? MassContest(performer, target, bypassClampMass, rangeFactorMass) * massMultiplier + StaminaContest(performer, target, bypassClampStamina, rangeFactorStamina) * staminaMultiplier + HealthContest(performer, target, bypassClampHealth, rangeFactorHealth) * healthMultiplier + MindContest(performer, target, bypassClampMind, rangeFactorMind) * mindMultiplier + + MoodContest(performer, target, bypassClampMood, rangeFactorMood) * moodMultiplier : MassContest(performer, target, bypassClampMass, rangeFactorMass) * massMultiplier * StaminaContest(performer, target, bypassClampStamina, rangeFactorStamina) * staminaMultiplier * HealthContest(performer, target, bypassClampHealth, rangeFactorHealth) * healthMultiplier - * MindContest(performer, target, bypassClampMind, rangeFactorMind) * mindMultiplier; + * MindContest(performer, target, bypassClampMind, rangeFactorMind) * mindMultiplier + * MoodContest(performer, target, bypassClampMood, rangeFactorMood) * moodMultiplier; } #endregion } diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index b47fa08bc78..ebbafef7f0e 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -28,6 +28,7 @@ using Content.Shared.Verbs; using Content.Shared.Weapons.Melee.Events; using Robust.Shared.Audio.Systems; +using Content.Shared.Mood; using Robust.Shared.Containers; using Robust.Shared.Network; using Robust.Shared.Player; @@ -174,9 +175,15 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) _actionBlocker.UpdateCanMove(uid); if (component.CanStillInteract) + { _alerts.ClearAlert(uid, AlertType.Handcuffed); + RaiseLocalEvent(uid, new MoodRemoveEffectEvent("Handcuffed")); + } else + { _alerts.ShowAlert(uid, AlertType.Handcuffed); + RaiseLocalEvent(uid, new MoodEffectEvent("Handcuffed")); + } var ev = new CuffedStateChangeEvent(); RaiseLocalEvent(uid, ref ev); diff --git a/Content.Shared/Mood/MoodCategoryPrototype.cs b/Content.Shared/Mood/MoodCategoryPrototype.cs new file mode 100644 index 00000000000..13d5f8b7ea6 --- /dev/null +++ b/Content.Shared/Mood/MoodCategoryPrototype.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Mood; + +/// +/// A prototype defining a category for moodlets, where only a single moodlet of a given category is permitted. +/// +[Prototype] +public sealed class MoodCategoryPrototype : IPrototype +{ + [IdDataField] + public string ID { get; } = default!; +} diff --git a/Content.Shared/Mood/MoodEffectPrototype.cs b/Content.Shared/Mood/MoodEffectPrototype.cs new file mode 100644 index 00000000000..ad21faec807 --- /dev/null +++ b/Content.Shared/Mood/MoodEffectPrototype.cs @@ -0,0 +1,35 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Mood; + +[Prototype] +public sealed class MoodEffectPrototype : IPrototype +{ + /// + /// The ID of the moodlet to use. + /// + [IdDataField] + public string ID { get; } = default!; + + public string Description => Loc.GetString($"mood-effect-{ID}"); + /// + /// If they already have an effect with the same category, the new one will replace the old one. + /// + [DataField, ValidatePrototypeId] + public string? Category; + /// + /// How much should this moodlet modify an entity's Mood. + /// + [DataField(required: true)] + public float MoodChange; + /// + /// How long, in Seconds, does this moodlet last? If omitted, the moodlet will last until canceled by any system. + /// + [DataField] + public int Timeout; + /// + /// Should this moodlet be hidden from the player? EG: No popups or chat messages. + /// + [DataField] + public bool Hidden; +} diff --git a/Content.Shared/Mood/MoodEvents.cs b/Content.Shared/Mood/MoodEvents.cs new file mode 100644 index 00000000000..58a993d2b7f --- /dev/null +++ b/Content.Shared/Mood/MoodEvents.cs @@ -0,0 +1,59 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Mood; + +[Serializable, NetSerializable] +public sealed class MoodEffectEvent : EntityEventArgs +{ + /// + /// ID of the moodlet prototype to use + /// + public string EffectId; + + /// + /// How much should the mood change be multiplied by + ///
+ /// This does nothing if the moodlet ID matches one with the same Category + ///
+ public float EffectModifier = 1f; + + /// + /// How much should the mood change be offset by, after multiplication + ///
+ /// This does nothing if the moodlet ID matches one with the same Category + ///
+ public float EffectOffset = 0f; + + public MoodEffectEvent(string effectId, float effectModifier = 1f, float effectOffset = 0f) + { + EffectId = effectId; + EffectModifier = effectModifier; + EffectOffset = effectOffset; + } +} + +[Serializable, NetSerializable] +public sealed class MoodRemoveEffectEvent : EntityEventArgs +{ + public string EffectId; + + public MoodRemoveEffectEvent(string effectId) + { + EffectId = effectId; + } +} + +/// +/// This event is raised whenever an entity sets their mood, allowing other systems to modify the end result of mood math. +/// EG: The end result after tallying up all Moodlets comes out to 70, but a trait multiplies it by 0.8 to make it 56. +/// +[ByRefEvent] +public record struct OnSetMoodEvent(EntityUid Receiver, float MoodChangedAmount, bool Cancelled); + +/// +/// This event is raised on an entity when it receives a mood effect, but before the effects are calculated. +/// Allows for other systems to pick and choose specific events to modify. +/// +[ByRefEvent] +public record struct OnMoodEffect(EntityUid Receiver, string EffectId, float EffectModifier = 1, float EffectOffset = 0); + diff --git a/Content.Shared/Mood/SharedMoodComponent.cs b/Content.Shared/Mood/SharedMoodComponent.cs new file mode 100644 index 00000000000..566f5c7b668 --- /dev/null +++ b/Content.Shared/Mood/SharedMoodComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Shared.Mood; + +/// +/// This component exists solely to network CurrentMoodLevel, so that clients can make use of its value for math Prediction. +/// All mood logic is otherwise handled by the Server, and the client is not allowed to know the identity of its mood events. +/// +[RegisterComponent, AutoGenerateComponentState] +public sealed partial class NetMoodComponent : Component +{ + [DataField, AutoNetworkedField] + public float CurrentMoodLevel; + + [DataField, AutoNetworkedField] + public float NeutralMoodThreshold; +} \ No newline at end of file diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index d8808b6e4ab..1bc2a945f31 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -4,8 +4,12 @@ using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.Components; using Content.Shared.Rejuvenate; +using Content.Shared.Mood; +using Robust.Shared.Network; using Robust.Shared.Random; using Robust.Shared.Timing; +using Robust.Shared.Configuration; +using Content.Shared.CCVar; namespace Content.Shared.Nutrition.EntitySystems; @@ -18,6 +22,8 @@ public sealed class HungerSystem : EntitySystem [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly IConfigurationManager _config = default!; public override void Initialize() { @@ -44,10 +50,9 @@ private void OnShutdown(EntityUid uid, HungerComponent component, ComponentShutd private void OnRefreshMovespeed(EntityUid uid, HungerComponent component, RefreshMovementSpeedModifiersEvent args) { - if (component.CurrentThreshold > HungerThreshold.Starving) - return; - - if (_jetpack.IsUserFlying(uid)) + if (_config.GetCVar(CCVars.MoodEnabled) + || component.CurrentThreshold > HungerThreshold.Starving + || _jetpack.IsUserFlying(uid)) return; args.ModifySpeed(component.StarvingSlowdownModifier, component.StarvingSlowdownModifier); @@ -111,7 +116,13 @@ private void DoHungerThresholdEffects(EntityUid uid, HungerComponent? component if (GetMovementThreshold(component.CurrentThreshold) != GetMovementThreshold(component.LastThreshold)) { - _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); + if (!_config.GetCVar(CCVars.MoodEnabled)) + _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); + else if (_net.IsServer) + { + var ev = new MoodEffectEvent("Hunger" + component.CurrentThreshold); + RaiseLocalEvent(uid, ev); + } } if (component.HungerThresholdAlerts.TryGetValue(component.CurrentThreshold, out var alertId)) diff --git a/Content.Shared/Nutrition/EntitySystems/SharedCreamPieSystem.cs b/Content.Shared/Nutrition/EntitySystems/SharedCreamPieSystem.cs index bd7251b9438..c61e8e5ba42 100644 --- a/Content.Shared/Nutrition/EntitySystems/SharedCreamPieSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/SharedCreamPieSystem.cs @@ -1,6 +1,7 @@ using Content.Shared.Nutrition.Components; using Content.Shared.Stunnable; using Content.Shared.Throwing; +using Content.Shared.Mood; using JetBrains.Annotations; namespace Content.Shared.Nutrition.EntitySystems @@ -44,6 +45,11 @@ public void SetCreamPied(EntityUid uid, CreamPiedComponent creamPied, bool value { _appearance.SetData(uid, CreamPiedVisuals.Creamed, value, appearance); } + + if (value) + RaiseLocalEvent(uid, new MoodEffectEvent("Creampied")); + else + RaiseLocalEvent(uid, new MoodRemoveEffectEvent("Creampied")); } private void OnCreamPieLand(EntityUid uid, CreamPieComponent component, ref LandEvent args) diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 29218f57198..f1ddc9b2b5e 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -6,6 +6,9 @@ using JetBrains.Annotations; using Robust.Shared.Random; using Robust.Shared.Timing; +using Content.Shared.Mood; +using Robust.Shared.Configuration; +using Content.Shared.CCVar; namespace Content.Shared.Nutrition.EntitySystems; @@ -17,6 +20,7 @@ public sealed class ThirstSystem : EntitySystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!; + [Dependency] private readonly IConfigurationManager _config = default!; public override void Initialize() { @@ -49,7 +53,8 @@ private void OnMapInit(EntityUid uid, ThirstComponent component, MapInitEvent ar private void OnRefreshMovespeed(EntityUid uid, ThirstComponent component, RefreshMovementSpeedModifiersEvent args) { // TODO: This should really be taken care of somewhere else - if (_jetpack.IsUserFlying(uid)) + if (_config.GetCVar(CCVars.MoodEnabled) + || _jetpack.IsUserFlying(uid)) return; var mod = component.CurrentThirstThreshold <= ThirstThreshold.Parched ? 0.75f : 1.0f; @@ -109,8 +114,9 @@ private bool IsMovementThreshold(ThirstThreshold threshold) private void UpdateEffects(EntityUid uid, ThirstComponent component) { - if (IsMovementThreshold(component.LastThirstThreshold) != IsMovementThreshold(component.CurrentThirstThreshold) && - TryComp(uid, out MovementSpeedModifierComponent? movementSlowdownComponent)) + if (!_config.GetCVar(CCVars.MoodEnabled) + && IsMovementThreshold(component.LastThirstThreshold) != IsMovementThreshold(component.CurrentThirstThreshold) + && TryComp(uid, out MovementSpeedModifierComponent? movementSlowdownComponent)) { _movement.RefreshMovementSpeedModifiers(uid, movementSlowdownComponent); } @@ -125,6 +131,9 @@ private void UpdateEffects(EntityUid uid, ThirstComponent component) _alerts.ClearAlertCategory(uid, AlertCategory.Thirst); } + var ev = new MoodEffectEvent("Thirst" + component.CurrentThirstThreshold); + RaiseLocalEvent(uid, ev); + switch (component.CurrentThirstThreshold) { case ThirstThreshold.OverHydrated: diff --git a/Content.Shared/Overlays/SaturationScaleComponent.cs b/Content.Shared/Overlays/SaturationScaleComponent.cs new file mode 100644 index 00000000000..3318ddff6d4 --- /dev/null +++ b/Content.Shared/Overlays/SaturationScaleComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Overlays; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SaturationScaleOverlayComponent : Component { } diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index ff8b597a0d5..0b52cdde92e 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -7,6 +7,7 @@ using Content.Shared.StepTrigger.Systems; using Content.Shared.Stunnable; using Content.Shared.Throwing; +using Content.Shared.Mood; using JetBrains.Annotations; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -101,6 +102,8 @@ private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other _stun.TryParalyze(other, TimeSpan.FromSeconds(component.ParalyzeTime), true); + RaiseLocalEvent(other, new MoodEffectEvent("MobSlipped")); + // Preventing from playing the slip sound when you are already knocked down. if (playSound) { diff --git a/Resources/Locale/en-US/mood/mood-alerts.ftl b/Resources/Locale/en-US/mood/mood-alerts.ftl new file mode 100644 index 00000000000..c5f76c5fb83 --- /dev/null +++ b/Resources/Locale/en-US/mood/mood-alerts.ftl @@ -0,0 +1,32 @@ +alerts-mood-dead-name = Dead +alerts-mood-dead-desc = Eternal emptiness has enveloped me, and the world no longer has power over my soul. + +alerts-mood-insane-name = Insane +alerts-mood-insane-desc = Darkness and hopelessness smolder in my soul, the world is doomed to absolute evil. + +alerts-mood-horrible-name = Horrible +alerts-mood-horrible-desc = I struggle with pain and fears, my fate is a series of torments and sufferings. + +alerts-mood-terrible-name = Terrible +alerts-mood-terrible-desc = My life has dried up like blood from a wound, and there is only darkness and despair all around. + +alerts-mood-bad-name = Bad +alerts-mood-bad-desc = My strength is leaving me, and every day becomes a difficult ordeal. + +alerts-mood-meh-name = Mediocre +alerts-mood-meh-desc = The world is full of dangers and pain, and my hopes are slowly dying. + +alerts-mood-neutral-name = Neutral +alerts-mood-neutral-desc = I continue on my way, despite threats and hardships, looking for the slightest light in the darkness. + +alerts-mood-good-name = Good +alerts-mood-good-desc = In this world of suffering, I find a little relief and hope. + +alerts-mood-great-name = Great +alerts-mood-great-desc = My strength is restored, and the world seems to be the lesser evil and pain. + +alerts-mood-exceptional-name = Exceptional +alerts-mood-exceptional-desc = Strength and hope fills me, despite the threats that lurk around me. + +alerts-mood-perfect-name = Perfect +alerts-mood-perfect-desc = My soul is full of light and power, and I am ready to fight the darkness in this cruel world. diff --git a/Resources/Locale/en-US/mood/mood.ftl b/Resources/Locale/en-US/mood/mood.ftl new file mode 100644 index 00000000000..c12ec7246ec --- /dev/null +++ b/Resources/Locale/en-US/mood/mood.ftl @@ -0,0 +1,54 @@ +mood-show-effects-start = [font size=12]Mood:[/font] + +mood-effect-HungerOverfed = I ate so much, I feel as though I'm about to burst! +mood-effect-HungerOkay = I am feeling full. +mood-effect-HungerPeckish = I could go for a snack right about now. +mood-effect-HungerStarving = I NEED FOOD! + +mood-effect-ThirstOverHydrated = I feel dizzy after drinking too much. +mood-effect-ThirstOkay = I'm feeling refreshed. +mood-effect-ThirstThirsty = My lips are a little dry. +mood-effect-ThirstParched = I NEED WATER! + +mood-effect-HealthNoDamage = I'm in no pain. +mood-effect-HealthLightDamage = It's just a scratch, but it hurts nonetheless +mood-effect-HealthSevereDamage = The pain is almost unbearable! +mood-effect-HealthHeavyDamage = Agony gnaws at my soul! + +mood-effect-Handcuffed = I am being held captive. + +mood-effect-Suffocating = I.. Can't.. Breathe... + +mood-effect-OnFire = IT BURNS!!! + +mood-effect-Creampied = I was baptized. It tastes like pie. + +mood-effect-MobSlipped = I slipped! I should be more careful next time. + +mood-effect-MobVomit = My lunch tasted awful coming back up. + +mood-effect-MobLowPressure = My whole body feels like it's going to burst! + +mood-effect-MobHighPressure = I feel as though I am being crushed on all sides! + +mood-effect-TraitSaturnine = Everything kind of sucks. I hate this job. + +mood-effect-Dead = You are dead. + +mood-effect-BeingHugged = Hugs are nice. + +mood-effect-ArcadePlay = I had fun playing an interesting arcade game. + +mood-effect-GotBlessed = I was blessed. + +mood-effect-PetAnimal = Animals are so cute, I can't stop petting them! + +mood-effect-SavedLife = It's so nice to save someone's life + +mood-effect-TraitorFocused = I have a goal, and I will accomplish it no matter what. + +mood-effect-RevolutionFocused = VIVA LA REVOLUTION!!! + +mood-effect-CultFocused = Dark Gods, grant me strength! + +mood-effect-TraitSanguine = I have nothing to worry about. I'm sure everything will turn out well in the end! \ No newline at end of file diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 828afa76669..2db791538b6 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -86,6 +86,12 @@ trait-description-Foreigner = For one reason or another you do not speak this station's primary language. Instead, you have a translator issued to you that only you can use. +trait-name-Saturnine = Saturnine +trait-description-Saturnine = You are naturally dour and morose. Your mood is permanently decreased by a large amount. + +trait-name-Sanguine = Sanguine +trait-description-Sanguine = You are naturally upbeat and cheerful! Your mood is permanently increased by a large amount. + trait-name-WillToLive = Will To Live trait-description-WillToLive = You have an unusually strong "will to live", and will resist death more than others. diff --git a/Resources/Locale/ru-RU/mood/mood-alerts.ftl b/Resources/Locale/ru-RU/mood/mood-alerts.ftl new file mode 100644 index 00000000000..e96fb1f09f5 --- /dev/null +++ b/Resources/Locale/ru-RU/mood/mood-alerts.ftl @@ -0,0 +1,22 @@ +alerts-mood-insane-name = Безумие +alerts-mood-insane-desc = В моей душе тлеют мрак и безнадежность, мир обречен на абсолютное зло. +alerts-mood-horrible-name = Печально +alerts-mood-horrible-desc = Я борюсь с болями и страхами, моя судьба - череда мучений и страданий. +alerts-mood-terrible-name = Очень плохо +alerts-mood-terrible-desc = Моя жизнь иссякла, как кровь из раны, и вокруг лишь мрак и отчаяние. +alerts-mood-bad-name = Плохо +alerts-mood-bad-desc = Силы покидают меня, и каждый день становится тяжелым испытанием. +alerts-mood-meh-name = Нехорошо +alerts-mood-meh-desc = Мир полон угроз и боли, и мои надежды медленно умирают. +alerts-mood-neutral-name = Нормально +alerts-mood-neutral-desc = Я продолжаю свой путь, несмотря на угрозы и лишения, ища хоть малейший свет во мраке. +alerts-mood-good-name = Неплохо +alerts-mood-good-desc = В этом мире полном страданий, я обретаю небольшое облегчение и надежду. +alerts-mood-great-name = Хорошо +alerts-mood-great-desc = Моя сила восстанавливается, и мир кажется меньшим злом и болью. +alerts-mood-exceptional-name = Очень хорошо +alerts-mood-exceptional-desc = Я ощущаю в себе силы и надежду на лучшие дни, несмотря на угрозы, что таятся вокруг. +alerts-mood-perfect-name = Великолепно +alerts-mood-perfect-desc = Моя душа полна света и силы, и я готов сразиться с тьмой в этом жестоком мире. +alerts-mood-dead-name = Мёртв +alerts-mood-dead-desc = Вечная пустота окутала меня, и мир больше не имеет власти над моей душой. diff --git a/Resources/Locale/ru-RU/mood/mood.ftl b/Resources/Locale/ru-RU/mood/mood.ftl new file mode 100644 index 00000000000..b9619035ea2 --- /dev/null +++ b/Resources/Locale/ru-RU/mood/mood.ftl @@ -0,0 +1 @@ +mood-show-effects-start = [font size=12]Настроение:[/font] diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 00b799670f6..47015bf21f5 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -5,6 +5,7 @@ id: BaseAlertOrder order: - category: Health + - category: Mood - category: Stamina - alertType: SuitPower - category: Internals @@ -496,3 +497,114 @@ state: critical name: Debug6 description: Debug + +# Moods +- type: alert + id: Insane + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood_insane + name: alerts-mood-insane-name + description: alerts-mood-insane-desc + +- type: alert + id: Horrible + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood1 + name: alerts-mood-horrible-name + description: alerts-mood-horrible-desc + +- type: alert + id: Terrible + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood2 + name: alerts-mood-terrible-name + description: alerts-mood-terrible-desc + +- type: alert + id: Bad + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood3 + name: alerts-mood-bad-name + description: alerts-mood-bad-desc + +- type: alert + id: Meh + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood4 + name: alerts-mood-meh-name + description: alerts-mood-meh-desc + +- type: alert + id: Neutral + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood5 + name: alerts-mood-neutral-name + description: alerts-mood-neutral-desc + +- type: alert + id: Good + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood6 + name: alerts-mood-good-name + description: alerts-mood-good-desc + +- type: alert + id: Great + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood7 + name: alerts-mood-great-name + description: alerts-mood-great-desc + +- type: alert + id: Exceptional + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood8 + name: alerts-mood-exceptional-name + description: alerts-mood-exceptional-desc + +- type: alert + id: Perfect + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood9 + name: alerts-mood-perfect-name + description: alerts-mood-perfect-desc + +- type: alert + id: MoodDead + category: Mood + onClick: !type:ShowMoodEffects { } + icons: + - sprite: /Textures/Interface/Alerts/mood.rsi + state: mood_happiness_bad + name: alerts-mood-dead-name + description: alerts-mood-dead-desc diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index d812433b44a..940e3ebccb0 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -104,6 +104,7 @@ layer: - MobLayer - type: FloorOcclusion + - type: Mood - type: RangedDamageSound soundGroups: Brute: diff --git a/Resources/Prototypes/Mood/categories.yml b/Resources/Prototypes/Mood/categories.yml new file mode 100644 index 00000000000..8c03338ca8b --- /dev/null +++ b/Resources/Prototypes/Mood/categories.yml @@ -0,0 +1,9 @@ +# Alphabetically Ordered +- type: moodCategory + id: Health + +- type: moodCategory + id: Hunger + +- type: moodCategory + id: Thirst \ No newline at end of file diff --git a/Resources/Prototypes/Mood/genericNeeds.yml b/Resources/Prototypes/Mood/genericNeeds.yml new file mode 100644 index 00000000000..d0b24b7d7fe --- /dev/null +++ b/Resources/Prototypes/Mood/genericNeeds.yml @@ -0,0 +1,63 @@ +# Hunger +- type: moodEffect + id: HungerOverfed + moodChange: -10 + category: "Hunger" + +- type: moodEffect + id: HungerOkay + moodChange: 7 + category: "Hunger" + +- type: moodEffect + id: HungerPeckish + moodChange: -3 + category: "Hunger" + +- type: moodEffect + id: HungerStarving + moodChange: -7 + category: "Hunger" + +# Thirst +- type: moodEffect + id: ThirstOverHydrated + moodChange: -3 + category: "Thirst" + +- type: moodEffect + id: ThirstOkay + moodChange: 7 + category: "Thirst" + +- type: moodEffect + id: ThirstThirsty + moodChange: -3 + category: "Thirst" + +- type: moodEffect + id: ThirstParched + moodChange: -7 + category: "Thirst" + +# Health +- type: moodEffect + id: HealthNoDamage + moodChange: 0 + hidden: true + category: "Health" + +- type: moodEffect + id: HealthLightDamage + moodChange: -3 + category: "Health" + +- type: moodEffect + id: HealthSevereDamage + moodChange: -7 + category: "Health" + +- type: moodEffect + id: HealthHeavyDamage + moodChange: -20 + category: "Health" diff --git a/Resources/Prototypes/Mood/genericNegativeEffects.yml b/Resources/Prototypes/Mood/genericNegativeEffects.yml new file mode 100644 index 00000000000..0e1014d9074 --- /dev/null +++ b/Resources/Prototypes/Mood/genericNegativeEffects.yml @@ -0,0 +1,45 @@ +- type: moodEffect + id: Handcuffed + moodChange: -3 + +- type: moodEffect + id: Suffocating + moodChange: -7 + timeout: 6 + +- type: moodEffect + id: OnFire + moodChange: -10 + timeout: 600 + +- type: moodEffect + id: Creampied + moodChange: -3 + +- type: moodEffect + id: MobSlipped + moodChange: -3 + timeout: 180 + +- type: moodEffect + id: MobVomit + moodChange: -3 + timeout: 480 + +- type: moodEffect + id: MobLowPressure + moodChange: -7 + timeout: 10 + +- type: moodEffect + id: MobHighPressure + moodChange: -7 + timeout: 10 + +- type: moodEffect + id: TraitSaturnine + moodChange: -20 + +- type: moodEffect + id: Dead + moodChange: -1000 diff --git a/Resources/Prototypes/Mood/genericPositiveEffects.yml b/Resources/Prototypes/Mood/genericPositiveEffects.yml new file mode 100644 index 00000000000..8ac5b25dc12 --- /dev/null +++ b/Resources/Prototypes/Mood/genericPositiveEffects.yml @@ -0,0 +1,40 @@ +- type: moodEffect + id: BeingHugged + moodChange: 3 + timeout: 120 + +- type: moodEffect + id: ArcadePlay + moodChange: 3 + timeout: 480 + +- type: moodEffect + id: GotBlessed + moodChange: 3 + timeout: 480 + +- type: moodEffect + id: PetAnimal + moodChange: 3 + timeout: 300 + +- type: moodEffect + id: SavedLife + moodChange: 7 + timeout: 480 + +- type: moodEffect + id: TraitorFocused # Used for traitors to boost their goals completion. + moodChange: 7 + +- type: moodEffect + id: RevolutionFocused # Used for revolution + moodChange: 7 + +- type: moodEffect + id: CultFocused + moodChange: 10 + +- type: moodEffect + id: TraitSanguine + moodChange: 15 \ No newline at end of file diff --git a/Resources/Prototypes/Shaders/shaders.yml b/Resources/Prototypes/Shaders/shaders.yml index e286dcb7a41..b495490201c 100644 --- a/Resources/Prototypes/Shaders/shaders.yml +++ b/Resources/Prototypes/Shaders/shaders.yml @@ -99,3 +99,8 @@ id: Cataracts kind: source path: "/Textures/Shaders/cataracts.swsl" + +- type: shader + id: SaturationScale + kind: source + path: "/Textures/Shaders/saturationscale.swsl" diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index ab5bcb238d7..16e70a2cc63 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -38,3 +38,39 @@ - Vulpkanin components: - type: NormalVision + +- type: trait + id: Saturnine + category: Mental + points: 3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Sanguine + components: + - type: MoodModifyTrait + moodId: TraitSaturnine + +- type: trait + id: Sanguine + category: Mental + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Saturnine + components: + - type: MoodModifyTrait + moodId: TraitSanguine \ No newline at end of file diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/meta.json b/Resources/Textures/Interface/Alerts/mood.rsi/meta.json new file mode 100644 index 00000000000..0f6726a48d0 --- /dev/null +++ b/Resources/Textures/Interface/Alerts/mood.rsi/meta.json @@ -0,0 +1,60 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from NSV13 at b6b1e2bf2cc60455851317d8e82cca8716d9dac1", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "mood1" + }, + { + "name": "mood2" + }, + { + "name": "mood3" + }, + { + "name": "mood4" + }, + { + "name": "mood5" + }, + { + "name": "mood6" + }, + { + "name": "mood7" + }, + { + "name": "mood8" + }, + { + "name": "mood9" + }, + { + "name": "mood_happiness_bad" + }, + { + "name": "mood_happiness_good" + }, + { + "name": "mood_insane", + "delays": [ + [ + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood1.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1e1386db42e7f143b976c3fcce346d4d3a3517 GIT binary patch literal 606 zcmV-k0-^nhP)BrlP ziWZjAl}<8%dJo@Ur~2_634I{S0N!3)+b|ip%KE-PztmiHp7~?^4?>WEJl}W=z+@w{ zDqeS5If0L%f4pmoWe5alOHM#)@$60wLJ~?MB*+zz)=tyvqVz1FGhs07P4&Bl#zQQxe0G>E>+OaF@aW0WUdKE_CV?>ABY9uI>v9rAWc{%h#WD9RiW<#G%;OF z+5Iph=0ed*ZqH%?SdH<3c7+hqRogyz<>d4@yazDp;lYvJl3WP2Af`C!oZj2;{NgN| s92r4NrSKsxEr6p8VNd}f@aF=40HLZPfvz_;vj6}907*qoM6N<$f@&ZK+W-In literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood2.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood2.png new file mode 100644 index 0000000000000000000000000000000000000000..41be928f0254eaa036c473b17ad6538fa4b4a418 GIT binary patch literal 517 zcmV+g0{Z=lP)_EcC|}Nh;7tbx>nat;sy4?POev<`j*Q1cJZrHJshtO0F*^z%qoAY#h61F#@3pne$a^DzHiI}_J86-90U85P6rL)P zAWkap4-Qf);QcdiK%>5nb#vIs-vw$E*7Hj-w+X+*6aAr&_f`OP2uE~6wd3^>w+2ul zmSHMy0rGEJ^@9NjV#f|&$lKSC-UTt}$E5GSz-Rzt*csp(Rm}F9FW+)~00000NkvXX Hu0mjf80z1L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood3.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood3.png new file mode 100644 index 0000000000000000000000000000000000000000..179991e1984a7a5a9620c9d286387e53308358dc GIT binary patch literal 526 zcmV+p0`dKcP)u0$23LtSrM`ll_ddP_oxXyW z)MCXWU?SnD$TcLaJ9{_B-rm0%a!O2?3T8L={pOotj&nG2oB;kWz~lW$yWd~mXX;M? zNI1Ic6%Vq!6hs7o;v_u29RRpevyJ_(9`5wZ+Xowh4M5_#ur8jDM}zdk=LWR7%XNYU zP!NYqyyo%tj)4Fs1lxfyI4dT|feHz{t72XkS^=o~%VEEKSfhb=pO%J@F%Q4E2Q+X( z3^2w1f-`h}p5_EPY5@lIA4T$6@MgfhgAie$K(E?eXaw;4k0SHs&VC*b0oGqhenxo$ z!F*(LZF@n~0urf=tl0VY&cbm+1c27A7fDGJBfQ>ME(sO@iqeA%0*lG>^#t8MGciRA$HzOJuzJ#U;B2>`heF3OeKiLa;+?dMd_0-*3+ zK#}~X=d}UzN_Du1d>8U%V}#KGHz%o{4M2gFp(w3ecPWuLxA$TIav_3VYWYpS@ID}M zN%bNC7Xo6iYt}9wojNgzxBEMS5Wfv`fefUS7skQ=2M!hN44|tx0URCR2Q)C{eyl9z Q761SM07*qoM6N<$g5Epg+yDRo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood4.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood4.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea7d701171961ee9650101bf4f0d5f2850952b6 GIT binary patch literal 417 zcmV;S0bc%zP)3KoCVSvDMZ@JHrhqwYK5_9>ZgK04r-Py#cYq z#8wV~j_b$GvI~C*(U>@u%uf7oWDm`|=bE4Z>`{jV+2-)$nW?@1IziaqV{~Epp3`jk%i_ZTCx(fCN&{zBcz7B8)M(FbqYD#L^2?9bjN!L!5=%a0YI}Sx~nQ40Nct zKu4%keJO;b`7RYzrFsDpr~lcpUDnCOwgAi*V0${h?B9>;W%U;T2&ehMyRHRM0f-2M z_s8AGUTOJgAZP%HyTUN6mr4iANN=C3}uLG8;1JxBk zB<91k>mY!>2Wv#t0CuWblQTa9$lY~y;2%QL5mgeddMUzD=74FvK=p_A(5^9y0w4>O zr@up)>E=a|jQTF{MH)^$7d;K&%YxgI=mJgjGyu#lI$zt_qnb4u09i0Xp2~-~CVCZs z4Iv^jW>JI?hL7f%>en#@0OGD|ZSenrp@O3UjAaYJe~Vzn1e=<0}9V?hQK+ zUoXGnyMLhsQ2~fJgvX=q)3db^qk*6SAZ`o8;9n~tD1eZ-4WfadE6`8cY-kaC*q*4^ zAONyYk`@ghv1vYrsY1QZfh@a3X?8B|Uv|OfSo}))HPxa3u>LZ!Z*m(*#_WhbcnjcK ze`G3xQV~2e{eT_hW8**{sFnaCp%`YnmI8P;u|`x4V3wLS8S^oKtey0M?-0U{@WIJp zRLMCYLOv1SGr)x`2!JYNj{WUhcPT%UJp}+WGj(;k>0`5}0qiQ^41kdI2*fqn(*Q8D z>0GCx3B?)>fGXg>Ph69|3c!RA5qaHWdqNm7nmN_4V+a7m_G_*5_dr>}$^fdeKfuoc YZdR%A(l*6QTfpY>H z7gQDnshk422p%>M)*IV91BM8Rk+8+ivhSN8@0v&YXS)O3F2LLT<;VX1@xFMt3IK$k zW zUI0WNg)(urD4b9}8;P=@ehSjh@BRHx6LyUIOa)M^ziNR=s}I6FhchrJ0O~JU7;~h3 z&>H7v~CHceV{4APYtPSh=GMDx=7z_#jZc1m)cdjjG^v^m094|m}Keq03HhonG0bs+O(e>^+ zjjbX@AJdm8kSG8cXTz6wZ#%y&X|M%}iG~<}jaLn`cpV@&bZe!N5CQZbCRPo5t;VY$ zfavRqeSdroLWls2F?5mSB-QzP?`JC88w6nQyGhu4RyUbbF_NVs2mtRp&hzqVQ*5;& zY+4soK~xv4va4VbVh`I_nd0GjgehT8SEnu4+phJ*4O zzHaaWwB_F?>~Yg%jXw`jHQ<{Ak{J;Vfc!%{g(Vc;ft2>Qf)@a}Lk`yizEMTCITzaC z>})}yX(*ZlFw|zG?Ki9&6P}(y0Gw<%;Z{jK4Q+Wx_)R(&-4R4Zh*~JJUajS-Vjy_0 z^g{A!836K#rdoA=n3V@?f&~N3tHNnPX zypIBaxF9j(F=qLUfMK*8sy_B|8ht5c1BeDd(56KB;cmrMkbQN$e@spQf2ALkW$ir! Sjh&(Z0000$~*PvWGCxBVq+?zm501&6}(e=frd)>G;3nvx`H2}q9VFs^vMhF!^v$&G#Y?c&{ zK`am|0GRBsZk#s!u=n+8soGlvVD<;6$7%rV?c15E3Pk{9A3mYGdwgHNm@sj@6s9TY zpI?e5Tn~FJ)hYsDw*AK@@rQ3Sv_kE7O2^grhb zP4+4P1iU~WaNJVC@zjQT3Rr5mJyl*#g0}o>0Ge?<2(aI=h#&7Edu{pE0F0dLDQ?N$ z1b~d{xkw)fhCy*l_9g%XCjy5I-t%G4WjuI(^rMszSWyk0c3b@{k3lw#-Ti0uX8_&+ XH<#j3?9i*P00000NkvXXu0mjf{rAj+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood_happiness_bad.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood_happiness_bad.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed8f4d68f80b53ca8cb313f183fdd138a84dbcb GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DEP?J z#WAE}&f96;e1{cyT%uQAZ#{gVF}m_$M$*TR0iPUCt#NXg*`6z7x4!!;!y0Y@ryq|j zp8v69Js@@ayAB6y!!ymLcVl`AqYpdmV7ziiDq4XtQ6YxGwwU{n!=3*k2D`%z19#N3 ztl4raJ4wlv@k`ImQoV+#%Z{1*qVH#1Jy^iIppbvj(yd(ryYHT`;Z@kF{gtss%vkbv zWoyKK{tS_lbP0l+XkKwKH~8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood_happiness_good.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood_happiness_good.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9943a301554eb2ecee8c1ac8a5ed1ff986d340 GIT binary patch literal 343 zcmV-d0jU0oP)0D^ zjan@S>6h$Y1i(dGuBN5;z!4Gw&|}~i50@tWVgRld1jME7rv{)|Kr<=;La1GyWHpG+ p8nM(zKn%`#md_e416ZXS;0;#4pQJXDRW|?t002ovPDHLkV1n@-dIJCe literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Alerts/mood.rsi/mood_insane.png b/Resources/Textures/Interface/Alerts/mood.rsi/mood_insane.png new file mode 100644 index 0000000000000000000000000000000000000000..b2407bbdad8de3faed98027537ff2fe6657450cc GIT binary patch literal 3392 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 R*6x=Gu(q%xJ~X4G{2MkGU>N`a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Shaders/saturationscale.swsl b/Resources/Textures/Shaders/saturationscale.swsl new file mode 100644 index 00000000000..9829e207629 --- /dev/null +++ b/Resources/Textures/Shaders/saturationscale.swsl @@ -0,0 +1,12 @@ +uniform highp float saturation; // Between 0 and 2; +uniform sampler2D SCREEN_TEXTURE; + +void fragment() { + highp vec4 color = texture(SCREEN_TEXTURE, UV); + + highp float brightness = (color.r + color.g + color.b) / 3.0; + + color.rgb = mix(vec3(brightness), color.rgb, saturation); + + COLOR = color; +} From bf1359f45704c04f1b682d5f2d5e1a148a1bfb1c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 20 Aug 2024 08:16:31 +0000 Subject: [PATCH 04/74] Automatic Changelog Update (#620) --- Resources/Changelog/Changelog.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0acd144cfb0..e682179b57c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5405,3 +5405,26 @@ Entries: message: Cowtools are selectable for clown in the "Jobs" category of loadouts id: 6271 time: '2024-08-20T06:48:59.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + The Mood System has been ported from White Dream. Mood acts as a 3rd + healthbar, alongside Health and Stamina, representing your character's + current mental state. Having either high or low mood can modify certain + physical attributes. + - type: Add + message: >- + Mood modifies your Critical Threshold. Your critical threshold can be + increased or decreased depending on how high or low your character's + mood is. + - type: Add + message: >- + Mood modifies your Movement Speed. Characters move faster when they have + an overall high mood, and move slower when they have a lower mood. + - type: Add + message: >- + Saturnine and Sanguine have been added to the list of Mental traits, + both providing innate modifiers to a character's Morale. + id: 6272 + time: '2024-08-20T08:16:05.0000000+00:00' From 495d331953433b2a4a35d5e418f6e2242f901f18 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 20 Aug 2024 14:42:43 -0400 Subject: [PATCH 05/74] Psionic Refactor Version 2, Part 1 (#731) # Description Finally, after many long months, and this project surviving a complete restart from square one, I have now made actual, real progress on an actual proper "Refactor" of Psionics. This PR primarily moves ALL of the logic for initializing Psionic Powers into highly configurable YML. The initialization of psionics is no longer handled by components, and is instead now handled entirely by a centralized system. To even further cut down on component bookkeeping, nearly all logic needed for generating Psions has been moved to the PsionicComponent. The PotentialPsionicComponent now no longer exists. Additionally, and although they are not currently implemented(I will do so in the next PR after this), I have also laid the groundwork for substantial reworks to the other aspects of Psionics. Power generation, casting stats, feedback messages, non-action powers, and so on. It's actually possible to now add a psionic power that does not add any active abilities at all, rather by adding one or more components, thus enabling purely Passive Powers. Or a combination of the two, active-powers with a passive component. # Media https://github.com/user-attachments/assets/0fd6b9a4-7d84-4e6e-980a-9d7dd4264f6f # Changelog :cl: - add: Latent Psychic has been added as a new positive trait. - tweak: Psionics have received a substantial refactor. While no new powers have been added this patch, this initial refactor lays the groundwork so that new psionic powers will be easier to create. - tweak: Latent Psychic is now fully required to become psionic, or to interact with Oracle. - tweak: Psychics can now have more than one active power. - remove: Mimes are no longer Psionic. - tweak: Chaplain, Mantis, & Mystagogue all receive the Latent Psychic trait for free, automatically. --------- Signed-off-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> --- .../Abilities/Mime/MimePowersSystem.cs | 3 - .../Psionics/Abilities/DispelPowerSystem.cs | 33 -- .../Abilities/MetapsionicPowerSystem.cs | 36 -- .../Psionics/Abilities/MindSwapPowerSystem.cs | 30 -- .../Abilities/NoosphericZapPowerSystem.cs | 36 -- .../PsionicInvisibilityPowerSystem.cs | 32 -- .../PsionicRegenerationPowerSystem.cs | 37 -- .../Abilities/PyrokinesisPowerSystem.cs | 33 -- .../Abilities/TelegnosisPowerSystem.cs | 34 -- .../Psionics/InnatePsionicPowersComponent.cs | 15 + .../Psionics/PsionicAbilitiesSystem.cs | 333 ++++++++++++++---- .../Chemistry/ReagentEffects/MakeSentient.cs | 3 - Content.Server/Cloning/CloningSystem.cs | 5 +- .../Systems/ParadoxAnomalySystem.cs | 7 +- .../Chemistry/Effects/ChemRemovePsionic.cs | 2 +- .../Psionics/AntiPsychicWeaponComponent.cs | 46 ++- .../Invisibility/PsionicInvisibilitySystem.cs | 28 +- .../Psionics/PotentialPsionicComponent.cs | 14 - .../PsionicAwaitingPlayerComponent.cs | 9 - .../Psionics/PsionicBonusChanceComponent.cs | 18 - Content.Server/Psionics/PsionicsCommands.cs | 20 +- .../Psionics/PsionicsSystem.Events.cs | 19 + Content.Server/Psionics/PsionicsSystem.cs | 71 ++-- .../Research/Oracle/OracleSystem.cs | 3 +- .../Components/CommandStaffComponent.cs | 5 +- .../Components/CommandStaffSystem.cs | 16 + .../Components/NoosphericZapRuleComponent.cs | 14 + .../Events/GlimmerRandomSentienceRule.cs | 4 +- .../StationEvents/Events/MassMindSwapRule.cs | 2 +- .../Events/NoosphericStormRule.cs | 13 +- .../StationEvents/Events/NoosphericZapRule.cs | 26 +- .../Events/PsionicCatGotYourTongueRule.cs | 3 +- .../Zombies/ZombieSystem.Transform.cs | 16 +- .../Dispel/DamageOnDispelComponent.cs | 6 +- .../Abilities/Dispel/DispelPowerComponent.cs | 17 +- .../MassSleep/MassSleepPowerComponent.cs | 12 +- .../MassSleep/MassSleepPowerSystem.cs | 26 -- .../Metapsionics/MetapsionicPowerComponent.cs | 15 +- .../MindSwap/MindSwapPowerComponent.cs | 13 +- .../NoosphericZapPowerComponent.cs | 14 +- .../PsionicInvisibilityPowerComponent.cs | 13 +- .../PsionicRegenerationPowerComponent.cs | 17 +- .../Pyrokinesis/PyrokinesisPowerComponent.cs | 15 +- .../Psionics/Items/PsionicItemsSystem.cs | 3 - .../Psionics/MindbrokenComponent.cs | 5 + Content.Shared/Psionics/PsionicComponent.cs | 136 ++++++- Content.Shared/Psionics/PsionicEvents.cs | 11 + .../Psionics/PsionicPowerPrototype.cs | 61 ++++ .../Psionics/SharedPsionicAbilitiesSystem.cs | 49 --- .../Locale/en-US/psionics/psionic-powers.ftl | 69 ++++ .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 5 +- .../Entities/Mobs/NPCs/glimmer_creatures.yml | 1 - .../DeltaV/Entities/Mobs/Player/vulpkanin.yml | 1 - .../Roles/Jobs/Justice/chief_justice.yml | 4 - .../Entities/Mobs/NPCs/regalrat.yml | 1 - .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 2 - .../Entities/Mobs/Player/arachne.yml | 1 - .../Entities/Mobs/Player/arachnid.yml | 1 - .../Prototypes/Entities/Mobs/Player/diona.yml | 1 - .../Prototypes/Entities/Mobs/Player/dwarf.yml | 4 +- .../Prototypes/Entities/Mobs/Player/harpy.yml | 1 - .../Prototypes/Entities/Mobs/Player/human.yml | 12 +- .../Entities/Mobs/Player/humanoid.yml | 5 +- .../Prototypes/Entities/Mobs/Player/moth.yml | 6 +- .../Entities/Mobs/Player/reptilian.yml | 2 - .../Entities/Mobs/Player/skeleton.yml | 2 - .../Prototypes/Entities/Mobs/Player/slime.yml | 4 +- .../Prototypes/Entities/Mobs/Player/vox.yml | 2 - .../Entities/Mobs/Species/human.yml | 1 - .../Entities/Mobs/NPCs/mutants.yml | 6 +- .../Nyanotrasen/Entities/Mobs/Player/Oni.yml | 1 - .../Entities/Mobs/Player/felinid.yml | 1 - .../Entities/Mobs/Player/special.yml | 1 + .../Structures/Research/sophicscribe.yml | 1 - .../Roles/Jobs/Epistemics/forensicmantis.yml | 6 +- Resources/Prototypes/Psionics/psionics.yml | 112 ++++++ .../Roles/Jobs/Civilian/chaplain.yml | 6 +- .../Prototypes/Roles/Jobs/Civilian/mime.yml | 1 - .../Prototypes/Roles/Jobs/Command/captain.yml | 4 - .../Roles/Jobs/Command/head_of_personnel.yml | 4 - .../Roles/Jobs/Engineering/chief_engineer.yml | 4 - .../Jobs/Medical/chief_medical_officer.yml | 2 - .../Roles/Jobs/Science/research_director.yml | 5 +- .../Roles/Jobs/Security/head_of_security.yml | 4 - Resources/Prototypes/Traits/skills.yml | 16 + 85 files changed, 916 insertions(+), 762 deletions(-) create mode 100644 Content.Server/Abilities/Psionics/InnatePsionicPowersComponent.cs delete mode 100644 Content.Server/Psionics/PotentialPsionicComponent.cs delete mode 100644 Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs delete mode 100644 Content.Server/Psionics/PsionicBonusChanceComponent.cs create mode 100644 Content.Server/Psionics/PsionicsSystem.Events.cs create mode 100644 Content.Server/Revolutionary/Components/CommandStaffSystem.cs create mode 100644 Content.Shared/Psionics/MindbrokenComponent.cs create mode 100644 Content.Shared/Psionics/PsionicEvents.cs create mode 100644 Content.Shared/Psionics/PsionicPowerPrototype.cs create mode 100644 Resources/Locale/en-US/psionics/psionic-powers.ftl create mode 100644 Resources/Prototypes/Psionics/psionics.yml diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index c1d2643d6fa..57163a96a50 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -58,9 +58,6 @@ private void OnComponentInit(EntityUid uid, MimePowersComponent component, Compo EnsureComp(uid); _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); _actionsSystem.AddAction(uid, ref component.InvisibleWallActionEntity, component.InvisibleWallAction, uid); - //Nyano - Summary: Add Psionic Ability to Mime. - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.InvisibleWallActionEntity; } /// diff --git a/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs index d338a5a5bcb..f2dd82900b6 100644 --- a/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions; using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; @@ -6,11 +5,8 @@ using Content.Server.Guardian; using Content.Server.Bible.Components; using Content.Server.Popups; -using Robust.Shared.Prototypes; using Robust.Shared.Player; using Robust.Shared.Random; -using Robust.Shared.Timing; -using Content.Shared.Mind; using Content.Shared.Actions.Events; using Robust.Shared.Audio.Systems; @@ -18,24 +14,18 @@ namespace Content.Server.Abilities.Psionics { public sealed class DispelPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly GuardianSystem _guardianSystem = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); SubscribeLocalEvent(OnDispelled); @@ -46,29 +36,6 @@ public override void Initialize() SubscribeLocalEvent(OnRevenantDispelled); } - private void OnInit(EntityUid uid, DispelPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.DispelActionEntity, component.DispelActionId ); - _actions.TryGetActionData( component.DispelActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.DispelActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.DispelActionEntity; - psionic.ActivePowers.Add(component); - } - } - - private void OnShutdown(EntityUid uid, DispelPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.DispelActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(DispelPowerActionEvent args) { if (HasComp(args.Target)) diff --git a/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs index b775117b716..58d7d804da6 100644 --- a/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -1,58 +1,22 @@ -using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; -using Content.Shared.StatusEffect; using Content.Shared.Popups; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Shared.Mind; using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { public sealed class MetapsionicPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); } - private void OnInit(EntityUid uid, MetapsionicPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.MetapsionicActionEntity, component.MetapsionicActionId ); - _actions.TryGetActionData( component.MetapsionicActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MetapsionicActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.MetapsionicActionEntity; - psionic.ActivePowers.Add(component); - } - - } - - private void OnShutdown(EntityUid uid, MetapsionicPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.MetapsionicActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, MetapsionicPowerActionEvent args) { foreach (var entity in _lookup.GetEntitiesInRange(uid, component.Range)) diff --git a/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index b23224cab48..780c1488ec6 100644 --- a/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -10,8 +10,6 @@ using Content.Server.Popups; using Content.Server.Psionics; using Content.Server.GameTicking; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; using Content.Shared.Mind; using Content.Shared.Actions.Events; @@ -19,10 +17,8 @@ namespace Content.Server.Abilities.Psionics { public sealed class MindSwapPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; @@ -31,8 +27,6 @@ public sealed class MindSwapPowerSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); SubscribeLocalEvent(OnPowerReturned); SubscribeLocalEvent(OnDispelled); @@ -42,28 +36,6 @@ public override void Initialize() SubscribeLocalEvent(OnSwapInit); } - private void OnInit(EntityUid uid, MindSwapPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.MindSwapActionEntity, component.MindSwapActionId ); - _actions.TryGetActionData( component.MindSwapActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MindSwapActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.MindSwapActionEntity; - psionic.ActivePowers.Add(component); - } - } - - private void OnShutdown(EntityUid uid, MindSwapPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.MindSwapActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(MindSwapPowerActionEvent args) { if (!(TryComp(args.Target, out var damageable) && damageable.DamageContainerID == "Biological")) @@ -151,8 +123,6 @@ private void OnSwapInit(EntityUid uid, MindSwappedComponent component, Component _actions.TryGetActionData( component.MindSwapReturnActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.MindSwapReturnActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.MindSwapReturnActionEntity; } public void Swap(EntityUid performer, EntityUid target, bool end = false) diff --git a/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index 0fd261ef12f..fa44639ea8c 100644 --- a/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,63 +1,27 @@ -using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; -using Content.Server.Psionics; using Content.Shared.StatusEffect; using Content.Server.Stunnable; using Content.Server.Beam; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Server.Mind; using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { public sealed class NoosphericZapPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly StunSystem _stunSystem = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly BeamSystem _beam = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); } - private void OnInit(EntityUid uid, NoosphericZapPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.NoosphericZapActionEntity, component.NoosphericZapActionId ); - _actions.TryGetActionData( component.NoosphericZapActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.NoosphericZapActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.NoosphericZapActionEntity; - psionic.ActivePowers.Add(component); - } - } - - private void OnShutdown(EntityUid uid, NoosphericZapPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.NoosphericZapActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(NoosphericZapPowerActionEvent args) { - if (!HasComp(args.Target)) - return; - if (HasComp(args.Target)) return; diff --git a/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 5ca1dc7a6dc..19658629545 100644 --- a/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -6,11 +6,6 @@ using Content.Shared.Stealth; using Content.Shared.Stealth.Components; using Content.Server.Psionics; -using Robust.Shared.Prototypes; -using Robust.Shared.Player; -using Robust.Shared.Audio; -using Robust.Shared.Timing; -using Content.Server.Mind; using Content.Shared.Actions.Events; using Robust.Shared.Audio.Systems; @@ -18,20 +13,15 @@ namespace Content.Server.Abilities.Psionics { public sealed class PsionicInvisibilityPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedStealthSystem _stealth = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); SubscribeLocalEvent(OnPowerOff); SubscribeLocalEvent(OnStart); @@ -39,28 +29,6 @@ public override void Initialize() SubscribeLocalEvent(OnDamageChanged); } - private void OnInit(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.PsionicInvisibilityActionEntity, component.PsionicInvisibilityActionId ); - _actions.TryGetActionData( component.PsionicInvisibilityActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PsionicInvisibilityActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.PsionicInvisibilityActionEntity; - psionic.ActivePowers.Add(component); - } - } - - private void OnShutdown(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.PsionicInvisibilityActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityPowerActionEvent args) { if (HasComp(uid)) diff --git a/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 097a0cb750b..17e9249e655 100644 --- a/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -1,69 +1,42 @@ using Robust.Shared.Audio; -using Robust.Server.GameObjects; using Robust.Shared.Player; -using Robust.Shared.Prototypes; using Content.Server.Body.Components; using Content.Server.Body.Systems; -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Chemistry.EntitySystems; using Content.Server.DoAfter; using Content.Shared.Abilities.Psionics; -using Content.Shared.Actions; using Content.Shared.Chemistry.Components; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; using Content.Shared.Popups; using Content.Shared.Psionics.Events; -using Content.Shared.Tag; using Content.Shared.Examine; using static Content.Shared.Examine.ExamineSystemShared; using Robust.Shared.Timing; -using Content.Server.Mind; using Content.Shared.Actions.Events; -using Content.Shared.Chemistry.EntitySystems; using Robust.Server.Audio; namespace Content.Server.Abilities.Psionics { public sealed class PsionicRegenerationPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; [Dependency] private readonly AudioSystem _audioSystem = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); SubscribeLocalEvent(OnDispelled); SubscribeLocalEvent(OnDoAfter); } - private void OnInit(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.PsionicRegenerationActionEntity, component.PsionicRegenerationActionId ); - _actions.TryGetActionData( component.PsionicRegenerationActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PsionicRegenerationActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.PsionicRegenerationActionEntity; - psionic.ActivePowers.Add(component); - } - } private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) { @@ -86,16 +59,6 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon args.Handled = true; } - private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.PsionicRegenerationActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnDispelled(EntityUid uid, PsionicRegenerationPowerComponent component, DispelledEvent args) { if (component.DoAfter == null) diff --git a/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs index 407b72c6b58..3740822667b 100644 --- a/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -1,55 +1,22 @@ -using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Popups; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Server.Mind; using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { public sealed class PyrokinesisPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly FlammableSystem _flammableSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); } - - private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId ); - _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PyrokinesisActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.PyrokinesisActionEntity; - psionic.ActivePowers.Add(component); - } - } - - private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.PyrokinesisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(PyrokinesisPowerActionEvent args) { if (!TryComp(args.Target, out var flammableComponent)) diff --git a/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs index f7ae04b61ea..7a3f663a43f 100644 --- a/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -1,55 +1,21 @@ -using Content.Shared.Actions; -using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; using Content.Shared.Mind.Components; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Server.Mind; using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { public sealed class TelegnosisPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly MindSwapPowerSystem _mindSwap = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); SubscribeLocalEvent(OnMindRemoved); } - private void OnInit(EntityUid uid, TelegnosisPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.TelegnosisActionEntity, component.TelegnosisActionId ); - _actions.TryGetActionData( component.TelegnosisActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.TelegnosisActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.TelegnosisActionEntity; - psionic.ActivePowers.Add(component); - } - } - - private void OnShutdown(EntityUid uid, TelegnosisPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.TelegnosisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } - } - private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) { var projection = Spawn(component.Prototype, Transform(uid).Coordinates); diff --git a/Content.Server/Abilities/Psionics/InnatePsionicPowersComponent.cs b/Content.Server/Abilities/Psionics/InnatePsionicPowersComponent.cs new file mode 100644 index 00000000000..fe9c7511cbc --- /dev/null +++ b/Content.Server/Abilities/Psionics/InnatePsionicPowersComponent.cs @@ -0,0 +1,15 @@ +using Content.Shared.Psionics; +using Robust.Shared.Prototypes; + +namespace Content.Server.Abilities.Psionics +{ + [RegisterComponent] + public sealed partial class InnatePsionicPowersComponent : Component + { + /// + /// The list of all powers to be added on Startup + /// + [DataField] + public List> PowersToAdd = new(); + } +} diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index e59696aa904..b6309a64f18 100644 --- a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -1,15 +1,15 @@ using Content.Shared.Abilities.Psionics; using Content.Shared.Actions; +using Content.Shared.Popups; using Content.Shared.Psionics.Glimmer; using Content.Shared.Random; using Content.Shared.Random.Helpers; -using Content.Server.EUI; -using Content.Server.Psionics; -using Content.Server.Mind; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; -using Robust.Shared.Player; +using Robust.Shared.Utility; +using Content.Shared.Psionics; +using System.Linq; namespace Content.Server.Abilities.Psionics { @@ -18,110 +18,325 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedPopupSystem _popups = default!; - private ISawmill _sawmill = default!; + private ProtoId _pool = "RandomPsionicPowerPool"; + private const string GenericInitializationMessage = "generic-power-initialization-feedback"; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(InnatePowerStartup); + SubscribeLocalEvent(OnPsionicShutdown); } - private void OnPlayerAttached(EntityUid uid, PsionicAwaitingPlayerComponent component, PlayerAttachedEvent args) + /// + /// Special use-case for a InnatePsionicPowers, which allows an entity to start with any number of Psionic Powers. + /// + /// + /// + /// + private void InnatePowerStartup(EntityUid uid, InnatePsionicPowersComponent comp, ComponentStartup args) { - if (TryComp(uid, out var bonus) && bonus.Warn == true) - _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), args.Player); - else - AddRandomPsionicPower(uid); - RemCompDeferred(uid); + // Any entity with InnatePowers should also be psionic, but in case they aren't already... + EnsureComp(uid, out var psionic); + + foreach (var proto in comp.PowersToAdd) + if (!psionic.ActivePowers.Contains(_prototypeManager.Index(proto))) + InitializePsionicPower(uid, _prototypeManager.Index(proto), psionic, false); } - public void AddPsionics(EntityUid uid, bool warn = true) + private void OnPsionicShutdown(EntityUid uid, PsionicComponent component, ComponentShutdown args) { - if (Deleted(uid) - || HasComp(uid)) + if (!EntityManager.EntityExists(uid) + || HasComp(uid)) return; - if (!_mindSystem.TryGetMind(uid, out _, out var mind)) - { - EnsureComp(uid); - return; - } + RemoveAllPsionicPowers(uid); + } - if (!_mindSystem.TryGetSession(mind, out var client)) + /// + /// The most shorthand route to creating a Psion. If an entity is not already psionic, it becomes one. This also adds a random new PsionicPower. + /// To create a "Latent Psychic"(Psion with no powers) just add or ensure the PsionicComponent normally. + /// + /// + public void AddPsionics(EntityUid uid) + { + if (Deleted(uid)) return; - if (warn && HasComp(uid)) - _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), client); - else - AddRandomPsionicPower(uid); + AddRandomPsionicPower(uid); } - public void AddPsionics(EntityUid uid, string powerComp) + /// + /// Pretty straightforward, adds a random psionic power to a given Entity. If that Entity is not already Psychic, it will be made one. + /// If an entity already has all possible powers, this will not add any new ones. + /// + /// + public void AddRandomPsionicPower(EntityUid uid) { - if (Deleted(uid) - || HasComp(uid)) + // We need to EnsureComp here to make sure that we aren't iterating over a component that: + // A: Isn't fully initialized + // B: Is in the process of being shutdown/deleted + // Imagine my surprise when I found out Resolve doesn't check for that. + // TODO: This EnsureComp will be 1984'd in a separate PR, when I rework how you get psionics in the first place. + EnsureComp(uid, out var psionic); + + if (!_prototypeManager.TryIndex(_pool.Id, out var pool)) + return; + + var newPool = pool.Weights.Keys.ToList(); + newPool.RemoveAll(s => + _prototypeManager.TryIndex(s, out var p) && + psionic.ActivePowers.Contains(p)); + + if (newPool is null) return; - AddComp(uid); + var newProto = _random.Pick(newPool); + if (!_prototypeManager.TryIndex(newProto, out var newPower)) + return; - var newComponent = (Component) _componentFactory.GetComponent(powerComp); - newComponent.Owner = uid; + InitializePsionicPower(uid, newPower); - EntityManager.AddComponent(uid, newComponent); + _glimmerSystem.Glimmer += _random.Next(1, (int) Math.Round(1 + psionic.CurrentAmplification + psionic.CurrentDampening)); } - public void AddRandomPsionicPower(EntityUid uid) + /// + /// Initializes a new Psionic Power on a given entity, assuming the entity does not already have said power initialized. + /// + /// + /// + /// + /// + public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic, bool playPopup = true) { - AddComp(uid); + if (!_prototypeManager.HasIndex(proto.ID) + || psionic.ActivePowers.Contains(proto)) + return; - if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) - { - _sawmill.Error("Can't index the random psionic power pool!"); + psionic.ActivePowers.Add(proto); + + AddPsionicActions(uid, proto, psionic); + AddPsionicPowerComponents(uid, proto); + AddPsionicStatSources(proto, psionic); + RefreshPsionicModifiers(uid, psionic); + + if (playPopup) + _popups.PopupEntity(Loc.GetString(GenericInitializationMessage), uid, uid, PopupType.MediumCaution); + // TODO: Replace this with chat message: _popups.PopupEntity(proto.InitializationFeedback, uid, uid, PopupType.MediumCaution); + } + + /// + /// Initializes a new Psionic Power on a given entity, assuming the entity does not already have said power initialized. + /// + /// + /// + /// + /// + public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, bool playPopup = true) + { + if (!TryComp(uid, out var psionic)) return; - } - // uh oh, stinky! - var newComponent = (Component) _componentFactory.GetComponent(pool.Pick()); - newComponent.Owner = uid; + InitializePsionicPower(uid, proto, psionic, playPopup); + } - EntityManager.AddComponent(uid, newComponent); + /// + /// Updates a Psion's casting stats, call this anytime a system adds a new source of Amp or Damp. + /// + /// + /// + public void RefreshPsionicModifiers(EntityUid uid, PsionicComponent comp) + { + var ampModifier = 0f; + var dampModifier = 0f; + foreach (var (_, source) in comp.AmplificationSources) + ampModifier += source; + foreach (var (_, source) in comp.DampeningSources) + dampModifier += source; - _glimmerSystem.Glimmer += _random.Next(1, 5); + var ev = new OnSetPsionicStatsEvent(ampModifier, dampModifier); + RaiseLocalEvent(uid, ref ev); + ampModifier = ev.AmplificationChangedAmount; + dampModifier = ev.DampeningChangedAmount; + + comp.CurrentAmplification = ampModifier; + comp.CurrentDampening = dampModifier; } - public void RemovePsionics(EntityUid uid) + /// + /// Updates a Psion's casting stats, call this anytime a system adds a new source of Amp or Damp. + /// Variant function for systems that didn't already have the PsionicComponent. + /// + /// + public void RefreshPsionicModifiers(EntityUid uid) + { + if (!TryComp(uid, out var comp)) + return; + + RefreshPsionicModifiers(uid, comp); + } + + /// + /// A more advanced form of removing powers. Mindbreaking not only removes all psionic powers, + /// it also disables the possibility of obtaining new ones. + /// + /// + public void MindBreak(EntityUid uid) + { + RemoveAllPsionicPowers(uid, true); + } + + /// + /// Remove all Psionic powers, with accompanying actions, components, and casting stat sources, from a given Psion. + /// Optionally, the Psion can also be rendered permanently non-Psionic. + /// + /// + /// + public void RemoveAllPsionicPowers(EntityUid uid, bool mindbreak = false) { if (!TryComp(uid, out var psionic) || !psionic.Removable) return; - if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) + RemovePsionicActions(uid, psionic); + + var newPsionic = psionic.ActivePowers.ToList(); + foreach (var proto in newPsionic) + { + if (!_prototypeManager.TryIndex(proto.ID, out var power)) + continue; + + RemovePsionicPowerComponents(uid, proto); + + // If we're mindbreaking, we can skip the casting stats since the PsionicComponent is getting 1984'd. + if (!mindbreak) + RemovePsionicStatSources(uid, power, psionic); + } + + if (mindbreak) + { + EnsureComp(uid); + _statusEffectsSystem.TryAddStatusEffect(uid, psionic.MindbreakingStutterCondition, + TimeSpan.FromMinutes(psionic.MindbreakingStutterTime * psionic.CurrentAmplification * psionic.CurrentDampening), + false, + psionic.MindbreakingStutterAccent); + + _popups.PopupEntity(Loc.GetString(psionic.MindbreakingFeedback, ("entity", MetaData(uid).EntityName)), uid, uid, PopupType.MediumCaution); + + RemComp(uid); + RemComp(uid); + return; + } + RefreshPsionicModifiers(uid, psionic); + } + + /// + /// Add all actions associated with a specific Psionic Power + /// + /// + /// + /// + private void AddPsionicActions(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic) + { + foreach (var id in proto.Actions) { - _sawmill.Error("Can't index the random psionic power pool!"); + EntityUid? actionId = null; + if (_actions.AddAction(uid, ref actionId, id)) + { + _actions.StartUseDelay(actionId); + psionic.Actions.Add(id, actionId); + } + } + } + + /// + /// Add all components associated with a specific Psionic power. + /// + /// + /// + private void AddPsionicPowerComponents(EntityUid uid, PsionicPowerPrototype proto) + { + if (proto.Components is null) return; + + foreach (var comp in proto.Components) + { + var powerComp = (Component) _componentFactory.GetComponent(comp.Key); + if (EntityManager.HasComponent(uid, powerComp.GetType())) + continue; + + AddComp(uid, powerComp); } + } + + /// + /// Update the Amplification and Dampening sources of a Psion to include a new Power. + /// + /// + /// + private void AddPsionicStatSources(PsionicPowerPrototype proto, PsionicComponent psionic) + { + if (proto.AmplificationModifier != 0) + psionic.AmplificationSources.Add(proto.Name, proto.AmplificationModifier); + + if (proto.DampeningModifier != 0) + psionic.DampeningSources.Add(proto.Name, proto.DampeningModifier); + } - foreach (var compName in pool.Weights.Keys) + /// + /// Remove all Psychic Actions listed in an entity's Psionic Component. Unfortunately, removing actions associated with a specific Power Prototype is not supported. + /// + /// + /// + private void RemovePsionicActions(EntityUid uid, PsionicComponent psionic) + { + if (psionic.Actions is null) + return; + + foreach (var action in psionic.Actions) + _actionsSystem.RemoveAction(uid, action.Value); + } + + /// + /// Remove all Components associated with a specific Psionic Power. + /// + /// + /// + private void RemovePsionicPowerComponents(EntityUid uid, PsionicPowerPrototype proto) + { + if (proto.Components is null) + return; + + foreach (var comp in proto.Components) { - // component moment - var comp = _componentFactory.GetComponent(compName); - if (EntityManager.TryGetComponent(uid, comp.GetType(), out var psionicPower)) - RemComp(uid, psionicPower); + var powerComp = (Component) _componentFactory.GetComponent(comp.Key); + if (!EntityManager.HasComponent(uid, powerComp.GetType())) + continue; + + EntityManager.RemoveComponent(uid, powerComp.GetType()); } - if (psionic.PsionicAbility != null - && _actionsSystem.TryGetActionData(psionic.PsionicAbility, out var psiAbility) - && psiAbility is not null) - _actionsSystem.RemoveAction(uid, psionic.PsionicAbility); + } + + /// + /// Remove all stat sources associated with a specific Psionic Power. + /// + /// + /// + private void RemovePsionicStatSources(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic) + { + if (proto.AmplificationModifier != 0) + psionic.AmplificationSources.Remove(proto.Name); - _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); + if (proto.DampeningModifier != 0) + psionic.DampeningSources.Remove(proto.Name); - RemComp(uid); + RefreshPsionicModifiers(uid, psionic); } } } diff --git a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs index 8d5a583f6d8..5654f9067b5 100644 --- a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs +++ b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs @@ -8,8 +8,6 @@ using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Robust.Shared.Prototypes; -using Content.Server.Psionics; -using Content.Shared.Body.Part; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. using Content.Shared.Humanoid; using Content.Shared.Language.Components; //Delta-V - Banning humanoids from becoming ghost roles. using Content.Shared.Language.Events; @@ -68,7 +66,6 @@ public override void Effect(ReagentEffectArgs args) ghostRole = entityManager.AddComponent(uid); entityManager.EnsureComponent(uid); - entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. var entityData = entityManager.GetComponent(uid); ghostRole.RoleName = entityData.EntityName; diff --git a/Content.Server/Cloning/CloningSystem.cs b/Content.Server/Cloning/CloningSystem.cs index 92e658591a0..5d311f3ce10 100644 --- a/Content.Server/Cloning/CloningSystem.cs +++ b/Content.Server/Cloning/CloningSystem.cs @@ -50,6 +50,7 @@ using Content.Shared.Damage.ForceSay; using Content.Server.Polymorph.Components; using Content.Shared.Chat; +using Content.Shared.Abilities.Psionics; namespace Content.Server.Cloning { @@ -252,7 +253,7 @@ public bool TryCloning(EntityUid uid, EntityUid bodyToClone, Entity(mob); + EnsureComp(mob); var ev = new CloningEvent(bodyToClone, mob); RaiseLocalEvent(bodyToClone, ref ev); @@ -438,7 +439,7 @@ private EntityUid FetchAndSpawnMob(CloningPodComponent clonePod, HumanoidCharact grammar.Gender = humanoid.Gender; Dirty(grammar); - EnsureComp(mob); + EnsureComp(mob); EnsureComp(mob); EnsureComp(mob); EnsureComp(mob); diff --git a/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs index 62d994dac34..d8ca263d5b2 100644 --- a/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs +++ b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs @@ -7,6 +7,7 @@ using Content.Server.Spawners.Components; using Content.Server.Station.Systems; using Content.Server.Terminator.Systems; +using Content.Shared.Abilities.Psionics; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Mind; @@ -16,7 +17,6 @@ using Content.Shared.Roles.Jobs; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Robust.Shared.Utility; using System.Diagnostics.CodeAnalysis; namespace Content.Server.DeltaV.ParadoxAnomaly.Systems; @@ -156,8 +156,9 @@ private bool TrySpawnParadoxAnomaly(string rule, [NotNullWhen(true)] out EntityU special.AfterEquip(spawned); } - var psi = EnsureComp(spawned); - _psionics.RollPsionics(spawned, psi, false, 100); + // TODO: In a future PR, make it so that the Paradox Anomaly spawns with a completely 1:1 clone of the victim's entire PsionicComponent. + if (HasComp(uid)) + EnsureComp(spawned); return spawned; } diff --git a/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs b/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs index a23a5b3d77d..859f22cd4a9 100644 --- a/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs +++ b/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs @@ -21,7 +21,7 @@ public override void Effect(ReagentEffectArgs args) var psySys = args.EntityManager.EntitySysManager.GetEntitySystem(); - psySys.RemovePsionics(args.SolutionEntity); + psySys.RemoveAllPsionicPowers(args.SolutionEntity, true); } } } diff --git a/Content.Server/Psionics/AntiPsychicWeaponComponent.cs b/Content.Server/Psionics/AntiPsychicWeaponComponent.cs index 00528afbe95..32238c2adbf 100644 --- a/Content.Server/Psionics/AntiPsychicWeaponComponent.cs +++ b/Content.Server/Psionics/AntiPsychicWeaponComponent.cs @@ -2,23 +2,59 @@ namespace Content.Server.Psionics { + /// + /// A component for weapons intended to have special effects when wielded against Psionic Entities. + /// [RegisterComponent] public sealed partial class AntiPsionicWeaponComponent : Component { - [DataField("modifiers", required: true)] + [DataField(required: true)] public DamageModifierSet Modifiers = default!; - [DataField("psychicStaminaDamage")] + [DataField] public float PsychicStaminaDamage = 30f; - [DataField("disableChance")] + /// + /// How long (in seconds) should this weapon temporarily disable powers + /// + [DataField] + public float DisableDuration = 10f; + + /// + /// The chances of this weapon temporarily disabling psionic powers + /// + [DataField] public float DisableChance = 0.3f; /// - /// Punish when used against a non-psychic. + /// The condition to be inflicted on a Psionic entity + /// + [DataField] + public string DisableStatus = "PsionicsDisabled"; + + /// + /// Whether or not the user of this weapon risks Punishment by the gods if they dare use it on non-Psionic Entities /// + /// The odds of divine punishment per non-Psionic Entity attacked + /// + [DataField] + public float PunishChances = 0.5f; + + /// + /// How much Shock damage to take when Punish(ed) by the gods for using this weapon + /// + [DataField] + public int PunishSelfDamage = 20; + + /// + /// How long (in seconds) should the user be stunned when punished by the gods + /// + [DataField] + public float PunishStunDuration = 5f; } } diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs index 31e6b89f13d..751dc28f8cf 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs +++ b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Eye; using Content.Server.NPC.Systems; using Robust.Shared.Containers; +using Robust.Shared.Player; using Robust.Server.GameObjects; namespace Content.Server.Psionics @@ -17,13 +18,12 @@ public override void Initialize() { base.Initialize(); /// Masking - SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnInsulInit); SubscribeLocalEvent(OnInsulShutdown); - SubscribeLocalEvent(OnEyeInit); /// Layer - SubscribeLocalEvent(OnInvisInit); + SubscribeLocalEvent(OnInvisInit); SubscribeLocalEvent(OnInvisShutdown); // PVS Stuff @@ -31,16 +31,14 @@ public override void Initialize() SubscribeLocalEvent(OnEntRemoved); } - private void OnInit(EntityUid uid, PotentialPsionicComponent component, ComponentInit args) + private void OnInit(EntityUid uid, ActorComponent component, ComponentInit args) { - SetCanSeePsionicInvisiblity(uid, false); + if (!HasComp(uid)) + SetCanSeePsionicInvisiblity(uid, false); } private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, ComponentInit args) { - if (!HasComp(uid)) - return; - if (HasComp(uid)) _invisSystem.ToggleInvisibility(uid); @@ -61,9 +59,6 @@ private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, Co private void OnInsulShutdown(EntityUid uid, PsionicInsulationComponent component, ComponentShutdown args) { - if (!HasComp(uid)) - return; - SetCanSeePsionicInvisiblity(uid, false); if (!HasComp(uid)) @@ -79,7 +74,7 @@ private void OnInsulShutdown(EntityUid uid, PsionicInsulationComponent component component.SuppressedFactions.Clear(); } - private void OnInvisInit(EntityUid uid, PsionicallyInvisibleComponent component, ComponentInit args) + private void OnInvisInit(EntityUid uid, PsionicallyInvisibleComponent component, ComponentStartup args) { var visibility = EntityManager.EnsureComponent(uid); @@ -99,10 +94,6 @@ private void OnInvisShutdown(EntityUid uid, PsionicallyInvisibleComponent compon } } - private void OnEyeInit(EntityUid uid, EyeComponent component, ComponentInit args) - { - //SetCanSeePsionicInvisiblity(uid, true); //JJ Comment - Not allowed to modifies .yml on spawn any longer. See UninitializedSaveTest. - } private void OnEntInserted(EntityUid uid, PsionicallyInvisibleComponent component, EntInsertedIntoContainerMessage args) { DirtyEntity(args.Entity); @@ -121,11 +112,12 @@ public void SetCanSeePsionicInvisiblity(EntityUid uid, bool set) { _eye.SetVisibilityMask(uid, eye.VisibilityMask | (int) VisibilityFlags.PsionicInvisibility, eye); } - } else + } + else { if (EntityManager.TryGetComponent(uid, out EyeComponent? eye)) { - _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~ (int) VisibilityFlags.PsionicInvisibility, eye); + _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.PsionicInvisibility, eye); } } } diff --git a/Content.Server/Psionics/PotentialPsionicComponent.cs b/Content.Server/Psionics/PotentialPsionicComponent.cs deleted file mode 100644 index 9499497cd1d..00000000000 --- a/Content.Server/Psionics/PotentialPsionicComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Content.Server.Psionics -{ - [RegisterComponent] - public sealed partial class PotentialPsionicComponent : Component - { - [DataField("chance")] - public float Chance = 0.04f; - - /// - /// YORO (you only reroll once) - /// - public bool Rerolled = false; - } -} diff --git a/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs b/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs deleted file mode 100644 index f9cc9339d4e..00000000000 --- a/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Server.Psionics -{ - /// - /// Will open the 'accept psionics' UI when a player attaches. - /// - [RegisterComponent] - public sealed partial class PsionicAwaitingPlayerComponent : Component - {} -} diff --git a/Content.Server/Psionics/PsionicBonusChanceComponent.cs b/Content.Server/Psionics/PsionicBonusChanceComponent.cs deleted file mode 100644 index d9cbc511477..00000000000 --- a/Content.Server/Psionics/PsionicBonusChanceComponent.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Content.Server.Psionics -{ - [RegisterComponent] - public sealed partial class PsionicBonusChanceComponent : Component - { - [DataField("multiplier")] - public float Multiplier = 1f; - [DataField("flatBonus")] - public float FlatBonus = 0; - - /// - /// Whether we should warn the user they are about to receive psionics. - /// It's here because AddComponentSpecial can't overwrite a component, and this is very role dependent. - /// - [DataField("warn")] - public bool Warn = true; - } -} diff --git a/Content.Server/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs index 959251d1fb7..5c273461f1e 100644 --- a/Content.Server/Psionics/PsionicsCommands.cs +++ b/Content.Server/Psionics/PsionicsCommands.cs @@ -1,10 +1,7 @@ using Content.Server.Administration; using Content.Shared.Administration; using Content.Shared.Abilities.Psionics; -using Content.Shared.Mobs.Components; using Robust.Shared.Console; -using Robust.Server.GameObjects; -using Content.Shared.Actions; using Robust.Shared.Player; namespace Content.Server.Psionics; @@ -17,19 +14,14 @@ public sealed class ListPsionicsCommand : IConsoleCommand public string Help => Loc.GetString("command-lspsionic-help"); public async void Execute(IConsoleShell shell, string argStr, string[] args) { - SharedActionsSystem actions = default!; var entMan = IoCManager.Resolve(); - foreach (var (actor, mob, psionic, meta) in entMan.EntityQuery()){ - // filter out xenos, etc, with innate telepathy - actions.TryGetActionData( psionic.PsionicAbility, out var actionData ); - if (actionData == null || actionData.ToString() == null) - return; + foreach (var (actor, psionic, meta) in entMan.EntityQuery()) + { + var powerList = new List(); + foreach (var power in psionic.ActivePowers) + powerList.Add(power.Name); - var psiPowerName = actionData.ToString(); - if (psiPowerName == null) - return; - - shell.WriteLine(meta.EntityName + " (" + meta.Owner + ") - " + actor.PlayerSession.Name + Loc.GetString(psiPowerName)); + shell.WriteLine(meta.EntityName + " (" + meta.Owner + ") - " + actor.PlayerSession.Name + powerList); } } } diff --git a/Content.Server/Psionics/PsionicsSystem.Events.cs b/Content.Server/Psionics/PsionicsSystem.Events.cs new file mode 100644 index 00000000000..82a0faec64b --- /dev/null +++ b/Content.Server/Psionics/PsionicsSystem.Events.cs @@ -0,0 +1,19 @@ + +namespace Content.Server.Psionics +{ + /// + /// Raised on an entity about to roll for a Psionic Power, after their baseline chances of success are calculated. + /// + [ByRefEvent] + public struct OnRollPsionicsEvent + { + public readonly EntityUid Roller; + public float BaselineChance; + public OnRollPsionicsEvent(EntityUid roller, float baselineChance) + { + Roller = roller; + BaselineChance = baselineChance; + } + } +} + diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index fb5d18f2843..23cf6aeb80b 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -5,7 +5,6 @@ using Content.Shared.Damage.Events; using Content.Shared.CCVar; using Content.Server.Abilities.Psionics; -using Content.Server.Chat.Systems; using Content.Server.Electrocution; using Content.Server.NPC.Components; using Content.Server.NPC.Systems; @@ -27,11 +26,14 @@ public sealed class PsionicsSystem : EntitySystem [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + private const string BaselineAmplification = "Baseline Amplification"; + private const string BaselineDampening = "Baseline Dampening"; + /// /// Unfortunately, since spawning as a normal role and anything else is so different, /// this is the only way to unify them, for now at least. /// - Queue<(PotentialPsionicComponent component, EntityUid uid)> _rollers = new(); + Queue<(PsionicComponent component, EntityUid uid)> _rollers = new(); public override void Update(float frameTime) { base.Update(frameTime); @@ -42,19 +44,16 @@ public override void Update(float frameTime) public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); SubscribeLocalEvent(OnStamHit); - SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); } - private void OnStartup(EntityUid uid, PotentialPsionicComponent component, MapInitEvent args) + private void OnStartup(EntityUid uid, PsionicComponent component, MapInitEvent args) { - if (HasComp(uid)) - return; - _rollers.Enqueue((component, uid)); } @@ -67,7 +66,7 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel _audio.PlayPvs("/Audio/Effects/lightburn.ogg", entity); args.ModifiersList.Add(component.Modifiers); if (_random.Prob(component.DisableChance)) - _statusEffects.TryAddStatusEffect(entity, "PsionicsDisabled", TimeSpan.FromSeconds(10), true, "PsionicsDisabled"); + _statusEffects.TryAddStatusEffect(entity, component.DisableStatus, TimeSpan.FromSeconds(component.DisableDuration), true, component.DisableStatus); } if (TryComp(entity, out var swapped)) @@ -76,13 +75,16 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel return; } - if (component.Punish && HasComp(entity) && !HasComp(entity) && _random.Prob(0.5f)) - _electrocutionSystem.TryDoElectrocution(args.User, null, 20, TimeSpan.FromSeconds(5), false); + if (component.Punish && !HasComp(entity) && _random.Prob(component.PunishChances)) + _electrocutionSystem.TryDoElectrocution(args.User, null, component.PunishSelfDamage, TimeSpan.FromSeconds(component.PunishStunDuration), false); } } - private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) + private void OnInit(EntityUid uid, PsionicComponent component, ComponentStartup args) { + component.AmplificationSources.Add(BaselineAmplification, _random.NextFloat(component.BaselineAmplification.Item1, component.BaselineAmplification.Item2)); + component.DampeningSources.Add(BaselineDampening, _random.NextFloat(component.BaselineDampening.Item1, component.BaselineDampening.Item2)); + if (!component.Removable || !TryComp(uid, out var factions) || _npcFactonSystem.ContainsFaction(uid, "GlimmerMonster", factions)) @@ -105,40 +107,43 @@ private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, Take args.FlatModifier += component.PsychicStaminaDamage; } - public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, bool applyGlimmer = true, float multiplier = 1f) + public void RollPsionics(EntityUid uid, PsionicComponent component, bool applyGlimmer = true, float rollEventMultiplier = 1f) { - if (HasComp(uid) - || !_cfg.GetCVar(CCVars.PsionicRollsEnabled)) + if (!_cfg.GetCVar(CCVars.PsionicRollsEnabled) + || !component.Removable) return; - var chance = component.Chance; - var warn = true; - if (TryComp(uid, out var bonus)) - { - chance *= bonus.Multiplier; - chance += bonus.FlatBonus; - warn = bonus.Warn; - } + // Calculate the initial odds based on the innate potential + var baselineChance = component.Chance + * component.PowerRollMultiplier + + component.PowerRollFlatBonus; - if (applyGlimmer) - chance += ((float) _glimmerSystem.Glimmer / 1000); + // Increase the initial odds based on Glimmer. + // TODO: Change this equation when I do my Glimmer Refactor + baselineChance += applyGlimmer + ? (float) _glimmerSystem.Glimmer / 1000 //Convert from Glimmer to %chance + : 0; - chance *= multiplier; + // Certain sources of power rolls provide their own multiplier. + baselineChance *= rollEventMultiplier; - chance = Math.Clamp(chance, 0, 1); + // Ask if the Roller has any other effects to contribute, such as Traits. + var ev = new OnRollPsionicsEvent(uid, baselineChance); + RaiseLocalEvent(uid, ref ev); - if (_random.Prob(chance)) - _psionicAbilitiesSystem.AddPsionics(uid, warn); + if (_random.Prob(Math.Clamp(ev.BaselineChance, 0, 1))) + _psionicAbilitiesSystem.AddPsionics(uid); } - public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = null, float bonusMuliplier = 1f) + public void RerollPsionics(EntityUid uid, PsionicComponent? psionic = null, float bonusMuliplier = 1f) { if (!Resolve(uid, ref psionic, false) - || psionic.Rerolled) + || !psionic.Removable + || psionic.CanReroll) return; - RollPsionics(uid, psionic, multiplier: bonusMuliplier); - psionic.Rerolled = true; + RollPsionics(uid, psionic, true, bonusMuliplier); + psionic.CanReroll = true; } } } diff --git a/Content.Server/Research/Oracle/OracleSystem.cs b/Content.Server/Research/Oracle/OracleSystem.cs index 63dcefbadd7..a93627dbd3a 100644 --- a/Content.Server/Research/Oracle/OracleSystem.cs +++ b/Content.Server/Research/Oracle/OracleSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Chat.Systems; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Fluids.EntitySystems; -using Content.Server.Psionics; using Content.Server.Research.Systems; using Content.Shared.Abilities.Psionics; using Content.Shared.Chat; @@ -74,7 +73,7 @@ public override void Initialize() private void OnInteractHand(Entity oracle, ref InteractHandEvent args) { - if (!HasComp(args.User) || HasComp(args.User) + if (!HasComp(args.User) || HasComp(args.User) || !TryComp(args.User, out var actor)) return; diff --git a/Content.Server/Revolutionary/Components/CommandStaffComponent.cs b/Content.Server/Revolutionary/Components/CommandStaffComponent.cs index 8e42f41cb3d..d7395bf16e5 100644 --- a/Content.Server/Revolutionary/Components/CommandStaffComponent.cs +++ b/Content.Server/Revolutionary/Components/CommandStaffComponent.cs @@ -3,10 +3,11 @@ namespace Content.Server.Revolutionary.Components; /// -/// Given to heads at round start for Revs. Used for tracking if heads died or not. +/// Component for tracking if someone is a Head of Staff. /// [RegisterComponent, Access(typeof(RevolutionaryRuleSystem))] public sealed partial class CommandStaffComponent : Component { - + public float PsionicBonusModifier = 1; + public float PsionicBonusOffset = 0.25f; } diff --git a/Content.Server/Revolutionary/Components/CommandStaffSystem.cs b/Content.Server/Revolutionary/Components/CommandStaffSystem.cs new file mode 100644 index 00000000000..d940ec9c267 --- /dev/null +++ b/Content.Server/Revolutionary/Components/CommandStaffSystem.cs @@ -0,0 +1,16 @@ +using Content.Server.Psionics; + +namespace Content.Server.Revolutionary.Components; +public sealed partial class CommandStaffSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnRollPsionics); + } + + private void OnRollPsionics(EntityUid uid, CommandStaffComponent component, ref OnRollPsionicsEvent args) + { + args.BaselineChance = args.BaselineChance * component.PsionicBonusModifier + component.PsionicBonusOffset; + } +} \ No newline at end of file diff --git a/Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs index bfa82644cd6..56c56005b77 100644 --- a/Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs +++ b/Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs @@ -5,4 +5,18 @@ namespace Content.Server.StationEvents.Components; [RegisterComponent, Access(typeof(NoosphericZapRule))] public sealed partial class NoosphericZapRuleComponent : Component { + /// + /// How long (in seconds) should this event stun its victims. + /// + public float StunDuration = 5f; + + /// + /// How long (in seconds) should this event give its victims the Stuttering condition. + /// + public float StutterDuration = 10f; + + /// + /// When paralyzing a Psion with a reroll still available, how much should this event modify the odds of generating a power. + /// + public float PowerRerollMultiplier = 0.25f; } diff --git a/Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs b/Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs index c086462b409..152ff77853e 100644 --- a/Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs +++ b/Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs @@ -1,7 +1,7 @@ using System.Linq; using Content.Server.GameTicking.Rules.Components; using Content.Server.Ghost.Roles.Components; -using Content.Server.Psionics; +using Content.Shared.Abilities.Psionics; using Content.Server.Speech.Components; using Content.Server.StationEvents.Components; using Content.Shared.Mobs.Systems; @@ -50,7 +50,7 @@ protected override void Started(EntityUid uid, GlimmerRandomSentienceRuleCompone comp.RoleDescription = Loc.GetString("station-event-random-sentience-role-description", ("name", comp.RoleName)); RemComp(target); RemComp(target); - EnsureComp(target); + EnsureComp(target); EnsureComp(target); } } diff --git a/Content.Server/StationEvents/Events/MassMindSwapRule.cs b/Content.Server/StationEvents/Events/MassMindSwapRule.cs index 63944563269..c7e9f1e0298 100644 --- a/Content.Server/StationEvents/Events/MassMindSwapRule.cs +++ b/Content.Server/StationEvents/Events/MassMindSwapRule.cs @@ -27,7 +27,7 @@ protected override void Started(EntityUid uid, MassMindSwapRuleComponent compone List psionicPool = new(); List psionicActors = new(); - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); while (query.MoveNext(out var psion, out _, out _)) { if (_mobStateSystem.IsAlive(psion) && !HasComp(psion)) diff --git a/Content.Server/StationEvents/Events/NoosphericStormRule.cs b/Content.Server/StationEvents/Events/NoosphericStormRule.cs index 175318e15bd..2465cb37fa5 100644 --- a/Content.Server/StationEvents/Events/NoosphericStormRule.cs +++ b/Content.Server/StationEvents/Events/NoosphericStormRule.cs @@ -23,17 +23,14 @@ protected override void Started(EntityUid uid, NoosphericStormRuleComponent comp List validList = new(); - var query = EntityManager.EntityQueryEnumerator(); - while (query.MoveNext(out var potentialPsionic, out var potentialPsionicComponent)) + var query = EntityManager.EntityQueryEnumerator(); + while (query.MoveNext(out var Psionic, out var PsionicComponent)) { - if (_mobStateSystem.IsDead(potentialPsionic)) + if (_mobStateSystem.IsDead(Psionic) + || HasComp(Psionic)) continue; - // Skip over those who are already psionic or those who are insulated, or zombies. - if (HasComp(potentialPsionic) || HasComp(potentialPsionic) || HasComp(potentialPsionic)) - continue; - - validList.Add(potentialPsionic); + validList.Add(Psionic); } // Give some targets psionic abilities. diff --git a/Content.Server/StationEvents/Events/NoosphericZapRule.cs b/Content.Server/StationEvents/Events/NoosphericZapRule.cs index 82c3d72b139..a452f55ed2a 100644 --- a/Content.Server/StationEvents/Events/NoosphericZapRule.cs +++ b/Content.Server/StationEvents/Events/NoosphericZapRule.cs @@ -25,29 +25,25 @@ protected override void Started(EntityUid uid, NoosphericZapRuleComponent compon { base.Started(uid, component, gameRule, args); - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); - while (query.MoveNext(out var psion, out var potentialPsionicComponent, out _)) + while (query.MoveNext(out var psion, out var psionicComponent, out _)) { if (!_mobStateSystem.IsAlive(psion) || HasComp(psion)) continue; - _stunSystem.TryParalyze(psion, TimeSpan.FromSeconds(5), false); - _statusEffectsSystem.TryAddStatusEffect(psion, "Stutter", TimeSpan.FromSeconds(10), false, "StutteringAccent"); + _stunSystem.TryParalyze(psion, TimeSpan.FromSeconds(component.StunDuration), false); + _statusEffectsSystem.TryAddStatusEffect(psion, "Stutter", TimeSpan.FromSeconds(component.StutterDuration), false, "StutteringAccent"); - if (HasComp(psion)) - _popupSystem.PopupEntity(Loc.GetString("noospheric-zap-seize"), psion, psion, Shared.Popups.PopupType.LargeCaution); + if (psionicComponent.CanReroll) + { + psionicComponent.CanReroll = false; + _popupSystem.PopupEntity(Loc.GetString("noospheric-zap-seize-potential-regained"), psion, psion, Shared.Popups.PopupType.LargeCaution); + } else { - if (potentialPsionicComponent.Rerolled) - { - potentialPsionicComponent.Rerolled = false; - _popupSystem.PopupEntity(Loc.GetString("noospheric-zap-seize-potential-regained"), psion, psion, Shared.Popups.PopupType.LargeCaution); - } else - { - _psionicsSystem.RollPsionics(psion, potentialPsionicComponent, multiplier: 0.25f); - _popupSystem.PopupEntity(Loc.GetString("noospheric-zap-seize"), psion, psion, Shared.Popups.PopupType.LargeCaution); - } + _psionicsSystem.RollPsionics(psion, psionicComponent, true, component.PowerRerollMultiplier); + _popupSystem.PopupEntity(Loc.GetString("noospheric-zap-seize"), psion, psion, Shared.Popups.PopupType.LargeCaution); } } } diff --git a/Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs b/Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs index 63e0a435cb0..f5afa1e4587 100644 --- a/Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs +++ b/Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs @@ -1,6 +1,5 @@ using Robust.Shared.Random; using Robust.Shared.Player; -using Content.Server.Psionics; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Shared.Mobs.Components; @@ -28,7 +27,7 @@ protected override void Started(EntityUid uid, PsionicCatGotYourTongueRuleCompon List psionicList = new(); - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); while (query.MoveNext(out var psion, out _, out _)) { if (_mobStateSystem.IsAlive(psion) && !HasComp(psion)) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index c6c71b80345..5b38e6f766f 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -1,4 +1,3 @@ -using Content.Server.Actions; using Content.Server.Atmos.Components; using Content.Server.Body.Components; using Content.Server.Chat; @@ -37,6 +36,7 @@ using Content.Shared.Prying.Components; using Robust.Shared.Audio.Systems; using Content.Shared.Traits.Assorted.Components; +using Content.Server.Abilities.Psionics; namespace Content.Server.Zombies { @@ -60,7 +60,7 @@ public sealed partial class ZombieSystem [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies + [Dependency] private readonly PsionicAbilitiesSystem _psionic = default!; /// /// Handles an entity turning into a zombie when they die or go into crit @@ -108,17 +108,9 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) RemComp(target); RemComp(target); - if (TryComp(target, out var psionic)) // DeltaV - Prevent psionic zombies + if (HasComp(target)) // Prevent psionic zombies { - if (psionic.ActivePowers.Count > 0) - { - foreach (var power in psionic.ActivePowers) - { - RemComp(target, power); - } - psionic.ActivePowers.Clear(); - } - RemComp(target); + _psionic.RemoveAllPsionicPowers(target, true); } //funny voice diff --git a/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs index ce86111fc4b..fd3c947136a 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs @@ -8,10 +8,10 @@ namespace Content.Shared.Abilities.Psionics [RegisterComponent] public sealed partial class DamageOnDispelComponent : Component { - [DataField("damage", required: true)] - public DamageSpecifier Damage = default!; + [DataField(required: true)] + public DamageSpecifier Damage = default!; - [DataField("variance")] + [DataField] public float Variance = 0.5f; } } diff --git a/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs index cd887866364..6c37ff0b6c3 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs @@ -1,20 +1,5 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] - public sealed partial class DispelPowerComponent : Component - { - [DataField("range")] - public float Range = 10f; - - [DataField("dispelActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? DispelActionId = "ActionDispel"; - - [DataField("dispelActionEntity")] - public EntityUid? DispelActionEntity; - } + public sealed partial class DispelPowerComponent : Component { } } diff --git a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs index 7d611c63dac..97ed24cdde0 100644 --- a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs @@ -1,18 +1,8 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class MassSleepPowerComponent : Component { - public float Radius = 1.25f; - [DataField("massSleepActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? MassSleepActionId = "ActionMassSleep"; - - [DataField("massSleepActionEntity")] - public EntityUid? MassSleepActionEntity; + public readonly float Radius = 1.25f; } } diff --git a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs index e36a3c70e8a..484aa6da14f 100644 --- a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs +++ b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs @@ -1,47 +1,21 @@ -using Content.Shared.Actions; using Content.Shared.Bed.Sleep; -using Content.Shared.Magic.Events; using Content.Shared.Damage; using Content.Shared.Mobs.Components; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Shared.Mind; using Content.Shared.Actions.Events; namespace Content.Shared.Abilities.Psionics { public sealed class MassSleepPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); } - private void OnInit(EntityUid uid, MassSleepPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.MassSleepActionEntity, component.MassSleepActionId ); - _actions.TryGetActionData( component.MassSleepActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MassSleepActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.MassSleepActionEntity; - } - - private void OnShutdown(EntityUid uid, MassSleepPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.MassSleepActionEntity); - } - private void OnPowerUsed(EntityUid uid, MassSleepPowerComponent component, MassSleepPowerActionEvent args) { foreach (var entity in _lookup.GetEntitiesInRange(args.Target, component.Radius)) diff --git a/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs index c9d0130221a..941a2776a49 100644 --- a/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs @@ -1,21 +1,8 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class MetapsionicPowerComponent : Component { - [DataField("range")] - public float Range = 5f; - - public InstantActionComponent? MetapsionicPowerAction = null; - [DataField("metapsionicActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? MetapsionicActionId = "ActionMetapsionic"; - - [DataField("metapsionicActionEntity")] - public EntityUid? MetapsionicActionEntity; + public readonly float Range = 5f; } } diff --git a/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs b/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs index 6a3fc811c89..216972df1e0 100644 --- a/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs @@ -1,16 +1,5 @@ -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] - public sealed partial class MindSwapPowerComponent : Component - { - [DataField("mindSwapActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? MindSwapActionId = "ActionMindSwap"; - - [DataField("mindSwapActionEntity")] - public EntityUid? MindSwapActionEntity; - } + public sealed partial class MindSwapPowerComponent : Component { } } diff --git a/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs b/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs index 0e91894b1dc..abbab16db76 100644 --- a/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs @@ -1,17 +1,5 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] - public sealed partial class NoosphericZapPowerComponent : Component - { - [DataField("noosphericZapActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? NoosphericZapActionId = "ActionNoosphericZap"; - - [DataField("noosphericZapActionEntity")] - public EntityUid? NoosphericZapActionEntity; - } + public sealed partial class NoosphericZapPowerComponent : Component { } } diff --git a/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs index 3e198aa9303..ff983bf9efa 100644 --- a/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs @@ -1,16 +1,5 @@ -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] - public sealed partial class PsionicInvisibilityPowerComponent : Component - { - [DataField("psionicInvisibilityActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? PsionicInvisibilityActionId = "ActionPsionicInvisibility"; - - [DataField("psionicInvisibilityActionEntity")] - public EntityUid? PsionicInvisibilityActionEntity; - } + public sealed partial class PsionicInvisibilityPowerComponent : Component { } } diff --git a/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs index 895c5201c3a..93a5076506f 100644 --- a/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs @@ -1,31 +1,22 @@ using Robust.Shared.Audio; using Content.Shared.DoAfter; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class PsionicRegenerationPowerComponent : Component { - [DataField("doAfter")] + [DataField] public DoAfterId? DoAfter; - [DataField("essence")] + [DataField] public float EssenceAmount = 20; - [DataField("useDelay")] + [DataField] public float UseDelay = 8f; - [DataField("soundUse")] + [DataField] public SoundSpecifier SoundUse = new SoundPathSpecifier("/Audio/Psionics/heartbeat_fast.ogg"); - - [DataField("psionicRegenerationActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? PsionicRegenerationActionId = "ActionPsionicRegeneration"; - - [DataField("psionicRegenerationActionEntity")] - public EntityUid? PsionicRegenerationActionEntity; } } diff --git a/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs index 28425afdb4c..a8867c080cb 100644 --- a/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs @@ -1,18 +1,5 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Shared.Abilities.Psionics { [RegisterComponent] - public sealed partial class PyrokinesisPowerComponent : Component - { - public EntityTargetActionComponent? PyrokinesisPowerAction = null; - [DataField("pyrokinesisActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? PyrokinesisActionId = "ActionPyrokinesis"; - - [DataField("pyrokinesisActionEntity")] - public EntityUid? PyrokinesisActionEntity; - } + public sealed partial class PyrokinesisPowerComponent : Component { } } diff --git a/Content.Shared/Psionics/Items/PsionicItemsSystem.cs b/Content.Shared/Psionics/Items/PsionicItemsSystem.cs index f88acf61f3c..17ee9b25ef0 100644 --- a/Content.Shared/Psionics/Items/PsionicItemsSystem.cs +++ b/Content.Shared/Psionics/Items/PsionicItemsSystem.cs @@ -8,7 +8,6 @@ public sealed class PsionicItemsSystem : EntitySystem { [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; [Dependency] private readonly IComponentFactory _componentFactory = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psiAbilities = default!; public override void Initialize() { base.Initialize(); @@ -29,7 +28,6 @@ private void OnTinfoilEquipped(EntityUid uid, TinfoilHatComponent component, Got var insul = EnsureComp(args.Equipee); insul.Passthrough = component.Passthrough; component.IsActive = true; - _psiAbilities.SetPsionicsThroughEligibility(args.Equipee); } private void OnTinfoilUnequipped(EntityUid uid, TinfoilHatComponent component, GotUnequippedEvent args) @@ -41,7 +39,6 @@ private void OnTinfoilUnequipped(EntityUid uid, TinfoilHatComponent component, G RemComp(args.Equipee); component.IsActive = false; - _psiAbilities.SetPsionicsThroughEligibility(args.Equipee); } private void OnGranterEquipped(EntityUid uid, ClothingGrantPsionicPowerComponent component, GotEquippedEvent args) diff --git a/Content.Shared/Psionics/MindbrokenComponent.cs b/Content.Shared/Psionics/MindbrokenComponent.cs new file mode 100644 index 00000000000..9c0e6152e53 --- /dev/null +++ b/Content.Shared/Psionics/MindbrokenComponent.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Abilities.Psionics +{ + [RegisterComponent] + public sealed partial class MindbrokenComponent : Component { } +} diff --git a/Content.Shared/Psionics/PsionicComponent.cs b/Content.Shared/Psionics/PsionicComponent.cs index 9091e03cfc3..9ff332327a4 100644 --- a/Content.Shared/Psionics/PsionicComponent.cs +++ b/Content.Shared/Psionics/PsionicComponent.cs @@ -1,20 +1,144 @@ -using Content.Shared.Actions; +using Content.Shared.Psionics; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Abilities.Psionics { [RegisterComponent, NetworkedComponent] public sealed partial class PsionicComponent : Component { - public EntityUid? PsionicAbility = null; + /// + /// How close a Psion is to awakening a new power. + /// TODO: Implement this in a separate PR. + /// + [DataField] + public float Potentia = 0; + + /// + /// The baseline chance of obtaining a psionic power when rolling for one. + /// + [DataField] + public float Chance = 0.04f; + + /// + /// Whether or not a Psion has an available "Reroll" to spend on attempting to gain powers. + /// + [DataField] + public bool CanReroll; + + /// + /// The Base amount of time (in minutes) this Psion is given the stutter effect if they become mindbroken. + /// + [DataField] + public float MindbreakingStutterTime = 5; + + public string MindbreakingStutterCondition = "Stutter"; + + public string MindbreakingStutterAccent = "StutteringAccent"; + + public string MindbreakingFeedback = "mindbreaking-feedback"; /// - /// Ifrits, revenants, etc are explicitly magical beings that shouldn't get mindbreakered. + /// How much should the odds of obtaining a Psionic Power be multiplied when rolling for one. /// - [DataField("removable")] + [DataField] + public float PowerRollMultiplier = 1f; + + /// + /// How much the odds of obtaining a Psionic Power should be multiplied when rolling for one. + + /// + [DataField] + public float PowerRollFlatBonus = 0; + + private (float, float) _baselineAmplification = (0.4f, 1.2f); + + /// + /// Use this datafield to change the range of Baseline Amplification. + /// + [DataField] + private (float, float) _baselineAmplificationFactors = (0.4f, 1.2f); + + /// + /// All Psionics automatically possess a random amount of initial starting Amplification, regardless of if they have any powers or not. + /// The game will crash if Robust.Random is handed a (bigger number, smaller number), so the logic here prevents any funny business. + /// + public (float, float) BaselineAmplification + { + get { return _baselineAmplification; } + private set + { + _baselineAmplification = (Math.Min( + _baselineAmplificationFactors.Item1, _baselineAmplificationFactors.Item2), + Math.Max(_baselineAmplificationFactors.Item1, _baselineAmplificationFactors.Item2)); + } + } + private (float, float) _baselineDampening = (0.4f, 1.2f); + + /// + /// Use this datafield to change the range of Baseline Amplification. + /// + [DataField] + private (float, float) _baselineDampeningFactors = (0.4f, 1.2f); + + /// + /// All Psionics automatically possess a random amount of initial starting Dampening, regardless of if they have any powers or not. + /// The game will crash if Robust.Random is handed a (bigger number, smaller number), so the logic here prevents any funny business. + /// + public (float, float) BaselineDampening + { + get { return _baselineDampening; } + private set + { + _baselineDampening = (Math.Min( + _baselineDampeningFactors.Item1, _baselineDampeningFactors.Item2), + Math.Max(_baselineDampeningFactors.Item1, _baselineDampeningFactors.Item2)); + } + } + + /// + /// Ifrits, revenants, etc are explicitly magical beings that shouldn't get mindbroken + /// + [DataField] public bool Removable = true; - [DataField("activePowers")] - public HashSet ActivePowers = new(); + /// + /// The list of all powers currently active on a Psionic, by power Prototype. + /// TODO: Not in this PR due to scope, but this needs to go to Server and not Shared. + /// + [ViewVariables(VVAccess.ReadOnly)] + public HashSet ActivePowers = new(); + + /// + /// The list of each Psionic Power by action with entityUid. + /// + [ViewVariables(VVAccess.ReadOnly)] + public Dictionary Actions = new(); + + /// + /// What sources of Amplification does this Psion have? + /// + [ViewVariables(VVAccess.ReadOnly)] + public readonly Dictionary AmplificationSources = new(); + + /// + /// A measure of how "Powerful" a Psion is. + /// TODO: Implement this in a separate PR. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float CurrentAmplification; + + /// + /// What sources of Dampening does this Psion have? + /// + [ViewVariables(VVAccess.ReadOnly)] + public readonly Dictionary DampeningSources = new(); + + /// + /// A measure of how "Controlled" a Psion is. + /// TODO: Implement this in a separate PR. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float CurrentDampening; } } diff --git a/Content.Shared/Psionics/PsionicEvents.cs b/Content.Shared/Psionics/PsionicEvents.cs new file mode 100644 index 00000000000..be3bf03af62 --- /dev/null +++ b/Content.Shared/Psionics/PsionicEvents.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Psionics; + +/// +/// This event is raised whenever a psionic entity sets their casting stats(Amplification and Dampening), allowing other systems to modify the end result +/// of casting stat math. Useful if for example you want a species to have 5% higher Amplification overall. Or a drug inhibits total Dampening, etc. +/// +/// +/// +/// +[ByRefEvent] +public record struct OnSetPsionicStatsEvent(float AmplificationChangedAmount, float DampeningChangedAmount); \ No newline at end of file diff --git a/Content.Shared/Psionics/PsionicPowerPrototype.cs b/Content.Shared/Psionics/PsionicPowerPrototype.cs new file mode 100644 index 00000000000..621a3ceb114 --- /dev/null +++ b/Content.Shared/Psionics/PsionicPowerPrototype.cs @@ -0,0 +1,61 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Psionics; + +[Prototype] +public sealed partial class PsionicPowerPrototype : IPrototype +{ + /// + /// The ID of the psionic power to use. + /// + [IdDataField] + public string ID { get; } = default!; + + /// + /// The name of the psionic power. + /// + [DataField(required: true)] + public string Name = default!; + + /// + /// The description of a power in yml, used for player notifications. + /// + [DataField(required: true)] + public string Description = default!; + + /// + /// The list of each Action that this power adds in the form of ActionId and ActionEntity + /// + [DataField] + public List Actions = new(); + + /// + /// The list of what Components this power adds. + /// + [DataField] + public ComponentRegistry Components = new(); + + /// + /// What message will play as a popup when the power is initialized. + /// + [DataField(required: true)] + public string InitializationFeedback = "psionic-power-initialization-default"; + + /// + /// What message will this power generate when scanned by a Metempsionic Focused Pulse. + /// + [DataField(required: true)] + public string MetapsionicFeedback = "psionic-metapsionic-feedback-default"; + + /// + /// How much this power will increase or decrease a user's Amplification. + /// + [DataField] + public float AmplificationModifier = 0; + + /// + /// How much this power will increase or decrease a user's Dampening. + /// + [DataField] + public float DampeningModifier = 0; +} \ No newline at end of file diff --git a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs index 2739d5ba31a..f1f03bcb9ed 100644 --- a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs +++ b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs @@ -1,7 +1,4 @@ -using Content.Shared.Actions; using Content.Shared.Administration.Logs; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; using Content.Shared.Popups; using Content.Shared.Psionics.Glimmer; using Robust.Shared.Random; @@ -11,7 +8,6 @@ namespace Content.Shared.Abilities.Psionics { public sealed class SharedPsionicAbilitiesSystem : EntitySystem { - [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; @@ -21,11 +17,7 @@ public sealed class SharedPsionicAbilitiesSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); - - SubscribeLocalEvent(OnMobStateChanged); } private void OnPowerUsed(EntityUid uid, PsionicComponent component, PsionicPowerUsedEvent args) @@ -41,47 +33,6 @@ private void OnPowerUsed(EntityUid uid, PsionicComponent component, PsionicPower } } - private void OnInit(EntityUid uid, PsionicsDisabledComponent component, ComponentInit args) - { - SetPsionicsThroughEligibility(uid); - } - - private void OnShutdown(EntityUid uid, PsionicsDisabledComponent component, ComponentShutdown args) - { - SetPsionicsThroughEligibility(uid); - } - - private void OnMobStateChanged(EntityUid uid, PsionicComponent component, MobStateChangedEvent args) - { - SetPsionicsThroughEligibility(uid); - } - - /// - /// Checks whether the entity is eligible to use its psionic ability. This should be run after anything that could effect psionic eligibility. - /// - public void SetPsionicsThroughEligibility(EntityUid uid) - { - PsionicComponent? component = null; - if (!Resolve(uid, ref component, false)) - return; - - if (component.PsionicAbility == null) - return; - - _actions.TryGetActionData( component.PsionicAbility, out var actionData ); - - if (actionData == null) - return; - - _actions.SetEnabled(actionData.Owner, IsEligibleForPsionics(uid)); - } - - private bool IsEligibleForPsionics(EntityUid uid) - { - return !HasComp(uid) - && (!TryComp(uid, out var mobstate) || mobstate.CurrentState == MobState.Alive); - } - public void LogPowerUsed(EntityUid uid, string power, int minGlimmer = 8, int maxGlimmer = 12) { _adminLogger.Add(Database.LogType.Psionics, Database.LogImpact.Medium, $"{ToPrettyString(uid):player} used {power}"); diff --git a/Resources/Locale/en-US/psionics/psionic-powers.ftl b/Resources/Locale/en-US/psionics/psionic-powers.ftl new file mode 100644 index 00000000000..1844427f67f --- /dev/null +++ b/Resources/Locale/en-US/psionics/psionic-powers.ftl @@ -0,0 +1,69 @@ +generic-power-initialization-feedback = I Awaken. + +# Dispel +dispel-power-description = Dispel summoned entities such as familiars or forcewalls. +dispel-power-initialization-feedback = The powers of fate are nothing to me. I feel as though I can reach out to the strands around me, and enforce reality upon others. +dispel-power-metapsionic-feedback = {CAPITALIZE($entity)} is a mighty stone, standing against the currents of fate + +# Mass Sleep +mass-sleep-power-description = Put targets in a small area to sleep. +mass-sleep-initialization-feedback = Reaching out to the minds around me, I have located the words that can send others to the realm of dreams. +mass-sleep-metapsionic-feedback = {CAPITALIZE($entity)} bears the indelible mark of a dream thief. + +# Mind Swap +mind-swap-power-description = Swap minds with the target. Either can change back after 20 seconds. +mind-swap-power-initialization-feedback = I can feel the bonds of soul and body wither at my whim, my vessel may be replaced with that of another. +mind-swap-power-metapsionic-feedback = {CAPITALIZE($entity)} lacks a strong bond with their vessel, as if their connection with spirit is malleable. + +# Noospheric Zap +noospheric-zap-power-description = Shocks the conciousness of the target and leaves them stunned and stuttering. +noospheric-zap-power-initialization-feedback = + In a single transcendent moment, I find myself standing in a universe tiled by silicon. + I wander this place for days, desperate to find some form of life, and yet none greet me. + Just before I succumb to thirst, a man of silver finds me. He plunges his arm into my body, and I awake screaming. +noospheric-zap-power-metapsionic-feedback = + I look inside {CAPITALIZE($entity)}'s heart, and there, nestled amidst the flesh, whirs a microscopic sliver of a being composed of pure energy. + It turns upon my gaze with malice, its silvery eyes filled with a hatred for the carbon-fleshed. + +# Pyrokinesis +pyrokinesis-power-description = Light a flammable target on fire. +pyrokinesis-power-initialization-feedback = + There is a brilliant flash of light and heat, and for an instant I feel as though every milimeter of my flesh is turned to vapor. + Yet death does not come for me, though I find myself praying it does. The world beyond is both agonizingly hot and bone chilling. + For weeks I despair that Gehenna is real, I starve, I cry, I scream, and the pain does not cease. Finally, a man in white, with the face of an ogrous + fly beckons me to offer my service. When I reach out to shake his hand, the vision fades, and I find myself standing in the prime materium. + I know His name now, it is the Secret of Fire. Merely by thinking of it, I can feel the heat of that place come to my hands. +pyrokinesis-power-metapsionic-feedback = The Secret of Fire dwells within {CAPITALIZE($entity)} + +# Metapsionic Pulse +metapsionic-power-description = Send a mental pulse through the area to see if there are any psychics nearby. +metapsionic-power-initialization-feedback = + The world around me awakens with dreamlight. For a transcendent moment, I can see all that is, all that will ever be. + I find myself staggering, my lips parched not for want of water, but to drink of the cup of knowledge. I. Must. Find. It. +metapsionic-power-metapsionic-feedback = {CAPITALIZE($entity)} gazes back upon thee. + +# Psionic Regeneration +psionic-regeneration-power-description = Push your natural metabolism to the limit to power your body's regenerative capability. +psionic-regeneration-power-initialization-feedback = + I look within myself, finding a wellspring of life. +psionic-regeneration-power-metapsionic-feedback = {CAPITALIZE($entity)} possesses an overwhelming will to live + +# Telegnosis +telegnosis-power-description = Create a telegnostic projection to remotely observe things. +telegnosis-power-initialization-feedback = + With my next step, I find that I am no longer in the material realm. My feet are trodding upon a bridge of rainbow light. + Yet strangly, as I look left and right, I first see a color that is as pink within pink, and to my right, blue within blue. + Just as my mind reels from the displeasure of knowing colors that aren't, a creature I can only describe as a + dragon with the wings of a peacock swoops down, and consumes my flesh in a single bite. I awaken in an instant, to a world utterly devoid + of true, real colors. +telegnosis-power-metapsionic-feedback = {CAPITALIZE($entity)}'s soul travels across bridges composed of dreamlight + +# Psionic Invisibility +psionic-invisibility-power-description = Render yourself invisible to any entity that could potentially be psychic. Borgs, animals, and so on are not affected. +psionic-invisibility-power-initialization-feedback = + I suddenly find myself plunged into a world utterly without light, yet I can feel the rays of warmth cast upon me. + Pondering this, I arrive at a realization that sight itself is an illusion. I reject it, I deny that light itself is real. + When I awaken, I can no longer see even myself. +psionic-invisibility-power-metapsionic-feedback = {CAPITALIZE($entity)}'s wyrd seeks to hide from thine gaze + +mindbreaking-feedback = The light of life vanishes from {CAPITALIZE($entity)}'s eyes, leaving behind a husk pretending at sapience \ No newline at end of file diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 2dad0fe2e65..44fad43bc22 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -81,10 +81,11 @@ - type: ZombieImmune # No zombie servant - type: RandomMetadata nameSegments: [names_golem] - - type: PotentialPsionic - type: Psionic removable: false - # - type: PyrokinesisPower # Pending psionic rework + - type: InnatePsionicPowers + powersToAdd: + - PyrokinesisPower - type: Grammar attributes: proper: true diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml index e3eb9cd6de8..0a39ef6de88 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/glimmer_creatures.yml @@ -22,7 +22,6 @@ reagents: - ReagentId: Ectoplasm Quantity: 15 - - type: PotentialPsionic - type: Psionic - type: GlimmerSource - type: AmbientSound diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index 718dc3ca559..d5dbb5f7eef 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -19,7 +19,6 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic - type: Respirator damage: types: diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml index 2a879472e8c..0ba8f0bb7cc 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml @@ -35,10 +35,6 @@ - !type:AddComponentSpecial components: - type: CommandStaff - - !type:AddComponentSpecial - components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - flatBonus: 0.025 - type: startingGear id: CJGear diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index d1b3bd6a6a9..cf563989bf5 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -118,7 +118,6 @@ - type: Grammar attributes: gender: male - - type: PotentialPsionic # Nyano - type: LanguageKnowledge speaks: - GalacticCommon diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index 397989643e6..d618e407134 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -121,8 +121,6 @@ molsPerSecondPerUnitMass: 0.0005 - type: Speech speechVerb: LargeMob - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - chance: -2 - type: Psionic #Nyano - Summary: makes psionic by default. removable: false - type: LanguageKnowledge diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml index cd4123fa80d..209ad3e93ed 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml @@ -27,4 +27,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml index 5ebd43ddf48..d9dea3c18d9 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml @@ -11,4 +11,3 @@ damageRecovery: types: Asphyxiation: -0.5 - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. diff --git a/Resources/Prototypes/Entities/Mobs/Player/diona.yml b/Resources/Prototypes/Entities/Mobs/Player/diona.yml index 28687c68bfc..dfd5e9a1be7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/diona.yml @@ -11,7 +11,6 @@ damageRecovery: types: Asphyxiation: -1.0 - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. # Reformed Diona - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml index fb84ad3650f..f8f0ddd2b9d 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml @@ -2,6 +2,4 @@ save: false name: Urist McHands The Dwarf parent: BaseMobDwarf - id: MobDwarf - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file + id: MobDwarf \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/harpy.yml b/Resources/Prototypes/Entities/Mobs/Player/harpy.yml index fa6aa98d93c..12df7ff1037 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/harpy.yml @@ -21,4 +21,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic diff --git a/Resources/Prototypes/Entities/Mobs/Player/human.yml b/Resources/Prototypes/Entities/Mobs/Player/human.yml index 6197c82c021..aa87f81a833 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/human.yml @@ -3,8 +3,6 @@ name: Urist McHands parent: BaseMobHuman id: MobHuman - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. #Syndie - type: entity @@ -48,9 +46,8 @@ components: - type: NukeOperative - type: RandomHumanoidAppearance - - type: PsionicBonusChance #Nyano - Summary: makes more likely to be psionic. - multiplier: 7 - warn: false + - type: Psionic + powerRollMultiplier: 7 - type: entity noSpawn: true @@ -70,9 +67,8 @@ - type: NpcFactionMember factions: - Syndicate - - type: PsionicBonusChance #Nyano - Summary: makes more likely to be psionic. - multiplier: 7 - warn: false + - type: Psionic + powerRollMultiplier: 7 # Space Ninja - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml index 9a8ca5be00f..956e6f1260c 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml @@ -528,9 +528,8 @@ id: NukeOp components: - type: NukeOperative - - type: PsionicBonusChance #Nyano - Summary: makes more likely to be psionic. - multiplier: 7 - warn: false + - type: Psionic + powerRollMultiplier: 7 - type: entity id: RandomHumanoidSpawnerCluwne diff --git a/Resources/Prototypes/Entities/Mobs/Player/moth.yml b/Resources/Prototypes/Entities/Mobs/Player/moth.yml index ffdb36d86bd..e79ba1a454f 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/moth.yml @@ -1,7 +1,5 @@ - type: entity save: false name: Urist McFluff - parent: BaseMobMoth - id: MobMoth - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file + parent: BaseMobMoth + id: MobMoth \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml index 71d74222979..b9f265e0bcf 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml @@ -3,7 +3,5 @@ name: Urisst' Mzhand parent: BaseMobReptilian id: MobReptilian - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. #Weh diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml index d2a3225c070..5c2a88c1064 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -2,8 +2,6 @@ save: false parent: BaseMobSkeletonPerson id: MobSkeletonPerson - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - type: entity name: skeleton pirate diff --git a/Resources/Prototypes/Entities/Mobs/Player/slime.yml b/Resources/Prototypes/Entities/Mobs/Player/slime.yml index 79669a8fe2a..d748ff8f3cb 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/slime.yml @@ -1,6 +1,4 @@ - type: entity save: false parent: BaseMobSlimePerson - id: MobSlimePerson - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file + id: MobSlimePerson \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/vox.yml b/Resources/Prototypes/Entities/Mobs/Player/vox.yml index 0a6f4f43644..de1e3da2be7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/vox.yml @@ -3,5 +3,3 @@ name: Vox parent: BaseMobVox id: MobVox - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index e00e06279e5..ac373725ce4 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -16,7 +16,6 @@ spawned: - id: FoodMeatHuman amount: 5 - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - type: LanguageKnowledge speaks: - GalacticCommon diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index 462b3254f1e..996c0d87ab1 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -136,10 +136,12 @@ bloodReagent: DemonsBlood - type: Body prototype: VampiricAnimalLarge - - type: PotentialPsionic - type: Psionic removable: false - - type: MetapsionicPower + - type: InnatePsionicPowers + powersToAdd: + - MetapsionicPower + - PsionicInvisibilityPower - type: AntiPsionicWeapon punish: false modifiers: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml index e1c867691a1..8e9e2c62dfd 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml @@ -27,4 +27,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml index 9b79c556707..18047aa2e20 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml @@ -44,5 +44,4 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/special.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/special.yml index abe2833e890..70628ec4e51 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/special.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/special.yml @@ -42,6 +42,7 @@ visMask: - Normal - TelegnosticProjection + - PsionicInvisibility - type: Input context: "ghost" - type: Examiner diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml index ae85cd25e03..24aa3eba08f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml @@ -27,7 +27,6 @@ channels: - Common - Science - - type: PotentialPsionic #this makes her easier to access for glimmer events, dw about it - type: Psionic - type: Grammar attributes: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index e2f99548429..2617f782af8 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -23,7 +23,11 @@ - !type:AddComponentSpecial components: - type: Psionic - - type: MetapsionicPower + - !type:AddComponentSpecial + components: + - type: InnatePsionicPowers + powersToAdd: + - MetapsionicPower - type: startingGear id: ForensicMantisGear diff --git a/Resources/Prototypes/Psionics/psionics.yml b/Resources/Prototypes/Psionics/psionics.yml new file mode 100644 index 00000000000..d4ae73669f9 --- /dev/null +++ b/Resources/Prototypes/Psionics/psionics.yml @@ -0,0 +1,112 @@ +- type: psionicPower + id: DispelPower + name: Dispel + description: dispel-power-description + actions: + - ActionDispel + components: + - type: DispelPower + initializationFeedback: dispel-power-initialization-feedback + metapsionicFeedback: dispel-power-metapsionic-feedback + dampeningModifier: 1 + +- type: psionicPower + id: MassSleepPower + name: Mass Sleep + description: mass-sleep-power-description + actions: + - ActionMassSleep + components: + - type: MassSleepPower + initializationFeedback: mass-sleep-power-initialization-feedback + metapsionicFeedback: mass-sleep-power-metapsionic-feedback + amplificationModifier: 0.5 + dampeningModifier: 0.5 + +- type: psionicPower + id: MindSwapPower + name: Mind Swap + description: mind-swap-power-description + actions: + - ActionMindSwap + components: + - type: MindSwapPower + initializationFeedback: mind-swap-power-initialization-feedback + metapsionicFeedback: mind-swap-power-metapsionic-feedback + amplificationModifier: 1 + +- type: psionicPower + id: NoosphericZapPower + name: Noospheric Zap + description: noospheric-zap-power-description + actions: + - ActionNoosphericZap + components: + - type: NoosphericZapPower + initializationFeedback: noospheric-zap-power-initialization-feedback + metapsionicFeedback: noospheric-zap-power-metapsionic-feedback + amplificationModifier: 1 + +- type: psionicPower + id: PyrokinesisPower + name: Pyrokinesis + description: pyrokinesis-power-description + actions: + - ActionPyrokinesis + components: + - type: PyrokinesisPower + initializationFeedback: pyrokinesis-power-initialization-feedback + metapsionicFeedback: pyrokinesis-power-metapsionic-feedback + amplificationModifier: 1 + +- type: psionicPower + id: MetapsionicPower + name: Metapsionic Pulse + description: metapsionic-power-description + actions: + - ActionMetapsionic + components: + - type: MetapsionicPower + initializationFeedback: metapsionic-power-initialization-feedback + metapsionicFeedback: metapsionic-power-metapsionic-feedback + amplificationModifier: 0.5 + dampeningModifier: 0.5 + +- type: psionicPower + id: PsionicRegenerationPower + name: Psionic Regeneration + description: psionic-regeneration-power-description + actions: + - ActionPsionicRegeneration + components: + - type: PsionicRegenerationPower + initializationFeedback: psionic-regeneration-power-initialization-feedback + metapsionicFeedback: psionic-regeneration-power-metapsionic-feedback + amplificationModifier: 0.5 + dampeningModifier: 0.5 + +- type: psionicPower + id: TelegnosisPower + name: Telegnosis + description: telegnosis-power-description + actions: + - ActionTelegnosis + components: + - type: TelegnosisPower + initializationFeedback: telegnosis-power-initialization-feedback + metapsionicFeedback: telegnosis-power-metapsionic-feedback + amplificationModifier: 0.5 + dampeningModifier: 0.5 + +- type: psionicPower + id: PsionicInvisibilityPower + name: Psionic Invisibility + description: psionic-invisibility-power-description + actions: + - ActionDispel + components: + - type: PsionicInvisibilityPower + initializationFeedback: psionic-invisibility-power-initialization-feedback + metapsionicFeedback: psionic-invisibility-power-metapsionic-feedback + amplificationModifier: 0.5 + dampeningModifier: 0.5 \ No newline at end of file diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml index 9b4f5ea1487..a058c24b848 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml @@ -18,10 +18,8 @@ - !type:AddComponentSpecial components: - type: BibleUser #Lets them heal with bibles - - !type:AddComponentSpecial - components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - multiplier: 3 + - type: Psionic + powerRollMultiplier: 3 - type: startingGear id: ChaplainGear diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml index 3e04285d601..c7c659bc531 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml @@ -16,7 +16,6 @@ special: - !type:AddComponentSpecial components: - - type: Psionic # Nyano - Summary: Makes the mime psionic. - type: MimePowers - type: FrenchAccent diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml index d624b349d56..219684cc7d7 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml @@ -40,10 +40,6 @@ - !type:AddComponentSpecial components: - type: CommandStaff - - !type:AddComponentSpecial - components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - flatBonus: 0.025 - type: startingGear id: CaptainGear diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml index 6311eb9fee6..878b184b8bc 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml @@ -66,10 +66,6 @@ - !type:AddComponentSpecial components: - type: CommandStaff - - !type:AddComponentSpecial - components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - flatBonus: 0.025 - type: startingGear id: HoPGear diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml index eaa66d6f0cc..2690b9ba016 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml @@ -35,10 +35,6 @@ - !type:AddComponentSpecial components: - type: CommandStaff - - !type:AddComponentSpecial - components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - flatBonus: 0.025 - type: startingGear id: ChiefEngineerGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index 61b1df7784f..b132729432c 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -42,8 +42,6 @@ - type: CommandStaff - !type:AddComponentSpecial components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - flatBonus: 0.025 - type: CPRTraining - type: startingGear diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 747ee41b840..1697cad6748 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -29,12 +29,15 @@ components: - type: BibleUser # Nyano - Lets them heal with bibles - type: Psionic # Nyano - They start with telepathic chat - - type: DispelPower # Nyano - They get the Dispel psionic power on spawn - !type:AddImplantSpecial implants: [ MindShieldImplant ] - !type:AddComponentSpecial components: - type: CommandStaff + - type: InnatePsionicPowers + powersToAdd: + - DispelPower + - MetapsionicPower - type: startingGear id: ResearchDirectorGear diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index 46e018f35a8..f1578534557 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -40,10 +40,6 @@ - !type:AddComponentSpecial components: - type: CommandStaff - - !type:AddComponentSpecial - components: - - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. - flatBonus: 0.025 - type: startingGear id: HoSGear diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 7856a68ab34..61399745547 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -168,3 +168,19 @@ components: - type: Singer proto: NormalSinger + +- type: trait + id: LatentPsychic + category: Mental + points: -3 + components: + - type: Psionic + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - ResearchDirector + - ForensicMantis + - Chaplain From 636454fa3c1fe835266f3242ff585310b293d9e3 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 20 Aug 2024 18:43:07 +0000 Subject: [PATCH 06/74] Automatic Changelog Update (#731) --- Resources/Changelog/Changelog.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e682179b57c..30d3cfa60fc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5428,3 +5428,26 @@ Entries: both providing innate modifiers to a character's Morale. id: 6272 time: '2024-08-20T08:16:05.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Latent Psychic has been added as a new positive trait. + - type: Tweak + message: >- + Psionics have received a substantial refactor. While no new powers have + been added this patch, this initial refactor lays the groundwork so that + new psionic powers will be easier to create. + - type: Tweak + message: >- + Latent Psychic is now fully required to become psionic, or to interact + with Oracle. + - type: Tweak + message: Psychics can now have more than one active power. + - type: Remove + message: Mimes are no longer Psionic. + - type: Tweak + message: >- + Chaplain, Mantis, & Mystagogue all receive the Latent Psychic trait for + free, automatically. + id: 6273 + time: '2024-08-20T18:42:44.0000000+00:00' From 0fd038a040b1d54593b7d3d1ccbb3f2e5705bd4f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 20 Aug 2024 14:49:28 -0400 Subject: [PATCH 07/74] Fix Overlays (#756) # Description Overlays have a funny bug where the calls to update them are global. Meaning if any single person gets a bad enough mood to greyscale themselves, everyone globally gets greyscaled. This bug was also present on Dogvision and Ultravision, and had the same cause. Frontier luckily had a fix for those two, and the fix works here as well for the Mood Overlay. # Changelog :cl: - fix: Fixed an issue where Overlays(Dogvision, Ultravision, Mood) would apply globally to all entities when updating. --- .../Overlays/DogVisionOverlay.cs | 23 ++++++++++------- .../Overlays/DogVisionSystem.cs | 25 +++++++++++++++++-- .../Overlays/SaturationScaleOverlay.cs | 20 ++++++++++++--- .../Overlays/SaturationScaleSystem.cs | 8 +++--- .../Overlays/UltraVisionOverlay.cs | 23 ++++++++++------- .../Overlays/UltraVisionSystem.cs | 25 +++++++++++++++++-- .../DeltaV/Abilities/UltraVisionComponent.cs | 8 ------ .../Abilities/DogVisionComponent.cs | 8 ------ .../Assorted/Components/DogVisionComponent.cs | 5 ++++ .../Components/UltraVisionComponent.cs | 5 ++++ 10 files changed, 105 insertions(+), 45 deletions(-) rename Content.Client/{Nyanotrasen => }/Overlays/DogVisionOverlay.cs (68%) rename Content.Client/{Nyanotrasen => }/Overlays/DogVisionSystem.cs (59%) rename Content.Client/{DeltaV => }/Overlays/UltraVisionOverlay.cs (68%) rename Content.Client/{DeltaV => }/Overlays/UltraVisionSystem.cs (59%) delete mode 100644 Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs delete mode 100644 Content.Shared/Nyanotrasen/Abilities/DogVisionComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Components/DogVisionComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Components/UltraVisionComponent.cs diff --git a/Content.Client/Nyanotrasen/Overlays/DogVisionOverlay.cs b/Content.Client/Overlays/DogVisionOverlay.cs similarity index 68% rename from Content.Client/Nyanotrasen/Overlays/DogVisionOverlay.cs rename to Content.Client/Overlays/DogVisionOverlay.cs index 95cfc683e09..91f5521f7ff 100644 --- a/Content.Client/Nyanotrasen/Overlays/DogVisionOverlay.cs +++ b/Content.Client/Overlays/DogVisionOverlay.cs @@ -2,9 +2,9 @@ using Robust.Client.Player; using Robust.Shared.Enums; using Robust.Shared.Prototypes; -using Content.Shared.Abilities; +using Content.Shared.Traits.Assorted.Components; -namespace Content.Client.Nyanotrasen.Overlays; +namespace Content.Client.Overlays; public sealed partial class DogVisionOverlay : Overlay { @@ -23,22 +23,27 @@ public DogVisionOverlay() _dogVisionShader = _prototypeManager.Index("DogVision").Instance().Duplicate(); } + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (_playerManager.LocalEntity is not { Valid: true } player + || !_entityManager.HasComponent(player)) + return false; + + return base.BeforeDraw(in args); + } + protected override void Draw(in OverlayDrawArgs args) { - if (ScreenTexture == null) + if (ScreenTexture is null) return; - if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player) - return; - if (!_entityManager.HasComponent(player)) - return; - - _dogVisionShader?.SetParameter("SCREEN_TEXTURE", ScreenTexture); + _dogVisionShader.SetParameter("SCREEN_TEXTURE", ScreenTexture); var worldHandle = args.WorldHandle; var viewport = args.WorldBounds; worldHandle.SetTransform(Matrix3.Identity); worldHandle.UseShader(_dogVisionShader); worldHandle.DrawRect(viewport, Color.White); + worldHandle.UseShader(null); } } diff --git a/Content.Client/Nyanotrasen/Overlays/DogVisionSystem.cs b/Content.Client/Overlays/DogVisionSystem.cs similarity index 59% rename from Content.Client/Nyanotrasen/Overlays/DogVisionSystem.cs rename to Content.Client/Overlays/DogVisionSystem.cs index 2da90e877ed..9eab2e09aff 100644 --- a/Content.Client/Nyanotrasen/Overlays/DogVisionSystem.cs +++ b/Content.Client/Overlays/DogVisionSystem.cs @@ -1,14 +1,16 @@ -using Content.Shared.Abilities; +using Content.Shared.Traits.Assorted.Components; using Content.Shared.DeltaV.CCVars; using Robust.Client.Graphics; using Robust.Shared.Configuration; +using Robust.Shared.Player; -namespace Content.Client.Nyanotrasen.Overlays; +namespace Content.Client.Overlays; public sealed partial class DogVisionSystem : EntitySystem { [Dependency] private readonly IOverlayManager _overlayMan = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ISharedPlayerManager _playerMan = default!; private DogVisionOverlay _overlay = default!; @@ -18,6 +20,8 @@ public override void Initialize() SubscribeLocalEvent(OnDogVisionInit); SubscribeLocalEvent(OnDogVisionShutdown); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); Subs.CVar(_cfg, DCCVars.NoVisionFilters, OnNoVisionFiltersChanged); @@ -26,11 +30,28 @@ public override void Initialize() private void OnDogVisionInit(EntityUid uid, DogVisionComponent component, ComponentInit args) { + if (uid != _playerMan.LocalEntity) + return; + if (!_cfg.GetCVar(DCCVars.NoVisionFilters)) _overlayMan.AddOverlay(_overlay); } private void OnDogVisionShutdown(EntityUid uid, DogVisionComponent component, ComponentShutdown args) + { + if (uid != _playerMan.LocalEntity) + return; + + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnPlayerAttached(EntityUid uid, DogVisionComponent component, LocalPlayerAttachedEvent args) + { + if (!_cfg.GetCVar(DCCVars.NoVisionFilters)) + _overlayMan.AddOverlay(_overlay); + } + + private void OnPlayerDetached(EntityUid uid, DogVisionComponent component, LocalPlayerDetachedEvent args) { _overlayMan.RemoveOverlay(_overlay); } diff --git a/Content.Client/Overlays/SaturationScaleOverlay.cs b/Content.Client/Overlays/SaturationScaleOverlay.cs index 199b54f8c9f..50656d3bc1e 100644 --- a/Content.Client/Overlays/SaturationScaleOverlay.cs +++ b/Content.Client/Overlays/SaturationScaleOverlay.cs @@ -1,12 +1,17 @@ using Robust.Client.Graphics; +using Robust.Client.Player; using Robust.Shared.Enums; using Robust.Shared.Prototypes; +using Content.Shared.Mood; +using Content.Shared.Overlays; namespace Content.Client.Overlays; public sealed class SaturationScaleOverlay : Overlay { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] IEntityManager _entityManager = default!; public override bool RequestScreenTexture => true; public override OverlaySpace Space => OverlaySpace.WorldSpace; @@ -18,20 +23,29 @@ public SaturationScaleOverlay() { IoCManager.InjectDependencies(this); - _shader = _prototypeManager.Index("SaturationScale").InstanceUnique(); + _shader = _prototypeManager.Index("SaturationScale").Instance().Duplicate(); + } + + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (_playerManager.LocalEntity is not { Valid: true } player + || !_entityManager.HasComponent(player)) + return false; + + return base.BeforeDraw(in args); } protected override void Draw(in OverlayDrawArgs args) { - if (ScreenTexture == null) + if (ScreenTexture is null) return; _shader.SetParameter("SCREEN_TEXTURE", ScreenTexture); _shader.SetParameter("saturation", Saturation); var handle = args.WorldHandle; - + handle.SetTransform(Matrix3.Identity); handle.UseShader(_shader); handle.DrawRect(args.WorldBounds, Color.White); handle.UseShader(null); diff --git a/Content.Client/Overlays/SaturationScaleSystem.cs b/Content.Client/Overlays/SaturationScaleSystem.cs index 57ce4d41682..b5932e3a490 100644 --- a/Content.Client/Overlays/SaturationScaleSystem.cs +++ b/Content.Client/Overlays/SaturationScaleSystem.cs @@ -1,15 +1,15 @@ using Content.Shared.GameTicking; +using Content.Shared.Mood; using Content.Shared.Overlays; using Robust.Client.Graphics; -using Robust.Client.Player; using Robust.Shared.Player; namespace Content.Client.Overlays; public sealed class SaturationScaleSystem : EntitySystem { - [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IOverlayManager _overlayMan = default!; + [Dependency] private readonly ISharedPlayerManager _playerMan = default!; private SaturationScaleOverlay _overlay = default!; @@ -47,7 +47,7 @@ private void OnPlayerAttached(EntityUid uid, SaturationScaleOverlayComponent com private void OnShutdown(EntityUid uid, SaturationScaleOverlayComponent component, ComponentShutdown args) { - if (_player.LocalSession?.AttachedEntity != uid) + if (uid != _playerMan.LocalEntity) return; _overlayMan.RemoveOverlay(_overlay); @@ -55,7 +55,7 @@ private void OnShutdown(EntityUid uid, SaturationScaleOverlayComponent component private void OnInit(EntityUid uid, SaturationScaleOverlayComponent component, ComponentInit args) { - if (_player.LocalSession?.AttachedEntity != uid) + if (uid != _playerMan.LocalEntity) return; _overlayMan.AddOverlay(_overlay); diff --git a/Content.Client/DeltaV/Overlays/UltraVisionOverlay.cs b/Content.Client/Overlays/UltraVisionOverlay.cs similarity index 68% rename from Content.Client/DeltaV/Overlays/UltraVisionOverlay.cs rename to Content.Client/Overlays/UltraVisionOverlay.cs index 73c05e052b6..fe9317e3650 100644 --- a/Content.Client/DeltaV/Overlays/UltraVisionOverlay.cs +++ b/Content.Client/Overlays/UltraVisionOverlay.cs @@ -2,9 +2,9 @@ using Robust.Client.Player; using Robust.Shared.Enums; using Robust.Shared.Prototypes; -using Content.Shared.Abilities; +using Content.Shared.Traits.Assorted.Components; -namespace Content.Client.DeltaV.Overlays; +namespace Content.Client.Overlays; public sealed partial class UltraVisionOverlay : Overlay { @@ -23,22 +23,27 @@ public UltraVisionOverlay() _ultraVisionShader = _prototypeManager.Index("UltraVision").Instance().Duplicate(); } + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (_playerManager.LocalEntity is not { Valid: true } player + || !_entityManager.HasComponent(player)) + return false; + + return base.BeforeDraw(in args); + } + protected override void Draw(in OverlayDrawArgs args) { - if (ScreenTexture == null) + if (ScreenTexture is null) return; - if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player) - return; - if (!_entityManager.HasComponent(player)) - return; - - _ultraVisionShader?.SetParameter("SCREEN_TEXTURE", ScreenTexture); + _ultraVisionShader.SetParameter("SCREEN_TEXTURE", ScreenTexture); var worldHandle = args.WorldHandle; var viewport = args.WorldBounds; worldHandle.SetTransform(Matrix3.Identity); worldHandle.UseShader(_ultraVisionShader); worldHandle.DrawRect(viewport, Color.White); + worldHandle.UseShader(null); } } diff --git a/Content.Client/DeltaV/Overlays/UltraVisionSystem.cs b/Content.Client/Overlays/UltraVisionSystem.cs similarity index 59% rename from Content.Client/DeltaV/Overlays/UltraVisionSystem.cs rename to Content.Client/Overlays/UltraVisionSystem.cs index b89ffd15263..7728a647848 100644 --- a/Content.Client/DeltaV/Overlays/UltraVisionSystem.cs +++ b/Content.Client/Overlays/UltraVisionSystem.cs @@ -1,14 +1,16 @@ -using Content.Shared.Abilities; +using Content.Shared.Traits.Assorted.Components; using Content.Shared.DeltaV.CCVars; using Robust.Client.Graphics; using Robust.Shared.Configuration; +using Robust.Shared.Player; -namespace Content.Client.DeltaV.Overlays; +namespace Content.Client.Overlays; public sealed partial class UltraVisionSystem : EntitySystem { [Dependency] private readonly IOverlayManager _overlayMan = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ISharedPlayerManager _playerMan = default!; private UltraVisionOverlay _overlay = default!; @@ -18,6 +20,8 @@ public override void Initialize() SubscribeLocalEvent(OnUltraVisionInit); SubscribeLocalEvent(OnUltraVisionShutdown); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); Subs.CVar(_cfg, DCCVars.NoVisionFilters, OnNoVisionFiltersChanged); @@ -26,11 +30,28 @@ public override void Initialize() private void OnUltraVisionInit(EntityUid uid, UltraVisionComponent component, ComponentInit args) { + if (uid != _playerMan.LocalEntity) + return; + if (!_cfg.GetCVar(DCCVars.NoVisionFilters)) _overlayMan.AddOverlay(_overlay); } private void OnUltraVisionShutdown(EntityUid uid, UltraVisionComponent component, ComponentShutdown args) + { + if (uid != _playerMan.LocalEntity) + return; + + _overlayMan.RemoveOverlay(_overlay); + } + + private void OnPlayerAttached(EntityUid uid, UltraVisionComponent component, LocalPlayerAttachedEvent args) + { + if (!_cfg.GetCVar(DCCVars.NoVisionFilters)) + _overlayMan.AddOverlay(_overlay); + } + + private void OnPlayerDetached(EntityUid uid, UltraVisionComponent component, LocalPlayerDetachedEvent args) { _overlayMan.RemoveOverlay(_overlay); } diff --git a/Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs b/Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs deleted file mode 100644 index 5f631c54f25..00000000000 --- a/Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Robust.Shared.GameStates; -namespace Content.Shared.Abilities; - -[RegisterComponent] -[NetworkedComponent] - -public sealed partial class UltraVisionComponent : Component -{} diff --git a/Content.Shared/Nyanotrasen/Abilities/DogVisionComponent.cs b/Content.Shared/Nyanotrasen/Abilities/DogVisionComponent.cs deleted file mode 100644 index b0cf6cf0d1e..00000000000 --- a/Content.Shared/Nyanotrasen/Abilities/DogVisionComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Robust.Shared.GameStates; -namespace Content.Shared.Abilities; - -[RegisterComponent] -[NetworkedComponent] - -public sealed partial class DogVisionComponent : Component -{} diff --git a/Content.Shared/Traits/Assorted/Components/DogVisionComponent.cs b/Content.Shared/Traits/Assorted/Components/DogVisionComponent.cs new file mode 100644 index 00000000000..0979da8c352 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/DogVisionComponent.cs @@ -0,0 +1,5 @@ +using Robust.Shared.GameStates; +namespace Content.Shared.Traits.Assorted.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class DogVisionComponent : Component { } diff --git a/Content.Shared/Traits/Assorted/Components/UltraVisionComponent.cs b/Content.Shared/Traits/Assorted/Components/UltraVisionComponent.cs new file mode 100644 index 00000000000..cbe4eb1a7b5 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/UltraVisionComponent.cs @@ -0,0 +1,5 @@ +using Robust.Shared.GameStates; +namespace Content.Shared.Traits.Assorted.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class UltraVisionComponent : Component { } From bf2c6708e0d2d8fa3aa758cc4bae3de195c906cd Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 20 Aug 2024 18:49:49 +0000 Subject: [PATCH 08/74] Automatic Changelog Update (#756) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 30d3cfa60fc..24e7ed8d9b6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5451,3 +5451,11 @@ Entries: free, automatically. id: 6273 time: '2024-08-20T18:42:44.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed an issue where Overlays(Dogvision, Ultravision, Mood) would apply + globally to all entities when updating. + id: 6274 + time: '2024-08-20T18:49:28.0000000+00:00' From b64b0ab496b0eb9842e09abf8df4e5790047c14b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 20 Aug 2024 19:07:10 -0400 Subject: [PATCH 09/74] Missing Psychic Trait Strings (#758) # Description I accidentally deleted these at some point, so here they are again. ![image](https://github.com/user-attachments/assets/c6216f11-f2bc-48a6-86ae-739de0cfe1df) No changelog because I don't want to publicly admit the error. :) --------- Signed-off-by: VMSolidus Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Resources/Locale/en-US/traits/traits.ftl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 2db791538b6..f995a129b2c 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -195,4 +195,10 @@ trait-description-WeaponsGeneralist = Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. trait-name-Singer = Singer -trait-description-Singer = You are naturally capable of singing simple melodies with your voice. \ No newline at end of file +trait-description-Singer = You are naturally capable of singing simple melodies with your voice. + +trait-name-LatentPsychic = Latent Psychic +trait-description-LatentPsychic = + Your mind and soul are open to the noosphere, allowing for use of Telepathy. + Thus, you are eligible for potentially receiving psychic powers. + It is possible that you may be hunted by otherworldly forces, so consider keeping your powers a secret. From 7142508125ac6eb92138bf52629e33a4ea1f2dc0 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Wed, 21 Aug 2024 01:44:44 -0700 Subject: [PATCH 10/74] Update SECURITY.md (#755) Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- SECURITY.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 38197078a31..22bdbd9fbfa 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,9 +1,8 @@ # Reporting a security vulnerability + You can report a security vulnerability through Discord or through email. -If you want to send an email, you can contact us at . -If you want to contact us through Discord, you can join [our server](https://discord.gg/MwDDf6t) -and then **privately** message anyone with the `@Wizard` or `@SS14 Maintainer` role. +If you want to send an email, you can contact us at . +If you want to contact us through Discord, you can join [our server](https://discord.gg/X4QEXxUrsJ) and then **privately** message anyone with the `@Maintainer` role. -In either case, **do not publicly disclose the vulnerability until we explicitly give -you permission to do so**. +In either case, **do not publicly disclose the vulnerability until we explicitly give you permission to do so**. From 8c0a404abe2b98cc06cfcf94276511b6f55b6ff5 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 21 Aug 2024 05:08:40 -0400 Subject: [PATCH 11/74] Action Blacklists (#760) # Description ![image](https://github.com/user-attachments/assets/febab792-59ca-4938-8f84-e4a94f2a5b31) I noticed that EntityTargetAction prototypes have a Whitelist field, but no Blacklist field. This turned out to be trivial to add, and now it's no longer necessary for Psionic powers to hardcode in C# that they can't affect anyone psionically insulated or Mindbroken. In total only 3 powers had this change, but new powers in the future that affect a target can now arbitrarily blacklist any component(Most likely, PsionicInsulation and Mindbroken. :)) All of this, just to remove 9 total lines of C# hardcoding. # Changelog :cl: - add: Actions no longer need to hardcode in target blacklists, and can now blacklist entities in YML. This is notably useful for Psionic powers, which all share a common feature that they can't target people with Psionic Insulation (Or have been Mindbroken). --- Content.Client/Actions/ActionsSystem.cs | 1 + .../Psionics/Abilities/DispelPowerSystem.cs | 3 --- .../Psionics/Abilities/MindSwapPowerSystem.cs | 3 --- .../Psionics/Abilities/NoosphericZapPowerSystem.cs | 3 --- .../Actions/EntityTargetActionComponent.cs | 9 ++++++--- Content.Shared/Actions/SharedActionsSystem.cs | 3 +++ Resources/Prototypes/Actions/psionics.yml | 12 ++++++++++++ 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index b992e772563..90158ba81e6 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -65,6 +65,7 @@ private void OnEntityTargetHandleState(EntityUid uid, EntityTargetActionComponen return; component.Whitelist = state.Whitelist; + component.Blacklist = state.Blacklist; component.CanTargetSelf = state.CanTargetSelf; BaseHandleState(uid, component, state); } diff --git a/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs index f2dd82900b6..cdfda7c8013 100644 --- a/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs @@ -38,9 +38,6 @@ public override void Initialize() private void OnPowerUsed(DispelPowerActionEvent args) { - if (HasComp(args.Target)) - return; - var ev = new DispelledEvent(); RaiseLocalEvent(args.Target, ev, false); diff --git a/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index 780c1488ec6..2d106706c67 100644 --- a/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -41,9 +41,6 @@ private void OnPowerUsed(MindSwapPowerActionEvent args) if (!(TryComp(args.Target, out var damageable) && damageable.DamageContainerID == "Biological")) return; - if (HasComp(args.Target)) - return; - Swap(args.Performer, args.Target); _psionics.LogPowerUsed(args.Performer, "mind swap"); diff --git a/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index fa44639ea8c..c2f59206392 100644 --- a/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -22,9 +22,6 @@ public override void Initialize() private void OnPowerUsed(NoosphericZapPowerActionEvent args) { - if (HasComp(args.Target)) - return; - _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(5), false); diff --git a/Content.Shared/Actions/EntityTargetActionComponent.cs b/Content.Shared/Actions/EntityTargetActionComponent.cs index 9024f42e0e7..0680a3d3f54 100644 --- a/Content.Shared/Actions/EntityTargetActionComponent.cs +++ b/Content.Shared/Actions/EntityTargetActionComponent.cs @@ -12,24 +12,27 @@ public sealed partial class EntityTargetActionComponent : BaseTargetActionCompon /// /// The local-event to raise when this action is performed. /// - [DataField("event")] + [DataField] [NonSerialized] public EntityTargetActionEvent? Event; - [DataField("whitelist")] public EntityWhitelist? Whitelist; + [DataField] public EntityWhitelist? Whitelist; + [DataField] public EntityWhitelist? Blacklist; - [DataField("canTargetSelf")] public bool CanTargetSelf = true; + [DataField] public bool CanTargetSelf = true; } [Serializable, NetSerializable] public sealed class EntityTargetActionComponentState : BaseActionComponentState { public EntityWhitelist? Whitelist; + public EntityWhitelist? Blacklist; public bool CanTargetSelf; public EntityTargetActionComponentState(EntityTargetActionComponent component, IEntityManager entManager) : base(component, entManager) { Whitelist = component.Whitelist; + Blacklist = component.Blacklist; CanTargetSelf = component.CanTargetSelf; } } diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 9f3fb964100..35d962b0e4e 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -453,6 +453,9 @@ public bool ValidateEntityTarget(EntityUid user, EntityUid target, EntityTargetA if (action.Whitelist != null && !action.Whitelist.IsValid(target, EntityManager)) return false; + if (action.Blacklist != null && action.Blacklist.IsValid(target, EntityManager)) + return false; + if (action.CheckCanInteract && !_actionBlockerSystem.CanInteract(user, target)) return false; diff --git a/Resources/Prototypes/Actions/psionics.yml b/Resources/Prototypes/Actions/psionics.yml index 62a7fc014cd..981d53884ea 100644 --- a/Resources/Prototypes/Actions/psionics.yml +++ b/Resources/Prototypes/Actions/psionics.yml @@ -11,6 +11,10 @@ range: 6 itemIconStyle: BigAction canTargetSelf: false + blacklist: + components: + - PsionicInsulation + - Mindbroken event: !type:DispelPowerActionEvent - type: entity @@ -39,6 +43,10 @@ checkCanAccess: false range: 8 itemIconStyle: BigAction + blacklist: + components: + - PsionicInsulation + - Mindbroken event: !type:MindSwapPowerActionEvent - type: entity @@ -64,6 +72,10 @@ useDelay: 100 range: 5 itemIconStyle: BigAction + blacklist: + components: + - PsionicInsulation + - Mindbroken event: !type:NoosphericZapPowerActionEvent - type: entity From e2036ae688302a987f20906d8ceccd675389f4c2 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 21 Aug 2024 09:09:04 +0000 Subject: [PATCH 12/74] Automatic Changelog Update (#760) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 24e7ed8d9b6..af863097cb1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5459,3 +5459,13 @@ Entries: globally to all entities when updating. id: 6274 time: '2024-08-20T18:49:28.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Actions no longer need to hardcode in target blacklists, and can now + blacklist entities in YML. This is notably useful for Psionic powers, + which all share a common feature that they can't target people with + Psionic Insulation (Or have been Mindbroken). + id: 6275 + time: '2024-08-21T09:08:40.0000000+00:00' From 5268053b2b8cfb5124dc1de2ca9186ece9c971ea Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 21 Aug 2024 05:10:28 -0400 Subject: [PATCH 13/74] Psionic Powers Add Components With Arguments. (#763) # Description While coding another Psionic Power feature, I discovered that the current implementation of iterating over components does not carry over arguments for the components. So I copied over the method used by Traits exactly-as-is, and just changed the names of the variables to accommodate the PsionicSystem. # Changelog :cl: - add: PsionicPowers that add a Component now also allow for adding a Component with Arguments. This works exactly like the trait system's implementation of components. --- .../Abilities/Psionics/PsionicAbilitiesSystem.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index b6309a64f18..6a89ba20b07 100644 --- a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -7,7 +7,7 @@ using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; -using Robust.Shared.Utility; +using Robust.Shared.Serialization.Manager; using Content.Shared.Psionics; using System.Linq; @@ -23,6 +23,7 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; private ProtoId _pool = "RandomPsionicPowerPool"; private const string GenericInitializationMessage = "generic-power-initialization-feedback"; @@ -265,13 +266,14 @@ private void AddPsionicPowerComponents(EntityUid uid, PsionicPowerPrototype prot if (proto.Components is null) return; - foreach (var comp in proto.Components) + foreach (var entry in proto.Components.Values) { - var powerComp = (Component) _componentFactory.GetComponent(comp.Key); - if (EntityManager.HasComponent(uid, powerComp.GetType())) + if (HasComp(uid, entry.Component.GetType())) continue; - AddComp(uid, powerComp); + var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true); + comp.Owner = uid; + EntityManager.AddComponent(uid, comp); } } From 1560b7d5a81609bd777d6ddd098902673cc75b00 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 21 Aug 2024 09:11:05 +0000 Subject: [PATCH 14/74] Automatic Changelog Update (#763) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index af863097cb1..5e71822f4d8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5469,3 +5469,12 @@ Entries: Psionic Insulation (Or have been Mindbroken). id: 6275 time: '2024-08-21T09:08:40.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + PsionicPowers that add a Component now also allow for adding a Component + with Arguments. This works exactly like the trait system's + implementation of components. + id: 6276 + time: '2024-08-21T09:10:28.0000000+00:00' From ad1d76eb87eb363c3cf88beafe2ec9f5146bfb15 Mon Sep 17 00:00:00 2001 From: Timemaster99 <57200767+Timemaster99@users.noreply.github.com> Date: Wed, 21 Aug 2024 05:14:30 -0400 Subject: [PATCH 15/74] DeltaV/DS14 IPC Port (#744) # Description Ported over IPC from DS14, with the fixes from DeltaV. --- # TODO - [X] Port - [ ] Check for errors (Local tests wouldn't run on this one) ---

Media

--- # Changelog :cl: - add: Added IPC as a playable species. --------- Signed-off-by: Timemaster99 <57200767+Timemaster99@users.noreply.github.com> Signed-off-by: VMSolidus Co-authored-by: Daniela <43686351+Day-OS@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: VMSolidus --- .../Commands/SetOutfitCommand.cs | 3 +- Content.Server/Bed/BedSystem.cs | 4 +- .../Electrocution/ElectrocutionSystem.cs | 12 +- Content.Server/Mobs/DeathgaspComponent.cs | 10 +- Content.Server/Mobs/DeathgaspSystem.cs | 5 +- .../Components/BatteryDrinkerComponent.cs | 31 + .../RandomBatteryChargeComponent.cs | 26 + .../SiliconEmitSoundOnDrainedComponent.cs | 27 + .../Power/Systems/BatteryDrinkerSystem.cs | 144 ++ .../Systems/BatteryElectrocuteChargeSystem.cs | 38 + .../SiliconEmitSoundOnDrainedSystem.cs | 41 + .../Radio/IntrinsicRadioKeySystem.cs | 32 + .../BatterySlotRequiresLockComponent.cs | 8 + .../BatterySlotRequiresLockSystem.cs | 42 + .../BlindHealing/BlindHealingComponent.cs | 28 + .../BlindHealing/BlindHealingSystem.cs | 121 ++ .../BatteryDrinkerSourceComponent.cs | 26 + .../Components/SiliconDownOnDeadComponent.cs | 19 + .../Systems/SiliconChargeDeathSystem.cs | 132 ++ .../Charge/Systems/SiliconChargeSystem.cs | 216 +++ .../DeadStartupButtonSystem.cs | 84 + .../EmitBuzzWhileDamagedSystem.cs | 60 + .../EncryptionHolderRequiresLockComponent.cs | 6 + .../EncryptionHolderRequiresLockSystem.cs | 30 + .../IPC/InternalEncryptionKeySpawner.cs | 39 + .../Silicon/Systems/SiliconMiscSystem.cs | 20 + .../WeldingHealableComponent.cs | 9 + .../WeldingHealable/WeldingHealableSystem.cs | 121 ++ .../WeldingHealing/WeldingHealingComponent.cs | 48 + .../Station/Systems/StationSpawningSystem.cs | 5 +- Content.Shared/CCVar/CCVars.cs | 8 + .../Electrocution/ElectrocutionEvents.cs | 4 +- Content.Shared/Humanoid/NamingSystem.cs | 3 + .../Humanoid/Prototypes/SpeciesPrototype.cs | 1 + Content.Shared/Lock/LockComponent.cs | 8 + Content.Shared/Lock/LockSystem.cs | 3 + .../EncryptionKeyHolderComponent.cs | 7 + .../EntitySystems/EncryptionKeySystem.cs | 6 + Content.Shared/Silicon/BatteryDrinkerEvent.cs | 12 + .../BlindHealing/SharedBlindHealingSystem.cs | 13 + .../Silicon/Components/SiliconComponent.cs | 108 ++ .../DeadStartupButtonComponent.cs | 28 + .../SharedDeadStartupButtonSystem.cs | 68 + .../EmitBuzzWhileDamagedComponent.cs | 26 + .../SharedWeldingHealableSystem.cs | 14 + .../Silicon/Systems/SharedSiliconSystem.cs | 109 ++ .../Station/SharedStationSpawningSystem.cs | 1 + Resources/Audio/Effects/Buzzes/buzz1.ogg | Bin 0 -> 19629 bytes Resources/Audio/Effects/Buzzes/buzz2.ogg | Bin 0 -> 18281 bytes Resources/Audio/Effects/Buzzes/buzz3.ogg | Bin 0 -> 24238 bytes Resources/Audio/Effects/Buzzes/buzz4.ogg | Bin 0 -> 23064 bytes Resources/Audio/Effects/Buzzes/buzz5.ogg | Bin 0 -> 53158 bytes Resources/Audio/Effects/Buzzes/buzz6.ogg | Bin 0 -> 25454 bytes Resources/Audio/Effects/Buzzes/buzz7.ogg | Bin 0 -> 38681 bytes Resources/Audio/Effects/Buzzes/buzz8.ogg | Bin 0 -> 14429 bytes Resources/Audio/Effects/Buzzes/buzz9.ogg | Bin 0 -> 38426 bytes Resources/Audio/Effects/Silicon/startup.ogg | Bin 0 -> 17524 bytes Resources/Audio/Voice/IPC/cry_robot_1.ogg | Bin 0 -> 18999 bytes Resources/Audio/Voice/IPC/robot-laugh_3.ogg | Bin 0 -> 23638 bytes Resources/Audio/Voice/IPC/robot-scream.ogg | Bin 0 -> 15211 bytes .../Locale/en-US/Content/Power/batteries.ftl | 1 + .../en-US/Content/Power/batteryDrinker.ftl | 2 + .../Locale/en-US/Content/Power/silicons.ftl | 7 + .../Content/Silicons/siliconChargers.ftl | 5 + .../en-US/Content/Silicons/silicons.ftl | 3 + .../Locale/en-US/body/behavior/behavior.ftl | 3 +- Resources/Locale/en-US/emotes/emotes.ftl | 1 + .../batteryslotrequireslock-component.ftl | 1 + .../Locale/en-US/power/batteryDrinker.ftl | 2 + .../Mobs/Customization/ipcAntenna.ftl | 10 + .../Mobs/Customization/ipcScreens.ftl | 39 + .../Locale/en-US/silicons/cyberlimbs.ftl | 19 + Resources/Locale/en-US/species/namepreset.ftl | 2 + Resources/Locale/en-US/species/species.ftl | 1 + .../Traits => traits}/disabilities.ftl | 0 Resources/Prototypes/Body/Organs/ipc.yml | 72 + Resources/Prototypes/Body/Parts/ipc.yml | 186 +++ Resources/Prototypes/Body/Prototypes/ipc.yml | 45 + Resources/Prototypes/Datasets/ipc_names.yml | 1107 +++++++++++++ .../Entities/Clothing/Masks/masks.yml | 14 + .../Entities/Clothing/Masks/specific.yml | 4 + .../Entities/Mobs/Customization/antenna.yml | 89 ++ .../Mobs/Customization/cyberlimbs/bishop.yml | 40 +- .../Customization/cyberlimbs/hesphiastos.yml | 37 +- .../Customization/cyberlimbs/morpheus.yml | 158 ++ .../Customization/cyberlimbs/shellguard.yml | 125 ++ .../cyberlimbs/wardtakahashi.yml | 112 ++ .../Mobs/Customization/cyberlimbs/xion.yml | 126 ++ .../Mobs/Customization/cyberlimbs/zenghu.yml | 115 ++ .../Entities/Mobs/Customization/screens.yml | 391 +++++ .../Prototypes/Entities/Mobs/Player/ipc.yml | 118 ++ .../Entities/Mobs/Player/silicon_base.yml | 307 ++++ .../Objects/Materials/Sheets/glass.yml | 6 + .../Objects/Specific/Robotics/mmi.yml | 1 + .../Entities/Objects/Tools/cable_coils.yml | 14 + .../Entities/Objects/Tools/welders.yml | 9 + .../Entities/Structures/Power/apc.yml | 10 + .../Entities/Structures/Power/chargers.yml | 1 + Resources/Prototypes/Guidebook/species.yml | 6 + .../ipc_inventory_template.yml | 143 ++ .../Prototypes/SoundCollections/buzzes.yml | 12 + Resources/Prototypes/Species/ipc.yml | 238 +++ Resources/Prototypes/Traits/disabilities.yml | 20 + .../Prototypes/Traits/inconveniences.yml | 1 + Resources/Prototypes/Traits/physical.yml | 25 + Resources/Prototypes/Traits/skills.yml | 7 + .../Prototypes/Voice/speech_emote_sounds.yml | 30 + Resources/Prototypes/Voice/speech_emotes.yml | 6 + Resources/ServerInfo/Guidebook/Mobs/IPCs.xml | 52 + .../ServerInfo/Guidebook/Mobs/Species.xml | 6 +- .../hesphiastos_alt1.rsi/head-1.png | Bin 0 -> 6948 bytes .../hesphiastos_alt1.rsi/head-2.png | Bin 0 -> 6871 bytes .../hesphiastos_alt1.rsi/head-3.png | Bin 0 -> 6916 bytes .../hesphiastos/hesphiastos_alt1.rsi/head.png | Bin 994 -> 0 bytes .../hesphiastos_alt1.rsi/meta.json | 12 +- .../morpheus/morpheus_alt1.rsi/head.png | Bin 0 -> 871 bytes .../morpheus/morpheus_alt1.rsi/meta.json | 15 + .../morpheus/morpheus_main.rsi/head.png | Bin 0 -> 679 bytes .../morpheus/morpheus_main.rsi/l_arm.png | Bin 0 -> 594 bytes .../morpheus/morpheus_main.rsi/l_foot.png | Bin 0 -> 383 bytes .../morpheus/morpheus_main.rsi/l_hand.png | Bin 0 -> 444 bytes .../morpheus/morpheus_main.rsi/l_leg.png | Bin 0 -> 612 bytes .../morpheus/morpheus_main.rsi/meta.json | 51 + .../morpheus/morpheus_main.rsi/r_arm.png | Bin 0 -> 557 bytes .../morpheus/morpheus_main.rsi/r_foot.png | Bin 0 -> 387 bytes .../morpheus/morpheus_main.rsi/r_hand.png | Bin 0 -> 444 bytes .../morpheus/morpheus_main.rsi/r_leg.png | Bin 0 -> 611 bytes .../morpheus/morpheus_main.rsi/torso.png | Bin 0 -> 758 bytes .../shellguard/shellguard_alt1.rsi/head-1.png | Bin 0 -> 6405 bytes .../shellguard/shellguard_alt1.rsi/head-2.png | Bin 0 -> 6791 bytes .../shellguard/shellguard_alt1.rsi/meta.json | 19 + .../shellguard_main.rsi/l_arm-1.png | Bin 0 -> 453 bytes .../shellguard_main.rsi/l_arm-2.png | Bin 0 -> 455 bytes .../shellguard_main.rsi/l_foot-1.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/l_foot-2.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/l_hand-1.png | Bin 0 -> 365 bytes .../shellguard_main.rsi/l_hand-2.png | Bin 0 -> 363 bytes .../shellguard_main.rsi/l_leg-1.png | Bin 0 -> 475 bytes .../shellguard_main.rsi/l_leg-2.png | Bin 0 -> 459 bytes .../shellguard/shellguard_main.rsi/meta.json | 83 + .../shellguard_main.rsi/r_arm-1.png | Bin 0 -> 455 bytes .../shellguard_main.rsi/r_arm-2.png | Bin 0 -> 452 bytes .../shellguard_main.rsi/r_foot-1.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/r_foot-2.png | Bin 0 -> 359 bytes .../shellguard_main.rsi/r_hand-1.png | Bin 0 -> 367 bytes .../shellguard_main.rsi/r_hand-2.png | Bin 0 -> 368 bytes .../shellguard_main.rsi/r_leg-1.png | Bin 0 -> 461 bytes .../shellguard_main.rsi/r_leg-2.png | Bin 0 -> 449 bytes .../shellguard_main.rsi/torso-1.png | Bin 0 -> 707 bytes .../shellguard_main.rsi/torso-2.png | Bin 0 -> 708 bytes .../shellguard_monitor.rsi/head-1.png | Bin 0 -> 466 bytes .../shellguard_monitor.rsi/head-2.png | Bin 0 -> 500 bytes .../shellguard_monitor.rsi/meta.json | 19 + .../wardtakahashi_alt1.rsi/head.png | Bin 0 -> 6829 bytes .../wardtakahashi_alt1.rsi/meta.json | 15 + .../wardtakahashi_main.rsi/head.png | Bin 0 -> 6426 bytes .../wardtakahashi_main.rsi/l_arm.png | Bin 0 -> 505 bytes .../wardtakahashi_main.rsi/l_foot.png | Bin 0 -> 340 bytes .../wardtakahashi_main.rsi/l_hand.png | Bin 0 -> 372 bytes .../wardtakahashi_main.rsi/l_leg.png | Bin 0 -> 572 bytes .../wardtakahashi_main.rsi/meta.json | 51 + .../wardtakahashi_main.rsi/r_arm.png | Bin 0 -> 507 bytes .../wardtakahashi_main.rsi/r_foot.png | Bin 0 -> 337 bytes .../wardtakahashi_main.rsi/r_hand.png | Bin 0 -> 378 bytes .../wardtakahashi_main.rsi/r_leg.png | Bin 0 -> 553 bytes .../wardtakahashi_main.rsi/torso.png | Bin 0 -> 961 bytes .../wardtakahashi_monitor.rsi/head.png | Bin 0 -> 773 bytes .../wardtakahashi_monitor.rsi/meta.json | 15 + .../cyberlimbs/xion/xion_alt1.rsi/head-1.png | Bin 0 -> 6832 bytes .../cyberlimbs/xion/xion_alt1.rsi/head-2.png | Bin 0 -> 6889 bytes .../cyberlimbs/xion/xion_alt1.rsi/meta.json | 19 + .../cyberlimbs/xion/xion_main.rsi/l_arm-1.png | Bin 0 -> 474 bytes .../cyberlimbs/xion/xion_main.rsi/l_arm-2.png | Bin 0 -> 467 bytes .../xion/xion_main.rsi/l_foot-1.png | Bin 0 -> 370 bytes .../xion/xion_main.rsi/l_foot-2.png | Bin 0 -> 370 bytes .../xion/xion_main.rsi/l_hand-1.png | Bin 0 -> 391 bytes .../xion/xion_main.rsi/l_hand-2.png | Bin 0 -> 388 bytes .../cyberlimbs/xion/xion_main.rsi/l_leg-1.png | Bin 0 -> 537 bytes .../cyberlimbs/xion/xion_main.rsi/l_leg-2.png | Bin 0 -> 535 bytes .../cyberlimbs/xion/xion_main.rsi/meta.json | 82 + .../cyberlimbs/xion/xion_main.rsi/r_arm-1.png | Bin 0 -> 466 bytes .../cyberlimbs/xion/xion_main.rsi/r_arm-2.png | Bin 0 -> 460 bytes .../xion/xion_main.rsi/r_foot-1.png | Bin 0 -> 368 bytes .../xion/xion_main.rsi/r_foot-2.png | Bin 0 -> 367 bytes .../xion/xion_main.rsi/r_hand-1.png | Bin 0 -> 388 bytes .../xion/xion_main.rsi/r_hand-2.png | Bin 0 -> 387 bytes .../cyberlimbs/xion/xion_main.rsi/r_leg-1.png | Bin 0 -> 536 bytes .../cyberlimbs/xion/xion_main.rsi/r_leg-2.png | Bin 0 -> 533 bytes .../cyberlimbs/xion/xion_main.rsi/torso-1.png | Bin 0 -> 843 bytes .../cyberlimbs/xion/xion_main.rsi/torso-2.png | Bin 0 -> 841 bytes .../xion/xion_monitor.rsi/head-1.png | Bin 0 -> 6857 bytes .../xion/xion_monitor.rsi/head-2.png | Bin 0 -> 6466 bytes .../xion/xion_monitor.rsi/meta.json | 19 + .../zenghu/zenghu_main.rsi/groin.png | Bin 0 -> 5522 bytes .../zenghu/zenghu_main.rsi/head-1.png | Bin 0 -> 6588 bytes .../zenghu/zenghu_main.rsi/head-2.png | Bin 0 -> 6535 bytes .../zenghu/zenghu_main.rsi/l_arm-1.png | Bin 0 -> 5779 bytes .../zenghu/zenghu_main.rsi/l_arm-2.png | Bin 0 -> 5670 bytes .../zenghu/zenghu_main.rsi/l_foot-1.png | Bin 0 -> 5646 bytes .../zenghu/zenghu_main.rsi/l_foot-2.png | Bin 0 -> 5256 bytes .../zenghu/zenghu_main.rsi/l_hand-1.png | Bin 0 -> 5434 bytes .../zenghu/zenghu_main.rsi/l_hand-2.png | Bin 0 -> 5337 bytes .../zenghu/zenghu_main.rsi/l_leg-1.png | Bin 0 -> 5949 bytes .../zenghu/zenghu_main.rsi/l_leg-2.png | Bin 0 -> 5845 bytes .../zenghu/zenghu_main.rsi/meta.json | 95 ++ .../zenghu/zenghu_main.rsi/r_arm-1.png | Bin 0 -> 5824 bytes .../zenghu/zenghu_main.rsi/r_arm-2.png | Bin 0 -> 5666 bytes .../zenghu/zenghu_main.rsi/r_foot-1.png | Bin 0 -> 5688 bytes .../zenghu/zenghu_main.rsi/r_foot-2.png | Bin 0 -> 5256 bytes .../zenghu/zenghu_main.rsi/r_hand-1.png | Bin 0 -> 5597 bytes .../zenghu/zenghu_main.rsi/r_hand-2.png | Bin 0 -> 5349 bytes .../zenghu/zenghu_main.rsi/r_leg-1.png | Bin 0 -> 5899 bytes .../zenghu/zenghu_main.rsi/r_leg-2.png | Bin 0 -> 5805 bytes .../zenghu/zenghu_main.rsi/torso-1.png | Bin 0 -> 7778 bytes .../zenghu/zenghu_main.rsi/torso-2.png | Bin 0 -> 7157 bytes .../ipc_antenna.rsi/ipc_antenna_antlers.png | Bin 0 -> 323 bytes .../ipc_antenna.rsi/ipc_antenna_crowned.png | Bin 0 -> 324 bytes .../ipc_antenna.rsi/ipc_antenna_cyberhead.png | Bin 0 -> 422 bytes .../ipc_antenna.rsi/ipc_antenna_droneeyes.png | Bin 0 -> 422 bytes .../ipc_antenna.rsi/ipc_antenna_light.png | Bin 0 -> 323 bytes .../ipc_antenna.rsi/ipc_antenna_lightb.png | Bin 0 -> 733 bytes .../ipc_antenna_sidelights.png | Bin 0 -> 420 bytes .../ipc_antenna.rsi/ipc_antenna_tesla.png | Bin 0 -> 1174 bytes .../ipc_antenna.rsi/ipc_antenna_towers.png | Bin 0 -> 353 bytes .../ipc_antenna.rsi/ipc_antenna_tv.png | Bin 0 -> 18025 bytes .../Customization/ipc_antenna.rsi/meta.json | 107 ++ .../ipc_screens.rsi/ipc_screen_blank.png | Bin 0 -> 189 bytes .../ipc_screens.rsi/ipc_screen_blue.png | Bin 0 -> 689 bytes .../ipc_screens.rsi/ipc_screen_breakout.png | Bin 0 -> 572 bytes .../ipc_screens.rsi/ipc_screen_bsod.png | Bin 0 -> 677 bytes .../ipc_screens.rsi/ipc_screen_console.png | Bin 0 -> 307 bytes .../ipc_screens.rsi/ipc_screen_ecgwave.png | Bin 0 -> 1036 bytes .../ipc_screens.rsi/ipc_screen_eight.png | Bin 0 -> 313 bytes .../ipc_screens.rsi/ipc_screen_exclaim.png | Bin 0 -> 231 bytes .../ipc_screens.rsi/ipc_screen_eyes.png | Bin 0 -> 298 bytes .../ipc_screens.rsi/ipc_screen_eyesangry.png | Bin 0 -> 317 bytes .../ipc_screens.rsi/ipc_screen_eyestall.png | Bin 0 -> 303 bytes .../ipc_screens.rsi/ipc_screen_frown.png | Bin 0 -> 208 bytes .../ipc_screens.rsi/ipc_screen_glider.png | Bin 0 -> 345 bytes .../ipc_screens.rsi/ipc_screen_goggles.png | Bin 0 -> 385 bytes .../ipc_screens.rsi/ipc_screen_heart.png | Bin 0 -> 250 bytes .../ipc_screens.rsi/ipc_screen_l.png | Bin 0 -> 190 bytes .../ipc_screens.rsi/ipc_screen_loading.png | Bin 0 -> 440 bytes .../ipc_screens.rsi/ipc_screen_monoeye.png | Bin 0 -> 288 bytes .../ipc_screens.rsi/ipc_screen_nature.png | Bin 0 -> 607 bytes .../ipc_screens.rsi/ipc_screen_orange.png | Bin 0 -> 530 bytes .../ipc_screens.rsi/ipc_screen_pink.png | Bin 0 -> 361 bytes .../ipc_screens.rsi/ipc_screen_question.png | Bin 0 -> 271 bytes .../ipc_screen_rainbowdiag.png | Bin 0 -> 573 bytes .../ipc_screen_rainbowhoriz.png | Bin 0 -> 411 bytes .../ipc_screens.rsi/ipc_screen_redtext.png | Bin 0 -> 520 bytes .../ipc_screens.rsi/ipc_screen_rgb.png | Bin 0 -> 313 bytes .../ipc_screens.rsi/ipc_screen_ring.png | Bin 0 -> 210 bytes .../ipc_screens.rsi/ipc_screen_scroll.png | Bin 0 -> 460 bytes .../ipc_screens.rsi/ipc_screen_shower.png | Bin 0 -> 743 bytes .../ipc_screens.rsi/ipc_screen_sinewave.png | Bin 0 -> 859 bytes .../ipc_screens.rsi/ipc_screen_smile.png | Bin 0 -> 204 bytes .../ipc_screens.rsi/ipc_screen_squarewave.png | Bin 0 -> 677 bytes .../ipc_screens.rsi/ipc_screen_stars.png | Bin 0 -> 786 bytes .../ipc_screens.rsi/ipc_screen_static.png | Bin 0 -> 355 bytes .../ipc_screens.rsi/ipc_screen_tetris.png | Bin 0 -> 1137 bytes .../ipc_screens.rsi/ipc_screen_textdrop.png | Bin 0 -> 962 bytes .../ipc_screens.rsi/ipc_screen_tv.png | Bin 0 -> 458 bytes .../ipc_screens.rsi/ipc_screen_windowsxp.png | Bin 0 -> 688 bytes .../ipc_screens.rsi/ipc_screen_yellow.png | Bin 0 -> 330 bytes .../Customization/ipc_screens.rsi/meta.json | 1363 +++++++++++++++++ .../Mobs/Species/IPC/organs.rsi/ears.png | Bin 0 -> 418 bytes .../Mobs/Species/IPC/organs.rsi/eyeball-l.png | Bin 0 -> 4215 bytes .../Mobs/Species/IPC/organs.rsi/eyeball-r.png | Bin 0 -> 4202 bytes .../Mobs/Species/IPC/organs.rsi/heart-off.png | Bin 0 -> 260 bytes .../Mobs/Species/IPC/organs.rsi/heart-on.png | Bin 0 -> 491 bytes .../Mobs/Species/IPC/organs.rsi/meta.json | 47 + .../Mobs/Species/IPC/organs.rsi/microcell.png | Bin 0 -> 334 bytes .../Mobs/Species/IPC/organs.rsi/tongue.png | Bin 0 -> 516 bytes .../Mobs/Species/IPC/parts.rsi/full.png | Bin 0 -> 2437 bytes .../Mobs/Species/IPC/parts.rsi/head_f.png | Bin 0 -> 885 bytes .../Mobs/Species/IPC/parts.rsi/head_m.png | Bin 0 -> 885 bytes .../Mobs/Species/IPC/parts.rsi/l_arm.png | Bin 0 -> 657 bytes .../Mobs/Species/IPC/parts.rsi/l_foot.png | Bin 0 -> 572 bytes .../Mobs/Species/IPC/parts.rsi/l_hand.png | Bin 0 -> 679 bytes .../Mobs/Species/IPC/parts.rsi/l_leg.png | Bin 0 -> 628 bytes .../Mobs/Species/IPC/parts.rsi/meta.json | 62 + .../Mobs/Species/IPC/parts.rsi/r_arm.png | Bin 0 -> 737 bytes .../Mobs/Species/IPC/parts.rsi/r_foot.png | Bin 0 -> 562 bytes .../Mobs/Species/IPC/parts.rsi/r_hand.png | Bin 0 -> 780 bytes .../Mobs/Species/IPC/parts.rsi/r_leg.png | Bin 0 -> 636 bytes .../Mobs/Species/IPC/parts.rsi/torso_f.png | Bin 0 -> 1306 bytes .../Mobs/Species/IPC/parts.rsi/torso_m.png | Bin 0 -> 1232 bytes 288 files changed, 7568 insertions(+), 41 deletions(-) create mode 100644 Content.Server/Power/Components/BatteryDrinkerComponent.cs create mode 100644 Content.Server/Power/Components/RandomBatteryChargeComponent.cs create mode 100644 Content.Server/Power/Components/SiliconEmitSoundOnDrainedComponent.cs create mode 100644 Content.Server/Power/Systems/BatteryDrinkerSystem.cs create mode 100644 Content.Server/Power/Systems/BatteryElectrocuteChargeSystem.cs create mode 100644 Content.Server/Power/Systems/SiliconEmitSoundOnDrainedSystem.cs create mode 100644 Content.Server/Radio/IntrinsicRadioKeySystem.cs create mode 100644 Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockComponent.cs create mode 100644 Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockSystem.cs create mode 100644 Content.Server/Silicon/BlindHealing/BlindHealingComponent.cs create mode 100644 Content.Server/Silicon/BlindHealing/BlindHealingSystem.cs create mode 100644 Content.Server/Silicon/Charge/Components/BatteryDrinkerSourceComponent.cs create mode 100644 Content.Server/Silicon/Charge/Components/SiliconDownOnDeadComponent.cs create mode 100644 Content.Server/Silicon/Charge/Systems/SiliconChargeDeathSystem.cs create mode 100644 Content.Server/Silicon/Charge/Systems/SiliconChargeSystem.cs create mode 100644 Content.Server/Silicon/DeadStartupButtonSystem/DeadStartupButtonSystem.cs create mode 100644 Content.Server/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedSystem.cs create mode 100644 Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockComponent.cs create mode 100644 Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockSystem.cs create mode 100644 Content.Server/Silicon/IPC/InternalEncryptionKeySpawner.cs create mode 100644 Content.Server/Silicon/Systems/SiliconMiscSystem.cs create mode 100644 Content.Server/Silicon/WeldingHealable/WeldingHealableComponent.cs create mode 100644 Content.Server/Silicon/WeldingHealable/WeldingHealableSystem.cs create mode 100644 Content.Server/Silicon/WeldingHealing/WeldingHealingComponent.cs create mode 100644 Content.Shared/Silicon/BatteryDrinkerEvent.cs create mode 100644 Content.Shared/Silicon/BlindHealing/SharedBlindHealingSystem.cs create mode 100644 Content.Shared/Silicon/Components/SiliconComponent.cs create mode 100644 Content.Shared/Silicon/DeadStartupButton/DeadStartupButtonComponent.cs create mode 100644 Content.Shared/Silicon/DeadStartupButton/SharedDeadStartupButtonSystem.cs create mode 100644 Content.Shared/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedComponent.cs create mode 100644 Content.Shared/Silicon/SIliconRepairable/SharedWeldingHealableSystem.cs create mode 100644 Content.Shared/Silicon/Systems/SharedSiliconSystem.cs create mode 100644 Resources/Audio/Effects/Buzzes/buzz1.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz2.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz3.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz4.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz5.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz6.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz7.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz8.ogg create mode 100644 Resources/Audio/Effects/Buzzes/buzz9.ogg create mode 100644 Resources/Audio/Effects/Silicon/startup.ogg create mode 100644 Resources/Audio/Voice/IPC/cry_robot_1.ogg create mode 100644 Resources/Audio/Voice/IPC/robot-laugh_3.ogg create mode 100644 Resources/Audio/Voice/IPC/robot-scream.ogg create mode 100644 Resources/Locale/en-US/Content/Power/batteries.ftl create mode 100644 Resources/Locale/en-US/Content/Power/batteryDrinker.ftl create mode 100644 Resources/Locale/en-US/Content/Power/silicons.ftl create mode 100644 Resources/Locale/en-US/Content/Silicons/siliconChargers.ftl create mode 100644 Resources/Locale/en-US/Content/Silicons/silicons.ftl create mode 100644 Resources/Locale/en-US/lock/batteryslotrequireslock-component.ftl create mode 100644 Resources/Locale/en-US/power/batteryDrinker.ftl create mode 100644 Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcAntenna.ftl create mode 100644 Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcScreens.ftl rename Resources/Locale/en-US/{simplestation14/Traits => traits}/disabilities.ftl (100%) create mode 100644 Resources/Prototypes/Body/Organs/ipc.yml create mode 100644 Resources/Prototypes/Body/Parts/ipc.yml create mode 100644 Resources/Prototypes/Body/Prototypes/ipc.yml create mode 100644 Resources/Prototypes/Datasets/ipc_names.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/antenna.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/morpheus.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/shellguard.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/wardtakahashi.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/xion.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/zenghu.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/screens.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Player/ipc.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml create mode 100644 Resources/Prototypes/InventoryTemplates/ipc_inventory_template.yml create mode 100644 Resources/Prototypes/SoundCollections/buzzes.yml create mode 100644 Resources/Prototypes/Species/ipc.yml create mode 100644 Resources/ServerInfo/Guidebook/Mobs/IPCs.xml create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-3.png delete mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_alt1.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_alt1.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/torso.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/torso-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/torso-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_alt1.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_alt1.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/torso.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_monitor.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_monitor.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/torso-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/torso-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/groin.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/torso-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/torso-2.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_antlers.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_crowned.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_cyberhead.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_droneeyes.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_light.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_lightb.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_sidelights.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_tesla.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_towers.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_tv.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_antenna.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_blank.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_blue.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_breakout.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_bsod.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_console.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_ecgwave.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eight.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_exclaim.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyes.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyesangry.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyestall.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_frown.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_glider.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_goggles.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_heart.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_l.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_loading.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_monoeye.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_nature.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_orange.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_pink.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_question.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rainbowdiag.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rainbowhoriz.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_redtext.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rgb.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_ring.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_scroll.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_shower.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_sinewave.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_smile.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_squarewave.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_stars.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_static.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_tetris.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_textdrop.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_tv.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_windowsxp.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_yellow.png create mode 100644 Resources/Textures/Mobs/Customization/ipc_screens.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/ears.png create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/eyeball-l.png create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/eyeball-r.png create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/heart-off.png create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/heart-on.png create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/microcell.png create mode 100644 Resources/Textures/Mobs/Species/IPC/organs.rsi/tongue.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/full.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/head_f.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/torso_f.png create mode 100644 Resources/Textures/Mobs/Species/IPC/parts.rsi/torso_m.png diff --git a/Content.Server/Administration/Commands/SetOutfitCommand.cs b/Content.Server/Administration/Commands/SetOutfitCommand.cs index 79e73ce3d97..2f979f4340b 100644 --- a/Content.Server/Administration/Commands/SetOutfitCommand.cs +++ b/Content.Server/Administration/Commands/SetOutfitCommand.cs @@ -12,6 +12,7 @@ using Robust.Shared.Console; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Content.Server.Silicon.IPC; namespace Content.Server.Administration.Commands { @@ -126,7 +127,7 @@ public static bool SetOutfit(EntityUid target, string gear, IEntityManager entit handsSystem.TryPickup(target, inhandEntity, checkActionBlocker: false, handsComp: handsComponent); } } - + InternalEncryptionKeySpawner.TryInsertEncryptionKey(target, startingGear, entityManager, profile); return true; } } diff --git a/Content.Server/Bed/BedSystem.cs b/Content.Server/Bed/BedSystem.cs index 49021c142f4..f1bd9482e5e 100644 --- a/Content.Server/Bed/BedSystem.cs +++ b/Content.Server/Bed/BedSystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Emag.Systems; using Content.Shared.Mobs.Systems; using Robust.Shared.Timing; +using Content.Shared.Silicon.Components; // I shouldn't have to modify this. namespace Content.Server.Bed { @@ -65,7 +66,8 @@ public override void Update(float frameTime) foreach (var healedEntity in strapComponent.BuckledEntities) { - if (_mobStateSystem.IsDead(healedEntity)) + if (_mobStateSystem.IsDead(healedEntity) + || HasComp(healedEntity)) continue; var damage = bedComponent.Damage; diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 11633062829..ba20f4e32f3 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -62,7 +62,9 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem [ValidatePrototypeId] private const string DamageType = "Shock"; - // Multiply and shift the log scale for shock damage. + // Yes, this is absurdly small for a reason. + public const float ElectrifiedDamagePerWatt = 0.0015f; // This information is allowed to be public, and was needed in BatteryElectrocuteChargeSystem.cs + private const float RecursiveDamageMultiplier = 0.75f; private const float RecursiveTimeMultiplier = 0.8f; @@ -297,9 +299,9 @@ public override bool TryDoElectrocution( || !DoCommonElectrocution(uid, sourceUid, shockDamage, time, refresh, siemensCoefficient, statusEffects)) return false; - RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient), true); - return true; - } + RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient, shockDamage), true); + return true; + } private bool TryDoElectrocutionPowered( EntityUid uid, @@ -347,7 +349,7 @@ private bool TryDoElectrocutionPowered( electrocutionComponent.Electrocuting = uid; electrocutionComponent.Source = sourceUid; - RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient), true); + RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient, shockDamage), true); return true; } diff --git a/Content.Server/Mobs/DeathgaspComponent.cs b/Content.Server/Mobs/DeathgaspComponent.cs index cb1f02f0d97..7afcaa1965c 100644 --- a/Content.Server/Mobs/DeathgaspComponent.cs +++ b/Content.Server/Mobs/DeathgaspComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Chat.Prototypes; +using Content.Shared.Chat.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Mobs; @@ -13,6 +13,12 @@ public sealed partial class DeathgaspComponent : Component /// /// The emote prototype to use. /// - [DataField("prototype", customTypeSerializer:typeof(PrototypeIdSerializer))] + [DataField(customTypeSerializer:typeof(PrototypeIdSerializer))] public string Prototype = "DefaultDeathgasp"; + + /// + /// Makes sure that the deathgasp is only displayed if the entity went critical before dying + /// + [DataField] + public bool NeedsCritical = true; } diff --git a/Content.Server/Mobs/DeathgaspSystem.cs b/Content.Server/Mobs/DeathgaspSystem.cs index c531784ea69..32be7bfe32d 100644 --- a/Content.Server/Mobs/DeathgaspSystem.cs +++ b/Content.Server/Mobs/DeathgaspSystem.cs @@ -1,4 +1,4 @@ -using Content.Server.Chat.Systems; +using Content.Server.Chat.Systems; using Content.Server.Speech.Muting; using Content.Shared.Mobs; using Content.Shared.Speech.Muting; @@ -21,7 +21,8 @@ public override void Initialize() private void OnMobStateChanged(EntityUid uid, DeathgaspComponent component, MobStateChangedEvent args) { // don't deathgasp if they arent going straight from crit to dead - if (args.NewMobState != MobState.Dead || args.OldMobState != MobState.Critical) + if (component.NeedsCritical && args.OldMobState != MobState.Critical + || args.NewMobState != MobState.Dead) return; Deathgasp(uid, component); diff --git a/Content.Server/Power/Components/BatteryDrinkerComponent.cs b/Content.Server/Power/Components/BatteryDrinkerComponent.cs new file mode 100644 index 00000000000..1a72807af68 --- /dev/null +++ b/Content.Server/Power/Components/BatteryDrinkerComponent.cs @@ -0,0 +1,31 @@ +namespace Content.Server.Power; + +[RegisterComponent] +public sealed partial class BatteryDrinkerComponent : Component +{ + /// + /// Is this drinker allowed to drink batteries not tagged as ? + /// + [DataField] + public bool DrinkAll; + + /// + /// How long it takes to drink from a battery, in seconds. + /// Is multiplied by the source. + /// + [DataField] + public float DrinkSpeed = 1.5f; + + /// + /// The multiplier for the amount of power to attempt to drink. + /// Default amount is 1000 + /// + [DataField] + public float DrinkMultiplier = 5f; + + /// + /// The multiplier for how long it takes to drink a non-source battery, if is true. + /// + [DataField] + public float DrinkAllMultiplier = 2.5f; +} diff --git a/Content.Server/Power/Components/RandomBatteryChargeComponent.cs b/Content.Server/Power/Components/RandomBatteryChargeComponent.cs new file mode 100644 index 00000000000..c27d74f10c5 --- /dev/null +++ b/Content.Server/Power/Components/RandomBatteryChargeComponent.cs @@ -0,0 +1,26 @@ +using System.Numerics; + +namespace Content.Server.Power.Components; + +[RegisterComponent] +public sealed partial class RandomBatteryChargeComponent : Component +{ + /// + /// The minimum and maximum max charge the battery can have. + /// + [DataField] + public Vector2 BatteryMaxMinMax = new(0.85f, 1.15f); + + /// + /// The minimum and maximum current charge the battery can have. + /// + [DataField] + public Vector2 BatteryChargeMinMax = new(1f, 1f); + + /// + /// False if the randomized charge of the battery should be a multiple of the preexisting current charge of the battery. + /// True if the randomized charge of the battery should be a multiple of the max charge of the battery post max charge randomization. + /// + [DataField] + public bool BasedOnMaxCharge = true; +} diff --git a/Content.Server/Power/Components/SiliconEmitSoundOnDrainedComponent.cs b/Content.Server/Power/Components/SiliconEmitSoundOnDrainedComponent.cs new file mode 100644 index 00000000000..4e5121d6076 --- /dev/null +++ b/Content.Server/Power/Components/SiliconEmitSoundOnDrainedComponent.cs @@ -0,0 +1,27 @@ +using System.ComponentModel.DataAnnotations; +using Robust.Shared.Audio; +using Content.Server.Sound.Components; + +namespace Content.Server.Silicon; + +/// +/// Applies a to a Silicon when its battery is drained, and removes it when it's not. +/// +[RegisterComponent] +public sealed partial class SiliconEmitSoundOnDrainedComponent : Component +{ + [DataField] + public SoundSpecifier Sound = default!; + + [DataField] + public TimeSpan MinInterval = TimeSpan.FromSeconds(8); + + [DataField] + public TimeSpan MaxInterval = TimeSpan.FromSeconds(15); + + [DataField] + public float PlayChance = 1f; + + [DataField] + public string? PopUp; +} diff --git a/Content.Server/Power/Systems/BatteryDrinkerSystem.cs b/Content.Server/Power/Systems/BatteryDrinkerSystem.cs new file mode 100644 index 00000000000..9a06d4181c9 --- /dev/null +++ b/Content.Server/Power/Systems/BatteryDrinkerSystem.cs @@ -0,0 +1,144 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Power.Components; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.DoAfter; +using Content.Shared.PowerCell.Components; +using Content.Shared.Silicon; +using Content.Shared.Verbs; +using Robust.Shared.Utility; +using Content.Server.Silicon.Charge; +using Content.Server.Power.EntitySystems; +using Content.Server.Popups; +using Content.Server.PowerCell; +using Content.Shared.Popups; +using Content.Shared.Silicon.Components; +using FastAccessors; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; + +namespace Content.Server.Power; + +public sealed class BatteryDrinkerSystem : EntitySystem +{ + [Dependency] private readonly ItemSlotsSystem _slots = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly BatterySystem _battery = default!; + [Dependency] private readonly SiliconChargeSystem _silicon = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(AddAltVerb); + + SubscribeLocalEvent(OnDoAfter); + } + + private void AddAltVerb(EntityUid uid, BatteryComponent batteryComponent, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (!TryComp(args.User, out var drinkerComp) || + !TestDrinkableBattery(uid, drinkerComp) || + !_silicon.TryGetSiliconBattery(args.User, out var drinkerBattery)) + return; + + AlternativeVerb verb = new() + { + Act = () => DrinkBattery(uid, args.User, drinkerComp), + Text = Loc.GetString("battery-drinker-verb-drink"), + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")), + }; + + args.Verbs.Add(verb); + } + + private bool TestDrinkableBattery(EntityUid target, BatteryDrinkerComponent drinkerComp) + { + if (!drinkerComp.DrinkAll && !HasComp(target)) + return false; + + return true; + } + + private void DrinkBattery(EntityUid target, EntityUid user, BatteryDrinkerComponent drinkerComp) + { + var doAfterTime = drinkerComp.DrinkSpeed; + + if (TryComp(target, out var sourceComp)) + doAfterTime *= sourceComp.DrinkSpeedMulti; + else + doAfterTime *= drinkerComp.DrinkAllMultiplier; + + var args = new DoAfterArgs(EntityManager, user, doAfterTime, new BatteryDrinkerDoAfterEvent(), user, target) // TODO: Make this doafter loop, once we merge Upstream. + { + BreakOnDamage = true, + BreakOnTargetMove = true, + Broadcast = false, + DistanceThreshold = 1.35f, + RequireCanInteract = true, + CancelDuplicate = false + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnDoAfter(EntityUid uid, BatteryDrinkerComponent drinkerComp, DoAfterEvent args) + { + if (args.Cancelled || args.Target == null) + return; + + var source = args.Target.Value; + var drinker = uid; + var sourceBattery = Comp(source); + + _silicon.TryGetSiliconBattery(drinker, out var drinkerBatteryComponent); + + if (!TryComp(uid, out PowerCellSlotComponent? batterySlot)) + return; + + var container = _container.GetContainer(uid, batterySlot.CellSlotId); + var drinkerBattery = container.ContainedEntities.First(); + + TryComp(source, out var sourceComp); + + DebugTools.AssertNotNull(drinkerBattery); + + if (drinkerBattery == null) + return; + + var amountToDrink = drinkerComp.DrinkMultiplier * 1000; + + amountToDrink = MathF.Min(amountToDrink, sourceBattery.CurrentCharge); + amountToDrink = MathF.Min(amountToDrink, drinkerBatteryComponent!.MaxCharge - drinkerBatteryComponent.CurrentCharge); + + if (sourceComp != null && sourceComp.MaxAmount > 0) + amountToDrink = MathF.Min(amountToDrink, (float) sourceComp.MaxAmount); + + if (amountToDrink <= 0) + { + _popup.PopupEntity(Loc.GetString("battery-drinker-empty", ("target", source)), drinker, drinker); + return; + } + + if (_battery.TryUseCharge(source, amountToDrink)) + _battery.SetCharge(drinkerBattery, drinkerBatteryComponent.CurrentCharge + amountToDrink, drinkerBatteryComponent); + else + { + _battery.SetCharge(drinkerBattery, sourceBattery.CurrentCharge + drinkerBatteryComponent.CurrentCharge, drinkerBatteryComponent); + _battery.SetCharge(source, 0); + } + + if (sourceComp != null && sourceComp.DrinkSound != null){ + _popup.PopupEntity(Loc.GetString("ipc-recharge-tip"), drinker, drinker, PopupType.SmallCaution); + _audio.PlayPvs(sourceComp.DrinkSound, source); + Spawn("EffectSparks", Transform(source).Coordinates); + } + } +} diff --git a/Content.Server/Power/Systems/BatteryElectrocuteChargeSystem.cs b/Content.Server/Power/Systems/BatteryElectrocuteChargeSystem.cs new file mode 100644 index 00000000000..9993c151b1e --- /dev/null +++ b/Content.Server/Power/Systems/BatteryElectrocuteChargeSystem.cs @@ -0,0 +1,38 @@ +using Content.Server.Electrocution; +using Content.Server.Popups; +using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; +using Content.Shared.Electrocution; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Power.Systems; + +public sealed class BatteryElectrocuteChargeSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly BatterySystem _battery = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnElectrocuted); + } + + private void OnElectrocuted(EntityUid uid, BatteryComponent battery, ElectrocutedEvent args) + { + if (args.ShockDamage == null || args.ShockDamage <= 0) + return; + + var damagePerWatt = ElectrocutionSystem.ElectrifiedDamagePerWatt * 2; + + var damage = args.ShockDamage.Value * args.SiemensCoefficient; + var charge = Math.Min(damage / damagePerWatt, battery.MaxCharge * 0.25f) * _random.NextFloat(0.75f, 1.25f); + + _battery.SetCharge(uid, battery.CurrentCharge + charge); + + _popup.PopupEntity(Loc.GetString("battery-electrocute-charge"), uid, uid); + } +} diff --git a/Content.Server/Power/Systems/SiliconEmitSoundOnDrainedSystem.cs b/Content.Server/Power/Systems/SiliconEmitSoundOnDrainedSystem.cs new file mode 100644 index 00000000000..28a46cc7f70 --- /dev/null +++ b/Content.Server/Power/Systems/SiliconEmitSoundOnDrainedSystem.cs @@ -0,0 +1,41 @@ +using Content.Server.Silicon.Death; +using Content.Shared.Sound.Components; +using Content.Server.Sound; +using Content.Shared.Mobs; +using Content.Shared.Silicon.Systems; + +namespace Content.Server.Silicon; + +public sealed class EmitSoundOnCritSystem : EntitySystem +{ + [Dependency] private readonly EmitSoundSystem _emitSound = default!; + public override void Initialize() + { + SubscribeLocalEvent(OnDeath); + SubscribeLocalEvent(OnAlive); + SubscribeLocalEvent(OnStateChange); + } + + private void OnDeath(EntityUid uid, SiliconEmitSoundOnDrainedComponent component, SiliconChargeDeathEvent args) + { + var spamComp = EnsureComp(uid); + + spamComp.MinInterval = component.MinInterval; + spamComp.MaxInterval = component.MaxInterval; + spamComp.PopUp = component.PopUp; + spamComp.Sound = component.Sound; + _emitSound.SetEnabled((uid, spamComp), true); + } + + private void OnAlive(EntityUid uid, SiliconEmitSoundOnDrainedComponent component, SiliconChargeAliveEvent args) + { + RemComp(uid); // This component is bad and I don't feel like making a janky work around because of it. + // If you give something the SiliconEmitSoundOnDrainedComponent, know that it can't have the SpamEmitSoundComponent, and any other systems that play with it will just be broken. + } + + public void OnStateChange(EntityUid uid, SiliconEmitSoundOnDrainedComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + RemComp(uid); + } +} diff --git a/Content.Server/Radio/IntrinsicRadioKeySystem.cs b/Content.Server/Radio/IntrinsicRadioKeySystem.cs new file mode 100644 index 00000000000..eeea64c2f70 --- /dev/null +++ b/Content.Server/Radio/IntrinsicRadioKeySystem.cs @@ -0,0 +1,32 @@ +using Content.Server.Radio.Components; +using Content.Shared.Radio; +using Content.Shared.Radio.Components; + +namespace Content.Server.Radio; + +public sealed class IntrinsicRadioKeySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTransmitterChannelsChanged); + SubscribeLocalEvent(OnReceiverChannelsChanged); + } + + private void OnTransmitterChannelsChanged(EntityUid uid, IntrinsicRadioTransmitterComponent component, EncryptionChannelsChangedEvent args) + { + UpdateChannels(uid, args.Component, ref component.Channels); + } + + private void OnReceiverChannelsChanged(EntityUid uid, ActiveRadioComponent component, EncryptionChannelsChangedEvent args) + { + UpdateChannels(uid, args.Component, ref component.Channels); + } + + private void UpdateChannels(EntityUid _, EncryptionKeyHolderComponent keyHolderComp, ref HashSet channels) + { + channels.Clear(); + channels.UnionWith(keyHolderComp.Channels); + } +} diff --git a/Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockComponent.cs b/Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockComponent.cs new file mode 100644 index 00000000000..693ed1b4832 --- /dev/null +++ b/Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.Silicon.BatteryLocking; + +[RegisterComponent] +public sealed partial class BatterySlotRequiresLockComponent : Component +{ + [DataField] + public string ItemSlot = string.Empty; +} diff --git a/Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockSystem.cs b/Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockSystem.cs new file mode 100644 index 00000000000..98e1cb5584c --- /dev/null +++ b/Content.Server/Silicon/BatteryLocking/BatterySlotRequiresLockSystem.cs @@ -0,0 +1,42 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Lock; +using Content.Shared.Popups; +using Content.Shared.Silicon.Components; +using Content.Shared.IdentityManagement; + +namespace Content.Server.Silicon.BatteryLocking; + +public sealed class BatterySlotRequiresLockSystem : EntitySystem + +{ + [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + + /// + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(LockToggled); + SubscribeLocalEvent(LockToggleAttempted); + + } + private void LockToggled(EntityUid uid, BatterySlotRequiresLockComponent component, LockToggledEvent args) + { + if (!TryComp(uid, out var lockComp) + || !TryComp(uid, out var itemslots) + || !_itemSlotsSystem.TryGetSlot(uid, component.ItemSlot, out var slot, itemslots)) + return; + + _itemSlotsSystem.SetLock(uid, slot, lockComp.Locked, itemslots); + } + + private void LockToggleAttempted(EntityUid uid, BatterySlotRequiresLockComponent component, LockToggleAttemptEvent args) + { + if (args.User == uid + || !TryComp(uid, out var siliconComp)) + return; + + _popupSystem.PopupEntity(Loc.GetString("batteryslotrequireslock-component-alert-owner", ("user", Identity.Entity(args.User, EntityManager))), uid, uid, PopupType.Large); + } + +} diff --git a/Content.Server/Silicon/BlindHealing/BlindHealingComponent.cs b/Content.Server/Silicon/BlindHealing/BlindHealingComponent.cs new file mode 100644 index 00000000000..4c3c478c4b8 --- /dev/null +++ b/Content.Server/Silicon/BlindHealing/BlindHealingComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared.Damage; +using Content.Shared.Tools; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Silicon.BlindHealing +{ + [RegisterComponent] + public sealed partial class BlindHealingComponent : Component + { + [DataField] + public int DoAfterDelay = 3; + + /// + /// A multiplier that will be applied to the above if an entity is repairing themselves. + /// + [DataField] + public float SelfHealPenalty = 3f; + + /// + /// Whether or not an entity is allowed to repair itself. + /// + [DataField] + public bool AllowSelfHeal = true; + + [DataField(required: true)] + public List DamageContainers; + } +} diff --git a/Content.Server/Silicon/BlindHealing/BlindHealingSystem.cs b/Content.Server/Silicon/BlindHealing/BlindHealingSystem.cs new file mode 100644 index 00000000000..6cf60e6ef3f --- /dev/null +++ b/Content.Server/Silicon/BlindHealing/BlindHealingSystem.cs @@ -0,0 +1,121 @@ +using Content.Server.Administration.Logs; +using Content.Server.Cargo.Components; +using Content.Server.Stack; +using Content.Shared.Silicon.BlindHealing; +using Content.Shared.Damage; +using Content.Shared.Database; +using Content.Shared.DoAfter; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Popups; +using Content.Shared.Stacks; + +namespace Content.Server.Silicon.BlindHealing +{ + public sealed class BlindHealingSystem : SharedBlindHealingSystem + { + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IAdminLogManager _adminLogger= default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [Dependency] private readonly StackSystem _stackSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnUse); + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnHealingFinished); + } + + private void OnHealingFinished(EntityUid uid, BlindHealingComponent component, HealingDoAfterEvent args) + { + Log.Info("event started!"); + + if (args.Cancelled || args.Target == null) + return; + + EntityUid target = (EntityUid) args.Target; + + if(!EntityManager.TryGetComponent(target, out BlindableComponent? blindcomp) + || blindcomp is { EyeDamage: 0 }) + return; + + if(EntityManager.TryGetComponent(uid, out StackComponent? stackComponent)) + { + double price = 1; + if (EntityManager.TryGetComponent(uid, out StackPriceComponent? stackPrice)) + price = stackPrice.Price; + _stackSystem.SetCount(uid, (int) (_stackSystem.GetCount(uid, stackComponent) - price), stackComponent); + + } + + _blindableSystem.AdjustEyeDamage((target, blindcomp), -blindcomp!.EyeDamage); + + _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target}'s vision"); + + var str = Loc.GetString("comp-repairable-repair", + ("target", uid), + ("tool", args.Used!)); + _popup.PopupEntity(str, uid, args.User); + + } + + private bool TryHealBlindness(EntityUid uid, EntityUid user, EntityUid target, float delay) + { + var doAfterEventArgs = + new DoAfterArgs(EntityManager, user, delay, new HealingDoAfterEvent(), uid, target: target, used: uid) + { + NeedHand = true, + BreakOnUserMove = true, + BreakOnWeightlessMove = false, + }; + + _doAfter.TryStartDoAfter(doAfterEventArgs); + return true; + } + + private void OnInteract(EntityUid uid, BlindHealingComponent component, ref AfterInteractEvent args) + { + + if (args.Handled + || !TryComp(args.User, out DamageableComponent? damageable) + || damageable.DamageContainerID != null + && !component.DamageContainers.Contains(damageable.DamageContainerID) + || !TryComp(args.User, out BlindableComponent? blindcomp) + || blindcomp is { EyeDamage: 0 }) + return; + + float delay = component.DoAfterDelay; + + if (args.User == args.Target) + { + if (!component.AllowSelfHeal) + return; + delay *= component.SelfHealPenalty; + } + + TryHealBlindness(uid, args.User, args.User, delay); + } + + private void OnUse(EntityUid uid, BlindHealingComponent component, ref UseInHandEvent args) + { + if (args.Handled + || !TryComp(args.User, out DamageableComponent? damageable) + || damageable.DamageContainerID != null + && !component.DamageContainers.Contains(damageable.DamageContainerID) + || !TryComp(args.User, out BlindableComponent? blindcomp) + || blindcomp is { EyeDamage: 0 } + || !component.AllowSelfHeal) + return; + + float delay = component.DoAfterDelay; + delay *= component.SelfHealPenalty; + + TryHealBlindness(uid, args.User, args.User, delay); + + } + } +} diff --git a/Content.Server/Silicon/Charge/Components/BatteryDrinkerSourceComponent.cs b/Content.Server/Silicon/Charge/Components/BatteryDrinkerSourceComponent.cs new file mode 100644 index 00000000000..2a1bfeb87e4 --- /dev/null +++ b/Content.Server/Silicon/Charge/Components/BatteryDrinkerSourceComponent.cs @@ -0,0 +1,26 @@ +using Robust.Shared.Audio; + +namespace Content.Server.Silicon.Charge; + +[RegisterComponent] +public sealed partial class BatteryDrinkerSourceComponent : Component +{ + /// + /// The max amount of power this source can provide in one sip. + /// No limit if null. + /// + [DataField] + public int? MaxAmount = null; + + /// + /// The multiplier for the drink speed. + /// + [DataField] + public float DrinkSpeedMulti = 1f; + + /// + /// The sound to play when the battery gets drunk from. + /// + [DataField] + public SoundSpecifier? DrinkSound = new SoundCollectionSpecifier("sparks"); +} diff --git a/Content.Server/Silicon/Charge/Components/SiliconDownOnDeadComponent.cs b/Content.Server/Silicon/Charge/Components/SiliconDownOnDeadComponent.cs new file mode 100644 index 00000000000..3080144cd4a --- /dev/null +++ b/Content.Server/Silicon/Charge/Components/SiliconDownOnDeadComponent.cs @@ -0,0 +1,19 @@ +using System.Threading; + +namespace Content.Server.Silicon.Death; + +/// +/// Marks a Silicon as becoming incapacitated when they run out of battery charge. +/// +/// +/// Uses the Silicon System's charge states to do so, so make sure they're a battery powered Silicon. +/// +[RegisterComponent] +public sealed partial class SiliconDownOnDeadComponent : Component +{ + /// + /// Is this Silicon currently dead? + /// + [ViewVariables(VVAccess.ReadOnly)] + public bool Dead { get; set; } = false; +} diff --git a/Content.Server/Silicon/Charge/Systems/SiliconChargeDeathSystem.cs b/Content.Server/Silicon/Charge/Systems/SiliconChargeDeathSystem.cs new file mode 100644 index 00000000000..d6fa07a1a14 --- /dev/null +++ b/Content.Server/Silicon/Charge/Systems/SiliconChargeDeathSystem.cs @@ -0,0 +1,132 @@ +using Content.Server.Power.Components; +using Content.Shared.Silicon.Systems; +using Content.Server.Bed.Sleep; +using Content.Shared.Bed.Sleep; +using Content.Server.Sound.Components; +using Content.Server.Silicon.Charge; +using System.Threading; +using Content.Server.Humanoid; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Robust.Shared.Utility; +using Timer = Robust.Shared.Timing.Timer; + +namespace Content.Server.Silicon.Death; + +public sealed class SiliconDeathSystem : EntitySystem +{ + [Dependency] private readonly SleepingSystem _sleep = default!; + [Dependency] private readonly SiliconChargeSystem _silicon = default!; + [Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearanceSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSiliconChargeStateUpdate); + } + + private void OnSiliconChargeStateUpdate(EntityUid uid, SiliconDownOnDeadComponent siliconDeadComp, SiliconChargeStateUpdateEvent args) + { + if (!_silicon.TryGetSiliconBattery(uid, out var batteryComp)) + { + SiliconDead(uid, siliconDeadComp, batteryComp, uid); + return; + } + + if (args.ChargePercent == 0 && siliconDeadComp.Dead) + return; + + if (args.ChargePercent == 0 && !siliconDeadComp.Dead) + SiliconDead(uid, siliconDeadComp, batteryComp, uid); + else if (args.ChargePercent != 0 && siliconDeadComp.Dead) + SiliconUnDead(uid, siliconDeadComp, batteryComp, uid); + } + + private void SiliconDead(EntityUid uid, SiliconDownOnDeadComponent siliconDeadComp, BatteryComponent? batteryComp, EntityUid batteryUid) + { + var deadEvent = new SiliconChargeDyingEvent(uid, batteryComp, batteryUid); + RaiseLocalEvent(uid, deadEvent); + + if (deadEvent.Cancelled) + return; + + EntityManager.EnsureComponent(uid); + EntityManager.EnsureComponent(uid); + + if (TryComp(uid, out HumanoidAppearanceComponent? humanoidAppearanceComponent)) + { + var layers = HumanoidVisualLayersExtension.Sublayers(HumanoidVisualLayers.HeadSide); + _humanoidAppearanceSystem.SetLayersVisibility(uid, layers, false, true, humanoidAppearanceComponent); + } + + siliconDeadComp.Dead = true; + + RaiseLocalEvent(uid, new SiliconChargeDeathEvent(uid, batteryComp, batteryUid)); + } + + private void SiliconUnDead(EntityUid uid, SiliconDownOnDeadComponent siliconDeadComp, BatteryComponent? batteryComp, EntityUid batteryUid) + { + RemComp(uid); + _sleep.TryWaking(uid, null, true); + + siliconDeadComp.Dead = false; + + RaiseLocalEvent(uid, new SiliconChargeAliveEvent(uid, batteryComp, batteryUid)); + } +} + +/// +/// A cancellable event raised when a Silicon is about to go down due to charge. +/// +/// +/// This probably shouldn't be modified unless you intend to fill the Silicon's battery, +/// as otherwise it'll just be triggered again next frame. +/// +public sealed class SiliconChargeDyingEvent : CancellableEntityEventArgs +{ + public EntityUid SiliconUid { get; } + public BatteryComponent? BatteryComp { get; } + public EntityUid BatteryUid { get; } + + public SiliconChargeDyingEvent(EntityUid siliconUid, BatteryComponent? batteryComp, EntityUid batteryUid) + { + SiliconUid = siliconUid; + BatteryComp = batteryComp; + BatteryUid = batteryUid; + } +} + +/// +/// An event raised after a Silicon has gone down due to charge. +/// +public sealed class SiliconChargeDeathEvent : EntityEventArgs +{ + public EntityUid SiliconUid { get; } + public BatteryComponent? BatteryComp { get; } + public EntityUid BatteryUid { get; } + + public SiliconChargeDeathEvent(EntityUid siliconUid, BatteryComponent? batteryComp, EntityUid batteryUid) + { + SiliconUid = siliconUid; + BatteryComp = batteryComp; + BatteryUid = batteryUid; + } +} + +/// +/// An event raised after a Silicon has reawoken due to an increase in charge. +/// +public sealed class SiliconChargeAliveEvent : EntityEventArgs +{ + public EntityUid SiliconUid { get; } + public BatteryComponent? BatteryComp { get; } + public EntityUid BatteryUid { get; } + + public SiliconChargeAliveEvent(EntityUid siliconUid, BatteryComponent? batteryComp, EntityUid batteryUid) + { + SiliconUid = siliconUid; + BatteryComp = batteryComp; + BatteryUid = batteryUid; + } +} diff --git a/Content.Server/Silicon/Charge/Systems/SiliconChargeSystem.cs b/Content.Server/Silicon/Charge/Systems/SiliconChargeSystem.cs new file mode 100644 index 00000000000..de50c828bd7 --- /dev/null +++ b/Content.Server/Silicon/Charge/Systems/SiliconChargeSystem.cs @@ -0,0 +1,216 @@ +using Robust.Shared.Random; +using Content.Shared.Silicon.Components; +using Content.Server.Power.Components; +using Content.Shared.Mobs.Systems; +using Content.Server.Temperature.Components; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Popups; +using Content.Shared.Popups; +using Content.Shared.Silicon.Systems; +using Content.Shared.Movement.Systems; +using Content.Server.Body.Components; +using Content.Server.Power.EntitySystems; +using Robust.Shared.Containers; +using Content.Shared.Mind.Components; +using System.Diagnostics.CodeAnalysis; +using Content.Server.PowerCell; +using Robust.Shared.Timing; +using Robust.Shared.Configuration; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Utility; +using Content.Shared.CCVar; +using Content.Shared.PowerCell.Components; +using Content.Shared.Mind; +using Content.Shared.Alert; +using Content.Server.Silicon.Death; + +namespace Content.Server.Silicon.Charge; + +public sealed class SiliconChargeSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly FlammableSystem _flammable = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly MovementSpeedModifierSystem _moveMod = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly AlertsSystem _alerts = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSiliconStartup); + } + + public bool TryGetSiliconBattery(EntityUid silicon, [NotNullWhen(true)] out BatteryComponent? batteryComp) + { + batteryComp = null; + if (!TryComp(silicon, out SiliconComponent? siliconComp)) + return false; + + + // try get a battery directly on the inserted entity + if (TryComp(silicon, out batteryComp) + || _powerCell.TryGetBatteryFromSlot(silicon, out batteryComp)) + return true; + + + //DebugTools.Assert("SiliconComponent does not contain Battery"); + return false; + } + + private void OnSiliconStartup(EntityUid uid, SiliconComponent component, ComponentStartup args) + { + if (!TryComp(uid, out PowerCellSlotComponent? batterySlot)) + return; + + var container = _container.GetContainer(uid, batterySlot.CellSlotId); + + if (component.EntityType.GetType() != typeof(SiliconType)) + DebugTools.Assert("SiliconComponent.EntityType is not a SiliconType enum."); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + // For each siliconComp entity with a battery component, drain their charge. + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var silicon, out var siliconComp)) + { + if (!siliconComp.BatteryPowered) + continue; + + // Check if the Silicon is an NPC, and if so, follow the delay as specified in the CVAR. + if (siliconComp.EntityType.Equals(SiliconType.Npc)) + { + var updateTime = _config.GetCVar(CCVars.SiliconNpcUpdateTime); + if (_timing.CurTime - siliconComp.LastDrainTime < TimeSpan.FromSeconds(updateTime)) + continue; + + siliconComp.LastDrainTime = _timing.CurTime; + } + + // If you can't find a battery, set the indicator and skip it. + if (!TryGetSiliconBattery(silicon, out var batteryComp)) + { + UpdateChargeState(silicon, 0, siliconComp); + if (_alerts.IsShowingAlert(silicon, AlertType.BorgBattery)) + { + _alerts.ClearAlert(silicon, AlertType.BorgBattery); + _alerts.ShowAlert(silicon, AlertType.BorgBatteryNone); + } + continue; + } + + // If the silicon is dead, skip it. + if (_mobState.IsDead(silicon)) + continue; + + // If the silicon ghosted or is SSD while still being powered, skip it. - DeltaV + if (EntityManager.TryGetComponent(silicon, out var mindContComp) + && EntityManager.TryGetComponent(silicon, out var siliconDeathComp)) + { + if ((mindContComp.HasMind == false || CompOrNull(mindContComp.Mind)?.Session == null) && !siliconDeathComp.Dead) + { + continue; + } + } + + var drainRate = siliconComp.DrainPerSecond; + + // All multipliers will be subtracted by 1, and then added together, and then multiplied by the drain rate. This is then added to the base drain rate. + // This is to stop exponential increases, while still allowing for less-than-one multipliers. + var drainRateFinalAddi = 0f; + + // TODO: Devise a method of adding multis where other systems can alter the drain rate. + // Maybe use something similar to refreshmovespeedmodifiers, where it's stored in the component. + // Maybe it doesn't matter, and stuff should just use static drain? + if (!siliconComp.EntityType.Equals(SiliconType.Npc)) // Don't bother checking heat if it's an NPC. It's a waste of time, and it'd be delayed due to the update time. + drainRateFinalAddi += SiliconHeatEffects(silicon, frameTime) - 1; // This will need to be changed at some point if we allow external batteries, since the heat of the Silicon might not be applicable. + + // Ensures that the drain rate is at least 10% of normal, + // and would allow at least 4 minutes of life with a max charge, to prevent cheese. + drainRate += Math.Clamp(drainRateFinalAddi, drainRate * -0.9f, batteryComp.MaxCharge / 240); + + // Drain the battery. + _powerCell.TryUseCharge(silicon, frameTime * drainRate); + + // Figure out the current state of the Silicon. + var chargePercent = (short) MathF.Round(batteryComp.CurrentCharge / batteryComp.MaxCharge * 10f); + + UpdateChargeState(silicon, chargePercent, siliconComp); + } + } + + /// + /// Checks if anything needs to be updated, and updates it. + /// + public void UpdateChargeState(EntityUid uid, short chargePercent, SiliconComponent component) + { + component.ChargeState = chargePercent; + + RaiseLocalEvent(uid, new SiliconChargeStateUpdateEvent(chargePercent)); + + _moveMod.RefreshMovementSpeedModifiers(uid); + + // If the battery was replaced and the no battery indicator is showing, replace the indicator + if (_alerts.IsShowingAlert(uid, AlertType.BorgBatteryNone) && chargePercent != 0) + { + _alerts.ClearAlert(uid, AlertType.BorgBatteryNone); + _alerts.ShowAlert(uid, AlertType.BorgBattery, chargePercent); + } + } + + private float SiliconHeatEffects(EntityUid silicon, float frameTime) + { + if (!EntityManager.TryGetComponent(silicon, out var temperComp) + || !EntityManager.TryGetComponent(silicon, out var thermalComp)) + return 0; + + var siliconComp = EntityManager.GetComponent(silicon); + + // If the Silicon is hot, drain the battery faster, if it's cold, drain it slower, capped. + var upperThresh = thermalComp.NormalBodyTemperature + thermalComp.ThermalRegulationTemperatureThreshold; + var upperThreshHalf = thermalComp.NormalBodyTemperature + thermalComp.ThermalRegulationTemperatureThreshold * 0.5f; + + // Check if the silicon is in a hot environment. + if (temperComp.CurrentTemperature > upperThreshHalf) + { + // Divide the current temp by the max comfortable temp capped to 4, then add that to the multiplier. + var hotTempMulti = Math.Min(temperComp.CurrentTemperature / upperThreshHalf, 4); + + // If the silicon is hot enough, it has a chance to catch fire. + + siliconComp.OverheatAccumulator += frameTime; + if (!(siliconComp.OverheatAccumulator >= 5)) + return hotTempMulti; + + siliconComp.OverheatAccumulator -= 5; + + if (!EntityManager.TryGetComponent(silicon, out var flamComp) + || flamComp is { OnFire: true } + || !(temperComp.CurrentTemperature > temperComp.HeatDamageThreshold)) + return hotTempMulti; + + _popup.PopupEntity(Loc.GetString("silicon-overheating"), silicon, silicon, PopupType.MediumCaution); + if (_random.Prob(Math.Clamp(temperComp.CurrentTemperature / (upperThresh * 5), 0.001f, 0.9f))) + { + //MaximumFireStacks and MinimumFireStacks doesn't exists on EE + _flammable.AdjustFireStacks(silicon, Math.Clamp(siliconComp.FireStackMultiplier, -10, 10), flamComp); + _flammable.Ignite(silicon, silicon, flamComp); + } + return hotTempMulti; + } + + // Check if the silicon is in a cold environment. + if (temperComp.CurrentTemperature < thermalComp.NormalBodyTemperature) + return 0.5f + temperComp.CurrentTemperature / thermalComp.NormalBodyTemperature * 0.5f; + + return 0; + } +} diff --git a/Content.Server/Silicon/DeadStartupButtonSystem/DeadStartupButtonSystem.cs b/Content.Server/Silicon/DeadStartupButtonSystem/DeadStartupButtonSystem.cs new file mode 100644 index 00000000000..a25f2a22545 --- /dev/null +++ b/Content.Server/Silicon/DeadStartupButtonSystem/DeadStartupButtonSystem.cs @@ -0,0 +1,84 @@ +using Content.Server.Chat.Systems; +using Content.Server.Lightning; +using Content.Server.Popups; +using Content.Server.PowerCell; +using Content.Server.Silicon.Charge; +using Content.Shared.Silicon.DeadStartupButton; +using Content.Shared.Audio; +using Content.Shared.Damage; +using Content.Shared.Electrocution; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Random; + +namespace Content.Server.Silicon.DeadStartupButtonSystem; + +public sealed class DeadStartupButtonSystem : SharedDeadStartupButtonSystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly LightningSystem _lightning = default!; + [Dependency] private readonly SiliconChargeSystem _siliconChargeSystem = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly ChatSystem _chatSystem = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent(OnElectrocuted); + SubscribeLocalEvent(OnMobStateChanged); + + } + + private void OnDoAfter(EntityUid uid, DeadStartupButtonComponent comp, OnDoAfterButtonPressedEvent args) + { + if (args.Handled || args.Cancelled + || !TryComp(uid, out MobStateComponent? mobStateComponent) + || !_mobState.IsDead(uid, mobStateComponent) + || !TryComp(uid, out MobThresholdsComponent? mobThresholdsComponent) + || !TryComp(uid, out DamageableComponent? damageable)) + return; + + var criticalThreshold = _mobThreshold.GetThresholdForState(uid, MobState.Critical, mobThresholdsComponent); + + if (damageable.TotalDamage < criticalThreshold) + _mobState.ChangeMobState(uid, MobState.Alive, mobStateComponent); + else + { + _audio.PlayPvs(comp.BuzzSound, uid, AudioHelpers.WithVariation(0.05f, _robustRandom)); + _popup.PopupEntity(Loc.GetString("dead-startup-system-reboot-failed", ("target", MetaData(uid).EntityName)), uid); + Spawn("EffectSparks", Transform(uid).Coordinates); + } + } + + private void OnElectrocuted(EntityUid uid, DeadStartupButtonComponent comp, ElectrocutedEvent args) + { + if (!TryComp(uid, out MobStateComponent? mobStateComponent) + || !_mobState.IsDead(uid, mobStateComponent) + || !_siliconChargeSystem.TryGetSiliconBattery(uid, out var bateria) + || bateria.CurrentCharge <= 0) + return; + + _lightning.ShootRandomLightnings(uid, 2, 4); + _powerCell.TryUseCharge(uid, bateria.CurrentCharge); + + } + + private void OnMobStateChanged(EntityUid uid, DeadStartupButtonComponent comp, MobStateChangedEvent args) + { + + if (args.NewMobState == MobState.Alive) + { + _popup.PopupEntity(Loc.GetString("dead-startup-system-reboot-success", ("target", MetaData(uid).EntityName)), uid); + _audio.PlayPvs(comp.Sound, uid); + } + + } + +} diff --git a/Content.Server/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedSystem.cs b/Content.Server/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedSystem.cs new file mode 100644 index 00000000000..05e5f5af89b --- /dev/null +++ b/Content.Server/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedSystem.cs @@ -0,0 +1,60 @@ +using Content.Server.Popups; +using Content.Shared.Silicon.EmitBuzzWhileDamaged; +using Content.Shared.Audio; +using Content.Shared.Body.Components; +using Content.Shared.Damage; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Systems; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Silicon.EmitBuzzOnCrit; + +/// +/// This handles the buzzing popup and sound of a silicon based race when it is pretty damaged. +/// +public sealed class EmitBuzzWhileDamagedSystem : EntitySystem +{ + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var emitBuzzOnCritComponent, out var body)) + { + + if (_mobState.IsDead(uid) + || !_mobThreshold.TryGetThresholdForState(uid, MobState.Critical, out var threshold) + || !TryComp(uid, out DamageableComponent? damageableComponent) + || damageableComponent.TotalDamage < (threshold/2)) + continue; + + + emitBuzzOnCritComponent.AccumulatedFrametime += frameTime; + + if (emitBuzzOnCritComponent.AccumulatedFrametime < emitBuzzOnCritComponent.CycleDelay) + continue; + emitBuzzOnCritComponent.AccumulatedFrametime -= emitBuzzOnCritComponent.CycleDelay; + + + // start buzzing + if (_gameTiming.CurTime >= emitBuzzOnCritComponent.LastBuzzPopupTime + emitBuzzOnCritComponent.BuzzPopupCooldown) + { + emitBuzzOnCritComponent.LastBuzzPopupTime = _gameTiming.CurTime; + _popupSystem.PopupEntity(Loc.GetString("silicon-behavior-buzz"), uid); + Spawn("EffectSparks", Transform(uid).Coordinates); + _audio.PlayPvs(emitBuzzOnCritComponent.Sound, uid, AudioHelpers.WithVariation(0.05f, _robustRandom)); + } + } + } + +} diff --git a/Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockComponent.cs b/Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockComponent.cs new file mode 100644 index 00000000000..d524a6a2a68 --- /dev/null +++ b/Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Server.Silicon.EncryptionHolderRequiresLock; + +[RegisterComponent] +public sealed partial class EncryptionHolderRequiresLockComponent : Component +{ +} diff --git a/Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockSystem.cs b/Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockSystem.cs new file mode 100644 index 00000000000..5eb4f25c49b --- /dev/null +++ b/Content.Server/Silicon/EncryptionHolderRequiresLock/EncryptionHolderRequiresLockSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Lock; +using Content.Shared.Radio.Components; +using Content.Shared.Radio.EntitySystems; + +namespace Content.Server.Silicon.EncryptionHolderRequiresLock; + +public sealed class EncryptionHolderRequiresLockSystem : EntitySystem + +{ + [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; + [Dependency] private readonly EncryptionKeySystem _encryptionKeySystem = default!; + + /// + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(LockToggled); + + } + private void LockToggled(EntityUid uid, EncryptionHolderRequiresLockComponent component, LockToggledEvent args) + { + if (!TryComp(uid, out var lockComp) + || !TryComp(uid, out var keyHolder)) + return; + + keyHolder.KeysUnlocked = !lockComp.Locked; + _encryptionKeySystem.UpdateChannels(uid, keyHolder); + } +} diff --git a/Content.Server/Silicon/IPC/InternalEncryptionKeySpawner.cs b/Content.Server/Silicon/IPC/InternalEncryptionKeySpawner.cs new file mode 100644 index 00000000000..eb01409e854 --- /dev/null +++ b/Content.Server/Silicon/IPC/InternalEncryptionKeySpawner.cs @@ -0,0 +1,39 @@ +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Radio.Components; +using Content.Shared.Containers; +using Robust.Shared.Containers; + + // Pretty much copied from StationSpawningSystem.SpawnStartingGear +namespace Content.Server.Silicon.IPC; +public static class InternalEncryptionKeySpawner +{ + public static void TryInsertEncryptionKey(EntityUid target, StartingGearPrototype startingGear, IEntityManager entityManager, HumanoidCharacterProfile? profile) + { + if (entityManager.TryGetComponent(target, out var keyHolderComp)) + { + var earEquipString = startingGear.GetGear("ears", profile); + var containerMan = entityManager.System(); + + if (!string.IsNullOrEmpty(earEquipString)) + { + var earEntity = entityManager.SpawnEntity(earEquipString, entityManager.GetComponent(target).Coordinates); + + if (entityManager.TryGetComponent(earEntity, out _) && // I had initially wanted this to spawn the headset, and simply move all the keys over, but the headset didn't seem to have any keys in it when spawned... + entityManager.TryGetComponent(earEntity, out var fillComp) && + fillComp.Containers.TryGetValue(EncryptionKeyHolderComponent.KeyContainerName, out var defaultKeys)) + { + containerMan.CleanContainer(keyHolderComp.KeyContainer); + + foreach (var key in defaultKeys) + { + var keyEntity = entityManager.SpawnEntity(key, entityManager.GetComponent(target).Coordinates); + containerMan.Insert(keyEntity, keyHolderComp.KeyContainer, force: true); + } + } + + entityManager.QueueDeleteEntity(earEntity); + } + } + } +} diff --git a/Content.Server/Silicon/Systems/SiliconMiscSystem.cs b/Content.Server/Silicon/Systems/SiliconMiscSystem.cs new file mode 100644 index 00000000000..85d76c77bc8 --- /dev/null +++ b/Content.Server/Silicon/Systems/SiliconMiscSystem.cs @@ -0,0 +1,20 @@ +using Content.Shared.Silicon.Components; +using Content.Shared.Bed.Sleep; + +namespace Content.Server.Silicon.Misc; + +// This entire thing is fucking stupid and I hate it. +public sealed class SiliconMiscSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTryingToSleep); + } + + private void OnTryingToSleep(EntityUid uid, SiliconComponent component, ref TryingToSleepEvent args) + { + args.Cancelled = true; + } +} diff --git a/Content.Server/Silicon/WeldingHealable/WeldingHealableComponent.cs b/Content.Server/Silicon/WeldingHealable/WeldingHealableComponent.cs new file mode 100644 index 00000000000..115e9308707 --- /dev/null +++ b/Content.Server/Silicon/WeldingHealable/WeldingHealableComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Damage; +using Content.Shared.Tools; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Silicon.WeldingHealable +{ + [RegisterComponent] + public sealed partial class WeldingHealableComponent : Component { } +} diff --git a/Content.Server/Silicon/WeldingHealable/WeldingHealableSystem.cs b/Content.Server/Silicon/WeldingHealable/WeldingHealableSystem.cs new file mode 100644 index 00000000000..09a2ee99fcd --- /dev/null +++ b/Content.Server/Silicon/WeldingHealable/WeldingHealableSystem.cs @@ -0,0 +1,121 @@ +using System.Diagnostics; +using Content.Server.Silicon.WeldingHealing; +using Content.Server.Administration.Logs; +using Content.Server.Stack; +using Content.Server.Tools.Components; +using Content.Shared.Silicon.WeldingHealing; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Damage; +using Content.Shared.Database; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.FixedPoint; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.Tools; +using Content.Shared.Stacks; +using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; + +namespace Content.Server.Silicon.WeldingHealable +{ + public sealed class WeldingHealableSystem : SharedWeldingHealableSystem + { + [Dependency] private readonly SharedToolSystem _toolSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IAdminLogManager _adminLogger= default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer= default!; + + public override void Initialize() + { + SubscribeLocalEvent(Repair); + SubscribeLocalEvent(OnRepairFinished); + } + + private void OnRepairFinished(EntityUid uid, WeldingHealableComponent healableComponentcomponent, SiliconRepairFinishedEvent args) + { + if (args.Cancelled || args.Used == null + || !EntityManager.TryGetComponent(args.Target, out DamageableComponent? damageable) + || !EntityManager.TryGetComponent(args.Used, out WeldingHealingComponent? component) + || damageable.DamageContainerID != null + && !component.DamageContainers.Contains(damageable.DamageContainerID)) + return; + + var damageChanged = _damageableSystem.TryChangeDamage(uid, component.Damage, true, false, origin: args.User); + + + if (!HasDamage(damageable, component)) + return; + + if (TryComp(args.Used, out WelderComponent? welder) && + TryComp(args.Used, out SolutionContainerManagerComponent? solutionContainer)) + { + if (!_solutionContainer.ResolveSolution(((EntityUid) args.Used, solutionContainer), welder.FuelSolutionName, ref welder.FuelSolution, out var solution)) + return; + _solutionContainer.RemoveReagent(welder.FuelSolution.Value, welder.FuelReagent, component.FuelCost); + } + + var str = Loc.GetString("comp-repairable-repair", + ("target", uid), + ("tool", args.Used!)); + _popup.PopupEntity(str, uid, args.User); + + + if (args.Used.HasValue) + { + args.Handled = _toolSystem.UseTool(args.Used.Value, args.User, uid, args.Delay, component.QualityNeeded, new SiliconRepairFinishedEvent + { + Delay = args.Delay + }); + } + } + + + + private async void Repair(EntityUid uid, WeldingHealableComponent healableComponent, InteractUsingEvent args) + { + if (args.Handled + || !EntityManager.TryGetComponent(args.Used, out WeldingHealingComponent? component) + || !EntityManager.TryGetComponent(args.Target, out DamageableComponent? damageable) + || damageable.DamageContainerID != null + && !component.DamageContainers.Contains(damageable.DamageContainerID) + || !HasDamage(damageable, component) + || !_toolSystem.HasQuality(args.Used, component.QualityNeeded)) + return; + + float delay = component.DoAfterDelay; + + // Add a penalty to how long it takes if the user is repairing itself + if (args.User == args.Target) + { + if (!component.AllowSelfHeal) + return; + + delay *= component.SelfHealPenalty; + } + + // Run the repairing doafter + args.Handled = _toolSystem.UseTool(args.Used, args.User, args.Target, delay, component.QualityNeeded, new SiliconRepairFinishedEvent + { + Delay = delay, + }); + + } + private bool HasDamage(DamageableComponent component, WeldingHealingComponent healable) + { + var damageableDict = component.Damage.DamageDict; + var healingDict = healable.Damage.DamageDict; + foreach (var type in healingDict) + { + if (damageableDict[type.Key].Value > 0) + { + return true; + } + } + + return false; + } + } +} diff --git a/Content.Server/Silicon/WeldingHealing/WeldingHealingComponent.cs b/Content.Server/Silicon/WeldingHealing/WeldingHealingComponent.cs new file mode 100644 index 00000000000..c381d547180 --- /dev/null +++ b/Content.Server/Silicon/WeldingHealing/WeldingHealingComponent.cs @@ -0,0 +1,48 @@ +using Content.Shared.Damage; +using Content.Shared.Tools; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Silicon.WeldingHealing +{ + [RegisterComponent] + public sealed partial class WeldingHealingComponent : Component + { + /// + /// All the damage to change information is stored in this . + /// + /// + /// If this data-field is specified, it will change damage by this amount instead of setting all damage to 0. + /// in order to heal/repair the damage values have to be negative. + /// + + [DataField(required: true)] + public DamageSpecifier Damage; + + [DataField(customTypeSerializer:typeof(PrototypeIdSerializer))] + public string QualityNeeded = "Welding"; + + /// + /// The fuel amount needed to repair physical related damage + /// + [DataField] + public int FuelCost = 5; + + [DataField] + public int DoAfterDelay = 3; + + /// + /// A multiplier that will be applied to the above if an entity is repairing themselves. + /// + [DataField] + public float SelfHealPenalty = 3f; + + /// + /// Whether or not an entity is allowed to repair itself. + /// + [DataField] + public bool AllowSelfHeal = true; + + [DataField(required: true)] + public List DamageContainers; + } +} diff --git a/Content.Server/Station/Systems/StationSpawningSystem.cs b/Content.Server/Station/Systems/StationSpawningSystem.cs index 7ec9a9d7981..2e6edfab611 100644 --- a/Content.Server/Station/Systems/StationSpawningSystem.cs +++ b/Content.Server/Station/Systems/StationSpawningSystem.cs @@ -5,6 +5,7 @@ using Content.Server.Mind.Commands; using Content.Server.PDA; using Content.Server.Shuttles.Systems; +using Content.Server.Silicon.IPC; using Content.Server.Spawners.EntitySystems; using Content.Server.Spawners.Components; using Content.Server.Station.Components; @@ -84,7 +85,6 @@ public override void Initialize() if (station != null && !Resolve(station.Value, ref stationSpawning)) throw new ArgumentException("Tried to use a non-station entity as a station!", nameof(station)); - // Delta-V: Set desired spawn point type. var ev = new PlayerSpawningEvent(job, profile, station, spawnPointType); if (station != null && profile != null) @@ -176,6 +176,7 @@ public EntityUid SpawnPlayerMob( EquipStartingGear(entity.Value, startingGear, profile); if (profile != null) EquipIdCard(entity.Value, profile.Name, prototype, station); + InternalEncryptionKeySpawner.TryInsertEncryptionKey(entity.Value, startingGear, EntityManager, profile); // Parkstation - IPC } if (profile != null) @@ -274,7 +275,7 @@ public sealed class PlayerSpawningEvent : EntityEventArgs ///
public readonly EntityUid? Station; /// - /// Delta-V: Desired SpawnPointType, if any. + /// Desired SpawnPointType, if any. /// public readonly SpawnPointType DesiredSpawnPointType; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 19d0ca6461c..63b9c3ba099 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2226,6 +2226,14 @@ public static readonly CVarDef public static readonly CVarDef ReplayAutoRecordTempDir = CVarDef.Create("replay.auto_record_temp_dir", "", CVar.SERVERONLY); + + /// + /// The amount of time between NPC Silicons draining their battery in seconds. + /// + public static readonly CVarDef SiliconNpcUpdateTime = + CVarDef.Create("silicon.npcupdatetime", 1.5f, CVar.SERVERONLY); + + /* * Miscellaneous */ diff --git a/Content.Shared/Electrocution/ElectrocutionEvents.cs b/Content.Shared/Electrocution/ElectrocutionEvents.cs index fe5753c7fb3..1f7121f8557 100644 --- a/Content.Shared/Electrocution/ElectrocutionEvents.cs +++ b/Content.Shared/Electrocution/ElectrocutionEvents.cs @@ -24,12 +24,14 @@ public sealed class ElectrocutedEvent : EntityEventArgs public readonly EntityUid TargetUid; public readonly EntityUid? SourceUid; public readonly float SiemensCoefficient; + public readonly float? ShockDamage = null; - public ElectrocutedEvent(EntityUid targetUid, EntityUid? sourceUid, float siemensCoefficient) + public ElectrocutedEvent(EntityUid targetUid, EntityUid? sourceUid, float siemensCoefficient, float shockDamage) { TargetUid = targetUid; SourceUid = sourceUid; SiemensCoefficient = siemensCoefficient; + ShockDamage = shockDamage; } } } diff --git a/Content.Shared/Humanoid/NamingSystem.cs b/Content.Shared/Humanoid/NamingSystem.cs index d4cca026ef0..c1e861c0d68 100644 --- a/Content.Shared/Humanoid/NamingSystem.cs +++ b/Content.Shared/Humanoid/NamingSystem.cs @@ -40,6 +40,9 @@ public string GetName(string species, Gender? gender = null) case SpeciesNaming.FirstDashFirst: return Loc.GetString("namepreset-firstdashfirst", ("first1", GetFirstName(speciesProto, gender)), ("first2", GetFirstName(speciesProto, gender))); + case SpeciesNaming.FirstDashLast: + return Loc.GetString("namepreset-firstdashlast", + ("first", GetFirstName(speciesProto, gender)), ("last", GetLastName(speciesProto))); case SpeciesNaming.FirstLast: default: return Loc.GetString("namepreset-firstlast", diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs index 340ce5acd03..8500d530e56 100644 --- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs @@ -179,4 +179,5 @@ public enum SpeciesNaming : byte LastNoFirst, //End of Nyano - Summary: for Oni naming TheFirstofLast, + FirstDashLast, } diff --git a/Content.Shared/Lock/LockComponent.cs b/Content.Shared/Lock/LockComponent.cs index 5587fc2698b..9606540a74a 100644 --- a/Content.Shared/Lock/LockComponent.cs +++ b/Content.Shared/Lock/LockComponent.cs @@ -27,6 +27,14 @@ public sealed partial class LockComponent : Component [AutoNetworkedField] public bool LockOnClick; + /// + /// Whether or not the lock is unlocked by simply clicking. + /// + [DataField("unlockOnClick"), ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public bool UnlockOnClick = true; + + /// /// The sound played when unlocked. /// diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 165e01f70d9..b74f17b1525 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -54,12 +54,15 @@ private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup a private void OnActivated(EntityUid uid, LockComponent lockComp, ActivateInWorldEvent args) { + if (args.Handled) return; // Only attempt an unlock by default on Activate if (lockComp.Locked) { + if (!lockComp.UnlockOnClick) + return; TryUnlock(uid, args.User, lockComp); args.Handled = true; } diff --git a/Content.Shared/Radio/Components/EncryptionKeyHolderComponent.cs b/Content.Shared/Radio/Components/EncryptionKeyHolderComponent.cs index bd49acf9090..6c50acb9660 100644 --- a/Content.Shared/Radio/Components/EncryptionKeyHolderComponent.cs +++ b/Content.Shared/Radio/Components/EncryptionKeyHolderComponent.cs @@ -42,6 +42,13 @@ public sealed partial class EncryptionKeyHolderComponent : Component public Container KeyContainer = default!; public const string KeyContainerName = "key_slots"; + /// + /// Whether or not the headset can be examined to see the encryption keys while the keys aren't accessible. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("examineWhileLocked")] + public bool ExamineWhileLocked = true; + /// /// Combined set of radio channels provided by all contained keys. /// diff --git a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs index 746147eb5b4..712debbafa0 100644 --- a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs +++ b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs @@ -178,6 +178,12 @@ private void OnHolderExamined(EntityUid uid, EncryptionKeyHolderComponent compon if (!args.IsInDetailsRange) return; + if (!component.ExamineWhileLocked && !component.KeysUnlocked) + return; + + if (!component.ExamineWhileLocked && TryComp(uid, out var panel) && !panel.Open) + return; + if (component.KeyContainer.ContainedEntities.Count == 0) { args.PushMarkup(Loc.GetString("encryption-keys-no-keys")); diff --git a/Content.Shared/Silicon/BatteryDrinkerEvent.cs b/Content.Shared/Silicon/BatteryDrinkerEvent.cs new file mode 100644 index 00000000000..4d9a610055d --- /dev/null +++ b/Content.Shared/Silicon/BatteryDrinkerEvent.cs @@ -0,0 +1,12 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Silicon; + +[Serializable, NetSerializable] +public sealed partial class BatteryDrinkerDoAfterEvent : SimpleDoAfterEvent +{ + public BatteryDrinkerDoAfterEvent() + { + } +} diff --git a/Content.Shared/Silicon/BlindHealing/SharedBlindHealingSystem.cs b/Content.Shared/Silicon/BlindHealing/SharedBlindHealingSystem.cs new file mode 100644 index 00000000000..be4be9e5d38 --- /dev/null +++ b/Content.Shared/Silicon/BlindHealing/SharedBlindHealingSystem.cs @@ -0,0 +1,13 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Silicon.BlindHealing; + +public abstract partial class SharedBlindHealingSystem : EntitySystem +{ + [Serializable, NetSerializable] + protected sealed partial class HealingDoAfterEvent : SimpleDoAfterEvent + { + } +} + diff --git a/Content.Shared/Silicon/Components/SiliconComponent.cs b/Content.Shared/Silicon/Components/SiliconComponent.cs new file mode 100644 index 00000000000..c80d9397d93 --- /dev/null +++ b/Content.Shared/Silicon/Components/SiliconComponent.cs @@ -0,0 +1,108 @@ +using Robust.Shared.GameStates; +using Content.Shared.Silicon.Systems; +using Robust.Shared.Serialization.TypeSerializers.Implementations; +using Robust.Shared.Containers; +using Robust.Shared.Prototypes; +using Content.Shared.Alert; + +namespace Content.Shared.Silicon.Components; + +/// +/// Component for defining a mob as a robot. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SiliconComponent : Component +{ + [ViewVariables(VVAccess.ReadOnly)] + public short ChargeState = 10; + + [ViewVariables(VVAccess.ReadOnly)] + public float OverheatAccumulator = 0.0f; + + /// + /// The last time the Silicon was drained. + /// Used for NPC Silicons to avoid over updating. + /// + /// + /// Time between drains can be specified in + /// + /// + public TimeSpan LastDrainTime = TimeSpan.Zero; + + /// + /// The Silicon's battery slot, if it has one. + /// + + /// + /// Is the Silicon currently dead? + /// + public bool Dead = false; + + // BatterySystem took issue with how this was used, so I'm coming back to it at a later date, when more foundational Silicon stuff is implemented. + // /// + // /// The entity to get the battery from. + // /// + // public EntityUid BatteryOverride? = EntityUid.Invalid; + + + /// + /// The type of silicon this is. + /// + /// + /// Any new types of Silicons should be added to the enum. + /// Setting this to Npc will delay charge state updates by LastDrainTime and skip battery heat calculations + /// + [DataField("entityType", customTypeSerializer: typeof(EnumSerializer))] + public Enum EntityType = SiliconType.Npc; + + /// + /// Is this silicon battery powered? + /// + /// + /// If true, should go along with a battery component. One will not be added automatically. + /// + [DataField("batteryPowered"), ViewVariables(VVAccess.ReadWrite)] + public bool BatteryPowered = false; + + /// + /// How much power is drained by this Silicon every second by default. + /// + [DataField("drainPerSecond"), ViewVariables(VVAccess.ReadWrite)] + public float DrainPerSecond = 50f; + + + /// + /// The percentages at which the silicon will enter each state. + /// + /// + /// The Silicon will always be Full at 100%. + /// Setting a value to null will disable that state. + /// Setting Critical to 0 will cause the Silicon to never enter the dead state. + /// + [DataField("chargeThresholdMid"), ViewVariables(VVAccess.ReadWrite)] + public float? ChargeThresholdMid = 0.5f; + + /// + [DataField("chargeThresholdLow"), ViewVariables(VVAccess.ReadWrite)] + public float? ChargeThresholdLow = 0.25f; + + /// + [DataField("chargeThresholdCritical"), ViewVariables(VVAccess.ReadWrite)] + public float? ChargeThresholdCritical = 0.1f; + + [DataField] + public ProtoId BatteryAlert = "BorgBattery"; + + [DataField] + public ProtoId NoBatteryAlert = "BorgBatteryNone"; + + + /// + /// The amount the Silicon will be slowed at each charge state. + /// + [DataField("speedModifierThresholds", required: true)] + public Dictionary SpeedModifierThresholds = default!; + + [DataField("fireStackMultiplier"), ViewVariables(VVAccess.ReadWrite)] + public float FireStackMultiplier = 1f; +} diff --git a/Content.Shared/Silicon/DeadStartupButton/DeadStartupButtonComponent.cs b/Content.Shared/Silicon/DeadStartupButton/DeadStartupButtonComponent.cs new file mode 100644 index 00000000000..3390a76439b --- /dev/null +++ b/Content.Shared/Silicon/DeadStartupButton/DeadStartupButtonComponent.cs @@ -0,0 +1,28 @@ +using Robust.Shared.Audio; + +namespace Content.Shared.Silicon.DeadStartupButton; + +/// +/// This is used for... +/// +[RegisterComponent] +public sealed partial class DeadStartupButtonComponent : Component +{ + [DataField("verbText")] + public string VerbText = "dead-startup-button-verb"; + + [DataField("sound")] + public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/Effects/Arcade/newgame.ogg"); + + [DataField("buttonSound")] + public SoundSpecifier ButtonSound = new SoundPathSpecifier("/Audio/Machines/button.ogg"); + + [DataField("doAfterInterval"), ViewVariables(VVAccess.ReadWrite)] + public float DoAfterInterval = 1f; + + [DataField("buzzSound")] + public SoundSpecifier BuzzSound = new SoundCollectionSpecifier("buzzes"); + + [DataField("verbPriority"), ViewVariables(VVAccess.ReadWrite)] + public int VerbPriority = 1; +} diff --git a/Content.Shared/Silicon/DeadStartupButton/SharedDeadStartupButtonSystem.cs b/Content.Shared/Silicon/DeadStartupButton/SharedDeadStartupButtonSystem.cs new file mode 100644 index 00000000000..2faa6dfde00 --- /dev/null +++ b/Content.Shared/Silicon/DeadStartupButton/SharedDeadStartupButtonSystem.cs @@ -0,0 +1,68 @@ +using Content.Shared.DoAfter; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Network; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Silicon.DeadStartupButton; + +/// +/// This creates a Button that can be activated after an entity, usually a silicon or an IPC, died. +/// This will activate a doAfter and then revive the entity, playing a custom afterward sound. +/// +public partial class SharedDeadStartupButtonSystem : EntitySystem +{ + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly INetManager _net = default!; + + + + + /// + public override void Initialize() + { + SubscribeLocalEvent>(AddTurnOnVerb); + } + + private void AddTurnOnVerb(EntityUid uid, DeadStartupButtonComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + if (!TryComp(uid, out MobStateComponent? mobStateComponent) || !_mobState.IsDead(uid, mobStateComponent)) + return; + + args.Verbs.Add(new AlternativeVerb() + { + Act = () => TryStartup(args.User, uid, component), + Text = Loc.GetString(component.VerbText), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), + Priority = component.VerbPriority + }); + } + + private void TryStartup(EntityUid user, EntityUid target, DeadStartupButtonComponent comp) + { + if (!_net.IsServer) + return; + _audio.PlayPvs(comp.ButtonSound, target); + var args = new DoAfterArgs(EntityManager, user, comp.DoAfterInterval, new OnDoAfterButtonPressedEvent(), target, target:target) + { + BreakOnDamage = true, + BreakOnUserMove = true, + }; + _doAfterSystem.TryStartDoAfter(args); + } + + [Serializable, NetSerializable] + public sealed partial class OnDoAfterButtonPressedEvent : SimpleDoAfterEvent + { + } + + +} diff --git a/Content.Shared/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedComponent.cs b/Content.Shared/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedComponent.cs new file mode 100644 index 00000000000..a8362610e25 --- /dev/null +++ b/Content.Shared/Silicon/EmitBuzzWhileDamaged/EmitBuzzWhileDamagedComponent.cs @@ -0,0 +1,26 @@ +using System.ComponentModel.DataAnnotations; +using Robust.Shared.Audio; + +namespace Content.Shared.Silicon.EmitBuzzWhileDamaged; + +/// +/// This is used for controlling the cadence of the buzzing emitted by EmitBuzzOnCritSystem. +/// This component is used by mechanical species that can get to critical health. +/// +[RegisterComponent] +public sealed partial class EmitBuzzWhileDamagedComponent : Component +{ + [DataField("buzzPopupCooldown")] + public TimeSpan BuzzPopupCooldown { get; private set; } = TimeSpan.FromSeconds(8); + + [ViewVariables] + public TimeSpan LastBuzzPopupTime; + + [DataField("cycleDelay")] + public float CycleDelay = 2.0f; + + public float AccumulatedFrametime; + + [DataField("sound")] + public SoundSpecifier Sound = new SoundCollectionSpecifier("buzzes"); +} diff --git a/Content.Shared/Silicon/SIliconRepairable/SharedWeldingHealableSystem.cs b/Content.Shared/Silicon/SIliconRepairable/SharedWeldingHealableSystem.cs new file mode 100644 index 00000000000..8cbdd50764c --- /dev/null +++ b/Content.Shared/Silicon/SIliconRepairable/SharedWeldingHealableSystem.cs @@ -0,0 +1,14 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Silicon.WeldingHealing; + +public abstract partial class SharedWeldingHealableSystem : EntitySystem +{ + [Serializable, NetSerializable] + protected sealed partial class SiliconRepairFinishedEvent : SimpleDoAfterEvent + { + public float Delay; + } +} + diff --git a/Content.Shared/Silicon/Systems/SharedSiliconSystem.cs b/Content.Shared/Silicon/Systems/SharedSiliconSystem.cs new file mode 100644 index 00000000000..aab9b6e7522 --- /dev/null +++ b/Content.Shared/Silicon/Systems/SharedSiliconSystem.cs @@ -0,0 +1,109 @@ +using Content.Shared.Silicon.Components; +using Content.Shared.Alert; +using Robust.Shared.Serialization; +using Content.Shared.Movement.Systems; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.PowerCell.Components; + +namespace Content.Shared.Silicon.Systems; + + +public sealed class SharedSiliconChargeSystem : EntitySystem +{ + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] protected readonly ItemSlotsSystem ItemSlots = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSiliconInit); + SubscribeLocalEvent(OnSiliconChargeStateUpdate); + SubscribeLocalEvent(OnRefreshMovespeed); + SubscribeLocalEvent(OnItemSlotInsertAttempt); + SubscribeLocalEvent(OnItemSlotEjectAttempt); + } + + private void OnItemSlotInsertAttempt(EntityUid uid, SiliconComponent component, ref ItemSlotInsertAttemptEvent args) + { + if (args.Cancelled) + return; + + if (!TryComp(uid, out var cellSlotComp)) + return; + + if (!ItemSlots.TryGetSlot(uid, cellSlotComp.CellSlotId, out var cellSlot) || cellSlot != args.Slot) + return; + + if (args.User == uid) + args.Cancelled = true; + } + + private void OnItemSlotEjectAttempt(EntityUid uid, SiliconComponent component, ref ItemSlotEjectAttemptEvent args) + { + if (args.Cancelled) + return; + + if (!TryComp(uid, out var cellSlotComp)) + return; + + if (!ItemSlots.TryGetSlot(uid, cellSlotComp.CellSlotId, out var cellSlot) || cellSlot != args.Slot) + return; + + if (args.User == uid) + args.Cancelled = true; + } + + private void OnSiliconInit(EntityUid uid, SiliconComponent component, ComponentInit args) + { + if (component.BatteryPowered) + _alertsSystem.ShowAlert(uid, AlertType.BorgBattery, component.ChargeState); + } + + private void OnSiliconChargeStateUpdate(EntityUid uid, SiliconComponent component, SiliconChargeStateUpdateEvent ev) + { + _alertsSystem.ShowAlert(uid, AlertType.BorgBattery, (short) ev.ChargePercent); + } + + private void OnRefreshMovespeed(EntityUid uid, SiliconComponent component, RefreshMovementSpeedModifiersEvent args) + { + if (!component.BatteryPowered) + return; + + var speedModThresholds = component.SpeedModifierThresholds; + + var closest = 0f; + + foreach (var state in speedModThresholds) + { + if (component.ChargeState >= state.Key && (float) state.Key > closest) + closest = (float) state.Key; + } + + var speedMod = speedModThresholds[(short) closest]; + + args.ModifySpeed(speedMod, speedMod); + } +} + + +public enum SiliconType +{ + Player, + GhostRole, + Npc, +} + +/// +/// Event raised when a Silicon's charge state needs to be updated. +/// +[Serializable, NetSerializable] +public sealed class SiliconChargeStateUpdateEvent : EntityEventArgs +{ + public short ChargePercent { get; } + + public SiliconChargeStateUpdateEvent(short chargePercent) + { + ChargePercent = chargePercent; + } +} diff --git a/Content.Shared/Station/SharedStationSpawningSystem.cs b/Content.Shared/Station/SharedStationSpawningSystem.cs index 55b746f2ce4..715ee2a1494 100644 --- a/Content.Shared/Station/SharedStationSpawningSystem.cs +++ b/Content.Shared/Station/SharedStationSpawningSystem.cs @@ -35,6 +35,7 @@ public void EquipStartingGear(EntityUid entity, StartingGearPrototype startingGe var equipmentEntity = EntityManager.SpawnEntity(equipmentStr, EntityManager.GetComponent(entity).Coordinates); InventorySystem.TryEquip(entity, equipmentEntity, slot.Name, true, force:true); } + } if (TryComp(entity, out HandsComponent? handsComponent)) diff --git a/Resources/Audio/Effects/Buzzes/buzz1.ogg b/Resources/Audio/Effects/Buzzes/buzz1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aa21acee3ca65e4bb10ed8798fdecc4ae27a1078 GIT binary patch literal 19629 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

fX*fH@~1Z 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/Buzzes/buzz4.ogg b/Resources/Audio/Effects/Buzzes/buzz4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8c400abe858e5f0fe871008ee1eadbf8ca8ed61e GIT binary patch literal 23064 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.!wHYiHLzH$H0n46?e7ghV( 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

dTh!Qvki0;V43fmLN3Hgzo==;mp zwqrl49`g`{@X*(q7U!EEoJz-3qaN7Obw2kIHnBs&({4wo&uPam_t6XiYS1wPSBL#L ze)IRtjAW%-zlT7iTu`=ez&$PWhX)QFW(%thl3o z(c6wenv?neHcNtS8;VPAWZ+hBHfqB{S@t9iG8ex)Vv8+y`NZAM?b(D~89oID6JpX%C6nt+onO<5 zx?MxfiE0yZr9;g@TfMkL+vuHTuOSzJN7?@+XE*m)c~Oxymm0?Rv%b#^b3dU+HQhN% zcx9pJ3tg`(xJwJkm3Y_QxrjwXyFby_fU-UrPW)4v;I*Y}|G5HuWy9~TF+qcO|71U` zKhp#2*>m}V4J-F38DRrqPVnn8$9~%k)bwVD-{cscqD_-XqcOe(@DM_|TTYEJ zCuxx8?(v!SGZ;q&1>^l(t9na5o7nRU^cRVG#Na}i&Y^P`04j#!cIk%5`56~kTQ7}A{(bq#a4pRkdIsolhaAudQB%C3{nD+*OrR{uWRRv zqM|XUYf?9ndm52Sww~Y4vV!-YWWHO?I^H_pZq6wmRMk?5N;DlhD_lh0$`RYBzVsa= zOFz#V->#eGm{UF5H*~hH$K)wgPg(A=T=C(o*(rcNWqlKA7ygIgF2*~)irOVCj}W5+ z8v9z$(EM9-b2IOatI7fyNSPA#kvDF|sYDC-@BOO1^mXrw_Zt$0#BrWH>0QVWGOYwogV0txg|W%w2NYCbJx)fuz*7uNTqX}tBOlm1MB zh~^7i1@0#Cm#I%fdL)y`*Y{Pod_FZ})P#NDtqV^ueMla_BRwG2H80PlZoal!ly=Ra1sQi5B9|o(qMVTl&sYQ z!pNL^@NtFiPx9i)K4tk;^f^IWT|RD@5;NB>Kg<>R4f(| zBD+Kd`u@YQ=+%}y?UGW^!~d9X?A%Ns2dru+Ms4)?Lq)(Ytbc*u7{op^igt`*{zPnd z^MrZZ@9$SyY$%O$QrpolyPyg{2tTX`+x}q6g$&Q8g?@{D7l8D)VYNFa5US+Nb|Dbl zR0iSu(!EHZ6sGO`^xIyNun!Bgk(9g*C)FairZRJzjxI0y(s6CC@WIMT6`d61Sn6J` zCg(Zml^}Brc)^16!dCTyr} z^U~STQTR>3^>haL`^op9dykd09bVy0>`#N|!&PX1Bf|Px9>acQ7lWmPkdS4<8Do*R zEYZ2mmRp>|Z4ATN#T<~CLZ(C6!Hmx7k(Lj<9rF|<3 zQ-1FPnCHGyPwj3`p7Cnvx*lB>_5x3qAP=;PBTu~)iUFIY*iM`_dZnIRznhz*Dmn22 zyNs?B`sOQHX^?6QkF+foFGmBA3o=7e8veJ6t7lP3I*$)vKlK9J_9bvUL6-}}z&9M0 zs(d11v%N^nyCjp#6f>k=)@#-5Ub`ebAj3e56%@ROWbd6LZfNnxFx4dox7F4>K# zFnMFaM}sUtSTy$ehtz&zu5vIH+`&{_h?6K89rNuA^g+w*_wVB89s@y$yvPju{_Esm zuoYZOv8|1r&_BF|bLKYE1VVTN)qAY-Sd8Z){qtaCiEh0?T`tG%1Di>tN)s*uYTcZ) z3|PePi!5YlyF1&ac^Wefp$YO!i6ZZ_e+Gq2GoJv?p<&tlnKDHGPZ`~&+SFcQvA(Mj z7W!#}q8KLB{1GUEpKQj#1Z_F3`}LSd)0YRA_Oi^+%70_%EP)MwXYK@2_#terasI<% zyV^cxnzHv)A_YbaZ*6FKrK6@jC0FcC#6>+0lYdes4BUwMkNChm2fWdfk_rwt^?zEMC+B-+$J}$-_STKBaueZm`|% zaiXNw+*>1m(+PBn@zF9(!{b#oEb>fe%H{j$og-d576!DX_h8*?^F*H+axfBuddX_t6jq;{{#0wMjAOZB@KzxNlBwu<&NUy`Aa@ zrSQEl5y&Jmz8Z~l8Se94O_{L0CGT-q>fyYVS5-W~K{i3XAG`m-D#lGwMd{ufI4F z1hb0CngI7X0@N)Q%6VHM_3pAYIv!bXOibq3;w7UZxIvhF`TuHq?|7>J_ka8tA+up+ zosu$=QDi$pAxa@5vna_p$)3lnB_U;&bu^IdjDuqfm3eHAbB+-QhjVaj&N;t__vicb z$E$9y&N-gvF|KjH?$`Y)5Z`mDJ9SOdsN*&tJ6F<@g6g2R6ghuq8*5L?4@%h1 zBo7v>czCJ}gHtbYGUZsF;xS)(0`|UPLt)xuiU8Xe(|jXeV4cC>UzxLdESLJ5{3dqk zOQ8#hzzGCVODNtR8{J1AcDlI@UUc23a<&-X`*Vo1cJ%8z89#yX*kJ!0G3RdVcn>o{Z@0O*fCh$0*i*V*O@R1Ff4* zS5!zS%v^0;mjk9zo%P1NjuO2wcxP|Qlo1j6buqGbB3>Ymj3Q;fc{d-!q6f+634EmN zw)*PUtaPM)=Uua;k<2xguBDRmap3*Wjnp|`8zxq)_t`a$Cf8j^9SOhpdQQK9{&hHw zMr;o)F*zhfJoeViB1+boFfMJ53_Ftry>q;Y>P_^V{KE`Kg{e9C>_Geql9$)@pK{ne z*cCz=!_I5c5y&kEjZ2Cja({BFXL?xD`=khry<{g@E{p_IGJ- z!l&exYig@Jc{sp{MS zkiCQ#9wl6MwvCMCdXxAFyBgAPhj#F?Q9D@5s6@x>N@lu^BeV=Osi-MMjAOK0ay$Oo^#$yrgQbkEE z_~+-EjCv229J0hF#hgEYt=JH`{o};(iTjV5HrpNx!U@kRf*E!cvO^PXs|we&-Gb{_ zi@gGYJXke!+DSUHFy8VcLQ+k4bI=SKpXGNfiV0MKk8H^*-*@#eRojRDSRQQyQ>opv zZIOIUnC%)gp|~%)X}Iz(F!refY7<_4s4dX=5WfZsti8wMRklw)pAJ?M1Vyed{z6o?>r{%2Ce;h3{4fuF9$CF zOL6vRZeq3cXx`xF`8nPcpVn%-mz3In*1y20o8;*HDPb4veTiz=9{T$qXK2IN==_+{ z=o3&4yN!Ce*OVBNZ~wCn-q#@Vx$lCf!e-ybaVchb%<0pXGId9UJLn5n#j+hMB6~(V zALNfNlX)rcpz>L}a^MW$m`Zm)D}BvU5^#I+ZZFhRC{5?NDMgUdiMgA^4o)FQ>oHNu zIGFA0t$p@6Q_7&zO8CbW&1`kXe!ONkJN)n(sJ2aT^S;c(j)aeBmEu{|wL%}OHp9Mu z;)FQ#ltJCBd8`wgzc5nXsl6IJP>N5Pi(OX>>MfpAg*yFJyw?ey0sC03Dmg#+e4%un z)Kk0;FRwl)%QpKkJf0_eC3TzPgIYb;l`V2|4WO)Z99Y7<+|KSSi zdSHqL45qH3cTHapcJ-?6A-h3eT@UpI1b=1`f65~w+(C% z`(wSsX~emF&ogjxX<8j2Kp|R74dzG+Z`5&ic-O-UY34Mi^HDUO_$^!%H0W@#&~KW6 z#;?A)EA>-_mq{K2fb9WRw|N>dLL@LYY%1mzRBaCGJQ+&;K|5RgBGSe6J!M>GkcjS_@tUq4(! z6RIJQe}dI-pIR-JV~(rvy4MG{N(e>HRzTC!N{4bmoi9^DSd#Po4~BD^PCuo)YqZ_| zy4T7IwwFQ<*w{4fV|xKs%y`%>%xp}BraTK5w7srxV&g@hiyJ-d_CHo{cG_RgC@FV* zQ_SKcxKB~oIKbrx-5A@;eub~_4c^?4s9*3CeZ%9CTy%%L+AH0}yyox20Y-Fd=?%_9 zb$JMy3g`ygTbmzcXEN%3GuobxC2bxzn)$Bjz3g2gJIybaM z_ECw1w=ZHTK0}==N6qCacxBpCEf5Q--K^v>=&^MlPS90D*IFY{% zhryec@5K!c83d9)+^^w}b?l%B!{HH|J3foFH8~x}iC1V<8mZ~d_rWqvkeJMQPrs}Z zT^Rna_@8Q$wEGPGiL*zQ`wwqhR!%V3PAAsSym{T;I*u0VEr%c0j#zf?epuxM+Jw4K zvC7ACpX*mYP&<+y^y$vU(LKxO@IaY>>&*UutD%?FqJP46!*!{yj?~tmpyN5X((68s z_G_(`?&}4Dx$3(iDE~qC=TN_0ly7^?JF*DwWQA^hY!(L-(6|JepUL80^tR1%C{1cS z14VEuf{~80cLX$|Q#f6`oUv1~zd@3-S=*sEYV|}XERgHc_yFxPO6!GWwX}YWR&;h_wVA-$ z838rY0~7}F0STRDGsM__D0@Gm(%)00SUT~FSiG~4z>=kgGR4>68i-pzq~}4Y(Zch` zxH>jW)aqq4MxXmsop-$BNR8IrcWxrQOaM1Bgs=+4=qIW%5a~{el=wO#$u*&=4|BcloS9WOq88byB(?cl%$6FR#;ScjE`&+l|_+ z^#rWq;hUecz+n~x@+T}7|8)3IeJvew3LboAq=p957DC-ke2Evos(Z)MuU!Cl22wC@ z*-zQ#F-J~b*YFYe`l^5dMFU13H1JSOjTtYKVO>vTvtn*0t^# zUxEcyIj{rl`h^55BzAD8-ae!_;ngX>q3N$Avd{j2bljf+@QeT^I{saW?RPhWut%oP zl+!m?3TL8c*H^xVb>aO(Wa2>m3qFFD-JKpYiTfkXQ1{-VD($oIe^W803%r@ zsxszGOb0KLNx`r{NLo?k~9=*AVNSw>xD@+e>r@-nM^@;$FIGl5smi!JZ7$M z{6tThdN(acgGTm>^98cg2687OG1L*l)dt7WQiU00pVKr;3{x^D)A(OU1dvZwW%P`i z^4S1{GcXLk>3QLDP;Es@pZi}Q5-`BpF#>+a4Ys%%i+^+6MzBA_YKd*J6V=oqQA}|_ z4gfONV$={c3db$&taXuBdjAs5o5*;lknJDARSbts5j(I4$;8>C7iyCdk3FE1T^&X{ zZr0h(IC;h}$#TSD-b>zo3HSFt+oZ4(K-q64dxCLUGI;XtRMAas>X7lS8XT}8r$W3x z7Nb;EbNDSYX^Xj(vMrA0ZT3RtBVZ42D;~>a^N%GdK8p~J`7Dg|FlCU{buuc(8ky z`emn1O_}F)&w7@2rd8)I&JWI)Zp&n3@?Pqs`zc=7pCHBRMJMzDXG?Qm7QW2#^% zpnX9bQv^wl5m(w0LJkkAh;?JJ)KFa0(K?0e#M7`szh30o(glQFzBV~9Y&Hbob z5$lS6y?_7g%*(nbpc&gsUU7tNmS6ziNHKp)g>pyQ%#*Nin6nRbq5E7AI;1=@#D0G0 zpXJ1!9(d@S^w9vaMs781mO-D8j|uifPalt0y^>$Z&-@Z|+Epu5PS2u{E> zvf#97J2K(?I_a@peRC+YacT0pw&26C)@ktWjijzxxe|@4!p?6E*5ZHv<71)cpl+;> z-3tSib>IVjG3Uv8xRvR3o%gg|`;c*lw=j0o$YiVM?0%#)E~J#|3`EDvthH{mb@>`} zdtfb8&(J;^_=MQ>IcGEl)gaGugA-W8E8{D#bg)X12oOZpHxPD7(Zg8BCQAOs>NEMT zoItFW-&aVet2VajzQ}# zDzyQkn;XW0Y45taUgEutZJj0UnhyWXkwG)u3Ys0dvIW&BeFCgc`d~3Djq&=Qv=Y18 ziwmOJr?O{PC~JYJL>q3fO`u8bUG5)Eh>6#hJ%Y5!?z)z?RYmN0w$*0tr-s#18msituvb2H2gw(N+<5FI&ay&%z*k15VYfLE6O!oCV{1;F}72-IasHZjo z)!FJLI}3ijy;BvrMK=oFTnn9g*5nVYu#}b1e3Y$LK|ivgRytCUu~b`~sy z7v}W2?{3L*SB=xV=@dfo?Bc+1e16hO8}9GF1Y}cso<1mXf9Kjey5doR;tNemP~-ib zur?KW;dC+MfCeP!4KYPFe|emuq?GpImAd^EjAClNvu!erG9ws7tNYWXJqTbEV`)V` z*_ml}iP}xJy;_aS+7W`^R(kNZhh+{oz?0)H7BqfPK}ebID;mO%lKAZZkb5?vNu>{e zr%ufJvqEy@e@)g{#lPTwB0%mAiCzkwgLxi6sKhH^fdLrECk)!p`)6R0Ay!KrUl6Vj zt9xw}-(h=4S7edP2h=)mF;E?wy_U%Y&7inSYE?m~Ocf_m47%Q{{|~oG6cTPVa@jV3 zee&JhC>~>M``#MN$e(jU`yY(pxHzWjgvqR2w8EpgZxbJ??;4vwjL{fdWoM9&Pxl|g~z3)HbR=BO5^1)U5u34i2VhVY_StnbZ&kjM)YE^*D+BJOOsArek~B*nG4PT3svC>RoT z-s#Vdy|xQrk%%u5x`-S1C^z@)oO@;1>*SIde%yFx_k;7v#oTJbhM31XN<$*2D;B=~ zYn@~vviFJ7a3=>XgJc8uXU9ro0eHr+hL+q^Xd&Ix;F#tCb1&5nHaz zu!N7(jr;uXrrzX(laP7q_JVwKWs`i$$H9$D=GdUEpa^wef7VC#;UFhvB?-2VsT!{| zioWm)wvC8lU%kuvkD-6I{0zZd{0~h%7YM zum`Kux^OziE_(`%K%$nqf3KbNP~`+hpUtQ5KL4-NeJN)@OkTfIU#L@!@Au;cp{~;V z+$3F8WAlOUBnX&42o&b6o&Ok!ZM|#l(Y^Os zXiwpv(}hzY0bvERpG018-gxuDCo&ZgU|KiV@z%&yq#)mOH=G23z2AGi-hhWVL^pG6T5jLeQ~Sn%`2^+9 z9MCUs6NAcUsh^WB@;6L?-+Tz( zSe<9-!|lWy4-V-VFXOk}q(wG0)R`cshabItCtCU~u_Q(ub1leM_t~tBH8y#hn9mJP z_H#b|C1c3I^avP+7~qso+-m=-GiYDXIg)OBsprxW$W+rwE>`=_Vw~(o)}U4j-C;tB z=OZ8R)^F0zMKM*=Zr=}~c%AKo*6%*83cmCtQoZuw* z1~eG~K^8ZRWUD|K!DYorVPP)^N09zH6yGX`*bk*N(rhQNr?8{@U_GK7RnB3X{_B$1 z=U6^?==sTHXCNWsWnj{c8pAhW*MY?SV~)Cc=RT;SPBK528WbJ=EFAHbB$%o-y4~p* z=mjd^ujbDO1Tx+~vp-|f;GHIWDx}RM*)O%)-0~av0BvTzt0BDCI`#;RgJ+|{{rT8m-p z1#4n%J&mYwyyia58*c@?o4;+#_`2A_D&sPRD2mQbTVC^Z)!MNLPQI)dmh?bF*{eZI z2@ENN=w*5HyWNYfa4fHC)ch!Ghq1EfrOAjM^}+}z<)8ld^>{lYymerXwjT+%|AT%< z>YeE=rxHpnCp`kXRsuoEY|mC;xhr0>byH38g(b-;*5)(AO8r8e++lfw|LsFzT+~`Z zF}~;?%)i7(kWpSpa5kE)m2bQy4`?mTnXl8in=Ovm!#MT7G{tdN(Mi33(%-@w1337< z0ht<`UqgrshHI_)x)DI6TQeU1!u>6IAUW z$+YhX#h!QN&QSf21EClFzdEXT`P>WD=K)*Uf9WQ#zEA(mo_V;;<}<(Kdj66dWKAfa zE;-y~a*bxgsNMHh0HpzhGbY4%?y4?B?uX(Y6RnhM^VfeXX}@j^g6m)iz3leqV*k%; z`^ae*&5y4wR)XMJXap%H@ELYJBZ$Cj&J0-%!e4$}Mc$~OO>4$|5k3*5Ws6#;bM+ZU z9p)|J9N!bY^-Kk6Yq(gS&qEfat96G-C(wi#-<3C&;ev`;ulE5jQkn(6+7>f8KxV z^1o<{Q-$Z~8o$BukFe=}XT&XYf+ArIuRw4tZSAWBV09^EjjPbaO4Y~MBWD#Y!3=e73*6I(Cyf?Kf>=^|sk>VarV zAI1IG-u55y8WH;g_U_?!<7$K)jJgj!34!FH$8P4Ge!42ss-AdOQlxL~`d`EF`Lt9m zvrzy+l<^ri=)90Lpl#DAgz(t53{;c9mg3-SF`Bga=oPW_4j`uWYl=HW>mKa%kDR-w zKx!Np)!zSjw_9%Zj*tvE&~Le-sP!#-(VC5S={skrgLLxyU5^UnmNgMWU%QU0>U|xk z3JUsDujKybQaxN^NsZDPB9?)x^)Xu~Z`5a0O^5>|I#fvjq`}EeoB28`DAPU*BDU== z5$=?T-peSzfYu2b1<_UBaSihOZ;yyX%Ux<8m7!+&a3dw1F(Wn zmH~MsP&E*cPHv3Ob$kQ{X3OTRoBS6dHRhj9lFH3Hm#S*#JI-6rnumZ$+6|+56ZbrV zeI!yhojt6@0p^cXT)8;-bgrCU!dLy7 zX*XXU64*F}mFiVaUsh#TF9~1%nWhP+&_Av>m^L_kQ;-EKn2Qy!(A>LUc`ZNJiEFJV zw~$dk(*S|+&n=@e1QE*ULCyU}P~q{nWx1x}LOY3=fGHG1p*G{QvH3K|(GZ2rd{xW7 zZ{IDMA$pDX_R`!iGtni(PG0jH2Cfl;yAJ$RGiA2Jnz-JZ*YVcf69^OjzP!(SJu9Th z#RS@vG%=$%-Gz}*U~>VO3F|;j8PkQj0f)_E&p9@nLd<*HQnNbhaj-^}U}Efhf9~*s z?HdiVB|95FzO#dhVeE>pI&qZh5S4cQAdup!e{8JgPMC5Mq&GcTjlUlBPHf2CBB^%2 zK$i75z~`J?=I*<}=3o(C?X$TN>Ur36uy8VLrM8BWeLZ_q4C`tg1);xJQMqYd^TT^F zm3B{D>*%>NGNJKv?FvWq7LPh$WbUQk(AF_JakX7}aplQ;8xeUUU<(=iyCyvwZyO$} zG#u`5YP9okS&ux6wT{9yeH70pg{oZW4C3OiHLCk^0ys9HRW0Xw=DMD9=!ZosF_^=C zLSu?hUvWUGgu+}Bd~Q^y7|(yl%R{9`5ORa470^ zbK-Pc0uT)|E9h1%dL2diOCU=Guhg+;Q?Y{q@rV6ZJEpa_+%#PCha*Q~PVqsbpTv2E z8#a`RElWE{03V*?G~_{KiT9acYUctw6Er|q4u$tRJ9T}pIAj>8GfTBViWnJvu@pskDxp54!Zy;ci_|04sLrSu zhGKiQwcG>P!5K~C!~I@Dy|dfBTHS zTtZQhu*e9;9DX-+MQ*=(%l<{-EO0@H0KSH~YdX%*_v^3DR^H+3-|i|s#f4v;x7B0% zhRKl-zJ4X=NEaiic8@-P@MsSAU+2$J6m>UU!JL?5>4GI?R!20NJ={Bs!y zrbWd`-j&&9S!2ly8;=faYwJX=4L5p!bY%<2h{P9Ics1`d-K*O(s&AqY$1?}u`=;dD zti_c}gZ^f~i?ygIo!?nnl{Fn5OjBC6?|oaWK}riw5e(F1br{d&<$z3)h8^l`JkkYs zalXrD^{5Lhf#6ouTs_eC)Guw!8}}M$`5T4lV3;J3kc%t;@zchXOzCJ{~#8`i{`!#3u z1u%eW1J-AY)T0>SgWIH3E8?tRU<6E*OaC%+Vx3g&6oS7J6S{+>v#`AU*Bsf!?*c>* z-ays6*^md$^aAcQV)P}HV*9%JUm~f55GEf+-O^`)G+W|vyN`yRpX51OMCFTB*cR7A z&+htfK8xi#0}k+k%I_2A$q$s=V0#D4jrX%Dwkm~9VdAktb))SE_r=5P&H*R0b^YZ9 zt4nWIbPim3Z=@cvyZvh{OwMAQa7$f#W3XXECPja~5FEzJ}H0lqj9 zvSv=M8!awrL4eiEUNhudq~sjjB1XI3GJ2@y-(^9?iWmdg~@pRMag2{o$Gd(7d zpufKEz1{CdimEw2u_XDt~hsUAz7iyKHXM^LNY{WFu;L0S(De zS#vadS$gI&h8#1|laO5@BE=4Lg4l&0e|{gjsAwr(OkVIW#mnh; zc0_~>O#VeR8k~++Q99GWffq=-AHaOr#K>Xo09X^w8|2M-&+WOauF+9g&8I%tm=;kb zwe)McwLNgrQTD?@kOUiZ-p4$wIajIpbnLuCRq1Hop4s`AI8LrO$aQsZ=jl*&E2JZz z5HwrLiEs{wMheVEQ|rj}q3lct$+_zzA$%fYwO1`Vcb_~|d)BDNw=ZKOa|dfP5^|C6 z|20y$fz<&&hadys$UzbbFQS2PgCXpyp@9KVYk=v&0Dl2y0J8PHUYT-v|3!%)6jZ}(blat_{*ca$w!^)lAEQ!pIuwU(a$K_ zz%_(|4)AMqg83VOzeE}T8Qm{UyfryokEdgfIa8o&i?F; zNt?0VqGKUc3gR*$d~1GhLIrTq#Ew5QGl~#YnYDJl@1!{UDW)V;LSM6VRbZqJ&c_0R zDNdQ{bNb{+yyRv2D3Tm8zgDxK$xdoJ$w%ITZYKm0SJr$cm>^}sjMLNUVriM$UrzCz ze*A7z*~0Q;#+3E!w_n0>7&>oQLsN?bQcWE%%U$^VAlX=H(L<`vxoB$uV=Fnj6KB z7upFp_j;u`NBb+5!liJFxV3(iERM|t`y2(~ZXft<7E$ijIJLgJbh~q{I70u*K@Sbv z^RU(%I0>1in{Q7>J__Ve@I0w@<~Menh*Z;L*?bWJv}z6^iUWRiHckVzrpRtPKDAfW z4{IA8dojd;*bE(A=sw!#2e_xdys|_6-wa9|#R-2Vu#|ZD4^{HWuqVKFwNB+IABHd= z&D&&J28}HW8Qc4j<@FnA76Q3(lOK=g>>Y*SZ{j2B$~6Gr*k!rSmB^c-h>Gsg|?XaHpkJ{&A=RvkD^sdJZk%Gz<_z>jXpu#L)P|?yYrO8i z+Umc7Wj`?9I)bLcz~VgSc>h7~(E*{}DF|Q5o}C7BgHxdD@V))@t{L5Vz}0zCL3@xr zocgOT^F!B({PAn!H&&2@rU&(pT@JZO+?)_mr7cB*I398O|64MGtAUx zqaDF&pSWv4@Ce5D$yM=9%5i3i5$?Vav97#kmdZE*mQkJgv^&ddI@u%JH5*RcEfpf- z!^r_?_!IZi+N!Wa&hWvpt_}yvQ=&xF_a7 zUENvP$B$Sxw3}2$x_C@xM1e@*$;7az$CWzOTGD^9S<)MTUBIFOnMy-pyh@&B@6Cq= z7l8$MZqs>2YITFKVWNwRvw%1Jn*0Nen4eKlP;M+q%me_=NVZSAy*6d-@do0osbsb3 zo0yTniqmOlPFMj%0P{SL({wmh4~&DFFAPIPr#)yIb3p7&1YNfWu&D zxGq-x^qbSZv_WZy|8owgYk=m80c__b<~F}Dv)jw=WeUD&ZlztlEXXCI76>=lVuSX) zgCe*79b5pcWJCS*5^aw857jo#UcTX8a_4ec2>fD9!0#GE>&Kx*mQb(%0+H6 zVt$a;We>+aoj~Cu2tCKogLP;=Ep{An3iJ6cI*6%i!t~kgsKCb3IxQ0TXizFwV&w&M zI@G!LzvS0dAG|3379#KH^rJt<6onN8C7LLQqdI1DPmcZ7DhYTLB*bPl7>iHuVS6Z^ zy%siL3hv{jcH9j*>(2d1Yd_jW-f!7=mxiBN7m@AJ{!WC%IDiT(p*`jnsG34418vIB z?Q~`}OZL33r3I3Et&V{MEX*Ti<~qKK43UM~t9I5o=5bgX9M zfS5wqxHT+VJ~X}*Zkk)TDG}y1ik(KXb#Co?mMdH@QiVJenbzY7lu z(q3Dep#GH9BKLM?dyz-lToEYYa)1jQ^Xb}EjpMn1k<^`URPE!<#or+gzc+s0eC9Cv zd7fwg=hyAB9R_7pE8(I}pcj6Qj@7tWQ#zPS^M#im7R)#_ID>zN@M^RWGLYR4`J#{R z-XlNtTl^x{Hwd~wa`I*@)NG9-wmx%vO!Up?4Y%j5yjpuQBt`+n*vLa& z!&|P6q<<%w+r$w+zMbX;)ka>3eAxz)6TKArCc6^32L!-UjzXGC2-~Q!KS@i7ff*E! zi>r_*ruu8-w7H6B@y+TfLGZ+J>>L-RUzYg`*}$)RxxmIYM+S@v{pxS?O}I;ejN$s$ zWoMyz&+nBwAL4R<^xDV%IWU_$RKW0mpQ7f;{r;sO(xxJa*4vdaS01cCVXrKN8zt4^ zN=8%xRtTg5;%?m-s(@Y_KL2De!c;2%TZ?|(;#F|kUSbYHPZx~07%{Z1sA|>i|IHkb zNnM?VcP5t>_h>3_v!;~g!OMQr1w?+DGd$kB`(Y3F{*h8us4?f-@9!$W`Vs>sJ}4wj z=|;+~td*inalsq+#*loB?zz|di)jsWxinXCaIfMPEM8pP;>K2wOaJxh$e*aegk9uu z3k*@_I1P->`S=ORcD6VM@+Z)3KzDUHzr|VXqQA9UcayFyrznmHg-L>kh!wafH2ppF z=${*#La~F7P$4PBcf#Tu5=;R~^@g_ws2T?Oiesol`9|jFVLox<=;O)^B?k~_iWYeZ zAy!RJ>67B({*Kn*Wgm}6OS_pIiVH)SpC=vrwb6Co?JULr5wa-5_g4IFZ#65#g-3v8 z6I=Y&G!k1co zmYB!={V!jn>3N1k?arRISDuh!0el02QTp`yFfO0c5Is0`>Ep+})^;tkzAw7{w5u0y zrO^lK2p*vUo_*tN5N4MSp<;hR4sm%{k>dIGfITN; zZ?PHKVBJ)|d%ICQZF>(k7Q~ks8{mFl7X%H@x3(06re3ZpAWn7`4sk8skUquRyn0hh zndz_<;Mj5Dk8J+4jmu}6CY=zO&Pb;eAqi}%VlSh#yO0)2d=LuE{B%MP;d1%AGjk*` zBG<$^vUp@=?VPWGk0;+5SdIOx9MQB{U9oqxK&W<-)N3d}1XO}+y$Y}Hn?%rUV%PIF zAH`O{P=7cpbWMS@$N9Dc5sR}AX=Vl_9S&2uiBUt^v7!3;LgjgIMI>*$|6R}Cfq2(R zRWxsWuuXTNeWob-5)_>N!eLHtFkQ7OprGZ_r`95}C=@0Uxb(4VQhxN%_?IcUje=_3HbkHGB}_$*iaLx=pVXw!;1&;B7i-zgW>m5)eU)~SyD4K6Hv{Ia2c_g+VX)$Qhy@UQw1@U4) zOT_2S<WtHVq%`m?dCmtlB|=Cw?vcM=mmIOk+wJGeH}WaBIVe(!vu<3 z(}$ae@=yI@1?&D>Y|D4eBNkic&=bi5Xe%2|*O;s0JvS*q5m&3QT9LsaG;&|4e&BdU z5Z+;E6OTW{n<11={P)P;oR#^XQXlKOPHZRBLvQ?dIc@&sYBn&7oZ)P&1Fy^2$Y}?g z0a)s)<*xccA29=si(ZZ_jNL~&$2O9A(QtctcdzeS2pY8fvtxOC4v&?Jg1tOQSUM3h<^2`Ml+&Tyvh+);Qx! zjl~AB>gg{uM$X!LoEcF8qt94bO0`al?*t`py(1y3?b9iOcEmy2N^XYa>(MjHW=}y0 zqGo_^_UPXEZ|TxHgIP4&KlenDJHHt1&EXmw9Kc{6`_OaWt<6kro}decM%RWdKa{0a z+cn$}UE&|6}h-7yI>C>w(I2$`mSb%n-FAYydX0hRy2R@rB#; z3`HF137r`pMCp#;+9E@JbvMF0N+UZ1(~Uqb@ef=0IAHGz^uPigNa>_A&iHF3vNZCH z9v-2O`hg}$*K5vm9$bDABG&55Gc`JzK8z5An&wC~6n;Tc4>BV7m$=9mdFqlxZq~(f zX|P>~JlqdWZkTt^($zSyBm8X4%S;TIVktF)q!vqUZlXo^?ar-u;U-B{J;f;NFwgqR z3}6f58ZHuaTQ2^0>)=Dyro{3n{=9udpT(`sZx|Wz=~RBuD{z1~7=XWhmCs`1TgLd=|UnlQ?2OoI-~s3%i}nYLGIGZus1 zL~Lvy6#0>g@ivE|U|zWAIg%fF_4{FwRnw9h|0p|`9Eq+gdGnJrz$LoN#Jtld(eed~ z%i?6eV5+LA%4fm2^pxn-{Xoa(_X9E3BgvSbQ(do$d5qo1&`!DDZ+$aK?P}F80>aGv z>PM~|4kJW7TsbjLicVjQOnYh9{)K`w2{Wj@u>R^oHk z0m3Y6Q5-sEF%burZ1W2iYj>(PajC=WG~@l%5@$l^uE??fV?3}H1RYx1{{tgH91JlS z`A-rG)Ev~cR5jFKR~eofnt=KM19$`s;1Ig{3@66Lml(mT)nA8@5Sp!!7wp$l>Od_{ zp($p}vv|eP{L)t7dk{;WzLwt(-~HNoT;OfIA=#Zv^uvvd6dxM}+hVGj)JxD(ocTx4 z_?aN0A$OVl)Bc=dE&ky-cI11wN7oJ2swB4j^Wa(hFKp>oMTFTEcEUH$yDb}(*6-4D zdL#7?$-g!1!Xc+z=mfry+6mnX#yW0=W<<5f?~E9vbP^J#lR-w|wQ;q_yghCp=(J?z zUD?ZDv`Og4VhW;nj{*N>QP6zig7Jd$-rsIn2SR)8n-PtFoFyU;S(s~5AN&0YJzkH) zTpHnT{q-yUK&P?@)ET0LjX^G1!)|N#;*Z&mY|0ne%a4-&_cNbyZ4 zKn%H?tWmxkd89b~h5Gtj0c?jchXIZ8!76MAkMJvlQgS zby0ElkK8gBI3i|M;_7u)vJ`)QinvTf3z1-yJ%tM>6W0cv4>XssMhXfWj)Y1sWgji-erESTi*R2Lytt_u zsFL6lU$ndvdMpmEk$Be4Z{*9(%Sx?JJT0;V%z`&FeNNGQN95?pP$tbP@)J<>GR9B%MLw_)a) z0#e+BODd>X%(C0jI@faK9g5)dY;g0El<1w3hJ1HXuDPn@cr~-nPxgKcr~UaIydHGJ zQR55!AIpWIuJ?N*d#SbwWnQ6#mE5U{&PsQ}O`Bpm+mU5A_sWf^J0ASaA*Z^T`l|cI zGYu_uGUt?4&)&dZ)DZC76Oh?X(8`^Wb}D@dA3`91J#Gwqc}=vXSVcf20}#hjnS7Uhoard9 zI7m6b(2~*C_qYLL_i+Z*KXWDcH)1T)opPS`%U{9Z99%;ec%0_S&P;bs7ioyA0Akev z$#SMYRsSTQxP22c7Uz=J+L8KNYnC=LKfL$|ucgyF-lX5~Y#W5f3jSU72FtK}R%Qd3 ztvj<%gul80jdYNHXY%r=u$j?J#S8<@6yQJTcW=y({nug-+Jh-8vc$Pt?*F)YEK)1g z%kD|M#X}Uz4!hQCE#ayg2C0>I0b-w?RT}a z`OGX^pPmgM!2T}28L^f>qXfR9JTpW~FKD|*n}8PtLs^6FIa73=Jta1x(d!-#Fo4;b zZB^K1qVK(xO=-HO5tzq(mA~D1etiAj#z{x;Ys-X;zucHwBxH|m6;TbUQz+OuqXdbq z?Z*gr4YlAD5WhxYSu-9ma2w}*C%#Mc5D+r7iY&vGbR9Bi*;1+zi}}IxwvR?Y4=Ba$}(0K}H!n!QFi!nCYIrxSV*xLN`bkzN^_wrkO?ACXlgoyN5 zz7GAyQ)}|Dd^kxGy168zRdDmB=JnK8^Ai)#vle|vqrH|jF|$d7 z%A%e%Vagi2)BbzEK60DCNGfL%H!*LE;N5>W%pg7Zo_D7B_6UcfjE}eXT_mpYrH7k)CW%*Le2!(d$p&} zyLkE>Y^&1bT@)<-;${Wcn|@gQ{5?~P6NF~351kmTsDSci&b?ADUA`Z+e+TnBHc3CR z`YuNKL!Q-k?UnLLl>K^KgtWcR(y#I2gFmqF?kWvS{8!wq0vGvjf?rI=ZpfTxax%cm zx}-L+sa_0cZ=>#<;crA|&t$BuQO+-?r|thr>Mv5?%?&j9goiHAHRT;#;@S_W4~c}3(nr`72Cq3U;;e3`v2M&!|S$HJRUqe3eHty zA}Mc6crC&H-LSNI+ke(u!9U5ECqIO)n1qWCo|4Y?4JMvhao4k1=y*&|&>1PX3_&)+ zhBt-T$?=FHR;q>Ht*<1`q@PQ#@YhBYV=uosSXObrIzb~!|NiwyDD}hLwx#rhPhpR| pBZf1_vW{?PMP75%kFj5}NPGEUgEhLtq{HN$S{+Zl0ASQZ{y#1*IUfK3 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/Buzzes/buzz6.ogg b/Resources/Audio/Effects/Buzzes/buzz6.ogg new file mode 100644 index 0000000000000000000000000000000000000000..81b206c6ed6a346771216f2885d5811628ac7a07 GIT binary patch literal 25454 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/Buzzes/buzz7.ogg b/Resources/Audio/Effects/Buzzes/buzz7.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f58bfaa2eaaf2e150d40a7a7188a76584b075a24 GIT binary patch literal 38681 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/Silicon/startup.ogg b/Resources/Audio/Effects/Silicon/startup.ogg new file mode 100644 index 0000000000000000000000000000000000000000..33d90e78454dd16fd43779b00cfac3f6ea589d89 GIT binary patch literal 17524 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

em|O)T%UvV+P7ay^W6SH4pWvrjy+ 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 x%W&gJ;{y&~~%nJYj literal 0 HcmV?d00001 diff --git a/Resources/Audio/Voice/IPC/cry_robot_1.ogg b/Resources/Audio/Voice/IPC/cry_robot_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..78a27496a593c6b425d694335ecf0225a945f77d GIT binary patch literal 18999 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�oY_z+ssB($`OLIT;p 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/Content/Power/batteries.ftl b/Resources/Locale/en-US/Content/Power/batteries.ftl new file mode 100644 index 00000000000..15ebafae77b --- /dev/null +++ b/Resources/Locale/en-US/Content/Power/batteries.ftl @@ -0,0 +1 @@ +battery-electrocute-charge = The battery surges with energy! diff --git a/Resources/Locale/en-US/Content/Power/batteryDrinker.ftl b/Resources/Locale/en-US/Content/Power/batteryDrinker.ftl new file mode 100644 index 00000000000..950b321d407 --- /dev/null +++ b/Resources/Locale/en-US/Content/Power/batteryDrinker.ftl @@ -0,0 +1,2 @@ +battery-drinker-verb-drink = Drain +battery-drinker-empty = {CAPATALIZE(THE($target))} is already empty! diff --git a/Resources/Locale/en-US/Content/Power/silicons.ftl b/Resources/Locale/en-US/Content/Power/silicons.ftl new file mode 100644 index 00000000000..f5d24bde072 --- /dev/null +++ b/Resources/Locale/en-US/Content/Power/silicons.ftl @@ -0,0 +1,7 @@ +silicon-overheating = You can feel your circuits burn! +silicon-crit = Integrated structure in critical state! +silicon-power-low = Low battery! +ipc-recharge-tip = You charged a litte of your battery. +dead-startup-button-verb = Reboot +dead-startup-system-reboot-success = {$target}'s system was rebooted. +dead-startup-system-reboot-failed = {$target}'s chassis is way too damaged. diff --git a/Resources/Locale/en-US/Content/Silicons/siliconChargers.ftl b/Resources/Locale/en-US/Content/Silicons/siliconChargers.ftl new file mode 100644 index 00000000000..df6c66346c4 --- /dev/null +++ b/Resources/Locale/en-US/Content/Silicons/siliconChargers.ftl @@ -0,0 +1,5 @@ +silicon-charger-overheatwarning = You feel like you're in a microwave! +silicon-charger-chargerate-string = Charge rate +silicon-charger-efficiency-string = Efficiency + +silicon-charger-list-full = {CAPITALIZE(THE($charger))} can only accommodate so many targets! diff --git a/Resources/Locale/en-US/Content/Silicons/silicons.ftl b/Resources/Locale/en-US/Content/Silicons/silicons.ftl new file mode 100644 index 00000000000..f7a9650fff3 --- /dev/null +++ b/Resources/Locale/en-US/Content/Silicons/silicons.ftl @@ -0,0 +1,3 @@ +silicon-overheating = You feel your circuits overheating! +silicon-crit = Structural integrity critical! +silicon-power-low = Power low! diff --git a/Resources/Locale/en-US/body/behavior/behavior.ftl b/Resources/Locale/en-US/body/behavior/behavior.ftl index 6870fdb894f..27297172f95 100644 --- a/Resources/Locale/en-US/body/behavior/behavior.ftl +++ b/Resources/Locale/en-US/body/behavior/behavior.ftl @@ -1 +1,2 @@ -lung-behavior-gasp = Gasp \ No newline at end of file +lung-behavior-gasp = Gasp +silicon-behavior-buzz = Bzzzzt... diff --git a/Resources/Locale/en-US/emotes/emotes.ftl b/Resources/Locale/en-US/emotes/emotes.ftl index 53c12312e57..16e384b58c7 100644 --- a/Resources/Locale/en-US/emotes/emotes.ftl +++ b/Resources/Locale/en-US/emotes/emotes.ftl @@ -1 +1,2 @@ emote-deathgasp = seizes up and falls limp, {POSS-ADJ($entity)} eyes dead and lifeless... +silicon-emote-deathgasp =seizes up and falls limp... diff --git a/Resources/Locale/en-US/lock/batteryslotrequireslock-component.ftl b/Resources/Locale/en-US/lock/batteryslotrequireslock-component.ftl new file mode 100644 index 00000000000..0c75b4a920b --- /dev/null +++ b/Resources/Locale/en-US/lock/batteryslotrequireslock-component.ftl @@ -0,0 +1 @@ +batteryslotrequireslock-component-alert-owner = {$user} is messing with your maintenance panel! \ No newline at end of file diff --git a/Resources/Locale/en-US/power/batteryDrinker.ftl b/Resources/Locale/en-US/power/batteryDrinker.ftl new file mode 100644 index 00000000000..35c76f8825f --- /dev/null +++ b/Resources/Locale/en-US/power/batteryDrinker.ftl @@ -0,0 +1,2 @@ +battery-drinker-verb-drink = Drain +battery-drinker-empty = {CAPATALIZE(THE($target))} is already charged! diff --git a/Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcAntenna.ftl b/Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcAntenna.ftl new file mode 100644 index 00000000000..ec3efd9f553 --- /dev/null +++ b/Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcAntenna.ftl @@ -0,0 +1,10 @@ +marking-RobotAntennaTv = Tv +marking-RobotAntennaTesla = Tesla +marking-RobotAntennaLightb = Light (alt) +marking-RobotAntennaLight = Light +marking-RobotAntennaCyberhead = Cyberhead +marking-RobotAntennaSidelights = Sidelights +marking-RobotAntennaAntlers = Antlers +marking-RobotAntennaDroneeyes = Drone Eyes +marking-RobotAntennaCrowned = Crowned +marking-RobotAntennaTowers = Towers diff --git a/Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcScreens.ftl b/Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcScreens.ftl new file mode 100644 index 00000000000..3f53f2d3f93 --- /dev/null +++ b/Resources/Locale/en-US/prototypes/entities/Mobs/Customization/ipcScreens.ftl @@ -0,0 +1,39 @@ +marking-ScreenStatic = Static +marking-ScreenBlue = Blue +marking-ScreenBreakout = Breakout +marking-ScreenEight = Eight +marking-ScreenGoggles = Goggles +marking-ScreenExclaim = Exclaim +marking-ScreenHeart = Heart +marking-ScreenMonoeye = Cyclops +marking-ScreenNature = Naturalist +marking-ScreenOrange = Orange +marking-ScreenPink = Pink +marking-ScreenQuestion = Question +marking-ScreenShower = Shower +marking-ScreenYellow = Yellow +marking-ScreenScroll = Scroll +marking-ScreenConsole = Console +marking-ScreenRgb = RGB +marking-ScreenGlider = Glider +marking-ScreenRainbowhoriz = Horizontal Rainbow +marking-ScreenBsod = BSOD +marking-ScreenRedtext = Red Text +marking-ScreenSinewave = Sinewave +marking-ScreenSquarewave = Squarewave +marking-ScreenEcgwave = ECG wave +marking-ScreenEyes = Eyes +marking-ScreenEyestall = Tall Eyes +marking-ScreenEyesangry = Angry Eyes +marking-ScreenLoading = Loading... +marking-ScreenWindowsxp = Experience +marking-ScreenTetris = NT Block Game +marking-ScreenTv = Tv +marking-ScreenTextdrop = Textdrop +marking-ScreenStars = Stars +marking-ScreenRainbowdiag = Diagonal Rainbow +marking-ScreenBlank = Dead Pixel +marking-ScreenSmile = Smiley +marking-ScreenFrown = Frowny +marking-ScreenRing = Ring +marking-ScreenL = L diff --git a/Resources/Locale/en-US/silicons/cyberlimbs.ftl b/Resources/Locale/en-US/silicons/cyberlimbs.ftl index b7686b0a2dc..1f128dd893f 100644 --- a/Resources/Locale/en-US/silicons/cyberlimbs.ftl +++ b/Resources/Locale/en-US/silicons/cyberlimbs.ftl @@ -11,6 +11,8 @@ marking-MobIPCRLegDefault = Standard Right Robotic Leg marking-MobIPCRFootDefault = Standard Right Robotic Foot marking-CyberLimbsMarkingBishopHead = Operational Monitor from Bishop Cybernetics +marking-CyberLimbsMarkingBishopHeadAlt = Head from Bishop Cybernetics +marking-CyberLimbsMarkingBishopHeadAlt1 = Alternate Head from Bishop Cybernetics marking-CyberLimbsMarkingBishopChest = Robotic Chassis from Bishop Cybernetics marking-CyberLimbsMarkingBishopLArm = Left Robotic Arm from Bishop Cybernetics marking-CyberLimbsMarkingBishopLHand = Left Robotic Hand from Bishop Cybernetics @@ -22,6 +24,7 @@ marking-CyberLimbsMarkingBishopRLeg = Right Robotic Leg from Bishop Cybernetics marking-CyberLimbsMarkingBishopRFoot = Right Robotic Foot from Bishop Cybernetics marking-CyberLimbsMarkingHesphiastosHead = Operational Monitor from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosHeadAlt = Head from Hesphiastos Industries marking-CyberLimbsMarkingHesphiastosChest = Robotic Chassis from Hesphiastos Industries marking-CyberLimbsMarkingHesphiastosLArm = Left Robotic Arm from Hesphiastos Industries marking-CyberLimbsMarkingHesphiastosLHand = Left Robotic Hand from Hesphiastos Industries @@ -33,6 +36,8 @@ marking-CyberLimbsMarkingHesphiastosRLeg = Right Robotic Leg from Hesphiastos In marking-CyberLimbsMarkingHesphiastosRFoot = Right Robotic Foot from Hesphiastos Industries marking-CyberLimbsMarkingWardtakahashiHead = Operational Monitor from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiHeadAlt = Head from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiHeadAlt1 = Alternate Head from Ward-Takahashi marking-CyberLimbsMarkingWardtakahashiChest = Robotic Chassis from Ward-Takahashi marking-CyberLimbsMarkingWardtakahashiLArm = Left Robotic Arm from Ward-Takahashi marking-CyberLimbsMarkingWardtakahashiLHand = Left Robotic Hand from Ward-Takahashi @@ -44,6 +49,7 @@ marking-CyberLimbsMarkingWardtakahashiRLeg = Right Robotic Leg from Ward-Takahas marking-CyberLimbsMarkingWardtakahashiRFoot = Right Robotic Foot from Ward-Takahashi marking-CyberLimbsMarkingXionHead = Operational Monitor from Xion Manufacturing Group +marking-CyberLimbsMarkingXionHeadAlt = Head from Xion Manufacturing Group marking-CyberLimbsMarkingXionChest = Robotic Chassis from Xion Manufacturing Group marking-CyberLimbsMarkingXionLArm = Left Robotic Arm from Xion Manufacturing Group marking-CyberLimbsMarkingXionLHand = Left Robotic Hand from Xion Manufacturing Group @@ -55,6 +61,7 @@ marking-CyberLimbsMarkingXionRLeg = Right Robotic Leg from Xion Manufacturing Gr marking-CyberLimbsMarkingXionRFoot = Right Robotic Foot from Xion Manufacturing Group marking-CyberLimbsMarkingShellguardHead = Operational Monitor from Shellguard Munitions +marking-CyberLimbsMarkingShellguardHeadAlt = Head from Shellguard Munitions marking-CyberLimbsMarkingShellguardChest = Robotic Chassis from Shellguard Munitions marking-CyberLimbsMarkingShellguardLArm = Left Robotic Arm from Shellguard Munitions marking-CyberLimbsMarkingShellguardLHand = Left Robotic Hand from Shellguard Munitions @@ -66,6 +73,7 @@ marking-CyberLimbsMarkingShellguardRLeg = Right Robotic Leg from Shellguard Muni marking-CyberLimbsMarkingShellguardRFoot = Right Robotic Foot from Shellguard Munitions marking-CyberLimbsMarkingMorpheusHead = Operational Monitor from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusHeadAlt = Head from Morpheus Cyberkinetics marking-CyberLimbsMarkingMorpheusChest = Robotic Chassis from Morpheus Cyberkinetics marking-CyberLimbsMarkingMorpheusLArm = Left Robotic Arm from Morpheus Cyberkinetics marking-CyberLimbsMarkingMorpheusLHand = Left Robotic Hand from Morpheus Cyberkinetics @@ -75,3 +83,14 @@ marking-CyberLimbsMarkingMorpheusRArm = Right Robotic Arm from Morpheus Cyberkin marking-CyberLimbsMarkingMorpheusRHand = Right Robotic Hand from Morpheus Cyberkinetics marking-CyberLimbsMarkingMorpheusRLeg = Right Robotic Leg from Morpheus Cyberkinetics marking-CyberLimbsMarkingMorpheusRFoot = Right Robotic Foot from Morpheus Cyberkinetics + +marking-CyberLimbsMarkingZenghuHead = Head from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuChest = Robotic Chassis from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuRHand = Right Robotic Hand from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuRArm = Right Robotic Arm from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuLHand = Left Robotic Hand from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuLArm = Left Robotic Arm from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuRLeg = Right Robotic Leg from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuRFoot = Right Robotic Foot from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuLLeg = Left Robotic Leg from Zenghu Pharmaceuticals +marking-CyberLimbsMarkingZenghuLFoot = Left Robotic Foot from Zenghu Pharmaceuticals \ No newline at end of file diff --git a/Resources/Locale/en-US/species/namepreset.ftl b/Resources/Locale/en-US/species/namepreset.ftl index 5a42c87b78e..c79f3d91a4b 100644 --- a/Resources/Locale/en-US/species/namepreset.ftl +++ b/Resources/Locale/en-US/species/namepreset.ftl @@ -2,3 +2,5 @@ namepreset-first = {$first} namepreset-firstlast = {$first} {$last} namepreset-firstdashfirst = {$first1}-{$first2} namepreset-thefirstoflast = The {$first} of {$last} +## Parkstation IPC +namepreset-firstdashlast = {$first}-{$last} diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl index 79ce7fea6a1..f492959a439 100644 --- a/Resources/Locale/en-US/species/species.ftl +++ b/Resources/Locale/en-US/species/species.ftl @@ -10,3 +10,4 @@ species-name-arachne = Arachne species-name-moth = Moth Person species-name-skeleton = Skeleton species-name-vox = Vox +species-name-ipc = IPC diff --git a/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl b/Resources/Locale/en-US/traits/disabilities.ftl similarity index 100% rename from Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl rename to Resources/Locale/en-US/traits/disabilities.ftl diff --git a/Resources/Prototypes/Body/Organs/ipc.yml b/Resources/Prototypes/Body/Organs/ipc.yml new file mode 100644 index 00000000000..bc8d6c827ca --- /dev/null +++ b/Resources/Prototypes/Body/Organs/ipc.yml @@ -0,0 +1,72 @@ +- type: entity + id: BaseIPCOrgan + parent: BaseItem + abstract: true + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/organs.rsi + - type: Organ + # - type: Food + # - type: Extractable + # grindableSolutionName: organ + - type: SolutionContainerManager + solutions: + organ: + reagents: + - ReagentId: Oil + Quantity: 10 + +- type: entity + id: OrganIPCEyes + parent: BaseIPCOrgan + name: robotic eyes + description: "01001001 00100000 01110011 01100101 01100101 00100000 01111001 01101111 01110101 00100001" + components: + - type: Sprite + layers: + - state: eyeball-l + - state: eyeball-r + - type: Organ + +- type: entity + id: OrganIPCTongue + parent: BaseIPCOrgan + name: vocal modulator + description: "A vocal modulator, used to produce speech." + components: + - type: Sprite + state: tongue + - type: Organ + +- type: entity + id: OrganIPCEars + parent: BaseIPCOrgan + name: "sonic receptors" + description: + components: + - type: Sprite + state: ears + - type: Organ + +- type: entity + id: OrganIPCPump + parent: BaseIPCOrgan + name: micro pump + description: "A micro pump, used to circulate coolant." + components: + - type: Sprite + state: heart-on + - type: Organ + # The heart 'metabolizes' medicines and poisons that aren't filtered out by other organs. + # This is done because these chemicals need to have some effect even if they aren't being filtered out of your body. + # You're technically 'immune to poison' without a heart, but.. uhh, you'll have bigger problems on your hands. + + # This is fine? + # - type: Metabolizer + # maxReagents: 2 + # metabolizerTypes: [Human] + # groups: + # - id: Medicine + # - id: Poison + # - id: Narcotic diff --git a/Resources/Prototypes/Body/Parts/ipc.yml b/Resources/Prototypes/Body/Parts/ipc.yml new file mode 100644 index 00000000000..aef021b8aab --- /dev/null +++ b/Resources/Prototypes/Body/Parts/ipc.yml @@ -0,0 +1,186 @@ +- type: entity + id: PartIPC + parent: BaseItem + name: "ipc body part" + abstract: true + components: + - type: Damageable + damageContainer: Inorganic + - type: BodyPart + - type: ContainerContainer + containers: + bodypart: !type:Container + ents: [] + - type: StaticPrice + price: 100 + +- type: entity + id: TorsoIPC + name: "ipc torso" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "torso_m" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "torso_m" + - type: BodyPart + partType: Torso + +- type: entity + id: HeadIPC + name: "ipc head" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "head_m" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "head_m" + - type: BodyPart + partType: Head + vital: true + - type: Input + context: "ghost" + - type: MovementSpeedModifier + baseWalkSpeed: 0 + baseSprintSpeed: 0 + - type: InputMover + - type: GhostOnMove + - type: Tag + tags: + - Head + +- type: entity + id: LeftArmIPC + name: "left ipc arm" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "l_arm" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "l_arm" + - type: BodyPart + partType: Arm + symmetry: Left + +- type: entity + id: RightArmIPC + name: "right ipc arm" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "r_arm" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "r_arm" + - type: BodyPart + partType: Arm + symmetry: Right + +- type: entity + id: LeftHandIPC + name: "left ipc hand" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "l_hand" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "l_hand" + - type: BodyPart + partType: Hand + symmetry: Left + +- type: entity + id: RightHandIPC + name: "right ipc hand" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "r_hand" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "r_hand" + - type: BodyPart + partType: Hand + symmetry: Right + +- type: entity + id: LeftLegIPC + name: "left ipc leg" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "l_leg" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "l_leg" + - type: BodyPart + partType: Leg + symmetry: Left + - type: MovementBodyPart + +- type: entity + id: RightLegIPC + name: "right ipc leg" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "r_leg" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "r_leg" + - type: BodyPart + partType: Leg + symmetry: Right + - type: MovementBodyPart + +- type: entity + id: LeftFootIPC + name: "left ipc foot" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "l_foot" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "l_foot" + - type: BodyPart + partType: Foot + symmetry: Left + +- type: entity + id: RightFootIPC + name: "right ipc foot" + parent: PartIPC + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/IPC/parts.rsi + state: "r_foot" + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: "r_foot" + - type: BodyPart + partType: Foot + symmetry: Right diff --git a/Resources/Prototypes/Body/Prototypes/ipc.yml b/Resources/Prototypes/Body/Prototypes/ipc.yml new file mode 100644 index 00000000000..8c42c351381 --- /dev/null +++ b/Resources/Prototypes/Body/Prototypes/ipc.yml @@ -0,0 +1,45 @@ +- type: body + id: IPC + name: "ipc" + root: torso + slots: + head: + part: HeadIPC + connections: + - torso + organs: + eyes: OrganIPCEyes + torso: + part: TorsoIPC + connections: + - left arm + - right arm + - left leg + - right leg + organs: + brain: PositronicBrain + heart: OrganIPCPump + right arm: + part: RightArmIPC + connections: + - right hand + left arm: + part: LeftArmIPC + connections: + - left hand + right hand: + part: RightHandIPC + left hand: + part: LeftHandIPC + right leg: + part: RightLegIPC + connections: + - right foot + left leg: + part: LeftLegIPC + connections: + - left foot + right foot: + part: RightFootIPC + left foot: + part: LeftFootIPC diff --git a/Resources/Prototypes/Datasets/ipc_names.yml b/Resources/Prototypes/Datasets/ipc_names.yml new file mode 100644 index 00000000000..76a963dc516 --- /dev/null +++ b/Resources/Prototypes/Datasets/ipc_names.yml @@ -0,0 +1,1107 @@ +- type: dataset + id: IpcFirst + values: + - ABEX + - ANCL + - ANTR + - ARMA + - AURA + - BGB + - CBOS + - CDB + - CHOC + - CHRI + - COI + - CRUX + - CYBR + - DRSD + - DUNC + - EBIX + - EXOS + - FIRC + - FIZZ + - FRE + - FXMC + - GIGA + - GOOF + - GRIN + - GUN + - HBL + - HG + - HIU + - HOG + - INC + - JADE + - JJR + - JLLO + - JNLG + - JRD + - JUNO + - KALE + - KANO + - KAZA + - KENT + - KIV + - KOR + - KORA + - KOS + - LUMA + - LUNA + - LYNX + - MET + - MIW + - MNOS + - MRPR + - MSO + - NANO + - NEST + - NEXO + - NOVA + - ORNG + - OSI + - PBU + - PHL + - PKP + - PKR + - PLEX + - PLEXO + - PLIX + - QUES + - QUIN + - QWER + - RIFT + - RR + - RYNO + - RZH + - SINA + - SLI + - STLP + - TKRG + - TRIX + - VERA + - VEXA + - VITA + - VIVE + - VOLT + - WAVE + - WISP + - WJ + - WREN + - XAL + - XENA + - XIS + - XSI + - XYLO + - YAGO + - YPT + - ZACK + - ZARG + - ZEON + - ZOLT + - ZUMA + - ZYLO + - ZYVA + +- type: dataset + id: IpcLast + values: + - 000 + - 001 + - 002 + - 003 + - 004 + - 005 + - 006 + - 007 + - 008 + - 009 + - 010 + - 011 + - 012 + - 013 + - 014 + - 015 + - 016 + - 017 + - 018 + - 019 + - 020 + - 021 + - 022 + - 023 + - 024 + - 025 + - 026 + - 027 + - 028 + - 029 + - 030 + - 031 + - 032 + - 033 + - 034 + - 035 + - 036 + - 037 + - 038 + - 039 + - 040 + - 041 + - 042 + - 043 + - 044 + - 045 + - 046 + - 047 + - 048 + - 049 + - 050 + - 051 + - 052 + - 053 + - 054 + - 055 + - 056 + - 057 + - 058 + - 059 + - 060 + - 061 + - 062 + - 063 + - 064 + - 065 + - 066 + - 067 + - 068 + - 069 + - 070 + - 071 + - 072 + - 073 + - 074 + - 075 + - 076 + - 077 + - 078 + - 079 + - 080 + - 081 + - 082 + - 083 + - 084 + - 085 + - 086 + - 087 + - 088 + - 089 + - 090 + - 091 + - 092 + - 093 + - 094 + - 095 + - 096 + - 097 + - 098 + - 099 + - 100 + - 101 + - 102 + - 103 + - 104 + - 105 + - 106 + - 107 + - 108 + - 109 + - 110 + - 111 + - 112 + - 113 + - 114 + - 115 + - 116 + - 117 + - 118 + - 119 + - 120 + - 121 + - 122 + - 123 + - 124 + - 125 + - 126 + - 127 + - 128 + - 129 + - 130 + - 131 + - 132 + - 133 + - 134 + - 135 + - 136 + - 137 + - 138 + - 139 + - 140 + - 141 + - 142 + - 143 + - 144 + - 145 + - 146 + - 147 + - 148 + - 149 + - 150 + - 151 + - 152 + - 153 + - 154 + - 155 + - 156 + - 157 + - 158 + - 159 + - 160 + - 161 + - 162 + - 163 + - 164 + - 165 + - 166 + - 167 + - 168 + - 169 + - 170 + - 171 + - 172 + - 173 + - 174 + - 175 + - 176 + - 177 + - 178 + - 179 + - 180 + - 181 + - 182 + - 183 + - 184 + - 185 + - 186 + - 187 + - 188 + - 189 + - 190 + - 191 + - 192 + - 193 + - 194 + - 195 + - 196 + - 197 + - 198 + - 199 + - 200 + - 201 + - 202 + - 203 + - 204 + - 205 + - 206 + - 207 + - 208 + - 209 + - 210 + - 211 + - 212 + - 213 + - 214 + - 215 + - 216 + - 217 + - 218 + - 219 + - 220 + - 221 + - 222 + - 223 + - 224 + - 225 + - 226 + - 227 + - 228 + - 229 + - 230 + - 231 + - 232 + - 233 + - 234 + - 235 + - 236 + - 237 + - 238 + - 239 + - 240 + - 241 + - 242 + - 243 + - 244 + - 245 + - 246 + - 247 + - 248 + - 249 + - 250 + - 251 + - 252 + - 253 + - 254 + - 255 + - 256 + - 257 + - 258 + - 259 + - 260 + - 261 + - 262 + - 263 + - 264 + - 265 + - 266 + - 267 + - 268 + - 269 + - 270 + - 271 + - 272 + - 273 + - 274 + - 275 + - 276 + - 277 + - 278 + - 279 + - 280 + - 281 + - 282 + - 283 + - 284 + - 285 + - 286 + - 287 + - 288 + - 289 + - 290 + - 291 + - 292 + - 293 + - 294 + - 295 + - 296 + - 297 + - 298 + - 299 + - 300 + - 301 + - 302 + - 303 + - 304 + - 305 + - 306 + - 307 + - 308 + - 309 + - 310 + - 311 + - 312 + - 313 + - 314 + - 315 + - 316 + - 317 + - 318 + - 319 + - 320 + - 321 + - 322 + - 323 + - 324 + - 325 + - 326 + - 327 + - 328 + - 329 + - 330 + - 331 + - 332 + - 333 + - 334 + - 335 + - 336 + - 337 + - 338 + - 339 + - 340 + - 341 + - 342 + - 343 + - 344 + - 345 + - 346 + - 347 + - 348 + - 349 + - 350 + - 351 + - 352 + - 353 + - 354 + - 355 + - 356 + - 357 + - 358 + - 359 + - 360 + - 361 + - 362 + - 363 + - 364 + - 365 + - 366 + - 367 + - 368 + - 369 + - 370 + - 371 + - 372 + - 373 + - 374 + - 375 + - 376 + - 377 + - 378 + - 379 + - 380 + - 381 + - 382 + - 383 + - 384 + - 385 + - 386 + - 387 + - 388 + - 389 + - 390 + - 391 + - 392 + - 393 + - 394 + - 395 + - 396 + - 397 + - 398 + - 399 + - 400 + - 401 + - 402 + - 403 + - 404 + - 405 + - 406 + - 407 + - 408 + - 409 + - 410 + - 411 + - 412 + - 413 + - 414 + - 415 + - 416 + - 417 + - 418 + - 419 + - 420 + - 421 + - 422 + - 423 + - 424 + - 425 + - 426 + - 427 + - 428 + - 429 + - 430 + - 431 + - 432 + - 433 + - 434 + - 435 + - 436 + - 437 + - 438 + - 439 + - 440 + - 441 + - 442 + - 443 + - 444 + - 445 + - 446 + - 447 + - 448 + - 449 + - 450 + - 451 + - 452 + - 453 + - 454 + - 455 + - 456 + - 457 + - 458 + - 459 + - 460 + - 461 + - 462 + - 463 + - 464 + - 465 + - 466 + - 467 + - 468 + - 469 + - 470 + - 471 + - 472 + - 473 + - 474 + - 475 + - 476 + - 477 + - 478 + - 479 + - 480 + - 481 + - 482 + - 483 + - 484 + - 485 + - 486 + - 487 + - 488 + - 489 + - 490 + - 491 + - 492 + - 493 + - 494 + - 495 + - 496 + - 497 + - 498 + - 499 + - 500 + - 501 + - 502 + - 503 + - 504 + - 505 + - 506 + - 507 + - 508 + - 509 + - 510 + - 511 + - 512 + - 513 + - 514 + - 515 + - 516 + - 517 + - 518 + - 519 + - 520 + - 521 + - 522 + - 523 + - 524 + - 525 + - 526 + - 527 + - 528 + - 529 + - 530 + - 531 + - 532 + - 533 + - 534 + - 535 + - 536 + - 537 + - 538 + - 539 + - 540 + - 541 + - 542 + - 543 + - 544 + - 545 + - 546 + - 547 + - 548 + - 549 + - 550 + - 551 + - 552 + - 553 + - 554 + - 555 + - 556 + - 557 + - 558 + - 559 + - 560 + - 561 + - 562 + - 563 + - 564 + - 565 + - 566 + - 567 + - 568 + - 569 + - 570 + - 571 + - 572 + - 573 + - 574 + - 575 + - 576 + - 577 + - 578 + - 579 + - 580 + - 581 + - 582 + - 583 + - 584 + - 585 + - 586 + - 587 + - 588 + - 589 + - 590 + - 591 + - 592 + - 593 + - 594 + - 595 + - 596 + - 597 + - 598 + - 599 + - 600 + - 601 + - 602 + - 603 + - 604 + - 605 + - 606 + - 607 + - 608 + - 609 + - 610 + - 611 + - 612 + - 613 + - 614 + - 615 + - 616 + - 617 + - 618 + - 619 + - 620 + - 621 + - 622 + - 623 + - 624 + - 625 + - 626 + - 627 + - 628 + - 629 + - 630 + - 631 + - 632 + - 633 + - 634 + - 635 + - 636 + - 637 + - 638 + - 639 + - 640 + - 641 + - 642 + - 643 + - 644 + - 645 + - 646 + - 647 + - 648 + - 649 + - 650 + - 651 + - 652 + - 653 + - 654 + - 655 + - 656 + - 657 + - 658 + - 659 + - 660 + - 661 + - 662 + - 663 + - 664 + - 665 + - 666 + - 667 + - 668 + - 669 + - 670 + - 671 + - 672 + - 673 + - 674 + - 675 + - 676 + - 677 + - 678 + - 679 + - 680 + - 681 + - 682 + - 683 + - 684 + - 685 + - 686 + - 687 + - 688 + - 689 + - 690 + - 691 + - 692 + - 693 + - 694 + - 695 + - 696 + - 697 + - 698 + - 699 + - 700 + - 701 + - 702 + - 703 + - 704 + - 705 + - 706 + - 707 + - 708 + - 709 + - 710 + - 711 + - 712 + - 713 + - 714 + - 715 + - 716 + - 717 + - 718 + - 719 + - 720 + - 721 + - 722 + - 723 + - 724 + - 725 + - 726 + - 727 + - 728 + - 729 + - 730 + - 731 + - 732 + - 733 + - 734 + - 735 + - 736 + - 737 + - 738 + - 739 + - 740 + - 741 + - 742 + - 743 + - 744 + - 745 + - 746 + - 747 + - 748 + - 749 + - 750 + - 751 + - 752 + - 753 + - 754 + - 755 + - 756 + - 757 + - 758 + - 759 + - 760 + - 761 + - 762 + - 763 + - 764 + - 765 + - 766 + - 767 + - 768 + - 769 + - 770 + - 771 + - 772 + - 773 + - 774 + - 775 + - 776 + - 777 + - 778 + - 779 + - 780 + - 781 + - 782 + - 783 + - 784 + - 785 + - 786 + - 787 + - 788 + - 789 + - 790 + - 791 + - 792 + - 793 + - 794 + - 795 + - 796 + - 797 + - 798 + - 799 + - 800 + - 801 + - 802 + - 803 + - 804 + - 805 + - 806 + - 807 + - 808 + - 809 + - 810 + - 811 + - 812 + - 813 + - 814 + - 815 + - 816 + - 817 + - 818 + - 819 + - 820 + - 821 + - 822 + - 823 + - 824 + - 825 + - 826 + - 827 + - 828 + - 829 + - 830 + - 831 + - 832 + - 833 + - 834 + - 835 + - 836 + - 837 + - 838 + - 839 + - 840 + - 841 + - 842 + - 843 + - 844 + - 845 + - 846 + - 847 + - 848 + - 849 + - 850 + - 851 + - 852 + - 853 + - 854 + - 855 + - 856 + - 857 + - 858 + - 859 + - 860 + - 861 + - 862 + - 863 + - 864 + - 865 + - 866 + - 867 + - 868 + - 869 + - 870 + - 871 + - 872 + - 873 + - 874 + - 875 + - 876 + - 877 + - 878 + - 879 + - 880 + - 881 + - 882 + - 883 + - 884 + - 885 + - 886 + - 887 + - 888 + - 889 + - 890 + - 891 + - 892 + - 893 + - 894 + - 895 + - 896 + - 897 + - 898 + - 899 + - 900 + - 901 + - 902 + - 903 + - 904 + - 905 + - 906 + - 907 + - 908 + - 909 + - 910 + - 911 + - 912 + - 913 + - 914 + - 915 + - 916 + - 917 + - 918 + - 919 + - 920 + - 921 + - 922 + - 923 + - 924 + - 925 + - 926 + - 927 + - 928 + - 929 + - 930 + - 931 + - 932 + - 933 + - 934 + - 935 + - 936 + - 937 + - 938 + - 939 + - 940 + - 941 + - 942 + - 943 + - 944 + - 945 + - 946 + - 947 + - 948 + - 949 + - 950 + - 951 + - 952 + - 953 + - 954 + - 955 + - 956 + - 957 + - 958 + - 959 + - 960 + - 961 + - 962 + - 963 + - 964 + - 965 + - 966 + - 967 + - 968 + - 969 + - 970 + - 971 + - 972 + - 973 + - 974 + - 975 + - 976 + - 977 + - 978 + - 979 + - 980 + - 981 + - 982 + - 983 + - 984 + - 985 + - 986 + - 987 + - 988 + - 989 + - 990 + - 991 + - 992 + - 993 + - 994 + - 995 + - 996 + - 997 + - 998 + - 999 diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index 4d7351464ff..a20924e502e 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -198,6 +198,7 @@ - ClownMask - WhitelistChameleon - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskClownBase @@ -238,6 +239,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -256,6 +258,7 @@ - HamsterWearable - WhitelistChameleon - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskPullableBase @@ -399,6 +402,7 @@ - type: BreathMask - type: Tag tags: + - IPCMaskWearable # Estacao Pirata - IPCs - HamsterWearable - WhitelistChameleon - HidesNose @@ -419,6 +423,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -435,6 +440,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -451,6 +457,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -467,6 +474,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -483,6 +491,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -499,6 +508,7 @@ - type: Tag tags: - HidesNose + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskBase @@ -515,6 +525,7 @@ - type: Tag tags: - WhitelistChameleon + - IPCMaskWearable # Estacao Pirata - IPCs - type: entity parent: ClothingMaskNeckGaiter @@ -601,3 +612,6 @@ - type: EyeProtection - type: BreathMask - type: IdentityBlocker + - type: Tag + tags: + - IPCMaskWearable # Estacao Pirata - IPCs diff --git a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml index d0e4e4d7e9f..3b71eb5603b 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml @@ -28,3 +28,7 @@ suffix: Voice Mask, Chameleon components: - type: VoiceMasker + default: ClothingMaskGas + - type: Tag + tags: + - IPCMaskWearable # Estacao Pirata - IPCs diff --git a/Resources/Prototypes/Entities/Mobs/Customization/antenna.yml b/Resources/Prototypes/Entities/Mobs/Customization/antenna.yml new file mode 100644 index 00000000000..657e5406eb7 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/antenna.yml @@ -0,0 +1,89 @@ +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaTv + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_tv + +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaTesla + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_tesla + +# - type: marking +# speciesRestriction: [IPC] +# id: RobotAntennaLightb +# bodyPart: HeadTop +# markingCategory: HeadTop +# sprites: +# - sprite: Mobs/Customization/ipc_antenna.rsi +# state: ipc_antenna_lightb + +# - type: marking +# speciesRestriction: [IPC] +# id: RobotAntennaLight +# bodyPart: HeadTop +# markingCategory: HeadTop +# sprites: +# - sprite: Mobs/Customization/ipc_antenna.rsi +# state: ipc_antenna_light + +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaCyberhead + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_cyberhead + +# - type: marking +# speciesRestriction: [IPC] +# id: RobotAntennaSidelights +# bodyPart: HeadTop +# markingCategory: HeadTop +# sprites: +# - sprite: Mobs/Customization/ipc_antenna.rsi +# state: ipc_antenna_sidelights + +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaAntlers + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_antlers + +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaDroneeyes + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_droneeyes + +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaCrowned + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_crowned + +- type: marking + speciesRestriction: [IPC] + id: RobotAntennaTowers + bodyPart: HeadTop + markingCategory: HeadTop + sprites: + - sprite: Mobs/Customization/ipc_antenna.rsi + state: ipc_antenna_towers diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml index 11f4967616b..d2355316b19 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml @@ -2,18 +2,36 @@ id: CyberLimbsMarkingBishopHead bodyPart: Head markingCategory: Head - speciesRestriction: [IPC] + speciesRestriction: [IPC] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi state: head - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi state: head-2 +- type: marking + id: CyberLimbsMarkingBishopHeadAlt + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: head + +- type: marking + id: CyberLimbsMarkingBishopHeadAlt1 + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi + state: head + - type: marking id: CyberLimbsMarkingBishopChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [IPC] + speciesRestriction: [IPC] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: torso-primary @@ -24,7 +42,7 @@ id: CyberLimbsMarkingBishopLArm bodyPart: LArm markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: l_arm-primary @@ -37,7 +55,7 @@ id: CyberLimbsMarkingBishopLHand bodyPart: LHand markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: l_hand @@ -46,7 +64,7 @@ id: CyberLimbsMarkingBishopLLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: l_leg-primary @@ -58,7 +76,7 @@ id: CyberLimbsMarkingBishopLFoot bodyPart: LFoot markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: l_foot @@ -69,7 +87,7 @@ id: CyberLimbsMarkingBishopRArm bodyPart: RArm markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: r_arm-primary @@ -83,7 +101,7 @@ id: CyberLimbsMarkingBishopRHand bodyPart: RHand markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: r_hand @@ -92,7 +110,7 @@ id: CyberLimbsMarkingBishopRLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi state: r_leg-primary @@ -104,7 +122,7 @@ id: CyberLimbsMarkingBishopRFoot bodyPart: RFoot markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi - state: r_foot + state: r_foot \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml index 3103c640034..bd5dab14704 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml @@ -2,18 +2,31 @@ id: CyberLimbsMarkingHesphiastosHead bodyPart: Head markingCategory: Head - speciesRestriction: [IPC] + speciesRestriction: [IPC] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi state: head-1 - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi state: head-2 +- type: marking + id: CyberLimbsMarkingHesphiastosHeadAlt + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi + state: head-2 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi + state: head-3 + - type: marking id: CyberLimbsMarkingHesphiastosChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [IPC] + speciesRestriction: [IPC] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: torso-1 @@ -24,7 +37,7 @@ id: CyberLimbsMarkingHesphiastosLArm bodyPart: LArm markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: l_arm-1 @@ -35,7 +48,7 @@ id: CyberLimbsMarkingHesphiastosLHand bodyPart: LHand markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: l_hand-1 @@ -46,7 +59,7 @@ id: CyberLimbsMarkingHesphiastosLLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: l_leg-1 @@ -58,7 +71,7 @@ id: CyberLimbsMarkingHesphiastosLFoot bodyPart: LFoot markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: l_foot-1 @@ -71,7 +84,7 @@ id: CyberLimbsMarkingHesphiastosRArm bodyPart: RArm markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: r_arm-1 @@ -83,19 +96,19 @@ id: CyberLimbsMarkingHesphiastosRHand bodyPart: RHand markingCategory: Arms - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: r_hand-1 - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: r_hand-2 - + - type: marking id: CyberLimbsMarkingHesphiastosRLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: r_leg-1 @@ -107,9 +120,9 @@ id: CyberLimbsMarkingHesphiastosRFoot bodyPart: RFoot markingCategory: Legs - speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] sprites: - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi state: r_foot-1 - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi - state: r_foot-2 + state: r_foot-2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/morpheus.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/morpheus.yml new file mode 100644 index 00000000000..2c57751ee18 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/morpheus.yml @@ -0,0 +1,158 @@ +- type: marking + id: CyberLimbsMarkingMorpheusHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: head + +- type: marking + id: CyberLimbsMarkingMorpheusHeadAlt + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_alt1.rsi + state: head + +- type: marking + id: CyberLimbsMarkingMorpheusChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: torso + +- type: marking + id: CyberLimbsMarkingMorpheusLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: l_arm + +- type: marking + id: CyberLimbsMarkingMorpheusLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: l_hand + +- type: marking + id: CyberLimbsMarkingMorpheusLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: l_leg + + +- type: marking + id: CyberLimbsMarkingMorpheusLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: l_foot + + + +- type: marking + id: CyberLimbsMarkingMorpheusRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: r_arm + + +- type: marking + id: CyberLimbsMarkingMorpheusRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: r_hand + +- type: marking + id: CyberLimbsMarkingMorpheusRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: r_leg + + +- type: marking + id: CyberLimbsMarkingMorpheusRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC] + coloring: + default: + type: + !type:SimpleColoring + color: "#FFFFFF" + sprites: + - sprite: Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi + state: r_foot \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/shellguard.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/shellguard.yml new file mode 100644 index 00000000000..d060b990061 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/shellguard.yml @@ -0,0 +1,125 @@ +- type: marking + id: CyberLimbsMarkingShellguardHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingShellguardHeadAlt + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingShellguardChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: torso-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: torso-2 + +- type: marking + id: CyberLimbsMarkingShellguardLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_arm-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_arm-2 + +- type: marking + id: CyberLimbsMarkingShellguardLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_hand-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_hand-2 + +- type: marking + id: CyberLimbsMarkingShellguardLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_leg-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_leg-2 + + +- type: marking + id: CyberLimbsMarkingShellguardLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_foot-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: l_foot-2 + + + +- type: marking + id: CyberLimbsMarkingShellguardRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_arm-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_arm-2 + + +- type: marking + id: CyberLimbsMarkingShellguardRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_hand-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_hand-2 + +- type: marking + id: CyberLimbsMarkingShellguardRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_leg-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_leg-2 + + +- type: marking + id: CyberLimbsMarkingShellguardRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_foot-1 + - sprite: Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi + state: r_foot-2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/wardtakahashi.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/wardtakahashi.yml new file mode 100644 index 00000000000..84070f86c56 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/wardtakahashi.yml @@ -0,0 +1,112 @@ +- type: marking + id: CyberLimbsMarkingWardtakahashiHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_monitor.rsi + state: head + +- type: marking + id: CyberLimbsMarkingWardtakahashiHeadAlt + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: head + +- type: marking + id: CyberLimbsMarkingWardtakahashiHeadAlt1 + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_alt1.rsi + state: head + +- type: marking + id: CyberLimbsMarkingWardtakahashiChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: torso + +- type: marking + id: CyberLimbsMarkingWardtakahashiLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: l_arm + +- type: marking + id: CyberLimbsMarkingWardtakahashiLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: l_hand + +- type: marking + id: CyberLimbsMarkingWardtakahashiLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: l_leg + + +- type: marking + id: CyberLimbsMarkingWardtakahashiLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: l_foot + + + +- type: marking + id: CyberLimbsMarkingWardtakahashiRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: r_arm + + +- type: marking + id: CyberLimbsMarkingWardtakahashiRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: r_hand + +- type: marking + id: CyberLimbsMarkingWardtakahashiRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: r_leg + + +- type: marking + id: CyberLimbsMarkingWardtakahashiRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi + state: r_foot \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/xion.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/xion.yml new file mode 100644 index 00000000000..a290c94d65f --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/xion.yml @@ -0,0 +1,126 @@ +- type: marking + id: CyberLimbsMarkingXionHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingXionHeadAlt + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingXionChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: torso-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: torso-2 + +- type: marking + id: CyberLimbsMarkingXionLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_arm-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_arm-2 + +- type: marking + id: CyberLimbsMarkingXionLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_hand-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_hand-2 + +- type: marking + id: CyberLimbsMarkingXionLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_leg-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_leg-2 + + +- type: marking + id: CyberLimbsMarkingXionLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_foot-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: l_foot-2 + + + +- type: marking + id: CyberLimbsMarkingXionRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_arm-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_arm-2 + + + +- type: marking + id: CyberLimbsMarkingXionRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_hand-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_hand-2 + +- type: marking + id: CyberLimbsMarkingXionRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_leg-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_leg-2 + + +- type: marking + id: CyberLimbsMarkingXionRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_foot-1 + - sprite: Mobs/Customization/cyberlimbs/xion/xion_main.rsi + state: r_foot-2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/zenghu.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/zenghu.yml new file mode 100644 index 00000000000..e46ffc70629 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/zenghu.yml @@ -0,0 +1,115 @@ +- type: marking + id: CyberLimbsMarkingZenghuHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingZenghuChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: torso-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: torso-2 + +- type: marking + id: CyberLimbsMarkingZenghuLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_arm-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_arm-2 + +- type: marking + id: CyberLimbsMarkingZenghuLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_hand-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_hand-2 + +- type: marking + id: CyberLimbsMarkingZenghuLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_leg-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_leg-2 + + +- type: marking + id: CyberLimbsMarkingZenghuLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_foot-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: l_foot-2 + + + +- type: marking + id: CyberLimbsMarkingZenghuRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_arm-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_arm-2 + + + +- type: marking + id: CyberLimbsMarkingZenghuRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_hand-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_hand-2 + +- type: marking + id: CyberLimbsMarkingZenghuRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_leg-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_leg-2 + + +- type: marking + id: CyberLimbsMarkingZenghuRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_foot-1 + - sprite: Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi + state: r_foot-2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Customization/screens.yml b/Resources/Prototypes/Entities/Mobs/Customization/screens.yml new file mode 100644 index 00000000000..da8092f5dd9 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/screens.yml @@ -0,0 +1,391 @@ +## CANT SET THESE SCREENS TO "shader: unshaded" +## RobustToolbox/Robust.Shared/Utility/SpriteSpecifier.cs + +- type: marking + speciesRestriction: [IPC] + id: ScreenStatic + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_static + + +- type: marking + speciesRestriction: [IPC] + id: ScreenBlue + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_blue + + +- type: marking + speciesRestriction: [IPC] + id: ScreenBreakout + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_breakout + + +- type: marking + speciesRestriction: [IPC] + id: ScreenEight + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_eight + + +- type: marking + speciesRestriction: [IPC] + id: ScreenGoggles + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_goggles + + +- type: marking + speciesRestriction: [IPC] + id: ScreenExclaim + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_exclaim + + +- type: marking + speciesRestriction: [IPC] + id: ScreenHeart + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_heart + + +- type: marking + speciesRestriction: [IPC] + id: ScreenMonoeye + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_monoeye + + +- type: marking + speciesRestriction: [IPC] + id: ScreenNature + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_nature + + +- type: marking + speciesRestriction: [IPC] + id: ScreenOrange + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_orange + + +- type: marking + speciesRestriction: [IPC] + id: ScreenPink + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_pink + + +- type: marking + speciesRestriction: [IPC] + id: ScreenQuestion + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_question + + +- type: marking + speciesRestriction: [IPC] + id: ScreenShower + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_shower + + +- type: marking + speciesRestriction: [IPC] + id: ScreenYellow + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_yellow + + +- type: marking + speciesRestriction: [IPC] + id: ScreenScroll + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_scroll + + +- type: marking + speciesRestriction: [IPC] + id: ScreenConsole + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_console + + +- type: marking + speciesRestriction: [IPC] + id: ScreenRgb + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_rgb + + +- type: marking + speciesRestriction: [IPC] + id: ScreenGlider + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_glider + + +- type: marking + speciesRestriction: [IPC] + id: ScreenRainbowhoriz + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_rainbowhoriz + + +- type: marking + speciesRestriction: [IPC] + id: ScreenBsod + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_bsod + + +- type: marking + speciesRestriction: [IPC] + id: ScreenRedtext + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_redtext + + +- type: marking + speciesRestriction: [IPC] + id: ScreenSinewave + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_sinewave + + +- type: marking + speciesRestriction: [IPC] + id: ScreenSquarewave + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_squarewave + + +- type: marking + speciesRestriction: [IPC] + id: ScreenEcgwave + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_ecgwave + + +- type: marking + speciesRestriction: [IPC] + id: ScreenEyes + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_eyes + + +- type: marking + speciesRestriction: [IPC] + id: ScreenEyestall + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_eyestall + + +- type: marking + speciesRestriction: [IPC] + id: ScreenEyesangry + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_eyesangry + + +- type: marking + speciesRestriction: [IPC] + id: ScreenLoading + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_loading + + +- type: marking + speciesRestriction: [IPC] + id: ScreenWindowsxp + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_windowsxp + + +- type: marking + speciesRestriction: [IPC] + id: ScreenTetris + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_tetris + + +- type: marking + speciesRestriction: [IPC] + id: ScreenTv + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_tv + + +- type: marking + speciesRestriction: [IPC] + id: ScreenTextdrop + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_textdrop + + +- type: marking + speciesRestriction: [IPC] + id: ScreenStars + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_stars + + +- type: marking + speciesRestriction: [IPC] + id: ScreenRainbowdiag + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_rainbowdiag + + +- type: marking + speciesRestriction: [IPC] + id: ScreenBlank + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_blank + + +- type: marking + speciesRestriction: [IPC] + id: ScreenSmile + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_smile + +- type: marking + speciesRestriction: [IPC] + id: ScreenFrown + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_frown + + +- type: marking + speciesRestriction: [IPC] + id: ScreenRing + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_ring + + +- type: marking + speciesRestriction: [IPC] + id: ScreenL + bodyPart: HeadSide + markingCategory: HeadSide + sprites: + - sprite: Mobs/Customization/ipc_screens.rsi + state: ipc_screen_l + diff --git a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml new file mode 100644 index 00000000000..f38fefbad07 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml @@ -0,0 +1,118 @@ +- type: entity + id: MobIPC + parent: PlayerSiliconHumanoidBase + name: Urist McPositronic + description: A positronic brain in a metal body. + components: + - type: PowerCellSlot + cellSlotId: cell_slot + fitsInCharger: true + - type: ItemSlots + slots: + cell_slot: + locked: true + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellMedium + - type: BatterySlotRequiresLock + itemSlot: cell_slot + - type: EncryptionHolderRequiresLock + - type: SiliconEmitSoundOnDrained + sound: "/Audio/Weapons/Guns/EmptyAlarm/smg_empty_alarm.ogg" + minInterval: 15 + maxInterval: 30 + popUp: "silicon-power-low" + - type: Lock + locked: true + lockOnClick: false + unlockOnClick: false + # Por algum motivo esse componente é bem bugado, então o "LockTime" é quem diz o tempo de tudo enquanto o unlock só está servindo como um bool (???) + lockTime: 5 + unlockTime: 5 + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: NpcFactionMember + factions: + - NanoTrasen + - type: StandingState + - type: MobState + allowedStates: + - Alive + - Critical + - Dead + - type: MobThresholds + thresholds: + 0: Alive + 119.999: Critical # TO make it almost impossible + 120: Dead + stateAlertDict: + Alive: BorgHealth + Critical: BorgCrit + Dead: BorgDead + - type: TypingIndicator + proto: robot + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Blunt + damage: 400 + behaviors: + - !type:GibBehavior { } + - type: SlowOnDamage + speedModifierThresholds: + 60: 0.7 + 90: 0.5 + 120: 0.3 + - type: SiliconDownOnDead + - type: Inventory + templateId: ipc + - type: GuideHelp + guides: + - IPCs + - type: Silicon + entityType: enum.SiliconType.Player + batteryPowered: true + drainPerSecond: 1.5 + chargeThresholdMid: 0.80 + chargeThresholdLow: 0.35 + chargeThresholdCritical: 0.10 + speedModifierThresholds: + 4: 1 + 3: 1 + 2: 0.80 + 1: 0.45 + 0: 0.00 + - type: BatteryDrinker + - type: EncryptionKeyHolder + keySlots: 4 + examineWhileLocked: false + keysExtractionMethod: Cutting + keysUnlocked: false + - type: ActiveRadio + - type: IntrinsicRadioReceiver + - type: IntrinsicRadioTransmitter + - type: DeadStartupButton + sound: + path: /Audio/Effects/Silicon/startup.ogg +# Erro de linter +# - type: Wires +# layoutId: IPC + - type: EmitBuzzWhileDamaged + - type: CanHostGuardian + + +- type: entity + save: false + name: Urist McPositronic + parent: MobHumanDummy + id: MobIPCDummy + noSpawn: true + description: A dummy IPC meant to be used in character setup. + components: + - type: HumanoidAppearance + species: IPC + - type: Inventory + templateId: ipc diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml new file mode 100644 index 00000000000..dda6e278792 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml @@ -0,0 +1,307 @@ +- type: entity + save: false + id: PlayerSiliconHumanoidBase + parent: [BaseMob, MobDamageable, MobCombat, MobAtmosExposed, MobFlammable] + abstract: true + components: + - type: ContentEye + - type: CameraRecoil + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + Acidic: [Touch] + reactions: + - reagents: [Water, SpaceCleaner] + methods: [Touch] + effects: + - !type:WashCreamPieReaction + - type: DamageOnHighSpeedImpact + damage: + types: + Blunt: 10 + soundHit: + path: /Audio/Effects/hit_kick.ogg + - type: Damageable + damageContainer: Silicon + damageModifierSet: IPC + - type: InteractionOutline + - type: MovementSpeedModifier + baseWalkSpeed: 4 + baseSprintSpeed: 3 + - type: ZombieImmune + - type: DoAfter + - type: RotationVisuals + horizontalRotation: 90 + - type: Examiner + # - type: Recyclable + # safe: false + # - type: EyeProtection # You'll want this if your robot can't wear glasses, like an IPC. + # protectionTime: 12 + - type: Silicon + entityType: enum.SiliconType.Player + batteryPowered: false # Needs to also have a battery! + chargeThresholdMid: 0.60 + chargeThresholdLow: 0.30 + chargeThresholdCritical: 0 + speedModifierThresholds: + 4: 1 + 3: 1 + 2: 0.80 + 1: 0.45 + 0: 0.00 + + - type: Temperature + heatDamageThreshold: 325 + coldDamageThreshold: 260 + currentTemperature: 310.15 + specificHeat: 42 + coldDamage: + types: + Cold: 0.1 #per second, scales with temperature & other constants + heatDamage: + types: + Heat: 3 #per second, scales with temperature & other constants + atmosTemperatureTransferEfficiency: 0.05 + - type: Deathgasp + prototype: SiliconDeathgasp + needsCritical: false + - type: MobState + allowedStates: + - Alive + - Dead + - type: MobThresholds + thresholds: + 0: Alive + 165: Dead + - type: Destructible + thresholds: + - trigger: !type:DamageTrigger + damage: 500 + behaviors: + - !type:GibBehavior {} + - type: Icon + sprite: Mobs/Species/IPC/parts.rsi + state: full + - type: Sprite + noRot: true + drawdepth: Mobs + layers: + - map: ["enum.HumanoidVisualLayers.Chest"] + - map: ["enum.HumanoidVisualLayers.Head"] + - map: ["enum.HumanoidVisualLayers.Snout"] + - map: ["enum.HumanoidVisualLayers.Eyes"] + - map: ["enum.HumanoidVisualLayers.RArm"] + - map: ["enum.HumanoidVisualLayers.LArm"] + - map: ["enum.HumanoidVisualLayers.RLeg"] + - map: ["enum.HumanoidVisualLayers.LLeg"] + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: ["enum.HumanoidVisualLayers.StencilMask"] + sprite: Mobs/Customization/masking_helpers.rsi + state: female_full + visible: false + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["socks"] + - map: ["underpants"] + - map: ["undershirt"] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: ["id"] + - map: ["gloves"] + - map: ["shoes"] + - map: ["ears"] + - map: ["outerClothing"] + - map: ["eyes"] + - map: ["belt"] + - map: ["neck"] + - map: ["back"] + - map: ["enum.HumanoidVisualLayers.FacialHair"] + - map: ["enum.HumanoidVisualLayers.Hair"] + - map: ["enum.HumanoidVisualLayers.HeadSide"] + - map: ["enum.HumanoidVisualLayers.HeadTop"] + - map: ["mask"] + - map: ["head"] + - map: ["pocket1"] + - map: ["pocket2"] + - map: ["enum.HumanoidVisualLayers.Tail"] + - map: ["clownedon"] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false + + #- type: Bloodstream This is left commented out because it's not necessary for a robot, but you may want it. + # damageBleedModifiers: BloodlossIPC + # bloodReagent: Oil + # bleedReductionAmount: 0 + # bloodMaxVolume: 500 + # chemicalMaxVolume: 0 + # bleedPuddleThreshold: 3 + # bleedRefreshAmount: 0 + # bloodLossThreshold: 0 + # maxBleedAmount: 14 + # bloodlossDamage: + # types: + # Burn: 1.5 + # bloodlossHealDamage: + # types: + # Burn: 0 + - type: Flashable + - type: Flammable + fireSpread: true + canResistFire: true + damage: + types: + Heat: 0.75 #per second, scales with number of fire 'stacks' + # - type: Barotrauma # Not particularly modifiable. In the future, some response to pressure changes would be nice. + # damage: + # types: + # Blunt: 0.28 #per second, scales with pressure and other constants. + atmosTemperatureTransferEfficiency: 0.4 + - type: Identity + # soundHit: + # path: /Audio/Effects/metalbreak.ogg + - type: RangedDamageSound + soundGroups: + Brute: + collection: MetalBulletImpact + soundTypes: + Heat: + collection: MetalLaserImpact + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - type: Hands + - type: Inventory + templateId: human + - type: InventorySlots + - type: Appearance + - type: GenericVisualizer + visuals: + enum.CreamPiedVisuals.Creamed: + clownedon: # Not 'creampied' bc I can already see Skyrat complaining about conflicts. + True: { visible: true } + False: { visible: false } + - type: Cuffable + - type: Mood + - type: AnimationPlayer + - type: Buckle + - type: CreamPied + - type: Stripping + - type: Strippable + - type: UserInterface + interfaces: + - key: enum.VoiceMaskUIKey.Key + type: VoiceMaskBoundUserInterface + - key: enum.HumanoidMarkingModifierKey.Key + type: HumanoidMarkingModifierBoundUserInterface + - key: enum.StrippingUiKey.Key + type: StrippableBoundUserInterface + - type: Emoting + - type: Grammar + attributes: + proper: true + - type: Climbing + - type: StandingState + - type: MindContainer + showExamineInfo: true + - type: SSDIndicator + - type: CanEscapeInventory + - type: HumanoidAppearance + species: IPC + - type: Body + prototype: IPC + requiredLegs: 2 + - type: Ensnareable + sprite: Objects/Misc/ensnare.rsi + - type: Speech + speechSounds: Pai + - type: Vocal + sounds: + Male: UnisexIPC + Female: UnisexIPC + Unsexed: UnisexIPC + - type: MeleeWeapon + hidden: true + soundHit: + collection: Punch + angle: 30 + animation: WeaponArcFist + attackRate: 1 + damage: + types: + Blunt: 6 # It's tough. + - type: MobPrice + price: 1500 # Kidnapping a living person and selling them for cred is a good move. + deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. + - type: Pullable + - type: Puller + + - type: BodyEmotes + soundsId: GeneralBodyEmotes + - type: DamageVisuals + thresholds: [ 10, 20, 30, 50, 70, 100 ] + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.LLeg" + - "enum.HumanoidVisualLayers.RArm" + - "enum.HumanoidVisualLayers.RLeg" + damageOverlayGroups: + Brute: + sprite: Mobs/Effects/brute_damage.rsi + color: "#DD8822" + # Organs + - type: IdExaminable + - type: HealthExaminable + examinableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + # - Drunk + - SlurredSpeech + - PressureImmunity + - Muted + # - ForcedSleep + - TemporaryBlindness + - Pacified + # - PsionicsDisabled + # - PsionicallyInsulated + - type: Blindable + - type: FireVisuals + alternateState: Standing + - type: LightningTarget + priority: 1 + lightningExplode: false + + +- type: damageModifierSet + id: IPC + coefficients: + Poison: 0 + Cold: 0.2 + Heat: 2 + Shock: 2.5 + diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index 59d8ed19220..0a957eeb7aa 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -48,6 +48,12 @@ solutions: glass: canReact: false + # Estacao Pirata - IPC Healing + - type: BlindHealing + damageContainers: + - Silicon + - type: StackPrice + price: 2 - type: entity parent: SheetGlassBase diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/mmi.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/mmi.yml index 308c013da46..85333e98df5 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/mmi.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/mmi.yml @@ -123,3 +123,4 @@ - type: GuideHelp guides: - Cyborgs + - type: Organ # Estacao Pirata - IPCs diff --git a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml index 8f9fb382f52..36a4c411634 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml @@ -26,6 +26,20 @@ price: 0 - type: StackPrice price: 1 + - type: PhysicalComposition + materialComposition: + Steel: 15 + #Same as Ointment but divided by 5 and 3 because StackPrice needs to be 1 - Estacao Pirata IPCs + #1 Ointment = -50 damage of those types + #1 Cable ~= -50 (-49.8) damage of those types + - type: Healing + delay: 0.6 + damageContainers: + - Silicon + damage: + types: # these are all split across multiple types + Heat: -1.66 + Shock: -1.66 - type: entity id: CableHVStack diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 8214ec56f34..9f9df6f4f19 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -106,6 +106,15 @@ price: 40 - type: IgnitionSource temperature: 700 + - type: WeldingHealing # Same as Brutepack - Estacao Pirata IPCs + damageContainers: + - Silicon + fuelcost: 5 + damage: + types: + Blunt: -15 + Piercing: -15 + Slash: -15 - type: entity name: industrial welding tool diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 4df502791f3..6504c6a1f48 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -138,6 +138,8 @@ priority: 1 - type: StaticPrice price: 500 + - type: BatteryDrinkerSource # Parkstation IPCs + maxAmount: 10000 # APC under construction - type: entity @@ -204,6 +206,8 @@ - type: Battery maxCharge: 50000 startingCharge: 50000 + - type: BatteryDrinkerSource # Parkstation IPCs + maxAmount: 5000 - type: entity parent: BaseAPC @@ -213,6 +217,8 @@ - type: Battery maxCharge: 100000 startingCharge: 100000 + - type: BatteryDrinkerSource # Parkstation IPCs + maxAmount: 12000 - type: entity parent: BaseAPC @@ -222,6 +228,8 @@ - type: Battery maxCharge: 150000 startingCharge: 150000 + - type: BatteryDrinkerSource # Parkstation IPCs + maxAmount: 18000 - type: entity parent: BaseAPC @@ -231,3 +239,5 @@ - type: Battery maxCharge: 200000 startingCharge: 200000 + - type: BatteryDrinkerSource # Parkstation IPCs # Parkstation IPCs + maxAmount: 26000 diff --git a/Resources/Prototypes/Entities/Structures/Power/chargers.yml b/Resources/Prototypes/Entities/Structures/Power/chargers.yml index f5f0748b819..ae8689bead4 100644 --- a/Resources/Prototypes/Entities/Structures/Power/chargers.yml +++ b/Resources/Prototypes/Entities/Structures/Power/chargers.yml @@ -245,6 +245,7 @@ whitelist: components: - BorgChassis + - Silicon # Parkstation IPCs - type: Construction containers: - machine_parts diff --git a/Resources/Prototypes/Guidebook/species.yml b/Resources/Prototypes/Guidebook/species.yml index 5b9efd03661..8fcf5b520e4 100644 --- a/Resources/Prototypes/Guidebook/species.yml +++ b/Resources/Prototypes/Guidebook/species.yml @@ -10,6 +10,7 @@ - Moth - Reptilian - SlimePerson + - IPCs - type: guideEntry id: Arachnid @@ -45,3 +46,8 @@ id: SlimePerson name: species-name-slime text: "/ServerInfo/Guidebook/Mobs/SlimePerson.xml" + +- type: guideEntry + id: IPCs + name: species-name-ipc + text: "/ServerInfo/Guidebook/Mobs/IPCs.xml" diff --git a/Resources/Prototypes/InventoryTemplates/ipc_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/ipc_inventory_template.yml new file mode 100644 index 00000000000..14a62510f28 --- /dev/null +++ b/Resources/Prototypes/InventoryTemplates/ipc_inventory_template.yml @@ -0,0 +1,143 @@ +- type: inventoryTemplate + id: ipc + slots: + - name: shoes + slotTexture: shoes + slotFlags: FEET + stripTime: 3 + uiWindowPos: 1,0 + strippingWindowPos: 1,3 + displayName: Shoes + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,1 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + stripTime: 6 + uiWindowPos: 1,1 + strippingWindowPos: 1,2 + displayName: Suit + # Underwear + # - name: undershirt + # slotTexture: undershirt + # slotFlags: UNDERSHIRT + # stripTime: 8 + # uiWindowPos: 4,1 + # strippingWindowPos: 3,1 + # displayName: Undershirt + # - name: underpants + # slotTexture: underpants + # slotFlags: UNDERPANTS + # stripTime: 12 + # uiWindowPos: 4,0 + # strippingWindowPos: 3,2 + # displayName: Underpants + # - name: socks + # slotTexture: socks + # slotFlags: SOCKS + # stripTime: 8 + # uiWindowPos: 4,2 + # strippingWindowPos: 3,3 + # displayName: Socks + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,1 + strippingWindowPos: 2,0 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,2 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + uiWindowPos: 1,2 + slotTexture: mask + slotFlags: MASK + strippingWindowPos: 1,1 + displayName: Mask + whitelist: + components: + - IdentityBlocker + tags: + - IPCMaskWearable + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + # - name: ears + # slotTexture: ears + # slotFlags: EARS + # stripTime: 3 + # uiWindowPos: 2,0 + # strippingWindowPos: 2,0 + # displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,3 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back diff --git a/Resources/Prototypes/SoundCollections/buzzes.yml b/Resources/Prototypes/SoundCollections/buzzes.yml new file mode 100644 index 00000000000..3be51acba73 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/buzzes.yml @@ -0,0 +1,12 @@ +- type: soundCollection + id: buzzes + files: + - /Audio/Effects/Buzzes/buzz1.ogg + - /Audio/Effects/Buzzes/buzz2.ogg + - /Audio/Effects/Buzzes/buzz3.ogg + - /Audio/Effects/Buzzes/buzz4.ogg + - /Audio/Effects/Buzzes/buzz5.ogg + - /Audio/Effects/Buzzes/buzz6.ogg + - /Audio/Effects/Buzzes/buzz7.ogg + - /Audio/Effects/Buzzes/buzz8.ogg + - /Audio/Effects/Buzzes/buzz9.ogg diff --git a/Resources/Prototypes/Species/ipc.yml b/Resources/Prototypes/Species/ipc.yml new file mode 100644 index 00000000000..069429ee37d --- /dev/null +++ b/Resources/Prototypes/Species/ipc.yml @@ -0,0 +1,238 @@ +- type: species + id: IPC + name: species-name-ipc + roundStart: true + prototype: MobIPC + sprites: MobIPCSprites + markingLimits: MobIPCMarkingLimits + dollPrototype: MobIPCDummy + skinColoration: Hues + minAge: 1 + maxAge: 240 + oldAge: 50 + youngAge: 50 + maleFirstNames: IpcFirst + femaleFirstNames: IpcFirst + lastNames: IpcLast + naming: FirstDashLast + sexes: + - Unsexed + +# The lack of a layer means that +# this person cannot have round-start anything +# applied to that layer. It has to instead +# be defined as a 'custom base layer' +# in either the mob's starting marking prototype, +# or it has to be added in C#. +- type: speciesBaseSprites + id: MobIPCSprites + sprites: + Head: MobIPCHead + HeadTop: MobHumanoidAnyMarking + HeadSide: MobHumanoidAnyMarking + Tail: MobHumanoidAnyMarking + Hair: MobHumanoidMarkingMatchSkin + Chest: MobIPCTorso + LArm: MobIPCLArm + RArm: MobIPCRArm + LHand: MobIPCLHand + RHand: MobIPCRHand + LLeg: MobIPCLLeg + RLeg: MobIPCRLeg + LFoot: MobIPCLFoot + RFoot: MobIPCRFoot + +- type: markingPoints + id: MobIPCMarkingLimits + points: + Head: + points: 1 + required: true + defaultMarkings: [ MobIPCHeadDefault ] + Chest: + points: 1 + required: true + defaultMarkings: [ MobIPCTorsoDefault ] + Legs: + points: 4 + required: true + defaultMarkings: [ MobIPCLLegDefault, MobIPCLFootDefault, MobIPCRLegDefault, MobIPCRFootDefault ] + Arms: + points: 4 + required: true + defaultMarkings: [ MobIPCLArmDefault, MobIPCLHandDefault, MobIPCRArmDefault, MobIPCRHandDefault ] + HeadSide: + points: 1 + required: false + +- type: humanoidBaseSprite + id: MobIPCMarkingFollowSkin + markingsMatchSkin: true + layerAlpha: 0.5 + +- type: humanoidBaseSprite + id: MobIPCScreen + +# Head + +- type: humanoidBaseSprite + id: MobIPCHead + +- type: humanoidBaseSprite + id: MobIPCHeadMale + +- type: humanoidBaseSprite + id: MobIPCHeadFemale + +- type: marking + id: MobIPCHeadDefault + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: head_m + +# Torso + +- type: humanoidBaseSprite + id: MobIPCTorso + +- type: humanoidBaseSprite + id: MobIPCTorsoMale + +- type: humanoidBaseSprite + id: MobIPCTorsoFemale + +- type: marking + id: MobIPCTorsoDefault + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: torso_m + +- type: marking + id: MobIPCTorsoFemaleDefault + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: torso_f + +# Left Leg + +- type: humanoidBaseSprite + id: MobIPCLLeg + +- type: marking + id: MobIPCLLegDefault + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: l_leg + +# Left Arm + +- type: humanoidBaseSprite + id: MobIPCLArm + +- type: marking + id: MobIPCLArmDefault + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: l_arm + +#LHand + +- type: humanoidBaseSprite + id: MobIPCLHand + +- type: marking + id: MobIPCLHandDefault + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: l_hand + +#LFoot + +- type: humanoidBaseSprite + id: MobIPCLFoot + +- type: marking + id: MobIPCLFootDefault + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: l_foot + +#RLeg + +- type: humanoidBaseSprite + id: MobIPCRLeg + +- type: marking + id: MobIPCRLegDefault + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: r_leg + +#RArm + +- type: humanoidBaseSprite + id: MobIPCRArm + +- type: marking + id: MobIPCRArmDefault + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: r_arm + +#RHand + +- type: humanoidBaseSprite + id: MobIPCRHand + +- type: marking + id: MobIPCRHandDefault + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: r_hand + +#RFoot + +- type: humanoidBaseSprite + id: MobIPCRFoot + +- type: marking + id: MobIPCRFootDefault + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Species/IPC/parts.rsi + state: r_foot + +- type: Tag + id: IPCMaskWearable diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index ca2453e41a1..3493683ca45 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -21,6 +21,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC components: - type: Narcolepsy timeBetweenIncidents: 300, 600 @@ -80,6 +84,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC components: - type: FrontalLisp @@ -92,6 +100,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC components: - type: Snoring @@ -151,6 +163,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC components: - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, bloodLossAmount: 0.07 # then become crit ~10 minutes later @@ -165,6 +181,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC components: - type: Hemophilia bleedReductionModifier: 0.5 diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index 5e1e4e4b3f8..52028b8c7c0 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -16,6 +16,7 @@ inverted: true species: - Dwarf + - IPC components: - type: LightweightDrunk boozeStrengthMultiplier: 2 diff --git a/Resources/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml index 85d074ffe95..3208627d76a 100644 --- a/Resources/Prototypes/Traits/physical.yml +++ b/Resources/Prototypes/Traits/physical.yml @@ -8,6 +8,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC - !type:CharacterTraitRequirement inverted: true traits: @@ -26,6 +30,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC - !type:CharacterTraitRequirement inverted: true traits: @@ -44,6 +52,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC - !type:CharacterTraitRequirement inverted: true traits: @@ -62,6 +74,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC - !type:CharacterTraitRequirement inverted: true traits: @@ -88,6 +104,7 @@ inverted: true species: - Oni + - IPC components: - type: StaminaCritModifier critThresholdModifier: 10 @@ -124,6 +141,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC - !type:CharacterTraitRequirement inverted: true traits: @@ -143,6 +164,10 @@ jobs: - Borg - MedicalBorg + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC - !type:CharacterTraitRequirement inverted: true traits: diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 61399745547..8fa4b0e9523 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -52,6 +52,7 @@ inverted: true species: - Dwarf + - IPC components: - type: LightweightDrunk boozeStrengthMultiplier: 0.5 @@ -75,6 +76,7 @@ inverted: true species: - Dwarf + - IPC components: - type: LiquorLifeline - type: LightweightDrunk @@ -120,6 +122,7 @@ inverted: true species: - Vulpkanin + - IPC - type: trait id: ParkourTraining @@ -184,3 +187,7 @@ - ResearchDirector - ForensicMantis - Chaplain + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index c015ca79453..5f20094e26d 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -405,3 +405,33 @@ path: /Audio/Animals/parrot_raught.ogg params: variation: 0.125 + +- type: emoteSounds + id: UnisexIPC + params: + variation: 0.125 + sounds: + Buzz: + path: /Audio/Effects/Cargo/buzz_sigh.ogg + Scream: + path: /Audio/Voice/IPC/robot-scream.ogg + Laugh: + path: /Audio/Voice/IPC/robot-laugh_3.ogg + Chitter: + path: /Audio/Voice/Talk/pai.ogg + Squeak: + path: /Audio/Voice/Talk/pai.ogg + CatMeow: + collection: CatMeows + CatHisses: + collection: CatHisses + MonkeyScreeches: + collection: MonkeyScreeches + RobotBeep: + path: /Audio/Effects/Cargo/buzz_two.ogg + Sigh: + path: /Audio/Voice/Talk/pai.ogg + Crying: + path: /Audio/Voice/IPC/cry_robot_1.ogg + Whistle: + path: /Audio/Voice/Talk/pai.ogg diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index 6c94294e2be..50f70576e07 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -110,6 +110,12 @@ chatTriggers: - deathgasp +- type: emote + id: SiliconDeathgasp + chatMessages: ["chat-emote-msg-deathgasp-silicon"] + chatTriggers: + - sdeathgasp + - type: emote id: Buzz category: Vocal diff --git a/Resources/ServerInfo/Guidebook/Mobs/IPCs.xml b/Resources/ServerInfo/Guidebook/Mobs/IPCs.xml new file mode 100644 index 00000000000..7aa9b7b7792 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Mobs/IPCs.xml @@ -0,0 +1,52 @@ + + # I.P.C. + + An IPC (short for Integrated Positronic Chassis) is a type of sentient robot and is considered an [color=yellow]independent individual[/color], meaning [color=red]they are not guided by any laws of robotics[/color]. IPCs cannot be hacked by Emags because they do not have to follow any predefined directives in their system. [color=red]IPCs are silicon-based beings, so doctors do not have the skills to repair them.[/color] + + + + + Like borgs, IPCs have a positronic brain as their processing source. However, unlike them, IPCs can't be assembled. "It's cheaper to create a shell that obeys you than one that doesn't! *wink*" + ## Recharging an IPC + + + + + + IPCs can be recharged in three different ways: + + APC Terminal: IPCs can use APC terminals to recharge. Press [color=yellow]Alt + left click[/color] on a terminal as many times as needed to fully recharge. + + Borg Rechargers: IPCs can use borg rechargers to recharge. Always prioritize the ones outside of the Sci area to avoid headaches. + + Power Cell: IPCs have an internal power cell that serves as their battery. They can simply swap it out by opening the hatch and manually replacing it. + + ## Integrated Radio + + + + + IPCs do [bold]not[/bold] use external radios because they already have one built in. They only need to get an encryption key from a radio. By clicking on an IPC with a [color=yellow]wire cutter[/color], you can remove their keys. + You can find new keys around the station or remove one from a sector radio using a [color=yellow]screwdriver[/color]. + + ## Repairing + + + Welders can be used to repair [color=yellow]Brute[/color] damage. + + + + Cables can be used to repair [color=yellow]Burns[/color]. + + + + Glass Sheets can be used to repair [color=yellow]Blindness[/color]. + + + In the event an IPC dies, after being fully repaired, it should be restarted using the [color=yellow]"Restart"[/color] button (located by right-clicking). + + [color=red]NEVER ELECTROCUTE AN IPC with a defibrillator or in any other way while it is dead, as this will cause the battery to discharge energy rays outward![/color] + + + + diff --git a/Resources/ServerInfo/Guidebook/Mobs/Species.xml b/Resources/ServerInfo/Guidebook/Mobs/Species.xml index 5fb4ca741e0..cb74fd50c94 100644 --- a/Resources/ServerInfo/Guidebook/Mobs/Species.xml +++ b/Resources/ServerInfo/Guidebook/Mobs/Species.xml @@ -14,5 +14,9 @@ - + + # Parkstation specific species + + + diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..51a3c40058f8894b6c959dbecc8626d926e679a1 GIT binary patch literal 6948 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-3.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head-3.png new file mode 100644 index 0000000000000000000000000000000000000000..e59e1c1d38299df73afea368dde37d6c84aaf76e GIT binary patch literal 6916 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png deleted file mode 100644 index b6446e6a6d2a237fac4840a78eeeec583fce393d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 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 F1OPHk_Sygd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..468d4f38989f23dee11211ac4e86d1baf6529a0d GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR> zr;B4q#hkaZ4sx~_2)ORw#O^KNy@5x1Lzwgi9&dqzN@>EL4&S!THmv^fzwyPL57pTQi!2Qh2e<@1BOH#la39qmf`u$x~CsaI`7=j`?w?b zc9!Rcb+6ZLcek4^df|JmNJHkVoY?EfRhIm)IDc7pS$o4X3qJ0nielfVwAlQZq5fp| zr>Y~Rk&KDok`1qic^us-{P@`q&H3DU%Nx=IO&`COV8LxYs=HYKNBxs%WBk1@JbS{4 zC(@6lXm#Pz41hx~;DcCpSf_@Q$!Yi&#QdWVw_l=FCna&OyRlm2jW fZ#YA1uTVb2zJdsb`BuQdV_@)f^>bP0l+XkKvgVHW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_hand.png b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..05df57f392f65c0bc4a3ee49cfc12139662f24dc GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R58 zr;B4q#hkaZ47*w#c-sEA>aJn6&OUfaxPIow$~jyoH;7u;R+*q(>^-7}rq|8v=bmN&#Y2(Wlu7RkN6NknH- zz_g{ycL;6Zw&>HWUixg(PhtNZY_5ikcwC1p6~^cq_+#DcBfBhwHgGLC8f+Y#G~pp{ z`sXjNY?!LKjuh&co%tXg8mh>1*!wfb8>U4XhvJ>P_gnRU=y>&eSN})ScsLr@q_c8T+9?Mu9%AhJp}=mc>j8GNKF*S1@q6vpQI4F(9OZ zWj05x-4M4v+N0-ea*o`tl#@pl59mzy7MbkD_jF;+?YGw&9GTi1#C(^nU|6zj%JXck z1Amo{KNgIfHuLq@Sw+$_f><}OqzF1pKKWVZ_g}e{kvd{8O004|-nhqf{<*Mk!T$Rf z-$tc0EuTEoM@>(E-xI}-y8ZmthFbocZ@-=7sqyIX$BGR{ zQ!2S{Y%{a~<;T%rxm#>MmThnN`!&-jPg`Via{HrSKV0p^ZpbywnVe;`@1HmU zFSZD49|(CjS-wBKI6d-Np3`}iWR@8>bK0)IZaw|f>ASDqz30Y@FP@k$$|ifpEwmy2 zPl3f3A*rMDg)U2YO=q(_I-czx0-p+ z)t2ciMjS{ma9DpmdyW1BdyW4kR;7zYgMR-$$dtEz_HTi(wvE?&!x`sFh}Uu+bO~kP z{P0-)!||t2H|iZ^dNE^{(m|2rPhJ||xk9SgvV?UW{H@!4tfOrA+eyDSa-Q1Dw9%G% Z|F00XiyyiDIDyHA!PC{xWt~$(69BkT1;zjX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/meta.json new file mode 100644 index 00000000000..118c3f613c0 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_arm.png b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..27ba8e0d26357c9cd54b49afee0af39e0b6bd72d GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VoI zPZ!6KiaBp*ZOl7lAkbF7c*`R}iG-C}Y}@uQCcQay;@ZUJFK#SPcynyVQfWc|g8~az z1zqRrYJ%^9LI|G&QcQsi!)c+d8p z-P^dbSf_N0D%-qUYvwU&$qja`kJlarF{Yoq{NwINV-7+8xi8G8)%5*-EWTW=|9WIo zFzcD;#cQr-|K3pRsBv<#O=9re;1iGE^6p5~7vo-T8e`@-SwHQw`oWv5&PzJdTDH$K{0O}|=HYUj4; z4Z-sd)a^gMU}^ItwaM!DL=QaSZ)d)>=;V{m?F?%3RXCSB&KKVGNVUON$mibkKei=% zST?Y>uGM(6hhwFGLyS~E&;WVAt%iysdcDWDGj(-OnJe+1saCKF(>ae=YnTh=_FPHv ST=p3l{|uh4elF{r5}E*Bx9Y|K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b3dd55b59026035583a8bfd48f79ac1ea367ef GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR} zr;B4q#hkaZF0O1b5OHy@l%J+BEkV*OVXaw$L57pTQi!2Qg#le+P7tG5AKO%e^P6=~2TfV-($M?3 zBlmXJ#Dv)EM+I3c^EhWLJ9(|t_5OD~hOGtj(q)48MGNV1pE%ksc)ajO2=D6mCW`%) z>!!S))^eI@PsaUUc5PSJFa6e3O5SdG87$0w+qn0){Gsr>mdKI;Vst0C~`p2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_hand.png b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..716f604b4f387a9b358ce1ac595529e3a544b54f GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R58 zr;B4q#hkaZ4A;3jh_wBmzQ;-T;!07jPT3A#jkjm{RHURg@U*(FD19fhb5eNh;n~L@ z+s7*{o*{Gm`3%ixHO(@j3`HRfCjuE2+*uotIS*!@dG>45%pVqvfg)!kr!8EirOheN z>R}++o;aaea_yS9&L^{$y_~c@@!qM*%}hs@u}pof=W}_B$BNfg#qX9i6v|BBsN=o5 zA$;>Q$>STZ{^@7B_teWH|?R?qKPlpzAO_!%62~}Zf3pnzWm6s#~%-TtxBCM zt+GI)>&U({DMpUdQZL?NS;>@RQ}X9-JY#fP+o?78-~Z-Z{Ge?2&W%0qt-mwOx2e5; zs;E2hYv++;$$xAWLJr+#(#X`Rm3sT?_@q6HdyfD3;ZzarkmGs%;j!iaS#fv_?&l4x z0rMvuTcq*FeSb|xR@VEQ#hY0IK4s3@H7!K*!FB(hyU8CuR=oMubo}weyGxV88C3mc zA8oTbI;Cdb^Sm6U=m!6PHFk@6b3S$Y-kZ>(wt;oa%st1$9fUb^7^l?i3}3Ld?_!SG z;ky0#CA`xb9u{=Ot-t;&j&WAK)!bbli*{~UcTgzcZs);F&-$i=2?>77gCD=%z!DO5 zaZRq~{D!bQUKNs-8(0Fkcc~rx{(OHN=ax@jpX|Jy%rUK@%6{JE>Cc@$msri6{_$tc crlbFv%PuooIrTjj1g07WPgg&ebxsLQ0P@TVYXATM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/torso.png b/Resources/Textures/Mobs/Customization/cyberlimbs/morpheus/morpheus_main.rsi/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..49afe13d65a365fe22ea3cf4c557e16fb93ced6f GIT binary patch literal 758 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V0v zPZ!6KinzD4e6x%k1=>zOI5bybN3re;rw?q8SnqJ$JK$W&e6Uyi1J^r|lGlC$M|yYv ze6}{f>V=PxN4UBzXQi~$ZKJQ>LrVLXM71=tcr?J!gM6WkKi4+={#*B~#(u8fGmBY* z3|{O-vT5u+-!@;&2P$ zqj~93v(7H_SsrXT|NJgD*CkSVAJ%UW=UT8aZvEz?Ns2$$eB*C#u6X@GXbTG?!&Tjc zi^9sx92(z?`U2A?oSk-h>8^wOiC>v?cUA)l`R*pFWA+!MwwZm zU-I=7=9%(*?OF21*G{@k%&dR^^7#}|gV|@}ZmwT5dE<)90bd_|_6A=0F6Rp=_e(gM>eeJq-u|9r zr%S}`&&wuXj-7Z=o8xe`@{BK%2`}FBPOpr)?pf!{F0kebFJryNr{F(7PR&@+4NFQ5 eERzI&uwOXuwqf-uCP!dGX7F_Nb6Mw<&;$UDQd#N% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/head-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d89df4071be0d30eeea7a57f83e7371d4d68c478 GIT binary patch literal 6405 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 GV*UqI>d~A4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/meta.json new file mode 100644 index 00000000000..576edfc9c56 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_alt1.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99.", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5694178c58933a862b04536be83366913290b86 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKrvi*LB%Ip#z>Sjv*QM-d^9x+iW1fdf~ms)O(Lk z)G;Xf&*hffw%(zwmF?NOfDJK;=UmqLPvl}SSh{v5?~96=>Yv{UarRrMhKWmD(BHHE zxqyzqr6d+55Gd;Sy>tI7bE(~8zc)?anCw`d*4Wha=kb?Y`wmQzn|e8H_MhYCGrDC8 zuZN#M^~d@3ScwaHO8U0s$uV~sf;=yqe@mKi|5sFt`!l%yn~>+L*o!bQ!5iAD`OLF0|P4q16}9fDijU5`6-!cmAEy;$h|%W)Sv;kp(HamwYVfP jw*aBXB*f6t%Gkonz!+kQWTp8ApdJQKS3j3^P6v%V8m z_cU~$nOGRJtf*{5wf;obD~7GJO(vF1VpU{_*Jg5$yecUmIPw36Lo%6%Z*6v3{Ben* z!CW4b3GLwq5^B#xXJo8nKfO+1#<~sZHjn-1aWQNNP1iDb%voe~bXv2~{d4m^^cWWI zpICgD|H6Mx7Z6x-MY*Uf)Bazdcpk&Oz3=iR1T4Nt?brX-c)7p#<*j`O+R~p~`B=Z; zne-diU7c&+toynrq-t%xkM{14jw3Y;-WkrF$_u9%0DYrc;u=wsl30>zm0Xkxq!^40 zj7)S5%ybQnLkvx=OpL6IO|%URtPBivor9}TH00)|WTsW()(|82`WR4y2Hb{{%-q!C llEmBsgdUR+LrW`T3o8StC3o&|+5z=2c)I$ztaD0e0svMBpm_iQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee57febec2d28c0e8f13b90d9bbc3537c230e8e GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-ri8;JD|YBdLgd)xAeP1 ztp#&$up}`VZSvhSU7=q1)h}hB(g**&rqyVdE>2B5EoJ*FWs!S-)zfW%_CNjkDrFJh zOkHcBk_La<{h#E0Bi^&QNmn&}%}X%3E-bVEtb1i&=XndDylRPSL`h0wNvc(HQ7VvP zFfuSQ(KRsBH8c(}G_^7@vNAT&HZZUB nQ;SOya|;l9OhODTt&AgTe~DWM4fwZd?_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..fcdf5bf6504450677c875fc392fc0fe47a0e3dac GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-rm^AdBA|jC2;M-ztV3P zwO)zsVtJ(0+T*+7p?yK+A+6FhpjrloH|ryR>wZ=A;VNDlwADrH>8@h$Z~f0JKQgZ~ zX9me1`1x%8pOu`C?>gi=`WxKi{gP#SkX1~?xL4gZpbaRmTH+c}l9E`GYL#4+3Zxi} z42(>44a{^6jYAAgtxSxpj7_u+46FPv9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..381573480ff6d90351ae0af543bddb3e9fce2159 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLK&Vejv*QM-riU!c))jzs4e5DN?Po4sDLDOO!(2OYkJ}dm73XaG{Nc;&Oicye z@M+QBj6hWkA672C8~gB;ocy$R_Ww_B-R-2U$HuVXJ3~R5A$OnR5l u8Z_WGlw{_n7MCRE79jMPgcw>{8CzHxKrOj*kJApQhr!d;&t;ucLK6UTb#hMt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c502e77a18f8d3cbdda261fb671b01f55e2a062d GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLTR2Zjv*QM-ri6YI-nrnd~wTmhwFt! z?>31aTDnN?nvUuJmuGSu+?arNMP2{!#mdG$vz)X#+BNi zckUDcn#RE3?z_IMb@#8D$zNjZ_t|gPo|0t9(6Cj!ZJM%FrasGipbFIz*NBpo#FA92 zAvZrIGp!Q0h8Vfm$AB6% s;5L+G=B5^xB<2<%^q7PgT3Q)fSQ$VqxpR-x4ycF0)78&qol`;+05H#TLI3~& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/l_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bee8acb480870cfb33dffe1e0a276e229de035 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLf1T9978hhy`AC6b=ZK1<*A+f|Ci-W z^MzmdPnz?4+LJA|Q=FJGQ#>_IHWYt6s=c;VUt7?LL$O7`X&u7{>$7L~1sQf(>1w#G zWW2q5smSIpdfZ)cX@M2F^_tIe_irmW#UoJFx#+F9$)85e44YNAD?Lk?ba%CJ>MYg% zXMbVp(k*vP^lPK+XPQWTlB+4u#rnI|pt=&%b6IImA0u zAFpM7P#196<9K??A5Xc99a49BE3zbnJKnHud%M=w(Q?}U^A)F_&pYspb;8qv=}v`a z*MUA%Epd$~Nl7e8wMs5Z1yT$~21X{j24=d3#vz8LRwhPP#wOYZ237_Jy3WB>C>nC} zQ!>*kachW?dwmS3K?80>NoHtS|DP}`=-#~3Jpa%=2hVj6*!X;om>c{I{F3r* zR@~zEQ@IT^K?Vx`^nJLya+!38={FW1^9j$StDClc{K#eU?z~0p!P+N}vy0CrMcm%@ zzK}UQJ>?hUGHH+F&#RgqTKzln|LJP=6V(h8qx}7>8q$9QeWY6A8c~vxSdwa$T$Bo= z7>o>zOmq#*bPbI|3{9;}jI4}Jv<(cb3=DLggR4+9AvZrIGp!Q0h8Vfm$AB6%;5L+G=B5^x kB<2<%^q7PgT3Q)fSQ$VqxpR-x4ycF0)78&qol`;+0KkVsn>+iN=5ER_0bU0?`BcAM=|3X@Pm?QtQ zc{nfAc33obr-690;zdCPW5dm5zf}(f?T&eWDw*K}AIF1rzUQs~o(TOddcA&o+5W#W zmaJ?u4C?kbKl4{m0)f@;r=PVkwpH(DU^Z%h<@}4Y(=x+H|8Aezybh_$+jsqadg4Dz z-o)l#tL$%e$XmdKI;Vst0H{ct4FCWD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..da79cffbc9ba45c8d060d1bc1ce9cde58b8df52e GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-rg|eI$*%#92l$oJ-$Xf z{={sn7N_F@?aL0=Pq?Tgr^^Xc%FwW1O3rRdh*s;Rvb-OM&Tvl6DpfI=GcW)6zw)pz zK#PFjN6dcZ4Anh5-pHG6;n{n-Zfoie2KEs5%A<_CPr4qCfWuDRt5&T&cRhE8glbfGSez?YlxA1eGI5U18ze}W^QV6 lNn&mRLXSy^p{13vg_Qx+k~{Y}?SOh1JYD@<);T3K0RVN%Z65#t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..90b5deb87c4f8e2843cc28b6ee6204d88595d703 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLP?%3jv*QM-rm^AdqhEizv z_i8miP)P&-&G#JJgyM3(@v}#@?LAw!HT4Ih=K|y2O?O$Y0_9apTq8nXaL6h@q*KiIJ7DiMD}(m4Sh-b8r=khTQy=%(P0}8e-&L9|LO8fZI@# onVVW%l9*e7&|?x}XlZ3^VPycdn|8N9+vRX0k5zQm+Yg%@ZuBi;DldDq z=+(RhT9QCD3?G7nJ5Bc={8(2KwMycZXQ@4F=9@}}AIDfDxD2@yytjfJqFUk_QIe8a zl4_M)lnSI6j0}uSbPddO4UIz#O|49ftc*>x4GgRd40N4?t57uL=BH$)RpQnVBlr3k vP=f~ChLX(O)Z&uF+yaCilMq8oD`N{Q1E?i;?s3`y^)Pt4`njxgN@xNAZ##1j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cc6b71a6792ccfb7e68aa9b429132e47a62c4a GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLfM`!jv*QM-ri6YYB1n&x!4*V^0?~L zJyr2l(JWjCO_~&D{Le|BG&d|)6{z@*5C8W?H)9W9KFy%GTXaqSCTAeSIz;%vthqZ@ z>{4GbiwCHP;m69CF0<! zC8<`)MX5lF!N|bKMAyJf*U&h`(A3Jr$jaD6+rYrez(ChIxC%u>ZhlH;S|x4`F>9ZF$poWv@*7^GJslg=N_jWP!EHrtDnm{r-UW|!~b$? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1bc5a60daabe0bfa7b3e84e9e99e45e4e6efad GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLMJ?3978hhy`8a<_pkvEi)Qa(Mc&@W zk#DZdJi5-VRq%kT%T1MuOMYatc>H+Y9N^p~;KZTWBJgQF!~Kt|=C2oBy=4gp@9Gz} z`bTwUYvi4>itF-C%Wvsn==;=e@LK%9o0PZqwneY1YehVMF|Xs(Shi{U9KJWHT7Nm_ zD&-$EmQgz22{ll9k#beQ{S7V0jE^=suslzxzr? z;)Xzv?HRrslmAZr^jOz<w7FGsOOYYp`v;*p4@O1TaS?83{1OV-er8xiq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_main.rsi/r_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b85c3213d4cba71eed8143258bd0d9d531c8a2 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVKtWK{?{jfLVG-2978hhy`5pm*J8lK;yZ7$`y!k6 z?Fw1}jvZqKrTt3_rp{+N)9{m$Dock5t{?8~^3PpRllx zr;1)IIwz>aR&XT#(2Dp4X*H|tbA!(?_|3mF!{(Iw)s)Ti47n!+rzN+Xs@m6No4_3C z2QrJnpv@@k{f;;FFLEU3O#kb9|EAHGqxanlF4xO%k8Vq`bu(d+l@sK3ynXmiL+wrb z&iw5>lU4VBi2qi??Eiz|w}9VjIe%?epgF1~t`Q|Ei6yC4$wjF^iowXh$VAt`OxMsj z#L(2r#K_9nMBBi?%D_O^Ik*Z%LvDUbW?Cg~4KZ@Bj{!Akz-=hW%uOvWNz5%k=rIW~ cw6rp|urh#Ja_1hW9Z(O0r>mdKI;Vst0N#FOrqfn|5uv{(tw5I?Kh&3|XtW zq=F~2ipm=${65R3dV$F_Kqgmuh6DGLEnBucnfzy>dGggyg}b(gxn=Mln8x(tt;Btw zof^Cc+*sP)|71S&Gs2R0f5NZ3e~$iGD|4T@vf_*Thr5LpD%#?KjWcWPckgScn^r%q z|Eiy;tgNi)?hck`AJ50QT-vzm!=EnAe@`UL(pDbRS$w?UoP@dx6g()uGlTi3>Ku{X zGyeSg{CnxCQ>(f^U3hp?FHir&k$*Yz(;Mz{Een>2J-_|Qo1Z2O+7C=E_JoT)@U^V& znz;C927g8Ak;Q$h9BPkVzAO6T`)|i(75qH$vTvi}=5faP>V5yMHR0^byYAXN-!)?V zzZ!(gS2VOI?(gU1mlfS^dnd!G;nJF>_6zD8Y`A4EwoH2RWXTErMA!54Uo~EQf8Zd` zt2EiE2cC(Pc%{zK@tI$~W{<)2`4c95u>ZjNczgXq?WdW?fsw0P;u=wsl30>zm0Xkx zq!^40j7)S5%ybQnLkumfOpUFK4YdsntPBjqq*uhEXvob^$xN%nts&h_;2}_h2Hb{{ q%-q!ClEmBsgdUR+LrW`T3o8Q?h$VOKaoPd(FnGH9xvXSy!*yulGG4sLOu2 zDCGRD6xN2Vjen2MdU`Hb|?yCT;7UYgl&foZQc z?zwdG^y$@?vm2RDe=!zrEz+6Ww9otAqLW58S;>93M5aHSWV9|s3+Vcwl?Q&r?G|z0 zwK*;}_vQEb_9mfX-TJR`|5!+KgmG=R-+OzyrNFMHE!-Es)%Y)Nt`t9@Trl5q(TB$^ zjB-AUn=_TyKf5Tyae1OcyikLu>GqOR7QerLD}6rBk!;Mf*|xmUX7b%xHSgZVjp)`RBWH8Q^Q)h&D{nT8)mNLniMcehEFuksrthySQw$|anM1_s6! zPZ!6KinzD89P^qD1RMgFuM#=O6#Z`c0ndm@Yj&`EtCZboo_jiER@aik(>(!~yzWmD zm9#PbX8h_HZ(|z+lUQTrJm*!>pDLbvz1{czaTTxCw`X@`mb>2G#v3`!^{vsh^4XIu z)v|hbY%x7h^~Phjt&7>J+3|}Ol{H={zrFcpx>m_6?g`(oeM{r5`1)tvYp2L*=BFoY zwE1o#>=1js=+((@x2w-H$sZMQ6>LlFIR4o1)cT&iXIU1w&RS-vGk@T6|;Crm3sLqA4J@4FtERe!kd*wsBRr_AWVWpBfQ`@%mM ZLe@V!_)Bk(1u&8rJYD@<);T3K0RU%m%I5$8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/shellguard/shellguard_monitor.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5ffd6c10e8c2025bcab45baf913d4a4d4be840 GIT binary patch literal 500 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 E0WeuTx&QzG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/l_arm.png b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5f646e36e93793a6792a6fef2f4ece375e2a3b GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vn~ zPZ!6KiaBp*ZCu;zz|&U0WV=&X2g}VS){F@&A{qpZ7^DpxwM3-c5}33cl2|t#w(Zfl zWP7)8TE&fcX5MQ*4&X)n;n)ld+^(6X3GK}M9};R*(h`nqEurTst~D zbCy8c!r}?*YtK)zIjGdow`P+L|MAS*VxE&O=$;nz*zlLbR*t{wce|MH`SqbGWt=)2 zI2LR#UGinWrPfFNFX0l00vR!V;m+z{p~ZlZ(ql3Wc#(D6eMc9Avu@=pw}~9moZ*5E z*I&2VoL~D~Xq}Qm#_h7(Oxq@__%Y2|X1F@@+Pt~Uvst9hY*@*p&S>(d!0nO6v-?a} ze!u@Mm)?9WRD^Zas!dX-3RW?!OKe@d-D^wV%d!2BEiQCEwm6slzb0o=u&#pLzo^Lj?LE7ecHAkR_uN|f+P?Q6 z*I6w-DZfGI^xj7ax3^uKb;r24>BOmBZCQ-h726gqV^4K^trOqWk<3UG3RZm(U(D#A za@%It@%d6K?guD8I5Vwc{musUQ2ceJ+57?Zau}t%H43KlqRqT1v;#&W|CvSbuy?rcO&*;P_p)WCS zcCCvvtGl?L;e;kJsNwkr0VkQ`hNmt6&AsxQV;$qPRL96^H_v^t_uSk6Kdh(*I3k3$k>7rvQVI!PC{xWt~$( F697Rp}uaMJo=P_%3{39k;6Ef`C9$(91_Pc8gUm**$jUWaJVuVKL}D@FXed=&AV| zYQqjV-#NR&r}6U3mctJNQh66-9J}n~dcfwqr^8y!0~Jv#I3CQo^ZvVr<*z51Tq_oA z;`r3PIJk;y!{<#8^a}qURXQ=zGc=%zYr^TLi*C(36}#Z|u9Ez|{eN0!EU6OR5Gz@G z>|)o#AV!}y&P7bK=Bj7)A5wMO>-PI!ItNytAUt_ajnVh=67z%GZ~OkueH*W{{{Bqn zX)>FV(zz3!w&7xzu3Y3%Y-?8HB))miB) su&b%e->G=dQ~xthZ+UjyT#$1XFgY-Iy85}Sb4q9e0Q9H#)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/meta.json new file mode 100644 index 00000000000..f30906990a5 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_arm.png b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..24e15d419add82acb47ad75991fcaa480bb302a6 GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vn) zPZ!6KiaBp*9qc`1AmD0$X`2K0#7Rag7+v%=6?zN09yl?3gdEUxIb~`7;^6E3QQp-z zN^Ra8O?wvmh>TtB^Y3 zPQq5bvo#0$4uKu)!!RY8X@QI|1EycVQcGkHxq5bfXWg$TBrr+7tx@L7X;1lK=`(hMoDWuW+f8$5JNf%miJe(tj1r?y-R7GQigqfP_Z@%i z{dYHd=ZnkUv*vBT?d|__Nq54w_pCE2DkKygYxqu7{;yxE^;U%g%`H`o^WR>c Wf9zw^$#1~eWbkzLb6Mw<&;$VP)YIVr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..f04c2fd7a6452ea43d42a3d9ec057485521fcc10 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|O(o zr;B4q#hkadE^;;-h`2oreqm(Qrft#oc}HKih2Jf0UY7ZjZnPixUmu{e?@1L){3P>7 zG7N=$4HoPUbC?y*F$z3q=qP45V#$ChoXu4*FTLw^p-j&0Z%H!OWA6W)v211Lx>XE6 z4_+_rWlz8V{l`*Ar6rZ~*6&Q(XOo@Vv5Mj2F=w4g%sonJn$J&dzP5_1p#Jj48ycr> zRz3UVEQGMo&SLJUPJ3{N~5PE2H&pv(xAxE9BEIN{em_i3pdO$?7M z>?zZ+5)ib#{)q_5(fc|4*j3>c0@dVlj3XRofTbG){Q` z@ARfE8~wX?MmL_tfiVFY$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_leg.png b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..653101e63afc2dba2c588d7a13c3c68741ed8d73 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vo2 zPZ!6KiaBp*8TK_B2)No`l53XglxbEHe;^?;r?shhiSI$frX#5l`%;ysaPhO~oZXZ3 zQS8kbn;iAiKlo1>G6wW; z6R$4*BIj`W{dZ~2gEjNcKY#zd!Qg1zdhwv9p8*F{y&I}6bRF8;I(OO2Pv%D-n*Nx?T*LS1h7zOBzTD{RTI&Dy z97x^pqfqAVjI*=Wy-r)nGLb>-|Iw@K&s?8ok!W`*Z)yeShnL>FHl_srD@l22Q7rzL8a89xytY%_^&H1~gIZfq)%j`ctTs{$K4BOh*w_@L0S#7sn zUGP)RVaMxDvbEQZEMBi^@@V+~=y6lA%(Ck220-~Rp8 V{3{I=8-Q`o;OXk;vd$@?2>>Xg?}`8b literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/torso.png b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_main.rsi/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1bd42ca6cf6a01b57ef981fb9b2d359ff22b4d GIT binary patch literal 961 zcmV;y13vtTP)n>3aA3A zfGY5xD)38UcP5i@a=Dy|#bV}kI+^8iX*QdUXslQ8sqZWJEYdK%)9ILOHfze|@`d|k zGBK;w%Cy_1S#QeSkF;?c9sjYfk#9@hg1KdhewU%UsvXgat?ywd)bkrLy-vin9JRKYKlX1gSm(bX7IK(Y{u4aQjGVtDg3XarjHQNkPDmOaB9+FL(Vsph} z(Sjus2{RgvOr*&P0kbGkqFSw9LglmB%(mi&$V386r&9~o?RGCB;72lfsn_eyVzIdDE_oD-_5dVF`b&_A)F@6rU%3N zU-f$SdFP)A<)5;xzFzZx`&)kJgdW-B&u@JT+r8ladv-le>FdY-U$1GHwtD~O345;R z+?VdZ7-G%P@^%{c6i(^>hngjvWwK=l?*5kk`Q`7e`R#Vc%F9zjVnrFmw}h?sTzv6^ z>4kb;2EPlAH{QDY{`hJ0HQ0Fm`F6VuwaJ}U^R89g`n4}!;^5@}6BKicX8pX7Yc_l3 zOKzT!)mOjpL_}pCynmZ@*6w3FIfZ_F3%z1rB{appH^9>&;J<)X@0FKLEFKLwkb+uc z#MC((j7+lH_r~dmomug(`{<&RX`34__t)7Su%45^yFejv^4GZU;m7XW{$;byP;R-K zylLf;vRfBgwta3athoGY^*_;LvUyvh_T8U1}1VMC4ZH4}aHP ze;xPY^YY#O*)x9J-P5V@^Hb)9qRwRT1Kd)3GUq#LF$fegy}nwe{-EK|*XeH?TcLo$`cfc@K0wH@nPR_D!zGB>PKdmi+JRb3arHPO(g~ rm@%QGZutw%mok$5SVBff=>vychiBo!m>X|_>6*dQ)z4*}Q$iB}Lg8x6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_monitor.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_monitor.rsi/meta.json new file mode 100644 index 00000000000..9f87381cd87 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/wardtakahashi/wardtakahashi_monitor.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/head-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3943fac0db8fd59bada58d5a5832f077a5b269 GIT binary patch literal 6832 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 GBmW0Xxc`Iz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..baf6e438f8192b2d45e70f9f22580e33be77c1ec GIT binary patch literal 6889 zcmeHMcTiJXw+BQ-q=`}#)EKH@NC*Lv&`Br(gGd!=9+Cqjlt2=?6|o>FO`4*VOOflP zHz^{Ds2C9oMMOXW3rG=ZB8cyRecm_o=FYtDKTqbIoW06#ul3t&@7a4!l$E8akicdE zE-o%1k{Qt&`Zrj<`T3yd-?V@}E-nFlnC)J+H4qH*XEHo!J|K)8>JP%e5Sj-USID!m zG)Jbawy^P+n$xaEOofytwd~-BoQYMaR|U4kqh&|mr{ zgSzugb8)48F{6VQo%%jS@1E%0)5vi{H3Zm9tE)X4xi**9_I8_TGpucN`h!^eY;D%Z zz{lFQuH&Oq0aNP>UyScqIu`$gGc$a(bP}gb|5UwXGp;>%=s+tan02tEVR1~C)2Yrn zEg_a?IhVE7^pW=Kz^b^yXv0c2xCDonHKCks2dyQ*$j_Ka3p6gLUm z3i@qIsR{7I79VT&bm)B_;TBijtGY0v=!MtcIQybETGhU~unSe|1iYc8jqJR+)1qNf z)6J!%Ix?ctA+%IH45xV8M99!mFO3f#)NgWz{^HKUpoRYoOse^w7+kz*RyNyo;r!Zq zp0PBknoCj@p?y54^-iYeO1JVFw0`nRyjI5Q-Y4kDbvX;qJ%s0fD%DFQN$Tu5=Mqq+ zVNupmpo%{sG$^MYcS>(PusU+{{^O#P88QNT?fkW(lwE3f#Jqi4^5fjicPNrhBNk+K zoyEOMwAXvJjP>olncR*Ob<(WmS&XPGp%rv1z+D{j8_) zpovsKPQ2-+z>49#jG@>xk4s=@ce2aX#{w!v6(5wZ6jcROjcJ7Tq>KDZI;t`Fyo>}VX{u4 z<-GHec$Y&Ju6n&&4^s7%Zz}VIxvDz{8H?E6)qQiYwccdn5HiJM0=KFAaF7#q`>V<* zSXsV63_N(F%3QhiP+6g2CXnfj-+Z&P5Xn2Xah3Iw`(#h$YwhU%B8`5>#h}9Z2LsjK zt-%ss=%Z%VEytwf^yaD>VtGpf|GqjNaBWPsq02BVrQH$zE+7SyA9B=dsB>rSd-%>N zR({hCj@QUT{}NA!sUWU5Ti#d=Njx1N^j5WXv?w}KxC3{LXiGB z72=qRqOxfx$oIQ*P3;r1gXHs3u&mvil@88qD8ileB5dqjSfuv}AEBvsiKWA%THIv> zi4w5exXflQcT&$wlMA8crDr~pM!PcyB)}`LGq!jFw$7{NNs>?b8V5cgNv99A-ScKD zBut$S_i^+NyHwOXT>I?76;kQN)CYZeQ||Z&lA8r1c9x1{S9kI$T3@KCK}%I1f69e>_!)k6CBS zcQ%oAX2VH2oggQN#8d0D@g|KhF>`OF{mgx0Bgx{=lLTf-V%`=Br&{W_faJ@q7pF&b z)3N>!xnvGmjBS^cm0dU^xke|%x}GRKlRv_OJD0uKltNQC?G_>IF3=K}Q92$WM-Q)< zvvE%@6WaNf?)y0Ph1VJK+N;KAhxrOz7kBfN+(sK;p4r4gPG+z~TXAN3n&!(@nIS)QtT^X3;J&9DOU=wg(&CXl_8M*aXldP$U@Wctu2LBKSYu54Li z6QZPdyCQ-R%{h^{B)HY+_0wAs?`*?Lqf$LA3(It?a`zZ)Yh>_n@9(@fi7mO!8=pAI zEbpBWXby*&>;}`#>r!uk_5Ad`3jp|$Tm`5MS`)bBe^dV?6DRK8y_~)H@L9FQ}?ct zl|9l{_os6t~u z!l@*%e^JS}PU$g5B-+G!!FZpOPK$LvO-4zy8T7^u24DgJ$8PNm5Wc6H#y}b?3p`$@_`zC!w8?^T2RGz7Ra)yyRH$VNEo3CKcqsNyy zHxBW(iyfcem73fbpP0#_ZEIYg;%|H&ytz9@KO*2>QYYY3OVOzyXWJ{>Ymhe?)4#!{ z^Y|R6mPVwi7f73IcvV4k=g|S3UAF#HVbXY~e0sQaH`_k7OYm`;_W8|Zho$)F>s5<^ zmGgZcx;kEmbKD#*6eD71f_=|KHR;KaKmilQ@NEUf=m7o0*#BSSEx6gW=em<9c`E5KLGUJJr?uVeJSsdn(s0!LMDMZnLJ{{~XuWrsH6$YaVX`w0pwDBD1%In~SRYUXshXh*1v7 ztxTg@9=LFakZ_d186?ogQ>M3xrM}`NKDG0Ww6mx!amnS=;Y>cRnz(1GJGr>HkJAVQD-wb5eHRJs9n%lS>zXwg$TYjzR2nM_ z+lvO=wbFJJ6%Rb8EOEn#rcyDopE)dvp_y4b%dGB-IJPa?ZjGd;%NFO=hVNJ1>b^mG zWNg0Zw$E$*;Ee$NzTWWX*H%S_r4@K|VKeE;@iE5DyMpYduicE@D(KD!M5Tr4RHmMI z_p$cm$>QMkmtGwjZ+nzKw2Lo3^&HXJZ5;*bvw zI{WW^k!C1+Fvy%bhw z8_Y%f9**H@aLL?LJ~lz=@k{6G^L%0My`U1fe>QP?pVPW6+@E_In**H^=ZT$&~`tF25sy2l6T=L3}01%%5Vo&Lwx`wr_Xl7wd&?d~%mJ;So!BOG*dICBjcnH83WCO4eUmrgfK13J3 zf{TaVm&HgpY{i7_tqb2vwt^8DOb~`q#i*hX#v!yIG+a*rro*Iq;H`-!-yootF5HXF z_QxZU!NI|*!Ro3ErYBMjhr=OJXe1hqfGiNKP(L;hg79O>E<=39Ac8CkljhH+G5lc5 zn1DMYkgW@cLweZv_UtZytpd>}&rf25i!3hC>M{MCcSHV%S7z6JCjJy^ET z=?G~JvKWC(3TPYz`mtqyg`iS?`1=PkeOA(;Qjnkz=nI*$pkCE}>(Z1&w))|*Oo1oO z*MG$eBKtQ>HqGNFS--`$tXWCt*FYfmAGp6+f6slz7_uUh@k9nCa5+2@Q5U}4Kc32< z(5U#8S2cA&(;cLM2#f~?dZ5rC0-#_u5r8`ejmDy|XdFf37bub+iw*cuz-1^1T$Kjl zXrVRG?iwf$gqD^T1%Ux^CKGgvfx&8G5$+x+3<3q24rPNUFhPLLVA?VmKDzMbpkT|MKh$Js zLQw%WKm^zz1d2jq@F*-ErD>~%#j9)KH8cf$>!6#_SWy3= zE26J+$_5Ph+WOk`p{-0N7;I%)-~r0l6j(qINL`5&!uqPBcmaN%AhdpbE7ujNJOzj%EchyP*^5cHo;{uRG}==wv~zhdBD8ULxSKXm;o2L6@tpX&O5qf6lD zVG8tvc0j?JZ+7&ux@wr==61mJ*e!Na1kYugDnInsfOZe9E&7GtoEDZ_Qut{X& zHE;R(B;>IR5pl!NVR{RRXlM(4dwEvs+k_H5{?dl-%^koqcgb1aGm}0b)F|})x-D8z zGQeG%%JapIP$1ejX<%2+&lRhj`|snJ+8^Q;Y$m(!Ot)0p6zc*8A>l_J*YYunmpA1AokR$&S&yoU%qq&26`9vsNKgc zT$$5n!4GNoRGsYD-;=wsXZG^qJ8>xPmFvZ&;YT9gg(>Tz1}Cv+l$OLbbnHUBTi;CK zgijK3&edwZwCfgWT{D#K;vHyCOW4>`W!%Pj)Oo(zcO5C-`aHdGYmnjT;L0{WGvDtKjCL^8G{78&i2 F_#Y#eCxie1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/meta.json new file mode 100644 index 00000000000..576edfc9c56 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_alt1.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Edited by Timemaster99.", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..48cf08df0799c71f1214d1c90ad4b07416d46be2 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRf@0=Wb4*&{aMBZ*OemZFb;cy-*+6wWc6@ zNgA)%f&@ORt{$iPoGYB>Pis2G-SiS+xT@(wO8|5zo1t2c`Iz37?$ z*22|iL26oV#=^9;*E1R-pEce4@Ngb?(Gf1KGZDd=Y^K*u78l99$A{GB8wK-apl$`nP=o>+gwwC$OE`Xg5P?cSpyYpA1tvyf!$7J@^Ck zplXS0L`h0wNvc(HQ7VvPFfuSQ(KRsBH8c(}G_^7@vNAT&HZZUBQ;SOya|;l9OhODTt&AR$B>MBZ*MFVY<3W6eK_C8C2EJ+ zqReJCfh OGIo$7icJmISTLSPEZp5HX~ARX65{Qjj8$mHV!T>|6F_Qwx$WM-MA_B z(+mga1x8mwS)}^en7rTcl*)SZaGu{A!R?)PZHIYtm+84FoV+n>TW!BTI=Lg*)TwZ> ze}+P5>h9RQ1G7_i2j@3bvNN!~n)`nB;|CTEf7}(6K)`)#W&D2D-#wLy+~4LaMF*K! zr*VJl&tYb;y1ZZ1{pROK+fURT;)_VyyZH@Bhy7btM<_CPr4qCfWuDRt5&T&cRhE8glbfGSez?YlxA1eGI5U s18ze}W^QV6Nn&mRLXSy^p{13vrIjhvlIlM>peSJQboFyt=akR{09yQ;Gynhq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..38b28406ac520501b1c3712c4707cce715612492 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRf@0=Wb4*P_CzoV@Srmw>LKOHYkX+JnW7(kTBk$ zA?h7qaN=fG5>rQD_y5(E;-7Yv3jtL#F#H#n`E%_`YC!NDKJLCeshPKa`LEhEsmt~U z=WYwl)pnb}iWv57t9z=idgnFUInKTF7F^~(Q^xF`YoqBUCI zZ#;h&8tM9WCNEgkhmBvg>op(7nHTs;d}V2_OV}oD(e;(Z`b&lE&ckJU?*SF5mbgZg zq$HN4S|t~y0x1R~10xe%12bJi;}AnrD-$CtV-sxy11kdqUFYB`6b-rgDVb@NxHZJc yy*>uipaHj`Br`X)xFj*R0HMbu#L&{p*wV_>6k^HU?(_>Fr+d2kxvX~=c< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..72a1d92d83f62f96c802c53ff862a40f432eb554 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LQS47jv*QM-rm?K*r34E`tX5Rk^=?1-dG!hJs+FnQy&)5GvZQV_ zRx?a=?b~9uF7B;|cLjH&tj$y=plXIc-h1^6{`VcvYX5!jfbD^MKeyb{+Zv~Mf&a^= zFI?*v88S5N5}v$Hh3`dJK_gJPYKdz^NlIc#s#S7PDv)9@GB7gHH89gPG!8K|wK6fX zGB(jRFt9Q(&~*;3LeY?$pOTqYiCaUA-0NdN4H|G8N-}d(i%Sx73lMrtLJTdfj4iE9 XO(B-t?M}Y{)WhKE>gTe~DWM4fZ%%_o literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d61d58b478abf8b0d8400a4873add0d512ed9bfe GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LiL_5jv*QM-rm^F+hD-c@{l{af;BCH z-|f^4O^JqSdOQsVl@pjg*5~?dda9?+$iPr@{7=!klhc0RTfgkmf|DXs<$^o|)ucBz zY~>+L*o!bQ!5iAD`OLF z0|P4q16}9fDijU5`6-!cmAEy;$h|%W)Sv;kp(HamwYVfPw*aBXB*f6t%GlD%)D&XL T-R|@YKs^keu6{1-oD!MB&B{Au*P1vvJ8|DRcq${)JuxxS+5giE&pi!JM+NJm6<@vCaNcF||JC>RoH=(+ z%($Tg2u{>H{EIu&`u}8;^pXUwPHCM@Nm2jSzx&WO@2Jp=o6Pek?kIU|q!n=cz_x>2 zIhGr&v@^Fe9k9-SIRD9wO9wJ_o>W(s-;BA_d1Tf_v7RHTUmQ}CyZ1M34E6nbpk=Oc z+(BjjjRJxo@N;unEAzDN>IG_x1+TvlUov68`j4RbxoY=B=G6Bou9i=CS(;&zt*B;N&Yt#WLH6p+ z!WZTp_|ACgb}HK$p>?XjAX6=IjVMV;EJ?LWE=mPb3`Pb?4J45&c^ZbM0CZfbE!Vr~IKk4cE3rIoRzm8mJj VlDpmM7l3*gJYD@<);T3K0RZ?Y%`5-_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/l_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..89106d6420b51af0765861f1f4035871a3081924 GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-Lj7#M{-T^vI)?!CRSFptSmfbBuOM{Tpx zcNX7wmhS{3+H-yRFSFc!XT5;KLuL_E>xi4S{F}9EKOEOhn8H#t_oNUbcX8_RduuK==1uBj zH#54h>Y~3vKEscxh0Xew+Za-&NCa!gS-x}02yD_UA}^B2io^3Sl?EbGT(4%U!E-I zjbf(7=66nt#P_k>DQ>zXTqAJ1UF=88au&vFzl19e{`0SX=UQXg7|8to($UF_xh&K- zyk!(v?;3^aix%nxXX_dG&#K^rq2GpPdx1l66H?_DVF}DDr$0Wqi(#qJ<%G4BM$=&Ys Q3qU;#p00i_>zopr0ABRJX#fBK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/meta.json new file mode 100644 index 00000000000..35c1cad74bd --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/meta.json @@ -0,0 +1,82 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + },{ + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0409bb02fe10e39a0aa15711986a2ec0eee3c974 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LT5c)978hhy}iCrwAn#`<$`6LOVkdt zMVXJK90J(+CI)>7Y2dOGa}?gu$tMsoaj(mna+y7;`S0gSIJmg{6P&p|ZDVYfg;h?L zOY-foq?ES?jk6}64BGy*=fwqwCp~4$-@W1xnr^W0&%ghHNr!~C8SmI*&&RO-#i8%g zFAnwk^E{WYy3?@u*6ip9h0J|f>!nuQur|A}*lK?MJ7obuAehK}%;IhHm#&v?{8dN4 zY)z{F$+vz+-n1M4tUR8279D*aKF{&)g@*h9^S~Kmf)j1xc3<||V9B9S0`!<_iEBhj zN@7W>RdP`(kYX@0Ff!3KFw-?O4ly*fGBL6;HqkaPure^vbq=mV(U6;;l9^VCTSJW8 y>tjF-8gLs*GILXlOA>Pn5PD2P3@xpUEv-yVA(q_jPQL)u!{F)a=d#Wzp$P!}wWVkP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_arm-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_arm-2.png new file mode 100644 index 0000000000000000000000000000000000000000..061988dbcd42c494755607ae168b8f38b53a7e1f GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LdQK_978hhy}iDXx7k31<-%dFiK2Vl zvaTgCay=_>pBVUJX2U7wB})@Hcg+`SosiJt*EgkF_SmnQ+dC{ATwLlVMqZo6IB~;@ zjtOQPo7|l<7Bsp~HQIPIW!{B`<0)^C?TB7qzfDkeVWW_8TJ`4oU50>RnrA?0dGY{r#31 z^VT?3?>k|6bFz%_3jI6F#qTVbrvg%aVtxfv^i%V#jb2_8fnHKAag8WRNi0dVN-jzT zQVd20MkcxjX1a#PA%><_CPr4qCfWuDRt5&T&cRhE8glbfGSez?YlxA1eGI5U18ze} qW^QV6Nn&mRLXSy^p{13vrIo2E#FD$+=@)={7(8A5T-G@yGywoH4X7~y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8b2b141aac76424ec9435115ceb6125ca20be5 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LfM`!jv*QM-rhLKc|bwH<>EoTZ3fvJ z0{t@&HMjb3ajaONV)>^$L}J?Bw;n*%3=DrlE&e11S?qp&gyZ2l8wo|*`EO3UhQ2++ zbR{ITF*LO@F|sl?(Kax!GBD6}4z5Dckei>9nO2EgLyX+( xV?YfWa2rZ8b5n~;5_1a>dQ3tLEv<|#txQcJmfY=5zW~(3;OXk;vd$@?2>@94a>@Vz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..74d17c3c7344fc756198dfaaa2b12d86523f883f GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LRp?Jjv*QM-rhLK$)L#Na`B*E&~5ElOQ!uU3^o9^dI$_ZJ^?)(s3$_G@UTH+c}l9E`G zYL#4+3Zxi}42(>44a{^6jYAAgtxSxpj7_u+46Fe2^izS~{XWBt6gTv}t&)>D^jx2^L(@F~ck zvsRAbULix8r3#-szY@@y45}rr5hW>!C8<`)MX5lF!N|bKMAyJf*U&h`(A3Jr$jaD6 z+rYrez(ChIxC%u>ZhlH;S|x4`F>9ZF$poWv@*7|GBt%* Ua<@DE0#FZwr>mdKI;Vst0ByB;-2eap literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4e6c3e1674f9c6d2b59c2ae1c7e55ae35c3caa GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$LUo=ljv*QM-rm^A+n^xO`j9<(LzD3a zc4b4gR^}U*5?2ceEwbGDV?UoqU-{FyK-)gppPpWNJ?(Z({Qdd;u91!hAG}_$V9lkw z@k}b=(I&6#R&9H-Y|^a_t9gKCGi*rSs%i0QaeMmgrk^hkGq^_Hep^{qEq9uipaHj`Br`X)xFj*R0HMbu#L&{p*wV_>6k^HU S?(_>lJq(_%elF{r5}E*5c7D46 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef9033cc0f5c4d42fda7abc5c1240c5d5f000b4 GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-Lj7#M{;T^vI)?!CQXnC0Xs!1h40Qrtsz zp2G*3_Z&CRT|0Gy^}m=xd+8`kPd_FPz11R8xyhk5701)no1%k(K+iMg8Z5Kr{bmEPN8# z;jw?hmnYl)`OY#;tDI*?3@xsg}4#l%yn~>+L*o!bQ!5iAD`OLF z0|P4q16}9fDijU5`6-!cmAEy;$h|%W)Sv;kp(HamwYVfPw*aBXB*f6t%GlD%)D&XL T-R|@YKs^keu6{1-oD!MtS57qP zHi_D#qsH+>Xt%QpIhN%w_5SXMZuS)mhni>0Dh;`S$R( z|F5OLOL`~gNSaCjgG;ru)Tkvdue;C`~+T;#>Q8V&P|AsUC_LN{buQH@tYGH_MN_5zk&C*y=S13E0-1! z)QKEFYp?S6Ls@{5_>*!y@c z7u)?mao~WC@@3}f`N}7Ho4dDUaXK7W_bHt9xW>P^FZUkho}07Mze-`%cdoeYlRdc_ zU$iR8EEkZf*sVPOuGIgAz{Szp8S@ua3veIcT)#{~koA!W%K??;ik7VP3@=hE^$xB- zYd?w2=EPz)H>Uny0UN|EJ__Go9sTfqu>8C$o#FfjPruki%=qD_v+qo!+etr1?l{v= z@!hH+Q1C}sWwq&3gHWT?<;;S`wx!diOh^fo;+$(?*t+(l;9|d|=qQ7>ovZuj*4=#Z ze&Po2iPe(JpA{{cUL*W&>I9wB$*%W3-+b^g5ZVxtS^93{CY}t@IU+K;e^j3@-oK;s ziPD>;!t3Mxt-P+dYt|M?tPW;q%&52O39>ltc<^M6$HcddH?Bt~X~=E*TQI}vLfxck zi3cLZjHPt+s#PsEn#>QG|M}ME=BDrs5q>*&*%us2>YNm0cV{irk%lkkL8gLs*GILXlOA>Pn5PD2P3@xpU aEv-yVA(q_jPQL)u!{F)a=d#Wzp$PyB@m2-^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/torso-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_main.rsi/torso-2.png new file mode 100644 index 0000000000000000000000000000000000000000..70271b0c3a2c5679cfb028d25a26a8aa94f9f7be GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVRds=m)-M$np`|x978hhy`6D3_pyP1+kFW=m0hP& z4IH!**sBA?&y_7?y~C(2AP_f2>d9)}B@=EkYyMYQmLhZ_ZW{jv6^}n{&V21^oKwA) zep>vdbZyHL`>heC6?0^|wemM|t$CrU+7@U1u;_g8BGxrlK>E`5o?lBJT4j0f_}5eS z`$wtzUcO&y49)Xih&fHYbX%f+_lo;Ab$7GX)!E*fhTLDzx9t6|>he!tw)EUGdKGur zR-IvU-TK9SR<}>QX;l8Md*W=f@>~g<2Zr6hj^1d~`8QYcf42UYU17DG*qy%m9XRs@-6uGJB&0(+8IS%ik2*Y!u#LB_EXX-QmV{X(z3BCsM_OFWiYZ zU68P=aPh%}&F)R1&c(rBr)W$sNMN^MY<@W5?ys55Y{I%re-&&_S#Z5=*^e1VlQS|R z&MjtTugbOHu9&kY{rREY79S5pPK)*EV^mj4|9OGAZPLydhQp2gw%r|*GZ)@*{-Tz( z^nd&Hm*)1p+EY*cKOFC4p|s@evz?s4B&J&88c~vxSdwa$T$Bo=7>o>zOmq#*bPbI| z3@xloO{@&fwG9lc3=FOsH728I$jwj5OsmALVM)H_eV_&nxD6$lxv9k^iMa&`JtiTB dmR81=R;H#9OYU~3UjXW1@O1TaS?83{1OTF{Uqt`_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/head-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/head-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e48ad79298c6e13b4296e34a13b53acbae2d7c59 GIT binary patch literal 6857 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1903f4bcc911f1c41ae013d3a156f7e752136e GIT binary patch literal 6466 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 KVN+t|6ZJn^tZj4v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/meta.json new file mode 100644 index 00000000000..9d2654d15cb --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/xion/xion_monitor.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/groin.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/groin.png new file mode 100644 index 0000000000000000000000000000000000000000..29ae064b0d64cb554d41e5663ab8f75afcf5002f GIT binary patch literal 5522 zcmeHLX;c&05)L4NK@A`eL_mo_QGu)^AqhdYuxgNfSLt**p@A$UAw+bP$KtNIATEQ0 zBQPL{h=2-iAcFgX3yy;@DlQ|U2&gy;`Z@s>&zp1J@timR>^`0DTes@FRo|^!w>xVB z1AHbLSQwyCsEK~QoM7bcroQyi$Zr{(+=)Wzx~7FjDuRJjtW+iuz)28Ru|x`CAr&k@ zp;W&=kBpHy%$hJPG>y`pq~9o0?Xz<}*DvP`&hM#`6!*mZk>QMjYT5jc%8xgXwe+?p)+-mTCbkV0+$mGG ztq*$@8`mu(c30(wG#%A4Ce))#!}mUzm3~d`bl3D)8qa<|qpQJXpK&IkaQ-^hl;HzcEvnw5a>&2)Y`g?UR1ZwNVZP*g{OX(&5ah~BuH-BMaj0{O`xZ`_fJjn_vioN3n zuDw3x!s&QS{3=HslP&(i(#&e~A(>f^^<~qgrSrBp;JiZ1s845Zi!I9C+q|21yNFpD zA9SmXyOc|d*jJoTQG2WN=u8F|E{4l1YCES_>(qhDv+13BIn@45qzl)Ad@O(Dy}!hU z^7d6G-&c2`Hv5h@?&SN~>S;$iN;R(|;06rIc^ zChJ-=k2Op#ymD94XGT5Mwc*soSZVjkb9a3@=Ypao=DSu^J^NRE5P15jqj0p)o zg>B*Q0nky^9hzX@Qz*|eT6p=j zTkKDTk^a$dEDk3J-^V58Bzbpq2e(h__hGX@w`!buFDo%Iu+Bkm;!FEAEv?SIy*uEW z^#g~lZ8B+F)E|{7Gxbf4^&Y4)(BIFk${1&|v2g9evIeUKE*^hW;4^g(+HS|PQCgl? z=vG$D4V6k8&bydSaHg{|CAz3d*V;1chx7HzPDJnsCZ9a7f{ zhlegN239q0uB|iH+89_cS~pyT902w zvxz$1F^o6sJ~n9a^OVWk*Gp@x+)|vP@a67H`72T4_uAf=mFJ(KKR{MLOztm9o^hR1 zpWpnk-De8}&(HpRz@ zUwLl(iMCr^JqhQ03>8fD#?>}@7JYh)PS)t0Xt?H%R=gyJzr4NKW;{5p`*lWJU-}|U z#mUeam-UY+GIfsDGsj2$pp(ZbJsRrz_8$Cj7Q4JB*(1nms%?+nna8Hx|0YJVuQfS{ z^TJE3~stY%E+I`dGquzVjx$ zy4nMU(#nQCJp=tbJwKIFq=4rCxY@zi4ZE&4v#d__N3-<(7Kko(G z#rddC;XVJv_x34qZ??XQju}5yYq-6kIVEQ6VEVM~rUDjxA?qvO)IFMT#yWzSf5!bv z`%~;1Wkie1WpN~6irPItjtfpbK8r5_VLnUq$fHwf01x2dK`M!ir&8!ncz`Kz#5+YlCKF)N z0fy5Uhy^kj$x0w;tXFC%J_1FfJ2Gh$8i)rO3?2eS72p{VkB%pisC)*A#NgBE6b%#~ zWO++uA^@3ASOf?mqEsx@bf^huxd-~W;3x#r7fE0epb#Ji$Qppfd`YVOOIIi?f2lkN-4k@1&kL?de|1WF!hjWm;B&0@l0HOqnpfFmKu0VTxO_=#YRbb;}J zSO_8YV>Dqu$>G0A1_s@cN+*M4Jdebr;i)7V1J4AICY9>MVA5%1h#>&JMwd$jic~-b zxeE~<5w4H~)o_KKJvvo$zSd8Tht%_cP=+Tl@M9>$5l4e1sw>8)XxYU7;)AVG7*k>p zyAc^ux{yjp{9Fo0`BE31fAAQchktMc1p50R-^A~Cy1vu(O$>aK^7riePS-av@J-6! zv+Msxm%*2hDM*aG0i`0JO5)`<#>i(Dnm5mfgYws$<6;aE$q!QBC^-s+IitR`w%KDW z5uu*KkL#uPr#^ZzifXAVn1qNL{W$KS$RCiulQB)$32s59_1P|-n1(CESMTlC;m0{S z?zZwuaNbl?6a3*P2OK{s*I^?9t2qvw85A3Bre7Vnkv6BfICtoX;qe2B)sbNf^?{{_ z9pqXkWI80g+y-0 zlN0vtl8dKji9%fxJnV6zUADqHaQ&)*&Kxsw)o^i8;?y*G_|ONo&_WA^k}?gS3d7J& S6MR>zA^f}oI0ro9GX4YG*1?d8U7c7V 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 W*3v=I13XwL#NOJ4RAsq6?tcI=B#w&! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..14e7e83c2fdbcc9c65205c02ae586db287e21ed7 GIT binary patch literal 6535 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�RfRxP1W^z-!hr^1eMr5HsEIm~w#z7kLUEp{g|YaMgxK0;Dk_l$Uf@NSZ)&v5-t*OX658v5!D{2~ zyi@ybkePvHLKiIF>yz%G$1_u}t7 zI)35(1NVinlXri|Vh4zu`M`=DC+0unEtpd0~hw@vFG`?L%r^a zTQ9|F*+SUa=8~1Smo)_dt80cY$pvsA@#Wcai-M8ykkh-jh1rj+J1vRo z&E+Ln4!pP+cxbsKF=QEx`!@NDB{V4H-oXUyvNLtQvD4^V*|D{J0z64Skv{4Q2&mYHVqA Jb@!pr{{fFOf4cwx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..93064d56057e1914cbd90a0c7481a5dcb173ce79 GIT binary patch literal 5779 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 bQafR*5h-M*;T%VpBm~oADdU10XUl&8v`5f1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb9ec75e2c4986c643ce9db327df05a65d589f5 GIT binary patch literal 5646 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 i--lImWLj$a+~2q(F-$A|4V4qh(2A7!4;P zJQOPNQQ!LTvgLM$fAZ&rd)hAAe(cs6=~wA1=%01UyR3+v*SZJf9Vy7^^Eo+LZ$#IX zqtngem!02T7E`+E>fU*I`&U(3htc8c+GP(y`@KiT^66F9CKcw6bXA$Mj{f%dH8puJ zqVF2-eRR!cU%7E_nR{PWZimS(@9lRg=Cv2^{&fibM1Rz_s4$}0hGG6Tu!O(3Z^%Dz zAHSsY=77q~>&>wnMy7)L$T*x#(F%W-6ovD{ZGK6JZT0&uBE9G6qSXs(i93`3 z2-s}()OyXLUka-v)35Kww2N&IX3Sx`FMgX9Le*1s4V2tCnwrBr#@S;&XQj3M&TjgN z6ypX%50A0+>EW%#sAXwLD(Pe@idDDbo1fS0A@di1rIlmUdO0N;mAb;yARq`T!kk?N zEo6{w0_S)tJn7#X`pgVl7nNSBdujFTdp6iv(sKrDW*@S*_xDrwL|k|nQL4L44r6`2 z3NJW0_I)0SG{rQxd|4{w8aB->%x}3@q-g7H=p4$>7mNHE00#sfI(WEs6W%{M|mBOB&r3Ve}IoKBIFQP0D!qRFsnX-v-I2!L4RL{ zZd=2aff%>ph1TB9v#fJZt;^g!J^T7On2|dAL(*Cch)rm^FQ+#R-W+NwnHy4(?NH7r$3M5A;jY=-YRhaheG}uM zI9u6E-;l;=D-w_PWW78m?b5sD)-;=WaOJD0fiEjAh1U4hG{mQcPusd+bXF6&s^v;^ z(X^pzll7O|%m!6K4|K0&B<)wcStv3a9P4hts0x3ZCg1pyk=1|-#I3omlTy8X8g})~ zR1`{U2f|>md>M>)-3s)m%&mu9eQvp1-rgKs>Sb@V&LsYO*2-{`c?nMeX2**|Dds;+fO%< z`HY%xF@H#R=vDq%X_uYRSGi|QvP};xka;}wzF6n4`e}oB{nL{kwpp2WMsqTD7#&-A zV&1HyiF+w$&MoXQIJsnbW;vy>$3FJ)k?Z(_&Fg|T6j0O5kC}LDW4IxKo(twRtW`pDzrli8WkOQz?#4`&Fr?bEK_m=k!VZ-CPw z%tUqZpRSI5yF4N4&5>6Tkp@;;V;whcCqy0@PN}nsdhUDN@a~~&V@iS#^Ct+r0N z`#{8%@)oxMn-p?FX|j%`rS^~7a7pF0jwkIM*ZC1+W2okrlKLetHZj4rB1gdXvEJX0 z#t{h|Ag+iFJ0uFkV0%HKTT`?M58n{=BaTv75L>B9cS?|w6Gei;? zO?DtV;IUqbh@6OV(?`2VxI9`AbJYX{cyh%=%Vc624yRBk926u6k%W&UP^nZLo`@q7 zvA_Z=O%lqWM66J1tA-fIV8T+41QE*+kr1uMgxI14nJWeZ^yqi-3B>;Xlkh_61Pg!< zTp}dK5ghP1fdDtvLn`x<1CWV;{?BrhtzK#2PO^_6L?Sg!i7T4`NemH0ewY1h`M)eqjAB zca1Ty^7p4PMVth6c)mscbBn13O_MJj}roovCCh znGJJc0yG86S16T1LJq8k0^kk^z=6pyhwVrrV4WZc!jh>RE|vm2ldvR+OeW!}TrQsL zGzDU<1OZhE#Z8S$4aEgec*xlicBVRFNo+QNB61wD6fS{^btX|D5E~3b&O8kimqS}6 zk_aF$ornP9!#J^!uTiK8r+Kh^T`@!l{Cf#24wCVJ16TuykSkJ1->X6p0URuY)O-@0 zi9{;J(UGja5=n&jM(bdS6x5;`m4J635j7h1#Lz%GfLcghsQ^GD2iedV5*U(+Bq1VE zoGV5h6k6>$srCm8iVMjgCM1IaD4s~B;VCq{QwV`d!#mQ*U_O9kioJ-7@RI(QwR-uW zUB)Nf2a$sDlQg37H5ClUk3Wq+#vz);ghp$Y1r6eiryzyoFjo^Nz#3O^q9Gw42K{5A zVBg7+zbOV1!I1z%6c|h35kNhWcz7%uPvK$-WSB?6!xXMFJf77gx>UrIDIf{#!3R77 zu0VlmxI!;FcV z{`;3HSO|UrDZr}|g=fnGuUWe6HQr3rYRzX_q%n}_iG9MQD3sB+>Qn3Jaw7{MoFVh| z_nPs1rmop^T(4PVB@l)9GCe}Te|+tiXQ$u|r`0Ho`~4CsNW-XQ1Vi4P-uXFUDm`EZ zj=>pyzouTGDF=KHQ~7ty`-=HtLalMtja9n8)nMqF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d0660f1bc15769051dc7884e65d25dd1e40da746 GIT binary patch literal 5434 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/l_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce036704ffc199c011e4f49040c89f20854d628 GIT binary patch literal 5949 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 lyy=Gg{C4p7Wm0dEft%YnfnyM}y% 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/meta.json new file mode 100644 index 00000000000..bf863d580f6 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/meta.json @@ -0,0 +1,95 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version by Timemaster99", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + }, + { + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "groin", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + }, + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd612a5d335c7cf85b024c32acf048cedaa7591 GIT binary patch literal 5824 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 SXBDQUaGI5aWs$j0%>Mv~8xZsW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_arm-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_arm-2.png new file mode 100644 index 0000000000000000000000000000000000000000..69be000d9086749712af6c7668eff6fb67a2e28f GIT binary patch literal 5666 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 L`7-idB2xbY3SFu| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f1b5121d0dfa15be97a9d0b789cbdb79f3ee3e GIT binary patch literal 5688 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a6fb2a71c8d05ef05dec6112a6deff4b07e97a GIT binary patch literal 5256 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d557eae814aea4780a8c08c99b2c61373cba41 GIT binary patch literal 5349 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 B8rT2; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..effbab2037d55796d60576cd062c367f5bf0eded GIT binary patch literal 5899 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/r_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e22421eb82134075d6f36cb60830e06ee559ddf GIT binary patch literal 5805 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 C1^B!G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/torso-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/torso-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1480d69865ccd73a96c70d51b96a6183ccb392 GIT binary patch literal 7778 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 Y(JADo>XLce*0x?v3@uP4`e)An4@LUZ-v9sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/torso-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/zenghu/zenghu_main.rsi/torso-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bffee42c20514207568ecf65d6f45bc958f939 GIT binary patch literal 7157 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_antlers.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_antlers.png new file mode 100644 index 0000000000000000000000000000000000000000..125f9cf913e43b01e0e95be18a1f507b2c19a769 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1Gj# zi(^Q|oVT+M@-{p0u&`_Lept@RwJ7-40@i<197^tMFwQ;5xY64G%-p4ks&e1Dxt3){ z?OwMy_x7{R+jLG_oj0z%Z>}=&;(jlOoqJ4ft(xrN_Wu>jo2#3J3(D%%7d(5KR3USG z{nk%^pJ?`jqsL2d^b!l*;$)~w6%2PfWbnb5FT^R1{$`=*C1 z1;&deXR0d{Wn}x+v$~fFAL4xACUevGL%u+v4g+CyZ_o7FrInw(+kpYV;OXk;vd$@? F2>`glakKyc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_crowned.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_crowned.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd0cdd06d215e0f8a6fb5027388f25321c17b4b GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1F|l zi(^Q|oVT+K`3@@xuv`z?_vo1a!~cs4AJ12ry41o;UHhyZA(k*OcsB>$+(u=|M2m`J!|KGjP#Lh?%DaRSDHdj!dE-O&^vr| vTRp+8&cmV1|3J^52@P-NHAoU=>~qGWC+fbQu{qWU3;_mDS3j3^P6%} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_cyberhead.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_cyberhead.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d1111199e759bfc52c24a8ca1d8a623dc59def GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R4( zr;B4q#hkaZtovFF1YEc?^&LFie4NgR?qF1Z!WPpwqh&_V1mz8{ChDyHrhaY9#x0@x z8z+1WdF^{!xaYpW$wHau``)iu#g!TrJmKVgDnp^59i> z*{7;~-@}8R#)}n{&R=T9AM`YvyFrGN!BU8!NQL2v2g8Yp3=@{-2alh& zyq`D!z-qSK#v84dP39(U5p!X)$=Y$1u}nGpw%L;>dAt{y&Q$zhD@w9&EVud)#{ML$ k_I!GDqAvnQ;L8$!!N3B#}!vV#MF^$X%Hn6m(1*xbgm$A-H z68`pox{t)HfT?w{4KJ!1WjGlug+APte!c77`TvS7`ZiNeGu_&DcY3O0ph(9ej@#RA zevmtEcxqG4oDOfMoU5C4oUfNk92d--CFg$l*xO&1S3N9Zz0s1pb$O;$UEAFGO7o7X zGH%=TeDnXEm(0@oT`L~!eo(|(V}A0$7ok7-9tx5^iKkbKA9OvCe*b{Y z`5oQH+tT%$qFL9xuKL2sbGTvmh8xok7gat~da!&SWBxfCwL{wd(X4+$`y0yTYS|p| d*bR16zL`v|lS3VMAu!+>JYD@<);T3K0RTv*r_KNX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_light.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_light.png new file mode 100644 index 0000000000000000000000000000000000000000..91f5fd25e788fac30350718430f857fc698cd878 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1Gj# zi(^Q|oVT|&@*Xk}alI(5$$EJM3u}*4<8A}il0=CK34&@19k|R+F&V14?J1w-(YHuG zR`qWFNfVyw%;#O*e_NQHtvY|k>+F0P1-`hWr_*Hob{*SX@>(YT$+78E=gt4i`ltIO zW6;xm@7M2sYjm}K{#?KBdMyU0^8>2tu89k@n<@tQp8WZbRp2>8M=`?@ONK`>4266R z7VHjlm=(@3q6&XFdDyg^Wz}2up2Mr(a#Ywa*sz8HC{UMVuds5b@`Jw(O?WgT%>2$& Ycc<#%9N(fcU;r?9y85}Sb4q9e08CGJy8r+H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_lightb.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_lightb.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1133d8d3c535e8e1605a3f656117d963ec6042 GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9F5M?jcysy3fA0|QgP zr;B4q#hkZy4861iB^(}FFZgihNOs)BW4sa^{2MPEvg7tho_tC|E+RV9ytj91XxV}l z5i?Y8EGc1ZTH0E$cj9!N2Yo$fY@ahr9ut{tU);3p#C}1k75dvB|9G*J%U=*9;6rO&3TYQVjk2outKk{}u{V&T;x945r{&?ZqXN}Z< zZy1&>kACYT^F+)V{|Gi7+-()Kabb2nTau9k&$Z9Te+aE!(wklX{ZAz0n!Im+3TowUO=>hLtLA?exoV1_x22P7#X?x>5qK4U45%ijr1uMD29elF{r5}E)yp%`8O literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_sidelights.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_sidelights.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1c31e45e47bf6616d5cf219991ff2877442b31 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R52 zr;B4q#hkaZ6oZZ$2(;Cw8CdXraPei?>+Zvven9z@s0Cxl0)sh>ftRblbk5@7YjB=+ z(`e?wJ=YC9(`Nkqe|}5S?7KCadr!tS$#61Q3NaK-Vmb49Pn*ED@9SRc`5ox3+c1mpr>K zn$Vr&`h#J+@as8;FWNqSy*P&b$REv()9!2BV%*pPbna*ebSg|4nJ@ErkR#;MwT(hLkN z9-c0aAr*7p&NcLtc9d{q*9`J1=9pf_YQEsJ=88*&T{4Y*UBNd**RI~7wA6an+Jcv- zJ~mvFo6!2`?#G^s)$19}g8to|xt;m!_n+=B4!(Z<`q`&XpOiut&E0>qXyejrf8y)S zX1BjC`h5HO*^U3^vR2g9-P;2MwX*%kUB&-r?S9a2|G%xQZsl2j*WW+>q(1HbUXby3 z{kHGhEsAulxCPp;Suu*;-kvLSYQDqDjP0)jE2P#rtrgx7`~PXehTYp8VoY54I~PltLGL_zS-?B`J?zHyN0cKy4`;6TzSWfbqyt-AM@T({rTt8 zUxtaZ{<6&f{L@ftpGJg$p!xp`pUX8*z4)T7aPNTgjs1<$@@CgtrLD5Q3D3FwXZF*5 z@(&h;**h4|e*15&OYG?@bxn8w+nWdC*V+`6-MO&ULwFP*=T{=0i>{$jj!elve-M)M-o%RAev*v~DMUvU0^;S`2U zr|-#j`*Q3Z_Ov_y{Ig}hg89p5?hoHjs;PTf*Wj_Pt_kQ%;a%V)bnPX3$CjUez)46W zBt+1Ecl(BV=H&Q;r4J|d#QbHM`j?XRDCetcikG@(+<6Lk&mjrP05 z_Wfm;#7lCrL5c-fs7UzL|EkDep@{1!jMtoifuzA<~4QJf=y cUi-;@`~TB!j(0-$fdvhNr>mdKI;Vst0JzBfCIA2c literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_towers.png b/Resources/Textures/Mobs/Customization/ipc_antenna.rsi/ipc_antenna_towers.png new file mode 100644 index 0000000000000000000000000000000000000000..f971130b8e4ed051fb749a51113fab026750f83c GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TS5 zr;B4q#hkaZ4)V4b@UV!#rQA{Z7 zc{|IT)_7U{r+qbR85P`_9Qs%qWH=ctg&2xd7@l}AoS4WkK^aA&;Hyi%?fkFLst#m# zZ#k*Yy+Qh$j^gu&y%)3}2z_gO!LT}Y)-p4Dj~y)BZycNK_goj-YnLtf<@$q6&bY(t zxBa!>RL=PRxV3jKR~@&t;uc GLK6Vlqh7N9_6{oe?&nh*r(p=92=dT3ysc~I#^Z=_u(Ywe!E^hL;|-o0?lzVX zDc1GE@QReFFWd>@UZ_8eAlj-ta6f)6U-!hXS2~a8EV%k#?*XJE3J_?W8ad>>v z(q`{h+>z8l9o6R|HwhUy!+U!g@x;_Wt_|x>Z9S78b}h8(qWpC$X$Jx14AW+>LptV+ z_j)q(tfn6qzwwFBHHqfkaOrfZHQSK~v72#L}G|8^DmR-kt^*BrFaWC}L zaA}E$cE|+?&I3=ytlJJx(TW1qruEsls#E7P~^*^## zd2@jGva~T! zWuAF?x|y(HUV-ZLNPprh3S5}xUGuU*#^SdgxV$13>l6kJq`YB$Ozh&)99-;J09!bw zk;awb{D25Ce)(LCU!?W%Ck3#oq43z{X0-N+8^Kj+hGz?T1=jL3^K&a&<>XjM zj=c9L3*LLMJXRy~upmYo98}<&2Jgl)xrop!S=Xtmzh);fV|oYhPAJ4Lw3Il$ct7e( z^~jP-(SC$z^6m7jnxKTdlMJu$x*6&%NqR9!g_f5?G>!DMI|)yfvR~98SdgXG$jq24 zS)x&od#)A57~9%*yx}P|b0hlqNx6K;(wHr^MOCg!jLPyIWxq2km>wo!^GR_#?#|rl z!nPOV{z5s=|2CDGO(;vK?Zw?gFtt3sLNG2bbnX1|&fBlZJzqHydHso7pU6`WCWZ^i z!OrkH!3?T~UZk(WLuc3MIL7nNZEtiUwx!E!?#vG$1RR{4dz0697C zRX&9|j)s*rA;U_mWeD z@}*LpykvBkKIi+EhY{*hV$oDrWohgCs*;IvWTOqIPlkx$6licJjfvSol&L#-3gI>h zaR&!Rw?U?8RTe3iK)l5l$b18H=6;X$y70WrmS@moF;>T}@(oFrSh8E^G+BqQHEpdV zGgUf2s^XlDU#ln@dqqBO%SZXo7vs}hP+CMW5gXaEU(d^c@fI6h+^OAv zX1KYAiXvpX_l}M%O4^N3JE|HvLl9m4-U0i&5Z%waLCV`|no5*2a1IzXqkfac8U*n` zYKoWi-C-~}x$5fO4DkA9f$r|^oj*!GX#9_^{g$zV=09lsTWTDbv$VAIy9oQm51jBn zOxUl^e({5*CqF3R-^c0c>0x`)oSdA$4NXi;Kzs4u0{_D=hg~1qPkO)j_qN!t&VKRl zT_4N`1b_e#00KY&2mk>f00e*l5C8%|00;m9AOHk_01yBIKmZ5;0U!Vb{%itPJJ}gu z_X7Ocdi%fYXK!Khhpf#XAh*}Up)HagHo~F)_^&tS(DZj3_#U5t000AHX1b_e#00KY&2mk>f00e*l5C8%|00;m9AOHk_01yBIKmZ8*2mvRL ixBRbP0l+XkKP4plk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_breakout.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_breakout.png new file mode 100644 index 0000000000000000000000000000000000000000..54a282bd95c240b1472f8df8c12a4343be6bac9d GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{PV*h_{G6MtSNlzEYkcwMx?>gokG7w-5uzuvx zq5L$!PUw-}J1uFcl}fzxR6gI^6!hcR$BuRTycro78dP3QYmeLe{rmpA*=rYz)h_u{ zz4qzV>Ra#Yzx}yAtv%|)6}_KpuNnQn*PZxt=@g^yb~X0*KHu80xqRn$``oxA4}9Z= z3xD)$6v-={KPY#<+UoK2{H<;L3ru4k%j8u5`uWGUs{iqk{zb+3(pS zsy>R({Poh)j^Xnu#++pSg!=Wz^4J=9ml^Bb+RO0f>9_m*9dDM$Z{lTf{?B@epC8>2 z5WhetyWCvHvi{Sl8^P9*`xq5WnGbBOYm5U7K1_lo%*yr$l&!00tcfI$&R-6C-|1!D1F3;BexWOQ> z?CPu<_LB3b&(Fc;LII6hdz1FcKA<8nUl>yTkM@t1qTKKXffz8uDIT>N)tgWJEV T0bP0l+XkK(_hHC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_bsod.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_bsod.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7a8efb62e5f8761424e20f781cf3c9a46407b9 GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{P>hYuZD+2?Qk*AAeNX4zUch~zVJIb(s$UK-3 zpmIa)#MBQA9Y;U1MX2-_f70@N$N0+O0|QH`y637{YqFeXE%^2wS}jfVOl**mJ>w7id9mP1 z4c8xQTe*_042J_J%d4-?zkgnj-|Bq-y#0T^K6$_1s-s_eL$=_|__Ov|GM}zb-k;C> zt@s~^af$Inx96{)k5!gVx%BmH@$<>&yFIOJ`=kHtnbBhR=jku^HGj9+{7<7g%^C`Hp=^rmmmDzNg`kxzrW?E!9v48kdJCZRN3;sxYbU-`S_Ts}uMA-8=u* zO!MjMD|g@g$Gl*EeeutCaWkrzE0`;`Mf=+SfA;I;-Mt3a{_81~W@fY1Tsc^TA|*=izrJp7wD`7<7lT8`@q@)nA8lSYBi^_CNx(VFEiYdD zG1jnr{%O{cPpL}p=geQE{^9deZ||SWcQW6rXFY7NgBfTK6s*XSIew|AZpXg&r>B0h zzVD;MyI|L)3OkrI!vX(gnOt|P=RE&eRz1Bw*Ioa#P}G}kxhr3?Env(wPl&yKA?bVV fbwjB72JZ?c-ffPT?^Vkl1_^n(`njxgN@xNAr$upC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_ecgwave.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_ecgwave.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2c405734deab48b03eb0b4930e07d235e4eae5 GIT binary patch literal 1036 zcmeAS@N?(olHy`uVBq!ia0vp^4;UC2893O0tW|PV*MSsUlDE4HLmUWBnYeWhP=vF< zBeIx*K~EWk87r3BmjMOYOFVsD*`KqC@#%|Q{CLNofq{9Zr;B4q#jUq@4;C&8U^xD8 zyWcvq2~1lUqzqV>Fa$Gb9+HX$s1e)C-|2_Lud)Vqw^MBhsM*bIsaVc`2B6U8MD+xTm|>q z=hQ#1itzav5IOB4e^thvck|seLqbJQZMt%9$=&$>#g#Lvn0xY@X81q&$O+W)i`5|K zc%1}qe0|pgPl|6B7`t$pb3{r`eyZQjpO6aDUY zi{>_^_e*VGnm?$JUaNDuz(#KI+=fEymL0!a_U`-p>({I`bCcxr@91?Yy*gjN!~ceS z^_ltqcl@3EZ;AAW0*f#8-7QzMME#ZrU*UdGVpW@UyiRsk-1_;quD>?Ts=wj)QESGg zyYcm!@r}P<%VYBz`CG{C@M&chB{{*B*OvJ^tPAocHhF zM}9Bg9ee3t+UAY?9N7JL;OwTq)5`CEd-UgacYKuluB~skR=<|#YhO}(yZiI^{49Bc zuU|r5z0`eo{?W9&hAX$TT?12U|7;T%K3)6U|Ngf{%ds2Fz+ivUZvMW1d-iSVn^HCZ ztlh$Yd%uEA+j{3aXYl#WsqZUn$}GRj%gb9okGG$BH*fkE?i@4e-!;E(egkD6H1O=Z YbgQA~q=~^tE`Ve_UHx3vIVCg!0A-`MAOHXW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eight.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eight.png new file mode 100644 index 0000000000000000000000000000000000000000..8421ae30bd99d6c956055c9f95f577b09dd0acc5 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{PzU>p*K&0WJcmb<= zVWWu5f!*bES29b+~O zo%vfZ@7nS_@y8LT?Bfo+I(vD)+^@r5uk#+aDE)ias*5R2SE23kTi5H_3GbMa6j_h3 zv-&70J^xd=cIN9le*SA`G6G!!0SB12&J{LYK5O2q> hIol=-ECCa*yTiJ=tw8tczK{GMAx~F7mvv4FO#qV6Z%_aL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_exclaim.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_exclaim.png new file mode 100644 index 0000000000000000000000000000000000000000..e280615e504522098068ef02622796a883654002 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{PVdnYK11MDD>EaktaqI1^jl2wsJS>jCf4~2^ zkG&;@(b&==LSYdXgT%$|*P9C0KmF;sYPb5c{LhxnOdJJoe&5tRuta5@0MG;oIB>V< zQqBF#?VJh?Fd-nlN3;L@{d3P_7+DbP0l+XkKaFaw$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyes.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..42ee79361b1e930044f20fb9abb7b5aa1552ab81 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{PVdnYK11PlJ)5S5Q;?~={hFpgYcvvr}d=a}> z{Qq;xcg{C^=LTD;s6}k8%r|7|VUahA%!p)Y5Xe5gwDvv_^gWKKHkFP2@40@O_tt9{ zmMwm5pP9XPMzP)85B`Ti9D&E3Y}Ham8PUc<#_ zqRY4wwp6yhWHQ(dQ^mkga5f|Vy?epy!gYHY4>H~m6_9C&1u`nC`JrkKn96T_Wuq`_ R&Yd=ph^MQc%Q~loCIHj`W5)mh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyesangry.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_eyesangry.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7e45c7e8fe430edf6e4c6476e79c9d59df1851 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{P>F9Ux9#H6%r;B4q#jUru9l4qf1Xu%tcU@(! zU?~3o_(=8(yI9d%kK8mlJKyKJDEd5d4>vx{zz`z1PA6)b>VLcF>!wp~mAw7+|I40D z8cR)%NbG;-tWo~2_WtglOmg93M)TuPJ>;dmf>==s#9{R?hw%bhF(v=IUh@XDO! zyR)*c)bjZ%{e*eXgTKn}Wi{{(4*vaCuc1%|=#aNJ88>solruPJf4LWaE$V$Ow_mCI n_G{JmV;Sz)Fzo#fQ?RyzG2yH6;{Boboj^jKu6{1-oD!MH z-v9q{<@*)hm1VVGQsh1A{QI5~%M+F5e&sWS7zC1b8fD)9{_UUc^F3dpN=p93?~0!p zlI^>6%9h;Q*>6@}vpUPUVCj$8)}I9MEb|Nfu; zc45Gat72XSY)*b$7kya{B-~uHn!oyQRw?)DSB2gOmT_9#Q&Uh ob3j0LYw&y1+Gw@}Fpt6D80TA4@qZ06`kWvEPgg&ebxsLQ0EZ4eM*si- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_glider.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_glider.png new file mode 100644 index 0000000000000000000000000000000000000000..afd5349ee6bf8f84a59a7368e330809c103e9918 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{Pz20HLC!o+XPZ!6Kid%2*I`TCc2(SiZSj6(5 zS-9&l%dSHbkDYQ3i~PEG>Byg#Px94$gn`!0{QvXvu66zA?-!l>9O-;IfBO6^wv(3a zrse1R<|rEN56xSZlXQbgX>+y4y?_61Sx#H6_n=l#S$xB{zo)N?-M`E;@u%$@d7!m8 zK|^uP?`?bk)O`+q&A2U>TX(^qgYvxhcmFXXlZElw@+o-}#RbHnYPlfLJ4tU#`woM=8IY?_3Psl_x}xF85sG?+?^8Ely%gKRW+h|8k}mfetxyYPl+8 zt9G~m4TFOEX;VL~UB2G#ugvRsMhQolFayJvDQ7=V*WNnEdRO&&h8_iTm`p>P-iB?W UoEPt(n+Ou}boFyt=akR{01J#t=Kufz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_l.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_l.png new file mode 100644 index 0000000000000000000000000000000000000000..902845f11fc18ed2968f51f4d27b28d3ab88cd6e GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ{P>!!?l94O@N>EaktaqI0(MXm!5JS+#6{{R1Z z-inpF%bn5`%#xV1Coz18zHN50+^uR`d=LZE4(+Brp+IdQpmW7@cWpbX0+_>a;}Jvm V8v#bwS0&6K0Z&&ymvv4FO#qzNH3$Fz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_loading.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1f705a0d7c64ae39d39cf3b8969cdb4c30300f GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^4M4nrgAGU?nUwMuNU{XE)7O>#Ihz=tzO0)v>v0AKMpsW4$B>F!Z|`mtZ88vGxNw3` zavJ9gBOY%99_Nfy#q&-k1(W{VKUrPjY4Kndwm3CfbxV{S2ShI}msJS+z!?tY$Z zKKoP2E%MSr_{In{94B~Ss98V%k8^x>FaxUts>+7#Mc@CW{?uz1 iTh74Mz=UMPhLyr)25P_8-+FrjBKZge>! zB>3ysuln+;CksB;{QFjQ?+3p_{Qjx`KAdoz-ceDtQ~uY_vi~2?A2!JO%J|~-_Dl9t znP;{CDc-TKz4*q-tv3!^=2WrkT>kO<)c(4h?}jg4f4{>HvH=q;sQmWui}7#Wjr=R> zchq^mVSXjQ?*3od56jQgZaY)<%q~8y`djenz09}TFZ;h`#?((xq_dEByovq#G{mFj9zJK-mm)AOEc%8ldlBPujSkIH&(o2Sfj=N;N8#ohQRO-EB*H|{_6N~V)gw} z!HazM9w43f+2y}50=73D$E2;>}S2D*ObuDY8dnkW7+mIba_7r$K)$_-*Z!g+DbM~5AySP8`e=WaVE71w!RQSx5@b>e^ed#sZ-u%L_>b=*^E4IJ$ zk8Nh3uhKB}{J+^B-yGCAwpp=(dHrKris@V4W!Zk@&5 zq>KOV3M`%SUVE3~H`9iWj=YY{*iHW}`aahD7rA`v)#g2upN9z>_#WiqoU!lkZf^&> zn4oi(Py4U0uiBwgb@}hdIazC8{`xm5Ywb$=c}tmq&Vqo1=4o*v|JF`1TK)gqwafDB zR&T4Xesg&r`+;Dydel;w1_p)cIUPrr@;oe~#p`od*edy85}Sb4q9e0C1_1tpET3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_question.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_question.png new file mode 100644 index 0000000000000000000000000000000000000000..f90dcc94abb29520a724a6485c3a89c9160718e5 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)Am{CQ4Jb6n)5S5Q;?~<+hI|bQJgfmIw zvez-TV{)_Olm+iq`S`j%1n(}1WN1*lcI>&4Qs3;LQ*+Br*WNGG|J>QJrhS5GPt8x^ zPfvb@vtCgMIdFo3P3}NC(~Z1;T_u4)Q6yvq~PiE^dax5tRo9-3L50hYEn9;QJ r^tqnp+zt%aU*CVTS5AQmD%T+Sru(l>R@$uG0Fa2MtDnm{r-UW|0-;!+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rainbowdiag.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rainbowdiag.png new file mode 100644 index 0000000000000000000000000000000000000000..37274191d374e4030edcd0dafe98055cbc0fdae6 GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)nCVmLz`($G%G1R$q~g}wyBjAS3gB@KboBn> zlAPB*CyC=8n>6EQW0ikKtBbiD(%x9lc(NMgh99>dm-wxlx+G|2%%nAQ=I?s?RVwV< z{_sy_yxh4{_rx8(rLIu9w{7a>`uW?RXGi@0dSC9}Rz{A1hPjN_ULW4C%jeL*l*9Mo z=fnN$!AzbH4DS<|L=xf~fM#QWwR6titTIzSE7NydTH&uf<6-lbFKiyh+EufdmrUnX zJgZ%Wp#_gX#z%{}mo4o}v**^Y@0k~W_OpKGzkfT!SS-r_nb{ohs$!lYm+<}1yZ8mn zEH`8hd|c{wcP);T~C&H|6f zVg?31We{epSZZGe6l5>)^mS!_&L+mEuk^uH;}-)1qlTx8V@SoVw|5TmHaqaJIB4r$ zy!_S0|N7+5j*1_=S<)ShdDk>P-7N^zeSNxQ?Wr>-awbYnRK7g@#93bD&(FVZv^VFe z{Vlk2e`3Zzp*=ev`s>>ZPZbehbzx)#YC!=zcD|22P^z4_KyK&$gW)^XAG>HMaB*;P zpeO=y<~-cK*6p#&lpqJ7K`iLf4-Vey|6SldyZf{8BD4LX&(m+PKe5AZW5uSrdvB)PFRHZZT Q9RP`Yy85}Sb4q9e05tq|zW@LL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_redtext.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_redtext.png new file mode 100644 index 0000000000000000000000000000000000000000..c180b8e674e6683ef2db9097c7b4354fa3d940c5 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^4M4nrgAGU?nUwMuNU{XE)7O>#Ihz=tzS0L*jb985j8i>b978H@y}i3JuPH!;?Sc2> zCe6ji-Y$Fp;9mOsJM9@IMujaczE)RF{JbV8f2fsK`%%3^J@5GhAqIx-;4eEhpWpeL zV|M*@|7S~CzV@Uw@^g#d<=IPH+wc0f@KbngUe;~1w|&PqtjoP^Huu%9s=cdMUHrWG zwY*mS)$hknFn64)S^BH}RJ>(F<~93}y7g=sv(#$0zWw@ZvyQv&zRX!);za)2OW4|9 zy8l`J_fBS@58&W~klIf9hKD{y_6!GkCj|YeFgwWm;DY!ahX3E0X9Tjt)qxnx-fX&G zKJlmJ^K+UkxAL|xWG~S4=H2jwxg*cvKf^!9X>WIHIPoX!jmt*S#ULkSD{ue&&x>2{ zgluK4pa1dfsdMjFKX3V8^8R15FXHc3X>DPAK1V+GcI=|(mlr?(Jb$KqtTc)dmxcf4 zRqbYP`p&HL_v#Dp^YMRHUwl5}|Ao4S;MjJv1$UVb{$^a1{{OAq26-fXJHB$Sow0%C S+z;WaAW=_OKbLh*2~7az;n7q8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rgb.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..36f48e75d7aa4d22b95be713ec917c1fb66ba610 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq}YsKyb>$t#g1PoCO|{ z#S9F3${@^GvDCf{D9B#o>Fdh=oK1{RU%A~$A_pjR%+tj&q~g}wJBD1%4k9cUOk)+k zdnA57DE-9XWzk6otJYi#V3dUJ1Ki+DFdqp&}b~6q50MByi;fP@0DBm^Qqm_XZHH4-x+H2>TcKl zJN5nhmlQ6GD8~2M(|@}<=l!#ocUKE;M1pwE|J?uOTmQx%vay}X^ev>}?f$p+Q0W6k Y@vE-tZh11_^BzdV)78&qol`;+0KIZ;DF6Tf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_ring.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_ring.png new file mode 100644 index 0000000000000000000000000000000000000000..e54542216022e08115a7064be899395b92a7fb1f GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)BB|DU9w-#=>EaktaqI0ZL#_h~Jgfna|GuB2 zxAfB0Yl=^73%)cvZBj{QFcF*m-N-oHKm$PF#^kA+ r>gV&#j}f()m}~EF)a*SYSiGc&ao-M^AJ=nio`LwDu6{1-oD!M<-MT|3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_scroll.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf936810a18574a45b884a3b05ee770f3068258 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4M4nrgAGU?nUwMuNU{XE)7O>#Ihz=tzKWz;?|B9W#z;>W$B>F!Z|`he+ms-}`r!5K zqplmaZz*6bD-ab=VD^q|VeH^!Wfe2qGi}eS%m(`(_3{3FYV5m;fd-#A_il3gsZBE7 zi#j?wcCA~SIcvxL_q(^&m4t>qHmTl!|M=IcSkwAhu_CT>&Og8U>GUR<;AMrNqdhB*@BY2dOGx3*9(TEu z@BBG|rZ=RXlJ7hI_=Dl;>H7a)%Psq}^8N1`yZQF}-+%wT!ia@P{qAAEe&y(8xLq%Bo)d0XG* z2miZL8tbLG^s?U4{{C{)C;xwZo#D6J+oSHvt@b}Fw)Q`lPn{!QD0l4V#OI7ar(gjM zRWI8o%g>A#{@d`W`}B6kua{q{%bfjp@2Ba^JN!GQ)a_YOw@cAHi_d#TeTjJjuiAI! zSI2)VubQ8CqIZV#mp?d6#bOa$sG;cToXvlVK85Su+!eDv{3q+v+YNWFeA{5ga_j2% z+C0nuzdyfUbnQK7#LRWCXPvWut9K8s6^*fCR-MJqPyg?pJstVw@X6`&I~b#v%O3yZ zy!D>{a{2RroaZ;J{eJo7@#xw1Xc}SMGa2XV%k^@S*2(Y=5{oL8J50?l(2c=vFPgg&e IbxsLQ04zu%d;kCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_sinewave.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_sinewave.png new file mode 100644 index 0000000000000000000000000000000000000000..c976f421791d7dca109c2f65ee5d0a4d0001a73d GIT binary patch literal 859 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)_Fd!6V+IDM7oIMTAr-gY-aS~jC_v`G!|gNo zUUJ}SV9Gf##j%K=b%xOaYu*V=K@Cw1yb%sk4ZEw0+Gp&2G2?sK&wY~omM`?1Z5mJi zZv~poVEpm*B=cOe+0OUBKm5U^*z&jTzxFlz*y~>tZ}r{PKmExd_xQW#m31@z-QAX3 zQB~!2DgU-vi@>BW{crcZKYaW4ZP&l;-uJ$I`Xtn~=*MrV`TW&Pi>H*Wpn@5|pV($M?2roDi@Z$Hb*Tg$_nZ@d-xn`vG4f7aXk)Awy$wMt+8 z-t*__TbK)O_2q7iP>KCe{Qm#znvP#Q6H;$(uRien`SXnL4afg|k=u|tYsKHp-S2;I zxSO~5>+W^dKDTS{wRr{rlZ# zpWSgYXW!XlJ(lz5|1P{(^5SvMH=ws(zs~;h^Uw0Pg))ch_J7YU+SdJz-NRJ;-xhvP zu>&EYp(mdmmB0P}_MWPDcZzn}q(pvuD!RG;mfgA2ph(34Ggd#o$Gh@MX|A8nOB*{o zHCsk|JG*nQ?0=kMc=v>>An(3t!)mFv#A{gHJLS|SA1fKt^TmH9zn{N5|G}%nh24uh zb}=?nw^#$FrCwqN#==)&d_I`-wWjXf`N+eC^+|TWb-&L1 z$EaktaqI16L#_h`9IO{+{Jwv) zXQ}K`fg|6i`EXr)AH~q@x>2wGP3hHjVrkD_Pi^qz{E@e}m}^lTlz{Mi3K<^riZES?ld}K`c)I$ztaD0e0sv;sKK1|r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_squarewave.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_squarewave.png new file mode 100644 index 0000000000000000000000000000000000000000..04211f366e8ff189a5b4bc9b0134925e42638e1d GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)-k^V{l!1ZC$kW9!q~g}wy9d`kG7xbH{J(x> z6Vn}b)_?|2=_!I6mosrKXgI;Tgz=U_bz19`lQ{~9x3@o$>EsRC;c;?u!e<#Kps{O? zT%XguYu#@D`?vG9$1mOYWy}5VwH7jbp}%VHx9@v@_-BpYz4|S`_wiqUy)~o$j@?{8 z*Z1|ew|y`C9Y1gXdrNWN!vaO;9#+`2Ez3M)z~j2S?3Ui$`P;m|FMoUKZ|3eY`{y>l zH}7L!GlMbVYTenLFUofR{i>CDtIsg(^>GR39>W;D>5u-pTQ3#)_Ph4tza6o^{`uct z`Wxsj43KY>y}ZinrQN-=a!xltGbZ(XFWg-+|LKgaGUa<_|1At~^t@d5((ZJktrZ)? zAC{`O_6Ov5-}HW;o_~AWtDh_w#(@O>&tCWX-TW)tWoK=dYFn6P|6GQLL4v`6K_u+= z8n$#-YM)Tji72RNEc+Sh2>c!S`~=+w1rG*Z+^YUzQPemLY-R zUgq2153|1~_k{k|T)OJ-wp?FREJkkdD7#;O?cMLCcmL0Sv44xq^>>wjXBC}W_=@4c zB?$(e1DoIMi~s)a_tyD)v1n!pxGePj@Zrm4yJN4i7i_*M!Eohi~syH!u^Qk0|l&7no%Q~loCIHej4}t&y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_stars.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_stars.png new file mode 100644 index 0000000000000000000000000000000000000000..8feda85c428c33e4e40ee1c6137b8535d9139d51 GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)Au!?K69xvR`JOJ0Ar-gY-aS~j+CzZt!N&JR z3|tJw;umM^?&M^5kWy)2K9G3e&dtdoo995M*)U(xO1iGZT zV%M_;t5$9MeEzb@(&^KuFAq|$ojE_qD?UE{=%?d_cXqAgJ{>GL_=&$j3O*4TYjaE*10o=PhP?dwb{qyX@@jg1j_k`PwghuBfl)KW(?p@&5OtoB7)hXYww~ zhX29e6 zS%3d;oAV2QE`41e_x;45&#w)7 zxFi0+LV4ek(>MR*-j4D-WqRPJ&94r_tAd|jTx3v>z22JVbJ65%rdiz=Hpx5NR(}iq zb=&4!X>9jfLD9MV=+=PvAL@gv)_2T*W*==-7yNRsQr)cej1?JD3=g*R92WS+V{m@+ z-$z*VHME=dCBMiymKvFtWw-aw?^FK2|JF^`{~z|L*Zq0;*IM~m_P)WF7+PNL(lgng zIqL>n#C6jx44a_qe+=H?aK> lzgEg?d-FvNy8R1U>KW2H64qqBJf01b^K|udS?83{1OO8VN<9Do literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_static.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_static.png new file mode 100644 index 0000000000000000000000000000000000000000..08e96db150839062238928d2960906dc59a1c990 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)nLhnv5m4xZr;B4q#jUq@H}W1f;9+r4?#>W> zx1Xy$K}$+&vYX4C-D*$WKg}*m{;`XJ;eoJVU}&gdpkQG3TC17+ukG6WyWVHr{#AX? zzwb+b_VH`H?5+L6(ihY|SN~m}-*C%k&Hq;qwq83SJ7Z>fURqyFLoJt&c)=Qm-x4-+ z?~B(ZF@L*gZP>K>Row3rf*aVsi_EZKUe0ClmuHK7qwsHjpxbbQ1Cf{SZ=Cu+_Mdm^ z|Jh6$44|+<0ydM%-_M`^{^^)5S5Q;?~<6XL}zx2s8xt zyK>bQ1gOcoJJ_jd@QJp3H}c4ENct(*8vEWe=EA!gle;0tmrH?W0l|Urh&&s+d;J|> z{vFNM*#7U$-}U#--}(Rf=6Rd{_4k^+e!pi9_{;nu{Vm&u&++fL10JzHU<;%?C;a^Py59Z&RmMM`53zrUwfBy%5B+E+_xi-KFaPpC2Xv-Ktk^`+xt+|GVt9&)+BR-g=K=?bb`{6*tQY#&6|6my|2G z@s{n4wY483{}vlBuD`i@$G_9u3dszw+J6JYf1T&K|K{ss^9J1)yz+my zem%&F-vLnBJrACr{J(wA$Ml!4U%#GyrJ9?e=*_hsi=J2RtIFGdfBMZWnX}f-vzFmY zy=LF{_-gU-#~aW5YERrz^{&KfX4*bR<^%?2qU@oSq7R(i|EhlN{meDtFaw)G10zoY zaW?(Czi9pX_3<0!1^K^Le`h`5W>dwyqwy;cbpPXe!0_VrYv}`e47ET&jCl!j#Xw5` z{{B^dUHOnG%LK!Q&8hJWzkW?U`#GlS?`4yxd=IY8%H{>e*>7PMVoYQRIJ0Pde(tYd z-@m@&ZjhNRec-Xhw0jp4CFW!SeF;QF88UA(&?B#3?{|Oi$9N)6Wu;U3G433a~u*H|AgoiI6H{PL^+<&dhsk1ejr0YmG6 zc|r_vh6fy8#Q#BV?{8bh;hVLJ0gt5KfE0SV`njxgN@xNA DM&3y9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_textdrop.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_textdrop.png new file mode 100644 index 0000000000000000000000000000000000000000..c71ba6d24e9d958fcf91958819ef2b0325fa3f75 GIT binary patch literal 962 zcmeAS@N?(olHy`uVBq!ia0vp^4?viM4M5yS6ATQ@{+=$5Ar-gY-aVN6*g$|aKq++z z!!CwU<&_Mkia3Zq)H}Jd$bh50qiD`#S|_BEyflMdx0d z_`bI2%RX0`d%JAyT>HMqx3;~t^1VE(I8J%q{xyrs{(Zf7{hWUF{NlLNaaYdV-}n6! zpVGPb$ix2U{@>R9zeUIU)o(jlzV_4pzNa_E6rHxpdOqK8`Dv+XsVis2&)fON`R$*# z#na0Jtp9)hY^-~_DAM`J=kK-uAOD%nwjp!YlpwFe21}M@>eXN0a<=b;{?1g{t#i*m z|FHM|yw;Ar`t#cpSIqnW_3PK`HX-r{PVg2m?qHbrkZDIIL-D!HdC#X5`yGF5c=mJ5 zZ|jU%&wp-eTld=O)9!WNmOzo*xF#53z2BzXrLF{I;KDi^Og9k}c@Y0}PWaElWtmZP4~c*K_ix{+ z`Z<5h-M{TL@l6(%>tHl#&|_deA-kXXB)`e|&CVRy4Lq>!SRv2a_N?1s_Hhed)a`M% zt}oY5x0K;qD1Kn|bN$mov+jT2`(56$;jlqV-htKEi}zO9-dH?$zq$SaU~+qO?*3hN zgI)5vR{LM?x={1C;TIz#c6%!Fs=r-+`R}r=#LWHf-yb-CWq$Q9I?n39-{ldi!d9Ms>)2+bayO{uMLY%-+raVBX(~UH?n|yI%Usj@{e?_r837`Mmqg{l)Y3 zZ`DuT{NnlL^WRUsx36KiTD9Dv{eE7a>at>&UZLfe7G2e>dbZu_XjR+1pW99K z(_hToU-NFeWYx3v-|ORb=7`VtdG=nf zPj6c{d;h$LFZT=U%QTe#omTS`Xg&%!Af57^*@*9JjzzsVs*fw6Tb3jo6;@rr| z+v)0iGq!j6CAm}K=iRi}1=xh$&+Y%_`iMc!OdehRj>T?y<|j(}uKe-;#{6#W@BGVk zJB^m?Gq7QDoBV5LN5{n1Crkd<{&tqKiT{qF`9uG^{dc~me`l^s@sHJ(ak$~}{r<+! i{eRikY^`ENwaHUYMdt9MkmyNWAaPGuKbLh*2~7aITBCdb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_windowsxp.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_windowsxp.png new file mode 100644 index 0000000000000000000000000000000000000000..595ab8444b213be7d18bf6dba2ad44b8df08b381 GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)-8pkY90LQBt*47)NX4zUcQ)o-4iI5`Fqx}! zYNKMGh^Dko;`)%bFT4^7>efE74;W7cEPKXyBk=+6iwic6D??_iyy7QXEN&b!?M}zi zWBbIf-#1sCHs}AZUr+k#Sr`}`oEEE@Pfd*sn?HZwe<49Zd;2|7OQXL0d9cIg=Izd3 zQbEt%U9Ma=km{ZE{QC6?+W&vOQmT8iKWEPU7t4-5Jj=9i@6O5}cduIY-Lv!G#yI=u z%6NyV@$t^5{%q1YefR3GYg?!Mj+b@#YHD(}{=$=GHxvzP6|>x+v!Ix05)ke#0X`H8e* z{f(c%@Ie6v4F9k2|9JD*YTbH0C8b<@h41c*ix#aCf0vT4uI4H@dC`W+ORO2=>;H%5 z#r-y!Z^h_Y%=GNt^5h51E9Ci5OagKm>{jj)E}khb^Ifa{^ocF2U-_MR`tk6K(0zy>HvTGG6JQZoWT1O5Wjb#oedz^UiLzi+)#w z?z9K*+v4_4v)(WMx2Al{)#XRut-IEIZoY^sPZh)a;_vfn)D@UZmNUv!+0U)BL(wa- Y$zD_czopr0B3|Gng9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_yellow.png b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/ipc_screen_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf4c92cb32597b0358929249b8678b9e74b484b GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdQ|)BmS55FHq>Zr;B4q#jUq@PxBr!;9&^Zu5*AZ z=YWLIfeAhr3~w}uMliH;%P;)KAlmi2^8KW^sOZ93aY?333?3JIcCL)^U;2H)+l?!y zmX!U`)OcE?asFdrto{${XW4UJyKGZde~|1G%_@9yaTTMI(yUnVv+GXZwO60ue9HVm z*}MIpX4i(?Zr=Qu8R!ZK2sj?_{=lq9{)^aF9;|;eHACF|xAAMy4Ca5CE6NjmKQhA9 zG3%V$}M(fhEnbw_s^5TgH<>?=vuXy85}Sb4q9e E0FbwKjsO4v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/ipc_screens.rsi/meta.json b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/meta.json new file mode 100644 index 00000000000..b6314cde9c2 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/ipc_screens.rsi/meta.json @@ -0,0 +1,1363 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Yogstation at https://github.com/yogstation13/Yogstation/commit/9c046aa5327c71f9e93e45a34283b3a4aff58bd1", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "ipc_screen_static", + "directions": 4, + "delays": [ + [ + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15 + ] + ] + }, + { + "name": "ipc_screen_blue", + "directions": 4, + "delays": [ + [ + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4 + ], + [ + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4 + ], + [ + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4 + ], + [ + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4 + ] + ] + }, + { + "name": "ipc_screen_breakout", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_eight", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_goggles", + "directions": 4, + "delays": [ + [ + 0.2, + 4 + ], + [ + 0.2, + 4 + ], + [ + 0.2, + 4 + ], + [ + 0.2, + 4 + ] + ] + }, + { + "name": "ipc_screen_exclaim", + "directions": 4, + "delays": [ + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ], + [ + 0.6, + 0.6 + ] + ] + }, + { + "name": "ipc_screen_heart", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_monoeye", + "directions": 4, + "delays": [ + [ + 4, + 0.1, + 0.1, + 0.1 + ], + [ + 4, + 0.1, + 0.1, + 0.1 + ], + [ + 4, + 0.1, + 0.1, + 0.1 + ], + [ + 4, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_nature", + "directions": 4, + "delays": [ + [ + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 10, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_orange", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_pink", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_question", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ], + [ + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_shower", + "directions": 4, + "delays": [ + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ], + [ + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8 + ] + ] + }, + { + "name": "ipc_screen_yellow", + "directions": 4, + "delays": [ + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ] + ] + }, + { + "name": "ipc_screen_scroll", + "directions": 4, + "delays": [ + [ + 0.125, + 0.125, + 0.125, + 0.125, + 0.125 + ], + [ + 0.125, + 0.125, + 0.125, + 0.125, + 0.125 + ], + [ + 0.125, + 0.125, + 0.125, + 0.125, + 0.125 + ], + [ + 0.125, + 0.125, + 0.125, + 0.125, + 0.125 + ] + ] + }, + { + "name": "ipc_screen_console", + "directions": 4, + "delays": [ + [ + 1, + 1 + ], + [ + 1, + 1 + ], + [ + 1, + 1 + ], + [ + 1, + 1 + ] + ] + }, + { + "name": "ipc_screen_rgb", + "directions": 4, + "delays": [ + [ + 2, + 2, + 2 + ], + [ + 2, + 2, + 2 + ], + [ + 2, + 2, + 2 + ], + [ + 2, + 2, + 2 + ] + ] + }, + { + "name": "ipc_screen_glider", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "ipc_screen_rainbowhoriz", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_bsod", + "directions": 4, + "delays": [ + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1, + 0.4, + 0.1, + 0.1, + 0.1 + ], + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1, + 0.4, + 0.1, + 0.1, + 0.1 + ], + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1, + 0.4, + 0.1, + 0.1, + 0.1 + ], + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1, + 0.4, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_redtext", + "directions": 4, + "delays": [ + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.4, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_sinewave", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_squarewave", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_ecgwave", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_eyes", + "directions": 4, + "delays": [ + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ] + ] + }, + { + "name": "ipc_screen_eyestall", + "directions": 4, + "delays": [ + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ] + ] + }, + { + "name": "ipc_screen_eyesangry", + "directions": 4, + "delays": [ + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ], + [ + 3, + 0.5 + ] + ] + }, + { + "name": "ipc_screen_loading", + "directions": 4, + "delays": [ + [ + 0.2, + 0.1, + 0.2, + 0.1, + 0.2 + ], + [ + 0.2, + 0.1, + 0.2, + 0.1, + 0.2 + ], + [ + 0.2, + 0.1, + 0.2, + 0.1, + 0.2 + ], + [ + 0.2, + 0.1, + 0.2, + 0.1, + 0.2 + ] + ] + }, + { + "name": "ipc_screen_windowsxp", + "directions": 4, + "delays": [ + [ + 0.25, + 0.19, + 0.120000005, + 0.1, + 0.16, + 0.22 + ], + [ + 0.25, + 0.19, + 0.120000005, + 0.1, + 0.16, + 0.22 + ], + [ + 0.25, + 0.19, + 0.120000005, + 0.1, + 0.16, + 0.22 + ], + [ + 0.25, + 0.19, + 0.120000005, + 0.1, + 0.16, + 0.22 + ] + ] + }, + { + "name": "ipc_screen_tetris", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "ipc_screen_tv", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_textdrop", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_stars", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_rainbowdiag", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "ipc_screen_blank", + "directions": 4 + }, + { + "name": "ipc_screen_smile", + "directions": 4 + }, + { + "name": "ipc_screen_frown", + "directions": 4 + }, + { + "name": "ipc_screen_ring", + "directions": 4 + }, + { + "name": "ipc_screen_l", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Species/IPC/organs.rsi/ears.png b/Resources/Textures/Mobs/Species/IPC/organs.rsi/ears.png new file mode 100644 index 0000000000000000000000000000000000000000..9966cc2ac2d83ac43d9d69f6ed1be7e72a3eef05 GIT binary patch literal 418 zcmV;T0bTxyP)wg1*aRFoLo=d;1|*>iFcPfUGjq57fkX#- zaB^>EX>4U6ba`-PAZ2)IW&i+q+TEC0mLt0jME|)8FM$&{EQjMc-hr3z3o@lwRb8*! z-TtymC8d{{_ssZ5Q2i&26{Nakznr(J$jOU%VeaoRcMFU;Q9@j@a>X+h<}pLm{r? zggplTw#A)gs~zU7R#(DNx;&o=a1l!j#<)NPh?)!HlC#>Q3P1gK%U57Bob;6(hyNFPH;#HM&%np?6vL%n!T8_q*!L_$I$&x&Rl!HQA9PmTo) zH3t#$kAlUDd${r&8>tIiUKE~clRd+D{e0enUrGSbMSj5^x%GfennrkQ7%b++XeP+D=xN-M9j z>S`OP?O=A?veVAH?7G`KYEM{yc>PAy+!Hl_BBcZKJ8GQG`89=8IuVT-0rMt0BAzt_ z0NQKJY;iGqjhx2JR_G7T!${GXO{Wnff^j)7+r46E{Eeta?!Stg$?;R%{GUe7Xy|@3 zazDoHyQobqL*qp3W}!OO2C|Rqt2AGl7P}vg=I<{2?(zS5qD@>%TYEPONABB(<@25y zjsqPVC)beoCe)+ms7R4bO~`??E1P&P-fl+|>IPPO*09E&lZY~#bZIj|`*ZB-Z>)yh z693*L^XGfQme^PXGMsH1UA=44A*6j66Yki;0OTHxA-qz`t)*Zw1O4&Gybl#&Ax1O&xi_yfguh`oft5-702NG?^ z&NivjV|%yPOiMQ5fj(rLCfL?<rFe6xN#Ct*g@|CT7z7pt3jI)7r#X%{A5~iuE|ivYp1(VDY}D zI(PQ$RhJ4eArCcU>YNz~LiF9twkvb+Hfts3YESCnwH4Vvd?ISb&N&5g1Lv^>4T{vM z1F8301#p^f6m`@xLaOQ6xSjv#ru5NGo7n!`Pu?i8)Ung}DfP_ZSs^Rhmm4XC0BMk* z3M}}8>T2deY^_uI0o39WnV_fD0uTtufkKB}YJq|CtmK+zOg%A0lVY?};k(G_ zrH-M*+6kxVJPR=urCLh%8j&0arWJcg1t><*Q1&5{H>>2<%Yuq`2>8aXn@Xff;_I5j z+~m$ojBe1o7HVtwI|J;)aYKzeD09c5x)#&nY}U0B4Fi!_2yjG zG#h7aKf9(Z3W#tg&=yzL4oaDTyYorf0jzY+04SQ2<0RJ8~!N>V?$xWIz%W=LvPm<*pUU#Fdl~=jRy;EdX3S33yj){OUoPHn)v`-y{R?Bv-$<5xQT~~O}_iqxVX&1)8L?wgAsBl+CP!}nS*Z~z)Rf>tNEQLi?4&T5lNN?IX z=+>y`mjMC^eKi#=)%$oUA*;mTSV_goDkqyuJ;fgml4aJBDlmej05pYhA+mU7P@smA zsg$`!Xw(qct;|OD3wcAg1lu-+!79F)0Qc8^dX_-zf(0~Q9WgZv`R!JP0BMUvfHX-w zfa@E=bX*&X^ZLUKttbJ?#5I#G1e)^>!xr}4l@Q?h7Y1Cop`->9x)=Tqd8yC>@~pcv zdam;Uk#tqyzrf8KHlQ!KQ`a!f)q*x;CMF>|qXKfw7Prpoy;9(zDA`aIcQR2>=MXvS zta7%4YN@dvy1MDnRQzbqK*u(Qrf8(>ln*yBK72RYF#OK{6l&%52BI@|^p`+V1RR$l z$5kI)IsQ?MJ98oA5i8|y)#EL}x2gG_xQN<|yKw9m_G+3-Gbb(J%Apx~UFF(!k_KUN zaiCu(bsnI4?dl#H&Tv=L_K$%yHFa8k%pq!e2VB`7S|D|MFt zIUnUUP)sMse6hbin)itV<@21ORlIL;r=x3COc6^JIp7h`A2dBjO-~9As*n}}e*yTv zYUHx=C4u)lfqniqfmyg2b~^(_9PkF9q^*|bD$(zyE5K+*D1|k#G@USgyv*~6;z^Hy zs%0z1xZ`I}Rc{IOO-Ii}-+}^R12kh(5e}(vL>|XvwIieyP#(1$s&U6Obap?*e16=2 zaxow#NK8NwuFN<=dhh@%nqmZHTl%5clQfqsj#XiVxog32wD(sSM(?kU5xB5Vz7x(JLAkv+d>1u2Oc=@ zbKb-A|Nq|ezUKgYu@}2FSV}mS63(vHP?i$zzc!8Lk!W+3HMA+TU?~Ah2?|{%6b+f688D_yB;_SwDdD05xD9jBrqITOh_$pth|U2(K0emX zQeulHr|UFOF*O6mI08};q7dm=*J()GdAFsiik9p2w6dy-iXx;0N(W3ymqAKEtQQTL z5-4PCbRKXxT>x-!YGSC^P+PAoQXv#tLnIPGsl_(3@7!-x++76#^!hz=0J-YHy15UO z@BrqUm1gw%J#mdUytHv+W)tVO)5f|HzS@F(06D7!ucv&F<>zB1_znAO8F<^>^62#3 z6NA>dch}wWW~DjU>-Rv{Wlc)d+wM*fkdfvIyfl z&U9IqLq~z^PZ3PFKT2rsZFeUKNVXL>BhX#c($T8s6*%S zA`UJ1;d?%bg^N}!-fG>R50dn7lCHhpV1&tRhQ&1umJ(Dx97auJJt{1g*cRN1LdL%| zjuVl~LZK@Ix3Gw^(I?>M7a><1!+LmqXa5aES0aU`+byVRtVcuBRp<@Il-zIm4y1Wx zLx27fgf#&G;F}zSz{uj72OQ3wp&%t8W~y6o+X(Eq(|;AS7kjZQ;t%IIqK zaB^>EX>4U6ba`-PAZ2)IW&i+q+TEC0mLt0jME|)8FM$&{EQjMc-hr3z3o@lwRb8*! z-TtymC8d{{_pyeCMb4U&W%Wrp9jveTvHaoBRH}`5LY0pCRFklhgb7?Rn$m`=}h( ze^@z|=bQh0J}ssZ5Q2i&26{Nakznr(J$jOU%VeaoRcMFU;Q9zE<}B~?Q^JMhC*D& z3409wZHqh0Ry)jDt+4WR4E2u52>b89%z~Fo5J6EdYl>7H+wT-z++R!(PM`w=h2zaZm*+D9E@ElH7#D~DQFB3DayEOP zox_oZ05weaA^J`PoQR(o>0=0q*c7izb4zw-s29&^!+FSzNJvQJSs_A=V8tllC&vPY zngod=k|ax!DlLT+lcbb#Qc`R=SEz4Y4K06rrQ8ENEEMjdVX87BNO)6BEXI@@v!D6P0;rIlA% zb+rxDb}&0`*=grpcHQkAwI{4UynZ8U?unW|k9UDT$Qp>ZO1vrwIC1KG#*RhlnNi`@@L^LH11_xS%j(IzgXt-TwCBlm5?@_Ek; z$AONGlWWL(6Y5cORHVqJCgeccl})@CZ?~ffbpxwCYgl8?Nko}Vy0n>~{W*5^H&(-L ziGOdB`SU$tOKdCx8O}D1u3okap^O!F51G<4z*yF`hrEDBUI`7emThG^;#b{#LSL|(#)hik01Btd{ zXPeaNvAx@CrX`#3Kp(PA6Kw0ba*HEZCC^l4dzntU-D@Nqxt2rs=1C&XF?VMP7Rk~l z_v+Z9QF||*g)PDeN(Hs7xa-Ip@*o6t^wHDmnL8QU?RDA!DoMXZLDoE9{-dK{o4|6Q zb7hO5aCM7rFejsEmY_j>Iq>461Hj2|EfFIDalbNdStlSpZVTsRocSDw>3-~vQ}$%v znjM-Hq=9nOg1zOYhQf+%@$dB_@|noPWhcJ)dLts%EE*f`QoOm;r0-U@LPWZHcy$ zC}y0nRdFM{bGZ}iN?=oD%WMbp)`qkb6EkUkP}v*qX>DSx<{Ik~#d;iM*-m3?uy|in zojZH>s!N5KkcXNvbiwI}uP+KTKSJ`puz=bQq$f%8~`21V-B zfzBSeCvTKk>ey-glzQgytdJG$%Z-#mfHX)@ z1s424bv5%Kw$`cq0BUiGOwiM60SE--K%v7fwZOo6R&q@T1rD zmpIfV=B|L0=si4_mFM!|IgAA8$8lS6NK};A4$@$VJ>}pOe%rVSo#QChNio`~@Lgo| zQpZqY?SxZwo`sl-QY|HWjYy6I(~3Q$0u-ZYDEpAfn^kh_WkJO|1bk!HO(oJK@pa8% zZgOWPMmOkP3$-=;odNdYxS_@!l)2+jU5n{(HtXi8Vxf1P&AQy(%$ZW}jg! z@L{NzCj=|tZmJO&gH2x+)M+UUY+6AWs6T{cVu~9IGT&IjT?Crnhu&A@(dy;ujAUp_ zBR?=e-Q8p_Af}0%mj-w)&DW{9Uyx^gs#*jVC8?iWTwuX>GbFVtOoq>watgeh(TW2O z!8I~8bv=9K%B$Su-YGIG1+JoU$3#FFPCt+Y+NX{}D`}t7lhkQS({qK1ErhaM3W6VY zxTwID%+ZX~8k=s7U7JdNN~H7}zSLM!i})mLLCV4eZ5{5ejx+?prYo8+GgAchQa=Nr zgnAHh7A#e+XPp2Xai`*2G8=z_2=-Dt}8s~`!|WwvV3SFkX2%EtfXRPm6Oe-p5hM&$ujFm6&S%%0Gh(M5Lvu3C{RPm zRLWchYG~+thqdTtw}~T{!j&do|6anUfZ9<W8&2ak~=9St;Q458z#epEQLdh>_AeE0SUL=@{GHqoLN`lmkR ztfbq|XU7{;vYOW2T2f>tM00c?6G64{dsLiVn_P=_SQ)%XkW$ zd+lTWs=`I{i@xDB4NIjbH#Hh-gNPD2DdboH64xg_uxP`de0}C+aF)0ME>a zB#Bw8V)N?FKVXzjfNJldo$asesL?f)D^Q2p&KhM`{q14V1E~ zW$j|nS<9)}TanGm7PdXoT{%b5O1plcN?&(?IuB62c6AR8XSl0r`^P|_f|ECGG#RqdQ6w{r&NJm zRp1}SxAx)uc3?snWwd1+9_Jl>a}u<5OZj9H@;~X*AWSWmV392B1U9y<)QDn2^tTP@ zA$xA7ifDI2l2Y0bPLU8y7SksIhcoc}(lV%h%{)*&ywV>`I4NW)Qi`pG5)>Bfl{(A+ zoR9JvD5jHRzSv(M&HKcG@_EkCD&Dua)6ummrii7A9Po(e51O8%rY8jlRY(hgzX1GS zHF8<`lEC|&z&?MQz%1MhyPbg|4tN7l(pF1zmFV}<6<{Yn>;X+Jmi_ zVU6=BIk4cp|4=i}^QU&Yn0zswpl2 z000JJOGiWissN_|nBg~U+W-In32;bRa{vGi!~g&e!~vBn4jTXf00(qQO+^Ri0~rf4 z4y(C!$N&HXAW1|)R9M69R&7WVVI2Q0C9U&?ZbjI18%ag1#K_$4&YO}EDj5ZVFMS9y zjO^144Z?{p-wO1bXx{_LPhn|AL1GC8B{72_g4F5g#o04mh1ULk=#+DJt4*{Q@DB&K z=bq<&FaMVvupaC2zXnGP95GZ{ZQzLgS$sk-|&-z**jF{5gqKW61=9qmgFEUH(#;x=j4c(*BwIAT0U z%$(6HQD(P9woZ|vbtLK(=n+tpSR}HT4uu3ClX3ts4)iYrwKoe(m#tIO?EuArJ#JGL zsebeJW`SZ>?kp%kuHAwBf&xt!xJ_Be?v!-Xpg3Swt(!BuC5;R5;mUnAE&#xmk;m9A z6d^s+j6h%xp->3f&QfeV@*R2CX8{0h-k(Kj?JCAw1*|q*9&7UsS^&)HbwhYD8X_s* zFBZdc*ohPXiL(sPM?6SPNx_W&6E+nYFx=R;w0~Du30|M?<7?C9={E16(cV%rt@qyH z#y(>>fq1?A2bBBd&^H)hfM@g-_R0dLUc3aC#9NXf$c!TyAVbj?`pt@8~cnp zEvsq8hz?}dHNk2zVZu9wLveBVnwWr(!_VONGkAvjm-RnKjIT|Xr=L_OM^qXqHs~z| z4XJo@tqBh=o`czv0T2-My$55n%fQn*+Dnxqt_PN6&_Dvd+yej!|*FIz8aSXP^~_2;cV_cv8cf! zIWWJ|f*G?3{P-lcPI%#YG=zzhCATK)8&0gsACh`Fsnt6KktA6rXKxR2#3=uE4;5CF zQJ&LD95K6c)*4d{{0>+ZPq`!xCVLL}iAm(#xetDP5=PSwEX*$ez_B&^HdxFpN37H# zh*W*0jtVQvsJyz09D=B>f#em{K#U{1)p7JxLvSt#0Pqa;9}gN*dlm3{09SoAuGuwl zLG6TcwMJ9@tLlIn%va;;{i`3V(JEh$_4sGv2P)sIg8WP`LI3~&07*qoM6N<$g0@xd A^#A|> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/organs.rsi/heart-off.png b/Resources/Textures/Mobs/Species/IPC/organs.rsi/heart-off.png new file mode 100644 index 0000000000000000000000000000000000000000..7dda0d3a8e66c7e94d84a3704387bc84f3e9997e GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7ekj z#WAE}&f6;+c@HZHuwKa5w03!UDR|kEG^Sr$^!6|)Z)j>yV9GkB^MKWe?P8>1*r_|N z5fk63l&EvvXZ~Gt=-@&IRt*P6E&;|MFVkZk0!(|pJC{3XvQGb8diG8N^NTO}Y-_e| z(RwZx!H|{L6Zu*<|Mz_*m-PzI?_@ofc`f*9^=OaTt;{f*s|NA>;1wS&I&Ri$J70|#WQeg3b_0?ki_J51FaR7b5;OXk;vd$@? F2>>CHVJ83p literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/organs.rsi/heart-on.png b/Resources/Textures/Mobs/Species/IPC/organs.rsi/heart-on.png new file mode 100644 index 0000000000000000000000000000000000000000..676a641989a8a0792243f9bd7d4cb4f8f1e87af0 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(y zxt=bLAr*7p&f3^{*g&E+{y~|=rP!&*QpG$TbKY6*JCW6Tb2X1ZQ*Qxpp1)KXwj%EDbW843Mb*KOeJAm^)$r?cD2zrt#|?Pal2$Sx~j}=d`QSRTOee z3dR4`%1M4W;~&SEedC|iW+I*=EHq`3H_$|1#*Wdc$6kRK=n<{r&enU)nE)d=Y~x*d+hJ6QtnPJ9di& hz5<}2gBx^?o5$$Oi@w&$wB}C literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/organs.rsi/meta.json b/Resources/Textures/Mobs/Species/IPC/organs.rsi/meta.json new file mode 100644 index 00000000000..d6b1b51038e --- /dev/null +++ b/Resources/Textures/Mobs/Species/IPC/organs.rsi/meta.json @@ -0,0 +1,47 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Yogstation", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "heart-off" + }, + { + "name": "heart-on", + "delays": [ + [ + 0.6, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "eyeball-r" + }, + { + "name": "tongue" + }, + { + "name": "eyeball-l" + }, + { + "name": "microcell", + "delays": [ + [ + 0.5, + 0.5 + ] + ] + }, + { + "name": "ears" + } + ] +} diff --git a/Resources/Textures/Mobs/Species/IPC/organs.rsi/microcell.png b/Resources/Textures/Mobs/Species/IPC/organs.rsi/microcell.png new file mode 100644 index 0000000000000000000000000000000000000000..18b692a5a99ea63a4f475dc30e5f69cdcb14608d GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZnt_3l z!PCVtq+-t78;abA0z_CJDBs9YGu)*V;d_cDmu=%rmd}$ezKSnE^UCZQe??y`+w-=&#}D1!9$V2I++HB)z`)2N5RiMoVgA0!?`|!RTG{aDVE1Ru z-G)K!8ug5qZ5Zmd$<1y^)S3D%kj>>H?>#l2>&4m2cJ*2*^gZ5kK5F&*uaR~NE1&IZ zbidu&wvOk)&g$Cxwk>I#4C}6QTfI2hf1r_7R#?)(sA)^dSKEJfU9Rp0^1ljxIVp26 zy}#anymn_peVtt^LzfN{he87bh-k=SKJvM7?cAr#(Xm?cC$1;h9jIye$?%!+8S@!- e4uu7W8u)vkl=0_xPqGCD5QC?ypUXO@geCyzPKN^k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/organs.rsi/tongue.png b/Resources/Textures/Mobs/Species/IPC/organs.rsi/tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..dee2ed3b99fc35705f70b30b6541e506e72e896d GIT binary patch literal 516 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 D;qYS* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/head_f.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..31d77176c96e36ee043c1f9e40a214715586ed4d GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCdO}M*cF=3&%nUUfm60Gox(|3&`j79aH=3ESH?Dlzw&^|ETlFI!lyRPUUTiJZ>vfR% zz{iRs6*g`%$Hf@FR@rJSjpC2dOqG|HXJl~VSdz)5$ind8;X}s!{QNQli3`V%x6fA6 zXlZ!=du#H(_s$#>{a0{j9}ZV$$eeZP^PXFV=RZ$aw(|3W^UsaDSS1*m6b}5XDcjG| zBEWLMPi?Y&mP6tl&tLI93^!g?>2Eoy*e&A48$KAZ?+r_(C85T?~cDNY0k)u?! z=9xD4uigLNf0!Q?ePBJ?g{vE<+qX$DFefnZG%y-4upMAP;Y4k7Gj}@u^wawJxxcga zbmpIHU@N=2^~e6abL)>z4H9$kR6nD#`5`c2oZ1!8vE`bX=cJ%`$5qRhc`w~)#lx`p z;))d@|#6i7+1Nj;11o96*}K@Qi6em0tZvkEJlVC62VdJtFLkeothN$?A3!!H**x0 z9?9COb#?w}A(iEl0UQ&03{NTIxU7}UyNSj+NF>9Ca~81^gsCbKV#_Y@4p!u z&YwRoZ~0-%!~fBre)zNATUP&1CJlRNfrHLGZ9il5I>V@c6JnYefWXt$&t;ucLK6TW CC5b!$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..53d6069a283d5bfde9f07ec578d7e67338ea8dbf GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCMF=NbU38qCj$dBlc$SgNX4zUvo>bEHV|q1U#uy3 zR=VQ#gR>_m#qtYqJmKWxP2n(9&7Zh;ipEW&lGAfmu0Gx*KGE0NY`^2d$?t@uZ(nbH zeWmEV>hqjQJnqjwU!1t+{+BObTB5hb?Sh)GgV$*o{_KD&wFkep8q^y*~-rg&ObNqVwGTMQaJFlrffe; zivY_3KefsBSq_PJJb%UaFx+@mrN8B*W`l|E$4{S}UVpu1XK#O4g8BaU&1)9u87Xur zO$xd-Yms}nU~ZAfz4za5hPB+y3)gb$KFYLi`+-AY9e4AlZx`=oWmqt|*x_Q}MvhX^ znrGVFzjpt7|6zVq^nvwk7p`ucZr>)sz?{Iq)4*uJz;=KEg%h>S&D`nq(@*Q?=l;&x z)0uy+fvxQ7)*t)x&aFQ>HAu|CQ~iv}=7+$9acWmU$Chhmo|A&&9ak-1=Dl>I6%WJW ziz`-eJQZ`DSX`^nwJ1vSjzqIX-`g5HcBvIE;a3~7K6p-2@DyrE$Dh_eKC58YnMLao4{K4)BoV#|BRupzyD@v zIDh`Uyyb^25C2Dh`r*%dZ(036nKbO71r9p%wEc|H>kOm*O^9h?00K`}KbLh*2~7Yy CJ&HU4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..4f042bf40e07391d9df13e6f861429a604924578 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCMF=Nyd~HppMil%&eO#)q~g}wS=Q@b83?r1D?jOr ztza$5Y2o8k(JEiLsVziMB-nM)dACbT7nMxxW8G0a`L>L*#yRDkd}b+bPD_40{rN0a zUF`Q?x#DfCX?Z*ij0OyB2N)z6m=hQ_Z%y^s`1$9ZdfTq6S*&YKJ2X1BZT;r?TisfQ zuh2;0e6fiyGsE7kW;51p-IhO#t#aP-Sf+E93_F}Px|C*oj?)a$z43Zap_LdFDbv!)Vw;wWOXnA*S^Vx=# zj%xf39SgSpGwxV;VA^|ut%~YiN?qkrGP_^&zh*R?D?h8&hE4K7`^^iVqL&1;8|MDh z>+@e~`&&-I>7KyO7(GvmsYl#8_??U8n>XL%DrN(Q+=ow^22YlrOkw!Lw5;HtIeTYD z$m3Wa(VrKB6IQLs}Y^zMIhV((r+H(FdU!M!)W7 zn)^PUdpvKuaG)qe*l%-dmPdiXv@K^l@P>gxr~`2t%s19^?fjweGSq240}yz+`njxgN@xNABcvKo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9bede218091d867ae80afbc6e6e8263dcb0c30 GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vo)}JLjlYxQpq^FBxNX4zUw>GY8G7w>Vus`cY zO?RK)-3rEZH8UaKm=Z&~HeqSuPG;%g^tgi)r*407ZE1Ov#=R$MF{k#n{Pzi3v~>P* zTN4GocIIg^+B!BI4h&2J4Gb&_42-y#4XsDgPE5b{+Vqo+duS-bgDuxKTvO^xW)S%O z_ulEFaeCtEYh49cawnhIw8pyLMsE4Z2AlKo{HVAhGwG&A1nTx z7OmanI^jDb#7hnG?{81%Hkf{}f2;V9j_a~g*TMenW||Sq`hm${IoAPAPzWS^tY*|_ zu+u(xW5*n(LoZe;6~%YEhW2I&=NhcdVP;FJvLt zfBj~7n&+e^%nbrfsW(5_^#8pi`*=?J!OeH`rt`CIiPC*mDHpti=~~`)Nt2mH4BK)K zm)@N&v|}q{UCEl<+dn0mKmU}OeDX>7!Spl5!{Q&E2z2!qh5%dEqGHn(#s#taxZ|08o(e0Se){PhLw&u3q=;3zGPAxTk^B?X5ZsIfp^MwUtQi{(I4u?N9+$t&Wtyzg`2M%W{PX$-TeKe-&*W`)))C__i(R~G zb3N~$pVelw&!$XLc~Q1IXK&p96XuJzAInhpK*VK3(=Flu@|UZX+E({70D-5gpUXO@ GgeCyxA{#yc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..788f2769d430d38fc166ad9d96c98c19ff51b141 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vo{v%hJpMimi(bL5-q~g}w*@}}68Hlv~fAi*m zWPz=N=(_C=4`(#aDu3opblh=+D|JZ1oLQg{=0y*cpa65F9~^;{ZH zF6y7GuAdZcIM?rD>TieRy$l=;IM9ORZ#SPDfBp5>r>gC@B^i=--&OJrPOrD{oHYCG z`LxZ?nHU-@`p#C^xQV#lc>n!ewU1ZkBa3bMuG3Q2&t~$R6jPt#w)o=O?B42qI^L6? z?<_ZTkl|xza1e1l*S2@-B8@+tjN7iOPv+cmjic#+=lk21@zYcp5-enx8Unn2PG;>p z{&;)f10{i55{sua1)Zvx%J$ZzK=NcF*ID0dT!O&eva$D9>=xijn{q!O~3F{$6)?>-|Gw= r3LJWp2c|v$vs2K{##i-5?r)})t~FUclSNB_>4U-3)z4*}Q$iB}Ez1U! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/IPC/parts.rsi/meta.json new file mode 100644 index 00000000000..1463c57a060 --- /dev/null +++ b/Resources/Textures/Mobs/Species/IPC/parts.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 2, + "license": "CC-BY-SA-3.0", + "copyright": "Original drawn by @robustyanka on Discord, modified by @pspritechologist", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/r_arm.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1ff1ec9cf0b2332d27d4af863375b326ddeddd GIT binary patch literal 737 zcmV<70v`Q|P)-7SF9KwFTuLpoJmXC!Ha2%)C0BqZa5Tdy`Ac`V*o(IQqvgjLK zKwyj^ilQ=~zRT%!%E#;Vy4D;pD95!t45_rCCcf9U{;vR{C<0@w zF^8&j0TunKc3NePQ0e(i!%}U9D*8=bMs?j1%j!3~RNnQ{SsQ?^MI`{VCphNlYXi_# z%d8^SP@GcL-)R>Zl32QGYbdSN>`Tg07x-%chO#?E89)I3=mJLz0F}*&wqX_R(z+jz zO>Xa$R5756gTL8TW#X+g2YgbN8QF9f=*>b%N|_cuZ;c$%s!??gNaHw0k|f!o(k~+P z^})$fytg5Q$X-LibUJNy0i@&J$|b-#$Mt$e7=}oa#29+3RLX$c?S}1kn@7G-3azDf z(^;Te0tmw}e`nxuIKcP)LH;V7*EIcOgq{Tm00AHX1b_e#00KY&2mk>f03(!tpGFp( TMrgpu00000NkvXXu0mjfoE1Db literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..2389c30aea5458ae633b88839ed9f2b51163d25a GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vok#Wgx9s>j8eoq(2kcwMxZyDw_8;Gzy_#ZlT z`yCZwY4Harn5I3et1Fd$_$2enNk;{l)IFsq)Mu>Fr2u4ZuP23Z_9p9^4xy>>MtI)4?CGB zsT}-T^)}}3#O?p*KV14=TFEuABc8vu^KWL}b!&>+IU9)6moXKbzdW7O zVERe^N$h{7E&Rv>^4f>@48P{QE8fLy!*k(z$^6T*4T>P&CVV{4=jxpJ%;ZpYYv)d~RE zD@RiZfyH8>eBTEE*tU&+zt3U=IG0+jmW!00&*uPuN~Mxa4XD@aux&fafR`63Wuirp z0l;W9LakO~ap&bT#WYPOr9`=0hUag}?yXlh0TheH zf8R%=5nR{RGF}Mr(5fMX(1zf;uGTd8GXsjnB8I~ulv0^hcFy_TAUNk*fnv8_j9m5s z_x1#lv03#D=lVOHPCA|7U(RLSFx{*FD@)~RM*pMt0y+Vp-QXujKQ#c)?*3BS4!@F9 zy81I+1>WXBB#-O*%M`)9)B#!s^Omxd0R$jJ0C{R~QURcIIPq*)=XUAn)}8`Ual57@ zjsbBT{LQX7g*R3WxTP$u)1X{5LXnYq>Kfm26-c!PWZ3}SJ9e|#Onx&20E@-q>itHe z@q>PrQ{Xon-y#FjSY5O-;5^djMqRs~w1i=Z-EN043}G0?O&fJ=`qDLGGMT6#2viUR zs?}<#%jeN2Y3BhzN~yZtu8OYD^~Kd~=o+(JF41T-P%4#RSr+#D{r|xXBee`L3qdWnx62PKP{3oldVtE9vM1 zfa5sq@_rbGSg+RrfNHg>U5FX|YmCkV2mk>f00e*l5C8)3q4EucqAv)4nq?LM0000< KMNUMnLSTY>1XA_@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..f424b2efbcae1ef1e98d9baaaa55659971fecbdd GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE(~!XIA!A2IY1H40*}aI z1_nK45N51cYF`EvWH0gbb!C6fCc!Vok#Wgx9s>gtr>Bc!NX4zUv-kI{au7MTzj(8x zmi&Qphc0!UJ9N!`f$_zbLl**n^6X=n%Go-1>Q;S+#3WZwM{|A$)w4N@ulIg5<9^4X zcYmdVV&mu8pPwi5ohaJrGXE`qRUV5211@B{x!+3scwx`wmnjS@Yajovd(9VqKCx?&fotFm-^Py>Is2+}1z6S>{Hxn@|2^Y@2-bkLcAIpX zpI2U5dcptll{#LA2AlI6BXk7X7BVX2uKDNus`K@(Wtt7QVjZ&ozO70;UAFt~{^ie# zb}}$bQrXC_aC+0Zmc2o*UZ$^}%`|D*O3uR{_Rrp*^;O=wKZq+evQ9M9a{l=;z*Q)>k1gA+v zK~#9!?VB%e+e{e1e>Y7r>IX2hw6HEDETA+rL1vXUDZq9?6qJ301Vsi-4JH*<8nS6< zCK)xPF|#H!e*hz!+zVD)?KV|&mdmua_efFdv(>x%-Sg*s&lBpaEzA8o;ZSw{0H2y}iZrJjUa(jG~CLEHMm&(P#u9hQr~r=RMD3y!00MFGHKu>hbbidqYl%X~g>CJ&J3Ia!u5pU;`k z=W0y=AWc&M27^J<7RPbZu3D<9YR0kO?|J|JJ*H_k?aG~?=XoMcQ{p&oK53fbd7d~w zKY#Y@vF#tgwr%n}XTRSAu;1^=^Bmi@PXl1RUXvsVX__{lBuTisx;lvl42MJU==7RZ z55th*a43{V0f5WPOIh1s6h(|iBQ7p3uq;agLN$QRX2Wv1WHy^M5LT-dMN!c2_tk4a z9LEGffN7cln5Ib(1jKO+z{A6XQUHU&K>q0L9(>5AZZ;dW8cF{eRTaMP*9&mEt#GaK_4fL5K{1_9MO9UVVMrXu zA`HWNPy!H7wct;~;4c6Q+qOkL*)Lzdh$qoN9O8rz)c{ddl>iuz$Kvt&=&St#Kv7kd zux-2P|0FL%yf;~XJ^1tlAzJGUjr*0nr@cHxS-%?){JHg-W|F541sG7V! z5YYfM01ZF`IHI%)gKf69iVj1y1{_;Nn+lQJ+uMI)Qf-dKm1%$~mDMJo0sJEX^t-@c zlD5b5+64YjQDD7Z(>6JKQ~)Y-0zU%%RbPidfBOfvChPiu^Ye2qE-u8=K^)r&uGj14 zf4i>BcDt295HvLk*Vor#GMThKEqZgv#3z%9bR36%zfW0~>~=ePy`BW5>$*xKfa|)l z*XzmMZbw;`^!t4r$6+#=NW(Csat&B47Gzn5@B2+IuFlP!N{XUjwOTQo%}A1j-EPNp zI^~e8RBH{WCvO-=)AmwwM3vNi)+XTl{y~|kwz)xqAZV_WBmuq`E1U{Kp6AaBGM+9( z5Cp9?v9$&`j`LF@B1saWD8jNVrRniU-y)(YYT(ym7zSloindzNIx(`@Y-GRRr`zoU z-_zrkWigx0$g)g%jeu#IvMfthtJSkwp)^hDcDpjqbD`7;0wPHgnIs8iSvF4a(GJCQ zI#qs#QG0ve_n(n+Ki*gA1ncs=+62CR`-TwWpfR)pU|E)M97k@qTkh}g zxxc>$zE^J5B{Qdxdg67G6lgX?Z5^@DzZ%o8!y14FpaEzA8h{3%0lZTA52ABh6?@6+ Q5C8xG07*qoM6N<$g75NHga7~l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/IPC/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/IPC/parts.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..df2588b562d64e65b33bceb18ea7dd26889339b2 GIT binary patch literal 1232 zcmV;>1TXuEP)>ya1YJo) zK~#9!?VGV`<4h38|NC)BTp$miP7rmr8+R_;x|J(+fdo=mP9a=5k6>3ug=H0ilmS=T zXK+A8aGF?M21G2WaX8oJlnc3Y5xwyE%SC;?q#YF?q z05kv%Km*VKGyo0Y%gVQXzwrJ0cl7&xPANrMmM~2duImB->GgW=K06!^5k=8aCp;Vu z0f6`WeL0pS2>_5Nig0;(sTKesg!g(qbUGc}+}vO?nc(#F6xY|+oKi~W^SM%sO{Y^1 z0C}E+F$T-BFr7{TfEPtUlzV{dx+sbQ05F+M002c%z;#_vN|n3pcsz#h`(TU#fP7sn z7WFKFmzNg+K&R7@V`-Yoan({)m7K?Bvq7`jgk@QBTseSU2p^vtjmEq2W3PVz@H`KU zF>E#)0KjImf#W#vJP*s|vK9a&%QC(@kYyPFkdFXVh_Jly2E#CrBng_$W<4I@I1cZ2 zyI_ogQVQ2~v3=$Mh-v_i zzK>Vep0m^ zJq;R$0mCrhd7gZKXc{~y22@prBuS8_DM^w;(7G|JTn0>c|NCKtu!305kv%;16Z*H2Ayat)jzF?Ey#MS{_mf{>!p&C8*2; zYB(3rOF#qAdjahM8o)mb;BRDsLzdl90X#oHqb{Jo(sc;*Z--9k`uduS{(wfKfo``; zb|-P{AQ(lF{M)|oW3^iGIF4nH!hAj_wVVl_oSg8oED;0&R;v}Bo}K{wIHuZKg|u2N zWnSR>K5w;J@?5apZll}nA`C;Arir(=H==Y2OePZqK_D(8006VuO!f@aAw^M$`#@w_ zhA<2f1cB^VPzoT=b4gpsXO|J_1_OB!u?vDy3fs1o-VkpCE1{H1_(Dw6L|K;VdxRKcyxnd?Tt!=!1>3eU z8jX Date: Wed, 21 Aug 2024 09:15:58 +0000 Subject: [PATCH 16/74] Automatic Changelog Update (#744) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5e71822f4d8..08f486f227d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5478,3 +5478,9 @@ Entries: implementation of components. id: 6276 time: '2024-08-21T09:10:28.0000000+00:00' +- author: Timemaster99 + changes: + - type: Add + message: Added IPC as a playable species. + id: 6277 + time: '2024-08-21T09:14:30.0000000+00:00' From a7149e2ffb0cd7fa83aba22007cd310a2a8e8d53 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 21 Aug 2024 05:46:52 -0400 Subject: [PATCH 17/74] Update MoodSystem.cs (#761) # Description MoodSystem was lacking a Component Shutdown to yeet the alert, so it was causing intermittent test fails. --------- Signed-off-by: VMSolidus Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Content.Server/Mood/MoodSystem.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Content.Server/Mood/MoodSystem.cs b/Content.Server/Mood/MoodSystem.cs index f0c293971a1..7b73da64891 100644 --- a/Content.Server/Mood/MoodSystem.cs +++ b/Content.Server/Mood/MoodSystem.cs @@ -38,6 +38,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnMoodEffect); SubscribeLocalEvent(OnDamageChange); @@ -48,6 +49,11 @@ public override void Initialize() } + private void OnShutdown(EntityUid uid, MoodComponent component, ComponentShutdown args) + { + _alerts.ClearAlertCategory(uid, AlertCategory.Mood); + } + private void OnRemoveEffect(EntityUid uid, MoodComponent component, MoodRemoveEffectEvent args) { if (component.UncategorisedEffects.TryGetValue(args.EffectId, out _)) From 609eca045acb99f64756633f330eed1b0b415fc5 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 21 Aug 2024 05:49:54 -0400 Subject: [PATCH 18/74] Traits Refactor (#765) # Description I decided traits weren't flexible enough, so I refactored them to also optionally add Actions(Activatable Abilities), and PsionicPowers(Going through the PsionicAbilitiesSystem). Neither of these have any current implementations, I'll leave that to other people. Trait Components are by extension no longer a hard requirement, although if you add a blank trait that adds nothing, you have only yourself to blame. But doing so won't crash the game or throw an error anyway. # Changelog :cl: - add: Traits can now add Active Abilities to a character. - add: Traits can now add Psionic Powers to a character. --- .../Psionics/PsionicAbilitiesSystem.cs | 3 +- Content.Server/Traits/TraitSystem.cs | 75 ++++++++++++++++--- .../Traits/Prototypes/TraitPrototype.cs | 18 ++++- 3 files changed, 79 insertions(+), 17 deletions(-) diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index 6a89ba20b07..005078242b0 100644 --- a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -141,8 +141,7 @@ public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, P /// public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, bool playPopup = true) { - if (!TryComp(uid, out var psionic)) - return; + EnsureComp(uid, out var psionic); InitializePsionicPower(uid, proto, psionic, playPopup); } diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index 628cb43b8d2..b287d2e173b 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -1,16 +1,15 @@ using System.Linq; +using Content.Shared.Actions; using Content.Server.GameTicking; using Content.Server.Players.PlayTimeTracking; using Content.Shared.Customization.Systems; -using Content.Shared.Hands.Components; -using Content.Shared.Hands.EntitySystems; using Content.Shared.Players; using Content.Shared.Roles; using Content.Shared.Traits; -using Pidgin.Configuration; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; +using Content.Server.Abilities.Psionics; namespace Content.Server.Traits; @@ -18,10 +17,11 @@ public sealed class TraitSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly ISerializationManager _serialization = default!; - [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!; [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly PsionicAbilitiesSystem _psionicAbilities = default!; public override void Initialize() { @@ -49,16 +49,67 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) out _)) continue; - // Add all components required by the prototype - foreach (var entry in traitPrototype.Components.Values) - { - if (HasComp(args.Mob, entry.Component.GetType())) - continue; + AddTrait(args.Mob, traitPrototype); + } + } + + ///

+ /// Adds a single Trait Prototype to an Entity. + /// + public void AddTrait(EntityUid uid, TraitPrototype traitPrototype) + { + AddTraitComponents(uid, traitPrototype); + AddTraitActions(uid, traitPrototype); + AddTraitPsionics(uid, traitPrototype); + } + + /// + /// Adds all Components included with a Trait. + /// + public void AddTraitComponents(EntityUid uid, TraitPrototype traitPrototype) + { + if (traitPrototype.Components is null) + return; + + foreach (var entry in traitPrototype.Components.Values) + { + if (HasComp(uid, entry.Component.GetType())) + continue; - var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true); - comp.Owner = args.Mob; - EntityManager.AddComponent(args.Mob, comp); + var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true); + comp.Owner = uid; + EntityManager.AddComponent(uid, comp); + } + } + + /// + /// Add all actions associated with a specific Trait + /// + public void AddTraitActions(EntityUid uid, TraitPrototype traitPrototype) + { + if (traitPrototype.Actions is null) + return; + + foreach (var id in traitPrototype.Actions) + { + EntityUid? actionId = null; + if (_actions.AddAction(uid, ref actionId, id)) + { + _actions.StartUseDelay(actionId); } } } + + /// + /// If a trait includes any Psionic Powers, this enters the powers into PsionicSystem to be initialized. + /// If the lack of logic here seems startling, it's okay. All of the logic necessary for adding Psionics is handled by InitializePsionicPower. + /// + public void AddTraitPsionics(EntityUid uid, TraitPrototype traitPrototype) + { + if (traitPrototype.PsionicPowers is null) + return; + + foreach (var powerProto in traitPrototype.PsionicPowers) + _psionicAbilities.InitializePsionicPower(uid, powerProto, false); + } } diff --git a/Content.Shared/Traits/Prototypes/TraitPrototype.cs b/Content.Shared/Traits/Prototypes/TraitPrototype.cs index 2e6b7cc0666..01fc520ddac 100644 --- a/Content.Shared/Traits/Prototypes/TraitPrototype.cs +++ b/Content.Shared/Traits/Prototypes/TraitPrototype.cs @@ -1,5 +1,5 @@ using Content.Shared.Customization.Systems; -using Content.Shared.Whitelist; +using Content.Shared.Psionics; using Robust.Shared.Prototypes; namespace Content.Shared.Traits; @@ -34,6 +34,18 @@ public sealed partial class TraitPrototype : IPrototype /// /// The components that get added to the player when they pick this trait. /// - [DataField(required: true)] - public ComponentRegistry Components { get; private set; } = default!; + [DataField] + public ComponentRegistry? Components { get; private set; } = default!; + + /// + /// The list of each Action that this trait adds in the form of ActionId and ActionEntity + /// + [DataField] + public List? Actions { get; private set; } = default!; + + /// + /// The list of all Psionic Powers that this trait adds. If this list is not empty, the trait will also Ensure that a player is Psionic. + /// + [DataField] + public List? PsionicPowers { get; private set; } = default!; } From 841991d789def91e711060fce5a2ae678d760687 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 21 Aug 2024 09:50:25 +0000 Subject: [PATCH 19/74] Automatic Changelog Update (#765) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 08f486f227d..ba7edd33244 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5484,3 +5484,11 @@ Entries: message: Added IPC as a playable species. id: 6277 time: '2024-08-21T09:14:30.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Traits can now add Active Abilities to a character. + - type: Add + message: Traits can now add Psionic Powers to a character. + id: 6278 + time: '2024-08-21T09:49:54.0000000+00:00' From dfd2785ba4a99d4f491eb84683a4adaac44ad911 Mon Sep 17 00:00:00 2001 From: username <113782077+whateverusername0@users.noreply.github.com> Date: Wed, 21 Aug 2024 19:50:50 +1000 Subject: [PATCH 20/74] Made Stamres Show in Resistances View Take 2 (#767) # Description title for some reason something went horribly wrong [here](https://github.com/Simple-Station/Einstein-Engines/pull/766) ---

Media

![image](https://github.com/user-attachments/assets/a9e71b67-ae47-437f-a370-d25b6388d48d)

--- # Changelog no cl no fun --------- Co-authored-by: whateverusername0 --- .../Stunnable/StaminaDamageResistanceSystem.cs | 12 +++++++++--- Resources/Locale/en-US/armor/armor-examine.ftl | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs index 7632eed504d..170663104d6 100644 --- a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs +++ b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Armor; using Content.Shared.Damage.Events; using Content.Shared.Examine; using Content.Shared.Inventory; @@ -11,16 +12,21 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent>(OnStaminaMeleeHit); - SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnExamine); } private void OnStaminaMeleeHit(Entity ent, ref InventoryRelayedEvent args) { args.Args.Multiplier *= ent.Comp.Coefficient; } - private void OnExamine(Entity ent, ref ExaminedEvent args) + private void OnExamine(Entity ent, ref ArmorExamineEvent args) { var percentage = (1 - ent.Comp.Coefficient) * 100; - args.PushMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); + + if (percentage == 0) + return; + + args.Msg.PushNewline(); + args.Msg.AddMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); } } diff --git a/Resources/Locale/en-US/armor/armor-examine.ftl b/Resources/Locale/en-US/armor/armor-examine.ftl index 6dc511e66e5..53a5954ab61 100644 --- a/Resources/Locale/en-US/armor/armor-examine.ftl +++ b/Resources/Locale/en-US/armor/armor-examine.ftl @@ -17,4 +17,4 @@ armor-damage-type-cold = Cold armor-damage-type-poison = Poison armor-damage-type-shock = Shock armor-damage-type-structural = Structural -armor-examine-stamina = Reduces your stamina damage by [color=cyan]{$num}%[/color]. \ No newline at end of file +armor-examine-stamina = - [color=cyan]Stamina[/color] damage reduced by [color=lightblue]{$num}%[/color]. \ No newline at end of file From c0282e6875a56bb949e256bf923685f7da45d0c4 Mon Sep 17 00:00:00 2001 From: stellar-novas Date: Wed, 21 Aug 2024 17:00:01 -0400 Subject: [PATCH 21/74] Minor Ifrit Health Rework (#762) # Description Closes #754 Ifrit is a fire spirit, he really shouldn't be taking 1.5x fire damage. This makes sense and should help with players accidentally killing themselves with the fire ball. For balance, the cold damage modifier was changed to 0.5x, unsure if it should be lower. Minor passive regeneration has also been added, since there isn't another way to heal other than the Mystagogue sitting there hitting them with the book of mysteries. # Changelog :cl: - tweak: Ifrit has received some damage resistance changes --------- Signed-off-by: stellar-novas Co-authored-by: VMSolidus --- Resources/Prototypes/Damage/modifier_sets.yml | 10 ++++++++++ .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 13 +++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index a6798e39cfe..811d5a580c2 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -349,3 +349,13 @@ Holy: 1.5 flatReductions: Cold: 3 + +- type: damageModifierSet + id: FireSpirit + coefficients: + Heat: 0 + Cold: 1.2 + Blunt: 0.6 + Slash: 0.6 + Piercing: 0.6 + Holy: 1.5 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 44fad43bc22..173c7e43ec4 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -62,7 +62,16 @@ - type: Dispellable - type: Damageable damageContainer: CorporealSpirit - damageModifierSet: CorporealSpirit + damageModifierSet: FireSpirit + - type: PassiveDamage # Slight passive regen. Assuming one damage type, comes out to about 4 damage a minute. + allowedStates: + - Alive + damageCap: 120 + damage: + types: + Cold: -0.07 + groups: + Brute: -0.07 - type: Speech speechSounds: Bass - type: Puller @@ -109,7 +118,7 @@ requirements: - !type:DepartmentTimeRequirement department: Epistemics - time: 14400 # DeltaV - 4 hours + time: 14400 # 4 hours - type: entity parent: WelderExperimental From 63190a838351f8772394f11ae313f16fa722dc43 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 21 Aug 2024 21:00:23 +0000 Subject: [PATCH 22/74] Automatic Changelog Update (#762) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ba7edd33244..6b7c0f14a95 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5492,3 +5492,9 @@ Entries: message: Traits can now add Psionic Powers to a character. id: 6278 time: '2024-08-21T09:49:54.0000000+00:00' +- author: stellar-novas + changes: + - type: Tweak + message: Ifrit has received some damage resistance changes + id: 6279 + time: '2024-08-21T21:00:01.0000000+00:00' From c78244181a9ad767658c3330cde55a19ab931a61 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Wed, 21 Aug 2024 19:43:58 -0400 Subject: [PATCH 23/74] Fix Missing Icon Error in Admin Menu (#770) Admin menu tried to load a sprite that doesn't exist which spammed errors in testing a lot. --- Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index 9849d2df79c..eff97136d06 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -111,7 +111,7 @@ private void AddAntagVerbs(GetVerbsEvent args) { Text = Loc.GetString("admin-verb-text-make-thief"), Category = VerbCategory.Antag, - Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Clothing/Hands/Gloves/ihscombat.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Clothing/Hands/Gloves/Color/black.rsi"), "icon"), Act = () => { _thief.AdminMakeThief(args.Target, false); //Midround add pacified is bad From a794bf424bab7f1a3de2ce3275384be245a12112 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Wed, 21 Aug 2024 20:08:59 -0400 Subject: [PATCH 24/74] Xenoglossy (#772) # Description Adds xenoglossy to the power pool. I originally planned it for cataloguer but it looks like that doesn't exist anymore. # Changelog :cl: Rane - add: Added Xenoglossy to the psionic power pool. --------- Signed-off-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Resources/Locale/en-US/psionics/psionic-powers.ftl | 10 +++++++++- Resources/Prototypes/Nyanotrasen/psionicPowers.yml | 1 + Resources/Prototypes/Psionics/psionics.yml | 11 ++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Resources/Locale/en-US/psionics/psionic-powers.ftl b/Resources/Locale/en-US/psionics/psionic-powers.ftl index 1844427f67f..e8f8d991af5 100644 --- a/Resources/Locale/en-US/psionics/psionic-powers.ftl +++ b/Resources/Locale/en-US/psionics/psionic-powers.ftl @@ -66,4 +66,12 @@ psionic-invisibility-power-initialization-feedback = When I awaken, I can no longer see even myself. psionic-invisibility-power-metapsionic-feedback = {CAPITALIZE($entity)}'s wyrd seeks to hide from thine gaze -mindbreaking-feedback = The light of life vanishes from {CAPITALIZE($entity)}'s eyes, leaving behind a husk pretending at sapience \ No newline at end of file +# Xenoglossy +xenoglossy-power-description = You understand all languages. +xenoglossy-power-initialization-feedback = + I feel an empathy with all creation, so that I may understand them and be understood. + The barrier between thought and expressions is permeable to me. + +psionic-language-power-metapsionic-feedback = The noösphere flows freely through {CAPITALIZE($entity)}, who seems to digest it and pass it back out undisturbed. + +mindbreaking-feedback = The light of life vanishes from {CAPITALIZE($entity)}'s eyes, leaving behind a husk pretending at sapience diff --git a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml index f40b688fd18..8a67cd319d7 100644 --- a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml +++ b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml @@ -5,6 +5,7 @@ DispelPower: 1 TelegnosisPower: 1 PsionicRegenerationPower: 1 + XenoglossyPower: 0.75 MassSleepPower: 0.3 # PsionicInvisibilityPower: 0.15 MindSwapPower: 0.15 diff --git a/Resources/Prototypes/Psionics/psionics.yml b/Resources/Prototypes/Psionics/psionics.yml index d4ae73669f9..2008d710c65 100644 --- a/Resources/Prototypes/Psionics/psionics.yml +++ b/Resources/Prototypes/Psionics/psionics.yml @@ -109,4 +109,13 @@ initializationFeedback: psionic-invisibility-power-initialization-feedback metapsionicFeedback: psionic-invisibility-power-metapsionic-feedback amplificationModifier: 0.5 - dampeningModifier: 0.5 \ No newline at end of file + dampeningModifier: 0.5 + +- type: psionicPower + id: XenoglossyPower + name: Xenoglossy + description: xenoglossy-power-description + components: + - type: UniversalLanguageSpeaker + initializationFeedback: xenoglossy-power-initialization-feedback + metapsionicFeedback: psionic-language-power-feedback # Reuse for telepathy, clairaudience, etc From 4611b82f63b115b9875716b80e86c6e0de988b9c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 22 Aug 2024 00:09:27 +0000 Subject: [PATCH 25/74] Automatic Changelog Update (#772) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6b7c0f14a95..b8c1307c6d0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5498,3 +5498,9 @@ Entries: message: Ifrit has received some damage resistance changes id: 6279 time: '2024-08-21T21:00:01.0000000+00:00' +- author: Rane + changes: + - type: Add + message: Added Xenoglossy to the psionic power pool. + id: 6280 + time: '2024-08-22T00:08:59.0000000+00:00' From d1cb34f5dfe94a9614e888cda46335787c5fa437 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 21 Aug 2024 20:52:11 -0400 Subject: [PATCH 26/74] Increase Trait Point Granularity (#775) # Description Since we now have a LOT of Traits, and soon to be another fresh batch of Traits coming in now that they've been refactored to offer even more options, it's come up that Traits are kinda hard to balance with the current combination of point costs and allotted starting points. To help alleviate this problem, I've both doubled the point values of every trait in the game, as well as doubled the default allotted starting points. There is now more room to balance trait costs against each other. I have not however actually made use of the new range of point costs yet, and would like to consult with other contributors and maintainers on which traits need to be adjusted. # TODO - [ ] Go over trait point costs again to address balance. - [ ] Do this again in 6 months when we have 200 traits. # Changelog :cl: - tweak: Trait points have been made more granular by both doubling the available number of trait points, and increasing the base cost of all pre-existing traits. --- Content.Shared/CCVar/CCVars.cs | 6 ++--- Resources/Prototypes/Traits/disabilities.yml | 20 ++++++++--------- .../Prototypes/Traits/inconveniences.yml | 4 ++-- Resources/Prototypes/Traits/neutral.yml | 6 ++--- Resources/Prototypes/Traits/physical.yml | 22 +++++++++---------- Resources/Prototypes/Traits/skills.yml | 22 +++++++++---------- Resources/Prototypes/Traits/species.yml | 6 ++--- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 63b9c3ba099..891f62d753a 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -367,7 +367,7 @@ public static readonly CVarDef /// How many points a character should start with. ///
public static readonly CVarDef GameTraitsDefaultPoints = - CVarDef.Create("game.traits_default_points", 5, CVar.REPLICATED); + CVarDef.Create("game.traits_default_points", 10, CVar.REPLICATED); /// @@ -2299,7 +2299,7 @@ public static readonly CVarDef /// public static readonly CVarDef StationGoalsChance = CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); - + #region CPR System /// @@ -2346,7 +2346,7 @@ public static readonly CVarDef /// public static readonly CVarDef CPRAirlossReductionMultiplier = CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); - + #endregion #region Contests System diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 3493683ca45..5f729f7a570 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -1,7 +1,7 @@ - type: trait id: Blindness category: Visual - points: 2 + points: 4 requirements: - !type:CharacterJobRequirement inverted: true @@ -14,7 +14,7 @@ - type: trait id: Narcolepsy category: Mental - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -33,14 +33,14 @@ - type: trait id: Pacifist category: Mental - points: 3 + points: 6 components: - type: Pacified - type: trait id: Paracusia category: Auditory - points: 1 + points: 2 components: - type: Paracusia minTimeBetweenIncidents: 0.1 @@ -52,7 +52,7 @@ - type: trait id: Muted category: Speech - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -65,7 +65,7 @@ - type: trait id: Uncloneable category: Physical - points: 2 + points: 4 requirements: - !type:CharacterJobRequirement inverted: true @@ -110,7 +110,7 @@ - type: trait id: Sluggish category: Physical - points: 1 + points: 2 requirements: - !type:CharacterTraitRequirement inverted: true @@ -133,7 +133,7 @@ - type: trait id: SnailPaced category: Physical - points: 2 + points: 4 requirements: - !type:CharacterTraitRequirement inverted: true @@ -156,7 +156,7 @@ - type: trait id: BloodDeficiency category: Physical - points: 2 + points: 4 requirements: - !type:CharacterJobRequirement inverted: true @@ -174,7 +174,7 @@ - type: trait id: Hemophilia category: Physical - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index 52028b8c7c0..b08116dc480 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -40,7 +40,7 @@ - type: trait id: ForeignerLight category: Mental - points: 1 + points: 2 requirements: - !type:CharacterTraitRequirement inverted: true @@ -54,7 +54,7 @@ - type: trait id: Foreigner category: Mental - points: 2 + points: 4 requirements: # TODO: Add a requirement to know at least 1 non-gc language - !type:CharacterTraitRequirement inverted: true diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 16e70a2cc63..947f02361e0 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -7,7 +7,7 @@ - type: trait id: Accentless category: Speech - points: -1 + points: -2 requirements: - !type:CharacterJobRequirement inverted: true @@ -42,7 +42,7 @@ - type: trait id: Saturnine category: Mental - points: 3 + points: 6 requirements: - !type:CharacterJobRequirement inverted: true @@ -60,7 +60,7 @@ - type: trait id: Sanguine category: Mental - points: -3 + points: -6 requirements: - !type:CharacterJobRequirement inverted: true diff --git a/Resources/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml index 3208627d76a..fa0033588b1 100644 --- a/Resources/Prototypes/Traits/physical.yml +++ b/Resources/Prototypes/Traits/physical.yml @@ -1,7 +1,7 @@ - type: trait id: WillToLive category: Physical - points: -2 + points: -4 requirements: - !type:CharacterJobRequirement inverted: true @@ -23,7 +23,7 @@ - type: trait id: WillToDie category: Physical - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -45,7 +45,7 @@ - type: trait id: Tenacity category: Physical - points: -2 + points: -4 requirements: - !type:CharacterJobRequirement inverted: true @@ -67,7 +67,7 @@ - type: trait id: GlassJaw category: Physical - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -89,7 +89,7 @@ - type: trait id: Vigor category: Physical - points: -3 + points: -6 requirements: - !type:CharacterJobRequirement inverted: true @@ -112,7 +112,7 @@ - type: trait id: Lethargy category: Physical - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -134,7 +134,7 @@ - type: trait id: HighAdrenaline category: Physical - points: -3 + points: -6 requirements: - !type:CharacterJobRequirement inverted: true @@ -157,7 +157,7 @@ - type: trait id: AdrenalDysfunction category: Physical - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -179,7 +179,7 @@ - type: trait id: Masochism category: Physical - points: -3 + points: -6 requirements: - !type:CharacterJobRequirement inverted: true @@ -198,7 +198,7 @@ - type: trait id: LowPainTolerance category: Physical - points: 1 + points: 2 requirements: - !type:CharacterJobRequirement inverted: true @@ -216,7 +216,7 @@ - type: trait id: MartialArtist category: Physical - points: -2 + points: -4 requirements: - !type:CharacterJobRequirement inverted: true diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 8fa4b0e9523..7afdfc76534 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -1,7 +1,7 @@ - type: trait id: CPRTraining category: Mental - points: -2 + points: -4 components: - type: CPRTraining requirements: @@ -18,7 +18,7 @@ - type: trait id: SelfAware category: Mental - points: -2 + points: -4 components: - type: SelfAware analyzableTypes: @@ -36,7 +36,7 @@ - type: trait id: HeavyweightDrunk category: Physical - points: -1 + points: -2 requirements: - !type:CharacterJobRequirement inverted: true @@ -60,7 +60,7 @@ - type: trait id: LiquorLifeline category: Physical - points: -3 + points: -6 requirements: - !type:CharacterJobRequirement inverted: true @@ -85,7 +85,7 @@ - type: trait id: Thieving category: Physical - points: -4 + points: -8 components: - type: Thieving ignoreStripHidden: true @@ -101,7 +101,7 @@ - type: trait id: SignLanguage category: Visual - points: -1 + points: -2 components: - type: LanguageKnowledgeModifier speaks: @@ -112,7 +112,7 @@ - type: trait id: Voracious category: Physical - points: -1 + points: -2 components: - type: ConsumeDelayModifier foodDelayMultiplier: 0.5 @@ -127,7 +127,7 @@ - type: trait id: ParkourTraining category: Physical - points: -3 + points: -6 requirements: - !type:CharacterTraitRequirement inverted: true @@ -148,7 +148,7 @@ - type: trait id: LightStep category: Auditory - points: -1 + points: -2 components: - type: FootstepVolumeModifier sprintVolumeModifier: -10 @@ -162,7 +162,7 @@ - type: trait id: Singer category: Auditory - points: -1 + points: -2 requirements: - !type:CharacterSpeciesRequirement inverted: true @@ -175,7 +175,7 @@ - type: trait id: LatentPsychic category: Mental - points: -3 + points: -6 components: - type: Psionic requirements: diff --git a/Resources/Prototypes/Traits/species.yml b/Resources/Prototypes/Traits/species.yml index 2c298252289..504cf469d46 100644 --- a/Resources/Prototypes/Traits/species.yml +++ b/Resources/Prototypes/Traits/species.yml @@ -1,7 +1,7 @@ - type: trait id: Swashbuckler category: Physical - points: -1 + points: -2 components: - type: OniDamageModifier modifiers: @@ -22,7 +22,7 @@ - type: trait id: Spearmaster category: Physical - points: -1 + points: -2 components: - type: OniDamageModifier modifiers: @@ -43,7 +43,7 @@ - type: trait id: WeaponsGeneralist category: Physical - points: -1 + points: -2 components: - type: OniDamageModifier modifiers: From 18b1ccbb0dc4409b581501a965b9d575ed120891 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 22 Aug 2024 00:52:34 +0000 Subject: [PATCH 27/74] Automatic Changelog Update (#775) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b8c1307c6d0..1643efec40f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5504,3 +5504,12 @@ Entries: message: Added Xenoglossy to the psionic power pool. id: 6280 time: '2024-08-22T00:08:59.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Trait points have been made more granular by both doubling the available + number of trait points, and increasing the base cost of all pre-existing + traits. + id: 6281 + time: '2024-08-22T00:52:11.0000000+00:00' From 7d4a0dd64449c587e4b1f58bf451a72ab557b684 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 21 Aug 2024 23:44:23 -0400 Subject: [PATCH 28/74] Fix Heisentests (#778) # Description Attempt number 5000 to get the Heisentests to STOP. --------- Signed-off-by: VMSolidus Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Timemaster99 <57200767+Timemaster99@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Content.Client/Voting/VoteManager.cs | 20 +++++++++++++++---- .../Components/Mobs/AlertsComponentTests.cs | 14 +++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Content.Client/Voting/VoteManager.cs b/Content.Client/Voting/VoteManager.cs index 63c706c86b3..8ade25056d6 100644 --- a/Content.Client/Voting/VoteManager.cs +++ b/Content.Client/Voting/VoteManager.cs @@ -6,12 +6,15 @@ using Robust.Client.Audio; using Robust.Client.Console; using Robust.Client.GameObjects; +using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Shared.IoC; using Robust.Shared.Network; using Robust.Shared.Timing; using Robust.Shared.Player; using Robust.Shared.Audio; +using Robust.Shared.Audio.Sources; +using Robust.Shared.ContentPack; namespace Content.Client.Voting @@ -31,16 +34,20 @@ public interface IVoteManager public sealed class VoteManager : IVoteManager { + [Dependency] private readonly IAudioManager _audio = default!; + [Dependency] private readonly IBaseClient _client = default!; + [Dependency] private readonly IClientConsoleHost _console = default!; [Dependency] private readonly IClientNetManager _netManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IClientConsoleHost _console = default!; - [Dependency] private readonly IBaseClient _client = default!; + [Dependency] private readonly IResourceCache _res = default!; private readonly Dictionary _standardVoteTimeouts = new(); private readonly Dictionary _votes = new(); private readonly Dictionary _votePopups = new(); private Control? _popupContainer; + private IAudioSource? _voteSource; + public bool CanCallVote { get; private set; } public event Action? CanCallVoteChanged; @@ -49,6 +56,12 @@ public sealed class VoteManager : IVoteManager public void Initialize() { + const string sound = "/Audio/Effects/voteding.ogg"; + _voteSource = _audio.CreateAudioSource(_res.GetResource(sound)); + + if (_voteSource != null) + _voteSource.Global = true; + _netManager.RegisterNetMessage(ReceiveVoteData); _netManager.RegisterNetMessage(ReceiveVoteCanCall); @@ -125,9 +138,8 @@ private void ReceiveVoteData(MsgVoteData message) return; } + _voteSource?.Restart(); @new = true; - IoCManager.Resolve().GetEntitySystem() - .PlayGlobal("/Audio/Effects/voteding.ogg", Filter.Local(), false); // Refresh var container = _popupContainer; diff --git a/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs b/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs index 1da77ac5589..b0aceacc03d 100644 --- a/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs +++ b/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs @@ -84,11 +84,13 @@ static AlertsUI FindAlertsUI(Control control) return null; } - // we should be seeing 3 alerts - our health, and the 2 debug alerts, in a specific order. - Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(3)); + // This originally was hardcoded to expect a player character to have a Human Healthbar. + // It is no longer hardcoded to demand that. + // We should be seeing 2 alerts - the 2 debug alerts, in a specific order. + Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(2)); var alertControls = clientAlertsUI.AlertContainer.Children.Select(c => (AlertControl) c); var alertIDs = alertControls.Select(ac => ac.Alert.AlertType).ToArray(); - var expectedIDs = new[] { AlertType.HumanHealth, AlertType.Debug1, AlertType.Debug2 }; + var expectedIDs = new[] { AlertType.Debug1, AlertType.Debug2 }; Assert.That(alertIDs, Is.SupersetOf(expectedIDs)); }); @@ -101,11 +103,11 @@ await server.WaitAssertion(() => await client.WaitAssertion(() => { - // we should be seeing 2 alerts now because one was cleared - Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(2)); + // We should be seeing 1 alert now because one was cleared + Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(1)); var alertControls = clientAlertsUI.AlertContainer.Children.Select(c => (AlertControl) c); var alertIDs = alertControls.Select(ac => ac.Alert.AlertType).ToArray(); - var expectedIDs = new[] { AlertType.HumanHealth, AlertType.Debug2 }; + var expectedIDs = new[] { AlertType.Debug2 }; Assert.That(alertIDs, Is.SupersetOf(expectedIDs)); }); From cf4018de9f30f0f61542adb54d20196897bc8a8a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 22 Aug 2024 04:43:20 -0400 Subject: [PATCH 29/74] Fix RGB Moths (#777) # Description Magic single line Yml Fix obtained by digging through DeltaV's Blame **GO!** # Changelog :cl: - tweak: Moths can now be colorful again. --- Resources/Prototypes/Species/moth.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml index 44bf5e60769..2623865b046 100644 --- a/Resources/Prototypes/Species/moth.yml +++ b/Resources/Prototypes/Species/moth.yml @@ -7,7 +7,7 @@ defaultSkinTone: "#ffda93" markingLimits: MobMothMarkingLimits dollPrototype: MobMothDummy - skinColoration: TintedHuesSkin # DeltaV - No rgb moths, literally 1849 + skinColoration: Hues maleFirstNames: names_moth_first_male femaleFirstNames: names_moth_first_female lastNames: names_moth_last From 9967163f44701ffb21b38dad5cd6012af956135c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 22 Aug 2024 08:43:51 +0000 Subject: [PATCH 30/74] Automatic Changelog Update (#777) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1643efec40f..997bd82ccaf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5513,3 +5513,9 @@ Entries: traits. id: 6281 time: '2024-08-22T00:52:11.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: Moths can now be colorful again. + id: 6282 + time: '2024-08-22T08:43:20.0000000+00:00' From 07a5fee9a275ada7aae06e147f089dfe11dda22a Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:30:09 -0700 Subject: [PATCH 31/74] Remove DV AGPL License Headers (#781) # Description They're confusing. Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Components/PirateRadioSpawnRuleComponent.cs | 6 ------ .../DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs | 6 ------ .../DeltaV/Entities/Markers/Spawners/ghost_roles.yml | 4 ---- Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/salvage.yml | 4 ---- .../Prototypes/DeltaV/Entities/Objects/Devices/pda.yml | 6 +----- .../DeltaV/Entities/Structures/Machines/faxmachines.yml | 4 ---- .../Structures/Machines/syndicate_monitor_server.yml | 4 ---- .../Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml | 4 ---- .../Prototypes/DeltaV/Roles/Jobs/NPC/syndicateNPCs.yml | 6 +----- 9 files changed, 2 insertions(+), 42 deletions(-) diff --git a/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs b/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs index 432fbfb4aca..fb4c1751f61 100644 --- a/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs +++ b/Content.Server/DeltaV/StationEvents/Components/PirateRadioSpawnRuleComponent.cs @@ -1,9 +1,3 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - using Content.Server.StationEvents.Events; namespace Content.Server.StationEvents.Components; diff --git a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs index ba042d89662..4e43c1ff967 100644 --- a/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs +++ b/Content.Server/DeltaV/StationEvents/Events/PirateRadioSpawnRule.cs @@ -1,9 +1,3 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - using Robust.Server.GameObjects; using Robust.Server.Maps; using Robust.Shared.Configuration; diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml index 8534b737888..2782fa4f941 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: entity id: SpawnPointPlayerCharacter name: ghost role spawn point diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/salvage.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/salvage.yml index 507aa467932..808444ed70e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/salvage.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/salvage.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: entity name: Syndicate Guard parent: BaseMobHuman diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml index d5f121bb0be..b640206c912 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: entity parent: BasePDA id: CorpsmanPDA @@ -118,7 +114,7 @@ - NotekeeperCartridge - NewsReaderCartridge - CrimeAssistCartridge - + - type: entity parent: BasePDA id: ProsecutorPDA diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Machines/faxmachines.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Machines/faxmachines.yml index 550aaed534b..c2eb95cd7ce 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Machines/faxmachines.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Machines/faxmachines.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: entity parent: FaxMachineBase id: FaxMachineListeningSyndie diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml index b4a1f8808eb..10933d716e2 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Machines/syndicate_monitor_server.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: entity id: SyndicateMonitoringServer parent: BaseMachinePowered diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml index 60b6e3c6e90..7d7943ab697 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Fun/misc_startinggear.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - #Misc outfit startingGear definitions. # Laika sec glasses diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/NPC/syndicateNPCs.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/NPC/syndicateNPCs.yml index a1984279e9f..b5379c5014e 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/NPC/syndicateNPCs.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/NPC/syndicateNPCs.yml @@ -1,7 +1,3 @@ -#Delta-V - This file is licensed under AGPLv3 -# Copyright (c) 2024 Delta-V Contributors -# See AGPLv3.txt for details. - - type: startingGear id: RadioGuardGear equipment: @@ -22,4 +18,4 @@ description: An off-the-shelf plate carrier that has been cruelly grafted onto its wearers body noSpawn: true components: - - type: Unremoveable + - type: Unremoveable From 3b14856035e6b0cdc5130fe6a53145bc64c092bf Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 22 Aug 2024 13:00:11 -0400 Subject: [PATCH 32/74] Return Of The Cataloguer (#779) # Description Cataloguer has returned to Epistemics as the newest 4th member of the "Crew Aligned Wizards Club". The Cataloguer is a variation on the Librarian role, which automatically starts with the new Xenoglossy Psionic Power, which allows him to know and speak all languages. Additionally, the Cataloguer is now once again a member of Epistemics instead of Civilian, and has had Epi added to his access. On all maps that previously did not have a Librarian spawner, one Scientist spawner has been replaced with a Cataloguer. # Changelog :cl: - add: Cataloguer has been re-added to the game as a new roundstart Psionic role. The Cataloguer is a unique role that will always start with the Latent Psychic trait, as well as the new Xenoglossy power, which allows him to know and speak all languages. --- .../Locale/en-US/job/job-description.ftl | 2 +- Resources/Locale/en-US/job/job-names.ftl | 2 +- .../Entities/Objects/Devices/pda.yml | 6 +++++ .../Roles/Jobs/Civilian/librarian.yml | 24 +++++++++++++------ .../Prototypes/Roles/Jobs/departments.yml | 2 +- Resources/Prototypes/Traits/skills.yml | 1 + 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Resources/Locale/en-US/job/job-description.ftl b/Resources/Locale/en-US/job/job-description.ftl index 3a25518c2eb..94ff7c98bd5 100644 --- a/Resources/Locale/en-US/job/job-description.ftl +++ b/Resources/Locale/en-US/job/job-description.ftl @@ -30,7 +30,7 @@ job-description-hos = Manage your security force and keep them efficient, quell job-description-intern = Learn the basics of administering medicine, basic chemicals and using medical tools. job-description-janitor = Keep the station clean of any trash or slipping hazards, and help deal with rat infestations. job-description-lawyer = Ensure that every prisoner or criminal receives a fair judgment and trial if necessary. -job-description-librarian = Manage the library, give out knowledge to any who seek it, and report on activities aboard the station. +job-description-librarian = Understand every language and hear your coworkers shit talk each other, lord over your collection of outdated guides, lament the lack of rich text in the game. job-description-mime = Entertain the crew through non-vocal means, and engage with light rivalry with the clown. job-description-musician = Entertain the crew with your unique musical talent, and acquire new instruments to mess around with. job-description-passenger = Enjoy your stay aboard the station with no obligations! diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index 19d2db94518..39955d7f977 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -23,7 +23,7 @@ job-name-serviceworker = Service Worker job-name-centcomoff = CentCom Official job-name-reporter = Reporter job-name-musician = Musician -job-name-librarian = Librarian +job-name-librarian = Cataloguer # DeltaV - Changed Lawyer to Attorney # job-name-lawyer = Lawyer job-name-mime = Mime diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 2c28f60da58..3e0947f7e1e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -418,6 +418,12 @@ borderColor: "#858585" - type: Icon state: pda-library + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - GlimmerMonitorCartridge - type: entity parent: BasePDA diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index 7f138c6d7d1..26048bec05d 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -4,15 +4,24 @@ description: job-description-librarian playTimeTracker: JobLibrarian requirements: - - !type:CharacterOverallTimeRequirement #DeltaV - min: 3600 # 1 hr + - !type:CharacterDepartmentTimeRequirement + department: Epistemics + min: 14400 startingGear: LibrarianGear icon: "JobIconLibrarian" - supervisors: job-supervisors-hop + supervisors: job-supervisors-rd access: - - Service + - Research - Maintenance - - Library # DeltaV - Add Library access + - Library + special: + - !type:AddComponentSpecial + components: + - type: Psionic + - type: InnatePsionicPowers + powersToAdd: + - XenoglossyPower + - type: startingGear id: LibrarianGear @@ -20,10 +29,11 @@ jumpsuit: ClothingUniformJumpsuitLibrarian back: ClothingBackpackLibrarianFilled shoes: ClothingShoesBootsLaceup + outerClothing: ClothingOuterCoatRnd id: LibrarianPDA - ears: ClothingHeadsetService + ears: ClothingHeadsetScience pocket1: d10Dice - pocket2: HandLabeler # for making named bestsellers + pocket2: HandLabeler innerClothingSkirt: ClothingUniformJumpskirtLibrarian satchel: ClothingBackpackSatchelLibrarianFilled duffelbag: ClothingBackpackDuffelLibrarianFilled diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 1609969f7e6..e6a5354844d 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -24,7 +24,6 @@ - HeadOfPersonnel - Janitor # - Lawyer # DeltaV - Move Lawyer into Justice - - Librarian - Mime - Musician - Passenger @@ -103,6 +102,7 @@ - ResearchAssistant - Chaplain # DeltaV - Move Chaplain into Epistemics - ForensicMantis # Nyanotrasen - ForensicMantis, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml + - Librarian - type: department id: Specific diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 7afdfc76534..46f45c6d9c5 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -187,6 +187,7 @@ - ResearchDirector - ForensicMantis - Chaplain + - Librarian - !type:CharacterSpeciesRequirement inverted: true species: From 141d2f06d9475a9b9b9d1581c93d8e59596c20c1 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 22 Aug 2024 17:00:36 +0000 Subject: [PATCH 33/74] Automatic Changelog Update (#779) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 997bd82ccaf..af1cb53abaf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5519,3 +5519,13 @@ Entries: message: Moths can now be colorful again. id: 6282 time: '2024-08-22T08:43:20.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Cataloguer has been re-added to the game as a new roundstart Psionic + role. The Cataloguer is a unique role that will always start with the + Latent Psychic trait, as well as the new Xenoglossy power, which allows + him to know and speak all languages. + id: 6283 + time: '2024-08-22T17:00:11.0000000+00:00' From 214e8965c9e8366391091497f7ab9bb971664bf3 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 22 Aug 2024 13:12:26 -0400 Subject: [PATCH 34/74] Psionic Power Feedback Messages (#776) # Description This PR implements the previously planned feature whereby obtaining a Psionic Power plays some form of notification to alert the player that they have gained a new ability. Since some Psionics like Xenoglossy are purely passive, it's very important to give an indication to players what's going on. To that end, PsionicPowerPrototype has been expanded to include new datafields related to Initialization Feedback. There are now three kinds of feedback messages: Popup, Feedback, and Metapsionic. All feedback will only play for powers obtained during the round, rather than for entities that innately start with powers. - Popups will appear over your character's head as a small, brief message. These should be no more than a sentence at most. - Feedback will appear in the Chat window as a message only visible to the Psion themself. These can be as much as a paragraph in length. - Metapsionic messages are coming in their own separate PR: https://github.com/Simple-Station/Einstein-Engines/pull/774 In a separate PR, I also wish to add Audio feedback as well. # Media I apologize that the video has been bitcrunched to a point that the chat window can't be read. https://github.com/user-attachments/assets/11e30e91-8fc6-48a2-b6a5-9ecf7127065e # Changelog :cl: - add: Gaining a new Psionic Power can now display messages to alert the player, both as a short popup, and optionally a lengthier message sent to the user's Chat window. --------- Signed-off-by: VMSolidus Co-authored-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> --- .../Psionics/PsionicAbilitiesSystem.cs | 81 ++++++++++--------- .../Psionics/PsionicPowerPrototype.cs | 34 +++++++- Resources/Prototypes/Psionics/psionics.yml | 2 +- 3 files changed, 73 insertions(+), 44 deletions(-) diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index 005078242b0..1ac5db70151 100644 --- a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -10,6 +10,8 @@ using Robust.Shared.Serialization.Manager; using Content.Shared.Psionics; using System.Linq; +using Robust.Server.Player; +using Content.Server.Chat.Managers; namespace Content.Server.Abilities.Psionics { @@ -24,6 +26,8 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; [Dependency] private readonly ISerializationManager _serialization = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IChatManager _chatManager = default!; private ProtoId _pool = "RandomPsionicPowerPool"; private const string GenericInitializationMessage = "generic-power-initialization-feedback"; @@ -38,9 +42,6 @@ public override void Initialize() /// /// Special use-case for a InnatePsionicPowers, which allows an entity to start with any number of Psionic Powers. /// - /// - /// - /// private void InnatePowerStartup(EntityUid uid, InnatePsionicPowersComponent comp, ComponentStartup args) { // Any entity with InnatePowers should also be psionic, but in case they aren't already... @@ -64,7 +65,6 @@ private void OnPsionicShutdown(EntityUid uid, PsionicComponent component, Compon /// The most shorthand route to creating a Psion. If an entity is not already psionic, it becomes one. This also adds a random new PsionicPower. /// To create a "Latent Psychic"(Psion with no powers) just add or ensure the PsionicComponent normally. /// - /// public void AddPsionics(EntityUid uid) { if (Deleted(uid)) @@ -77,7 +77,6 @@ public void AddPsionics(EntityUid uid) /// Pretty straightforward, adds a random psionic power to a given Entity. If that Entity is not already Psychic, it will be made one. /// If an entity already has all possible powers, this will not add any new ones. /// - /// public void AddRandomPsionicPower(EntityUid uid) { // We need to EnsureComp here to make sure that we aren't iterating over a component that: @@ -95,7 +94,7 @@ public void AddRandomPsionicPower(EntityUid uid) _prototypeManager.TryIndex(s, out var p) && psionic.ActivePowers.Contains(p)); - if (newPool is null) + if (newPool.Count == 0) return; var newProto = _random.Pick(newPool); @@ -110,11 +109,7 @@ public void AddRandomPsionicPower(EntityUid uid) /// /// Initializes a new Psionic Power on a given entity, assuming the entity does not already have said power initialized. /// - /// - /// - /// - /// - public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic, bool playPopup = true) + public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic, bool playFeedback = true) { if (!_prototypeManager.HasIndex(proto.ID) || psionic.ActivePowers.Contains(proto)) @@ -126,31 +121,23 @@ public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, P AddPsionicPowerComponents(uid, proto); AddPsionicStatSources(proto, psionic); RefreshPsionicModifiers(uid, psionic); - - if (playPopup) - _popups.PopupEntity(Loc.GetString(GenericInitializationMessage), uid, uid, PopupType.MediumCaution); - // TODO: Replace this with chat message: _popups.PopupEntity(proto.InitializationFeedback, uid, uid, PopupType.MediumCaution); + SendFeedbackMessage(uid, proto, playFeedback); + //SendFeedbackAudio(uid, proto, playPopup); // TODO: This one is coming next! } /// /// Initializes a new Psionic Power on a given entity, assuming the entity does not already have said power initialized. /// - /// - /// - /// - /// - public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, bool playPopup = true) + public void InitializePsionicPower(EntityUid uid, PsionicPowerPrototype proto, bool playFeedback = true) { EnsureComp(uid, out var psionic); - InitializePsionicPower(uid, proto, psionic, playPopup); + InitializePsionicPower(uid, proto, psionic, playFeedback); } /// /// Updates a Psion's casting stats, call this anytime a system adds a new source of Amp or Damp. /// - /// - /// public void RefreshPsionicModifiers(EntityUid uid, PsionicComponent comp) { var ampModifier = 0f; @@ -173,7 +160,6 @@ public void RefreshPsionicModifiers(EntityUid uid, PsionicComponent comp) /// Updates a Psion's casting stats, call this anytime a system adds a new source of Amp or Damp. /// Variant function for systems that didn't already have the PsionicComponent. /// - /// public void RefreshPsionicModifiers(EntityUid uid) { if (!TryComp(uid, out var comp)) @@ -186,7 +172,6 @@ public void RefreshPsionicModifiers(EntityUid uid) /// A more advanced form of removing powers. Mindbreaking not only removes all psionic powers, /// it also disables the possibility of obtaining new ones. /// - /// public void MindBreak(EntityUid uid) { RemoveAllPsionicPowers(uid, true); @@ -196,8 +181,6 @@ public void MindBreak(EntityUid uid) /// Remove all Psionic powers, with accompanying actions, components, and casting stat sources, from a given Psion. /// Optionally, the Psion can also be rendered permanently non-Psionic. /// - /// - /// public void RemoveAllPsionicPowers(EntityUid uid, bool mindbreak = false) { if (!TryComp(uid, out var psionic) @@ -239,9 +222,6 @@ public void RemoveAllPsionicPowers(EntityUid uid, bool mindbreak = false) /// /// Add all actions associated with a specific Psionic Power /// - /// - /// - /// private void AddPsionicActions(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic) { foreach (var id in proto.Actions) @@ -258,8 +238,6 @@ private void AddPsionicActions(EntityUid uid, PsionicPowerPrototype proto, Psion /// /// Add all components associated with a specific Psionic power. /// - /// - /// private void AddPsionicPowerComponents(EntityUid uid, PsionicPowerPrototype proto) { if (proto.Components is null) @@ -279,8 +257,6 @@ private void AddPsionicPowerComponents(EntityUid uid, PsionicPowerPrototype prot /// /// Update the Amplification and Dampening sources of a Psion to include a new Power. /// - /// - /// private void AddPsionicStatSources(PsionicPowerPrototype proto, PsionicComponent psionic) { if (proto.AmplificationModifier != 0) @@ -290,11 +266,40 @@ private void AddPsionicStatSources(PsionicPowerPrototype proto, PsionicComponent psionic.DampeningSources.Add(proto.Name, proto.DampeningModifier); } + /// + /// Displays a message to alert the player when they have obtained a new psionic power. These generally will not play for Innate powers. + /// Chat messages of this nature should be written in the first-person. + /// Popup feedback should be no more than a sentence, while the full Initialization Feedback can be as much as a paragraph of text. + /// + private void SendFeedbackMessage(EntityUid uid, PsionicPowerPrototype proto, bool playFeedback = true) + { + if (!playFeedback + || !_playerManager.TryGetSessionByEntity(uid, out var session) + || session is null) + return; + + if (proto.InitializationPopup is null) + _popups.PopupEntity(Loc.GetString(GenericInitializationMessage), uid, uid, PopupType.MediumCaution); + else _popups.PopupEntity(Loc.GetString(proto.InitializationPopup), uid, uid, PopupType.MediumCaution); + + if (proto.InitializationFeedback is null) + return; + + if (!Loc.TryGetString(proto.InitializationFeedback, out var feedback)) + return; + var feedbackMessage = $"[font size={proto.InitializationFeedbackFontSize}][color={proto.InitializationFeedbackColor}]{feedback}[/color][/font]"; + _chatManager.ChatMessageToOne( + proto.InitializationFeedbackChannel, + feedbackMessage, + feedbackMessage, + EntityUid.Invalid, + false, + session.Channel); + } + /// /// Remove all Psychic Actions listed in an entity's Psionic Component. Unfortunately, removing actions associated with a specific Power Prototype is not supported. /// - /// - /// private void RemovePsionicActions(EntityUid uid, PsionicComponent psionic) { if (psionic.Actions is null) @@ -307,8 +312,6 @@ private void RemovePsionicActions(EntityUid uid, PsionicComponent psionic) /// /// Remove all Components associated with a specific Psionic Power. /// - /// - /// private void RemovePsionicPowerComponents(EntityUid uid, PsionicPowerPrototype proto) { if (proto.Components is null) @@ -327,8 +330,6 @@ private void RemovePsionicPowerComponents(EntityUid uid, PsionicPowerPrototype p /// /// Remove all stat sources associated with a specific Psionic Power. /// - /// - /// private void RemovePsionicStatSources(EntityUid uid, PsionicPowerPrototype proto, PsionicComponent psionic) { if (proto.AmplificationModifier != 0) diff --git a/Content.Shared/Psionics/PsionicPowerPrototype.cs b/Content.Shared/Psionics/PsionicPowerPrototype.cs index 621a3ceb114..3d389f6cdbe 100644 --- a/Content.Shared/Psionics/PsionicPowerPrototype.cs +++ b/Content.Shared/Psionics/PsionicPowerPrototype.cs @@ -1,3 +1,4 @@ +using Content.Shared.Chat; using Robust.Shared.Prototypes; namespace Content.Shared.Psionics; @@ -36,10 +37,37 @@ public sealed partial class PsionicPowerPrototype : IPrototype public ComponentRegistry Components = new(); /// - /// What message will play as a popup when the power is initialized. + /// What message will be sent to the player as a Popup. + /// If left blank, it will default to the Const "generic-power-initialization-feedback" /// - [DataField(required: true)] - public string InitializationFeedback = "psionic-power-initialization-default"; + [DataField] + public string? InitializationPopup; + + /// + /// What message will be sent to the chat window when the power is initialized. Leave it blank to send no message. + /// Initialization messages won't play for powers that are Innate, only powers obtained during the round. + /// These should generally also be written in the first person, and can be far lengthier than popups. + /// + [DataField] + public string? InitializationFeedback; + + /// + /// What color will the initialization feedback display in the chat window with. + /// + [DataField] + public string InitializationFeedbackColor = "#8A00C2"; + + /// + /// What font size will the initialization message use in chat. + /// + [DataField] + public int InitializationFeedbackFontSize = 12; + + /// + /// Which chat channel will the initialization message use. + /// + [DataField] + public ChatChannel InitializationFeedbackChannel = ChatChannel.Emotes; /// /// What message will this power generate when scanned by a Metempsionic Focused Pulse. diff --git a/Resources/Prototypes/Psionics/psionics.yml b/Resources/Prototypes/Psionics/psionics.yml index 2008d710c65..9d4b770ad62 100644 --- a/Resources/Prototypes/Psionics/psionics.yml +++ b/Resources/Prototypes/Psionics/psionics.yml @@ -18,7 +18,7 @@ - ActionMassSleep components: - type: MassSleepPower - initializationFeedback: mass-sleep-power-initialization-feedback + # initializationFeedback: mass-sleep-power-initialization-feedback # I apologize, I don't feel like writing a paragraph of feedback for a power that's getting replaced with a new one. metapsionicFeedback: mass-sleep-power-metapsionic-feedback amplificationModifier: 0.5 dampeningModifier: 0.5 From 345c948e508e822f2bfdd8e49d61bf40c43f14d9 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 22 Aug 2024 17:13:00 +0000 Subject: [PATCH 35/74] Automatic Changelog Update (#776) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index af1cb53abaf..6c957378fe0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5529,3 +5529,12 @@ Entries: him to know and speak all languages. id: 6283 time: '2024-08-22T17:00:11.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Gaining a new Psionic Power can now display messages to alert the + player, both as a short popup, and optionally a lengthier message sent + to the user's Chat window. + id: 6284 + time: '2024-08-22T17:12:26.0000000+00:00' From 466b18453ed20290d34397257031227ea5ff83b5 Mon Sep 17 00:00:00 2001 From: Dakota Haven Date: Tue, 20 Aug 2024 10:35:35 -0600 Subject: [PATCH 36/74] Merge branch 'dev-enviro' of https://github.com/DakoDemon/floofstation1 into Clothing-Additions --- .../Clothing/departmental_clothes.yml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 8601b5a3ce4..3db29f82a77 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -338,6 +338,13 @@ fiberMaterial: fibers-durathread fiberColor: fibers-black-and-red - type: FingerprintMask + - type: Armor + modifiers: + coefficients: + Blunt: 0.1 + Slash: 0.1 + Piercing: 0.1 + Heat: 0.3 - type: GroupExamine - type: entity @@ -350,6 +357,13 @@ sprite: Floof/Clothing/Departmental/Security/secsocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/secsocks.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.1 + Slash: 0.1 + Piercing: 0.1 + Heat: 0.3 - type: GroupExamine - type: entity @@ -366,6 +380,14 @@ - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt + - type: Armor + modifiers: + coefficients: + Blunt: 0.1 + Slash: 0.1 + Piercing: 0.1 + Heat: 0.3 + - type: GroupExamine #Service Outfits # From 974eca71062b733aa7a554561eb985dfebf8b4a9 Mon Sep 17 00:00:00 2001 From: Dakota Haven Date: Tue, 20 Aug 2024 14:26:25 -0600 Subject: [PATCH 37/74] - Added Coder, Bee, Coder-Valid socks ect to loadouts, lathe, & vendors - Added Pink Hoodie to Loadouts - Added in more Departmental socks, warmers, & thongs - Added various stats to the respective department pieces - Added requested Outwear, Overalls Signed-off-by: Dakota Haven --- .../VendingMachines/Inventories/bardrobe.yml | 4 + .../VendingMachines/Inventories/chefdrobe.yml | 4 + .../VendingMachines/Inventories/chemdrobe.yml | 6 +- .../VendingMachines/Inventories/robodrobe.yml | 2 + .../VendingMachines/Inventories/secdrobe.yml | 6 +- .../VendingMachines/Inventories/theater.yml | 9 + .../VendingMachines/Inventories/pride.yml | 6 + .../Entities/Structures/Machines/lathe.yml | 9 + .../Clothing/OuterClothing/MiscOuterwear.yml | 23 + .../Floof/Entities/Clothing/Uniforms/misc.yml | 23 + .../Clothing/departmental_clothes.yml | 570 +++++++++++++++++- .../Floof/Loadouts/departmentalloadouts.yml | 465 +++++++++++++- .../Floof/Loadouts/outerClothing.yml | 21 + .../Prototypes/Floof/Loadouts/sockect.yml | 72 +++ .../Floof/Recipes/Lathes/uniformssocksect.yml | 44 ++ .../chiefengisocks.rsi/equipped-FEET.png | Bin 0 -> 720 bytes .../Engineering/chiefengisocks.rsi/icon.png | Bin 0 -> 381 bytes .../Engineering/chiefengisocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 392 bytes .../Engineering/chiefengithong.rsi/icon.png | Bin 0 -> 255 bytes .../chiefengithong.rsi/inhand-left.png | Bin 0 -> 268 bytes .../chiefengithong.rsi/inhand-right.png | Bin 0 -> 265 bytes .../Engineering/chiefengithong.rsi/meta.json | 26 + .../chiefengiwarmer.rsi/equipped-HAND.png | Bin 0 -> 591 bytes .../Engineering/chiefengiwarmer.rsi/icon.png | Bin 0 -> 343 bytes .../Engineering/chiefengiwarmer.rsi/meta.json | 18 + .../directorepisocks.rsi/equipped-FEET.png | Bin 0 -> 760 bytes .../Epistemics/directorepisocks.rsi/icon.png | Bin 0 -> 431 bytes .../Epistemics/directorepisocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 387 bytes .../Epistemics/directorepithong.rsi/icon.png | Bin 0 -> 232 bytes .../directorepithong.rsi/inhand-left.png | Bin 0 -> 275 bytes .../directorepithong.rsi/inhand-right.png | Bin 0 -> 273 bytes .../Epistemics/directorepithong.rsi/meta.json | 26 + .../directorepiwarmer.rsi/equipped-HAND.png | Bin 0 -> 694 bytes .../Epistemics/directorepiwarmer.rsi/icon.png | Bin 0 -> 359 bytes .../directorepiwarmer.rsi/meta.json | 18 + .../qmlogisocks.rsi/equipped-FEET.png | Bin 0 -> 823 bytes .../Logistics/qmlogisocks.rsi/icon.png | Bin 0 -> 444 bytes .../Logistics/qmlogisocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 564 bytes .../Logistics/qmlogithong.rsi/icon.png | Bin 0 -> 303 bytes .../Logistics/qmlogithong.rsi/inhand-left.png | Bin 0 -> 274 bytes .../qmlogithong.rsi/inhand-right.png | Bin 0 -> 272 bytes .../Logistics/qmlogithong.rsi/meta.json | 26 + .../qmlogiwarmer.rsi/equipped-HAND.png | Bin 0 -> 802 bytes .../Logistics/qmlogiwarmer.rsi/icon.png | Bin 0 -> 411 bytes .../Logistics/qmlogiwarmer.rsi/meta.json | 18 + .../chemistsocks.rsi/equipped-FEET.png | Bin 0 -> 589 bytes .../Medical/chemistsocks.rsi/icon.png | Bin 0 -> 329 bytes .../Medical/chemistsocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 367 bytes .../Medical/chemistthong.rsi/icon.png | Bin 0 -> 237 bytes .../Medical/chemistthong.rsi/inhand-left.png | Bin 0 -> 271 bytes .../Medical/chemistthong.rsi/inhand-right.png | Bin 0 -> 268 bytes .../Medical/chemistthong.rsi/meta.json | 26 + .../chemistwarmer.rsi/equipped-HAND.png | Bin 0 -> 497 bytes .../Medical/chemistwarmer.rsi/icon.png | Bin 0 -> 271 bytes .../Medical/chemistwarmer.rsi/meta.json | 18 + .../Medical/cmosocks.rsi/equipped-FEET.png | Bin 0 -> 663 bytes .../Medical/cmosocks.rsi/icon.png | Bin 0 -> 389 bytes .../Medical/cmosocks.rsi/meta.json | 18 + .../cmothong.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 437 bytes .../Medical/cmothong.rsi/icon.png | Bin 0 -> 257 bytes .../Medical/cmothong.rsi/inhand-left.png | Bin 0 -> 271 bytes .../Medical/cmothong.rsi/inhand-right.png | Bin 0 -> 268 bytes .../Medical/cmothong.rsi/meta.json | 26 + .../Medical/cmowarmer.rsi/equipped-HAND.png | Bin 0 -> 631 bytes .../Medical/cmowarmer.rsi/icon.png | Bin 0 -> 360 bytes .../Medical/cmowarmer.rsi/meta.json | 18 + .../paramedsocks.rsi/equipped-FEET.png | Bin 0 -> 733 bytes .../Medical/paramedsocks.rsi/icon.png | Bin 0 -> 418 bytes .../Medical/paramedsocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 391 bytes .../Medical/paramedthong.rsi/icon.png | Bin 0 -> 243 bytes .../Medical/paramedthong.rsi/inhand-left.png | Bin 0 -> 275 bytes .../Medical/paramedthong.rsi/inhand-right.png | Bin 0 -> 273 bytes .../Medical/paramedthong.rsi/meta.json | 26 + .../paramedwarmer.rsi/equipped-HAND.png | Bin 0 -> 533 bytes .../Medical/paramedwarmer.rsi/icon.png | Bin 0 -> 303 bytes .../Medical/paramedwarmer.rsi/meta.json | 18 + .../detectsocks.rsi/equipped-FEET.png | Bin 0 -> 752 bytes .../Security/detectsocks.rsi/icon.png | Bin 0 -> 385 bytes .../Security/detectsocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 460 bytes .../Security/detectthong.rsi/icon.png | Bin 0 -> 261 bytes .../Security/detectthong.rsi/inhand-left.png | Bin 0 -> 274 bytes .../Security/detectthong.rsi/inhand-right.png | Bin 0 -> 272 bytes .../Security/detectthong.rsi/meta.json | 26 + .../detectwarmer.rsi/equipped-HAND.png | Bin 0 -> 715 bytes .../Security/detectwarmer.rsi/icon.png | Bin 0 -> 396 bytes .../Security/detectwarmer.rsi/meta.json | 18 + .../Security/hossocks.rsi/equipped-FEET.png | Bin 0 -> 800 bytes .../Security/hossocks.rsi/icon.png | Bin 0 -> 443 bytes .../Security/hossocks.rsi/meta.json | 18 + .../hosthong.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 470 bytes .../Security/hosthong.rsi/icon.png | Bin 0 -> 258 bytes .../Security/hosthong.rsi/inhand-left.png | Bin 0 -> 371 bytes .../Security/hosthong.rsi/inhand-right.png | Bin 0 -> 399 bytes .../Security/hosthong.rsi/meta.json | 26 + .../Security/hoswarmer.rsi/equipped-HAND.png | Bin 0 -> 816 bytes .../Security/hoswarmer.rsi/icon.png | Bin 0 -> 443 bytes .../Security/hoswarmer.rsi/meta.json | 18 + .../bartendersocks.rsi/equipped-FEET.png | Bin 0 -> 571 bytes .../Service/bartendersocks.rsi/icon.png | Bin 0 -> 350 bytes .../Service/bartendersocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 389 bytes .../Service/bartenderthong.rsi/icon.png | Bin 0 -> 253 bytes .../bartenderthong.rsi/inhand-left.png | Bin 0 -> 269 bytes .../bartenderthong.rsi/inhand-right.png | Bin 0 -> 267 bytes .../Service/bartenderthong.rsi/meta.json | 26 + .../bartenderwarmer.rsi/equipped-HAND.png | Bin 0 -> 695 bytes .../Service/bartenderwarmer.rsi/icon.png | Bin 0 -> 391 bytes .../Service/bartenderwarmer.rsi/meta.json | 18 + .../Service/chefsocks.rsi/equipped-FEET.png | Bin 0 -> 572 bytes .../Service/chefsocks.rsi/icon.png | Bin 0 -> 353 bytes .../Service/chefsocks.rsi/meta.json | 18 + .../chefthong.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 388 bytes .../Service/chefthong.rsi/icon.png | Bin 0 -> 240 bytes .../Service/chefthong.rsi/inhand-left.png | Bin 0 -> 269 bytes .../Service/chefthong.rsi/inhand-right.png | Bin 0 -> 266 bytes .../Service/chefthong.rsi/meta.json | 26 + .../Service/chefwarmer.rsi/equipped-HAND.png | Bin 0 -> 581 bytes .../Service/chefwarmer.rsi/icon.png | Bin 0 -> 326 bytes .../Service/chefwarmer.rsi/meta.json | 18 + .../musiciansocks.rsi/equipped-FEET.png | Bin 0 -> 482 bytes .../Service/musiciansocks.rsi/icon.png | Bin 0 -> 274 bytes .../Service/musiciansocks.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 449 bytes .../Service/musicianthong.rsi/icon.png | Bin 0 -> 253 bytes .../Service/musicianthong.rsi/inhand-left.png | Bin 0 -> 274 bytes .../musicianthong.rsi/inhand-right.png | Bin 0 -> 272 bytes .../Service/musicianthong.rsi/meta.json | 26 + .../musicianwarmer.rsi/equipped-HAND.png | Bin 0 -> 528 bytes .../Service/musicianwarmer.rsi/icon.png | Bin 0 -> 294 bytes .../Service/musicianwarmer.rsi/meta.json | 18 + .../equipped-INNERCLOTHING.png | Bin 0 -> 1708 bytes .../universalservicejumpsuit.rsi/icon.png | Bin 0 -> 667 bytes .../inhand-left.png | Bin 0 -> 269 bytes .../inhand-right.png | Bin 0 -> 267 bytes .../universalservicejumpsuit.rsi/meta.json | 26 + .../equipped-OUTERCLOTHING.png | Bin 0 -> 871 bytes .../Misc/plainoveralls.rsi/icon.png | Bin 0 -> 398 bytes .../Misc/plainoveralls.rsi/inhand-left.png | Bin 0 -> 664 bytes .../Misc/plainoveralls.rsi/inhand-right.png | Bin 0 -> 673 bytes .../Misc/plainoveralls.rsi/meta.json | 26 + .../equipped-OUTERCLOTHING.png | Bin 0 -> 995 bytes .../Misc/robooveralls.rsi/icon.png | Bin 0 -> 468 bytes .../Misc/robooveralls.rsi/inhand-left.png | Bin 0 -> 525 bytes .../Misc/robooveralls.rsi/inhand-right.png | Bin 0 -> 532 bytes .../Misc/robooveralls.rsi/meta.json | 26 + .../equipped-INNERCLOTHING.png | Bin 0 -> 1580 bytes .../Uniforms/musicianking.rsi/icon.png | Bin 0 -> 585 bytes .../Uniforms/musicianking.rsi/inhand-left.png | Bin 0 -> 607 bytes .../musicianking.rsi/inhand-right.png | Bin 0 -> 594 bytes .../Uniforms/musicianking.rsi/meta.json | 26 + .../equipped-INNERCLOTHING.png | Bin 0 -> 1508 bytes .../Uniforms/musiciankingblack.rsi/icon.png | Bin 0 -> 591 bytes .../musiciankingblack.rsi/inhand-left.png | Bin 0 -> 578 bytes .../musiciankingblack.rsi/inhand-right.png | Bin 0 -> 565 bytes .../Uniforms/musiciankingblack.rsi/meta.json | 26 + 161 files changed, 2035 insertions(+), 41 deletions(-) create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogiwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogiwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogiwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/chemistwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmowarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmowarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/cmowarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hossocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hossocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hossocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hoswarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hoswarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Security/hoswarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartendersocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartendersocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartendersocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml index 58a9d5e7122..0b8b48bf98b 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml @@ -16,4 +16,8 @@ ClothingOuterVest: 2 ClothingBeltBandolier: 2 ClothingEyesGlassesSunglasses: 2 + # Floofstation - Departmental Socks ect + ClothingUniformBartenderThong: 3 + ClothingUnderSocksBartender: 3 + ClothingHandsBartenderWarmers: 3 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml index cc4f21980cf..2c26e98d649 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml @@ -13,3 +13,7 @@ ClothingShoesBootsWinterChef: 2 #Delta V: Add departmental winter boots ClothingShoesChef: 2 ClothingBeltChef: 2 + # Floofstation - Departmental Socks ect + ClothingHandsChefWarmers: 2 + ClothingUnderSocksChef: 2 + ClothingUniformChefThong: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml index 433210dce7b..71b02c905ba 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml @@ -20,4 +20,8 @@ ClothingOuterApronChemist: 2 # Realistic PPE apron for chemistry ClothingEyesGlassesChemist: 2 # Safety glasses ClothingHandsGlovesChemist: 2 # Heavy duty chemistry gloves - # End of modified code \ No newline at end of file + # End of modified code + # Floofstation - Departmental Socks ect + ClothingHandsChemistsWarmers: 1 + ClothingUnderSocksChemists: 1 + ClothingUniformChemistsThong: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml index 4aa4ce6972d..34bbddd379f 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml @@ -11,3 +11,5 @@ ClothingHeadsetRobotics: 2 ClothingOuterWinterRobo: 2 ClothingShoesBootsWinterRobo: 2 #Delta V: Add departmental winter boots + ClothingOuterRoboOveralls: 2 #Floofstation - Add overalls + ClothingOuterPlainOveralls: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml index 88410e5f99f..765805b841e 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml @@ -24,9 +24,9 @@ ClothingNeckScarfStripedRed: 3 ClothingEyesBlindfold: 1 ClothingNeckCollarSec: 1 # Floofstation - Collar addition - ClothingHandsSecurityWarmers: 1 # Floofstation - ClothingUnderSocksSecurity: 1 # Floofstation - ClothingUniformSecurityThong: 1 # Floofstation + ClothingHandsSecurityWarmers: 2 # Floofstation + ClothingUnderSocksSecurity: 2 # Floofstation + ClothingUniformSecurityThong: 2 # Floofstation ClothingShoesBootsCombat: 1 ClothingShoesBootsWinterSec: 2 ClothingShoesBootsCowboyBlack: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index 9a1566dab99..4d0ecd90cdf 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -90,6 +90,15 @@ ClothingMaskNeckGaiterRed: 2 ClothingNeckBellCollar: 2 ClothingOuterUnathiRobe: 1 + # Floofstation - Departmental Socks ect + ClothingUniformMusicianThong: 2 + ClothingUnderSocksMusician: 2 + ClothingHandsMusicianWarmers: 2 + ClothingHandsStripeWhiteWarmers: 1 + ClothingUnderSocksStripedWhite: 1 + ClothingUniformStripedThongWhite: 1 + ClothingUniformMusicKingBlack: 2 + ClothingUniformMusicKing: 2 emaggedInventory: ClothingShoesBling: 1 ClothingShoesBootsCowboyFancy: 1 diff --git a/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml b/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml index d909cb12d44..7110cb7695b 100644 --- a/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml +++ b/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml @@ -27,6 +27,12 @@ ClothingUniformColorRainbow: 2 ClothingUnderSocksCoder: 1 ClothingUnderSocksBee: 1 + ClothingHandsBeeWarmers: 1 + ClothingHandsCoderWarmers: 1 + ClothingUniformThongCoder: 1 + ClothingUniformThongBee: 1 emaggedInventory: # 3 for more friends! ClothingUnderSocksCoderValid: 3 # Floofstation + ClothingHandsCoderValidWarmers: 3 + ClothingUniformThongCoderValid: 3 diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 42d48098536..1daaedd368f 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -1159,6 +1159,15 @@ - ClothingHandsStripeWhiteWarmers - ClothingUnderSocksStripedWhite - ClothingUniformStripedThongWhite + - ClothingHandsCoderWarmers + - ClothingUnderSocksCoder + - ClothingUniformThongCoder + - ClothingHandsCoderValidWarmers + - ClothingUnderSocksCoderValid + - ClothingUniformThongCoderValid + - ClothingHandsBeeWarmers + - ClothingUnderSocksBee + - ClothingUniformThongBee # Floofstation - Department Socks, Armwarmers ect - ClothingHandsCaptainWarmers - ClothingUnderSocksCaptain diff --git a/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml b/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml index 695c78b167a..5eeb83dcd9c 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml @@ -53,3 +53,26 @@ sprite: Floof/Clothing/OuterClothing/Misc/marshoodie.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHatHoodMarsHoodieHood + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterRoboOveralls + name: robotocist overalls + description: A simple pair of overalls, designed to go over a jumpsuit. + components: + - type: Sprite + sprite: Floof/Clothing/OuterClothing/Misc/robooveralls.rsi + - type: Clothing + sprite: Floof/Clothing/OuterClothing/Misc/robooveralls.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterPlainOveralls + name: plain overalls + description: A simple pair of overalls, designed to go over a jumpsuit. + components: + - type: Sprite + sprite: Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi + - type: Clothing + sprite: Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi + diff --git a/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml b/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml index 75d9ca2dc2a..f0501c05f18 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml @@ -144,6 +144,8 @@ tags: - Skirt + +#Other Outfits - type: entity parent: ClothingUniformBase id: ClothingUniformSexCompRed @@ -183,3 +185,24 @@ - type: Clothing sprite: Floof/Clothing/Uniforms/reotasuit.rsi +- type: entity + parent: ClothingUniformBase + id: ClothingUniformMusicKing + name: musician king + description: A musicians outfit, fit for a king + components: + - type: Sprite + sprite: Floof/Clothing/Uniforms/musicianking.rsi + - type: Clothing + sprite: Floof/Clothing/Uniforms/musicianking.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformMusicKingBlack + name: musician king black + description: A musicians outfit, fit for a king + components: + - type: Sprite + sprite: Floof/Clothing/Uniforms/musiciankingblack.rsi + - type: Clothing + sprite: Floof/Clothing/Uniforms/musiciankingblack.rsi diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 3db29f82a77..d7e1252e6ff 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -12,6 +12,9 @@ sprite: Floof/Clothing/Departmental/Command/captwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Command/captwarmer.rsi + - type: GloveHeatResistance + heatResistance: 1400 + - type: Insulated - type: Fiber fiberMaterial: fibers-durathread fiberColor: fibers-regal-blue @@ -54,6 +57,10 @@ sprite: Floof/Clothing/Departmental/Command/commandwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Command/commandwarmer.rsi + - type: Armor + modifiers: + coefficients: + Slash: 0.95 - type: Fiber fiberMaterial: fibers-durathread fiberColor: fibers-blue @@ -97,9 +104,12 @@ sprite: Floof/Clothing/Departmental/Engineering/engiwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Engineering/engiwarmer.rsi + - type: Insulated + - type: GloveHeatResistance + heatResistance: 1400 - type: Fiber - fiberMaterial: fibers-synthetic - fiberColor: fibers-yellow-and-orange + fiberMaterial: fibers-insulative + fiberColor: fibers-yellow - type: FingerprintMask - type: entity @@ -127,6 +137,47 @@ tags: - Skirt +#Head of Engi / Chief Engineer +- type: entity + parent: ClothingHandsBase + id: ClothingHandsChiefEngiWarmers + name: chief engineer's arm-warmers + description: A pair of rather nice arm-warmers, styled for Engineering roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi + - type: Insulated + - type: GloveHeatResistance + heatResistance: 1400 + - type: Fiber + fiberMaterial: fibers-insulative + fiberColor: fibers-white + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksChiefEngi + name: chief engineer's thigh-high socks + description: A pair of thigh-high socks, styled for Logistic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformChiefEngiThong + name: chief engineer's thong + description: Styled for a Logistics, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Engineering/chiefengithong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Engineering/chiefengithong.rsi + #Epistemics Outfits # @@ -141,9 +192,13 @@ sprite: Floof/Clothing/Departmental/Epistemics/epiwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/epiwarmer.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.85 - type: Fiber fiberMaterial: fibers-synthetic - fiberColor: fibers-white-and-purple + fiberColor: fibers-white - type: FingerprintMask - type: entity @@ -156,6 +211,10 @@ sprite: Floof/Clothing/Departmental/Epistemics/episocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/episocks.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.85 - type: entity parent: ClothingUniformBase @@ -170,6 +229,10 @@ - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt + - type: Armor + modifiers: + coefficients: + Caustic: 0.95 #Chaplain - type: entity @@ -235,6 +298,56 @@ - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/chaplainmantlehood.rsi +#Head of Epi / Research Director +- type: entity + parent: ClothingHandsBase + id: ClothingHandsEpiHeadWarmers + name: research director's arm-warmers + description: A pair of rather nice arm-warmers, styled for Epistemic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.85 + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-purple + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksEpiHead + name: research director's thigh-high socks + description: A pair of thigh-high socks, styled for Epistemic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.85 + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformEpiHeadThong + name: research director's thong + description: Styled for a Epistemics, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Epistemics/directorepithong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Epistemics/directorepithong.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.95 + #Logistics Outfits # #General Logistics @@ -250,7 +363,7 @@ sprite: Floof/Clothing/Departmental/Logistics/logiwarmer.rsi - type: Fiber fiberMaterial: fibers-synthetic - fiberColor: fibers-brown-and-yellow + fiberColor: fibers-brown - type: FingerprintMask - type: entity @@ -278,6 +391,44 @@ tags: - Skirt +#Quartermaster/ Logistics Officer +- type: entity + parent: ClothingHandsBase + id: ClothingHandsLOLogisWarmers + name: logistics officer arm-warmers + description: A pair of rather nice arm-warmers, styled for Logistic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Logistics/qmlogiwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Logistics/qmlogiwarmer.rsi + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-brown + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksLOLogis + name: logistics officer thigh-high socks + description: A pair of thigh-high socks, styled for Logistic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformLOLogisThong + name: logistics officer thong + description: Styled for a Logistics, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Logistics/qmlogithong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Logistics/qmlogithong.rsi + #Medical Outfits # #General Medical @@ -292,8 +443,8 @@ - type: Clothing sprite: Floof/Clothing/Departmental/Medical/medicalwarmer.rsi - type: Fiber - fiberMaterial: fibers-synthetic - fiberColor: fibers-white-and-blue + fiberMaterial: fibers-latex + fiberColor: fibers-white - type: FingerprintMask - type: entity @@ -321,6 +472,136 @@ tags: - Skirt +#Chemist +- type: entity + parent: ClothingHandsBase + id: ClothingHandsChemistsWarmers + name: chemist arm-warmers + description: A pair of rather nice arm-warmers, styled for Chemists. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/chemistwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/chemistwarmer.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.95 + - type: Fiber + fiberMaterial: fibers-latex + fiberColor: fibers-white + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksChemists + name: chemist thigh-high socks + description: A pair of thigh-high socks, styled for Chemists. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/chemistsocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/chemistsocks.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.95 + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformChemistsThong + name: chemist thong + description: Styled for a Chemists, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/chemistthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/chemistthong.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.95 + +#Paramedic +- type: entity + parent: ClothingHandsBase + id: ClothingHandsParaMedicWarmers + name: paramedic arm-warmers + description: A pair of rather nice arm-warmers, styled for Paramedic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/paramedwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/paramedwarmer.rsi + - type: Fiber + fiberMaterial: fibers-latex + fiberColor: fibers-blue + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksParaMedic + name: paramedic thigh-high socks + description: A pair of thigh-high socks, styled for Paramedic roles. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/paramedsocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/paramedsocks.rsi + - type: ClothingSpeedModifier + walkModifier: 1 + sprintModifier: 1.2 + enabled: false + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformParaMedicThong + name: paramedic thong + description: Styled for a Paramedics, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/paramedthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/paramedthong.rsi + +#Chief Medical Officer +- type: entity + parent: ClothingHandsBase + id: ClothingHandsCMOWarmers + name: chief med officer's arm-warmers + description: A pair of rather nice arm-warmers, styled for the CMO. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/cmowarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/cmowarmer.rsi + - type: Fiber + fiberMaterial: fibers-latex + fiberColor: fibers-blue + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksCMO + name: chief med officer's thigh-high socks + description: A pair of thigh-high socks, styled for the CMO. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/cmosocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/cmosocks.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformCMOThong + name: chief med officer's thong + description: Styled for the CMO, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Medical/cmothong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Medical/cmothong.rsi + #Security Outfits # #General Security @@ -336,19 +617,18 @@ sprite: Floof/Clothing/Departmental/Security/secwarmer.rsi - type: Fiber fiberMaterial: fibers-durathread - fiberColor: fibers-black-and-red + fiberColor: fibers-black - type: FingerprintMask - type: Armor modifiers: coefficients: - Blunt: 0.1 - Slash: 0.1 - Piercing: 0.1 - Heat: 0.3 - - type: GroupExamine + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.95 - type: entity - parent: ClothingShoesBase + parent: ClothingShoesMilitaryBase id: ClothingUnderSocksSecurity name: security thigh-high socks description: A pair of thigh-high socks, styled for Security roles. @@ -360,11 +640,10 @@ - type: Armor modifiers: coefficients: - Blunt: 0.1 - Slash: 0.1 - Piercing: 0.1 - Heat: 0.3 - - type: GroupExamine + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.95 - type: entity parent: ClothingUniformBase @@ -383,11 +662,128 @@ - type: Armor modifiers: coefficients: - Blunt: 0.1 - Slash: 0.1 - Piercing: 0.1 - Heat: 0.3 - - type: GroupExamine + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.95 + +#Head of Security +- type: entity + parent: ClothingHandsBase + id: ClothingHandsHeadSecurityWarmers + name: HoS arm-warmers + description: A pair of rather nice arm-warmers, styled for HoS. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Security/hoswarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Security/hoswarmer.rsi + - type: Fiber + fiberMaterial: fibers-durathread + fiberColor: fibers-black + - type: FingerprintMask + - type: Armor + modifiers: + coefficients: + Blunt: 0.9 + Slash: 0.9 + Piercing: 0.9 + Heat: 0.9 + +- type: entity + parent: ClothingShoesMilitaryBase + id: ClothingUnderSocksHeadSecurity + name: HoS thigh-high socks + description: A pair of thigh-high socks, styled for the HoS. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Security/hossocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Security/hossocks.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.9 + Slash: 0.9 + Piercing: 0.9 + Heat: 0.9 + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformHeadSecurityThong + name: HoS thong + description: Styled for the HoS, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Security/hosthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Security/hosthong.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.9 + Slash: 0.9 + Piercing: 0.9 + Heat: 0.9 + + #Detective +- type: entity + parent: ClothingHandsBase + id: ClothingHandsDetectiveWarmers + name: detective's arm-warmers + description: A pair of rather nice arm-warmers, styled for a Detective. Does not leave Fibers or Fingerprints. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Security/detectwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Security/detectwarmer.rsi + - type: FingerprintMask + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.9 + - type: GuideHelp + guides: + - Forensics + +- type: entity + parent: ClothingShoesMilitaryBase + id: ClothingUnderSocksDetective + name: detective's thigh-high socks + description: A pair of thigh-high socks, styled for a Detective. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Security/detectsocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Security/detectsocks.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.9 + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformDetectiveThong + name: detective's thong + description: Styled for a Detective, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Security/detectthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Security/detectthong.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.9 #Service Outfits # @@ -404,7 +800,7 @@ sprite: Floof/Clothing/Departmental/Service/servicewarmer.rsi - type: Fiber fiberMaterial: fibers-synthetic - fiberColor: fibers-grey-and-green + fiberColor: fibers-grey - type: FingerprintMask - type: entity @@ -432,6 +828,17 @@ tags: - Skirt +- type: entity + parent: ClothingUniformBase + id: ClothingUniformServiceUni + name: universal service jumpsuit + description: A jumpsuit styled for service workers. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi + #Janitorial - type: entity parent: ClothingHandsBase @@ -458,6 +865,7 @@ sprite: Floof/Clothing/Departmental/Service/janitorsocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Service/janitorsocks.rsi + - type: NoSlip - type: entity parent: ClothingUniformBase @@ -472,3 +880,117 @@ - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt + +#Bartender +- type: entity + parent: ClothingHandsBase + id: ClothingHandsBartenderWarmers + name: bartender arm-warmers + description: A pair of rather nice arm-warmers, styled for Bartenders. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/bartenderwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/bartenderwarmer.rsi + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-black + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksBartender + name: bartender thigh-high socks + description: A pair of thigh-high socks, styled for Bartenders. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/bartendersocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/bartendersocks.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformBartenderThong + name: bartender thong + description: Styled for a Bartenders, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/bartenderthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/bartenderthong.rsi + +#Musician +- type: entity + parent: ClothingHandsBase + id: ClothingHandsMusicianWarmers + name: musician arm-warmers + description: A pair of rather nice arm-warmers, styled for musicians. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/musicianwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/musicianwarmer.rsi + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-purple + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksMusician + name: musician thigh-high socks + description: A pair of thigh-high socks, styled for musicians. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/musiciansocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/musiciansocks.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformMusicianThong + name: musician thong + description: Styled for a musicians, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/musicianthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/musicianthong.rsi + +#Chef +- type: entity + parent: ClothingHandsBase + id: ClothingHandsChefWarmers + name: chef arm-warmers + description: A pair of rather nice arm-warmers, styled for Chef. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/chefwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/chefwarmer.rsi + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-white + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksChef + name: chef thigh-high socks + description: A pair of thigh-high socks, styled for a Chef. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/chefsocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/chefsocks.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformChefThong + name: chef thong + description: Styled for a Chef, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Service/chefthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Service/chefthong.rsi diff --git a/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml b/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml index c9f438f2eaa..48020c8ce01 100644 --- a/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml +++ b/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml @@ -139,7 +139,43 @@ - AtmosphericTechnician - ChiefEngineer -#TO BE ADDED - ChiefEngineer +#Chief Engineer + +- type: loadout + id: LoadoutClothingHandsChiefEngiWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsChiefEngiWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefEngineer + +- type: loadout + id: LoadoutClothingUnderSocksChiefEngi + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksChiefEngi + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefEngineer + +- type: loadout + id: LoadoutClothingUniformChiefEngiThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformChiefEngiThong + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefEngineer #Epistemics Outfits # @@ -229,7 +265,7 @@ - type: loadout id: LoadoutClothingChaplainEpiMantle category: Jobs - cost: 2 + cost: 1 exclusive: true items: - ClothingOuterEpiChaplainMantle @@ -238,7 +274,45 @@ jobs: - Chaplain -#TO BE ADDED - ResearchDirector +#Research Director +- type: loadout + id: LoadoutClothingHandsEpiHeadWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsEpiHeadWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - ResearchDirector + +- type: loadout + id: LoadoutClothingUnderSocksEpiHead + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksEpiHead + requirements: + - !type:CharacterJobRequirement + jobs: + - ResearchDirector + + +- type: loadout + id: LoadoutClothingUniformEpiHeadThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformEpiHeadThong + requirements: + - !type:CharacterJobRequirement + jobs: + - ResearchDirector + +#TO BE ADDED - Psionic Mantis - ForensicMantis #Logistics Outfits # @@ -279,8 +353,44 @@ jobs: - CargoTechnician -#TO BE ADDED - Quartermaster -#TO BE ADDED - Courier +#Quartermaster +- type: loadout + id: LoadoutClothingHandsLOLogisWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsLOLogisWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Quartermaster + +- type: loadout + id: LoadoutClothingUnderSocksLOLogis + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksLOLogis + requirements: + - !type:CharacterJobRequirement + jobs: + - Quartermaster + +- type: loadout + id: LoadoutClothingUniformLOLogisThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformLOLogisThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Quartermaster + +#TO BE ADDED - Courier - MailCarrier #Medical Outfits # @@ -333,9 +443,116 @@ - MedicalIntern - Chemist -#TO BE ADDED - Chemist -#TO BE ADDED - ChiefMedicalOfficer -#TO BE ADDED - Paramedic +#Chemist +- type: loadout + id: LoadoutClothingHandsChemistsWarmers + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingHandsChemistsWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + +- type: loadout + id: LoadoutClothingUnderSocksChemists + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUnderSocksChemists + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + +- type: loadout + id: LoadoutClothingUniformChemistsThong + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUniformChemistsThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + +#Chief Medical Officer +- type: loadout + id: LoadoutClothingHandsCMOWarmers + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingHandsCMOWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefMedicalOfficer + +- type: loadout + id: LoadoutClothingUnderSocksCMO + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUnderSocksCMO + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefMedicalOfficer + +- type: loadout + id: LoadoutClothingUniformCMOThong + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUniformCMOThong + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefMedicalOfficer + +#Paramedic +- type: loadout + id: LoadoutClothingHandsParaMedicWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsParaMedicWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Paramedic + +- type: loadout + id: LoadoutClothingUnderSocksParaMedic + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksParaMedic + requirements: + - !type:CharacterJobRequirement + jobs: + - Paramedic + +- type: loadout + id: LoadoutClothingUniformParaMedicThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformParaMedicThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Paramedic #Security Outfits # @@ -388,8 +605,79 @@ - Detective - HeadOfSecurity -#TO BE ADDED - Detective -#TO BE ADDED - HeadOfSecurity +#Detective +- type: loadout + id: LoadoutClothingHandsDetectiveWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsDetectiveWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + +- type: loadout + id: LoadoutClothingUnderSocksDetective + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksDetective + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + +- type: loadout + id: LoadoutClothingUniformDetectiveThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformDetectiveThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Detective + +#Head Of Security +- type: loadout + id: LoadoutClothingHandsHeadSecurityWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsHeadSecurityWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity + +- type: loadout + id: LoadoutClothingUnderSocksHeadSecurity + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksHeadSecurity + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity + +- type: loadout + id: LoadoutClothingUniformHeadSecurityThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformHeadSecurityThong + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfSecurity #Service Outfits # @@ -445,9 +733,157 @@ - Chef - ServiceWorker -#TO BE ADDED - Bartender -#TO BE ADDED - Chef -#TO BE ADDED - Musician +- type: loadout + id: LoadoutClothingUniformServiceUni + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUniformServiceUni + requirements: + - !type:CharacterJobRequirement + jobs: + - Bartender + - Botanist + - Reporter + - Musician + - Chef + - ServiceWorker + +#Bartender +- type: loadout + id: LoadoutClothingHandsBartenderWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsBartenderWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Bartender + +- type: loadout + id: LoadoutClothingUnderSocksBartender + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksBartender + requirements: + - !type:CharacterJobRequirement + jobs: + - Bartender + +- type: loadout + id: LoadoutClothingUniformBartenderThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformBartenderThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Bartender + +#Chef +- type: loadout + id: LoadoutClothingHandsChefWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsChefWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Chef + +- type: loadout + id: LoadoutClothingUnderSocksChef + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksChef + requirements: + - !type:CharacterJobRequirement + jobs: + - Chef + +- type: loadout + id: LoadoutClothingUniformChefThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformChefThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Chef + +#Musician +- type: loadout + id: LoadoutClothingHandsMusicianWarmers + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingHandsMusicianWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician + +- type: loadout + id: LoadoutClothingUnderSocksMusician + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUnderSocksMusician + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician + +- type: loadout + id: LoadoutClothingUniformMusicianThong + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUniformMusicianThong + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician + +- type: loadout + id: LoadoutClothingUniformMusicKingBlack + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUniformMusicKingBlack + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician + +- type: loadout + id: LoadoutClothingUniformMusicKing + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUniformMusicKing + requirements: + - !type:CharacterJobRequirement + jobs: + - Musician #Janitorial - type: loadout @@ -486,6 +922,9 @@ jobs: - Janitor +#TO BE ADDED - Botanist +#TO BE ADDED - Reporter + # Misc # Mime diff --git a/Resources/Prototypes/Floof/Loadouts/outerClothing.yml b/Resources/Prototypes/Floof/Loadouts/outerClothing.yml index ac778965c57..45e44baeeda 100644 --- a/Resources/Prototypes/Floof/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Floof/Loadouts/outerClothing.yml @@ -18,3 +18,24 @@ cost: 2 items: - ClothingOuterCoatLab + +- type: loadout + id: LoadoutClothingOuterRoboOveralls + category: Outer + cost: 2 + items: + - ClothingOuterRoboOveralls + +- type: loadout + id: LoadoutClothingOuterPlainOveralls + category: Outer + cost: 2 + items: + - ClothingOuterPlainOveralls + +- type: loadout + id: LoadoutClothingOuterMarsHoodie + category: Outer + cost: 1 + items: + - ClothingOuterMarsHoodie diff --git a/Resources/Prototypes/Floof/Loadouts/sockect.yml b/Resources/Prototypes/Floof/Loadouts/sockect.yml index f2c7fcde1aa..5d36b964465 100644 --- a/Resources/Prototypes/Floof/Loadouts/sockect.yml +++ b/Resources/Prototypes/Floof/Loadouts/sockect.yml @@ -69,3 +69,75 @@ exclusive: true items: - ClothingUniformStripedThongRainbow + +#Coder Socks +- type: loadout + id: LoadoutClothingHandsCoderWarmers + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsCoderWarmers + +- type: loadout + id: LoadoutClothingUnderSocksCoder + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingUnderSocksCoder + +- type: loadout + id: LoadoutClothingUniformThongCoder + category: Uniform + exclusive: true + items: + - ClothingUniformThongCoder + + #Coder-Valid Socks +- type: loadout + id: LoadoutClothingHandsCoderValidWarmers + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsCoderValidWarmers + +- type: loadout + id: LoadoutClothingUnderSocksCoderValid + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingUnderSocksCoderValid + +- type: loadout + id: LoadoutClothingUniformThongCoderValid + category: Uniform + exclusive: true + items: + - ClothingUniformThongCoderValid + +#Bee Socks +- type: loadout + id: LoadoutClothingHandsBeeWarmers + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsBeeWarmers + +- type: loadout + id: LoadoutClothingUnderSocksBee + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingUnderSocksBee + +- type: loadout + id: LoadoutClothingUniformThongBee + category: Uniform + exclusive: true + items: + - ClothingUniformThongBee diff --git a/Resources/Prototypes/Floof/Recipes/Lathes/uniformssocksect.yml b/Resources/Prototypes/Floof/Recipes/Lathes/uniformssocksect.yml index 5b21d142033..f273a085a7b 100644 --- a/Resources/Prototypes/Floof/Recipes/Lathes/uniformssocksect.yml +++ b/Resources/Prototypes/Floof/Recipes/Lathes/uniformssocksect.yml @@ -229,3 +229,47 @@ completetime: 2 materials: Cloth: 100 + +#Bartender +- type: latheRecipe + id: ClothingHandsBartenderWarmers + result: ClothingHandsBartenderWarmers + completetime: 2 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUnderSocksBartender + result: ClothingUnderSocksBartender + completetime: 2 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUniformBartenderThong + result: ClothingUniformBartenderThong + completetime: 2 + materials: + Cloth: 100 + +#Musician +- type: latheRecipe + id: ClothingHandsMusicianWarmers + result: ClothingHandsMusicianWarmers + completetime: 2 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUnderSocksMusician + result: ClothingUnderSocksMusician + completetime: 2 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUniformMusicianThong + result: ClothingUniformMusicianThong + completetime: 2 + materials: + Cloth: 100 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..f47fd3959a003232ef4e08c4b2efb5cb74769420 GIT binary patch literal 720 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*Oh%mQIvl z`|#YmC~}LO-`fC{;3f5r!5akE#V%!>&i9SwXy4L+0@3h=0ajrmd(vJAb(E}SKjv_G zzr!TWj^?>fayCmmzO8u2RAb_gultH$6bJ9%uAKMh6JO)|P^G5-KZ95l7#KMm7?=ba z7_cyTDvP5%H{YwT{UTiP&+p3i?_SH^eShzJo?()3>Y6o;f1(*vCJ63-wz%S_)Y`{t zpSTxArKvdbe#Tsp9wolEDvG8fO?}1-coOAv3wG7Or z9lI4}x{7dx@pc84q3$09t;h$*M~)NUa;@azxIFLRrN@lJKP-B z3=VY4&dg^W;OE=x6BO-rR zs58u-o&VwQ1M{@`z6pgNor@SA7M5~cc>B%%@R7I!8)_If=!i1DkUN>p95K!5Z!tr9 zrO__=?{Nowe>{AeKR4;w)U|tOEaYWiu-`Z5VC1|WF|kQAnhwU>&-Oid-|Fb&>B6^e b)-!A`=$=1!GqVCPH8Oa*`njxgN@xNAqbDaP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..baf0b5566959f6925a9d677c163e44fb6d4e80f2 GIT binary patch literal 381 zcmV-@0fPRCP)pF8+1ijbW?9;ba!ELWdK8EY;$>YAX9X8WNB|8RBvx=!KdMT00039 zNklxEt=rH=L*{|5;)H0~o*n1~9-m0LevX@7w<43m#rn zrmv!RH``g~9@JB*4B+Bwk|qS3XXc+X+D|I;H_`TOhqN{#3_{kds{y#UT8>Mcu0xV0 z_4lmMt!uz~PbOL&vZ~+(iKZJ48{G0DHhsJA1_jFn|FJ b@SFMuZ6)r(;o4B>00000NkvXXu0mjf!-b%& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengisocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..82d1c40b45c6e32395fe43c588d4a1b8584922b0 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*T79Z8i{S zOPudAo%2PEF^h2u(|JenrOAD>6^sp7Ol5_aIPVHk)J*D>XP#KGev5AHr^l0HBhH+e zyORZI85Zy;R75=c_Hv!M@zK#w&c9=*?6`R~Ce{hVhO#v@9_6^ zB0u*qVX+cL$YAZNRhxFL7AOoliNur+td9FTgS=& j%m*f|dmse&g4Ffq$Es_;&TPM?WW4dJKjQ&e>?G-)u@_(07Fi*Ar-gY-ZJDnpuoZ4 z@MlK<_vDgSR~DKUE|lRnC}5s+;KZ31GR#1w=%68e&DNrGma9azPS$T&&mbrmDp2;R zmUV|b^99)jQT!Hc0b4n@u^DhMqH9FrTW|yvW`aD&;9lQoe}|XBfSrNig46@1Y6kHM TtW$4+e97SH>gTe~DWM4fXc0uo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengithong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..49a42c37e196ddf2d168c6f562835cae17f3816e GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@$+!hJ2=!G*_1r)_3o|OFD#S zFl=WmY2PQ7@P?dG&IOrE;(8Gv7P! z)sK3{M;2-4KWqHh73QaKvwDGvuV$B0Zj0}m|LP6CX6ff8BcF?Q{0}^dG;HwRMT`i?ZEscCFjUrJ%&sZ7eEjp5r7U5px&JWgY}CK$o(ep#PqU_P?qO^0EMtA~ zX1|qtT74$N&BHIw+H32PYc{`f{G^gHZ-$TS+T!|{7F4fc@Ej6*tR5Xt5dK>) z9H^?V+F;RVX|?P3zrSVCD?eu&t$L!$yW!SaRi&r%{#qSYo4wiO@+%MRaEE*A*WdbW z9?Q6^Qj>X0^S7X1PwM`MUpC@-owG4+k@WoagE4=d#Wzp$P!^s_V%B literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4116e258d1883c19e2e35288a8af88df726af4ef GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%GQBloh&^M4S#h+V_&jqHmkR z(iQ`rNc{#zwpGnc`<^UV!X)zRp>OcX3EX_=e@SJ13uST*bP!-!%UCG0I5qOHnn8TO zqHlgw%X8lkTeK4=u*8)2EIT>7c2dk%hWp!Rw}mcMIPG=qx6nSOTPClA7uUA!%TK=j m@O_6_=S6=H1}1?927Z=vmk;h=n41LjErX}4pUXO@geCw&oP`Yl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..47e476c338d5da56cb2f1115195ee0a0cddfe421 GIT binary patch literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*Li92nWir zeR$8Ql)*9Ai?j1Wz%A)Jj}mO&D6neIdU)c&qU{|@SprMms_<(1ZRHS}vZ!RGl|>6* zVAq9}PkWp($o}zV~&{`%(YC{JkyHfAu9(e#~!I zU|{5MU|L0nETnsn<<{e(Omc!Oe?e}>X1_pJrbBcW`^G7#a1=`pl9~H*~+Ryv=k@T!O=u zk->akeCxW`hc@Z_{PxhD;eg-bbv3L%V)rjMK5)V3CCiP>D|c0I{F}YX*unMhI>tGN zpM5zQaGb%u&h*Y<&!bO5ue|44u(x74!zzK0Ywx8P7^0?2F_=3nFRx=-vFdz%6SlBI zgrJNK&)F%?(%S=FISW-jTFz7c+`es9Gs_3< zX7vWojcW2Yoo9GHHH949%qfdW87k8RwfYx#32_x^1u*P4s<2~ba|$eHU6Iu(KkeX7=`D6P z?|^JrR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..08c681180bd298b86e1a7606a27a521e02e0afc9 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%j5jv*0;-(FGla1InX z_VK@{%LPLprNf+2H3!oI^=7dMn%abY6U&6H#ucTcn3>l$E^ua}tW0Weny)OafAPiC*A<&2-fW7JK2~ZYwYMvUrSj4lU!O^K(doK{PI22p zz22TI+~Ab!6fHl8!SDB;;^3JUz_1<=QC;<>k_@46D9+m2fib=u=l*5VhXK z{X&)4NxqiT*KW&Zb65OdV?O<}KjYf|?aY7JE*dgCNWbDBeBs@>x}#zVj6gK^ih16g WZwKdE@w^2FHiM_DpUXO@geCx^$gr*e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6907602d127e63b8a1b66416b08aada3556ea2 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*MB{9Wsz; zd-$(ug21K%rY|yVrxnHi2x#!|v9LQd99|&sfV2HTQbC5FgP4<(fIZjoNqO1b5B{d8 z?|T<{yR&Q6tolBnrC5MN-6V^vhf~#4=ZE+9|2w3epyVE#<)3prHeEQjbjH@BWp_@C zc{~bPTy@$c%lC7|UEgneBUP zZuR%%-v!-y>e>lc=Dz%8!r%2^)n)^Sd%ZaxEsp7HZh!X5dHzh~Kx*a9C#6r%_Bso| cjdb1|Gi&VdE+CK&L)T69sg_I zF!98!vEjL2SD*Of%V%chm3GT5cn`=pc0LtRcPe^RVbP0l+XkKQaMuy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ac018893dee82d5ab31c5c051f7002b84f03045d GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@i$y~ff_JC#j#yEe=WXGTe@Om4Py;! zN5_dKgGukT5B!yAc*StD>VQeZ8s7~j4UQZbIuQZ~TpD`3gF*ZmzqtQA%wuSU~+(a Xnuhp<#n(fwf@C~h{an^LB{Ts5=&w)< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepithong.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/equipped-HAND.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..bd63829b4b5140a93f4e288fb1a2b73dd5318b3f GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*OhP4tA7b z|L|V4Ng&Qi-B3YHF6q94g^G9O7ycD~ir(!)?3y=@>hk?%mbv69&iZmeuy|qi|AvAc zCe0TVb%innmF9YV=I~fxFFyZB)THX^)$1qL)hD0WegCiBpB>gaf|Z(P%XBfYC@?T` zI502?G=Q0Iix);+Ix1c>Y5J+M53{nm`c-pI7CkcDbjp4k^CM3iy){YO_a~dooR#JE zr~dXM_s{IDtPCD=Ad&bI9-8H`AhVd4HUT-E&5UI+yz& zcYeMorO^Gyjlq+9LjTDo%mzF4;!*?X_QUU*w3eD?G%=4)~GGbJ0&SS5%k^lksW z{-4*jz?)M}@88+A`q;e{IsY^jN*hjdOkMo^{~NYQ<{WYVl>Y~X3g#k4Ay1@H7W`7Imku^U%j_ro$ZlpU)k0kny~8~;|Z3ni#VBhxEkNHIA01k z-E=omab@M=^m~6k?d$3IF#ouQ10z>J1Cz)H=?53jq#kaXX)|-#!Qx<#`HJU_jCzd( z1kLA0+wEKCIpdCq(EIDPaojUv?s;DS#&AQPY5jcttqs3lv!A>r))0H+)4nQe*$F}` zUhcMMyjNX#?&03!meYAGp2Y^SeQRf!5X024Cii?e6GL=wwzQU6p2U>rZyBR|J!MZ? zR3!$?|MP&0_?6j28}bf4sN^cJ`d=722WQ%mvv4FO#pIE Bk}CiJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..46741ff5b75b047d5cea53fd553b360a1c416b5e GIT binary patch literal 823 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@k<5}SY~6A6=njcFQ+ISk?6P3_&$LiMs6e2LgY`et%LhSPkCHA% zzPhx-E@?fR%)bY@)9T^4^{;77?>H=|-ktlY-WM)dm-x1I~8Zr>rMcuDi&> z&~SN~;?&jUB919_rx_RwY$}*;&1>tQDbzN{Z1VxPO7`c?dLFexo1*Ql{@E5->|b|1 zV9kLu<<<Dy#D9lyW*2d!h91t zSSzxM*^f=ya?Vub%B~Bh2h(hAx~{(2FeOaz)9oX96AYSqRkP+^FMQY6;m`rx$t-H}n^W9JT+*S8(&vuE&F7i#$Gb+-0z^`h+M^XER^ RPytNz44$rjF6*2UngFQNWw-zU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..09dbe1c2f4a14b6e03907d43f68f5060d0ff2215 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%KXKjQY{W9X`q*JfyMM(NJsltBA60Q+f}lkVIj2Pqm-m|Wt+(A~wftg< zopM^)`S^%64KZq+4HkOxwlZ;BZ~Us6CZ=YhGNUPNx48U*O=&@^nRW8`9^QQWproJs zz^7?VhPJ)kfB91`JN(qJQ8G!W&YWZM^~2-?zGsg+ew~^-#VvE&iY^wBX-Cf86z(=< zJpQ>bh?6B@>70gzD?h4z_|3-9QTzS%(IVz;sX=#n17-z1{87)?#uf6uR^*F|ii<`= z?o5-J(havmUDn4lF)UbaAvY_2q2NMBh5!jkw*OCdthGGxT9YwjN9-99UX5n1SNZQJ i{%fo`Dx|;&MEAqge;?fDAg~4)@(iA?elF{r5}E*ZWwRFm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogisocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..daa3a0bbc2eb36a35c7dfceec1080118a696cc3f GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@AD5A0oznoDZ=k~&QUeb;Gjxo;l#;NIiO<>iOxCZt6@5dgXdD{v@?XnRt$TEA)E z^;eR1CijnS>Ds&RYDN8V!Nk|Wml&5eoqO&Z{iFB!TK8MG%a*ZSc$alYbA4by-TuN< zhUx6uHMc6nTwFwhi?k*#dn0u5HTy(ssSBQez3ZZ4AI#mJ2UAcCZ3b8PiIzD{I>jeJDy9r?ry5&r0}gGwwCW)Vm&AREB@y(d%^u# z-HVwQt@#<@*H{*wJhi&<)z1PRCam5-7F2Kv>9&%OznLUF;>J-#4&2#9Oz@-o<0}}Cc^>bP0 Hl+XkKap2hy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aea9b9bd376ea328965191a3ade019ace509e57c GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%*t-46|7&Z{OBS9yA9?hvz3LljWnbq7=iDFGU!KO^bK}U` zRrd`lBI*|QGFv&f{F}bM^7x4Z2M$~iR{J@>wR3Lc{K<_EAD6SW+5fLInzE*;g=ghL zhbhdjYDE71|NDP3qvem)dsY8;f7)cc=U|5dsHX8hX5gLHrrNxc@xNV`#8sU}(6+ YAYSPxK4CrUVOfxrr>mdKI;Vst0I7OW0ssI2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/qmlogithong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ba73e5d295d46e9827fd75d01951db84558960fd GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@`OlJA%lX7?02rz|W?mb$!_Q#!e4YU*0~hSccm zyDnZ@;-mUR=k1c(l;{^0uwvVWKO25sSNfM;=N!GjTlP&FKd=75 zf(*G$DTcY+HGjgKw{jl-IoIsLDb~_Wx)=15F0OxYUGanF^#k2LaoZbqYuD{sbCbQg zU{Z5|g+0Ta+c&QFZk6K~Vwf|N-R}9<&(cf`4MmHaf9La;a97kRI{;0UUErPc)0a^q zu1iTcvO6qrHKK~#|#cc`7HKwJ{akqe&L77;?K#)JX}m(nHSby(=E6eT`|Ed zY_>o{*>0xg-c47zrgXJLUw^fn>A_cP_R2j%w{jOmDL#qYd4~PP_cwR>4m=LvF_l}s zlS%9^m)BRZQ>7fW{R$;)z%Y!83b^=wUmExE^NlGc9{*qENQhcX@&=t~cVw?jU$6GX zu=RtkK~KP{(hn)G&rkbWW#i%Y>&N4sz>V^*%ufP!lYQ%w8sxV=)=s#^a57`Uxs@~I u9ONHPx?i^HT!a44WgniPhC{-%YAX9X8WNB|8RBvx=!KdMT0003d zNkljY;OoIio{K@+sDcg`W8j`;re-@H8fG_$=l-K~!Agk(;*60oj$@%S#P<60@u~e|Vku zPv!kn^Yw34)*p)M{%^y=$l<`iB+$UXqQHQKxxD?_t^IrA)*H_BIg+$-!{Uo4_Aj0y zv~rTK;C?ZOd7Rb7cUc+s?0IK6BeL*SoK}O#$L#QiAg=ev6z=COoFWvJZ9PF~`d_;( z*G_6XXtE~rY+L#x$mRj;+q3Pr zR(mD?(alR3Ha=z#bqMTp=M*_Fy|Q7($Mb9&)2l+6p01pj^lx|2`mXqSQh|(jyk37< zEmRP%_$_aO(Z8Dv3{wbq`=_m>gTe~DWM4fJUi(e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e247f0c9bf7ce1f573664b125573ed9e71211fa GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%vX)+OJI);nefuY4ZhZz}zMK}qnMz0E%2rU#u`x!Rm&>P&Ws`G=em!lG53=DyWzi#geS!Q)?kC*~H Wo*fJgzuW-yAA_f>pUXO@geCw7p?+Ne literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistsocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..2d30970427c6b70cb6beacde12efb47277b27081 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@@;3qMMDzBXX7(pq7l^zEp~pY=W>w$HoYii8c<2Q zc7|@Rf5&;hzn<3lZ<1t!(jwz^)yKE)&)_^FvG#UeYVqCETXvr?=-c#U`uT6|3c+5X ze~(rl_`9dhc8ArSEnjcdDqVRLp4)UdaIJOZ=jq??6#wAHv;8wDImzdK9$>h(>A9VD6*J+!ZnK{C>HJDd2-0zg0kQL%R86@cG>gTe~ HDWM4fEfRW~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e157f91a8302373ff02b38ee2de1d96dcd9dde1 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%wpdi5d zV7EofH3PQZ**lugEwtXzdA65vD_`Qgxwc+T9&%47dhh!k%nk*3;F`Wt~$(69BOrN_GGM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/chemistthong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d7472491e5ff52d3f6594f768bc326d87761b3 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@7Fi*Ar-gY-nz(pK!JnR z;m)FW_H*(a+XZGz^)sG0T`M4zF;mh!oEfMT9VG01Ch_yjy??j(5BN1$y1BW8u&#Ue zUD6>mgJC&iNV}cbgIkgtsH%xdeDMj} S>K|o+)Ox!5xvXF!Z*KB&GwpoPd_gYvY^r{3qS|N3v^wUl?E*PB*8_Fg~Ts!rdb=i=*K(^O2;q*^cR zOh|sVSm4&rRj;k2A4>eJW?W+D@orD>ll$BgqR%buJ81an`>KXxK9j1ZKRACQNz@?a z-#M-sXX^jnd!AU6{O_QsK}nt7!FBr&N-XyF+Sd~Fe2$jAyc4o3(AfvhWz6oI)b;hh z_YuY4UQ8W^zbb6PG%ozmk<8^jduB`2+DYH0#xREa&rj$5@U_M`ht+0}@A+RGd+zDC zt!_B0ykY0DYX;%_&C2|K*#A_?{Goh7sYk4T)|uF}WgoVu)`l<`e->z(w%P0K7uBB; zX^c6c2O~oq&fPx$k5A*~fBjOgJV#Xx}d zg1v7?qJC4VPh@m^>QbIWeWS$L68c=PUDdUAw9n7})PCH*V~6#;7$*is76Ata#(I8< z`;YFfKA8S%k$g-a+qHT3S)a^_4P|6F%9HEW&fGn7yXM-;6{}*{T-fHGean>f+GaAh zX}}o;&yw4be8!utQ@{mTcE`wLtdR@AjzF!Z*Li9-*ymT z|FD0VlcMg7BR4K21^Bc(`524UGW%~8*H=t-NbyvNHBMQp7}>NS`NgE8FQ4QqSS{Oe zVWCCar2{i9Bqlj6yj*%Qc71QE(pNvZU;9r^;=6a*|NVgv^VF9f`M<}8NuYs&MS+2l z!+`+{Gi`m?cbEKqzdmt(ylo!0;cL{i`Dl;E$a$84`*u_KPx&)4*stH0 zSh45z* zPKR^7X>U_+{&VW}TTXK`SCnsFvff;-KAxkYS0;k-KhuI~0!-HL?IYfDoR6NnLcKq3 z@0HC=o_^h|78dg(=5u>g{|s8&2Q=p>(~o`Y*M}<2T@lXFFiTj#>BaBL{)hT%UTO1h T)!G^Z6BUD}tDnm{r-UW|r=kuD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..02c95889ca1c54b4c67b7c5a32e32069f9e54615 GIT binary patch literal 389 zcmV;00eb$4P)YAX9X8WNB|8RBvx=!KdMT0003H zNklNV$R{)Z!p`xaU8(tzFzY3c*RJe}#ok<-oC97rWhm zkX=r2kXjIh9z{Ah2u^Xi3k5AGG`PGsg}ev(@kL4Th#VeCuSGD^i zw-fELUE8I2xC@(r$#Rz_F~xk&(`<&;T3Kt|VY5lpXkfCOG>O9k0MaDJTI&H?YfP3? z_QEFsd;^sIaDdgQ*8x_aW}|?!^w!l5T2!}R2dGk5K2I5&j@l>yU~D@6aKHn~bu~*l jtK=&dfB*y_fZx;?**oUJ^Y5ny00000NkvXXu0mjfE90Z_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmosocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..5815d28112b86861163c228c2c079481bfde3fcd GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*M93Gdl{j zJ(O(C_z-(rjG6P`eSL=OOI(!-c)M8qKd6MVv^zLW-t|pZq zbGJ;p!u{UUPr38Xoa>A=HU4>iDbRK-U_$)c+wQC1%b)yva^b(4>(aitKdmM{ygD;4 zYvb$_`j;8il%gI~zUi73pT%AAe(lYS6CW@899v%fXIX?K2MQ!TKeab z@q-6xAO1c(UFshE{;sG~=pQfV4W$>i|Gc|2FT0`g{o1VOAH}ga07a-_e`vnR*7N=4 zl`qmf&vTrgzxVBxvg`LmZ@959*(EJtyV>A?zWSz<0!|#y=3HjV?q(M--jnk*_37GP fMGm+@832o%~EN3lj8n^>bP0l+XkKW>};y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..05bee3d3fb39364568441f3de45d8f5a7ef72ab1 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%H*DLMwj^8XLS78>^@^=_Erkw33%$zz u|F;h2mUQ3za0RoQtih`WsEy9I7#a94)*VdKSyK*l7lWs(pUXO@geCxaM_}3j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..547c76b04331aa0be086f045b9c314d702a4c858 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@k*3;F`Wt~$(69BOrN_GGM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/cmothong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d7472491e5ff52d3f6594f768bc326d87761b3 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@7Fi*Ar-gY-nz(pK!JnR z;m)FW_H*(a+XZGz^)sG0T`M4zF;mh!oEfMT9VG01Ch_yjy??j(5BN1$y1BW8u&#Ue zUD6>mgJC&iNV}cbgIkgtsH%xdeDMj} S>K|o+)Ox!5xvXF!Z*T4QKI|aE z{vlu8@t~ti@d9tbcD}2jn>6*TZXR_l5pGi8_$TS)IN@BExA@$WkH^b)T;rR&r2CMo zAbWe$<>Jf*+ipBtXQ=z5_VeC7r`7eJJWy3u`f+}uA_F6b0|S#l0|Sc!gt^7FAa?5P z)z&>eXCJ+OE9tM!J~K{y&TVb4Ep?@}tV_4n94jr(yz*aEVaGbJh}8#9>oPG&$-lR_ z8})8y z4`w@L>+XB6Y{JIyK=W#`@Iu2&G2ClSYwnk`c`U9AZ#a9YbxQN0{;!7Lbaj7fu(PH& zn7lgvs$p5q8}$d8qEFQ?G1f=!e{KmhgkeqI5!Lj7uayEy7(PPs9FQq{(P}mOh3^lH zPj<8|ytpstpZ5kPj%?AMYGaAHGu~8xnVaJB_`|W|)^>-*SJw-ziEG@schL`TZfD*F z@^WjfE^`4b+r2$)MSSDWjcr$(H?o~b+Z=HAWp+vLw$!GIa(6Iv^8v+mZA2Zhx;+a;nl$V%lv9w^{&AbD7 zS6#Fkp30rHmt7Fb%W&Xv-Qhjq{j5CGs!xe`F*F#+w|3+#FpiuMX8K@0Uqt_JrOdVW zpC~cDFI8J<@2e-YV2YBaYR!3OhKyZu-5+fGn<6!qDlGNke{oB@Nau61og?FyY3<1~ zZ%T92P20ifd;M_DHZ~`gh8wP##x849F!Z*QH?7IqY2 z|L}f?nXlP3lUXeyJeRx|PMN0kNKv#(;LTDcCr3wp*8e&S#aUaO1glp*SeQ^OAh=Rw z;dCWYsYzE%vg)?IuHe|LvSnhachxv%gAT(1 z`Qwf@QescDoXgJLt@|Nj{rdb?<{4e@cQU=H5K=#D6}9#LjoY^b9v5>PrNkdP`j8{* z>7tKZ7i8~WmJ7&~IsN8R(Rr4l)!H4c?JX;xUv;TD&%iJtHp*>nOo{M@$DU8Z!Wj-& zG`#!49LmrT%*pU!EmO&{?_1bc1ihZ>ke)f~2D8tR_uL9*w)$&Na2yL-{O(R9C&K~9 zha7%?#kJziwkpo(xi8)@cjgp^0@aIk_qVOGXJlx-n>%sVjEM{aU2$v-e>7yb3E%m@ zN|b?NUF`WC-Ql}ypWkL=*jIl$-(Js(@rSAh)*yle+;drnzy0C=pErBNx$`kIez98p zz4+sR+3xP!VT5AysZpds+mi^vCc7l tb7o0ME!Vli({szCcty&#+aCYN?eMo@{;J^H^MOf|!PC{xWt~$(69A=YENcJ& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab480727f0979f79a598af6feaceb12ba74f575 GIT binary patch literal 418 zcmV;T0bTxyP)YAX9X8WNB|8RBvx=!KdMT0003k zNklfzj1uiXtV~b;uPECab zEe;KZW~Y^Rmv+4kf}E7#a7WAgj1SN7;rBf6E2NbCX9)#R00mG01yF!l0l8vnV$kh& zcy8Q?jr_jUQ)?5m&01B24#*#!$m@$U<}?j}Z{H`Khzq;#$zbo`_>{)wxri(QBc0*v z(`Dd%(5zKOu2_;WV~P1i9mj4*mjFP|8_I%dO$F2|Ws>m)5!n&;yrBdrm==!R9s`VY zhI*w85Ivw^S^&QQK(q-2qn-u`t|nAKa`#Yb`ZAl@)VTK-0N|$0LIpi z1Xx`kz4t-?4S?3et;lZgNq|^l1%TI=&ItH;FVt7801BW03NTCk0GCne!6YVGiU0rr M07*qoM6N<$f-=mln*aa+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedsocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..361c294851baa67361ef6b79968e38d0949dd771 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*T78I^-bI z`cSfan0H_x@&4!1Y;gCUH8&vpL9}1^N;^bfpZ^H zpDpVU6a0GqBG5)GAfZpbrRc_*EpPvBIl0LGBi{=?^-a+}rFUMhd%WxZD~=zI8dIx+ zbEg|$mF~IvxGF4iUuAIp%BbM=zjZ_Rf90`oJ^#L0cm0~rcDvUo`he@v(=rJ+fVviweIn{vziU3i*C=@ h<&&Mv!35X%=Y+Jv8nX!;Uz2k{VxF#kF6*2UngCH+i?09x literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c715812cde2c006a395d3f38591615212d9042 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%-1d`9YuB}R|8MT7 zknqcoKAZ4L^wfvfx5e3lYW)hOe*AcB9;0l}uKl<{<h i;8jB)J5MG%1Hj8Z$;RU5BW_n*25)PMmhj%~{OYx8Z|(iIbH7;9KN zI!-hhOnR?<;IBl(D~6j@2TU5)_--(1aOA+yi4Zv8($M1_4C2rD#r@}D9z%mA14F|l Y2Jt3M@d->EKh;1|p00i_>zopr02zHxv;Y7A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..73e0025bdf2ca6b70e7c87d6b303775f36e1ff1b GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@wP$WWNXFCE&t;ucLK6UuxJ{D) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedthong.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/equipped-HAND.png b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cf0a6f08a31b69ba4e31d0c6e317bae3df9be9 GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@&A(Ofp)i*UYxjkC~9?g_I5ITHo6xV-;-dd4Rozm1uiWnT z^K>SW)1i~~bG#?H9d3+!ucs{hPG;ULA2W5&SKse_{Z{a}XG6!YjSM;aJ6>1+53E;f z$hQ7{i>-Tw{Ay;P29=|Ej-IDditkw|ocuLWHejXs^7-*r&nI$gT$Q@qaY&!4RipS_#SDYfFA)SvmSb0;?f!Nc3Xuk(EGf0wf42ICP4mvwe~_!LYnPF{2m z;rR3O=UkAI7aAb#35m~__;K85S$^PW_;ww|7Yw=cC3ZBrhn-vK$H5b!)MD8LRQkll gW6ivalM3K&W9W-Kb}&>^2NVJfp00i_>zopr0G*k8b^rhX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Medical/paramedwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..61c44b6c3458826cd60e1161af910727b6baf1cf GIT binary patch literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*T3-zw98x z`r&!&lqoUi>_V3;^<1SfHK6NA!=|Zodsi~ov&@y4Au+?sV5c`n@FX7a|=rmmQq;lq-!BiGKYOZ8rP z`Y9K~gTLML8}_%~S>`A6;QODl-K_Q;YUkuR4@?WyY7NoB$8mJ-iV3*#Z4ea;J7uVbl6Hww`DzfXYo}XWz+c|kj28J{Ix!a=|1Vkmi z#ZF>SQ|77Ov18AH{)3fM>aDH&cb<`HInh7&e0>w{5CetdpW4{@muF9X7GiOhZzJQG z8B#l>Lj8pw{ECq2u%Fe>9}w-D`caQ<`t%$5^>aBL*4FUf^kG|jIX~l#yw87@9eMm- zPt&WIeA-veZ#eZyY09a?rPUjBveg)(UaxR|{iEcU`hm}fGV;Y3o_$uyUv`9P!_q5r zuiHL2sP>^!dc*aAs=7HZTz<^|nLnMeUjJ1<)zto}^3n%-4l^oD-`(uDeDaTK#>1Oh zCumIddhva~`|oG9tt%Nh6xXlIO=tqh*7elF{r G5}E)IE;*k7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Security/detectsocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0d38d0999b0b29a713f5face9060ef34de00c5 GIT binary patch literal 385 zcmV-{0e=38P)YAX9X8WNB|8RBvx=!KdMT0003D zNkla?ru&FzJ!y5kI=!%m+0WsXV9%U zI0%9vG`JK>l1oGfm+N!`QUn7Hf}FFR?;JS4=_uzMe_2WZ0uX=z1R#JWfU~1fy__zV zJS1~<7!TaA+o^YM?`Nu2!02EXfTE}vPp0bX{L~o}05E%e{>K1+yeKM+3043;Z;EIP zn7=L<^tvkmpSKF=7)`LXS!W*L`|ACJWntR^yxk~AxX z%TFku*uHS<1%z6=Akf6|4tbsfkYy>Qwch|y6pF!Z*Oh%KI|ZJ z{9}2*?X9LqR|atPx&CkTX<}h7eDz?$euW8vEa?kVME-Eg$jmw7=u+@WKER4A=!J^! z?WaL26du6u&sC~`5f46^}-r?@R(4Xg1fsVie7VP2s{=KB4E;Hx)>ab}?stT&o za<0!UahP_*s-S z{(oNmSA%I)dlgSVUHvAnZ0+Z@?;A|GzLwcce*5lKf8K}CwQ0e>|ME)q%BAj$kkBu8 zxTva9#5Mf8SGS$&*u;dvTPc9{*Qg^xW?7lDX~=#GdZF{bzb$ zV2Z}zm$x(MOFN8g-3sQmEzAtNoZ1f_TeEu)&}|H!u6{1-oD!MTYsz1q_; zL$so7|9OVAR<;e&2i{z`%_L*Z9Oj?fEr6jFA<*E==$79O;%~4$a6+Gnp&H0^XWp~Z UKzu^vhGwvgr>mdKI;Vst0B*BR0RR91 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Security/detectthong.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/equipped-HAND.png b/Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..480aa29232601f86785f5bdabf8be15df3bf8769 GIT binary patch literal 715 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*SRW2q#J$ z|M;F)a!tjZ`A4Q53E0^EKtRAq#7H%zutQHWCbmWCoYV7$Vu6E4uO4*WeXUF@MT3Kp zb-G7#j^O0oGUESvB;(jSoqcER_AcW6Qu*!9`<>^1w|#$5X}VNIe5VPc00TOb2)^nR z$C#6H*{1eu*z9iy)W5%9751E^;W~T!tu?%QR`p5;G%V)t=4^QVt5JG`j%>r>XUk6r z6h58LDPUF;Bpk^2=)`=k2fOTU&$f=KT*G8;up)cawG|1Gzs@jppPSDC*W<;T6ZZEO~E`8RCeZ~gs`u|MNwgDWc<(>~kU9_QS`wDZo}dfqR# z`ky=n-2YukzF@+`+EO)9W54D4nx6tf7=A_%g@%oxx=*gUnejIK|15sKyliV~Mdwm|I3u6X^5N6N{1a0iIM0n*{OP`)hUjUn6B5>5z13wa zBf|3E?Ol9r#fIADtbh9#>IJvhvHBbi*p-(sOKfl4^!3N*7PIb{c5+pUk?a2VkABC! z==|ctur1d(&-Kwg#=gf#*bST-exCXNJaF?DWqBti1qL`0-};Y1sLOUfTSVL^U_xZ@ MboFyt=akR{0K;}7Z2$lO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Security/detectwarmer.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41635605e23f80a0f8a869cbb65613f1c180c2ee GIT binary patch literal 396 zcmV;70dxL|P)YAX9X8WNB|8RBvx=!KdMT0003O zNkl3KEk%1P$a3EY5m^Q4M3|6z41+!ot7XJc+NxLRt zVIW+yD4s)u^UkreU3g5h>7BQr;d%P=JRhEi=P@F}UxrbD0u-PC1t{R(1Gd)#0a#wF zb9{DT@(Ld8Y{`B91%UILo+%9&HxB$20Fq=>7~r}U0D9qFF62kRZ<~LImoh*{5*`C6UsNeiB@*gc&p2bil? zCCf4zjU_zKBdARmT0^_FApmh46GabLmc{E}U`kzqW7{$YgyAi3aa?EuzQ6VbcpnbU qL}%#Owg9<>%I4@NRDc2$pny;6LDRwR2enH80000=8*YAyA!Ew;5r!(i1NuGwxd8_*Yf=*Hm zJwFyQa!p^~k+rk!Y47VBcXIxGW_$Kre8a{+Tt~mUUb(-&Th=k`&jp66cTF2|xp&QL z&wYQ$tZ9tTgAIDrEW#7F>^s7zpk0^I@aK+e;;h^kRdNgo62AJ3|80FwFWC9j zvWy|}qcii5Zr=c=e~(liv&@(|)75AuPtX0=UpH*tY#Z{YfZ?k5Zk&oS7e9IlO+TH^sW?=r7I-_Kr*n4ET`6LWX~K zwgop<%cnnTE@pJtaw# zq`{)7gXck6Gvm%;#{b%f-WA>cdYoy2hGxk7cSr5T3$9qr5Y@1o+48ugpTD8_>xW+t vd_zu~zC3y%GWpQlV1u)L<@T@m{xJI+Pnh3*yZRq6bu)On`njxgN@xNALi|wZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/hossocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Security/hossocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f16c43ff7340abf3fc4222b17660a6442258e064 GIT binary patch literal 443 zcmV;s0Yv_ZP)YAX9X8WNB|8RBvx=!KdMT0003- zNklT;AHW(P!6UKNic%w3 zDqo(KdhEJ%8Z%aRAu%MH9I@FcCzH%ClbK;eg#Qd?0Ty5Z7GMDu@E3p-A}-G5R`J+- zV3~B9QmIs2qqJu8n}A=TQsWCsjbV(2(wa#jh;socv*Dd10At>vR2T!KbinyCf?x>F1%l_N70}fhND69faztM z1(;sWWC7h%!sr5fX98gu&ICA)gX?1rF!Z*T4QIvgN! z{A008P>EOPOKyu50lQKKmh5hJX8Xw4V&@`%pk3n!!=niY5ANmQyX)mBTf>;VVe%yf zIrTz=MzhR!kG}Vu{IL7y9ec@hp~jQ{$ABD+1w6g_t+smh`K_;h@4D*p@0GSfr;nbQ ztJ?Sdju#i6{1B`%FXOWDHBRSh&*0c^mCDfz-u^E8^-uA&Y!SvRj(}Ll+>xcz0Lw~3l=Qc$7suEJ3-J{WCBRg M)78&qol`;+0Ohc^xTN3=A1+EeFLmaybJX#^CAd=d#Wzp$P!}SzuED literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbf35325f54089b6c158805e5ddc9220e737c5a GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@ItG2m%^ zIK5ioo9cIa-VWJ9et+|`Cd~^xf5f^^{1jOfW0Rg%Rcr~=g9ZFpt8+T%e!2Lm#h+}p z=ia`P%n+{EBeX!rd-9Uh$R-Dku0txBvEk*?3)a1U- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Security/hosthong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ba71aea082070d3c2d882a1ba2b79289f5daff35 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*QIKZ8Z>J zxvOK!WH|6YTjvzxlqi4Q)%>o;hiA*PDljl|I502?G%&CrGaH_- z*WkMSeeT9jpKP{&wwcM(@crJl+-h})$Z2d0uXnjg-mpw(D3EcNVo+rHeKuxVtKl|I zhNQeJ?u@T?{o|gq?B&M`p`ntVXFkt4Cx5}Dm+^o_-yi?Tc;<}T*V+;j*61*FO#Lp} zu`m855ond&eOK+c8gUUNIk4fwW=OjJvyj4-y)A`xG5;@Z1j9_X+3KcH4S@8{FnKK}E+_e{6p=rNr0On{?-0Ua%HKQZY` zdE@0AuES*I_iGSvU=hN4(l}SkaJnj9T+1%>|qWO5&wCrOjp2)E~Epmr=*vCb84_%&bZ)1Pp z(HEZGvK)^p4-m3N?yWo(F-^s6 z&F@e5*dCwq*LPxZU?6}l7^iq99bCW?$tUmIZPT+#P4H(-h)yH@rtWlq+C%5RTRl`Q9Z#L6D^B9PC8ZgY5%c~@JePYG;w(K9 z9=KNOMM)IHgG!~dcbQ!RSs2cocd!1|ShMcHv8&QmZ|~avudXg-cwjf{&h`Tz-7+G7 z|M<1`Up%AUoPMLw-XB>F|9J`~X(c2v#Ii7`uj2ewD_13`#K5EgLl$d4NYAX9X8WNB|8RBvx=!KdMT0003- zNkl=-?=I z5vM|0N2wH((dL?HTr|pakcf-T#YKm^`Q78k`@cJdi13$3kpKyh011!)3HbK_UDLh_ z!YER*8s@G45l~&UsZ$?8wf_FuEF8e|?=u@(<{asI5de_h@7%abZa{pfkhwnz+jijl zKDu|eis)D?^9y8}CS11#|KJgYJ<1Q5DwSwC2(VQ&a2`M5`1M5?uroGJ>xBuN4gy>o z1|ItT{D3q|%PQk7Nf1BBLJ=5@(aiKLMpYG_*UQ|6p%X}w1eR3>V+;V$yu8Q+)K=FB z066FHydG3l{oMr8JyjA1_mt58++#zGcM5Jy7t<1^;NBx-+wQ>{dUqa zO@_#6svA!oJ8@rnL4YvdQ-(^FGfx%{{wj_sPRMxBi$v@Az@{U+U^hVx`#rZ~ZI024)Db&bV8PRTkRh2THPUEq>P3d6C;NYL>k*@r8LIi2~lmyu!B z+wf_su7Nq+OEQ1m-n;BRd(yMlz5%$r1@>&i^zg59#yliuizr4N6T=sp}7D`R8 z{a180<;|_zjQ-2F{AXggGT(>WfuWwWfTJb$@uy~HhP4VI{QNRv3$#9N@pu!TQYO1U d>*~?}tU8v>^RsKjCIcg$!PC{xWt~$(69BPV<#qr7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/bartendersocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Service/bartendersocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c11cdc69701fe682ec0fa440b352a20a4cb00d77 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%G} zVR@pjLaC?Xgc-9pRD68$|G((GJsu0T&v00f_}1ysp{lIFg*P}BDi~k4Jaf3_!%7L| z>oTegj2sROOacdl8n&7-Sv;Sytg}!ibl!7A-{2lY1{2@KVT?OEE#7_4G28w^`fT*= zPX+O-ug6Nie>LlapoPr6liQK$Wv7%cYP sukJ5?$6|1-=CF!Z*N+29dZz9 zeQ53bEkQj-C+G~{5jPRRoR}583X5)ZSbI!VV!4#cpSf;ouf&ODwch`llOOr)t6U;Nd*_|`o1*nqpPf1WM!tq^#VS=#CEv?FzdkPf?JnE2@%tZ_6?$!XbbGryFr<21`ZH8W}d&&cBP7)iAT1||-L z1_pNq72D@ITffftQ8@NOQFVdQ&MBb@05Q2gnp|vd$@?2>^ssO)~%h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderthong.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/equipped-HAND.png b/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..69b62bad73f4b117ee14efb4c1855174cf2df2a8 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*OhvmU0wf z``{nL!z0L&x`(yKa5k;^ zX;GxbwgpozO*@^+aG=CWcgfv^dw={01l zTcpYQ_}20^9?zW?UCF1^W*;=2tPkU%rcSlyegQNZ@3$w%l1~!8R#{Y5?QY9H3?tjm?9oE9M^_qyQAj5)n*&mY~ z{&QAs7CU}S;k=A&L>2OW}mR6U!PPZvtAEn(Owk#OHWqqLB3smQx`*Db6~lk%ds zTYGOe4=*^E`1uc4amfyu4R<4V?Tc~LY+aU_w)Ow-8&iS`&OLlsXxusfPNU(8>i%`F z)A|+ql07sZ&f$J{P{kqJH*?mz|EZB|jIM!in4g#AnH{L^U$v^K!REZD*H7yPLB@oO id^#&1dY=HhJbwFviwBp^yzv_thzy>telF{r5}E*ERG$z4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Service/bartenderwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6f65de5e2236ba96a573ddda137c63282d0770 GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@I{O;MUVZ3qT`YQ$ouiY3;wTpM-y*x}nJ)U*6PX)!S2Q}@{3^4|8UN&u zFZN90+i^GU_`AQwTNy%24nDZ8FS{T^jsL)pxC0w<-e>zS$cSHH!k{m%$9+-PNj(10 df42X^pAVGI-|=mBCNSn1JYD@<);T3K0RYUZ;bZ^+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..209242860e2f7260778949c5a3b0738447175364 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%+QzinrBqzI*fgHCrO(&YdqLLS?^mbGTz(u0-cz^AOb{YfFT@6ZwtZJ3-52mbQ4+Q#~!PC{xWt~$(69A8;h9>|3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Service/chefsocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..be37b2f4ebbde2b0274e3bcd422b88b8ce72fc0b GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*Q&@JY*no z?4wJgZu{ETLXr)P2B8l&@-!qd=*WfeFdH~bTe14-3f8ZS3eLvP?pOL@ze)6b^?tRL z9b$rC&tC-EhXp+7-x~I6*R_T3lP52(|H73q%Wc)FOV0C``@Qnj&&gxubC@bAI&1LYkvK8bK_{2SPw@XprW)xMq)i!CTZ z64O?$J6c?-9?7`h!Q-l>)PZv4>WFhse^mH3ZHPbfKs(Dss)Wq() fX~BXpwCWS%YA(wOKcv@g0h#LQ>gTe~DWM4fm(Pn> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9c074e43ec230e3f6d75270c937ef506e18eca7f GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq% eP6o#BI~as`S`Kdb7Wo|L3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..52bfd12a620dc440498698ab56918a5f24c8fd7b GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@(o1Ja-yY42+DejsulqfCrM$o!No`?hRkXlbyKbLh*2~7Z}u}0DW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefthong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..4a49a5fa724d34873b789c93ed2ea75fa640cb85 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@NGG7fUz6`R(r>N>deV23y z&tTZjSkk^vEa44LMRitm3x-A{0UlP1y|PR|fdgL|)c12RykTTu=wYj12xb?bAeOcG P1xTrLVo9IYI?1K87fjwgx1>C%K=}CfE~{0+j!U{3aX&^WS|{W}FgqDZ_+;VczqFH*?&~-jrA+MT#*jxcyem>BQqd6B*WKd47|hw>4iy z;!i;#UwZ!hPR5eoFV4tjGjEbn=(e*eK7Nbg{O1K`VFh1430fYx_hyU5^z9pTw72qF z#LZ%Fxbd9%z`MV}R`HD0r)2ioz1Z*0cVXSscHX=C_JR&_&yTZ7{1EyrykdsiD~8Cq z@;}XQteVEs@GZaLUG=}$HFg|=P=_P=0h!rwA;_yU_cq6)=T&?2L>{VD?VZP9FSzUV zt|-S>HyAu8-#5|b2rOpaaVzHNp_7#h8RW{hZKx}ptn08kYSP=+yPfh6yu7t3tk2>b z8_QSoO?lT(38^2GTYjkOf8Sx_`wa=)X+F%NmpOXZd}iZ#^r2C|;;XCmL_d~*CA=qi t6&x5Yo&0}!h05m-jva`AP6&D}ed@Z`f%=&1kz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..47edcee7341ea5032ac12b7e6ee6ed372ec4807f GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%4ZLn02py|R$+kbwZ( zgZ(W$EJ=zXpO{Xt8n+)0e=quB!GX_QFFse?;hFh_b%H8OBZE_!#bz2h7OA^C5DErVudo+%$H44*P1dY zoHkNlBr>6e@%(r8^$YwzT&-w1`*dNJ`2*oEx_4GHX6t5H9sE^Ou9WtdZ}wZhsMo)E zRT2*zE?d1r-``w4!SIDx+4!=bP0l+XkKFFJj8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Service/chefwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e4940ea3fc143f30219d721da59d39ff3af6df GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*QIVK5QUy z?BjCwdXYKS9K|^o4j#z%|M$P%Wqp&uK|^-AXDwOFj|6AQupoO@=Rnyr^o*vGBzrLz!U;n!G&z}8xv#2I*zVbTnfm%~1pL=>=cl~>}`l9B6e@|Ys32-IWfAam??`k38FzL?HwC{J8 zRmZ;nulVb;ItMO?0>#fhefH&2dD#8u2cDl?`}2=RUCif`N_!Y{f}RMwmj>oVT~X_0 zIv~ElSK+2bP0l+XkKJ%Pj& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Service/musiciansocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03ddadb5cd5174f37aa4b6ca23feadac45d88ba4 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%MK0!J|NMA~xP5z%Yv`@{GQW8)`?_ZjH+%P(ls3%S zB6s+>|9T0#y1IiOKHOAwtJK{4|IZ#Fo{GbK$O8l?9C=TF{_(`E`w`p$3P2x*DZM-xEB&So=uievS3j3^ HP6F!Z*SRqHwB6u z|5)tE5tHLpUSPCs{c)&0ZkHhiv?ZEQ5Zmi5$2EX0{K@=*PVY?xNO1h&LuUq{!9MfH1bP3VASH9^UvOC!r5YOEG|G1 zI`B&L>+FUVo1I@Wgy%CaIuRrNK%sQi;lO;wiU++{uSzpUPs`0+$Ta7v{+7FyQ5+}d rifsM;?-k2|X{piD&H`|w5ZEtRTzkmF2=fsG@SuO|PvY-Ed zoaKpu&fl_`inF|@C!TE60tSY^rY#5Cx7-T^x{1Nl)z4*}Q$iB}#eriP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4c06a322cda28cd134d799191d7e843c7a0668 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@RobBdkK!tkE$k&zz9nAXDSGqxo8O|EY^W^%$Vy*sh$v7T>2WT`{qSv4*vy z<3y9er1#nf{z^2wVz^m#z@%Y~?*@|wM-B{~2!R7G4L#n$ApVSB+OWiM8>TX>{npbl zL$so7|9OVAR<;e&2i{z`%_L*Z9Oj?fEr6jFA<*E==$79O;%~4$a6+Gnp&H0^XWo-_ VL43mgKW_>_GM=t}F6*2UngC|GPZ$6I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Service/musicianthong.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/equipped-HAND.png b/Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8f88f86a2f9094a635828ccc50c4d696622e3a GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@jFH2Efk~i&fklAvzj{)hQnM8Ri^Q+Rw-kDD&v!PqXb0|Git7VQR~8;N%ObbotAdI6}|Fb3EAH_@au@ z?P0*nylJ-Y?4JoQ;BXLWX9)Nq$kGsY`7&EVQJo?~WI6xzo$43f^QQ5ZGR~M2FR|c^ z+7jUdSNeT(1d-f>h1qcC(_M$0@^2gVU1JE)S+#0Wip;ma#z%ku z@YHk(WZO{~G$&6^N4EN@Dv#{>WX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Service/musicianwarmer.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0e869231f917c3b074e9a152fc3c7671ee7d6d GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%6Zswa(26qc${zuy85{EfJ@=I|JhHPBqf00-ro9C z1z*qAHL+!_w)iJ5G$kzo2skRYOjG>-wA^iztb+d1@9}<7{SPl*_ICN%CR6KtnDPBR z`&6JR1uHI)5iKlBS3YNuu&AlxbY#CV>(~L_C99ZEc(#aGGgwAXoW-_c60f`WA*i#I b4>2;#GCy#zCB%Cf(D4kOu6{1-oD!MYAX9X8WNB|8RBvx=!KdMT000Iz zNkl!2*(xz!kDPdZq11LC6XWOJIBWRrArAh_G%Zx8L{sHR1 zFvI16%M1gf{sE4>IO7Eci}r;XtKguL){Jy4T9_j35K3vAZkue{Y_`eqq3j{OK{xF# zGqUF;$=Q>9&+l`-zq2RjEJFyv<6IaMfC<0^U;;1!m;g)wCIAz_B1$OKL@X8-HLtJ6 z7w><~sP%7u@&@Vq<`%Nq93qj+j9#4$g_;NeRKL0k18qaJzN)zb{omaN0L}V~1`rB0 z5wF(^01yt;;pe@-ptRJ7(a|_wIPpB9N4o$3qA2PDAz#0An+G?(>ZjM%zFCdY^NE7= z7X=^`Y9f`DmGtwbJsZ${vIoP%Lntq=pr6$;I5@bh5EjyxWf^w6eM$Nc1)z${vJ6oa z@zO_I@z;re=Cpfy@00lP!wc|wy|CNu%LXBTT5vW1wcWtq1310!Ou-Q5(_i<_S`4?1LO4)|=+Q3vTHaiW>!07ytp7j& zp->ayI1W|K6*#@`472O_PLjAVL4(eBfGo@KY%QYg2HJ+8D9VytFrWTF+Yo#{-y8?T z@9}uuUng*cc=}pO22XqA1jkHk%FccpROb9l8N%Yzz{o)0t=c`@sXi3kHx*r_tHj!8A4oiNoPA6u?}4J2=i}0?-}6jw3Ckyrv9kNk(!ciL(b=nH@)3 zh`Y=U2XDu4-w4hgY}F0G!ul>acxOTSnjOG#)_W7+6di%tb$U8LopWY8V7gA$*8z2P zbu$`wb#*cG)#(L54}Eh_&;(!tFaekVOaLYT6MzZ81YiO%0hj<5TLhtjWV2aacYw8& zK%kyjEEYtge=xcO5QGLYHKl-ISO9=3EC>yxkPZ}5R4sKN0DzDjtX57l1kL9Hgyc|D zvxe3w>t)<+AI8d+D{<$}9q0`~5E_W8wIW;&?wXxm>+8D-hG8{1QxgC|Xdr&SAHeis zq-$@WT>Vf z2qc@$>9-KdhX4Rhr_<2j7lJT3ISByJ8hpWjh5~_l!t<_268u6CBq>$UDzqQ~`PR?n z2oi~LnifVCK@f8t;Iyu`v)r4Bs3H1nLRHFeoW0 zG2Q{eV32M^05IJC`DviOw^%I30eI~91Wf?{qw*i0cE7!L7bS%N0000YAX9X8WNB|8RBvx=!KdMT0006e zNklg{eDgC&NCs=gT*FUisvCLKG<_ z|8gj8KpU{90G5@O9Uc4Vz1YK}YmXJbe);|-x%^~>jg9YQG7Cye0G5@OhG773@>Y_U zqp#@fjIq9628~{$;O!4`_3IOGDnMfo8 zz@e)>yuOnK!0+ENU}SPwCXOb88`lGb5NMjV1>pDPKjfJnn^BquSXNr9s!HNQH`8M? z%E;uf{4)PFShO|)Ap{2p4g`Jqr>l6Lw`~f)1@!fukfv#3+crx}Zx#P__<-63{5_J% zEGYHY{nhV)e-t%M3lb1QG<5`<0))e1079WqP_I_208}cK)&l%!{Y4+Xc+Qox=K@S4 zk?#nQO7+WFEEYVm=Xt2A8YEII7RhE8TMLLrqrtou08lEGb_d{j9ssWEqU$;Us;cfT zz;#`+*+nIl>X*8%|0jTgnp|vd$@?2>^ssO)~%h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Service/universalservicejumpsuit.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..a79e26edfb8e381b2681b4ce0f4c2d1bcefe4151 GIT binary patch literal 871 zcmV-t1DO1YP)YAX9X8WNB|8RBvx=!KdMT0008= zNkl6kappMHiULUdx&Y`E%qF|1)6vW#0epW zxNt#2g3B(grj9YXl`d&x4xLjsO;PRIj>Nw27N^bU{F2yF{4vfs?s6~!AOHd&00JNY z0w4eaSTMrfL*6|(W{b9)4%7M70iM0&-H)%?qV2{34Chw{Xzm^H&ihwv(RR~eIzIuZ z0ED}TyzIB;?jOc&*c=B${&@g8`IP_~+xvXw;S)sHKW6p?)h*oo{DO<4{`~ap9 zntMkafL4BOfS|gSwu@~S0Hyi{^6tW6+{UPPW*?wb3z5Ww8350(V06{B4^RsM=1n0C z<2Jw(t^8U50FcCkwB7S70Q0o2fEEA%FmJMhC))Xy0oY1ye8TAw#vMtbKKRX*bpX@( zwE)tqejDO$a0Os8zdC@dp9vlhtOIyqbCU1!7uec^2}HN!W)_eKA9*lxF$*xif}s95 z%_sU3^}cCc04;!F+y(%QdS@urHvj--zvXNiOa{Nfr9qha6?m2VZU#XCAd<;*v#S>& zllcjN090RuZlC#V2jn)}V}Qy0N&st*o=^Sw^7{vt*JcaAMt=GxNB{&t00ck)1V8`; zKmY_l00f{Ku4)2o_F*{yM>PR9`>+&1c1e2u=?i}T`JGjeY>s7@<&6R~w)eTsFG6`a z3I~w4ZGRIK0P@-d02B%!*9zEP8WR9wc?=lWB@_-IFO}OalacQ_k-IQ}aOZ$$YXw{b zczy-lPjB1+hyf_vIhgvBtJUG`BOvM$M08J%nd(5Sy)G~lniU#40HR7HFI3kClmYx^ z1Ie{-B)K-goQvR9W5k^c`vAl9Klumq`*86h#N*Z6edYCgb^&Ar0Pv#CwB2@%VD|lA zu1iRQQvgstdF@$1Ab8Q{RIPyR+duCyDEloW!Kv2C8v}58@>v7|Ab&9h;4dlTkFKYNqR0RM002ovPDHLkV1j*qeO&+m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/icon.png b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f71869cd91c00dced5c27c566d907c7699638d61 GIT binary patch literal 398 zcmV;90df9`P)YAX9X8WNB|8RBvx=!KdMT0003Q zNkl&fm8GVaOnffVJ00l@>f3B)8&|O7{p#T5?07*qoM6N<$f-x7Qng9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8d25db43849f374344f38de73143c0b0f39845 GIT binary patch literal 664 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I10n3O$T978H@y}jj_E$k@5 z{^7qC2bWsjzNQGB877uhD-`x-tn#$aV*RSt6>1~)$}#t=wn~Zj)OY*7|Fb=lw)Xf< zvqv+`kGCFplYj4w-;e!0Dq)o=d=D6Kq5s!T{7yb+zyI7MmKVKc7Ps%`+WxG0Y`Ic& zg=pXYJtrqI0Yy0kLXQ4Frh zMW?@iyW7svkZqpVsMes_wU|GXK}W6rZyNg)p^(nFy)_$rXF1f1p4~iIe!kGkhF=Vm zFGs#U`MlY1<)t_E7cQ-AsIf?l__^Vi$dur3S7X8b=z$kM7 z2TJ(LP_2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I10m~=c{978H@y}jj_E$k@5 z{^5U=fQXOJzNQErliZ>&0ghD{LnhaSuzpqR3bhe?<(T_bTcyN%>brg4|H-8ZzgF}# zUpe9C9?N%$33b2IzUlt=^hlcO{)mC^0S*)}_hLq=<)2S#Go=^Yy!rgW2Unq|kG9XB zJga%u<1epoFEMf0yxG5DfmWOQ`bAC|WxtkauCUaw%xL=Z!?`H6VM7Ij$_h&#y=7W@ zvJSibXC;I%n#>hHkT9vSsPS_CdnKk9tPDF@3W@^c6nrKfRB`_Gw^r!#zjn?wD;Q>+ zWh_|vXXVc$LQ%&GpWkz4I?y|NyQA;{k(VcruV(I1i`X5?tjZj!#-*3an)7y|+J*Zs zf84xz{=BNz0t=TXH3r2^Pg!0}(t7-tKWZme#+GWHe7ilhvmU)UzPy4V%0F`!vzCIW zf;SUT>#W}W3sn{~F*N)-rg!+?_LaBGlaxd5-$=D^6wOTOmhZjwOZlADp5@yPZT)TC z^YX*z`HJiX3^-83fA$M+zF1n+%v_`5&~c8(YIak7j~uvx<0?o>>$Pv zxua1qu%ynHfo;`+t`|DXUeqKu)K7l=^1A=3NXEBvE17;44$rjF6*2Ung9-%BXs}( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/meta.json b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/meta.json new file mode 100644 index 00000000000..1063f482890 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7ad103517be0ca66a5ab097cc5d4ef09666306 GIT binary patch literal 995 zcmV<9104K`P)YAX9X8WNB|8RBvx=!KdMT000AS zNkldwYB2;^IPEHlKIot)Ch|qtPJe=jYn8 z`Me`Eh?x{U}dAhhYejb%5&s4FHdRDgd@^lXAI?mfyvZQIGPS zX&)!$efYkQ!C)W^0M!Q&gV1O+2mmhq)Bv3E5LX*@6pO_uKbcIhbKi$ostE^RSr$yw zjGa6H2*VIT5Qqn0Sr%rq*%JV|u5&Gb2LJ$=riqr{#YuVb=mC%i003sQS(MjxoqGYi z0NQ~U<&P~#9st8IuyfzXaMOwMwULLbjXI{&sc-*jA&!iCwCnUV zbf$fLf%qE0>eogdhMP_%eJ%iB3)@eAcR0V62H;!ieRSmMBk^JUT^@jw@}J5}D{{;4 zN&`UkecuPY7J2nk0cchRl<*a@JM z847`lvcn3|0O%lu-HdkNaZQJ~06aWA;N7ol9F!3A3aqWIK}I9=`1lxoKAd0UYz+K( zvyJujb+G_g2+0ub5lj|e>Puil_-ybw2w5CjSsw!ckwJrZFq;binO{B$K>=6=0Cpz- zF92Zu0#Z*v%U`sjqJ04`Z32+ZoWTu%b&87g1iTciH$c~Qc>w;WPyk*#fZr>qzOJ$~ R$ru0t002ovPDHLkV1ml!ppyUq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/icon.png b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce5817b5e1396b1aa5d1f3264a12113f0578207 GIT binary patch literal 468 zcmV;_0W1EAP)YAX9X8WNB|8RBvx=!KdMT0004B zNkl`Pl)E<8aq?$*KAO0@$|ADW$l2^YDH>k-4~LjG^irR00f#L$2#OW~qmTYRY_` zM_B3;q-l!HW>YV~+Q(S;OmsROnI8@ZjCK*iu2DZg(=-%CQ35E6f-K9L0RTWz6f##7 z1pt}>sH%$5E<${1$=vt|vF@43^Spk*17a*xQ|?-v#ypSk2%{Om)5T5c-u>~lIlxl? z>Hx+VD5U^^S?bjfnDz-5g(HSe45cWj)t1*^M2s;x@#4#%lr~dDe*!Q|J-qCJ)s~ZK zpYYo*nyF&(vS-aIoxoidN>put!C>(1;Ur1OPg(m@+5%cYmGub}IzrHu{DPGL0000< KMNUMnLSTaBWX0|P literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..6db641103401c0b53c512752e5c8b7728dd17102 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I107-x98IEGZ*dVA~OszU|> ztQTgtK8Wv#$jJHsKiEY)>Z^9i#F>?=J?8CRrn{$dZzR{DCn~~0c}+7D&ngQvFt8{v zFmgCBFrhN*vyVu;E!xR4ouT&r?UyC1^!`=Y%v$B-Qm{9!S-WB1dtQbR(dVBnul$J* zUAW3a(=oJg|NUm}2AfLb-#!U%xXNO`GYSaqXHaUIB9ym1TGV0Q9`6R5#wkK=i5$tl z?U}nc&YTf<*!kBrrR3x8yXP1ZHs5pztz~@jX#4HluZ&{JCdP+<|NZypTa8^U!;^ot zd*iMiJuXo{myzMmn}&6-b-w4lyMO$#q0|B!hFHd$^>Mrm3?{zG-rxQ&5?{D1b4}UT z(;M%<&s}*^zfLr6S4ADK5H4@NW||?je>a=P2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I1080UMsIEGZ*dV9;Z?~s82 z>x1b`ozV&|Dhm7l2MUP%na9L+e$U#THB+alq;y+U>S?-tO7AcH5;O709CuX)Mh*uC zCV>V976lZhPx_lO>v?|5Uu8E4F!8rLhdz4p{kQF1*|fILKV!bKaVQEf+>t&0c%w#( z0MlLBcYPAdcVxHUUi*q?f|~!Q*e8=8-Eg~XlFwi)&6beXVfd(MrwIE5wg09LT0+T3 zzE-XEdi8%xMH<_rzl@*W=BL$*Nj#2N8^+RbG>NhNJ^utQo$05qIj5|tuUGk4wfEkB zTe<#s3@h8`olnnh+{pAKouQ%5dO@btvVWeoCHwDpGo9c+aF1a>t2Z-4!>)BVul<+T zcPfqDeB|o+<5hdpZr}X+QR~jq2D>&iFTy?EP{}YwW-dS5iN%|@v2#pjKGA$xk6%EI z(?O{6S5#2RzkG(wuV>e+cu`~E@bcuxgoaC#A0K4+`C8kUxuNoH!~KiJCm+5HXSn@# yT4j!%H3P$q9J8G23WJ}kKZGp$e6ybCFGKB_konS+<`n>Al)=;0&t;ucLK6VdWY)3( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/meta.json b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/meta.json new file mode 100644 index 00000000000..1063f482890 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/OuterClothing/Misc/robooveralls.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..16f7172fcee21b5580ec3792e2040f3af288ecf1 GIT binary patch literal 1580 zcmV+{2GjY8P)YAX9X8WNB|8RBvx=!KdMT000HI zNkl9dCJ=%NK@pv zjT}D*R(&^pw)viZ`tCs^37%wJkNvUxSk=Hue|Yu%>c42TkeD%0q{HzNs<5n?w{6y(YLqE z1EMGrEd7b*hx-8l+WUJ6AW0Hfmc{7kXh(phr6nkeVyXU10n8^40F!^ei}`)Ow*f?} z3?#0mzpobv+tp`T7Q@5C;5bePkYyRm%gay{#d7^u0;UcRTdn_6fK)0)rlzJaH#diLI_=P|2=~Lf-UXs4l8NWlRE zE^hu@w*cGK4~0S)9v*H3SYBSn>guZH`j*!LJkJC9vfc&S)yHIz+E<{lekc^e(9lrZ zYinz3Isny$kUk^l%aFJlc-ad~2D|zW?gqf;^I>psaNF0Z17x#VQYaJW#0o=(CIs?289iYtt z=K97QRRH6$HUM*u7QnS@*S6G}nVE5Hm$UyAwE=7Z8^8vz0c-#pzy`1ZYyca;2Iw__ zD2n9Svu9{D8VCl10J?uTVYi_@C{Zq#;qiEI;J^XPW3dd7PNzw|UWe1^1hBbRck0wB z96EHUuLzGHKPIj?AS51zF$S*jq0<~4 z0sw$qE@!C=ECZZ4aRLm(AeYMl0OIjDFt>t-;lFVD^y$6;+`M^{jI6u`Oog|Mqh7D$ z&Ye4S0mjD05C{a2%jIz7$Pwrp6>}@dzxf;0jS=(71Dl&6_wV0FJRV1-Qo-WlB3*z+ zqk%{yf>No3SS$vY%eC2ldjL?WRM2X*P$(4iF?l>5`T*MAJFvMisdYg<{SA_{U(yBm z{3|jtb6mgr+NP*BCaM5eu3RCCq97KFZOMDRUN8*PSAcrGzGY7m01AZySeC`5OPA;Y zM5EERymlM(`ti7qx4_7V-u~t&7K`)%GMNlnSXgMwpE+{|!C(;Ka2Nn+e-jYnGYRGx zA0NlrvuEi6`2Bu;6=;mX!9kQtB}>J-iA*L#B9RDy|8|D8P*oMxYLza4s;c^;0|2Vk zsy+kLK6x`jsZ>HB5P+(x`r^##bkYORiW`snee&BO7{lr~y81bs$z+J0r>rX?7Ju9$$JB6G#Y&dc(4xk
    r zt6jBTF95XpNV)yX-gH2)1Ux+0*i(S$9}LP7^uGg)$BLrh;>C-71-N?kDq&f6R}-N9 epP&t31K?jrn328Lh971C0000YAX9X8WNB|8RBvx=!KdMT0005h zNklnraS_lC^x7$4^vRp1TfKuutL@9ujQoF9p zY&N6Q=^O>DRx1XB0Z|l{M%)R=izi8fQVP>F4-k3rEXxo=VB2e+<|!4&eTL%Ix8n13>5N1C$*Xd1VoI0xZiSO;dc|H>8wW zBo3>`KaK+OyqoLJ28_pJJsb|1PNz&J6C>}4{o%UkLJ$Oc@cjwN%Zp;i`|IxY9uPu6 zbX9aA-#zZ-$w%;f06=twvSUQzfP2X~cfiSjFbws4KBwRB)9dwUwOVX88y1TNdEE27 zYCF(ww*gqM*Eo(t9LL;@RX&3J-Ekb!G{v$k;`sORt9%5_W|JgI*zI;jywPZ2+cw+n zw%QSduixtCtLFv4^E@LALtOygf5LnB=I?dj08n?J@(zUIt>hfAAFKb0Yd{V7uK>RQ X7L23N2AHS#00000NkvXXu0mjfv#SQA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..40846d65ca537f4e7d604f9bbca1f4be5b55e0a6 GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@gMzjQ-%5FGbR%_s}{WkBi%PVcz8;+N#GK4o_^9;g^cO;X0)?CjHSsnUg zSNMY*2G2<+>h>Q`FgTE6*p+{#TPxKdXFW}v2M^gy(DPmf&dK$2Ct=)wp+WM z`zCc}lMlm!xb^n0yX`X-zdU`MUitN5>^{bA`KMld|NWEYhcRyv_ksR}|5f%gMg*Up V@a*Tg)4;^R;OXk;vd$@?2>^O50ZRY? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c44defe9e000a1d8d47fc062cdb2181a67c214 GIT binary patch literal 594 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@P9}#Ni95--;ryMcvHXzT*1p6Ss^fL^oLUJ*}`w zGLcF&o1JJNk@8CNgs#IR6`?l8vfZ)_30tF5cWIqBZ7^gzXW5d-p;M<+QKKPtpl&}q zLy48FiBxZrZ{x`nrL|$NP4r|OW-SX^eKkO9Dg(n*FV*1Z9_#9xGiPxzn9M$VCf9i9 zeU93nKO*C5E5dUc{?68FJDh09_|K>L5Yq>PlC-~U%Op=vsE#Rp222kOp00i_>zopr E01tNVjsO4v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/meta.json b/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Uniforms/musicianking.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9a50512dd8e785ae0eda0ef43fb47212f99ae6 GIT binary patch literal 1508 zcmVYAX9X8WNB|8RBvx=!KdMT000GV zNklx6oo7WXev z+Yta+mI=@EXa>MA3@k4%GlL+@@}9*y)!#P&S(b?;NdSPkxw$%#k&zJs0II4ofne3& zEu8A_3xF)kBoqoEm&?KL_csMlC=?J329eEX+X{i|+e6bdh@x1RccQ;104lC&8dOyU z&+~N`&g>U^@U!(;PctUjQUYf~u+jfS01DaC!a5nsGo;6!K!^ z34FZv0|0l}R|uf)ep7buECUVrFmyti=8ByPX2RRE3j zeLf$2K3^SxQmKSespMGS@jO71B%F_(F9ZB%wB<3eQN(kZv+Z}=|qUy?|keG zW^P@<^og^$xO$_dcW^5JJRT1OL1=iMIeLNb|zs;Z#*bUMux z0G(^(ayc_^J>J;ZVC#VH?rs1;u~>x1<3Y7rg*Dg7sW8WJu-DJL3(&tk9*;Q)RjbvO z3ut8wXcism0<_`Q`#6p>L9p%u9C!EU={TV4IskwW0#Otl>pKE);p92;*~YIXfOI;| zB@zij0X%o#qj>G7519eDaPl1aXyx06=X^dNp1=Pw$NC3yfE@s92P6^+B8nn(U9Zy@ z1Ob|+-TMys^xt2a0yq*5pksht-gd30k{BM04@L*fD6C{&~5;VqL6B}3d1nq^?CuczB%EbK{ra2%VqF950A&=xE99% zqR}YPbsg4kbA5e%NTpI8g^)}p$@cbk%{M_o5U{qk#tuLv5+Q^T3=9mIxvj0Ojzh3E zzQ4cU%x`XPg5x+x%W;kXM59p>4u?T)M;AjTB2QxW_SFNe13HOFBtoW+kK@w%_ht>W zJ7zK&M=o#-AQTEg5Cmj082~^y9LD6}C}wVdjrsZcjsO@Q9wyVrpTY+#*K6v~bsgDk zmMs8DlHm1vk;!Dx)6-+F)J_hL;;rAmV7f43Z#-~!G33sjI|zrvD3{AnRh2CO!!Xd@ z-Hl?gh(I6!j^p6F4u#05EG}3LqAX5nb022n1^KbjiAt0CZiiS(5~Sd_E6B5U{$s$_{|v@2~%n z|GPoEx5qW>0)D^Ww7)$Hg#tSO@pzn2%UL5F4#Vs9B9%%30P8mavF=H*M<5Wu!omVO z09{>O4bKUJfMT)eNW7JZ$K&Q61v(3~Mx|0=3xE(}PCBR{9f4Ul-VUKyEW-Lg%H=XR zj$;Raid&C6-S|cjtl_kdmi`@%$Kzxob{d~={ssVt3IG6}9e4znR=;bhhL!>FJdal& z9K-ud*B$q}b^++>>cY!Iqj>l4YcLF>vj8Syr}4=@KciBqv}C<@0HEX13lBVgcn)~y zuWt?&z|^tv!*PK1SkpADtgLhtz~JB@vF{k|7=R=FP0$5!kHvo|u93YICAi`M0000< KMNUMnLSTY9C#1aq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/icon.png b/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e53f884fbb0ac2531c120f30dae63c2c5791fff8 GIT binary patch literal 591 zcmV-V0YAX9X8WNB|8RBvx=!KdMT0005n zNklaSX2T~N*O670R4V{VMwRbF#uZYl@O%> zN-5K9Hc66%jg5_^fXQTn@B56${#w$AJ0a0MD-8<@vYw3xLO$Z?k`VSoD=eoC$DU zmn_SO<5(!A%-+@xFTa0S3b1{%>(&Oe+ilZowHS>?42MHu6M1y$R*^yw1m@|LJG}bw zvDoqax^w*wNGaLf+%8hEyFWNNTKN@R8vwAoxy}CZA$wap9Go1n&NpCXKp2K5NfLbD zM@mVr*Q49*qP51>qbRC2fkvYNz;rsr^E}ctWwuuN5!idr^T@Ic*L6wLwCJh)2<+h5 zbwY>&Qt1)Axc<<*`}MT|L{TKdFf1{sEnvP@{}tDO d8t`8MegkF5rqIA0#YX@D002ovPDHLkV1nyo4xa!3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..cfee12caa55a527e9dce8ddc6afe129224f2766f GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@_nrPf3yxQjI^(1i^yhWn08uKYbqDRp2#%2 zt9Ft0tS`P+F)^I8%=o)$4qJ2MbOxX+gc^$Zl$e%^Y`GT4Tx0%vI%C`6g|EtXe-dZd zH+d?94W|&Q7tlQRAyG0pWowio2h)#R+65*J8eJ|f7jn!D=lWgDFxm53)I!T)_0>rR zJR9TIGctVs`R985#Qzo!TceI9ZFG=mJMf0_|V`#tWbv`Kx^v1FHiWbIAUXCPQCmYxsTCIwD)4h n6#s_nxf7xp>UjQ6u4418J3YZJHDfg}{uw-7{an^LB{Ts56YSng literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..df6e51dd9ccee450d39d4af6f53b88f15ee73f8a GIT binary patch literal 565 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@|T2I>Uz#?;5fMJtt`-_auDoT)&Bp;Y^xw>H0mZnOGbZdfk`{Wwf)` zzA$gkunRl+XA>y#GEk!?o9?tKy%| zWLpuo`bLh~hg$iFT7_BtpIHkmWEdE}R>{tL{xqAj#7b6k`sw9`?-&jlOi9|vv9#}e zjD|>1X?)=hKFWBg%Ql2*$+ Y+vW5G-`>aDfKkri>FVdQ&MBb@089PaBLDyZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/meta.json b/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Uniforms/musiciankingblack.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From 7202368952dbb0c4bc0a4c4e5d90669804f6cda8 Mon Sep 17 00:00:00 2001 From: Dakota Haven Date: Thu, 22 Aug 2024 09:39:24 -0600 Subject: [PATCH 38/74] - Added Sex Comp Uniform to BoxingDrobe - Added Mantis, and Courier socks ect - Added the skirt tag, thongs can be worn by harpies (Someone already did, but didn't want to accidentally revert any changes) - Added Cyberjackets Signed-off-by: Dakota Haven --- .../Entities/Clothing/Hands/miscgloves.yml | 2 +- .../Clothing/OuterClothing/MiscOuterwear.yml | 33 ++++ .../Floof/Entities/Clothing/Uniforms/misc.yml | 2 +- .../Clothing/departmental_clothes.yml | 157 +++++++++++++++++- .../Floof/Loadouts/departmentalloadouts.yml | 78 ++++++++- .../Floof/Loadouts/outerClothing.yml | 21 +++ .../Prototypes/Floof/Loadouts/uniform.yml | 25 +++ .../Floof/Recipes/Lathes/sockoutfits.yml | 63 +++++++ .../Fills/Vending/Inventories/boxingdrobe.yml | 8 + .../mantisepisocks.rsi/equipped-FEET.png | Bin 0 -> 558 bytes .../Epistemics/mantisepisocks.rsi/icon.png | Bin 0 -> 351 bytes .../Epistemics/mantisepisocks.rsi/meta.json | 18 ++ .../equipped-INNERCLOTHING.png | Bin 0 -> 440 bytes .../Epistemics/mantisepithong.rsi/icon.png | Bin 0 -> 241 bytes .../mantisepithong.rsi/inhand-left.png | Bin 0 -> 314 bytes .../mantisepithong.rsi/inhand-right.png | Bin 0 -> 305 bytes .../Epistemics/mantisepithong.rsi/meta.json | 26 +++ .../mantisepiwarmer.rsi/equipped-HAND.png | Bin 0 -> 558 bytes .../Epistemics/mantisepiwarmer.rsi/icon.png | Bin 0 -> 337 bytes .../Epistemics/mantisepiwarmer.rsi/meta.json | 18 ++ .../mailcarriersocks.rsi/equipped-FEET.png | Bin 0 -> 601 bytes .../Logistics/mailcarriersocks.rsi/icon.png | Bin 0 -> 323 bytes .../Logistics/mailcarriersocks.rsi/meta.json | 18 ++ .../equipped-INNERCLOTHING.png | Bin 0 -> 402 bytes .../Logistics/mailcarrierthong.rsi/icon.png | Bin 0 -> 244 bytes .../mailcarrierthong.rsi/inhand-left.png | Bin 0 -> 274 bytes .../mailcarrierthong.rsi/inhand-right.png | Bin 0 -> 272 bytes .../Logistics/mailcarrierthong.rsi/meta.json | 26 +++ .../mailcarrierwarmer.rsi/equipped-HAND.png | Bin 0 -> 565 bytes .../Logistics/mailcarrierwarmer.rsi/icon.png | Bin 0 -> 333 bytes .../Logistics/mailcarrierwarmer.rsi/meta.json | 18 ++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 941 bytes .../cyberjacketpurple.rsi/icon.png | Bin 0 -> 430 bytes .../cyberjacketpurple.rsi/inhand-left.png | Bin 0 -> 612 bytes .../cyberjacketpurple.rsi/inhand-right.png | Bin 0 -> 619 bytes .../cyberjacketpurple.rsi/meta.json | 26 +++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 880 bytes .../WinterCoats/cyberjacketwhite.rsi/icon.png | Bin 0 -> 398 bytes .../cyberjacketwhite.rsi/inhand-left.png | Bin 0 -> 538 bytes .../cyberjacketwhite.rsi/inhand-right.png | Bin 0 -> 545 bytes .../cyberjacketwhite.rsi/meta.json | 26 +++ .../equipped-OUTERCLOTHING.png | Bin 0 -> 848 bytes .../cyberjacketyellow.rsi/icon.png | Bin 0 -> 394 bytes .../cyberjacketyellow.rsi/inhand-left.png | Bin 0 -> 550 bytes .../cyberjacketyellow.rsi/inhand-right.png | Bin 0 -> 557 bytes .../cyberjacketyellow.rsi/meta.json | 26 +++ 46 files changed, 581 insertions(+), 10 deletions(-) create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/meta.json create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi/icon.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi/inhand-left.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi/inhand-right.png create mode 100644 Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi/meta.json diff --git a/Resources/Prototypes/Floof/Entities/Clothing/Hands/miscgloves.yml b/Resources/Prototypes/Floof/Entities/Clothing/Hands/miscgloves.yml index a62a27e6ef3..c956bde6d76 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/Hands/miscgloves.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/Hands/miscgloves.yml @@ -100,7 +100,7 @@ sprite: Floof/Clothing/Under/Gloves/stripewarmerrainbow.rsi - type: Fiber fiberMaterial: fibers-synthetic - fiberColor: fibers-colorful + fiberColor: fibers-purple - type: FingerprintMask - type: entity diff --git a/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml b/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml index 5eeb83dcd9c..300fdc47b41 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/OuterClothing/MiscOuterwear.yml @@ -76,3 +76,36 @@ - type: Clothing sprite: Floof/Clothing/OuterClothing/Misc/plainoveralls.rsi +#Cybercoats +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterCyberJacketYellow + name: yellow cyberjacket + description: a brightly coloured jacket, with a short crop. + components: + - type: Sprite + sprite: Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi + - type: Clothing + sprite: Floof/Clothing/OuterClothing/WinterCoats/cyberjacketyellow.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterCyberJacketPurple + name: purple cyberjacket + description: a brightly coloured jacket, with a short crop. + components: + - type: Sprite + sprite: Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi + - type: Clothing + sprite: Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi + +- type: entity + parent: ClothingOuterWinterCoat + id: ClothingOuterCyberJacketWhite + name: white cyberjacket + description: a mono coloured jacket, with a short crop. + components: + - type: Sprite + sprite: Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi + - type: Clothing + sprite: Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi diff --git a/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml b/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml index f0501c05f18..d2f71ff596f 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/Uniforms/misc.yml @@ -176,7 +176,7 @@ - type: entity parent: ClothingUniformBase - id: ClothingUniforReotaSuit + id: ClothingUniformReotaSuit name: casual suit description: A rather casual looking suit components: diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index d7e1252e6ff..6e7ef90f032 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -177,7 +177,9 @@ sprite: Floof/Clothing/Departmental/Engineering/chiefengithong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Engineering/chiefengithong.rsi - + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Epistemics Outfits # @@ -233,6 +235,9 @@ modifiers: coefficients: Caustic: 0.95 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Chaplain - type: entity @@ -303,7 +308,7 @@ parent: ClothingHandsBase id: ClothingHandsEpiHeadWarmers name: research director's arm-warmers - description: A pair of rather nice arm-warmers, styled for Epistemic roles. + description: A pair of rather nice arm-warmers, styled for the research director. components: - type: Sprite sprite: Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi @@ -322,7 +327,7 @@ parent: ClothingShoesBase id: ClothingUnderSocksEpiHead name: research director's thigh-high socks - description: A pair of thigh-high socks, styled for Epistemic roles. + description: A pair of thigh-high socks, styled for the research director. components: - type: Sprite sprite: Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi @@ -337,7 +342,7 @@ parent: ClothingUniformBase id: ClothingUniformEpiHeadThong name: research director's thong - description: Styled for a Epistemics, but is this even considered a piece of clothing? + description: Oddly, styled for the research director, but is this even considered a piece of clothing? components: - type: Sprite sprite: Floof/Clothing/Departmental/Epistemics/directorepithong.rsi @@ -346,7 +351,72 @@ - type: Armor modifiers: coefficients: - Caustic: 0.95 + Caustic: 0.85 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt + +#Psionic Mantis - ForensicMantis +- type: entity + parent: ClothingHandsBase + id: ClothingHandsMantisEpiWarmers + name: psionic mantis' arm-warmers + description: A pair of rather nice arm-warmers, styled for a Psionic Mantis. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.95 + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-blue + - type: FingerprintMask + +- type: entity + parent: ClothingShoesMilitaryBase + id: ClothingUnderSocksMantisEpi + name: psionic mantis' thigh-high socks + description: A pair of thigh-high socks, styled for a Psionic Mantis. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.95 + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformMantisEpiThong + name: psionic mantis' thong + description: Styled for a Psionic Mantis, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Slash: 0.95 + Piercing: 0.95 + Heat: 0.95 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Logistics Outfits # @@ -428,6 +498,54 @@ sprite: Floof/Clothing/Departmental/Logistics/qmlogithong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Logistics/qmlogithong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt + +#Courier / MailCarrier +- type: entity + parent: ClothingHandsBase + id: ClothingHandsCourierWarmers + name: courier arm-warmers + description: A pair of rather nice arm-warmers, styled for Couriers. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-brown + - type: FingerprintMask + +- type: entity + parent: ClothingShoesBase + id: ClothingUnderSocksCourier + name: courier thigh-high socks + description: A pair of thigh-high socks, styled for Couriers. + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi + - type: ClothingSpeedModifier + walkModifier: 1 + sprintModifier: 1.2 + enabled: true + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformCourierThong + name: courier thong + description: Styled for a Couriers, but is this even considered a piece of clothing? + components: + - type: Sprite + sprite: Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi + - type: Clothing + sprite: Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Medical Outfits # @@ -521,6 +639,9 @@ modifiers: coefficients: Caustic: 0.95 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Paramedic - type: entity @@ -551,7 +672,7 @@ - type: ClothingSpeedModifier walkModifier: 1 sprintModifier: 1.2 - enabled: false + enabled: true - type: entity parent: ClothingUniformBase @@ -563,6 +684,9 @@ sprite: Floof/Clothing/Departmental/Medical/paramedthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Medical/paramedthong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Chief Medical Officer - type: entity @@ -601,6 +725,9 @@ sprite: Floof/Clothing/Departmental/Medical/cmothong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Medical/cmothong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Security Outfits # @@ -666,6 +793,9 @@ Slash: 0.95 Piercing: 0.95 Heat: 0.95 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Head of Security - type: entity @@ -725,6 +855,9 @@ Slash: 0.9 Piercing: 0.9 Heat: 0.9 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Detective - type: entity @@ -784,6 +917,9 @@ Slash: 0.95 Piercing: 0.95 Heat: 0.9 + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Service Outfits # @@ -918,6 +1054,9 @@ sprite: Floof/Clothing/Departmental/Service/bartenderthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Service/bartenderthong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Musician - type: entity @@ -956,6 +1095,9 @@ sprite: Floof/Clothing/Departmental/Service/musicianthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Service/musicianthong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt #Chef - type: entity @@ -994,3 +1136,6 @@ sprite: Floof/Clothing/Departmental/Service/chefthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Service/chefthong.rsi + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt diff --git a/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml b/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml index 48020c8ce01..0833a5b5963 100644 --- a/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml +++ b/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml @@ -194,6 +194,7 @@ - Scientist - ResearchAssistant - ResearchDirector + - ForensicMantis - type: loadout id: LoadoutClothingUnderSocksEpi @@ -208,6 +209,7 @@ - Scientist - ResearchAssistant - ResearchDirector + - ForensicMantis - type: loadout @@ -223,6 +225,7 @@ - Scientist - ResearchAssistant - ResearchDirector + - ForensicMantis #Chaplain @@ -312,7 +315,43 @@ jobs: - ResearchDirector -#TO BE ADDED - Psionic Mantis - ForensicMantis +#Psionic Mantis - ForensicMantis +- type: loadout + id: LoadoutClothingHandsMantisEpiWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsMantisEpiWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - ForensicMantis + +- type: loadout + id: LoadoutClothingUnderSocksMantisEpi + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUnderSocksMantisEpi + requirements: + - !type:CharacterJobRequirement + jobs: + - ForensicMantis + + +- type: loadout + id: LoadoutClothingUniformMantisEpiThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformMantisEpiThong + requirements: + - !type:CharacterJobRequirement + jobs: + - ForensicMantis #Logistics Outfits # @@ -390,7 +429,42 @@ jobs: - Quartermaster -#TO BE ADDED - Courier - MailCarrier +#Courier - MailCarrier +- type: loadout + id: LoadoutClothingHandsCourierWarmers + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingHandsCourierWarmers + requirements: + - !type:CharacterJobRequirement + jobs: + - MailCarrier + +- type: loadout + id: LoadoutClothingUnderSocksCourier + category: Jobs + cost: 2 + exclusive: true + items: + - ClothingUnderSocksCourier + requirements: + - !type:CharacterJobRequirement + jobs: + - MailCarrier + +- type: loadout + id: LoadoutClothingUniformCourierThong + category: Jobs + cost: 1 + exclusive: true + items: + - ClothingUniformCourierThong + requirements: + - !type:CharacterJobRequirement + jobs: + - MailCarrier #Medical Outfits # diff --git a/Resources/Prototypes/Floof/Loadouts/outerClothing.yml b/Resources/Prototypes/Floof/Loadouts/outerClothing.yml index 45e44baeeda..dc20a635eb8 100644 --- a/Resources/Prototypes/Floof/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Floof/Loadouts/outerClothing.yml @@ -39,3 +39,24 @@ cost: 1 items: - ClothingOuterMarsHoodie + +- type: loadout + id: LoadoutClothingOuterCyberJacketYellow + category: Outer + cost: 2 + items: + - ClothingOuterCyberJacketYellow + +- type: loadout + id: LoadoutClothingOuterCyberJacketPurple + category: Outer + cost: 2 + items: + - ClothingOuterCyberJacketPurple + +- type: loadout + id: LoadoutClothingOuterCyberJacketWhite + category: Outer + cost: 2 + items: + - ClothingOuterCyberJacketWhite diff --git a/Resources/Prototypes/Floof/Loadouts/uniform.yml b/Resources/Prototypes/Floof/Loadouts/uniform.yml index d262f011c33..467a7366b17 100644 --- a/Resources/Prototypes/Floof/Loadouts/uniform.yml +++ b/Resources/Prototypes/Floof/Loadouts/uniform.yml @@ -75,3 +75,28 @@ departments: - Security - Command + +#Floofstation - Sock ect Uniform add ins +- type: loadout + id: LoadoutClothingUniformReotaSuit + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformReotaSuit + +- type: loadout + id: LoadoutClothingUniformLoinClothBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformLoinClothBlack + +- type: loadout + id: LoadoutClothingUniformLoinClothWhite + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformLoinClothWhite diff --git a/Resources/Prototypes/Floof/Recipes/Lathes/sockoutfits.yml b/Resources/Prototypes/Floof/Recipes/Lathes/sockoutfits.yml index aa4bc5d0b07..a9a2f4341da 100644 --- a/Resources/Prototypes/Floof/Recipes/Lathes/sockoutfits.yml +++ b/Resources/Prototypes/Floof/Recipes/Lathes/sockoutfits.yml @@ -28,6 +28,27 @@ materials: Cloth: 200 +- type: latheRecipe + id: ClothingHandsBeeWarmers + result: ClothingHandsBeeWarmers + completetime: 2 + materials: + Cloth: 200 + +- type: latheRecipe + id: ClothingHandsCoderWarmers + result: ClothingHandsCoderWarmers + completetime: 2 + materials: + Cloth: 200 + +- type: latheRecipe + id: ClothingHandsCoderValidWarmers + result: ClothingHandsCoderValidWarmers + completetime: 2 + materials: + Cloth: 200 + #Socks - type: latheRecipe @@ -58,6 +79,27 @@ materials: Cloth: 200 +- type: latheRecipe + id: ClothingUnderSocksBee + result: ClothingUnderSocksBee + completetime: 2 + materials: + Cloth: 200 + +- type: latheRecipe + id: ClothingUnderSocksCoder + result: ClothingUnderSocksCoder + completetime: 2 + materials: + Cloth: 200 + +- type: latheRecipe + id: ClothingUnderSocksCoderValid + result: ClothingUnderSocksCoderValid + completetime: 2 + materials: + Cloth: 200 + #Thongs - type: latheRecipe @@ -87,3 +129,24 @@ completetime: 2 materials: Cloth: 200 + +- type: latheRecipe + id: ClothingUniformThongBee + result: ClothingUniformThongBee + completetime: 2 + materials: + Cloth: 200 + +- type: latheRecipe + id: ClothingUniformThongCoder + result: ClothingUniformThongCoder + completetime: 2 + materials: + Cloth: 200 + +- type: latheRecipe + id: ClothingUniformThongCoderValid + result: ClothingUniformThongCoderValid + completetime: 2 + materials: + Cloth: 200 diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Vending/Inventories/boxingdrobe.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Vending/Inventories/boxingdrobe.yml index 863cdb979e7..b13f9dfe176 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Vending/Inventories/boxingdrobe.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Vending/Inventories/boxingdrobe.yml @@ -7,5 +7,13 @@ ClothingHandsGlovesBoxingBlue: 2 ClothingHandsGlovesBoxingGreen: 2 ClothingHandsGlovesBoxingYellow: 2 + #Floofstation - Sex Comp + ClothingHeadSexCompCirclet: 2 + ClothingUniformSexCompRed: 2 + ClothingUnderSexCompBootsRed: 2 + ClothingHandsSexCompGlovesRed: 2 + ClothingUniformSexCompBlue: 2 + ClothingUnderSexCompBootsBlue: 2 + ClothingHandsSexCompGlovesBlue: 2 emaggedInventory: UniformJabroni: 2 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..d10533b90619adf8d7a52a6e307e555cdfa533b1 GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@9|l5OIlek-6o&o$t{#`y&UB-aLBH{)n&4u9w&NlrAYbiHk1`5Udf2 zU--pJwaw(>vyZAx&-+fc7Jquo*Z4lmOY_h3rGgC%ED8*a91aXj0+`GPd%K=??cMqP zOT+Ei+_{yh&QH^xzqLJECZ6eXdgD6-cjBXjqlF!Zr4IYGU?^ z168kiWG^2n+^)^{;LN92Dog>UJf@S+CTUG(Y*@&|@WD#r!Or{QjuTGFa~_a=7w*92 zXjGrVz_6joY8fX(8RP!)LMD%=pZzD`^N&Nr{OQGh{59uaP1bq0Pn@A;_iO>F1G7$8 zsc-dUI&xJ}=)gZeadvgLRSbdFEo>XyF4aF|VR-2NnT3OULuENHL&g*Dl}uA^@iH9v zc`2)i!L#Q`{ps)0)0eX`Cp*u;HGkB@DCu=qheqYQu1e7?X(lEAoT N@O1TaS?83{1OPSO(yRag literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6b99b4612bf92f490045737a101ce1de093e35 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%ZT7)k{7D}adF(o_CK%@l3i37`-LZh<-iNY?Z!^BJlqQOb zIi@{2bKt*W;tT<%{W@+8OacuIED8tI8TQ_ra(ek+vDHUsh<4=;WfutO0ZT6AJtORmt)kxL`6dNaTpKBEy74JuZfGea+3e^(`M*EBL-M)ii(L uWneHr@koY2F!Z*LlUFcpd% z|MoJvi{mL0GakYY|hXee-pRsFbwN=D~`f}D(!mr}R5ZCxsS z9X;5e-@U)T`TqS1^F9B6e|UHIgZV10+cL~RH(&uDciz#@`v3UylG^#EuUG8<#B%2c z`>lC*if{yw!e!IagyO72dghTUWf~d9S-V$KGoTug%t1dwFvW6U%XNt2&7Y&3R^p jTOXY}Cd2|a@Q1qnvD=mt@8Ttvy?v7Szopr064{3OaK4? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..fa69f5f912231efd575330a1f04387a36dc53ab7 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@&!*CG2}Y(we1ESDvc`^<|kOK&(A z%sPSNfD#M3VMzQ01&3|tfP8y~6CtxC_$F+$F#IF_qaEn=YM^L4TLtr``LYvw&G+2| OY4UXSb6Mw<&;$V6XIysx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4b3a6aba5b4b205a81515de4a456126c02eacc GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@h2%Q~lo FCII10TJit@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/meta.json new file mode 100644 index 00000000000..a32446e05b1 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/equipped-HAND.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..b288ec985c61e7fb92db663634e9b7fac9b29b7d GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@aLEiYi*aF zD{v|;e80D5>xJU&)23I)*LmJPuu`$*fX#GA1}1?91{MVdMh*uEvqSU#rbVo8>+Vl5 zy%IaW)c)>QVaA%%LbI1~GW?L~FTC{HQ(Ep?R?^B4CI%Z;N39m6XWEP}=6PItyv#73 z^TDNi$NqlZ`H4;Dy72G2?PnN1&CzGAxM%BNAj80rXO;U>?VHp-28PW+M~}UA&1%^5 z+@GZ&#(&M4weIWJpYvNPy}~>?@bLHR;%l|ddw-r{I9RZthV_h>X>r4zXWsQ}ve$(f zw%9lCI_{HgC*J~dFp}GmnGQKWr>TaWPHp-4xo~^-nM0m3H@7j=DSz31(L=l6hi8J> z&$F8jiOghhWqOhJtupLKeZwIJxpJwC)&G@WS8Y}eNqVCqdi{64%)Zj=C&d-6#6`rk zMXo&NcFmQ!rLe+4=E3jR&cE0Buo`%mJ0vnFGBwQn#pkh0-i|{M5u9hT|1xO2<)3fQ SDX9sJYX(nOKbLh*2~7YYli1h* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..535582b36018f111276a0cb26f171fa63758ca96 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%C*q5GiOMEz`Vb|TrUW^ST;yBpSbEih56g*R|YXQ+vaAlzlg53yRf#5F7PV>@YVtx?>tZ|d`UJ4Zu{{~xZkvdAX9 zmgP79aQSyQi*sKF`=4Jw=e`g~NPfPgk2#?)At6D*l2>4L`W6)#ki*?%4PG%Yc-9{{ U__HC*4(Lw?Pgg&ebxsLQ01K3begFUf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/equipped-FEET.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..5290b3028d7521ee67283a0c9c3596b45fc06a93 GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@7zNbZ8J4D3G-_0OJ~rXec)=Q_}-5!=hvF6E>CwcTJz|i zChO%F?0gE=`}cgt^Q^~Powk*RJqxeP{+tJ!w!o*7sF zoZ-z%u~27wCWZqApPu^o-aPvJOV5g{!5vFO!y6pan@(?DxBSO{rU;#Tyb2mEH%sHr zM6dg(-TULtXGbjth8vBy{wgw9aPE+u%o(uG&0zPRJCEY;b4}q=-pTMsNCmeS8JOM} zH2j?}H{<=)^~N8M)-uLbF={hQ_{OSiHAu=7U3T%iY|Yff`z%0DE--dHFZ27A_pf=3 zW%JKvYkR3R+|~PhSvW@W!N*j7hHXp?4CngoIUO2&8ALvZE%?n;r){^YEg_tMdX%cUD2`)T8ziakYQX75ur#?dEOS`9JB-9GkR^!Ekq9iIz~O4dAE*3YbV#re$g-OLG&XHTALy2{7{1o!LzH@fqN$~NR# z>akCF%&|!J01z;2egV`9k}qI?FiBds%U#ysRRhS`4H66tXEuF27@xY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/meta.json new file mode 100644 index 00000000000..2de704c3dc9 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..1784263de501f3cf5a6bbb1f8685567a73391fd1 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@F!Z*MK+I^-a8 z{G;_5r5U{IIE*_tOyBT^(Pi<`lq>8PGB!zw${*M?UE;(gmTtDq3TZ!oGg!^IeOL0& zzsF*A$J4+6kKd6g82CR%3TQDFuu1!i?M?afyI%a>l&bvywX6ZxtxbKwbHDF=X*4%} z1*_Bj$ye7cQ#;%qmA5ME&VKFL@%Pf|9!gGd+ozM}Z#p+TWOwQ*Xd?0z2m zq!<($c!9&dqEg*F?b|2#ey}#JJhPs0Q(j8`bca`GZ*U&^dSRlQ`NhiXX(9<1GEbUW u?rmK%QGeY(;S;A$MM*mgz|DQ&yq7_^$#O!rBPci-7(8A5T-G@yGywn~N{^-h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/icon.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ef18452a15c6dbb1440ba63236e7d55bcc74b3 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%|gfifA978#*?)DrwVu&U;SnO`irSs($P#I)_=3Q{x8>i zny%6F`^<&?9n%%9eFVdQ&MBb@0CI6&ga7~l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb9e96722a6e9dadab4eda4107952540a352b77 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@|5dsHX8hX5gLHrrNxc@xNV`#8sU}(6+ YAYSPxK4CrUVOfxrr>mdKI;Vst0I7OW0ssI2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierthong.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ba73e5d295d46e9827fd75d01951db84558960fd GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5`$3q|f;CtLC@5Xx z8c`CQpH@f9q^-!DsPjJ_k?#UKAN(xszSTxz4GJ94|pl|?@jLHP1vxXOs9T{8aG7?cz@68LQ-fO0TgL zWn8eAt#tp-^}lR51X0|K~N1c^6ct<{CAQXl3wd0)5wy2PgOEN9EDr9Mn1uWNaZ)mbqxIDKz) zyDA!7?Hutg;V-iR|A%VHmc6$^QeEVJGaA*$0<&~#{)$nCW| z79=h^e>^{JT4+>uU8ENSlRyIli$cSG_Lj!wjKB73ug+LMiRpD*VE?g9hCfkD_Avp) zx$D>({2rf4+U?DgGtIkd*BPb)4*gCJWrx*OMzj9aa(^y8$CqFfAfx~Bctg#xrPf!< z7(Tw`OQ>ODxbAtA*(Q4%r!eE&uK!$HxH|I7AM@_;JH_{)(*MC@^MqT<_6vd5GcejP Y6nGszc&d4C2hfiUp00i_>zopr0NQ1J-v9sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi/meta.json b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi/meta.json new file mode 100644 index 00000000000..bdafa708837 --- /dev/null +++ b/Resources/Textures/Floof/Clothing/Departmental/Logistics/mailcarrierwarmer.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Dakota Haven - DiscordID '56038550335922176'", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..25b347b1bda039f9ce992b5b056f468b7ada05fb GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I10m@PbA978H@y}f0hAsi^f z{vm(TH>c0bkC?SQ)0xt7=~mmMT^$@R6EyQ!9hLHAS=6WVC<(cAbvRG=YjQT*DAJOr zWM!i8D9JlByE{oUBgje0`F4!wt!I`q%43rBc5;{Z*4O2G?%@7j{eJTO)3HDP>hu`? zIe*xRfyDugK78-VC}^|1b%%kW|9opql{|xj?Ayeur+r658h{d4xi7ug6Ue}z&{g*{ z!e}N_!(_$)?vVF$CU)z~$gh~U{kB!f@#{PWwsyyhUe;a>dA#!F$DIPTwRa0x%EzT=7S`BA z*S*!+|LJqpBXgDxw)7e9AC#i`rf8>yFm9$`Qv-gy=OQ#)pL`Q{U{WPiz=_QTJnY-eE5$vOXc z()(4w&7#G2ZDP(J=%Th{w5>l3rDV9 z<~g8#f#bl6z45l|zTQnc^(CAyl}+cJ%7>!YD=iuRFfO^4n^slRxALxHkIRlb^{#cl zg86_!UoM?rsypu=w*UhpKIAahu=1Uq^auXOc}ht?g~dOs*qpu=e7d8)F2#_Sfr0JM zVTOjku_rGGMHnlKbs2{*XJ*(iFN%%fGlPYbfxw|t&xESxrZX-`<=7Z7hw;GnKjI%O zUq;phGwgAB_F)?{129s~XtmEhVpFpH#1xi%SKW8JzlfgOc5WKOlm4>8TZL|R(^wNs zH(Q*_{<_B^Q#Wmb{jFThhRth*mlj=}5#ICli|PwDhPtnhpL9unXzK{eW4yQJq2QjP z{S!19w*QjflrGJ$rFY8v+FG_1>o~5@TCK^jCv(wMhOJUYKFq+lTg_pn<~Bp}u0oaD uSD9l+IJkGPCt5JratULE$sgy(>Yv&A=Ko)qI2)MN7(8A5T-G@yGywqS;f??R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/icon.png b/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d6663e286fca00c2f153050313252a156b90e0b5 GIT binary patch literal 430 zcmV;f0a5;mP)YAX9X8WNB|8RBvx=!KdMT0003w zNkl#;`MDf1s?-@S4&-1*mkW%uSM`(ZsXuzKWICfE9 zHP4lKCZ3~E*${mN0DOhW#B%`s0~8hxWb5IHcGpt^jEG5WYy{_IMT81io7$1-;R%f7 zAg)_e0xT;tKm#;D1O6r8 Y9iHsk!AjDo;Q#;t07*qoM6N<$f(gpFYybcN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketpurple.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..03854b4a157a3dc238b36559911d03a96498101c GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I107~gxkIEGZ*dV6cXmrS4t z+lPE9Y3_rk(m5J$q`2M|$!v;^NOAN~y}>5d!s;n{f|-S>u|c3|EsNt3vjw3dXQf$! zSXNIxy|?(Bt>(0;2lLX(4@~} zdW(tMN>26b@m%5zmrt(NbWs;xvAe1H>%>mA4mB6fI>t#XEhfjlpZ4!%Sj5tyHlJbX zGEN7}V;`?RU-a(h`DGnK6I2{F|6*E^_g`aS*+>0(JUk3y;?oo?e=^Mw+rMYWr5{YM zzqd{EEv)|j{NMJ?@$t0`KIh-x|M>pc(eKsHtK%9N{=8{8`0K$W`F*({g=S4n7dn-t&W$~pTBS8Hnsb|f_J=q^wZP>Yd`>l zr-VD<+K;=Y4yJXpmo^?!bug`&yS4F2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I107{7VCIEGZ*dV9+-Tf|X> z{lkB=%pi`ipFEBqW@+p+bCvQ`S7K)mbBaU|;TKw(~( zQ}r?Byj_j;DKWMeC(c*SwR_uKdT3zZR=`F1+XCWhmmUsIQzM;(~0T9({XP_3QR@`}fb-XS`WB`(kKjb1JKbTm!?ZwGH>49cZ%napz#S zv&qrt_tQNYMfeY#V))J)%*@a*_uRUvZ~xB}UkGF@{qbHr`}aj{ZR_1>ajnlY5A-Wy z3k*;YEs$lwO$MjO3|$9b+AwqUvIGPlvFJOucgK=NpZ~KNc=k1cShpBf zsvqCV806oV%`CEf{T>U3jO$!G2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I10n0|Y@IEGZ*dV6bq_UizV z10VBK!!!gNcXZD3$;}D~RAUoNUUuec%U{Oe*|+5lwy*rln7B;uN>Aqjmz68-UP*ez zEvh)d^`5$%`Ic(m+dWUd{rbv%Zg~Iu)VAD38ixvH(l$pb z9x%KA+wZ3SJ#!xCnCq%tN|RI`{`eu0@Um*=pKQjGNa?nT>XtS(IxH3S^~XzN88+$s z{-*zV*Pmbi0!23N-`}4ovH!u8ll!lVaWpyf9#4+Bem8{rAOXWnmSMr%x9*mEftUs>-_Z zk!3@!b^M;k7AcY2LKq!huHA0hFzVupuJ72lFRc6Neu-{Tfi^{ce*UivFT^K= z_RjTmhiJ%#TaTclBP4P=1aN4_Tk&NZBx#Cwh29+Il<^-Dc`*3D;FUGC5)U4Ij6Sx@#p_x_>bKv8ZcE6y!0xJWImYtUK0#GwIG!?eguP&o7iI&-q$= zxZn2uZb41ey3Yc<7Z`Yd1T&o5DRVq9lD~s2f@ zZ>m-M@)_q8XGV(g9A;qPP<-%vpAb-=#!`lc&o&$1|5kmpl;hU6sfP_3f~qQ+oj6(& zJ1qK6u63S~I@9N}NbGgZYKi0(ucbmmC*I!vpjK=h!}_%U$_xxU)^#t-w7WW4<=`fr m^L8%3^npGAp@w?S3TFBD_YU^0Q}F?YC4;A{pUXO@geCyu1(_@W literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/inhand-left.png b/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..3921b7f11790171057c6cb6b1d3e16eb5adc325e GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{I107?*mwIEGZ*dV9;Z>#%_U z>x1XoOU|(dvjnlk>?l(#NDP?xdg%#H7G;SE7tFLD-#u5qVRM}pFW+K+NyX1srUVr{ zyC~4Wz@osw$l<`igvzYXws`J!dt0w3!~5Eu_usGXmTz0QLMy4~#qWKFtPl3;Gb~tD zVK@KmtnZV3JA6cJeU*B8lavpwBTDl z2jgJ_6Yt;qnT|~qOHG#gdq4hO&lqrdxy0i~Kkk|wkbAi~v%&UK`elaCx098E0?#pju(rA{bYK<> zFj$UAEMINBoSC6vTkdH&adjX0*6$tn{r?+&VePvSGJmo~vL7&B89ZJ6T-G@yGywp~ CvfA(f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/inhand-right.png b/Resources/Textures/Floof/Clothing/OuterClothing/WinterCoats/cyberjacketwhite.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..56db9bbbc3cdbe74e165d919c174db2f8acae757 GIT binary patch literal 545 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 Date: Thu, 22 Aug 2024 14:29:56 -0400 Subject: [PATCH 39/74] Ah, I see where I messed up! --- .../Floof/Entities/Clothing/departmental_clothes.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 6e7ef90f032..9f7af218a70 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -228,9 +228,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/epithong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/epithong.rsi - - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts - tags: - - Skirt - type: Armor modifiers: coefficients: @@ -782,10 +779,6 @@ sprite: Floof/Clothing/Departmental/Security/secthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/secthong.rsi - - type: GroupExamine - - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts - tags: - - Skirt - type: Armor modifiers: coefficients: @@ -1138,4 +1131,4 @@ sprite: Floof/Clothing/Departmental/Service/chefthong.rsi - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - - Skirt + - Skirt \ No newline at end of file From 5e1487955ea333364690bb6e420c1044efeda43d Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:46:17 -0400 Subject: [PATCH 40/74] The Autodrobe Restock Is Now More Expensive --- Resources/Prototypes/Catalog/Cargo/cargo_vending.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index f7191df9ab4..c83bc31c2b7 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -43,7 +43,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockAutoDrobeFilled - cost: 1730 + cost: 2000 #FloofStation due to "Arbitrage" category: cargoproduct-category-name-service group: market From e10ad266768dd374ab540940a5a1f5c8cbee066d Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:08:40 -0400 Subject: [PATCH 41/74] Just fixing some things perhaps forgotten :3 --- .../Prototypes/Floof/Loadouts/sockect.yml | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Resources/Prototypes/Floof/Loadouts/sockect.yml b/Resources/Prototypes/Floof/Loadouts/sockect.yml index 5d36b964465..11bcaa18b0e 100644 --- a/Resources/Prototypes/Floof/Loadouts/sockect.yml +++ b/Resources/Prototypes/Floof/Loadouts/sockect.yml @@ -12,6 +12,12 @@ category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy items: - ClothingUnderSocksPlain @@ -36,6 +42,12 @@ category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy items: - ClothingUnderSocksStripedPurple @@ -60,6 +72,12 @@ category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy items: - ClothingUnderSocksStripedRainbow @@ -84,6 +102,12 @@ category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy items: - ClothingUnderSocksCoder @@ -108,6 +132,12 @@ category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy items: - ClothingUnderSocksCoderValid @@ -132,6 +162,12 @@ category: Shoes cost: 1 exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy items: - ClothingUnderSocksBee From 9262b32254b32701c669c6c3d57df443427cd3a3 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:09:09 -0400 Subject: [PATCH 42/74] Commenting out the old loadout --- Resources/Prototypes/Loadouts/shoes.yml | 52 ++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index e67ca70b392..1fa3106fcaf 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -327,33 +327,33 @@ - ClothingShoesHighheelBoots # Socks -- type: loadout - id: LoadoutShoesUnderSocksCoder - category: Shoes - cost: 3 - exclusive: true - requirements: - - !type:CharacterSpeciesRequirement - inverted: true - species: - - Diona - - Harpy - items: - - ClothingUnderSocksCoder +#- type: loadout +# id: LoadoutShoesUnderSocksCoder +# category: Shoes +# cost: 3 +# exclusive: true +# requirements: +# - !type:CharacterSpeciesRequirement +# inverted: true +# species: +# - Diona +# - Harpy +# items: +# - ClothingUnderSocksCoder -- type: loadout - id: LoadoutShoesUnderSocksBee - category: Shoes - cost: 3 - exclusive: true - requirements: - - !type:CharacterSpeciesRequirement - inverted: true - species: - - Diona - - Harpy - items: - - ClothingUnderSocksBee +#- type: loadout +# id: LoadoutShoesUnderSocksBee +# category: Shoes +# cost: 3 +# exclusive: true +# requirements: +# - !type:CharacterSpeciesRequirement +# inverted: true +# species: +# - Diona +# - Harpy +# items: +# - ClothingUnderSocksBee - type: loadout id: LoadoutShoesClothWrap From f8e3467bbfd21dbf33f9bbda6ab3d149f85d4083 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:14:26 -0400 Subject: [PATCH 43/74] Mimic the usual sock requirements --- .../Floof/Loadouts/departmentalloadouts.yml | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml b/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml index 0833a5b5963..a857d29ad75 100644 --- a/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml +++ b/Resources/Prototypes/Floof/Loadouts/departmentalloadouts.yml @@ -21,6 +21,11 @@ items: - ClothingUnderSocksCaptain requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Captain @@ -65,6 +70,11 @@ items: - ClothingUnderSocksCommand requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Captain @@ -119,6 +129,11 @@ items: - ClothingUnderSocksEngi requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - StationEngineer @@ -161,6 +176,11 @@ items: - ClothingUnderSocksChiefEngi requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ChiefEngineer @@ -204,6 +224,11 @@ items: - ClothingUnderSocksEpi requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Scientist @@ -249,6 +274,11 @@ items: - ClothingUnderSocksChaplain requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Chaplain @@ -298,6 +328,11 @@ items: - ClothingUnderSocksEpiHead requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ResearchDirector @@ -336,6 +371,11 @@ items: - ClothingUnderSocksMantisEpi requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ForensicMantis @@ -376,6 +416,11 @@ items: - ClothingUnderSocksLogis requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - CargoTechnician @@ -413,6 +458,11 @@ items: - ClothingUnderSocksLOLogis requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Quartermaster @@ -450,6 +500,11 @@ items: - ClothingUnderSocksCourier requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - MailCarrier @@ -493,6 +548,11 @@ items: - ClothingUnderSocksMedic requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -538,6 +598,11 @@ items: - ClothingUnderSocksChemists requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Chemist @@ -575,6 +640,11 @@ items: - ClothingUnderSocksCMO requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer @@ -612,6 +682,11 @@ items: - ClothingUnderSocksParaMedic requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Paramedic @@ -655,6 +730,11 @@ items: - ClothingUnderSocksSecurity requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - SecurityOfficer @@ -700,6 +780,11 @@ items: - ClothingUnderSocksDetective requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Detective @@ -737,6 +822,11 @@ items: - ClothingUnderSocksHeadSecurity requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - HeadOfSecurity @@ -781,6 +871,11 @@ items: - ClothingUnderSocksService requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Bartender @@ -845,6 +940,11 @@ items: - ClothingUnderSocksBartender requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Bartender @@ -882,6 +982,11 @@ items: - ClothingUnderSocksChef requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Chef @@ -919,6 +1024,11 @@ items: - ClothingUnderSocksMusician requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Musician @@ -980,6 +1090,11 @@ items: - ClothingUnderSocksJanitor requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Janitor @@ -1022,6 +1137,11 @@ items: - ClothingUnderSocksStripedWhite requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Mime From 4f0946421200e9ed6c4a4962057fcd225c1a89ab Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:46:37 -0700 Subject: [PATCH 44/74] Allow Playing Multiple Announcement Sounds at Once (#740) # Description @VMSolidus said he had issues with SuperMatter announcements not playing correctly. ---

    Media

    https://github.com/user-attachments/assets/e0cbbe77-00ce-4c9e-837a-00c91fee8623

    --- # Changelog :cl: - fix: Announcements can play multiple sounds now (you can revert to the old behavior in sound setting if you want though) --- .../Announcements/Systems/AnnouncerSystem.cs | 53 +++++-- Content.Client/Options/UI/Tabs/AudioTab.xaml | 3 + .../Options/UI/Tabs/AudioTab.xaml.cs | 150 +++++++++--------- Content.Shared/CCVar/CCVars.cs | 6 + .../en-US/escape-menu/ui/options-menu.ftl | 2 + 5 files changed, 126 insertions(+), 88 deletions(-) diff --git a/Content.Client/Announcements/Systems/AnnouncerSystem.cs b/Content.Client/Announcements/Systems/AnnouncerSystem.cs index de76396f705..2ce419b7881 100644 --- a/Content.Client/Announcements/Systems/AnnouncerSystem.cs +++ b/Content.Client/Announcements/Systems/AnnouncerSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Client.Audio; using Content.Shared.Announcements.Events; using Content.Shared.Announcements.Systems; @@ -18,8 +19,8 @@ public sealed class AnnouncerSystem : SharedAnnouncerSystem [Dependency] private readonly IResourceCache _cache = default!; [Dependency] private readonly IAudioManager _audioManager = default!; - private IAudioSource? AnnouncerSource { get; set; } - private float AnnouncerVolume { get; set; } + public List AnnouncerSources { get; } = new(); + public float AnnouncerVolume { get; private set; } public override void Initialize() @@ -28,8 +29,10 @@ public override void Initialize() AnnouncerVolume = _config.GetCVar(CCVars.AnnouncerVolume) * 100f / ContentAudioSystem.AnnouncerMultiplier; - SubscribeNetworkEvent(OnAnnouncementReceived); _config.OnValueChanged(CCVars.AnnouncerVolume, OnAnnouncerVolumeChanged); + _config.OnValueChanged(CCVars.AnnouncerDisableMultipleSounds, OnAnnouncerDisableMultipleSounds); + + SubscribeNetworkEvent(OnAnnouncementReceived); } public override void Shutdown() @@ -37,6 +40,7 @@ public override void Shutdown() base.Shutdown(); _config.UnsubValueChanged(CCVars.AnnouncerVolume, OnAnnouncerVolumeChanged); + _config.UnsubValueChanged(CCVars.AnnouncerDisableMultipleSounds, OnAnnouncerDisableMultipleSounds); } @@ -44,10 +48,23 @@ private void OnAnnouncerVolumeChanged(float value) { AnnouncerVolume = value; - if (AnnouncerSource != null) - AnnouncerSource.Gain = AnnouncerVolume; + foreach (var source in AnnouncerSources) + source.Gain = AnnouncerVolume; } + private void OnAnnouncerDisableMultipleSounds(bool value) + { + if (!value) + return; + + foreach (var audioSource in AnnouncerSources.ToList()) + { + audioSource.Dispose(); + AnnouncerSources.Remove(audioSource); + } + } + + private void OnAnnouncementReceived(AnnouncementSendEvent ev) { if (!ev.Recipients.Contains(_player.LocalSession!.UserId) @@ -56,14 +73,28 @@ private void OnAnnouncementReceived(AnnouncementSendEvent ev) return; var source = _audioManager.CreateAudioSource(resource); - if (source != null) + if (source == null) + return; + + source.Gain = AnnouncerVolume * SharedAudioSystem.VolumeToGain(ev.AudioParams.Volume); + source.Global = true; + + if (_config.GetCVar(CCVars.AnnouncerDisableMultipleSounds)) + { + foreach (var audioSource in AnnouncerSources.ToList()) + { + audioSource.Dispose(); + AnnouncerSources.Remove(audioSource); + } + } + + foreach (var audioSource in AnnouncerSources.ToList().Where(audioSource => !audioSource.Playing)) { - source.Gain = AnnouncerVolume * SharedAudioSystem.VolumeToGain(ev.AudioParams.Volume); - source.Global = true; + audioSource.Dispose(); + AnnouncerSources.Remove(audioSource); } - AnnouncerSource?.Dispose(); - AnnouncerSource = source; - AnnouncerSource?.StartPlaying(); + AnnouncerSources.Add(source); + source.StartPlaying(); } } diff --git a/Content.Client/Options/UI/Tabs/AudioTab.xaml b/Content.Client/Options/UI/Tabs/AudioTab.xaml index 8dd723d446d..78b0e82629e 100644 --- a/Content.Client/Options/UI/Tabs/AudioTab.xaml +++ b/Content.Client/Options/UI/Tabs/AudioTab.xaml @@ -117,6 +117,9 @@ + diff --git a/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs b/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs index 0207ed5c471..7da80d774bd 100644 --- a/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs @@ -30,97 +30,89 @@ public AudioTab() ApplyButton.OnPressed += OnApplyButtonPressed; ResetButton.OnPressed += OnResetButtonPressed; - MasterVolumeSlider.OnValueChanged += OnMasterVolumeSliderChanged; - MidiVolumeSlider.OnValueChanged += OnMidiVolumeSliderChanged; - AmbientMusicVolumeSlider.OnValueChanged += OnAmbientMusicVolumeSliderChanged; - AmbienceVolumeSlider.OnValueChanged += OnAmbienceVolumeSliderChanged; - AmbienceSoundsSlider.OnValueChanged += OnAmbienceSoundsSliderChanged; - LobbyVolumeSlider.OnValueChanged += OnLobbyVolumeSliderChanged; - InterfaceVolumeSlider.OnValueChanged += OnInterfaceVolumeSliderChanged; - AnnouncerVolumeSlider.OnValueChanged += OnAnnouncerVolumeSliderChanged; - LobbyMusicCheckBox.OnToggled += OnLobbyMusicCheckToggled; - RestartSoundsCheckBox.OnToggled += OnRestartSoundsCheckToggled; - EventMusicCheckBox.OnToggled += OnEventMusicCheckToggled; - AdminSoundsCheckBox.OnToggled += OnAdminSoundsCheckToggled; + + AttachUpdateChangesHandler( + MasterVolumeSlider, + MidiVolumeSlider, + AmbientMusicVolumeSlider, + AmbienceVolumeSlider, + AmbienceSoundsSlider, + LobbyVolumeSlider, + InterfaceVolumeSlider, + AnnouncerVolumeSlider, + + LobbyMusicCheckBox, + RestartSoundsCheckBox, + EventMusicCheckBox, + AnnouncerDisableMultipleSoundsCheckBox, + AdminSoundsCheckBox + ); AmbienceSoundsSlider.MinValue = _cfg.GetCVar(CCVars.MinMaxAmbientSourcesConfigured); AmbienceSoundsSlider.MaxValue = _cfg.GetCVar(CCVars.MaxMaxAmbientSourcesConfigured); Reset(); + return; + + void AttachUpdateChangesHandler(params Control[] controls) + { + foreach (var control in controls) + { + switch (control) + { + case Slider slider: + slider.OnValueChanged += _ => UpdateChanges(); + break; + case CheckBox checkBox: + checkBox.OnToggled += _ => UpdateChanges(); + break; + } + } + } } protected override void Dispose(bool disposing) { ApplyButton.OnPressed -= OnApplyButtonPressed; ResetButton.OnPressed -= OnResetButtonPressed; - MasterVolumeSlider.OnValueChanged -= OnMasterVolumeSliderChanged; - MidiVolumeSlider.OnValueChanged -= OnMidiVolumeSliderChanged; - AmbientMusicVolumeSlider.OnValueChanged -= OnAmbientMusicVolumeSliderChanged; - AmbienceVolumeSlider.OnValueChanged -= OnAmbienceVolumeSliderChanged; - LobbyVolumeSlider.OnValueChanged -= OnLobbyVolumeSliderChanged; - InterfaceVolumeSlider.OnValueChanged -= OnInterfaceVolumeSliderChanged; - AnnouncerVolumeSlider.OnValueChanged -= OnAnnouncerVolumeSliderChanged; - base.Dispose(disposing); - } - - private void OnLobbyVolumeSliderChanged(Range obj) - { - UpdateChanges(); - } - - private void OnInterfaceVolumeSliderChanged(Range obj) - { - UpdateChanges(); - } - - private void OnAmbientMusicVolumeSliderChanged(Range obj) - { - UpdateChanges(); - } - - private void OnAmbienceVolumeSliderChanged(Range obj) - { - UpdateChanges(); - } - - private void OnAmbienceSoundsSliderChanged(Range obj) - { - UpdateChanges(); - } - private void OnMasterVolumeSliderChanged(Range range) - { - _audio.SetMasterGain(MasterVolumeSlider.Value / 100f * ContentAudioSystem.MasterVolumeMultiplier); - UpdateChanges(); - } - - private void OnMidiVolumeSliderChanged(Range range) - { - UpdateChanges(); - } - - private void OnAnnouncerVolumeSliderChanged(Range range) - { - UpdateChanges(); - } + DetachUpdateChangesHandler( + MasterVolumeSlider, + MidiVolumeSlider, + AmbientMusicVolumeSlider, + AmbienceVolumeSlider, + AmbienceSoundsSlider, + LobbyVolumeSlider, + InterfaceVolumeSlider, + AnnouncerVolumeSlider, + + LobbyMusicCheckBox, + RestartSoundsCheckBox, + EventMusicCheckBox, + AnnouncerDisableMultipleSoundsCheckBox, + AdminSoundsCheckBox + ); - private void OnLobbyMusicCheckToggled(BaseButton.ButtonEventArgs args) - { - UpdateChanges(); - } - private void OnRestartSoundsCheckToggled(BaseButton.ButtonEventArgs args) - { - UpdateChanges(); - } - private void OnEventMusicCheckToggled(BaseButton.ButtonEventArgs args) - { - UpdateChanges(); + base.Dispose(disposing); + return; + + void DetachUpdateChangesHandler(params Control[] controls) + { + foreach (var control in controls) + { + switch (control) + { + case Slider slider: + slider.OnValueChanged -= _ => UpdateChanges(); + break; + case CheckBox checkBox: + checkBox.OnToggled -= _ => UpdateChanges(); + break; + } + } + } } - private void OnAdminSoundsCheckToggled(BaseButton.ButtonEventArgs args) - { - UpdateChanges(); - } private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args) { @@ -139,6 +131,7 @@ private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args) _cfg.SetCVar(CCVars.LobbyMusicEnabled, LobbyMusicCheckBox.Pressed); _cfg.SetCVar(CCVars.RestartSoundsEnabled, RestartSoundsCheckBox.Pressed); _cfg.SetCVar(CCVars.EventMusicEnabled, EventMusicCheckBox.Pressed); + _cfg.SetCVar(CCVars.AnnouncerDisableMultipleSounds, AnnouncerDisableMultipleSoundsCheckBox.Pressed); _cfg.SetCVar(CCVars.AdminSoundsEnabled, AdminSoundsCheckBox.Pressed); _cfg.SaveToFile(); UpdateChanges(); @@ -164,6 +157,7 @@ private void Reset() LobbyMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.LobbyMusicEnabled); RestartSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.RestartSoundsEnabled); EventMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.EventMusicEnabled); + AnnouncerDisableMultipleSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.AnnouncerDisableMultipleSounds); AdminSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.AdminSoundsEnabled); UpdateChanges(); } @@ -190,10 +184,12 @@ private void UpdateChanges() var isLobbySame = LobbyMusicCheckBox.Pressed == _cfg.GetCVar(CCVars.LobbyMusicEnabled); var isRestartSoundsSame = RestartSoundsCheckBox.Pressed == _cfg.GetCVar(CCVars.RestartSoundsEnabled); var isEventSame = EventMusicCheckBox.Pressed == _cfg.GetCVar(CCVars.EventMusicEnabled); + var isAnnouncerDisableMultipleSoundsSame = AnnouncerDisableMultipleSoundsCheckBox.Pressed == _cfg.GetCVar(CCVars.AnnouncerDisableMultipleSounds); var isAdminSoundsSame = AdminSoundsCheckBox.Pressed == _cfg.GetCVar(CCVars.AdminSoundsEnabled); var isEverythingSame = isMasterVolumeSame && isMidiVolumeSame && isAmbientVolumeSame && isAmbientMusicVolumeSame && isAmbientSoundsSame && isLobbySame && isRestartSoundsSame && isEventSame - && isAdminSoundsSame && isLobbyVolumeSame && isInterfaceVolumeSame && isAnnouncerVolumeSame; + && isAnnouncerDisableMultipleSoundsSame && isAdminSoundsSame && isLobbyVolumeSame + && isInterfaceVolumeSame && isAnnouncerVolumeSame; ApplyButton.Disabled = isEverythingSame; ResetButton.Disabled = isEverythingSame; MasterVolumeLabel.Text = diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 891f62d753a..099f358105f 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -466,6 +466,12 @@ public static readonly CVarDef public static readonly CVarDef AnnouncerVolume = CVarDef.Create("announcer.volume", 0.5f, CVar.ARCHIVE | CVar.CLIENTONLY); + /// + /// Disables multiple announcement sounds from playing at once + /// + public static readonly CVarDef AnnouncerDisableMultipleSounds = + CVarDef.Create("announcer.disable_multiple_sounds", false, CVar.ARCHIVE | CVar.CLIENTONLY); + /* * Queue diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 7b25b616b24..2eab749c35a 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -34,6 +34,8 @@ ui-options-announcer-volume = Announcer volume: ui-options-lobby-music = Lobby & Round-end Music ui-options-restart-sounds = Round Restart Sounds ui-options-event-music = Event Music +ui-options-announcer-disable-multiple-sounds = Disable Overlapping Announcer Sounds +ui-options-announcer-disable-multiple-sounds-tooltip = Some announcements will not sound right, this setting isn't recommended ui-options-admin-sounds = Play Admin Sounds ui-options-volume-label = Volume ui-options-volume-percent = { TOSTRING($volume, "P0") } From 2eda261373e00a5c6ecdcabdca73facd61dbe026 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 22 Aug 2024 21:47:00 +0000 Subject: [PATCH 45/74] Automatic Changelog Update (#740) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6c957378fe0..1037c249949 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5538,3 +5538,11 @@ Entries: to the user's Chat window. id: 6284 time: '2024-08-22T17:12:26.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Fix + message: >- + Announcements can play multiple sounds now (you can revert to the old + behavior in sound setting if you want though) + id: 6285 + time: '2024-08-22T21:46:38.0000000+00:00' From ea304c0668e0a4ba4a02e9893d7562ddfb4e7d7a Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:37:01 -0400 Subject: [PATCH 46/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../DeltaV/Catalog/VendingMachines/Inventories/pride.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml b/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml index 7110cb7695b..87a9b3aabb0 100644 --- a/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml +++ b/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml @@ -27,10 +27,10 @@ ClothingUniformColorRainbow: 2 ClothingUnderSocksCoder: 1 ClothingUnderSocksBee: 1 - ClothingHandsBeeWarmers: 1 - ClothingHandsCoderWarmers: 1 - ClothingUniformThongCoder: 1 - ClothingUniformThongBee: 1 + ClothingHandsBeeWarmers: 1 # Floofstation + ClothingHandsCoderWarmers: 1 # Floofstation + ClothingUniformThongCoder: 1 # Floofstation + ClothingUniformThongBee: 1 # Floofstation emaggedInventory: # 3 for more friends! ClothingUnderSocksCoderValid: 3 # Floofstation From 636aa6ed5125a7414c4f6963bd87cae05b65dee7 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:37:24 -0400 Subject: [PATCH 47/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../DeltaV/Catalog/VendingMachines/Inventories/pride.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml b/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml index 87a9b3aabb0..abfaa5dd570 100644 --- a/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml +++ b/Resources/Prototypes/DeltaV/Catalog/VendingMachines/Inventories/pride.yml @@ -34,5 +34,5 @@ emaggedInventory: # 3 for more friends! ClothingUnderSocksCoderValid: 3 # Floofstation - ClothingHandsCoderValidWarmers: 3 - ClothingUniformThongCoderValid: 3 + ClothingHandsCoderValidWarmers: 3 # Floofstation + ClothingUniformThongCoderValid: 3 # Floofstation From 3293298b94941d47e1c8bbd87aa2026b7356dac4 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:37:51 -0400 Subject: [PATCH 48/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Catalog/VendingMachines/Inventories/robodrobe.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml index 34bbddd379f..9ae1deb5446 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml @@ -12,4 +12,4 @@ ClothingOuterWinterRobo: 2 ClothingShoesBootsWinterRobo: 2 #Delta V: Add departmental winter boots ClothingOuterRoboOveralls: 2 #Floofstation - Add overalls - ClothingOuterPlainOveralls: 2 + ClothingOuterPlainOveralls: 2 # Floofstation From 7800b32d6bab29c57a206b03a737e816934b955a Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:38:20 -0400 Subject: [PATCH 49/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 9f7af218a70..bd5f4ab6ff1 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -57,10 +57,6 @@ sprite: Floof/Clothing/Departmental/Command/commandwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Command/commandwarmer.rsi - - type: Armor - modifiers: - coefficients: - Slash: 0.95 - type: Fiber fiberMaterial: fibers-durathread fiberColor: fibers-blue From aa88e304674add994bcd08de422430641cf4026f Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:38:48 -0400 Subject: [PATCH 50/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index bd5f4ab6ff1..52b2985e377 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -12,9 +12,6 @@ sprite: Floof/Clothing/Departmental/Command/captwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Command/captwarmer.rsi - - type: GloveHeatResistance - heatResistance: 1400 - - type: Insulated - type: Fiber fiberMaterial: fibers-durathread fiberColor: fibers-regal-blue From 556e3f37ca43f9c716bb46396a81846ee37cd8a2 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:39:19 -0400 Subject: [PATCH 51/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 52b2985e377..8f584dd3de1 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -97,9 +97,6 @@ sprite: Floof/Clothing/Departmental/Engineering/engiwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Engineering/engiwarmer.rsi - - type: Insulated - - type: GloveHeatResistance - heatResistance: 1400 - type: Fiber fiberMaterial: fibers-insulative fiberColor: fibers-yellow From 0a41131dcbb0aafdecfcd0eb74f33f310405b898 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:39:37 -0400 Subject: [PATCH 52/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 8f584dd3de1..46d24704999 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -854,16 +854,6 @@ - type: Clothing sprite: Floof/Clothing/Departmental/Security/detectwarmer.rsi - type: FingerprintMask - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.9 - - type: GuideHelp - guides: - - Forensics - type: entity parent: ClothingShoesMilitaryBase From 5a014e1d4df8387b05cd40ab6e32c63db61176bb Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:40:00 -0400 Subject: [PATCH 53/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Prototypes/Floof/Entities/Clothing/departmental_clothes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 46d24704999..720bbd1c9ef 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -847,7 +847,7 @@ parent: ClothingHandsBase id: ClothingHandsDetectiveWarmers name: detective's arm-warmers - description: A pair of rather nice arm-warmers, styled for a Detective. Does not leave Fibers or Fingerprints. + description: A pair of rather nice arm-warmers, styled for a Detective. components: - type: Sprite sprite: Floof/Clothing/Departmental/Security/detectwarmer.rsi From 986df865bdef0ca413c90e33cc1477480f113134 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:07:58 -0400 Subject: [PATCH 54/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 720bbd1c9ef..4dc13843d5b 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -865,13 +865,6 @@ sprite: Floof/Clothing/Departmental/Security/detectsocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/detectsocks.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.9 - type: entity parent: ClothingUniformBase From 737acbc6ddb67e0a1cd8923a96b3078a9ce1a0a0 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:08:21 -0400 Subject: [PATCH 55/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 4dc13843d5b..95543c361b6 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -138,9 +138,6 @@ sprite: Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Engineering/chiefengiwarmer.rsi - - type: Insulated - - type: GloveHeatResistance - heatResistance: 1400 - type: Fiber fiberMaterial: fibers-insulative fiberColor: fibers-white From 2da09198c08ade114a1244958f1efb776bb25bdd Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:08:39 -0400 Subject: [PATCH 56/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 95543c361b6..9958baaea86 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -200,10 +200,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/episocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/episocks.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.85 - type: entity parent: ClothingUniformBase From a7a1d819324550bfd3f4c1d06e2c64d2d390d005 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:09:19 -0400 Subject: [PATCH 57/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 9958baaea86..ac42ce04a29 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -211,10 +211,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/epithong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/epithong.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.95 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt From c2b1330cac9aef12645dd8c236a58942701fd639 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:10:01 -0400 Subject: [PATCH 58/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index ac42ce04a29..f1a3a8f28eb 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -290,10 +290,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/directorepiwarmer.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.85 - type: Fiber fiberMaterial: fibers-synthetic fiberColor: fibers-purple From 83b2d466b0e2a0128083908abe6cb3a87beaf40e Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:10:17 -0400 Subject: [PATCH 59/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index f1a3a8f28eb..f313d1b9299 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -305,10 +305,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/directorepisocks.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.85 - type: entity parent: ClothingUniformBase From bb53a4655a3941747191e77470ed6a8b0cf51878 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:10:45 -0400 Subject: [PATCH 60/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index f313d1b9299..c7d7b59ac28 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -316,10 +316,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/directorepithong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/directorepithong.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.85 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt From aefecb4b55dfe2e7e10adaa90757e6962da57c68 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:11:09 -0400 Subject: [PATCH 61/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index c7d7b59ac28..9c958d7d4de 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -790,13 +790,6 @@ sprite: Floof/Clothing/Departmental/Security/hossocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/hossocks.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.9 - Slash: 0.9 - Piercing: 0.9 - Heat: 0.9 - type: entity parent: ClothingUniformBase From 1776d2035af9cced20884ee88c718515e454345a Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:13:36 -0400 Subject: [PATCH 62/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 9c958d7d4de..86849965f96 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -846,13 +846,6 @@ sprite: Floof/Clothing/Departmental/Security/detectthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/detectthong.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.9 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt From 9184f909e4d26a2ad8997e9834654a3dbd6d859e Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:14:02 -0400 Subject: [PATCH 63/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 86849965f96..4f0b2a9c9ad 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -331,13 +331,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/mantisepiwarmer.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: Fiber fiberMaterial: fibers-synthetic fiberColor: fibers-blue From 43786d22c3fe9f95a574dd112e43318d205e144f Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:15:52 -0400 Subject: [PATCH 64/74] o7 Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Floof/Entities/Clothing/departmental_clothes.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 4f0b2a9c9ad..954049928af 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -346,13 +346,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/mantisepisocks.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: entity parent: ClothingUniformBase From e9dba8ba8cf3d063eac33473d91c8c6d35500daa Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:17:28 -0400 Subject: [PATCH 65/74] Alright, the o7 meme has gone on long enough Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .../Clothing/departmental_clothes.yml | 62 ------------------- 1 file changed, 62 deletions(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 954049928af..053fe70887e 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -357,13 +357,6 @@ sprite: Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Epistemics/mantisepithong.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt @@ -478,10 +471,6 @@ sprite: Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Logistics/mailcarriersocks.rsi - - type: ClothingSpeedModifier - walkModifier: 1 - sprintModifier: 1.2 - enabled: true - type: entity parent: ClothingUniformBase @@ -551,10 +540,6 @@ sprite: Floof/Clothing/Departmental/Medical/chemistwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Medical/chemistwarmer.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.95 - type: Fiber fiberMaterial: fibers-latex fiberColor: fibers-white @@ -570,10 +555,6 @@ sprite: Floof/Clothing/Departmental/Medical/chemistsocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Medical/chemistsocks.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.95 - type: entity parent: ClothingUniformBase @@ -585,10 +566,6 @@ sprite: Floof/Clothing/Departmental/Medical/chemistthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Medical/chemistthong.rsi - - type: Armor - modifiers: - coefficients: - Caustic: 0.95 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt @@ -619,10 +596,6 @@ sprite: Floof/Clothing/Departmental/Medical/paramedsocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Medical/paramedsocks.rsi - - type: ClothingSpeedModifier - walkModifier: 1 - sprintModifier: 1.2 - enabled: true - type: entity parent: ClothingUniformBase @@ -696,13 +669,6 @@ fiberMaterial: fibers-durathread fiberColor: fibers-black - type: FingerprintMask - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: entity parent: ClothingShoesMilitaryBase @@ -714,13 +680,6 @@ sprite: Floof/Clothing/Departmental/Security/secsocks.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/secsocks.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: entity parent: ClothingUniformBase @@ -732,13 +691,6 @@ sprite: Floof/Clothing/Departmental/Security/secthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/secthong.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt @@ -758,13 +710,6 @@ fiberMaterial: fibers-durathread fiberColor: fibers-black - type: FingerprintMask - - type: Armor - modifiers: - coefficients: - Blunt: 0.9 - Slash: 0.9 - Piercing: 0.9 - Heat: 0.9 - type: entity parent: ClothingShoesMilitaryBase @@ -787,13 +732,6 @@ sprite: Floof/Clothing/Departmental/Security/hosthong.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/hosthong.rsi - - type: Armor - modifiers: - coefficients: - Blunt: 0.9 - Slash: 0.9 - Piercing: 0.9 - Heat: 0.9 - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - Skirt From b1676399ccf5946ba85a3fed9198594df95fd804 Mon Sep 17 00:00:00 2001 From: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:23:40 -0400 Subject: [PATCH 66/74] I'm assuming this works --- .../Floof/Entities/Clothing/departmental_clothes.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml index 053fe70887e..b04200d45ce 100644 --- a/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml +++ b/Resources/Prototypes/Floof/Entities/Clothing/departmental_clothes.yml @@ -747,6 +747,9 @@ sprite: Floof/Clothing/Departmental/Security/detectwarmer.rsi - type: Clothing sprite: Floof/Clothing/Departmental/Security/detectwarmer.rsi + - type: Fiber + fiberMaterial: fibers-synthetic + fiberColor: fibers-brown - type: FingerprintMask - type: entity @@ -991,4 +994,4 @@ sprite: Floof/Clothing/Departmental/Service/chefthong.rsi - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts tags: - - Skirt \ No newline at end of file + - Skirt From ee7522e6e6d26140126a5e8b1192dfb561445dcd Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 22 Aug 2024 23:15:59 -0400 Subject: [PATCH 67/74] Add Insulation to Robots (#773) # Description Soulless Robots didn't have PsionicInsulation, which meant they were eligible targets for powers such as Mindswap. This is a pretty simple fix. # Changelog :cl: - fix: Robots and other mechanical creatures are now correctly immune to non-physical psionic powers. --- .../Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml | 1 + Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml | 1 + Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml | 1 + Resources/Prototypes/Entities/Mobs/Player/ipc.yml | 4 +--- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 9ff9837a3b9..6340cb888b6 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -223,6 +223,7 @@ understands: - GalacticCommon - RobotTalk + - type: PsionicInsulation - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml b/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml index 1f153ff3141..ce2ca9e731e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml @@ -43,3 +43,4 @@ damage: types: Blunt: 20 + - type: PsionicInsulation diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index bc9a18b0210..d01fc8b8de2 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -113,6 +113,7 @@ understands: - GalacticCommon - RobotTalk + - type: PsionicInsulation - type: entity parent: MobSiliconBase diff --git a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml index f38fefbad07..49a3483b436 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml @@ -97,11 +97,9 @@ - type: DeadStartupButton sound: path: /Audio/Effects/Silicon/startup.ogg -# Erro de linter -# - type: Wires -# layoutId: IPC - type: EmitBuzzWhileDamaged - type: CanHostGuardian + - type: PsionicInsulation - type: entity From 62b31190e3ba692a787448dbdc76aaa5a00edf32 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 22 Aug 2024 23:16:16 -0400 Subject: [PATCH 68/74] Implement Mind Contests (#757) # Description Now that the initial Psionic Refactor is out of the way, this is my first new standalone Psionics PR, filling in the MindContest function that was added over a month ago(but was set to always return 1f as a placeholder). Mind Contests are unique among the Contests System in that they do not treat the lack of a Psionic Component as a failure condition, and instead as a variable. No changelog because MindContests are not currently used anywhere, all I'm doing is adding the actual function logic. --- Content.Shared/Contests/ContestsSystem.cs | 69 ++++++++++++++++------- 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/Content.Shared/Contests/ContestsSystem.cs b/Content.Shared/Contests/ContestsSystem.cs index 008e5e9ca97..b4c7bc875e0 100644 --- a/Content.Shared/Contests/ContestsSystem.cs +++ b/Content.Shared/Contests/ContestsSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Abilities.Psionics; using Content.Shared.CCVar; using Content.Shared.Damage; using Content.Shared.Damage.Components; @@ -19,11 +20,16 @@ public sealed partial class ContestsSystem : EntitySystem ///
private const float AverageMass = 71f; + /// + /// The presumed average sum of a Psionic's Baseline Amplification and Baseline Dampening. + /// Since Baseline casting stats are a random value between 0.4 and 1.2, this is defaulted to 0.8 + 0.8. + /// + private const float AveragePsionicPotential = 1.6f; + #region Mass Contests /// /// Outputs the ratio of mass between a performer and the average human mass /// - /// Uid of Performer public float MassContest(EntityUid performerUid, bool bypassClamp = false, float rangeFactor = 1f, float otherMass = AverageMass) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) @@ -57,7 +63,6 @@ public float MassContest(EntityUid? performerUid, bool bypassClamp = false, floa /// Outputs the ratio of mass between a performer and the average human mass /// If a function already has the performer's physics component, this is faster /// - /// public float MassContest(PhysicsComponent performerPhysics, bool bypassClamp = false, float rangeFactor = 1f, float otherMass = AverageMass) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) @@ -76,8 +81,6 @@ public float MassContest(PhysicsComponent performerPhysics, bool bypassClamp = f /// Outputs the ratio of mass between a performer and a target, accepts either EntityUids or PhysicsComponents in any combination /// If you have physics components already in your function, use instead /// - /// - /// public float MassContest(EntityUid performerUid, EntityUid targetUid, bool bypassClamp = false, float rangeFactor = 1f) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) @@ -225,29 +228,62 @@ public float HealthContest(EntityUid performer, EntityUid target, bool bypassCla #region Mind Contests /// - /// These cannot be implemented until AFTER the psychic refactor, but can still be factored into other systems before that point. - /// Same rule here as other Contest functions, simply multiply or divide by the function. + /// Returns the ratio of casting stats between a performer and the presumed average latent psionic. + /// Uniquely among Contests, not being Psionic is not a failure condition, and is instead a variable. + /// If you do not have a PsionicComponent, your combined casting stats are assumed to be 0.1f /// - /// - /// - /// - /// - public float MindContest(EntityUid performer, bool bypassClamp = false, float rangeFactor = 1f) + /// + /// This can produce some truly astounding modifiers, so be ready to meet god if you bypass the clamp. + /// + public float MindContest(EntityUid performer, bool bypassClamp = false, float rangeFactor = 1f, float otherPsion = AveragePsionicPotential) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) || !_cfg.GetCVar(CCVars.DoMindContests)) return 1f; - return 1f; + var performerPotential = TryComp(performer, out var performerPsionic) + ? performerPsionic.CurrentAmplification + performerPsionic.CurrentDampening + : 0.1f; + + if (performerPotential == otherPsion) + return 1f; + + return _cfg.GetCVar(CCVars.AllowClampOverride) && bypassClamp + ? performerPotential / otherPsion + : Math.Clamp(performerPotential / otherPsion, + 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor, + 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor); } + /// + /// Returns the ratio of casting stats between a performer and a target. + /// Like with single-Uid MindContests, if an entity does not possess a PsionicComponent, its casting stats are assumed to be 0.1f. + /// + /// + /// This can produce some truly astounding modifiers, so be ready to meet god if you bypass the clamp. + /// public float MindContest(EntityUid performer, EntityUid target, bool bypassClamp = false, float rangeFactor = 1f) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) || !_cfg.GetCVar(CCVars.DoMindContests)) return 1f; - return 1f; + var performerPotential = TryComp(performer, out var performerPsionic) + ? performerPsionic.CurrentAmplification + performerPsionic.CurrentDampening + : 0.1f; + + var targetPotential = TryComp(target, out var targetPsionic) + ? targetPsionic.CurrentAmplification + targetPsionic.CurrentDampening + : 0.1f; + + if (performerPotential == targetPotential) + return 1f; + + return _cfg.GetCVar(CCVars.AllowClampOverride) && bypassClamp + ? performerPotential / targetPotential + : Math.Clamp(performerPotential / targetPotential, + 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor, + 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage) * rangeFactor); } #endregion @@ -257,9 +293,6 @@ public float MindContest(EntityUid performer, EntityUid target, bool bypassClamp /// /// Outputs the ratio of an Entity's mood level and its Neutral Mood threshold. /// - /// - /// - /// public float MoodContest(EntityUid performer, bool bypassClamp = false, float rangeFactor = 1f) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) @@ -277,10 +310,6 @@ public float MoodContest(EntityUid performer, bool bypassClamp = false, float ra /// /// Outputs the ratio of mood level between two Entities. /// - /// - /// - /// - /// public float MoodContest(EntityUid performer, EntityUid target, bool bypassClamp = false, float rangeFactor = 1f) { if (!_cfg.GetCVar(CCVars.DoContestsSystem) From 39ce9d763ead506b70d522271ca37aceb733f772 Mon Sep 17 00:00:00 2001 From: v0idRift <163446847+v0idRift@users.noreply.github.com> Date: Fri, 23 Aug 2024 06:58:34 +0300 Subject: [PATCH 69/74] Added Language and Healing Components to IPC Entities (#786) # Description This pull request introduces two new components to the IPC entities: 1. **LanguageKnowledge**: This component allows IPCs to speak and understand Galactic Common and RobotTalk. Previously, IPCs were limited to Universal language, which caused communication issues with the crew. With this addition, IPCs can now effectively communicate using the Galactic Common and RobotTalk languages. 2. **WeldingHealable**: This component enables IPCs to heal themselves using a welding tool. Given the nature of IPCs as robotic entities, this feature is essential for self-maintenance and ensures they can stay operational even after sustaining damage. These changes aim to improve the functionality and immersion of IPCs within the game, allowing them to better integrate and interact with other entities while also providing them with the ability to self-repair. --- # TODO - [x] Add `LanguageKnowledge` component to IPC entities to support Galactic Common and RobotTalk. - [x] Add `WeldingHealable` component to IPC entities for self-repair with welding tools. # Changelog :cl: - add: Added the ability for IPCs to speak and understand Galactic Common and RobotTalk languages. - add: Enabled IPCs to heal themselves using welding tools via the WeldingHealable component. Signed-off-by: v0idRift <163446847+v0idRift@users.noreply.github.com> Signed-off-by: VMSolidus Co-authored-by: VMSolidus --- Resources/Prototypes/Entities/Mobs/Player/ipc.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml index 49a3483b436..70f84956bc2 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/ipc.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/ipc.yml @@ -99,9 +99,16 @@ path: /Audio/Effects/Silicon/startup.ogg - type: EmitBuzzWhileDamaged - type: CanHostGuardian + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk + - type: WeldingHealable - type: PsionicInsulation - - type: entity save: false name: Urist McPositronic From ef416f32e1601a762641acb569133960460f7984 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 23 Aug 2024 03:59:05 +0000 Subject: [PATCH 70/74] Automatic Changelog Update (#786) --- Resources/Changelog/Changelog.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1037c249949..36318706025 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5546,3 +5546,15 @@ Entries: behavior in sound setting if you want though) id: 6285 time: '2024-08-22T21:46:38.0000000+00:00' +- author: v0idRift + changes: + - type: Add + message: >- + Added the ability for IPCs to speak and understand Galactic Common and + RobotTalk languages. + - type: Add + message: >- + Enabled IPCs to heal themselves using welding tools via the + WeldingHealable component. + id: 6286 + time: '2024-08-23T03:58:35.0000000+00:00' From 5fb6b27a8dbad2ca598f328c18116e7617a0e643 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan Date: Fri, 23 Aug 2024 20:52:52 +0200 Subject: [PATCH 71/74] fixes --- Content.Shared/Clothing/EntitySystems/ClothingSystem.cs | 7 ++++++- .../Prototypes/Entities/Structures/Specific/oracle.yml | 1 - .../Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml | 1 - 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index bef4e46e963..10fd864bd46 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -69,6 +69,11 @@ private void QuickEquip( { foreach (var slotDef in userEnt.Comp1.Slots) { + // Do not attempt to quick-equip clothing in pocket slots. + // We should probably add a special flag to SlotDefinition to skip quick equip if more similar slots get added. + if (slotDef.SlotFlags.HasFlag(SlotFlags.POCKET)) + continue; + if (!_invSystem.CanEquip(userEnt, toEquipEnt, slotDef.Name, out _, slotDef, userEnt, toEquipEnt)) continue; @@ -275,4 +280,4 @@ public void SetLayerState(ClothingComponent clothing, string slot, string mapKey } #endregion -} +} \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Specific/oracle.yml b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml index 50a8488bd8b..51a25bffcdc 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/oracle.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml @@ -15,7 +15,6 @@ state: oracle-0 - type: Speech speechSounds: Tenor - - type: PotentialPsionic - type: Psionic - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 16589cb322e..148476b230e 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -21,7 +21,6 @@ special: - !type:AddComponentSpecial components: - - type: PotentialPsionic - type: Psionic - !type:AddComponentSpecial components: From 612de155fd2d75218a45a8d771df4ddc480ea726 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan Date: Fri, 23 Aug 2024 20:59:46 +0200 Subject: [PATCH 72/74] Revert "fixes" This reverts commit 5fb6b27a8dbad2ca598f328c18116e7617a0e643. --- Content.Shared/Clothing/EntitySystems/ClothingSystem.cs | 7 +------ .../Prototypes/Entities/Structures/Specific/oracle.yml | 1 + .../Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml | 1 + 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 10fd864bd46..bef4e46e963 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -69,11 +69,6 @@ private void QuickEquip( { foreach (var slotDef in userEnt.Comp1.Slots) { - // Do not attempt to quick-equip clothing in pocket slots. - // We should probably add a special flag to SlotDefinition to skip quick equip if more similar slots get added. - if (slotDef.SlotFlags.HasFlag(SlotFlags.POCKET)) - continue; - if (!_invSystem.CanEquip(userEnt, toEquipEnt, slotDef.Name, out _, slotDef, userEnt, toEquipEnt)) continue; @@ -280,4 +275,4 @@ public void SetLayerState(ClothingComponent clothing, string slot, string mapKey } #endregion -} \ No newline at end of file +} diff --git a/Resources/Prototypes/Entities/Structures/Specific/oracle.yml b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml index 51a25bffcdc..50a8488bd8b 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/oracle.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml @@ -15,6 +15,7 @@ state: oracle-0 - type: Speech speechSounds: Tenor + - type: PotentialPsionic - type: Psionic - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 148476b230e..16589cb322e 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -21,6 +21,7 @@ special: - !type:AddComponentSpecial components: + - type: PotentialPsionic - type: Psionic - !type:AddComponentSpecial components: From e11cd3f0f19648f8f1fa800b7837744500dcfa50 Mon Sep 17 00:00:00 2001 From: FoxxoTrystan Date: Fri, 23 Aug 2024 21:06:22 +0200 Subject: [PATCH 73/74] Reapply "fixes" This reverts commit 612de155fd2d75218a45a8d771df4ddc480ea726. --- Content.Shared/Clothing/EntitySystems/ClothingSystem.cs | 7 ++++++- .../Prototypes/Entities/Structures/Specific/oracle.yml | 1 - .../Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml | 1 - 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index bef4e46e963..10fd864bd46 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -69,6 +69,11 @@ private void QuickEquip( { foreach (var slotDef in userEnt.Comp1.Slots) { + // Do not attempt to quick-equip clothing in pocket slots. + // We should probably add a special flag to SlotDefinition to skip quick equip if more similar slots get added. + if (slotDef.SlotFlags.HasFlag(SlotFlags.POCKET)) + continue; + if (!_invSystem.CanEquip(userEnt, toEquipEnt, slotDef.Name, out _, slotDef, userEnt, toEquipEnt)) continue; @@ -275,4 +280,4 @@ public void SetLayerState(ClothingComponent clothing, string slot, string mapKey } #endregion -} +} \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Specific/oracle.yml b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml index 50a8488bd8b..51a25bffcdc 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/oracle.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml @@ -15,7 +15,6 @@ state: oracle-0 - type: Speech speechSounds: Tenor - - type: PotentialPsionic - type: Psionic - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 16589cb322e..148476b230e 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -21,7 +21,6 @@ special: - !type:AddComponentSpecial components: - - type: PotentialPsionic - type: Psionic - !type:AddComponentSpecial components: From 2fbea608d4396466d0f26d7885aa373c7a39fa70 Mon Sep 17 00:00:00 2001 From: FloofStation Changelogs <175611579+Floof-Station-Bot@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:50:40 +0000 Subject: [PATCH 74/74] Automatic Changelog Update (#136) --- Resources/Changelog/Floof.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Resources/Changelog/Floof.yml b/Resources/Changelog/Floof.yml index 516da701d45..194f241a2aa 100644 --- a/Resources/Changelog/Floof.yml +++ b/Resources/Changelog/Floof.yml @@ -634,3 +634,15 @@ Entries: message: 'the following Reagent slime entities ' id: 87 time: '2024-08-23T03:25:13.0000000+00:00' +- author: DakoDemon + changes: + - type: Add + message: Added a few more outfits + - type: Fix + message: Fixed the skirt issue for harpies + - type: Fix + message: Fixed Sec armor values + - type: Tweak + message: The Autodrobe Restock is now 2000 (from 1730) + id: 88 + time: '2024-08-23T19:50:13.0000000+00:00'