diff --git a/code/datums/spell.dm b/code/datums/spell.dm index c01f7c427e6..ec7d7f0a6e8 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -198,20 +198,20 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(istype(target,/mob/living) && message) target << text("[message]") if(sparks_spread) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/effect/system/spark_spread/sparks = new sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is sparks.start() if(smoke_spread) if(smoke_spread == 1) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // if more than one smoke, spread it around smoke.start() else if(smoke_spread == 2) - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() + var/datum/effect/effect/system/smoke_spread/bad/smoke = new smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here smoke.start() else if(smoke_spread == 3) - var/datum/effect/effect/system/sleep_smoke_spread/smoke = new /datum/effect/effect/system/sleep_smoke_spread() + var/datum/effect/effect/system/smoke_spread/sleeping/smoke = new smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here smoke.start() diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index a621168182a..99a9cafeedc 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -64,7 +64,7 @@ H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later." /obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "") - PoolOrNew(/obj/effect/effect/harmless_smoke, T) + PoolOrNew(/obj/effect/effect/smoke, T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 3a6ef5e1d26..809ad10de19 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -90,11 +90,11 @@ /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) ..(1) // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect/effect/system/chem_smoke_spread/S = new + var/datum/effect/effect/system/smoke_spread/chem/S = new var/turf/location = get_turf(src) // Create the reagents to put into the air - create_reagents(25) + create_reagents(2) if(overmind && overmind.blob_reagent_datum) reagents.add_reagent(overmind.blob_reagent_datum.id, 25) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index d6abcab574f..a6873eeb611 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -346,10 +346,10 @@ B.reagents.clear_reagents() //Just in case! B.icon_state = null //Invisible B.reagents.add_reagent("blindness_smoke", 10) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(B) if(S) - S.set_up(B.reagents, 10, 0, B.loc) + S.set_up(10, 0, B.loc, null, 0, B.reagents) S.start() sleep(10) S.start() diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 3040c71c68f..f32f41fab3a 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -487,8 +487,9 @@ if ((get_dist(src, patient) <= 1) && (on)) if(reagent_id == "internal_beaker") if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume) + var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1) + reagent_glass.reagents.reaction(patient, INGEST, fraction) reagent_glass.reagents.trans_to(patient,injection_amount) //Inject from beaker instead. - reagent_glass.reagents.reaction(patient, INGEST) else patient.reagents.add_reagent(reagent_id,injection_amount) C.visible_message("[src] injects [patient] with its syringe!", \ diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e5961c09fc9..c7cce94f929 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -107,7 +107,8 @@ if(istype(beaker, /obj/item/weapon/reagent_containers/blood)) // speed up transfer on blood packs transfer_amount = 10 - beaker.reagents.reaction(attached, INGEST, 1,0) //make reagents reacts, but don't spam messages + var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume + beaker.reagents.reaction(attached, INGEST, fraction,0) //make reagents reacts, but don't spam messages beaker.reagents.trans_to(attached, transfer_amount) update_icon() diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 15dadd6456d..89580944e01 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -13,7 +13,7 @@ var/smoke = 5 var/smoke_ready = 1 var/smoke_cooldown = 100 - var/datum/effect/effect/system/harmless_smoke_spread/smoke_system = new + var/datum/effect/effect/system/smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) wreckage = /obj/structure/mecha_wreckage/marauder add_req_access = 0 diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 3c314ee975c..c0f69672087 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -27,7 +27,7 @@ /obj/effect/anomaly/proc/anomalyNeutralize() - PoolOrNew(/obj/effect/effect/bad_smoke, loc) + PoolOrNew(/obj/effect/effect/smoke/bad, loc) for(var/atom/movable/O in src) O.loc = src.loc diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index eb84812588f..8953cc09c7a 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -16,7 +16,7 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/effect/Destroy() ..() return QDEL_HINT_PUTINPOOL - +/* /datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16) if(A.alpha == 0) //Handle already transparent case return @@ -27,7 +27,7 @@ would spawn and follow the beaker, even if it is carried or thrown. A.alpha -= step sleep(world.tick_lag) return - +*/ /datum/effect/effect/system var/number = 3 var/cardinals = 0 diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 96d7433cead..81596aa8a74 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -10,10 +10,10 @@ layer = TURF_LAYER + 0.1 mouse_opacity = 0 var/amount = 3 - var/expand = 1 animate_movement = 0 var/metal = 0 var/lifetime = 6 + var/max_lifetime = 6 /obj/effect/effect/foam/metal/aluminium @@ -36,16 +36,20 @@ /obj/effect/effect/foam/Destroy() SSobj.processing.Remove(src) return ..() - +/* /obj/effect/effect/foam/metal/New(loc) ..() var/obj/structure/foamedmetal/M = new(src.loc) M.metal = metal - M.updateicon() + M.updateicon()*/ /obj/effect/effect/foam/proc/kill_foam() SSobj.processing.Remove(src) + if(metal) + var/obj/structure/foamedmetal/M = new(src.loc) + M.metal = metal + M.updateicon() flick("[icon_state]-disolve", src) spawn(5) qdel(src) @@ -55,21 +59,36 @@ lifetime-- if(lifetime < 1) kill_foam() + return + + var/fraction = 1/max_lifetime + for(var/obj/O in range(0,src)) + if(O.type == src.type) + continue + reagents.reaction(O, TOUCH, fraction) + for(var/mob/living/L in range(0,src)) + foam_mob(L) + var/T = get_turf(src) + reagents.reaction(T, TOUCH, fraction) + if(--amount < 0) return - for(var/atom/M in view(1,src)) - if(M == src) - continue - reagents.reaction(M, TOUCH) spread_foam() +/obj/effect/effect/foam/proc/foam_mob(var/mob/living/L as mob) + if(lifetime<1) + return + if(!istype(L)) + return + var/fraction = 1/max_lifetime + reagents.reaction(L, TOUCH, fraction) + lifetime-- /obj/effect/effect/foam/Crossed(var/atom/movable/AM) if(istype(AM, /mob/living/carbon)) var/mob/living/carbon/M = AM M.slip(5, 2, src) - /obj/effect/effect/foam/metal/Crossed(var/atom/movable/AM) return @@ -87,10 +106,14 @@ if(foundfoam) continue - var/obj/effect/effect/foam/F = PoolOrNew(/obj/effect/effect/foam, T) + for(var/mob/living/L in T) + foam_mob(L) + var/obj/effect/effect/foam/F = PoolOrNew(src.type, T) F.amount = amount reagents.copy_to(F, (reagents.total_volume)) F.color = color + F.metal = metal + F.max_lifetime = max_lifetime /obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -136,7 +159,6 @@ amount = round(sqrt(amt / 2), 1) carry.copy_to(chemholder, carry.total_volume) - /datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metaltype) ..() metal = metaltype @@ -148,11 +170,12 @@ else var/obj/effect/effect/foam/F = PoolOrNew(foamtype, location) var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list) - chemholder.reagents.copy_to(F, chemholder.reagents.total_volume) + chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount) //how much reagents each foam cell holds F.color = foamcolor F.amount = amount F.metal = metal - + F.max_lifetime = Clamp(round(sqrt(chemholder.reagents.total_volume/2), 1), 3, 10) //how long each foam cell lasts. + F.lifetime = F.max_lifetime ////////////////////////////////////////////////////////// // FOAM STRUCTURE. Formed by metal foams. Dense and opaque, but easy to break diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 2d7cba31150..9e071a63205 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -6,37 +6,92 @@ /obj/effect/effect/smoke name = "smoke" - icon = 'icons/effects/water.dmi' - icon_state = "smoke" - opacity = 1 - anchored = 0.0 - mouse_opacity = 0 - var/amount = 8.0 - -/obj/effect/effect/harmless_smoke - name = "smoke" - icon_state = "smoke" - opacity = 1 - anchored = 0.0 - mouse_opacity = 0 - var/amount = 6.0 - //Remove this bit to use the old smoke icon = 'icons/effects/96x96.dmi' pixel_x = -32 pixel_y = -32 - -/obj/effect/effect/harmless_smoke/New() - ..() - spawn (100) - qdel(src) - -/datum/effect/effect/system/harmless_smoke_spread - var/total_smoke = 0 // To stop it being spammed and lagging! + icon_state = "smoke" + opacity = 1 + anchored = 0 + mouse_opacity = 0 + var/steps = 0 + var/lifetime = 10 var/direction + var/fading = 0 -/datum/effect/effect/system/harmless_smoke_spread/set_up(n = 5, c = 0, loca, direct) - if(n > 10) - n = 10 + +/obj/effect/effect/smoke/proc/fade_out(var/frames = 16) + if(alpha == 0) //Handle already transparent case + return + if(frames == 0) + frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame". + var/step = alpha / frames + for(var/i = 0, i < frames, i++) + alpha -= step + sleep(world.tick_lag) + +/obj/effect/effect/smoke/New() + ..() + create_reagents(500) + SSobj.processing.Add(src) + lifetime = lifetime + rand(1,3) + +/obj/effect/effect/smoke/Destroy() + SSobj.processing.Remove(src) + ..() + +/obj/effect/effect/smoke/proc/kill_smoke() + SSobj.processing.Remove(src) + qdel(src) + +/obj/effect/effect/smoke/process() + world << "Process" + lifetime-- + if(lifetime < 3 && !fading) + fading = 1 + spawn(0) + fade_out(100) + if(lifetime < 1) + kill_smoke() + return 0 + if(steps >= 1) + step(src,direction) + steps-- + return 1 + +/obj/effect/effect/smoke/Crossed(mob/living/M as mob) + if(!istype(M)) + return + smoke_mob(M) + +/obj/effect/effect/smoke/Cross(mob/living/M as mob) + if(!istype(M)) + return + smoke_mob(M) + +/obj/effect/effect/smoke/proc/smoke_mob(mob/living/carbon/M as mob) + if(!istype(M)) + return 0 + if(lifetime<1) + return 0 + if(M.internal != null || (M.wear_mask && (M.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + return 0 + if(M.smoke_delay) + return 0 + M.smoke_delay++ + spawn(10) + if(M) + M.smoke_delay = 0 + return 1 + + + +/datum/effect/effect/system/smoke_spread + var/direction + var/smoke_type = /obj/effect/effect/smoke + +/datum/effect/effect/system/smoke_spread/set_up(n = 5, c = 0, loca, direct) + if(n > 20) + n = 20 number = n cardinals = c if(istype(loca, /turf/)) @@ -46,70 +101,39 @@ if(direct) direction = direct +/datum/effect/effect/system/smoke_spread/start() + for(var/i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/harmless_smoke/smoke = PoolOrNew(/obj/effect/effect/harmless_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - -/datum/effect/effect/system/bad_smoke_spread/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/bad_smoke/smoke = PoolOrNew(/obj/effect/effect/bad_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i= 1) - reagents.reaction(A, TOUCH) - reagents.trans_to(A.reagents, 10) - return - - -/obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob ) - ..() - if(reagents.total_volume >= 1) - reagents.reaction(M, TOUCH) - reagents.trans_to(M.reagents, 10) - -/datum/effect/effect/system/chem_smoke_spread - var/total_smoke = 0 // To stop it being spammed and lagging! - var/direction +/datum/effect/effect/system/smoke_spread/chem var/obj/chemholder + smoke_type = /obj/effect/effect/smoke/chem - -/datum/effect/effect/system/chem_smoke_spread/New() +/datum/effect/effect/system/smoke_spread/chem/New() ..() chemholder = PoolOrNew(/obj) var/datum/reagents/R = new/datum/reagents(500) chemholder.reagents = R R.my_atom = chemholder -/datum/effect/effect/system/chem_smoke_spread/Destroy() +/datum/effect/effect/system/smoke_spread/chem/Destroy() chemholder = null ..() return QDEL_HINT_PUTINPOOL -/datum/effect/effect/system/chem_smoke_spread/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0) +/datum/effect/effect/system/smoke_spread/chem/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0) if(n > 20) n = 20 number = n cardinals = c - carry.copy_to(chemholder, carry.total_volume) - - if(istype(loca, /turf/)) location = loca else location = get_turf(loca) - if(direct) direction = direct + carry.copy_to(chemholder, carry.total_volume) if(!silent) var/contained = "" @@ -270,140 +232,63 @@ log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") -/datum/effect/effect/system/chem_smoke_spread/start() - var/i = 0 +/datum/effect/effect/system/smoke_spread/chem/start() var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/chem_smoke/smoke = PoolOrNew(/obj/effect/effect/chem_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - - if(chemholder.reagents.total_volume != 1) // can't split 1 very well - chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly - - if(color) - smoke.color = color // give the smoke color, if it has any to begin with + for(var/i=0, i 1) // can't split 1 very well + chemholder.reagents.copy_to(S, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly + if(color) + S.color = color // give the smoke color, if it has any to begin with + else + // if no color, just use the old smoke icon + S.icon = 'icons/effects/96x96.dmi' + S.icon_state = "smoke" + S.process() //calling process right now so the smoke immediately attacks mobs. ///////////////////////////////////////////// // Sleep smoke ///////////////////////////////////////////// -/obj/effect/effect/sleep_smoke - name = "smoke" - icon_state = "smoke" - opacity = 1 - anchored = 0.0 - mouse_opacity = 0 - var/amount = 6.0 - //Remove this bit to use the old smoke - icon = 'icons/effects/96x96.dmi' - pixel_x = -32 - pixel_y = -32 +/obj/effect/effect/smoke/sleeping color = "#9C3636" -/obj/effect/effect/sleep_smoke/New() - ..() - spawn (200+rand(10,30)) - qdel(src) +/obj/effect/effect/smoke/sleeping/process() + for(var/mob/living/carbon/M in range(1,src)) + smoke_mob(M) -/obj/effect/effect/sleep_smoke/Move() - ..() - for(var/mob/living/carbon/M in get_turf(src)) - if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS)) -// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // I'll work on it later - else - M.drop_item() - M:sleeping += 5 - if (M.coughedtime != 1) - M.coughedtime = 1 - M.emote("cough") - spawn(20) - if(M && M.loc) - M.coughedtime = 0 - return - -/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob ) - ..() - if(istype(M, /mob/living/carbon)) - if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS)) -// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // Work on it later +/obj/effect/effect/smoke/sleeping/smoke_mob(mob/living/carbon/M as mob) + if(..()) + if(M.internal != null || (M.wear_mask && (M.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) return else M.drop_item() - M:sleeping += 5 - if (M.coughedtime != 1) - M.coughedtime = 1 - M.emote("cough") - spawn(20) - if(M && M.loc) - M.coughedtime = 0 - return - -/datum/effect/effect/system/sleep_smoke_spread - var/total_smoke = 0 // To stop it being spammed and lagging! - var/direction - -/datum/effect/effect/system/sleep_smoke_spread/set_up(n = 5, c = 0, loca, direct) - if(n > 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct + M.sleeping = max(M.sleeping,10) + M.emote("cough") -/datum/effect/effect/system/sleep_smoke_spread/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/sleep_smoke/smoke = PoolOrNew(/obj/effect/effect/sleep_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 0) .-- //it survives the acid... break - if(.) + if(. && prob(min(meltingpwr/10,90))) //chance to melt depends on acid power and volume. var/turf/T = get_turf(src) if(T) - T.visible_message("[src] melts away!") var/obj/effect/decal/cleanable/molten_item/I = new (T) I.pixel_x = rand(-16,16) I.pixel_y = rand(-16,16) I.desc = "Looks like this was \an [src] some time ago." + if(istype(src,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = src + S.do_quick_empty() //melted storage item drops its content. qdel(src) else for(var/armour_value in armor) //but is weakened - armor[armour_value] = max(armor[armour_value]-acidpwr,0) + armor[armour_value] = max(armor[armour_value]-min(acidpwr,meltingpwr/10),0) if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc. desc += " it looks slightly melted..." //needs a space at the start, formatting diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 99bde856d35..a18807d3bb9 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -203,14 +203,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/proc/handle_reagents() - if(iscarbon(loc)) - var/mob/living/carbon/C = loc - if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob - if(prob(15)) // so it's not an instarape in case of acid - reagents.reaction(C, INGEST) - reagents.trans_to(C, REAGENTS_METABOLISM) - return - reagents.remove_any(REAGENTS_METABOLISM) + if(reagents.total_volume) + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob + if(prob(15)) // so it's not an instarape in case of acid + var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1) + reagents.reaction(C, INGEST, fraction) + reagents.trans_to(C, REAGENTS_METABOLISM) + return + reagents.remove_any(REAGENTS_METABOLISM) /obj/item/clothing/mask/cigarette/process() diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index ff1812883aa..d021a3b27b5 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -180,31 +180,29 @@ mix_reagents() - if(reagents.total_volume) //The possible reactions didnt use up all reagents. + if(reagents.total_volume) //The possible reactions didnt use up all reagents, so we spread it around. var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() steam.set_up(10, 0, get_turf(src)) steam.attach(src) steam.start() - var/list/viewable = view(affected_area, loc) - var/list/accessible = can_flood_from(loc, affected_area) - var/list/reactable = accessible - var/mycontents = GetAllContents() - for(var/turf/T in accessible) - for(var/atom/A in T.GetAllContents()) - if(A in mycontents) continue - if(!(A in viewable)) continue - reactable |= A - if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. - qdel(src) - return - var/fraction = 1/reactable.len - for(var/atom/A in reactable) - reagents.reaction(A, TOUCH, fraction) + var/list/viewable = view(affected_area, loc) + var/list/accessible = can_flood_from(loc, affected_area) + var/list/reactable = accessible + var/mycontents = GetAllContents() + for(var/turf/T in accessible) + for(var/atom/A in T.GetAllContents()) + if(A in mycontents) continue + if(!(A in viewable)) continue + reactable |= A + if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. + qdel(src) + return + var/fraction = 1/reactable.len + for(var/atom/A in reactable) + reagents.reaction(A, TOUCH, fraction) - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? - spawn(50) //To make sure all reagents can work - qdel(src) //correctly before deleting the grenade. + qdel(src) /obj/item/weapon/grenade/chem_grenade/proc/mix_reagents() var/total_temp @@ -381,6 +379,7 @@ beakers += B1 beakers += B2 + /obj/item/weapon/grenade/chem_grenade/colorful name = "colorful grenade" desc = "Used for wide scale painting projects." @@ -399,6 +398,7 @@ beakers += B1 beakers += B2 + /obj/item/weapon/grenade/chem_grenade/clf3 name = "clf3 grenade" desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas." diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 5ba0e73fa7d..059fb02ae5c 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -5,11 +5,11 @@ det_time = 20 item_state = "flashbang" slot_flags = SLOT_BELT - var/datum/effect/effect/system/bad_smoke_spread/smoke + var/datum/effect/effect/system/smoke_spread/bad/smoke /obj/item/weapon/grenade/smokebomb/New() ..() - src.smoke = new /datum/effect/effect/system/bad_smoke_spread + src.smoke = new /datum/effect/effect/system/smoke_spread/bad src.smoke.attach(src) /obj/item/weapon/grenade/smokebomb/Destroy() @@ -24,10 +24,6 @@ src.smoke.start() sleep(10) src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() for(var/obj/effect/blob/B in view(8,src)) var/damage = round(30/(get_dist(B,src)+1)) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 521f5ab64e7..8166da92f19 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -57,7 +57,7 @@ if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf))))) return - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(5, 0, user.loc) smoke.attach(user) smoke.start() diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index d634d9a832c..310e30dbf5c 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -309,7 +309,9 @@ pass_flags = PASSTABLE /obj/effect/nanofrost_container/proc/Smoke() - PoolOrNew(/obj/effect/effect/freezing_smoke, list(loc, 6, 1)) + var/datum/effect/effect/system/smoke_spread/freezing/S = new + S.set_up(6, 0, loc, null, 1) + S.start() var/obj/effect/decal/cleanable/flour/F = new /obj/effect/decal/cleanable/flour(src.loc) F.color = "#B2FFFF" F.name = "nanofrost residue" @@ -317,33 +319,16 @@ playsound(src,'sound/effects/bamf.ogg',100,1) qdel(src) -/obj/effect/effect/freezing_smoke +/obj/effect/effect/smoke/freezing name = "nanofrost smoke" - icon_state = "smoke" opacity = 0 - anchored = 0.0 - mouse_opacity = 0 - icon = 'icons/effects/96x96.dmi' - pixel_x = -32 - pixel_y = -32 color = "#B2FFFF" - var/amount = 0 -/obj/effect/effect/freezing_smoke/New(loc, var/amt, var/blast) - ..() - spawn(100+rand(10,30)) - qdel(src) - amount = amt - if(amount) - var/datum/effect/effect/system/freezing_smoke_spread/F = new /datum/effect/effect/system/freezing_smoke_spread - F.set_up(amount, 0, src.loc) - F.start() - if(blast) - for(var/turf/T in trange(2, src.loc)) - Chilled(T) - return +/datum/effect/effect/system/smoke_spread/freezing + smoke_type = /obj/effect/effect/smoke/freezing + var/blast = 0 -/obj/effect/effect/freezing_smoke/proc/Chilled(atom/A) +/datum/effect/effect/system/smoke_spread/freezing/proc/Chilled(atom/A) if(istype(A, /turf/simulated)) var/turf/simulated/T = A if(T.air) @@ -364,29 +349,16 @@ L.ExtinguishMob() return -/datum/effect/effect/system/freezing_smoke_spread +/datum/effect/effect/system/smoke_spread/freezing/set_up(n = 5, c = 0, loca, direct, blasting = 0) + ..() + blast = blasting -/datum/effect/effect/system/freezing_smoke_spread/set_up(n = 6, c = 0, loca) - number = n - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) +/datum/effect/effect/system/smoke_spread/freezing/start() + if(blast) + for(var/turf/T in trange(2, location)) + Chilled(T) + ..() -/datum/effect/effect/system/freezing_smoke_spread/start() - var/i = 0 - for(i=0, iThe [src] warps in!") diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bf59b9d3278..96646718d5e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -222,7 +222,7 @@ /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "clown" item_state = "clown_hat" @@ -245,28 +245,28 @@ /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "sexyclown" item_state = "sexyclown" /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "mime" item_state = "mime" /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" desc = "A mask used when acting as a monkey." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "monkeymask" item_state = "monkeymask" /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" desc = "A traditional female mime's mask." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "sexymime" item_state = "sexymime" @@ -283,5 +283,5 @@ /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "owl" \ No newline at end of file diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 7703be7fc73..6a9fcf140e5 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -33,7 +33,7 @@ R.my_atom = vent R.add_reagent(pick(gunk), 50) - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index c057de5b96e..e38777f8ee7 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -43,6 +43,6 @@ I.name = "cursed " + I.name for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() \ No newline at end of file diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 5d3567a9d47..cda6dc2d41f 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -14,7 +14,7 @@ if(!candidates) return //Sad Trombone var/client/C = pick(candidates) - PoolOrNew(/obj/effect/effect/harmless_smoke, W.loc) + PoolOrNew(/obj/effect/effect/smoke, W.loc) var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) I.real_name = W.real_name diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index 4315f3a4261..df271b96ef1 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -28,7 +28,7 @@ moblocs.len -= 1 for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() @@ -60,7 +60,7 @@ mobnames.len -= 1 for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() @@ -92,6 +92,6 @@ mobs -= mobs[mobs.len] for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 1f07766a523..f8db998ed7c 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -34,24 +34,19 @@ if(M == user) M << "You swallow a gulp of [src]." - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, gulp_size) + else - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - - user.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].") - if(!do_mob(user, M)) return - if(!reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding - user.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].") - add_logs(user, M, "fed", object="[reagentlist(src)]") - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, gulp_size) + user.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The drink might be empty after the delay, such as by spam-feeding + user.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].") + add_logs(user, M, "fed", object="[reagentlist(src)]") + var/fraction = min(gulp_size/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, gulp_size) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index bff39b0e262..a20b7e078cd 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -30,9 +30,8 @@ return /obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone) - var/datum/reagents/R = src.reagents - if(!R || !R.total_volume) + if(!reagents || !reagents.total_volume) user << "None of [src] left, oh no!" return 0 @@ -41,28 +40,20 @@ if(M == user) M << "You swallow some of contents of \the [src]." - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, 10) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - else user.visible_message("[user] attempts to feed [M] from [src].") - if(!do_mob(user, M)) return + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The condiment might be empty after the delay. user.visible_message("[user] feeds [M] from [src].") - add_logs(user, M, "fed", object="[reagentlist(src)]") - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, 10) - - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - return 0 + var/fraction = min(10/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, 10) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 /obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) if(!proximity) return diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm index 919e6e0a62b..7f8d06dd703 100644 --- a/code/modules/food&drinks/food/snacks.dm +++ b/code/modules/food&drinks/food/snacks.dm @@ -105,14 +105,11 @@ M.satiety -= junkiness playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1) if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - if(reagents.total_volume > bitesize) //pretty sure this is unnecessary - reagents.trans_to(M, bitesize) - else - reagents.trans_to(M, reagents.total_volume) - bitecount++ - On_Consume() + var/fraction = min(bitesize/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, bitesize) + bitecount++ + On_Consume() return 1 return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 02b856d2356..558604dad94 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -146,3 +146,6 @@ /mob/living/carbon/alien/humanoid/check_ear_prot() return 1 + +/mob/living/carbon/alien/carbon/alien/humanoid/get_permeability_protection() + return 0.8 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 32086909dbf..6b92ce711d6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -238,6 +238,9 @@ emp_act /mob/living/carbon/human/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) var/list/damaged = list() var/list/inventory_items_to_kill = list() + var/acidity = min(acidpwr*acid_volume/200, toxpwr) + var/acid_volume_left = acid_volume + var/acid_decay = 200/acidpwr // how much volume we lose per item we try to melt. 10 for fluoro, 20 for sulphuric //HEAD// var/obj/item/clothing/head_clothes = null @@ -249,7 +252,8 @@ emp_act head_clothes = head if(head_clothes) if(!head_clothes.unacidable) - head_clothes.acid_act(acidpwr) + head_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) //We remove some of the acid volume. update_inv_glasses() update_inv_wear_mask() update_inv_head() @@ -270,7 +274,8 @@ emp_act chest_clothes = wear_suit if(chest_clothes) if(!chest_clothes.unacidable) - chest_clothes.acid_act(acidpwr) + chest_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) update_inv_w_uniform() update_inv_wear_suit() else @@ -299,7 +304,8 @@ emp_act arm_clothes = wear_suit if(arm_clothes) if(!arm_clothes.unacidable) - arm_clothes.acid_act(acidpwr) + arm_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) update_inv_gloves() update_inv_w_uniform() update_inv_wear_suit() @@ -324,7 +330,8 @@ emp_act leg_clothes = wear_suit if(leg_clothes) if(!leg_clothes.unacidable) - leg_clothes.acid_act(acidpwr) + leg_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) update_inv_shoes() update_inv_w_uniform() update_inv_wear_suit() @@ -341,11 +348,11 @@ emp_act //DAMAGE// for(var/obj/item/organ/limb/affecting in damaged) - affecting.take_damage(2*toxpwr, toxpwr) + affecting.take_damage(acidity, 2*acidity) if(affecting.name == "head") - affecting.take_damage(2*toxpwr, toxpwr) - if(prob(2*acidpwr)) //Applies disfigurement + if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement + affecting.take_damage(acidity, 2*acidity) emote("scream") facial_hair_style = "Shaved" hair_style = "Bald" @@ -366,7 +373,8 @@ emp_act inventory_items_to_kill += l_hand for(var/obj/item/I in inventory_items_to_kill) - I.acid_act(acidpwr) + I.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) /mob/living/carbon/human/grabbedby(mob/living/user) if(w_uniform) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 8d08b29ecb2..e163fb158e0 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -139,10 +139,30 @@ /mob/living/carbon/human/can_track(mob/living/user) if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) - return 0 + return 0 if(istype(head, /obj/item/clothing/head)) var/obj/item/clothing/head/hat = head if(hat.blockTracking) return 0 - + return ..() + +/mob/living/carbon/human/get_permeability_protection() + var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0) + for(var/obj/item/I in get_equipped_items()) + if(I.body_parts_covered & HANDS) + prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"]) + if(I.body_parts_covered & CHEST) + prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"]) + if(I.body_parts_covered & GROIN) + prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"]) + if(I.body_parts_covered & LEGS) + prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"]) + if(I.body_parts_covered & FEET) + prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"]) + if(I.body_parts_covered & ARMS) + prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"]) + if(I.body_parts_covered & HEAD) + prot["head"] = max(1 - I.permeability_coefficient, prot["head"]) + var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 + return protection \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ae6d8824d95..bc1c2c58c3a 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1101,13 +1101,14 @@ // Handle chem smoke effect -- Doohl if(!H.has_smoke_protection()) - for(var/obj/effect/effect/chem_smoke/smoke in view(1, H)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(H, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(H, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking + for(var/obj/effect/effect/smoke/chem/S in range(1, H)) + if(S.reagents.total_volume) + var/amount = min(S.reagents.total_volume/2, 10) + if(amount >= 1) + var/fraction = min(amount/S.reagents.total_volume, 1) + S.reagents.reaction(H,INGEST, fraction) + S.reagents.trans_to(H, amount) + break // If they breathe in the nasty stuff once, no need to continue checking else //Still give containing object the chance to interact if(istype(H.loc, /obj/)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9ac7837148a..28b44665bab 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -71,12 +71,12 @@ //Harmful gasses if(!has_smoke_protection()) - for(var/obj/effect/effect/chem_smoke/smoke in view(1,src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src,INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) + for(var/obj/effect/effect/smoke/chem/S in range(1,src)) + if(S.reagents.total_volume) + var/amount = min(S.reagents.total_volume, 10) + var/fraction = min(amount/S.reagents.total_volume, 1) + S.reagents.reaction(src,INGEST, fraction) + S.reagents.copy_to(src, amount) break else //Breathe from loc as obj again diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index a7c821c9493..394a92d9437 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -255,7 +255,7 @@ src << "Your mask protects you from the acid." return - take_organ_damage(min(6*toxpwr, acid_volume * toxpwr)) + take_organ_damage(min(6*toxpwr, acid_volume * acidpwr/10)) /mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M) if(health < 0 && ishuman(M)) @@ -263,3 +263,12 @@ H.do_cpr(src) else ..() + +/mob/living/carbon/monkey/get_permeability_protection() + var/protection = 0 + if(head) + protection = 1 - head.permeability_coefficient + if(wear_mask) + protection = max(1 - wear_mask.permeability_coefficient, protection) + protection = protection/7 //the rest of the body isn't covered. + return protection \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d23dcbabcc0..aea4871ac68 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -858,3 +858,7 @@ Sorry Giacom. Please don't be mad :( return 0 return 1 + +//used in datum/reagents/reaction() proc +/mob/living/proc/get_permeability_protection() + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6509db4ac67..b48f2f21e14 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -43,4 +43,6 @@ var/list/datum/action/actions = list() var/list/pipes_shown = list() - var/last_played_vent \ No newline at end of file + var/last_played_vent + + var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob. \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e9bd8434232..712d269a592 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -101,8 +101,6 @@ emag.reagents.add_reagent("facid", 250) emag.name = "Fluacid spray" - var/obj/item/weapon/reagent_containers/spray/S = emag - S.banned_reagents = list() var/datum/robot_energy_storage/gauze/gauzestore = new /datum/robot_energy_storage/gauze(src) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index c9883f02afe..265a428ba71 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -100,8 +100,6 @@ var/in_throw_mode = 0 - var/coughedtime = null - var/music_lastplayed = "null" var/job = null//Living diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm index d6dc568105f..94740bd0e1e 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm @@ -18,7 +18,7 @@ spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up. H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!")) spawn(70) - reagents.reaction(H, 2) + reagents.reaction(H, INGEST) reagents.trans_id_to(H, "radium", a_transfer) H << "You are beginning to feel the after-effect of the injection." a_boost-- diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm index aef3d012dd8..c89a3b11f92 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm @@ -9,7 +9,7 @@ if(!ninjacost(0,N_SMOKE_BOMB)) var/mob/living/carbon/human/H = affecting - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() + var/datum/effect/effect/system/smoke_spread/bad/smoke = new smoke.set_up(10, 0, H.loc) smoke.start() playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7ddb67eefeb..cc03d8f6120 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -945,11 +945,11 @@ cell.corrupt() src.malfhack = 1 update_icon() - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(3, 0, src.loc) smoke.attach(src) smoke.start() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = new s.set_up(3, 1, src) s.start() visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \ diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 96a08d99e4d..607be1ba324 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -42,7 +42,7 @@ user << "Your soul is too far away." return makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) - PoolOrNew(/obj/effect/effect/sleep_smoke, user.loc) + PoolOrNew(/obj/effect/effect/smoke/sleeping, user.loc) /obj/singularity/narsie/process() diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 461af979728..55f9ff2849f 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -123,7 +123,7 @@ /obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user as mob) do_teleport(user, user, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(10, 0, user.loc) smoke.start() charges-- diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index efc20cedfd7..ec2bbcdae6c 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -83,7 +83,7 @@ if(!stuff.anchored && stuff.loc) teleammount++ do_teleport(stuff, stuff, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(round(10 - teleammount),1), 0, stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity smoke.start() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 94e40614ab8..0978a34f58f 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -124,7 +124,7 @@ var/const/INGEST = 2 var/current_reagent_transfer = current_reagent.volume * part if(preserve_data) trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered. src.remove_reagent(current_reagent.id, current_reagent_transfer) src.update_total() @@ -426,17 +426,21 @@ var/const/INGEST = 2 return 0 /datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=1,var/show_message=1) - for(var/datum/reagent/R in reagent_list) - if(ismob(A)) - R.reaction_mob(A, method, R.volume*volume_modifier, show_message) - if(isturf(A)) + if(isliving(A)) + var/mob/living/L = A + var/touch_protection = 0 + if(method == TOUCH) + touch_protection = L.get_permeability_protection() + for(var/datum/reagent/R in reagent_list) + R.reaction_mob(L, method, R.volume*volume_modifier, show_message, touch_protection) + else if(isturf(A)) + for(var/datum/reagent/R in reagent_list) R.reaction_turf(A, R.volume*volume_modifier, show_message) - if(isobj(A)) + else if(isobj(A)) + for(var/datum/reagent/R in reagent_list) R.reaction_obj(A, R.volume*volume_modifier, show_message) - return - -/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300) +/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300, var/no_react = 0) if(!isnum(amount) || !amount) return 1 update_total() @@ -451,7 +455,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() R.on_merge(data) - handle_reactions() + if(!no_react) + handle_reactions() return 0 var/datum/reagent/D = chemical_reagents_list[reagent] @@ -465,19 +470,16 @@ var/const/INGEST = 2 R.data = data R.on_new(data) - //debug - //world << "Adding data" - //for(var/D in R.data) - // world << "Container data: [D] = [R.data[D]]" - //debug update_total() my_atom.on_reagent_change() - handle_reactions() + if(!no_react) + handle_reactions() return 0 else WARNING("[my_atom] attempted to add a reagent called ' [reagent] ' which doesn't exist. ([usr])") - handle_reactions() + if(!no_react) + handle_reactions() return 1 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 2934c57a3c0..7572041506e 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -34,43 +34,22 @@ ..() holder = null -/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some - if(!istype(M, /mob/living)) +/datum/reagent/proc/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume, var/show_message = 1, var/touch_protection = 0) + if(!istype(M)) return 0 var/datum/reagent/self = src - src = null //of the reagent to the mob on TOUCHING it. + src = null - if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke)) - // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl - - if(method == TOUCH) - - var/chance = 1 - var/block = 0 - - for(var/obj/item/clothing/C in M.get_equipped_items()) - if(C.permeability_coefficient < chance) chance = C.permeability_coefficient - if(istype(C, /obj/item/clothing/suit/bio_suit)) - // bio suits are just about completely fool-proof - Doohl - // kind of a hacky way of making bio suits more resistant to chemicals but w/e - if(prob(75)) - block = 1 - - if(istype(C, /obj/item/clothing/head/bio_hood)) - if(prob(75)) - block = 1 - - chance = chance * 100 - - if(prob(chance) && !block) - if(M.reagents) - M.reagents.add_reagent(self.id,self.volume/2) + if(method == TOUCH) + if(M.reagents) + var/modifier = Clamp((1 - touch_protection) + rand(-5,5)/100, 0, 1) + var/amount = round(volume*modifier) + if(amount >= 1) + M.reagents.add_reagent(self.id, amount) return 1 -/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) +/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) + src = null return /datum/reagent/proc/reaction_turf(var/turf/T, var/volume) diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm index 99866fd47eb..a12bc95ebec 100644 --- a/code/modules/reagents/Chemistry-Recipes/Others.dm +++ b/code/modules/reagents/Chemistry-Recipes/Others.dm @@ -143,10 +143,10 @@ /datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - + world << "holder volb4:[holder.total_volume]" for(var/mob/M in viewers(5, location)) M << "The solution spews out foam!" - + world << "holder vol w/o created vol:[holder.total_volume]" var/datum/effect/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder) s.start() diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm index 4b265fae1b9..9f709414a73 100644 --- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm @@ -215,20 +215,19 @@ /datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) if(holder.has_reagent("stabilizing_agent")) return + world << "holder volb4:[holder.total_volume]" holder.remove_reagent("smoke_powder", created_volume) + world << "holder vol w/o created vol:[holder.total_volume]" + var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return + if(S) + S.set_up(holder, smoke_amount, 0, location) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() /datum/chemical_reaction/smoke_powder_smoke name = "smoke_powder_smoke" @@ -242,18 +241,16 @@ /datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1) + var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return + if(S) + S.set_up(holder, smoke_amount, 0, location) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + /datum/chemical_reaction/sonic_powder @@ -318,6 +315,7 @@ var/turf/simulated/T = get_turf(holder.my_atom) if(istype(T)) T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) + holder.clear_reagents() return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a938b092061..c3108ddeb0c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -7,7 +7,6 @@ var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = list(5,10,15,25,30) var/volume = 30 - var/list/banned_reagents = list() //List of reagent IDs we reject. var/list/list_reagents = null var/spawned_disease = null var/disease_amount = 20 diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d3c923f6e2c..eed51ff2a81 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -92,7 +92,8 @@ Borg Hypospray if (R.total_volume && M.can_inject(user, 1)) M << "You feel a tiny prick!" user << "You inject [M] with the injector." - R.reaction(M, INGEST) + var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1) + R.reaction(M, INGEST, fraction) if(M.reagents) var/trans = R.trans_to(M, amount_per_transfer_from_this) user << "[trans] unit\s injected. [R.total_volume] unit\s remaining." diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 8a8f5f1728b..5c735a313b0 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -21,6 +21,7 @@ return var/trans = 0 + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) if(ismob(target)) if(istype(target , /mob/living/carbon/human)) @@ -40,12 +41,12 @@ if(safe_thing) if(!safe_thing.reagents) safe_thing.create_reagents(100) + + reagents.reaction(safe_thing, TOUCH, fraction) trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this) target.visible_message("[user] tries to squirt something into [target]'s eyes, but fails!", \ "[user] tries to squirt something into [target]'s eyes, but fails!") - spawn(5) - reagents.reaction(safe_thing, TOUCH) user << "You transfer [trans] unit\s of the solution." update_icon() @@ -53,7 +54,8 @@ target.visible_message("[user] squirts something into [target]'s eyes!", \ "[user] squirts something into [target]'s eyes!") - reagents.reaction(target, TOUCH) + + reagents.reaction(target, TOUCH, fraction) var/mob/M = target var/R if(reagents) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 2a21fe917d8..b8f188c3ba5 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -72,12 +72,6 @@ user << "[target] is full." return - if(istype(target, /obj/item/weapon/reagent_containers)) - var/obj/item/weapon/reagent_containers/RC = target - for(var/bad_reg in RC.banned_reagents) - if(reagents.has_reagent(bad_reg, 1)) //Message is a bit "Game-y" but I can't think up a better one. - user << "A chemical in [src] is far too dangerous to transfer to [RC]!" - return var/trans = reagents.trans_to(target, amount_per_transfer_from_this) user << "You transfer [trans] unit\s of the solution to [target]." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 708b8659a7a..1a86c6f9ed7 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -25,7 +25,8 @@ M << "You feel a tiny prick!" user << "You inject [M] with [src]." - reagents.reaction(M, INGEST) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) if(M.reagents) var/list/injected = list() for(var/datum/reagent/R in reagents.reagent_list) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 4520bb48afb..b675f86913b 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -45,10 +45,9 @@ if(reagents.total_volume) reagents.reaction(M, apply_type) - spawn(5) - reagents.trans_to(M, reagents.total_volume) - qdel(src) - return 1 + reagents.trans_to(M, reagents.total_volume) + qdel(src) + return 1 else qdel(src) return 1 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index edfce7a4595..054b8113f2f 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -15,7 +15,6 @@ amount_per_transfer_from_this = 5 volume = 250 possible_transfer_amounts = null - banned_reagents = list("facid","sacid") /obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob) @@ -159,7 +158,6 @@ amount_per_transfer_from_this = 10 volume = 600 origin_tech = "combat=3;materials=3;engineering=3" - banned_reagents = list()//the safeties are off, spray and pay! /obj/item/weapon/reagent_containers/spray/chemsprayer/spray(var/atom/A) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 9d7988c289e..ca5a3160a0c 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -151,7 +151,8 @@ var/contained = english_list(rinject) var/mob/M = target add_logs(user, M, "injected", object="[src.name]", addition="which had [contained]") - reagents.reaction(target, INGEST) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(target, INGEST, fraction) if(ismob(target) && target == user) //Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes. var/list/rinject = list() @@ -161,8 +162,8 @@ var/mob/M = target log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])") M.attack_log += text("\[[time_stamp()]\] Injected themselves ([contained]) with [src.name].") - - reagents.reaction(target, INGEST) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(target, INGEST, fraction) spawn(5) var/datum/reagent/blood/B for(var/datum/reagent/blood/d in src.reagents.reagent_list) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index be722fe8fb0..309557e09ca 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -230,7 +230,7 @@ loaded_item = null /obj/machinery/r_n_d/experimentor/proc/throwSmoke(var/turf/where) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, where, 0) smoke.start() @@ -322,7 +322,7 @@ R.my_atom = src R.add_reagent(chosenchem , 50) investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor") - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -334,7 +334,7 @@ var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src R.add_reagent(chosenchem , 50) - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -421,7 +421,7 @@ R.my_atom = src R.add_reagent("frostoil" , 50) investigate_log("Experimentor has released frostoil gas.", "experimentor") - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -443,7 +443,7 @@ ejectItem(TRUE) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!") - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() ejectItem() @@ -651,7 +651,7 @@ //////////////// RELIC PROCS ///////////////////////////// /obj/item/weapon/relic/proc/throwSmoke(var/turf/where) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, where, 0) smoke.start()