diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 980ec38909..5bd9632355 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -149,6 +149,27 @@ name = "Choking (Plasma)" desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." icon_state = "too_much_tox" + +/obj/screen/alert/not_enough_ch4 + name = "Choking (No CH4)" + desc = "You're not getting enough methane. Find some good air before you pass out!" + icon_state = "not_enough_ch4" + +/obj/screen/alert/too_much_ch4 + name = "Choking (CH4)" + desc = "There's too much methane in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_ch4" + +/obj/screen/alert/not_enough_ch3br + name = "Choking (No CH3Br)" + desc = "You're not getting enough methyl bromide. Find some good air before you pass out!" + icon_state = "not_enough_tox" + +/obj/screen/alert/too_much_ch3br + name = "Choking (CH3Br)" + desc = "There's highly toxic methyl bromide in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." + icon_state = "too_much_tox" + //End gas alerts diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 1c90a83c0a..d16d1b29f1 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -182,3 +182,20 @@ /obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas() return + +/* + * Methyl Bromide + */ +/obj/item/tank/internals/methyl_bromide + name = "mantid gas reactor" + desc = "A mantid gas processing plant that continuously synthesises 'breathable' atmosphere." + icon_state = "methyl_bromide" + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + force = 6 + distribute_pressure = 14 + volume = 10 + +/obj/item/tank/internals/methyl_bromide/populate_gas() + air_contents.set_moles(/datum/gas/methyl_bromide, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + return \ No newline at end of file diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index c7ffc51458..fa5641254e 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -186,6 +186,20 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g moles_visible = MOLES_GAS_VISIBLE * 60 rarity = 250 +/datum/gas/methane + id = "methane" + specific_heat = 30 + name = "Methane" + rarity = 320 + +/datum/gas/methyl_bromide + id = "methyl_bromide" + specific_heat = 42 + name = "Methyl Bromide" + dangerous = TRUE + rarity = 310 + + /obj/effect/overlay/gas icon = 'icons/effects/atmospherics.dmi' mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 8316b29a24..a2a55ee6b1 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -97,7 +97,7 @@ /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5), + /datum/gas/miasma = new/datum/tlv(-1, -1, 2, 5), /datum/gas/plasma = new/datum/tlv/dangerous, /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, /datum/gas/bz = new/datum/tlv/dangerous, @@ -106,7 +106,9 @@ /datum/gas/tritium = new/datum/tlv/dangerous, /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects /datum/gas/nitryl = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + /datum/gas/methane = new/datum/tlv(-1, -1, 3, 6), + /datum/gas/methyl_bromide = new/datum/tlv/dangerous ) /obj/machinery/airalarm/server // No checks here. @@ -125,7 +127,9 @@ /datum/gas/tritium = new/datum/tlv/no_checks, /datum/gas/stimulum = new/datum/tlv/no_checks, /datum/gas/nitryl = new/datum/tlv/no_checks, - /datum/gas/pluoxium = new/datum/tlv/no_checks + /datum/gas/pluoxium = new/datum/tlv/no_checks, + /datum/gas/methane = new/datum/tlv/no_checks, + /datum/gas/methyl_bromide = new/datum/tlv/no_checks ) /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. @@ -144,7 +148,9 @@ /datum/gas/tritium = new/datum/tlv/dangerous, /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects /datum/gas/nitryl = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + /datum/gas/methane = new/datum/tlv(-1, -1, 3, 6), + /datum/gas/methyl_bromide = new/datum/tlv/dangerous ) /obj/machinery/airalarm/unlocked @@ -542,7 +548,9 @@ /datum/gas/tritium, /datum/gas/bz, /datum/gas/stimulum, - /datum/gas/pluoxium + /datum/gas/pluoxium, + /datum/gas/methane, + /datum/gas/methyl_bromide ), "scrubbing" = 1, "widenet" = 1, diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c66aabd57f..0eebf22be4 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -50,7 +50,9 @@ "stimulum" = /obj/machinery/portable_atmospherics/canister/stimulum, "pluoxium" = /obj/machinery/portable_atmospherics/canister/pluoxium, "caution" = /obj/machinery/portable_atmospherics/canister, - "miasma" = /obj/machinery/portable_atmospherics/canister/miasma + "miasma" = /obj/machinery/portable_atmospherics/canister/miasma, + "methane" = /obj/machinery/portable_atmospherics/canister/methane, + "methyl bromide" = /obj/machinery/portable_atmospherics/canister/methyl_bromide ) /obj/machinery/portable_atmospherics/canister/interact(mob/user) @@ -62,7 +64,7 @@ /obj/machinery/portable_atmospherics/canister/nitrogen name = "n2 canister" - desc = "Nitrogen gas. Reportedly useful for something." + desc = "Nitrogen. Reportedly useful for something." icon_state = "red" gas_type = /datum/gas/nitrogen @@ -80,19 +82,19 @@ /obj/machinery/portable_atmospherics/canister/toxins name = "plasma canister" - desc = "Plasma gas. The reason YOU are here. Highly toxic." + desc = "Plasma. The reason YOU are here. Highly toxic." icon_state = "orange" gas_type = /datum/gas/plasma /obj/machinery/portable_atmospherics/canister/bz name = "\improper BZ canister" - desc = "BZ, a powerful hallucinogenic nerve agent." + desc = "BZ. A powerful hallucinogenic nerve agent." icon_state = "purple" gas_type = /datum/gas/bz /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "n2o canister" - desc = "Nitrous oxide gas. Known to cause drowsiness." + desc = "Nitrous oxide. Known to cause drowsiness." icon_state = "redws" gas_type = /datum/gas/nitrous_oxide @@ -115,7 +117,7 @@ /obj/machinery/portable_atmospherics/canister/nitryl name = "nitryl canister" - desc = "Nitryl gas. Feels great 'til the acid eats your lungs." + desc = "Nitryl. Feels great 'til the acid eats your lungs." icon_state = "brown" gas_type = /datum/gas/nitryl @@ -133,7 +135,7 @@ /obj/machinery/portable_atmospherics/canister/water_vapor name = "water vapor canister" - desc = "Water Vapor. We get it, you vape." + desc = "Water vapor. We get it, you vape." icon_state = "water_vapor" gas_type = /datum/gas/water_vapor filled = 1 @@ -145,6 +147,18 @@ gas_type = /datum/gas/miasma filled = 1 +/obj/machinery/portable_atmospherics/canister/methane + name = "methane canister" + desc = "Methane. The simplest of hydrocarbons. Non-toxic but highly flammable." + icon_state = "greyblackred" + gas_type = /datum/gas/methane + +/obj/machinery/portable_atmospherics/canister/methyl_bromide + name = "methyl bromide canister" + desc = "Methyl bromide. A potent toxin to most, essential for the Kharmaan to live." + icon_state = "purplecyan" + gas_type = /datum/gas/methyl_bromide + /obj/machinery/portable_atmospherics/canister/proc/get_time_left() if(timing) . = round(max(0, valve_timer - world.time) / 10, 1) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 56ab1f1b10..68e8c5ac29 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -96,6 +96,8 @@ throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) else if(S.breathid == "n2") throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + else if(S.breathid == "ch3br") + throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) return FALSE else diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index adb092cc16..2e210bd6e4 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -36,6 +36,10 @@ var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? var/safe_toxins_min = 0 var/safe_toxins_max = MOLES_GAS_VISIBLE + var/safe_ch3br_min = 0 + var/safe_ch3br_max = 1 //problematic even at low concentrations + var/safe_methane_min = 0 + var/safe_methane_max = 0 var/SA_para_min = 1 //Sleeping agent var/SA_sleep_min = 5 //Sleeping agent var/BZ_trip_balls_min = 1 //BZ gas @@ -53,6 +57,9 @@ var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE var/tox_damage_type = TOX + var/methane_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/methane_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/methane_damage_type = OXY var/cold_message = "your face freezing and an icicle forming" var/cold_level_1_threshold = 260 @@ -129,6 +136,8 @@ H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) else if(safe_nitro_min) H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + else if(safe_ch3br_min) + H.throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) return FALSE var/gas_breathed = 0 @@ -138,6 +147,8 @@ var/N2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrogen)) var/Toxins_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma)) var/CO2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/carbon_dioxide)) + var/CH4_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/methane)) + var/CH3Br_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/methyl_bromide)) //-- OXY --// @@ -278,6 +289,58 @@ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) gas_breathed = 0 +//-- METHANE --// + + //Too much methane! + if(safe_methane_max) + if(CH4_pp > safe_methane_max) //Same effect as excess nitrogen, generally nontoxic + var/ratio = (breath.get_moles(/datum/gas/methane)/safe_methane_max) * 10 + H.apply_damage_type(clamp(ratio, methane_breath_dam_min, methane_breath_dam_max), methane_damage_type) + H.throw_alert("too_much_ch4", /obj/screen/alert/too_much_ch4) + H.losebreath += 2 + else + H.clear_alert("too_much_ch4") + //Too little methane! + if(safe_methane_min) + if(CH4_pp < safe_methane_min) + gas_breathed = handle_too_little_breath(H, CH4_pp, safe_methane_min, breath.get_moles(/datum/gas/methane)) + H.throw_alert("not_enough_ch4", /obj/screen/alert/not_enough_ch4) + else + H.failed_last_breath = FALSE + if(H.health >= H.crit_threshold) + H.adjustOxyLoss(-breathModifier) + gas_breathed = breath.get_moles(/datum/gas/methane) + H.clear_alert("not_enough_ch4") + + //Exhale + breath.adjust_moles(/datum/gas/methane, -gas_breathed) + breath.adjust_moles(/datum/gas/methyl_bromide, gas_breathed) + gas_breathed = 0 + +//-- CH3BR --// + + //Too much methyl bromide! + if(safe_ch3br_max) + if(CH3Br_pp > safe_ch3br_max) + if(prob(CH3Br_pp/0.5)) + H.adjustOrganLoss(ORGAN_SLOT_LUNGS, 3, 150) //Inhaling this is a bad idea + if(prob(CH3Br_pp/2)) + to_chat(H, "Your throat closes up!") + H.silent = max(H.silent, 3) + H.throw_alert("too_much_ch3br", /obj/screen/alert/too_much_ch3br) + else + H.clear_alert("too_much_ch3br") + //Too little methyl bromide! + if(safe_ch3br_min) + if(CH3Br_pp < safe_ch3br_min) + gas_breathed = handle_too_little_breath(H, CH3Br_pp, safe_ch3br_min, breath.get_moles(/datum/gas/methyl_bromide)) + H.throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) + else + H.failed_last_breath = FALSE + if(H.health >= H.crit_threshold) + H.adjustOxyLoss(-breathModifier) + gas_breathed = breath.get_moles(/datum/gas/methyl_bromide) + H.clear_alert("not_enough_ch3br") //-- TRACES --// diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index e64c037cf8..75ee2b35e6 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 644c32fe30..719ed72226 100644 Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 0c0d220373..aa24883656 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