Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TESTMERGE ONLY] Inhalers #218

Draft
wants to merge 22 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
18164d5
Add CHEM_INHALE and inhalation framework
MarinaGryphon Dec 29, 2021
1b575e0
Autoinjectors now use SSoverlays
MarinaGryphon Dec 29, 2021
87fdf2c
Add initial autoinhaler/inhaler sprites
MarinaGryphon Dec 29, 2021
87c8e95
Add inhalers
noelle-lavenza Jan 16, 2022
c3a6c1d
Add oxygel inhaler
noelle-lavenza Jan 16, 2022
4025617
Make autoinjectors no longer have silver
noelle-lavenza Jan 16, 2022
4efdd24
Add affect_inhale
noelle-lavenza Jan 16, 2022
760284b
Replace arbitrary value with minimum volume define
noelle-lavenza Jan 16, 2022
6f9ac92
Tweak chem doses to remove initial() call
noelle-lavenza Jan 22, 2022
5e75242
Add inhale_met(abolism) to materials
noelle-lavenza Jan 22, 2022
e0bc568
Add detoxifier, for purging opiates
noelle-lavenza Jan 22, 2022
b59d37a
Add automatic band colors to pouch inhalers
noelle-lavenza Jan 22, 2022
7456b0b
Let inhalers go in a number of storage items
noelle-lavenza Jan 22, 2022
2da8ba7
Fix CHEM_INHALE
noelle-lavenza Jan 22, 2022
a8ed70d
Fix lung reagents causing runtimes
noelle-lavenza Feb 5, 2022
054382e
Fix runtime in lungs/Destroy()
noelle-lavenza Feb 5, 2022
178167e
Refactors coughing, makes it remove lung reagents
noelle-lavenza May 29, 2022
73a40c4
Update inhaler attackby to use IS_SCREWDRIVER
noelle-lavenza May 29, 2022
8c980ed
Add lung lavage to sleepers
noelle-lavenza May 29, 2022
dc901ea
Adds a breath scanner/breathalyser
noelle-lavenza May 29, 2022
fe106c1
Fix merge conflict
noelle-lavenza May 29, 2022
0bfa32f
Ruin IS_SCREWDRIVER case for staging compatibility
noelle-lavenza May 29, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions code/__defines/chemistry.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#define CHEM_TOUCH 1
#define CHEM_INGEST 2
#define CHEM_INJECT 3
#define CHEM_INHALE 4

#define MINIMUM_CHEMICAL_VOLUME 0.01

Expand Down
4 changes: 4 additions & 0 deletions code/datums/supplypacks/medical.dm
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
/obj/item/clothing/shoes/color/white,
/obj/item/clothing/gloves/latex,
/obj/item/scanner/health,
/obj/item/scanner/breath,
/obj/item/flashlight/pen,
/obj/item/chems/syringe)
containertype = /obj/structure/closet/crate/secure
Expand All @@ -125,6 +126,7 @@
/obj/item/clothing/shoes/color/white,
/obj/item/clothing/gloves/latex,
/obj/item/scanner/health,
/obj/item/scanner/breath,
/obj/item/flashlight/pen,
/obj/item/chems/syringe)
containertype = /obj/structure/closet/crate/secure
Expand All @@ -144,6 +146,7 @@
/obj/item/clothing/gloves/latex,
/obj/item/chems/dropper,
/obj/item/scanner/health,
/obj/item/scanner/breath,
/obj/item/storage/box/pillbottles,
/obj/item/chems/syringe)
containertype = /obj/structure/closet/crate/secure
Expand All @@ -167,6 +170,7 @@
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/gloves/latex,
/obj/item/scanner/health,
/obj/item/scanner/breath,
/obj/item/flashlight/pen,
/obj/item/chems/syringe,
/obj/item/clothing/accessory/storage/vest)
Expand Down
1 change: 1 addition & 0 deletions code/datums/trading/traders/goods.dm
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ Sells devices, odds and ends, and medical stuff
/obj/item/megaphone = TRADER_THIS_TYPE,
/obj/item/paicard = TRADER_THIS_TYPE,
/obj/item/scanner/health = TRADER_THIS_TYPE,
/obj/item/scanner/breath = TRADER_THIS_TYPE,
/obj/item/scanner/gas = TRADER_ALL,
/obj/item/scanner/spectrometer = TRADER_ALL,
/obj/item/scanner/reagent = TRADER_ALL,
Expand Down
27 changes: 27 additions & 0 deletions code/game/machinery/Sleeper.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
var/obj/item/chems/glass/beaker = null
var/filtering = 0
var/pump
var/lavage = FALSE // Are we rinsing reagents from the lungs?
var/list/stasis_settings = list(1, 2, 5, 10)
var/stasis = 1
var/pump_speed
Expand Down Expand Up @@ -123,6 +124,16 @@
ingested.trans_to_obj(beaker, pump_speed * trans_amt)
else
toggle_pump()
if(lavage > 0)
if (beaker)
if (beaker.reagents.total_volume < beaker.reagents.maximum_volume)
var/datum/reagents/inhaled = occupant.get_inhaled_reagents()
var/trans_volume = LAZYLEN(inhaled?.reagent_volumes)
if(inhaled && trans_volume)
inhaled.trans_to_obj(beaker, pump_speed * trans_volume)
else
toggle_lavage()


