From faecf7cbfaa3ddde4245e1a6872e9e660264d870 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sat, 2 May 2020 20:07:43 -0400 Subject: [PATCH] Patch rework (#13062) * Patch Rework Part 1 * applicator * fixes * fixes * temperature settings * single application patches * additional * new line fix * fox is a derp sometimes --- code/_globalvars/lists/reagents.dm | 2 + code/game/jobs/job/medical.dm | 5 +- code/game/jobs/job/security.dm | 2 +- code/game/machinery/vending.dm | 2 +- .../objects/items/weapons/storage/belt.dm | 3 +- .../objects/items/weapons/storage/firstaid.dm | 163 +++++++++--------- code/modules/clothing/suits/jobs.dm | 8 +- code/modules/clothing/suits/labcoat.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 11 +- .../mob/living/carbon/carbon_defines.dm | 1 + code/modules/mob/living/carbon/life.dm | 20 +++ code/modules/mob/living/living.dm | 2 + code/modules/reagents/chemistry/holder.dm | 22 ++- .../chemistry/machinery/chem_master.dm | 4 +- code/modules/reagents/chemistry/reagents.dm | 2 +- .../reagents/chemistry/reagents/medicine.dm | 6 +- code/modules/reagents/reagent_containers.dm | 4 +- .../reagents/reagent_containers/applicator.dm | 106 ++++++++++++ .../reagents/reagent_containers/patch.dm | 34 +++- .../research/designs/autolathe_designs.dm | 9 +- icons/goonstation/objects/objects.dmi | Bin 1002 -> 2059 bytes nano/templates/chem_master.tmpl | 2 +- paradise.dme | 1 + sound/goonstation/items/mender.ogg | Bin 0 -> 15335 bytes sound/goonstation/items/mender2.ogg | Bin 0 -> 15462 bytes 26 files changed, 297 insertions(+), 118 deletions(-) create mode 100644 code/modules/reagents/reagent_containers/applicator.dm create mode 100644 sound/goonstation/items/mender.ogg create mode 100644 sound/goonstation/items/mender2.ogg diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 20620d60800..abd878ff936 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -64,3 +64,5 @@ GLOBAL_LIST_INIT(safe_chem_list, list("antihol", "charcoal", "epinephrine", "ins "omnizine", "stimulants", "synaptizine", "potass_iodide", "oculine", "mannitol", "styptic_powder", "spaceacillin", "salglu_solution", "sal_acid", "cryoxadone", "blood", "synthflesh", "hydrocodone", "mitocholide", "rezadone")) + +GLOBAL_LIST_INIT(safe_chem_applicator_list, list("silver_sulfadiazine", "styptic_powder", "synthflesh")) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 259afa12c9e..2d1b091a10d 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -30,7 +30,7 @@ l_ear = /obj/item/radio/headset/heads/cmo id = /obj/item/card/id/cmo suit_store = /obj/item/flashlight/pen - l_hand = /obj/item/storage/firstaid/adv + l_hand = /obj/item/storage/firstaid/doctor pda = /obj/item/pda/heads/cmo backpack_contents = list( /obj/item/melee/classic_baton/telescopic = 1 @@ -68,7 +68,7 @@ l_ear = /obj/item/radio/headset/headset_med id = /obj/item/card/id/medical suit_store = /obj/item/flashlight/pen - l_hand = /obj/item/storage/firstaid/adv + l_hand = /obj/item/storage/firstaid/doctor pda = /obj/item/pda/medical backpack = /obj/item/storage/backpack/medic @@ -315,4 +315,3 @@ satchel = /obj/item/storage/backpack/satchel_med dufflebag = /obj/item/storage/backpack/duffel/medical box = /obj/item/storage/box/engineer - diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 64e69e89765..a32656598df 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -217,7 +217,7 @@ glasses = /obj/item/clothing/glasses/hud/health/sunglasses id = /obj/item/card/id/security suit_store = /obj/item/flashlight/pen - l_hand = /obj/item/storage/firstaid/adv + l_hand = /obj/item/storage/firstaid/doctor pda = /obj/item/pda/medical implants = list(/obj/item/implant/mindshield) backpack = /obj/item/storage/backpack/medic diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index e3b1322f34b..6813333033c 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1172,7 +1172,7 @@ icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access_txt = "5" - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 10, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 10, + products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 4, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 4, /obj/item/reagent_containers/applicator/brute = 3, /obj/item/reagent_containers/applicator/burn = 3, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4, /obj/item/reagent_containers/glass/bottle/salicylic = 4, /obj/item/reagent_containers/glass/bottle/potassium_iodide =3, /obj/item/reagent_containers/glass/bottle/saline = 5, /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/ether = 4, /obj/item/reagent_containers/glass/bottle/atropine = 3, diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 755b0076c3c..403088e2b71 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -134,7 +134,8 @@ /obj/item/rad_laser, /obj/item/sensor_device, /obj/item/wrench/medical, - /obj/item/handheld_defibrillator + /obj/item/handheld_defibrillator, + /obj/item/reagent_containers/applicator ) /obj/item/storage/belt/medical/surgery diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index a9da4a69241..4ff769a7d3f 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -14,7 +14,7 @@ icon_state = "firstaid" throw_speed = 2 throw_range = 8 - var/empty = 0 + var/empty = FALSE req_one_access =list(ACCESS_MEDICAL, ACCESS_ROBOTICS) //Access and treatment are utilized for medbots. var/treatment_brute = "salglu_solution" var/treatment_oxy = "salbutamol" @@ -33,39 +33,51 @@ item_state = "firstaid-ointment" med_bot_skin = "ointment" - New() - ..() - if(empty) return - - icon_state = pick("ointment","firefirstaid") - - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/healthanalyzer( src ) - new /obj/item/reagent_containers/hypospray/autoinjector( src ) - new /obj/item/reagent_containers/food/pill/salicylic( src ) +/obj/item/storage/firstaid/fire/New() + ..() + if(empty) return + icon_state = pick("ointment", "firefirstaid") + new /obj/item/reagent_containers/applicator/burn(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf/small(src) + new /obj/item/healthanalyzer(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) /obj/item/storage/firstaid/fire/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/regular desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer" icon_state = "firstaid" - New() - ..() - if(empty) return - new /obj/item/reagent_containers/food/pill/patch/styptic( src ) - new /obj/item/reagent_containers/food/pill/patch/styptic( src ) - new /obj/item/reagent_containers/food/pill/salicylic( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src ) - new /obj/item/healthanalyzer( src ) - new /obj/item/reagent_containers/hypospray/autoinjector( src ) +/obj/item/storage/firstaid/regular/New() + ..() + if(empty) return + new /obj/item/reagent_containers/food/pill/patch/styptic(src) + new /obj/item/reagent_containers/food/pill/patch/styptic(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src) + new /obj/item/healthanalyzer(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) + +/obj/item/storage/firstaid/doctor + desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer" + icon_state = "firstaid" + +/obj/item/storage/firstaid/doctor/New() + ..() + if(empty) + return + new /obj/item/reagent_containers/applicator/brute(src) + new /obj/item/reagent_containers/applicator/burn(src) + new /obj/item/reagent_containers/food/pill/patch/styptic(src) + new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/healthanalyzer/advanced(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) /obj/item/storage/firstaid/toxin name = "toxin first aid kit" @@ -74,23 +86,21 @@ item_state = "firstaid-toxin" med_bot_skin = "tox" - New() - ..() - if(empty) return - - icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3") - - new /obj/item/reagent_containers/syringe/charcoal( src ) - new /obj/item/reagent_containers/syringe/charcoal( src ) - new /obj/item/reagent_containers/syringe/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/healthanalyzer( src ) +/obj/item/storage/firstaid/toxin/New() + ..() + if(empty) return + icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2", "antitoxfirstaid3") + new /obj/item/reagent_containers/syringe/charcoal(src) + new /obj/item/reagent_containers/syringe/charcoal(src) + new /obj/item/reagent_containers/syringe/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/healthanalyzer(src) /obj/item/storage/firstaid/toxin/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/o2 name = "oxygen deprivation first aid kit" @@ -99,18 +109,18 @@ item_state = "firstaid-o2" med_bot_skin = "o2" - New() - ..() - if(empty) return - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/reagent_containers/food/pill/salbutamol( src ) - new /obj/item/healthanalyzer( src ) +/obj/item/storage/firstaid/o2/New() + ..() + if(empty) return + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/reagent_containers/food/pill/salbutamol(src) + new /obj/item/healthanalyzer(src) /obj/item/storage/firstaid/o2/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/brute name = "brute trauma treatment kit" @@ -119,23 +129,19 @@ item_state = "firstaid-brute" med_bot_skin = "brute" - New() - ..() - if(empty) return - - icon_state = pick("brute","brute2") - - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/reagent_containers/food/pill/patch/styptic(src) - new /obj/item/healthanalyzer(src) - new /obj/item/reagent_containers/hypospray/autoinjector(src) - new /obj/item/stack/medical/bruise_pack(src) +/obj/item/storage/firstaid/brute/New() + ..() + if(empty) return + icon_state = pick("brute", "brute2") + new /obj/item/reagent_containers/applicator/brute(src) + new /obj/item/reagent_containers/food/pill/patch/styptic/small(src) + new /obj/item/healthanalyzer(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) + new /obj/item/stack/medical/bruise_pack(src) /obj/item/storage/firstaid/brute/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/adv name = "advanced first-aid kit" @@ -157,7 +163,7 @@ new /obj/item/healthanalyzer(src) /obj/item/storage/firstaid/adv/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/machine name = "machine repair kit" @@ -178,7 +184,7 @@ new /obj/item/robotanalyzer(src) /obj/item/storage/firstaid/machine/empty - empty = 1 + empty = TRUE /obj/item/storage/firstaid/tactical @@ -196,18 +202,15 @@ /obj/item/storage/firstaid/tactical/New() ..() - if(empty) return + if(empty) + return new /obj/item/reagent_containers/hypospray/combat(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) // Because you ain't got no time to look at what damage dey taking yo - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) + new /obj/item/reagent_containers/applicator/dual(src) // Because you ain't got no time to look at what damage dey taking yo new /obj/item/defibrillator/compact/combat/loaded(src) new /obj/item/clothing/glasses/hud/health/night(src) - return /obj/item/storage/firstaid/tactical/empty - empty =1 + empty = TRUE /obj/item/storage/firstaid/surgery name = "field surgery kit" @@ -347,15 +350,15 @@ desc = "Contains pills used to counter toxins." wrapper_color = COLOR_GREEN - New() - ..() - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) - new /obj/item/reagent_containers/food/pill/charcoal( src ) +/obj/item/storage/pill_bottle/charcoal/New() + ..() + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) /obj/item/storage/pill_bottle/painkillers name = "Pill Bottle (Salicylic Acid)" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index bcb71edf356..d926730942e 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -7,7 +7,7 @@ desc = "A hazard vest used in the recovery of bodies." icon_state = "paramedic-vest" item_state = "paramedic-vest" - allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ + allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe, /obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10, fire = 50, acid = 50) @@ -21,7 +21,7 @@ desc = "A vest often worn by doctors caring for inmates." icon_state = "brigphysician-vest" item_state = "brigphysician-vest" - allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ + allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe, /obj/item/healthanalyzer, /obj/item/flashlight, \ /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50) @@ -341,7 +341,7 @@ icon_state = "fr_jacket_open" item_state = "fr_jacket_open" blood_overlay_type = "armor" - allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ + allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe, /obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) ignore_suitadjust = 0 suit_adjusted = 1 @@ -381,5 +381,5 @@ desc = "A tweed mantle, worn by the Research Director. Smells like science." icon_state = "rdmantle" item_state = "rdmantle" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser) + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 03df1bd74d8..5281a32676e 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -7,7 +7,7 @@ suit_adjusted = 1 blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) + allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50) species_exception = list(/datum/species/golem) sprite_sheets = list( diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index cd137f6e12b..2e2dc76fb97 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -394,7 +394,7 @@ name = "medical winter coat" icon_state = "wintercoat_med" item_state = "coatmedical" - allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) + allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical @@ -405,7 +405,7 @@ name = "science winter coat" icon_state = "wintercoat_sci" item_state = "coatscience" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c4cd95eeb83..9552477e210 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -9,12 +9,18 @@ qdel(item) QDEL_LIST(internal_organs) QDEL_LIST(stomach_contents) + QDEL_LIST(processing_patches) var/mob/living/simple_animal/borer/B = has_brain_worms() if(B) B.leave_host() qdel(B) return ..() +/mob/living/carbon/handle_atom_del(atom/A) + if(A in processing_patches) + processing_patches -= A + return ..() + /mob/living/carbon/blob_act(obj/structure/blob/B) if(stat == DEAD) return @@ -1073,8 +1079,9 @@ so that different stomachs can handle things in different ways VB*/ if(can_taste_container) taste(toEat.reagents) var/fraction = min(this_bite/toEat.reagents.total_volume, 1) - toEat.reagents.reaction(src, toEat.apply_type, fraction) - toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency) + if(fraction) + toEat.reagents.reaction(src, toEat.apply_type, fraction) + toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency) /mob/living/carbon/get_access() . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 884ee802518..97ecf4dd08b 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,6 +2,7 @@ gender = MALE pressure_resistance = 15 var/list/stomach_contents = list() + var/list/processing_patches = list() var/list/internal_organs = list() var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/antibodies = 0 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 832260d3090..87832154876 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -13,6 +13,7 @@ for(var/obj/item/organ/internal/O in internal_organs) O.on_life() + handle_patches() handle_changeling() handle_wetness(times_fired) @@ -438,3 +439,22 @@ overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) else clear_fullscreen("brute") + +/mob/living/carbon/proc/handle_patches() + if(LAZYLEN(processing_patches)) + var/multiple_patch_multiplier = processing_patches.len > 1 ? (processing_patches.len * 1.5) : 1 + var/applied_amount = 0.35 * multiple_patch_multiplier + + for(var/patch in processing_patches) + var/obj/item/reagent_containers/food/pill/patch/P = patch + + if(P.reagents && P.reagents.total_volume) + var/fractional_applied_amount = applied_amount / P.reagents.total_volume + P.reagents.reaction(src, REAGENT_TOUCH, fractional_applied_amount, P.needs_to_apply_reagents) + P.needs_to_apply_reagents = FALSE + P.reagents.trans_to(src, applied_amount * 0.5) + P.reagents.remove_any(applied_amount * 0.5) + else + if(!P.reagents || P.reagents.total_volume <= 0) + processing_patches -= P + qdel(P) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4b2e39fee35..8371cacaebe 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -406,6 +406,8 @@ QDEL_LIST(C.reagents.addiction_list) C.reagents.addiction_threshold_accumulated.Cut() + QDEL_LIST(C.processing_patches) + // rejuvenate: Called by `revive` to get the mob into a revivable state // the admin "rejuvenate" command calls `revive`, not this proc. /mob/living/proc/rejuvenate() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index ddd78b2018f..9afcd5607fa 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -8,13 +8,19 @@ var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = T20C + var/temperature_min = 0 + var/temperature_max = 10000 var/list/datum/reagent/addiction_list = new/list() var/list/addiction_threshold_accumulated = new/list() var/flags var/list/reagents_generated_per_cycle = new/list() -/datum/reagents/New(maximum = 100) +/datum/reagents/New(maximum = 100, min_temp, max_temp) maximum_volume = maximum + if(min_temp) + temperature_min = min_temp + if(max_temp) + temperature_max = max_temp if(!(flags & REAGENT_NOREACT)) START_PROCESSING(SSobj, src) //I dislike having these here but map-objects are initialised before world/New() is called. >_> @@ -179,7 +185,7 @@ return amount /datum/reagents/proc/set_reagent_temp(new_temp = T0C, react = TRUE) - chem_temp = new_temp + chem_temp = Clamp(new_temp, temperature_max, temperature_min) if(react) temperature_react() handle_reactions() @@ -197,7 +203,7 @@ else if(exposed_temperature < chem_temp) chem_temp -= change - chem_temp = max(min(chem_temp, 10000), 0) //Cap for the moment. + chem_temp = max(min(chem_temp, temperature_max), temperature_min) //Cap for the moment. temperature_react() handle_reactions() @@ -569,7 +575,7 @@ can_process = 1 return can_process -/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1) +/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1, show_message = TRUE) var/react_type if(isliving(A)) react_type = "LIVING" @@ -614,7 +620,7 @@ var/check = reaction_check(A, R) if(!check) continue - R.reaction_mob(A, method, R.volume * volume_modifier) + R.reaction_mob(A, method, R.volume * volume_modifier, show_message) if("TURF") R.reaction_turf(A, R.volume * volume_modifier) if("OBJ") @@ -632,7 +638,7 @@ if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. if(amount <= 0) return 0 - chem_temp = (chem_temp * total_volume + reagtemp * amount) / (total_volume + amount) //equalize with new chems + chem_temp = Clamp((chem_temp * total_volume + reagtemp * amount) / (total_volume + amount), temperature_min, temperature_max) //equalize with new chems for(var/A in reagent_list) @@ -870,8 +876,8 @@ // Convenience proc to create a reagents holder for an atom // Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - reagents = new/datum/reagents(max_vol) +/atom/proc/create_reagents(max_vol, min_temp, max_temp) + reagents = new /datum/reagents(max_vol, min_temp, max_temp) reagents.my_atom = src /proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 435a253bed5..cf7ff936b6d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -347,8 +347,8 @@ if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? var/amount_per_patch = reagents.total_volume/count - if(amount_per_patch > 40) - amount_per_patch = 40 + if(amount_per_patch > 30) + amount_per_patch = 30 var/name = clean_input("Name:", "Name your patch!", "[reagents.get_master_reagent_name()] ([amount_per_patch]u)") if(!name) return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4271b26ba17..8cdb69062ff 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -43,7 +43,7 @@ /datum/reagent/proc/reaction_temperature(exposed_temperature, exposed_volume) //By default we do nothing. return -/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. +/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume, show_message = TRUE) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. if(holder) //for catching rare runtimes if(method == REAGENT_TOUCH && penetrates_skin) var/block = M.get_permeability_protection() diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index c9e7ac0c1dc..567a1a4d92d 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -178,7 +178,7 @@ id = "silver_sulfadiazine" description = "This antibacterial compound is used to treat burn victims." reagent_state = LIQUID - color = "#F0C814" + color = "#F0DC00" metabolization_rate = 3 harmless = FALSE //toxic if ingested, and I am NOT going to account for the difference taste_description = "burn cream" @@ -205,7 +205,7 @@ id = "styptic_powder" description = "Styptic (aluminum sulfate) powder helps control bleeding and heal physical wounds." reagent_state = LIQUID - color = "#C8A5DC" + color = "#FF9696" metabolization_rate = 3 harmless = FALSE taste_description = "wound cream" @@ -221,7 +221,7 @@ M.adjustBruteLoss(-volume) if(show_message) to_chat(M, "The styptic powder stings like hell as it closes some of your wounds!") - M.emote("scream") + M.emote("scream") if(method == REAGENT_INGEST) M.adjustToxLoss(0.5*volume) if(show_message) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index db65f761e2e..a091f65a34c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -11,6 +11,8 @@ var/spawned_disease = null var/disease_amount = 20 var/has_lid = FALSE // Used for containers where we want to put lids on and off + var/temperature_min = 0 // To limit the temperature of a reagent container can atain when exposed to heat/cold + var/temperature_max = 10000 /obj/item/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -30,7 +32,7 @@ ..() if(!possible_transfer_amounts) verbs -= /obj/item/reagent_containers/verb/set_APTFT - create_reagents(volume) + create_reagents(volume, temperature_min, temperature_max) if(spawned_disease) var/datum/disease/F = new spawned_disease(0) var/list/data = list("viruses" = list(F), "blood_color" = "#A10808") diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm new file mode 100644 index 00000000000..dfa59c941ac --- /dev/null +++ b/code/modules/reagents/reagent_containers/applicator.dm @@ -0,0 +1,106 @@ +/obj/item/reagent_containers/applicator + name = "auto-mender" + desc = "A small electronic device designed to topically apply healing chemicals." + icon = 'icons/goonstation/objects/objects.dmi' + icon_state = "mender" + item_state = "mender" + volume = 200 + resistance_flags = ACID_PROOF + container_type = REFILLABLE | AMOUNT_VISIBLE + temperature_min = 270 + temperature_max = 350 + var/ignore_flags = FALSE + var/emagged = FALSE + var/applied_amount = 8 // How much it applies + var/applying = FALSE // So it can't be spammed. + var/measured_health = 0 // Used for measuring health; we don't want this to stop applying once the person's health isn't changing. + +/obj/item/reagent_containers/applicator/emag_act(mob/user) + if(!emagged) + emagged = TRUE + ignore_flags = TRUE + to_chat(user, "You short out the safeties on [src].") + +/obj/item/reagent_containers/applicator/on_reagent_change() + if(!emagged) + var/found_forbidden_reagent = FALSE + for(var/datum/reagent/R in reagents.reagent_list) + if(!GLOB.safe_chem_applicator_list.Find(R.id)) + reagents.del_reagent(R.id) + found_forbidden_reagent = TRUE + if(found_forbidden_reagent) + if(ismob(loc)) + to_chat(loc, "[src] identifies and removes a harmful substance.") + else + visible_message("[src] identifies and removes a harmful substance.") + update_icon() + +/obj/item/reagent_containers/applicator/update_icon() + cut_overlays() + + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/goonstation/objects/objects.dmi', "mender-fluid") + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) + +/obj/item/reagent_containers/applicator/attack(mob/living/M, mob/user) + if(!reagents.total_volume) + to_chat(user, "[src] is empty!") + return + if(applying) + to_chat(user, "You're already applying [src].") + return + if(!iscarbon(M)) + return + + if(ignore_flags || M.can_inject(user, TRUE)) + if(M == user) + M.visible_message("[user] begins mending [user.p_them()]self with [src].", "You begin mending yourself with [src].") + else + user.visible_message("[user] begins mending [M] with [src].", "You begin mending [M] with [src].") + if(M.reagents) + applying = TRUE + icon_state = "mender-active" + apply_to(M, user, 0.2) // We apply a very weak application up front, then loop. + while(do_after(user, 10, target = M)) + measured_health = M.health + apply_to(M, user, 1, FALSE) + if((measured_health == M.health) || !reagents.total_volume) + to_chat(user, "[M] is finished healing and [src] powers down automatically.") + break + applying = FALSE + icon_state = "mender" + user.changeNext_move(CLICK_CD_MELEE) + + +/obj/item/reagent_containers/applicator/proc/apply_to(mob/living/carbon/M, mob/user, multiplier = 1, show_message = TRUE) + var/total_applied_amount = applied_amount * multiplier + + if(reagents && reagents.total_volume) + var/list/injected = list() + for(var/datum/reagent/R in reagents.reagent_list) + injected += R.name + + var/contained = english_list(injected) + + add_attack_logs(user, M, "Automends with [src] containing ([contained])", reagents.harmless_helper() ? ATKLOG_ALMOSTALL : null) + + var/fractional_applied_amount = total_applied_amount / reagents.total_volume + + reagents.reaction(M, REAGENT_TOUCH, fractional_applied_amount, show_message) + reagents.trans_to(M, total_applied_amount * 0.5) + reagents.remove_any(total_applied_amount * 0.5) + + playsound(get_turf(src), pick('sound/goonstation/items/mender.ogg', 'sound/goonstation/items/mender2.ogg'), 50, 1) + +/obj/item/reagent_containers/applicator/brute + name = "brute auto-mender" + list_reagents = list("styptic_powder" = 200) + +/obj/item/reagent_containers/applicator/burn + name = "burn auto-mender" + list_reagents = list("silver_sulfadiazine" = 200) + +/obj/item/reagent_containers/applicator/dual + name = "dual auto-mender" + list_reagents = list("synthflesh" = 200) diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index b020015e929..582e157004c 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -5,10 +5,24 @@ icon_state = "bandaid" item_state = "bandaid" possible_transfer_amounts = null - volume = 40 + volume = 30 apply_type = REAGENT_TOUCH apply_method = "apply" transfer_efficiency = 0.5 //patches aren't as effective at getting chemicals into the bloodstream. + temperature_min = 270 + temperature_max = 350 + var/needs_to_apply_reagents = TRUE + +/obj/item/reagent_containers/food/pill/patch/attack(mob/living/carbon/M, mob/user, def_zone) + if(!istype(M)) + return FALSE + bitesize = 0 + if(M.eat(src, user)) + user.drop_item() + forceMove(M) + M.processing_patches += src + return TRUE + return FALSE /obj/item/reagent_containers/food/pill/patch/afterattack(obj/target, mob/user , proximity) return // thanks inheritance again @@ -18,29 +32,37 @@ desc = "Helps with brute injuries." icon_state = "bandaid_brute" instant_application = 1 - list_reagents = list("styptic_powder" = 40) + list_reagents = list("styptic_powder" = 30) + +/obj/item/reagent_containers/food/pill/patch/styptic/small + name = "healing mini-patch" + list_reagents = list("styptic_powder" = 15) /obj/item/reagent_containers/food/pill/patch/silver_sulf name = "burn patch" desc = "Helps with burn injuries." icon_state = "bandaid_burn" instant_application = 1 - list_reagents = list("silver_sulfadiazine" = 40) + list_reagents = list("silver_sulfadiazine" = 30) + +/obj/item/reagent_containers/food/pill/patch/silver_sulf/small + name = "burn mini-patch" + list_reagents = list("silver_sulfadiazine" = 15) /obj/item/reagent_containers/food/pill/patch/synthflesh name = "synthflesh patch" desc = "Helps with brute and burn injuries." icon_state = "bandaid_med" instant_application = 1 - list_reagents = list("synthflesh" = 20) + list_reagents = list("synthflesh" = 10) /obj/item/reagent_containers/food/pill/patch/nicotine name = "nicotine patch" desc = "Helps temporarily curb the cravings of nicotine dependency." - list_reagents = list("nicotine" = 20) + list_reagents = list("nicotine" = 10) /obj/item/reagent_containers/food/pill/patch/jestosterone name = "jestosterone patch" desc = "Helps with brute injuries if the affected person is a clown, otherwise inflicts various annoying effects." icon_state = "bandaid_clown" - list_reagents = list("jestosterone" = 30) + list_reagents = list("jestosterone" = 20) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 2e7c668a83f..d907e46247e 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -607,6 +607,14 @@ build_path = /obj/item/reagent_containers/hypospray/safety category = list("initial", "Medical") +/datum/design/automender + name = "Auto-mender" + id = "automender" + build_type = AUTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 1000) + build_path = /obj/item/reagent_containers/applicator + category = list("initial", "Medical") + /datum/design/prox_sensor name = "Proximity Sensor" id = "prox_sensor" @@ -914,4 +922,3 @@ materials = list(MAT_METAL = 40000) build_path = /obj/item/golem_shell category = list("Imported") - diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi index 8dadb400668ccb464d85f16b00295be61acccfa8..2707ce8b9b81606e88f29d9c830f7f49a0db0427 100644 GIT binary patch literal 2059 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 literal 1002 zcmVV=-0C=2r%CQQAFce1NIrk}kbT75-nnfa#LEj-XSCgSB++6ha9RxSGbKq;y z52K&qCQlnn&Hn<6&*MpE&ruUB-Y+tV^P2RWszDhR%__{LArrGySaf6-2|qsjQjxWO zLn$nGw8bzxxXIH2@K+|`(GY1M0009iNklTY#B#B8$bY`U{eSVHr`GP`fyzJ2eTH*aQ^TUuJeaYlpF4mgcE0Zu#MH0lI6?SRv$ zc>*L!B9bH#yYF+gwhYShjA^h_Q};Mldrfv72?YIAN1oqZWOl+TWO;_1KQ~0}>+0@? zEYA>D5^QBaAm}IVaTPtD4xM~!ZwJa#S5-(T4L<%h4wuWV^{J|Y(b3xgfN1m;QzkHH zKp^NRywr+J2*_aH(CY#(wIUGolWLG~^~D2BpS*Oa%BmP|ZW%5Qd zO7%0LeY8!f2*~!cV*JrHym`2)lX-hPiw~c_0RTR5jm);oE`w&l13-_bgL=`>^4^mt z!K82=h9?&n(A1OG!gdX4fBZ%FOe=u9U~|R_%z_^p93aVLl6jS>+F{6;5v2vu zE)+$<^2#bF2m-ZL6ouJlRR}N!@7?eq8&fK>MGl9<=seLu1VPZX;c(cNy|Pol?x=a8 zpZk>vKAld%=i{|3_$Sud!sw^dDJHvR3CPCSQ;LR4o(qPDhmlAmsB$}~ss90zBoR?8 z?g3Oqh09&sV8!EcghHX}ABUYpxxYWG!2>l&K&4Uh{{)YUIsr~Q;56z4IPHMbIQ9hm Y1_MQ2+n{ diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl index 1d040d52af7..e91a43d357b 100644 --- a/nano/templates/chem_master.tmpl +++ b/nano/templates/chem_master.tmpl @@ -56,7 +56,7 @@ - {{:helper.link('Create patch (40u max)', 'arrow-right', {'createpatch': 1})}} + {{:helper.link('Create patch (30u max)', 'arrow-right', {'createpatch': 1})}} {{:helper.link('Multiple', 'arrow-right', {'createpatch_multiple': 1})}} diff --git a/paradise.dme b/paradise.dme index ade9dec2048..7324ffaf044 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2314,6 +2314,7 @@ #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" #include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" +#include "code\modules\reagents\reagent_containers\applicator.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" diff --git a/sound/goonstation/items/mender.ogg b/sound/goonstation/items/mender.ogg new file mode 100644 index 0000000000000000000000000000000000000000..93114a2c74c6a2fc85fa52ab06892076b53dabd9 GIT binary patch literal 15335 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

x#Uc1Cn zqE{9NzCE4om@K|LIPX%=e+wD1>fC)U)xaBW4emWmZ?6ej0boDXKRu-82gD?6MSt%! z3j#Ja>(KFxEMpU`I@pX*d4M{pqlljDNYkv>?%h*1#E4pT|MSnVZelB8@8XOPzo=+!Drxvt844r&8(C#LmrxB=k`n%-%R{R`kiF=y| z8``>P`L#{@qg)<+AMB^R+utND!Wg`ciXKVF?1!N}9vausRo)yeC?*1?IkLworyNi& zX4&Ip{C1X>NeR|r26@hQ^XVk&>5p-Y_eb|b+d^NaJ~`63= zbE$T(ZY`%bE;y~L#on5>II|t}y)WBokydAQ_Z7KQ3adzd5^KaN=~onBik`pu%B4dF zlfkgaFZ18YO(A?--0{eyX9PguI5iXyILeN8c^cKf_})%=Y9^0iUrF$Vov_|jO*?#7 zXnzQ~neC38I5XHtecyFoPR*0g2{S+eXRWc^J$J z{LO^}wv8ONwz?e9IMq9ssRx^&b6jRnhR2f@;&jHwe%cLZX%Rzv+>o=0m9FJ?5{eCa zCUgi|HVa01*aIys(Yeo4fxo`7s021Wt6j|6+c52Pd8T?jdt~&q{bACe?;g%3kL1Ll zpN-k%h6eG|?~ST5)l4F;D?gb$CJiHpUBBqAOmS8flABvo%X_4HST?@ayk(nsx(@W-GiL#BCwS@0q}68QPL!+~lG|N*-9wsG9an_K|{^Q6|!y~4bpVRfn zrGrPvC)>gud_@=hIVQ}nmj~X}yGxEqFJA1;QHnR&P<5!O(0o@!Gd8-bqCL`~Zm`Ra zpm?iK?BURkbW!I;=Glt#|pY&A$<+le0Re2h|l#OrQ7#p&5nzDY| z^FcZS>hN&e0YOxB)}CWMVb3n)#j;45J#~R9&SlDgm{%}`_i|(l>?Q?j$6A)uVAp z8LM4at-5L1#>mIFHhRsP?3rEimI@%ie}^4x7hU%L0}uFW8)vQm=I{C6eEhenKOb2K zbC3jOH_d2%wRj>Pg)JV%8KKKlynyG13EJIX z4atYhvVMH)W>tLJllm)wNiW0Yc4sU=HAJw6lvao4VH{ZFRYd!Vi;(@IwCv|Cewu)u ztF1F;?%ly5!^%0>^TyJBmSo#|nq+%#^HYB@(ka#yZ)P?9C+-UtOe#fVgBACN32@9` zx~qnyKpCw@P|`Z-$TF9Al8#Nr+@qjX_Ve(ugEk zc<3ue(4WrScyT}?`31KXgtXw}8`YgK_V;n%`=Beh6=Y$L-?9i>f7Ou}Lf%m+qcYsl z>U}^q$Bq+0+Y9Y=zD3?WMGfA`Uj>B1{R;asZBZEuXzrCTbfA}+gpo-W9nkX|o^Ur! zTfVKMz`e!B!mI-&3Jcc`!@m&}`2kwS|0@^^3Yy;tZZb0wGl9X6Q!EyjMIWE>D9sP* z={H1LtT8NKs-a9e+BYcv?`>}KlaQc+@2Ao!w$_p*I%58vnV(|I^RfP!EsGA}5 zzZc9`f-5M1pDt>pi0M2R(=e?Z;pHJslO$^FZGtw2S%sBapDEbpJWfe3=l1jWvZcOmaG6e{kN7bJu{z2y- zSZ~nz3u`2CECf&h!s6Pc!WH$yoMhn<@ThMjH-q*sp8s!&WF00JCKfp8s7G|#qhrMR zzcoShn9!Iixv3QXQy~u!4;Cf`Kvs^)^SQCQuYtQFG)$p1A}y>v%=16D1z~4`!*9MZ zK_^oc=!9uI3AokOKWy-T5pY-(fvehOLCL{aNv+RXy5Pi`)IK|)ul&<0a2fem`hNiH CRugRi literal 0 HcmV?d00001 diff --git a/sound/goonstation/items/mender2.ogg b/sound/goonstation/items/mender2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5b994b105208823b0d2e55310fa8ba832556fd25 GIT binary patch literal 15462 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 NOaHVATt@zt{vXkNLJR-^ literal 0 HcmV?d00001