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 0000000000..b5d7fd60cd Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen.png differ 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 0000000000..de9a4aec65 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/atropen_empty.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid.png new file mode 100644 index 0000000000..bc232bc112 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid_empty.png new file mode 100644 index 0000000000..db0ed1b59c Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/firstaid_empty.png differ 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 0000000000..0034a28756 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic.png differ 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 0000000000..db0ed1b59c Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/hypovolemic_empty.png differ 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 0000000000..993468f79b Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-left.png differ 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 0000000000..9b62a31f1f Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen-inhand-right.png differ 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 0000000000..e04a689f71 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen.png differ 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 0000000000..db0ed1b59c Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/medipen_empty.png differ 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 0000000000..da4bcb91b7 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen_empty.png new file mode 100644 index 0000000000..c0e4facda8 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/morphen_empty.png differ 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 0000000000..ecc834d85b Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen.png differ 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 0000000000..cc5f6060cc Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/oxapen_empty.png differ 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 0000000000..5c34da6fe2 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid_empty.png new file mode 100644 index 0000000000..cfb26f09f6 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/penacid_empty.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid.png new file mode 100644 index 0000000000..2c79d0283d Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid.png differ 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 0000000000..a846340fa8 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salacid_empty.png differ 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 0000000000..404327403d Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen.png differ 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 0000000000..7b826872a8 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/salpen_empty.png differ 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 0000000000..8f7b0ed46b Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen_empty.png b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen_empty.png new file mode 100644 index 0000000000..764ead4334 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/medipen.rsi/stimpen_empty.png differ