diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index a4d9ca87384..9be75ea5367 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -23,6 +23,7 @@ #define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! #define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT) +#define AUTOEXTINGUISH 16384 // Suits that have this will automatically extinguish a burning mob when worn. //Reagent flags #define REAGENT_NOREACT 1 @@ -43,6 +44,7 @@ #define ALL_RPARTS 2048 #define NOGUNS 4096 #define NOTRANSSTING 8192 +#define PLASMA_BASED 16384 //Species clothing flags #define HAS_UNDERWEAR 1 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c80c13d514b..de39921c970 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -497,6 +497,11 @@ BLIND // can't see anything else to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.") +/obj/item/clothing/suit/proc/auto_extinguish(var/mob/living/carbon/human/user) + if(istype(user)) + to_chat(user, "You hear a soft click and a hiss from your suit as it automatically extinguishes the fire.") + user.ExtinguishMob() + /obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis. ..() if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 73fa69d297c..8ccf0a0a413 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -11,7 +11,7 @@ flags_inv = HIDEGLOVES|HIDESHOES max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT species_restricted = list("Plasmaman") - flags = STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE | AUTOEXTINGUISH icon_state = "plasmaman_suit" item_state = "plasmaman_suit" @@ -24,16 +24,14 @@ ..(user) to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit.") -/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user) - var/mob/living/carbon/human/H=user - if(extinguishes_left) +/obj/item/clothing/suit/space/eva/plasmaman/auto_extinguish(var/mob/living/carbon/human/H) + if(istype(H) && extinguishes_left) if(next_extinguish > world.time) return next_extinguish = world.time + extinguish_cooldown extinguishes_left-- - to_chat(H, "Your suit automatically extinguishes the fire.") - H.ExtinguishMob() + ..() /obj/item/clothing/head/helmet/space/eva/plasmaman name = "plasmaman helmet" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index b2e609c92f2..6d31c53263e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -485,6 +485,8 @@ if(on_fire) var/thermal_protection = get_thermal_protection() + if(wear_suit && wear_suit.flags & AUTOEXTINGUISH) + wear_suit.auto_extinguish(src) if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) return if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 05f24facc65..bb8d1a59100 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -6,7 +6,7 @@ //language = "Clatter" unarmed_type = /datum/unarmed_attack/punch - flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING + flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING | PLASMA_BASED dietflags = DIET_OMNI reagent_tag = PROCESS_ORG @@ -15,6 +15,7 @@ butt_sprite = "plasma" breath_type = "plasma" + poison_type = null heat_level_1 = 350 // Heat damage level 1 above this point. heat_level_2 = 400 // Heat damage level 2 above this point. diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index e8505d64653..70482a10489 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -39,6 +39,25 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 +/datum/reagent/oxygen/on_mob_life(var/mob/living/carbon/human/H) + if(istype(H) && H.species && H.species.poison_type && H.species.poison_type == id) + H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma. + if(istype(H) && H.species && H.species.flags & PLASMA_BASED) //Oxygen lights up plasma-based lifeforms. + if(prob(60)) + H.adjust_fire_stacks(0.25) + if(prob(40)) + H.IgniteMob() //Light them up. + ..() + +/datum/reagent/oxygen/reaction_mob(var/mob/living/carbon/human/H, method=TOUCH, volume) + if(istype(H) && H.species && H.species.flags & PLASMA_BASED) //Oxygen lights up plasma-based lifeforms. + if(method == INGEST) + to_chat(H, "You feel a horrible burning from within as your body bursts into flame!") + if(method == TOUCH) + to_chat(H, "Your body bursts into flames as it comes into contact with the substance!") + H.adjust_fire_stacks(1) //Same as phlogiston, guaranteed one-time firestack delivery and ignition. + H.IgniteMob() + ..() /datum/reagent/nitrogen name = "Nitrogen" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index 9fc96c714a8..48d8c33977d 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -22,7 +22,12 @@ color = "#7A2B94" /datum/reagent/plasma/on_mob_life(mob/living/M) - M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) + var/mob/living/carbon/human/H = M + if(istype(H) && H.species && H.species.flags & PLASMA_BASED) //Plasma shouldn't poison plasmamen. + if(prob(20)) + H.heal_organ_damage(1, 1) + else + M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) if(holder.has_reagent("epinephrine")) holder.remove_reagent("epinephrine", 2) if(iscarbon(M))