if(iscarbon(occupant) && stasis > 1)
occupant.SetStasis(stasis)
Expand Down Expand Up @@ -189,6 +200,7 @@
data["beaker"] = -1
data["filtering"] = filtering
data["pump"] = pump
data["lavage"] = lavage
data["stasis"] = stasis
data["skill_check"] = user.skill_check(SKILL_MEDICAL, SKILL_BASIC)
ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)
Expand Down Expand Up @@ -225,6 +237,10 @@
if(filtering != text2num(href_list["pump"]))
toggle_pump()
return TOPIC_REFRESH
if(href_list["lavage"])
if(lavage != text2num(href_list["lavage"]))
toggle_lavage()
return TOPIC_REFRESH
if(href_list["chemical"])
var/obj/canister = locate(href_list["chemical"])
if(istype(canister))
Expand Down Expand Up @@ -305,6 +321,16 @@
to_chat(occupant, SPAN_WARNING("You feel a tube jammed down your throat."))
pump = !pump

/obj/machinery/sleeper/proc/toggle_lavage()
if(!occupant || !beaker)
lavage = 0
return
lavage = !lavage
if (lavage)
to_chat(occupant, SPAN_WARNING("You feel a tube jammed down your throat."))
else
to_chat(occupant, SPAN_NOTICE("You feel a tube retract from your throat."))

/obj/machinery/sleeper/proc/go_in(var/mob/M, var/mob/user)
if(!M || M.anchored)
return
Expand Down Expand Up @@ -364,6 +390,7 @@
beaker = null
toggle_filter()
toggle_pump()
toggle_lavage()

/obj/machinery/sleeper/proc/inject_chemical(var/mob/living/user, var/obj/canister, var/amount, var/target_transfer_type = CHEM_INJECT)
if(stat & (BROKEN|NOPOWER))
Expand Down
7 changes: 4 additions & 3 deletions code/game/machinery/vending/medical.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
/obj/item/chems/syringe/antibiotic = 4,
/obj/item/chems/syringe = 12,
/obj/item/scanner/health = 5,
/obj/item/chems/glass/beaker = 4,
/obj/item/scanner/breath = 5,
/obj/item/chems/glass/beaker = 4,
/obj/item/chems/dropper = 2,
/obj/item/stack/medical/advanced/bruise_pack = 3,
/obj/item/stack/medical/advanced/ointment = 3,
/obj/item/stack/medical/advanced/bruise_pack = 3,
/obj/item/stack/medical/advanced/ointment = 3,
/obj/item/stack/medical/splint = 2,
/obj/item/chems/hypospray/autoinjector/pain = 4
)
Expand Down
4 changes: 2 additions & 2 deletions code/game/objects/effects/effect_system.dm
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ steam.start() -- spawns the effect
M.adjustOxyLoss(1)
if (M.coughedtime != 1)
M.coughedtime = 1
M.emote("cough")
M.cough()
spawn ( 20 )
M.coughedtime = 0

