From e2205e418b2b59a6b723f968633fada2c4feb4e6 Mon Sep 17 00:00:00 2001 From: mirrorcult Date: Mon, 22 Nov 2021 23:51:51 -0700 Subject: [PATCH] Epinephrine + epipen (#5444) * add sprite and basic entity, no reagent or testing * actually implement epinephrine and add it to the box * allow creating it * add it to nanomed * fig --- .../SolutionContainerVisualizer.cs | 4 +- .../Components/HyposprayComponent.cs | 6 +- .../ReagentThreshold.cs | 3 - .../{RemoveReagent.cs => AdjustReagent.cs} | 16 +++- .../Components/SharedHyposprayComponent.cs | 5 +- .../StatusEffect/StatusEffectsSystem.cs | 26 +++++- .../Catalog/Fills/Boxes/general.yml | 6 +- .../VendingMachines/Inventories/medical.yml | 2 + .../VendingMachines/Inventories/wallmed.yml | 2 + .../Objects/Specific/Medical/hypospray.yml | 45 ++++++++++ .../Objects/Specific/chemistry-bottles.yml | 14 ++++ Resources/Prototypes/Reagents/chemicals.yml | 17 ++++ Resources/Prototypes/Reagents/medicine.yml | 64 ++++++++++++++- Resources/Prototypes/Reagents/toxins.yml | 4 +- .../Recipes/Reactions/chemicals.yml | 34 +++++--- .../Prototypes/Recipes/Reactions/medicine.yml | 18 ++++ .../Specific/Medical/medipen.rsi/atropen.png | Bin 0 -> 239 bytes .../Medical/medipen.rsi/atropen_empty.png | Bin 0 -> 292 bytes .../Specific/Medical/medipen.rsi/firstaid.png | Bin 0 -> 306 bytes .../Medical/medipen.rsi/firstaid_empty.png | Bin 0 -> 338 bytes .../Medical/medipen.rsi/hypovolemic.png | Bin 0 -> 298 bytes .../Medical/medipen.rsi/hypovolemic_empty.png | Bin 0 -> 338 bytes .../medipen.rsi/medipen-inhand-left.png | Bin 0 -> 341 bytes .../medipen.rsi/medipen-inhand-right.png | Bin 0 -> 326 bytes .../Specific/Medical/medipen.rsi/medipen.png | Bin 0 -> 283 bytes .../Medical/medipen.rsi/medipen_empty.png | Bin 0 -> 338 bytes .../Specific/Medical/medipen.rsi/meta.json | 77 ++++++++++++++++++ .../Specific/Medical/medipen.rsi/morphen.png | Bin 0 -> 249 bytes .../Medical/medipen.rsi/morphen_empty.png | Bin 0 -> 302 bytes .../Specific/Medical/medipen.rsi/oxapen.png | Bin 0 -> 255 bytes .../Medical/medipen.rsi/oxapen_empty.png | Bin 0 -> 306 bytes .../Specific/Medical/medipen.rsi/penacid.png | Bin 0 -> 248 bytes .../Medical/medipen.rsi/penacid_empty.png | Bin 0 -> 303 bytes .../Specific/Medical/medipen.rsi/salacid.png | Bin 0 -> 250 bytes .../Medical/medipen.rsi/salacid_empty.png | Bin 0 -> 304 bytes .../Specific/Medical/medipen.rsi/salpen.png | Bin 0 -> 244 bytes .../Medical/medipen.rsi/salpen_empty.png | Bin 0 -> 297 bytes .../Specific/Medical/medipen.rsi/stimpen.png | Bin 0 -> 265 bytes .../Medical/medipen.rsi/stimpen_empty.png | Bin 0 -> 329 bytes 39 files changed, 311 insertions(+), 32 deletions(-) rename Content.Server/Chemistry/ReagentEffects/{RemoveReagent.cs => AdjustReagent.cs} (71%) create mode 100644 Resources/Prototypes/Reagents/chemicals.yml create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen_empty.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen.png create mode 100644 Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen_empty.png diff --git a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualizer.cs b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualizer.cs index a5352a811b..117abef592 100644 --- a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualizer.cs +++ b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualizer.cs @@ -21,8 +21,6 @@ namespace Content.Client.Chemistry.Visualizers { base.OnChangeData(component); - if (_maxFillLevels <= 0 || _fillBaseName == null) return; - if (!component.TryGetData(SolutionContainerVisuals.VisualState, out SolutionContainerVisualState state)) return; @@ -34,6 +32,8 @@ namespace Content.Client.Chemistry.Visualizers if (closestFillSprite > 0) { + if (_fillBaseName == null) return; + sprite.LayerSetVisible(fillLayer, true); var stateName = _fillBaseName + closestFillSprite; diff --git a/Content.Server/Chemistry/Components/HyposprayComponent.cs b/Content.Server/Chemistry/Components/HyposprayComponent.cs index 4877367cca..59923a01aa 100644 --- a/Content.Server/Chemistry/Components/HyposprayComponent.cs +++ b/Content.Server/Chemistry/Components/HyposprayComponent.cs @@ -22,15 +22,15 @@ namespace Content.Server.Chemistry.Components [RegisterComponent] public sealed class HyposprayComponent : SharedHyposprayComponent { - [DataField("ClumsyFailChance")] + [DataField("clumsyFailChance")] [ViewVariables(VVAccess.ReadWrite)] public float ClumsyFailChance { get; set; } = 0.5f; - [DataField("TransferAmount")] + [DataField("transferAmount")] [ViewVariables(VVAccess.ReadWrite)] public FixedPoint2 TransferAmount { get; set; } = FixedPoint2.New(5); - [DataField("InjectSound")] + [DataField("injectSound")] private SoundSpecifier _injectSound = new SoundPathSpecifier("/Audio/Items/hypospray.ogg"); protected override void Initialize() diff --git a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs index 744b6b1821..dd22fbd231 100644 --- a/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs +++ b/Content.Server/Chemistry/ReagentEffectConditions/ReagentThreshold.cs @@ -26,9 +26,6 @@ namespace Content.Server.Chemistry.ReagentEffectConditions public override bool Condition(ReagentEffectArgs args) { - if (args.Reagent == null) - return false; - if (Reagent == null) Reagent = args.Reagent.ID; diff --git a/Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs b/Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs similarity index 71% rename from Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs rename to Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs index 7757753cba..fcb0a44c80 100644 --- a/Content.Server/Chemistry/ReagentEffects/RemoveReagent.cs +++ b/Content.Server/Chemistry/ReagentEffects/AdjustReagent.cs @@ -11,7 +11,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy namespace Content.Server.Chemistry.ReagentEffects { [UsedImplicitly] - public class RemoveReagent : ReagentEffect + public class AdjustReagent : ReagentEffect { /// /// The reagent ID to remove. Only one of this and should be active. @@ -34,9 +34,12 @@ namespace Content.Server.Chemistry.ReagentEffects if (args.Source != null) { var solutionSys = args.EntityManager.EntitySysManager.GetEntitySystem(); - if (Reagent != null && args.Source.ContainsReagent(Reagent)) + if (Reagent != null) { - solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, Reagent, Amount); + if (Amount < 0 && args.Source.ContainsReagent(Reagent)) + solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, Reagent, -Amount); + if (Amount > 0) + solutionSys.TryAddReagent(args.SolutionEntity, args.Source, Reagent, Amount, out _); } else if (Group != null) { @@ -45,7 +48,12 @@ namespace Content.Server.Chemistry.ReagentEffects { var proto = prototypeMan.Index(quant.ReagentId); if (proto.Metabolisms != null && proto.Metabolisms.ContainsKey(Group)) - solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount); + { + if (Amount < 0) + solutionSys.TryRemoveReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount); + if (Amount > 0) + solutionSys.TryAddReagent(args.SolutionEntity, args.Source, quant.ReagentId, Amount, out _); + } } } } diff --git a/Content.Shared/Chemistry/Components/SharedHyposprayComponent.cs b/Content.Shared/Chemistry/Components/SharedHyposprayComponent.cs index 9ab0e15b88..223295c784 100644 --- a/Content.Shared/Chemistry/Components/SharedHyposprayComponent.cs +++ b/Content.Shared/Chemistry/Components/SharedHyposprayComponent.cs @@ -4,6 +4,7 @@ using Content.Shared.FixedPoint; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.Serialization; +using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Shared.Chemistry.Components { @@ -11,7 +12,9 @@ namespace Content.Shared.Chemistry.Components public abstract class SharedHyposprayComponent : Component { public sealed override string Name => "Hypospray"; - public const string SolutionName = "hypospray"; + + [DataField("solutionName")] + public string SolutionName = "hypospray"; [Serializable, NetSerializable] protected sealed class HyposprayComponentState : ComponentState diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index efae94071d..bd94660599 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -332,11 +332,14 @@ namespace Content.Shared.StatusEffect /// The amount of time to add. /// The status effect component, should you already have it. public bool TryAddTime(EntityUid uid, string key, TimeSpan time, - StatusEffectsComponent? status = null) + StatusEffectsComponent? status=null, + SharedAlertsComponent? alert=null) { if (!Resolve(uid, ref status, false)) return false; + Resolve(uid, ref alert, false); + if (!HasStatusEffect(uid, key, status)) return false; @@ -344,6 +347,14 @@ namespace Content.Shared.StatusEffect timer.Item2 += time; status.ActiveEffects[key].Cooldown = timer; + if (_prototypeManager.TryIndex(key, out var proto) + && alert != null + && proto.Alert != null) + { + alert.ShowAlert(proto.Alert.Value, cooldown: GetAlertCooldown(uid, proto.Alert.Value, status)); + + } + return true; } @@ -355,11 +366,14 @@ namespace Content.Shared.StatusEffect /// The amount of time to add. /// The status effect component, should you already have it. public bool TryRemoveTime(EntityUid uid, string key, TimeSpan time, - StatusEffectsComponent? status = null) + StatusEffectsComponent? status=null, + SharedAlertsComponent? alert=null) { if (!Resolve(uid, ref status, false)) return false; + Resolve(uid, ref alert, false); + if (!HasStatusEffect(uid, key, status)) return false; @@ -372,6 +386,14 @@ namespace Content.Shared.StatusEffect timer.Item2 -= time; status.ActiveEffects[key].Cooldown = timer; + if (_prototypeManager.TryIndex(key, out var proto) + && alert != null + && proto.Alert != null) + { + alert.ShowAlert(proto.Alert.Value, cooldown: GetAlertCooldown(uid, proto.Alert.Value, status)); + + } + return true; } diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml index de5c220476..ebc1f61cc7 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml @@ -94,7 +94,7 @@ contents: - id: ClothingMaskBreath - id: EmergencyOxygenTankFilled - #- name: Injector + - id: EpinephrineMedipen - type: Sprite layers: - state: box @@ -102,8 +102,8 @@ - type: Item size: 15 - type: Storage - capacity: 15 - size: 15 + capacity: 20 + size: 25 - type: entity name: box of hugs diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml index 26a92fdb96..2ebd778749 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml @@ -6,3 +6,5 @@ startingInventory: Brutepack: 5 Ointment: 5 + EpinephrineChemistryBottle: 3 + Syringe: 5 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml index 633d3ef98b..57e62766d9 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml @@ -5,3 +5,5 @@ startingInventory: Brutepack: 5 Ointment: 5 + EpinephrineChemistryBottle: 3 + Syringe: 5 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml index 743eda8c8b..6c2830b198 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml @@ -18,3 +18,48 @@ - type: ExaminableSolution solution: hypospray - type: Hypospray + +- type: entity + name: chemical medipen + parent: BaseItem + description: A sterile injector for rapid administration of drugs to patients. This one can't be refilled. + id: ChemicalMedipen + components: + - type: Sprite + sprite: Objects/Specific/Medical/medipen.rsi + netsync: false + layers: + - state: medipen + map: ["enum.SolutionContainerLayers.Fill"] + - type: Item + sprite: Objects/Specific/Medical/medipen.rsi + size: 5 + - type: SolutionContainerManager + solutions: + pen: + maxVol: 15 + - type: ExaminableSolution + solution: pen + - type: Hypospray + solutionName: pen + transferAmount: 15 + - type: Appearance + visuals: + - type: SolutionContainerVisualizer + maxFillLevels: 1 + changeColor: false + emptySpriteName: medipen_empty + +- type: entity + name: epinephrine medipen + parent: ChemicalMedipen + id: EpinephrineMedipen + description: A rapid and safe way to stabilize patients in critical condition for personnel without advanced medical knowledge. Beware, as it's easy to overdose on epinephrine. + components: + - type: SolutionContainerManager + solutions: + pen: + maxVol: 15 + reagents: + - ReagentId: Epinephrine + Quantity: 15 diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml index d051f4a71b..9b4e9e5f3c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml @@ -109,3 +109,17 @@ - type: SolutionContainerVisualizer maxFillLevels: 6 fillBaseName: bottle-4- + +- type: entity + id: EpinephrineChemistryBottle + name: epinephrine bottle + parent: BaseChemistryEmptyBottle + components: + - type: SolutionContainerManager + solutions: + drink: # This solution name and target volume is hard-coded in ChemMasterComponent + maxVol: 30 + reagents: + - ReagentId: Epinephrine + Quantity: 30 + diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml new file mode 100644 index 0000000000..e9b007ad19 --- /dev/null +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -0,0 +1,17 @@ +- type: reagent + id: Acetone + name: acetone + desc: A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life. + physicalDesc: acidic + color: "#AF14B7" + boilingPoint: 55.5 + meltingPoint: -50.0 + +- type: reagent + id: Phenol + name: phenol + desc: An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own. + physicalDesc: acidic + color: "#E7EA91" + boilingPoint: 55.5 + meltingPoint: -50.0 diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 4593e9a60c..1474bf90f3 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -43,9 +43,9 @@ metabolisms: Medicine: effects: - - !type:RemoveReagent + - !type:AdjustReagent reagent: Histamine - amount: 3.0 + amount: -3.0 - !type:GenericStatusEffect key: Jitter time: 1.0 @@ -180,6 +180,66 @@ color: "#2d5708" # TODO: GenericStatusEffect remove drunkenness +# this ones a doozy +- type: reagent + id: Epinephrine + name: epinephrine + desc: Effective at bringing people back from a critical state. Reduces some stun times. Easy to overdose on. + physicalDesc: odorless + color: "#d2fffa" + metabolisms: + Medicine: + effects: + - !type:HealthChange + conditions: + - !type:TotalDamage + # they gotta be in crit first + min: 100 + - !type:ReagentThreshold + min: 0 + max: 20 + damage: + types: + Asphyxiation: -3 + Poison: -0.5 + groups: + Brute: -0.5 + Burn: -0.5 + - !type:HealthChange + conditions: + - !type:ReagentThreshold + min: 20 + damage: + types: + Asphyxiation: 1 + Poison: 1 + - !type:AdjustReagent + reagent: Lexorin + amount: -2 + - !type:AdjustReagent + conditions: + - !type:ReagentThreshold + reagent: Lexorin + min: 1 + reagent: Epinephrine + amount: -1 + - !type:AdjustReagent + probability: 0.1 + conditions: + - !type:ReagentThreshold + reagent: Lexorin + min: 1 + reagent: Histamine + amount: 4 + - !type:GenericStatusEffect + key: Stun + time: 0.25 + type: Remove + - !type:GenericStatusEffect + key: KnockedDown + time: 0.25 + type: Remove + - type: reagent id: Hyperzine name: hyperzine diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 9812112a30..765b30d5b1 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -112,9 +112,9 @@ damage: types: Poison: 3 - - !type:RemoveReagent + - !type:AdjustReagent reagent: Inaprovaline - amount: 2 + amount: -2.0 reactiveEffects: Flammable: methods: [ Touch ] diff --git a/Resources/Prototypes/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/Recipes/Reactions/chemicals.yml index 80d2e90230..e6ded1e74c 100644 --- a/Resources/Prototypes/Recipes/Reactions/chemicals.yml +++ b/Resources/Prototypes/Recipes/Reactions/chemicals.yml @@ -18,6 +18,30 @@ products: Diethylamine: 2 +- type: reaction + id: Phenol + reactants: + Water: + amount: 1 + Chlorine: + amount: 1 + Oil: + amount: 1 + products: + Phenol: 3 + +- type: reaction + id: Acetone + reactants: + Oil: + amount: 1 + WeldingFuel: + amount: 1 + Oxygen: + amount: 1 + products: + Acetone: 2 + - type: reaction id: FoamingAgent reactants: @@ -206,16 +230,6 @@ products: UnstableMutagen: 3 -- type: reaction - id: Water - reactants: - Hydrogen: - amount: 1 - Oxygen: - amount: 1 - products: - Water: 2 - - type: reaction id: Oil reactants: diff --git a/Resources/Prototypes/Recipes/Reactions/medicine.yml b/Resources/Prototypes/Recipes/Reactions/medicine.yml index 7ba4721105..449e05faaa 100644 --- a/Resources/Prototypes/Recipes/Reactions/medicine.yml +++ b/Resources/Prototypes/Recipes/Reactions/medicine.yml @@ -66,6 +66,24 @@ products: Cryoxadone: 3 +- type: reaction + id: Epinephrine + reactants: + Phenol: + amount: 1 + Acetone: + amount: 1 + Diethylamine: + amount: 1 + Oxygen: + amount: 1 + Chlorine: + amount: 1 + Hydrogen: + amount: 1 + products: + Epinephrine: 6 + - type: reaction id: Clonexadone reactants: diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d7fd60cd911d4702f4247dd88cf76958067af5 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7etm z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyHSmDUZvvmdKI;Vst0N!d+)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..de9a4aec656742af8ceef5b6b589ef1ddc943f06 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D0t1& z#WAE}PI96|g2AhXK=vN1ge#1T`6T}ESrn$6t{2Ene0(UlbH+oCCO(G9 zU-BFdZ?2wR{%`u!sqCExpEmL-ub7|0UQu2B-~HL|9}YS`9Uqenwtq_#5EOI_ynn|| zwlzL_=E(%P*{2JNKBllaF|20ZmUp-7QC0xQ9GhKJAAWq?&SSrCZ~BjKZ>8H>Z!mb+ zM)EnZE!e>x$;BLPrt4nFpyw^OeX4-~bB9-p_<8xmlG7JXyvZ|#VUds`Gw;C%`Wo?McTrcs5Nv z`2J{qo2T9853jbD@}#KTW>h$xE5mf)jWWAgL#Dv}n0?)jGrp=eKVo&<5OG8@xXr&k z&*;O=mCY}6UFSN{_x>m5$ji$c%oTWi zG$HTp*#y1yhZN5In&kMgNg-m-&RVOkd$&&cuzkJ}(>A$V-B^IhLUu#x>#!ZC9Tf{c zy$EYN-Y;+T=f}5s53gSJ=h4Zjm$0+@d+xvjzKsIX3@g=dGa4{-RZm!Iup#wwQQPn7 zafW+X+z#%ZeqU0qIC1-v!e~xr!-f?u6(9c?_UxF_aA_gWO`a(Xi-Z)Jc@I9&?{Jev dcyMT-7QRsjQv!PC{xWt~$(699#fiLd|w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic.png new file mode 100644 index 0000000000000000000000000000000000000000..0034a287562e2db1eb799595baabe5a18c3eefeb GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D0s)y z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyL>o?McTrcs5Nv z`2J{qo2T9853jbD@}#KTW>h$xE5mf)jWWAgL#Dv}n0?)jGrp=eKVo&? zLkYifzsR&z%#LYmbyqVMU}AB8@cDSS#GmkRdqacG{}O-v_+ri6Y{lFhcD}0PXhxNz zqT57fhlA}htO^@aFBi4_7H{lha67nL{Jx}IapLwRsg<0}h7AcE54xNqHDr$l9B|;2 m__Gt{@)gW(vIcKt85rh@I@&hAHa!gVCxfS}pUXO@geCxOIdqZ$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..db0ed1b59ccff00dee6cdecf66f471002b8287c0 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv(mfq{|5 z)5S5QVoq|RM1sMqhCucntAs0zi}@t}@L3e5oURwhO?-UVLV=HgvDR68gLB41jwU{a z$Y1gt4sWiWUjA?T)T!wwZqGWl!E?^kgYTc_w|U;%%<)S7G~>N{_x>m5$ji$c%oTWi zG$HTp*#y1yhZN5In&kMgNg-m-&RVOkd$&&cuzkJ}(>A$V-B^IhLUu#x>#!ZC9Tf{c zy$EYN-Y;+T=f}5s53gSJ=h4Zjm$0+@d+xvjzKsIX3@g=dGa4{-RZm!Iup#wwQQPn7 zafW+X+z#%ZeqU0qIC1-v!e~xr!-f?u6(9c?_UxF_aA_gWO`a(Xi-Z)Jc@I9&?{Jev dcyMT-7QRsjQv!PC{xWt~$(699#fiLd|w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-left.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..993468f79b25b225ed903f2e6b3f2e1db7a831b9 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|O(w zr;B4q#hkaZ9Qh6_@UXD2wD=(s|3@7Gnun!gLy#4q8G8r-buKZz%=cf;*5>V%Z}~&u4}-^ e?H~h2bIkYjsSA3!{;mav6N9I#pUXO@geCwh5`?n= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-right.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9b62a31f1f8ab172e2fcfb5e5f125d7b535e1512 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1FMR zi(^Q|oVT|e`I-zwTrYY*>bvt_C?~cMM{)CaTuA2MQOYMj#qF=_^5<$5m3;CBUp~J2D<)z1 k;=m8wv{=|6iv7@^CXLBb_U>GoXy85}Sb4q9e07U71D*ylh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen.png new file mode 100644 index 0000000000000000000000000000000000000000..e04a689f715edcd7ee446a077965a4b5f742a89b GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D0tS> z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyL>o?McTrcs5Nv z`2J{qo2T9853jbD@}#KTW>h$xE5mf)jWWAgL#Dv}n0?)jGrp=eKVo&R_51HPHdvu7)6VCh=r)nr;b6NAtHOrV%SCO! z#T)w=+z##*zb`3QoVa~SY9%MLVM7APgD&St4cVgs2OKyh{_KP~bp^AVtic;u28Nt} W4)QDcb6S8NWAJqKb6Mw<&;$Sy%V>)L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..db0ed1b59ccff00dee6cdecf66f471002b8287c0 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv(mfq{|5 z)5S5QVoq|RM1sMqhCucntAs0zi}@t}@L3e5oURwhO?-UVLV=HgvDR68gLB41jwU{a z$Y1gt4sWiWUjA?T)T!wwZqGWl!E?^kgYTc_w|U;%%<)S7G~>N{_x>m5$ji$c%oTWi zG$HTp*#y1yhZN5In&kMgNg-m-&RVOkd$&&cuzkJ}(>A$V-B^IhLUu#x>#!ZC9Tf{c zy$EYN-Y;+T=f}5s53gSJ=h4Zjm$0+@d+xvjzKsIX3@g=dGa4{-RZm!Iup#wwQQPn7 zafW+X+z#%ZeqU0qIC1-v!e~xr!-f?u6(9c?_UxF_aA_gWO`a(Xi-Z)Jc@I9&?{Jev dcyMT-7QRsjQv!PC{xWt~$(699#fiLd|w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/meta.json new file mode 100644 index 0000000000..6ff260860f --- /dev/null +++ b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/meta.json @@ -0,0 +1,77 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "tgstation at 986af32e22a88dae14fd147d812a5a4d27c1bc30", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "medipen" + }, + { + "name": "firstaid" + }, + { + "name": "firstaid_empty" + }, + { + "name": "hypovolemic" + }, + { + "name": "hypovolemic_empty" + }, + { + "name": "medipen_empty" + }, + { + "name": "stimpen" + }, + { + "name": "stimpen_empty" + }, + { + "name": "morphen" + }, + { + "name": "morphen_empty" + }, + { + "name": "oxapen" + }, + { + "name": "oxapen_empty" + }, + { + "name": "penacid" + }, + { + "name": "penacid_empty" + }, + { + "name": "salacid" + }, + { + "name": "salacid_empty" + }, + { + "name": "salpen" + }, + { + "name": "salpen_empty" + }, + { + "name": "atropen" + }, + { + "name": "atropen_empty" + }, + { + "name": "medipen-inhand-left" + }, + { + "name": "medipen-inhand-right" + } + ] +} diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen.png new file mode 100644 index 0000000000000000000000000000000000000000..da4bcb91b75e0e6f7035eb6b0550582310aed83b GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7f0w z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyL=9?o-z3<+j^+ z*VjcKcW~Pz%dqLrF-3+mc0~!yGuS@1PQ0?GwM&tC!mWzgF>S5xYQ_RgEY1%;9}k!K zbNY@`!9I~mk1sH49MLFZ(D*T7F$2rCoTzgJ$~MC1{&ydqH0`M>&k=?u#RgNp$6OLC qSlR0JfNog9>?R9#7Ed)h1H(UlbH+oCCO(G9 zU-BFdZ?2wR{%`u!sp&V;UU5zTZnbyzg1Skv58l50D?ju7A2oLRe9^2dZH zc8rC^ze_~^Zk;-l=h?=cJnG{9X$mYGtP);dTdT2-t@Xgk#nF;-_H`#dJicAsb~bP0l+XkK*P(UA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc834d85b4a7e0914d4c20b707ca62b817e4e0d GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7ewn z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyJrGun@;|@t>RJ z*4ITJcW~Pz%dqLrF-3+mc0~!yGuS@X8|bvIwk&2)YU6RpdYoG%DJD1bj01-NPvd#{ z_{0zYKjb?Jbv9V@$u>CkD6uy*@mq2^B%EIMlxI$t_QOB#`*kqt3byyc)I$ztaD0e0s#A8Tjl@& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5f6060cc5633ef2b0985ed8286734d481e71cd GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DEP$F z#WAE}PI96|g2AhXK=vN1ge#1T`6T}ESrn$6t{2Ene0(UlbH+oCCO(G9 zU-BFdZ?2wR{%`u!sp%E}?z8LZpWM;9pl*`vgST)0%FlfNn0cdt;<4_7cW%vo$bL9z z$DN~#d3esgy&U-EdRUs#jN{LY=ET^{Y!o=~s$p&P_C-6SM3~h3^HMAR{7^jHpZ{KR zUvaL}q+ZtO4&H_PuL*vzQ~|K_Wg-O$a~PE=qMn989)&%RAv wZ?mKZql>B&n^e=mc!6H1FG>%rV9wxWNUU@}eIQw|0q9=_Pgg&ebxsLQ0CYxnga7~l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid.png new file mode 100644 index 0000000000000000000000000000000000000000..5c34da6fe2991f765369cce76b9b61a3a605d3ee GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7ebg z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyJrEr!>>_`-k_i zt*?td?%=jbmSNMKV~PxC?1~bYXRv)-`rkuIM7FU*k$J+cirF!3t?p{Z0!%E<4?Z6c zm-v(JKR-F5gSWw{M~S_miQkgTA>s70r#%0cPSB}ryE|#xQ&pZL3{8p-8hnc-xFj?f ko9)FBPFca+wwIZq(UlbH+oCCO(G9 zU-BFdZ?2wR{%`u!sp%X3Kjfcoe`4dr1$C2TAH040SAORE$B&tp2`BB5IJ0)I`vCx+F`+w$&qJ<1B;m}9eR>cfwZ+j;Ew?M<)v z_Q0~O^#+57Z6u!q+kzeJkzCBtX1eJ=^t)0{X1|$clc$}iz$P%2Lw}xqo3Wm=xw59o#m_GHkkYOp)P?T~Pw_47QIyTlEiLt*NP=&bW+?%^~Y?Zjq#z+{`l$90ELz z=jG!QKiJp(=}1&GW8gCEl40Pod!oV6s5^U_@t(SVj?ln^|9NgWoc<)lmc(#SKtZH^ mO4Gsl+-|Z6Hyysm$RLqw{MqU4JTsuX89ZJ6T-G@yGywn&npm;` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..a846340fa896d167b1be765c0c86d52deee5af8b GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DEP?J z#WAE}PI96|g2AhXK=vN1ge#1T`6T}ESrn$6t{2Ene0(UlbH+oCCO(G9 zU-BFdZ?2wR{%`u!sp%G#-}GYc-HDjFpl*`vgST)0%FlfN_%ZV`;iNqhXV&hO-0?&2 z@Y8*@RYxw|v6FSJ&rMZpuFTOpeDdgINe;#}d^dKLYIm)6R4n-PBCPFrzr4|(AK&IZ ze0;pWz%tCOqxA-ZhixRE1KWZf?2%l|(Pp~o72jU*&(T+HyW4R*SC!`o!y=)FM?W8D o(-XgNDru3dLpF*x3fLJKcKq=;vdYfzEYPzopr0C0?WV*mgE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen.png new file mode 100644 index 0000000000000000000000000000000000000000..404327403d3d66e1a63c3aa0ffbac5b30359966c GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7ehi z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyJpu`jwW`?`!I0 z*VjcKcW~Pz%dqLrF-3+mc0~!yGuS?w?yq&$V6tLZ#>VE5^*FakQcP~<83zslp2qX? z@rj=zD-CpxusJBYO=NaB*e=7Wup#wwQQPY@ITqc_$hboeJPHy_EsqSk8jTEo6dzo{ h>?R9y&kbt^2C)#MRiDCs@B>}U;OXk;vd$@?2>_`RREPio literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7b826872a87fa6efaef6f44f8208113406a150b9 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D0th` z#WAE}PI96|g2AhXK=vN1ge#1T`6T}ESrn$6t{2Ene0(UlbH+oCCO(G9 zU-BFdZ?2wR{%`u!sp$nmfsLo%R~NT0sGB7F;O*PL@-yE*e$2c~IBAc>nYDW*P4?G1 zdoamfxML^lTA!P$)?AsRclhMd$&wt5Yxr*LD%I{?7X&mZH zR5W7<@}I^$fl=d~;xwlN(|k`$u9LPB-twd{nv>bEVTDV@$3KR13MEfDNGfOv8eI_J o`PY;Ic6sT670hn34%rM0Z;rYrO2lit0(z6d)78&qol`;+0A$5(od5s; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7b0ed46b70eaeaad75394b999fe757b19a759e GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7f3x z#WAE}PI96|g2AhXK=vN1ge#1T`6NmYJSac#@bByYhi~-D+ow#JIyHUAGl>%$Zk_C0 zxX*0*0@iJPjXf#W3@JN%of&4-J~_ZOB`^RR4dfrVV+o9{-uTi-AEZ!cD` zaC3Qg$IX(SZe!iklWuZvj&>JdigilfUT1syC{ywC-_snX3n+g2&o9WmfdPbC&dR2L W3#)wjzQ7n53=E#GelF{r5}E*tl8qMt literal 0 HcmV?d00001