Expand Down Expand Up @@ -265,7 +265,7 @@ steam.start() -- spawns the effect
ADJ_STATUS(M, STAT_ASLEEP, 1)
if (M.coughedtime != 1)
M.coughedtime = 1
M.emote("cough")
M.cough()
spawn ( 20 )
M.coughedtime = 0
/////////////////////////////////////////////
Expand Down
4 changes: 2 additions & 2 deletions code/game/objects/items/devices/flashlight.dm
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,9 @@
var/list/pinpoint = list(/decl/material/liquid/painkillers=5,/decl/material/liquid/amphetamines=1)
var/list/dilating = list(/decl/material/liquid/psychoactives=5,/decl/material/liquid/hallucinogenics=1,/decl/material/liquid/adrenaline=1)
var/datum/reagents/ingested = H.get_ingested_reagents()
if(H.reagents.has_any_reagent(pinpoint) || ingested.has_any_reagent(pinpoint))
if(H.reagents.has_any_reagent(pinpoint) || ingested?.has_any_reagent(pinpoint))
to_chat(user, "<span class='notice'>\The [H]'s pupils are already pinpoint and cannot narrow any more.</span>")
else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested.has_any_reagent(dilating))
else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested?.has_any_reagent(dilating))
to_chat(user, "<span class='notice'>\The [H]'s pupils narrow slightly, but are still very dilated.</span>")
else
to_chat(user, "<span class='notice'>\The [H]'s pupils narrow.</span>")
Expand Down
118 changes: 118 additions & 0 deletions code/game/objects/items/devices/scanners/breath.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/obj/item/scanner/breath
name = "breath analyzer"
desc = "A two-in-one breathalyzer and respirometer, measuring intoxication, breath contents, and respiratory health."
icon = 'icons/obj/items/device/scanner/breath_scanner.dmi'
icon_state = "breath_analyzer"
item_state = "analyzer"
item_flags = ITEM_FLAG_NO_BLUDGEON
material = /decl/material/solid/metal/aluminium
origin_tech = "{'biotech':1}"
printout_color = "#deebff"
var/mode = 1

/obj/item/scanner/breath/is_valid_scan_target(atom/O)
return istype(O, /mob/living/carbon)

/obj/item/scanner/breath/scan(atom/A, mob/user)
scan_data = breath_scan_action(A, user, src, mode)
playsound(src, 'sound/effects/fastbeep.ogg', 20)

/proc/breath_scan_action(mob/living/carbon/target, mob/living/user, obj/scanner, var/verbose)
if (!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS) || !istype(target))
return

. = breath_scan_results(target, verbose, user.get_skill_value(SKILL_MEDICAL))
to_chat(user, "<hr>")
to_chat(user, .)
to_chat(user, "<hr>")

/proc/breath_scan_results(var/mob/living/carbon/C, var/verbose, var/skill_level = SKILL_DEFAULT)
. = list()
var/header = list()
var/b
var/endb
var/dat = list()

if(skill_level >= SKILL_BASIC)
header += "<style> .scan_notice{color: #5f94af;}</style>"
header += "<style> .scan_warning{color: #ff0000; font-style: italic;}</style>"
header += "<style> .scan_danger{color: #ff0000; font-weight: bold;}</style>"
header += "<style> .scan_red{color:red}</style>"
header += "<style> .scan_green{color:green}</style>"
header += "<style> .scan_blue{color: #5f94af}</style>"
header += "<style> .scan_orange{color:#ffa500}</style>"
b = "<b>"
endb = "</b>"

. += "[b]Breath sample results for \the [C]:[endb]"

var/obj/item/organ/internal/lungs/lungs = C.get_organ(BP_LUNGS)
var/breathing = "none"
if(istype(lungs) && !(C.status_flags & FAKEDEATH))
if(lungs.breath_fail_ratio < 0.3)
breathing = "normal"
else if(lungs.breath_fail_ratio < 1)
breathing = "shallow"

switch(breathing)
if("none")
. += "<span class='scan_danger'>Alert: No breathing detected.</span>"
return
if("shallow")
. += "<span class='scan_warning'>Subject's breathing is abnormally shallow.</span>"
if("normal")
. += "<span class='scan_notice'>Subject's breathing is normal.</span>"

// Other general warnings.
if(skill_level >= SKILL_BASIC)
switch(C.getOxyLoss())
if(0 to 25)
dat += "<span class='scan_green'>Subject oxygen levels nominal.</span>"
if(25 to 50)
dat += "<span class='scan_orange'>Subject oxygen levels abnormal.</span>"
if(50 to INFINITY)
dat += "<span class='scan_blue'>[b]Severe oxygen deprivation detected.[endb]</span>"

if(istype(lungs))
if(lungs.is_broken())
dat += "<span class='scan_danger'>[b]Tension pneumothorax detected.[endb]</span>"
else if(lungs.is_bruised())
dat += "<span class='scan_warning'>Collapsed lung detected.</span>"
else
dat += "<span class='scan_green'>Subject lung health nominal.</span>"
else
dat += "<span class='scan_warning'>Subject lung health unknown.</span>"

. += (skill_level < SKILL_BASIC) ? shuffle(dat) : dat

// Reagent data.
. += "[b]Reagent scan:[endb]"

var/print_reagent_default_message = TRUE
if (C.has_chemical_effect(CE_ALCOHOL))
. += "<span class='scan_orange'>Alcohol detected in subject's breath.</span>"
print_reagent_default_message = FALSE
if (C.has_chemical_effect(CE_ALCOHOL_TOXIC))
. += "<span class='scan_red'>Subject is suffering from alcohol poisoning.</span>"
print_reagent_default_message = FALSE

var/datum/reagents/inhaled = C.get_inhaled_reagents()
if(inhaled && inhaled.total_volume)
var/unknown = 0
for(var/rtype in inhaled.reagent_volumes)
var/decl/material/R = GET_DECL(rtype)
if(R.scannable)
print_reagent_default_message = FALSE
. += "<span class='scan_notice'>[R.name] found in subject's breath.</span>"
else
++unknown
if(unknown)
print_reagent_default_message = FALSE
. += "<span class='scan_warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's breath.</span>"

if(print_reagent_default_message)
. += "No results."

header = jointext(header, null)
. = jointext(.,"<br>")
. = jointext(list(header,.),null)
14 changes: 14 additions & 0 deletions code/game/objects/items/devices/scanners/health.dm
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,20 @@
print_reagent_default_message = FALSE
. += "<span class='scan_warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach.</span>"

var/datum/reagents/inhaled = H.get_inhaled_reagents()
if(inhaled && inhaled.total_volume)
var/unknown = 0
for(var/rtype in inhaled.reagent_volumes)
var/decl/material/R = GET_DECL(rtype)
if(R.scannable)
print_reagent_default_message = FALSE
. += "<span class='scan_notice'>[R.name] found in subject's lungs.</span>"
else
++unknown
if(unknown)
print_reagent_default_message = FALSE
. += "<span class='scan_warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's lungs.</span>"

if(length(H.chem_doses))
var/list/chemtraces = list()
for(var/T in H.chem_doses)
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/ecigs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
Deactivate()
to_chat(C,"<span class='notice'>\The [src]'s power meter flashes a low battery warning and shuts down.</span>")
return
ec_cartridge.reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.4) // Most of it is not inhaled... balance reasons.
ec_cartridge.reagents.trans_to_mob(C, REM, CHEM_INHALE, 0.4) // Most of it is not inhaled... balance reasons.

/obj/item/clothing/mask/smokable/ecig/on_update_icon()
..()
Expand Down
2 changes: 2 additions & 0 deletions code/game/objects/items/weapons/storage/belt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@
icon = 'icons/clothing/belt/medical.dmi'
can_hold = list(
/obj/item/scanner/health,
/obj/item/scanner/breath,
/obj/item/chems/dropper,
/obj/item/chems/glass/beaker,
/obj/item/chems/glass/bottle,
Expand All @@ -166,6 +167,7 @@
/obj/item/clothing/head/surgery,
/obj/item/clothing/gloves/latex,
/obj/item/chems/hypospray,
/obj/item/chems/inhaler,
/obj/item/clothing/glasses/hud/health,
/obj/item/crowbar,
/obj/item/flashlight,
Expand Down
Loading