From f01af6ae207f76ac5cf4db65d5fe41adde637e1a Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 15 Mar 2019 19:09:29 -0400 Subject: [PATCH 1/2] Implements Goon Smoke --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 5 +- .../shadowling/shadowling_abilities.dm | 4 +- .../effect_system/effects_chem_smoke.dm | 123 ++++++++++++++++++ .../effects/effect_system/effects_smoke.dm | 97 +------------- code/modules/events/vent_clog.dm | 2 +- code/modules/hydroponics/plant_genes.dm | 3 +- .../chemistry/recipes/pyrotechnics.dm | 3 +- code/modules/research/experimentor.dm | 6 +- icons/goonstation/effects/64x64.dmi | Bin 0 -> 5895 bytes paradise.dme | 1 + 10 files changed, 134 insertions(+), 110 deletions(-) create mode 100644 code/game/objects/effects/effect_system/effects_chem_smoke.dm create mode 100644 icons/goonstation/effects/64x64.dmi diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index e3b1d082623..6edc8e67ecc 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -113,9 +113,8 @@ else reagents.add_reagent("spore", 8) - // Attach the smoke spreader and setup/start it. - S.attach(location) - S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud + // Setup up the smoke spreader and start it. + S.set_up(reagents, location, TRUE) S.start() qdel(src) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 51360c7b398..d9caf977211 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -411,11 +411,9 @@ B.icon_state = null //Invisible B.reagents.add_reagent("blindness_smoke", 10) var/datum/effect_system/smoke_spread/chem/S = new - S.attach(B) if(S) - S.set_up(B.reagents, 10, 0, B.loc) + S.set_up(B.reagents, B.loc, TRUE) S.start(4) - sleep(10) qdel(B) /datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls diff --git a/code/game/objects/effects/effect_system/effects_chem_smoke.dm b/code/game/objects/effects/effect_system/effects_chem_smoke.dm new file mode 100644 index 00000000000..26e6026a677 --- /dev/null +++ b/code/game/objects/effects/effect_system/effects_chem_smoke.dm @@ -0,0 +1,123 @@ +///////////////////////////////////////////// +// Chem smoke +///////////////////////////////////////////// + +/obj/effect/particle_effect/chem_smoke + icon = 'icons/goonstation/effects/64x64.dmi' + icon_state = "smoke" + density = FALSE + opacity = FALSE + animate_movement = NO_STEPS + var/matrix/first = matrix() + var/matrix/second = matrix() + var/matrix/third = matrix() + var/first_scale = 0.1 + var/second_scale = 5 + var/third_scale = 2 + var/spread_amount = 96 + +/obj/effect/particle_effect/chem_smoke/New(location, chem_color) + ..() + color = chem_color + pixel_x += -16 + rand(-3, 3) + pixel_y += -16 + rand(-3, 3) + + first = turn(first, rand(-90, 90)) + first.Scale(first_scale, first_scale) + transform = first + + second = first + second.Scale(second_scale, second_scale) + + third.Scale(third_scale, third_scale) + + animate(src,transform = second, time = 5, alpha = 200) + animate(transform = third, time = 20, pixel_y = rand(-spread_amount, spread_amount), pixel_x = rand(-spread_amount, spread_amount), alpha = 1) + QDEL_IN(src, 26) + + +/obj/effect/particle_effect/chem_smoke/small + first_scale = 0.05 + second_scale = 2.5 + third_scale = 1 + spread_amount = 48 + + +/datum/effect_system/smoke_spread/chem + var/obj/chemholder + var/list/smoked_atoms = list() + +/datum/effect_system/smoke_spread/chem/New() + ..() + chemholder = new/obj() + var/datum/reagents/R = new/datum/reagents(500) + chemholder.reagents = R + R.my_atom = chemholder + +/datum/effect_system/smoke_spread/chem/Destroy() + QDEL_NULL(chemholder) + smoked_atoms.Cut() + return ..() + +/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, loca, silent = FALSE) + if(isturf(loca)) + location = loca + else + location = get_turf(loca) + carry.copy_to(chemholder, carry.total_volume) + if(!silent) + var/contained = "" + for(var/reagent in carry.reagent_list) + contained += " [reagent] " + if(contained) + contained = "\[[contained]\]" + var/area/A = get_area(location) + + var/where = "[A.name] | [location.x], [location.y]" + var/whereLink = "[where]" + + if(carry && carry.my_atom) + if(carry.my_atom.fingerprintslast) + var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) + var/more = "" + if(M) + more = " " + msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", ATKLOG_FEW) + log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") + else + msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", ATKLOG_FEW) + log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") + else + msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key. CODERS: carry.my_atom may be null.", ATKLOG_FEW) + log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key. CODERS: carry.my_atom may be null.") + + +/datum/effect_system/smoke_spread/chem/start(effect_range = 2) + set waitfor = FALSE + + var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) + + for(var/x in 0 to 99) + for(var/i = 0, i < rand(2, 6), i++) + if(effect_range < 3) + new /obj/effect/particle_effect/chem_smoke/small(location, color) + else + new /obj/effect/particle_effect/chem_smoke(location, color) + + if(x % 10 == 0) //Once every 10 ticks. + SmokeEm(effect_range) + + sleep(1) + qdel(src) + + +/datum/effect_system/smoke_spread/chem/proc/SmokeEm(effect_range = 2) + for(var/atom/A in view(effect_range, get_turf(location))) + if(A in smoked_atoms) + continue + smoked_atoms += A + chemholder.reagents.reaction(A) + if(iscarbon(A)) + var/mob/living/carbon/C = A + if(C.can_breathe_gas()) + chemholder.reagents.copy_to(C, chemholder.reagents.total_volume) \ No newline at end of file diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 1df0166260e..405a0ec46f7 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -207,99 +207,4 @@ return 1 /datum/effect_system/smoke_spread/sleeping - effect_type = /obj/effect/particle_effect/smoke/sleeping - -///////////////////////////////////////////// -// Chem smoke -///////////////////////////////////////////// - -/obj/effect/particle_effect/smoke/chem - icon = 'icons/effects/chemsmoke.dmi' - opacity = 0 - lifetime = 10 - -/datum/effect_system/smoke_spread/chem - effect_type = /obj/effect/particle_effect/smoke/chem - var/obj/chemholder - -/datum/effect_system/smoke_spread/chem/New() - ..() - chemholder = new/obj() - var/datum/reagents/R = new/datum/reagents(500) - chemholder.reagents = R - R.my_atom = chemholder - -/datum/effect_system/smoke_spread/chem/Destroy() - QDEL_NULL(chemholder) - return ..() - -/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0) - if(n > 20) - n = 20 - number = n - cardinals = c - - if(isturf(loca)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - carry.copy_to(chemholder, carry.total_volume) - if(!silent) - var/contained = "" - for(var/reagent in carry.reagent_list) - contained += " [reagent] " - if(contained) - contained = "\[[contained]\]" - var/area/A = get_area(location) - - var/where = "[A.name] | [location.x], [location.y]" - var/whereLink = "[where]" - - if(carry && carry.my_atom) - if(carry.my_atom.fingerprintslast) - var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) - var/more = "" - if(M) - more = " " - msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", ATKLOG_FEW) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") - else - msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", ATKLOG_FEW) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") - else - msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key. CODERS: carry.my_atom may be null.", ATKLOG_FEW) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key. CODERS: carry.my_atom may be null.") - -/datum/effect_system/smoke_spread/chem/start(effect_range = 2) - var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) - var/obj/effect/particle_effect/smoke/chem/smokeholder = new effect_type(location) - for(var/atom/A in view(effect_range, smokeholder)) - chemholder.reagents.reaction(A) - if(iscarbon(A)) - var/mob/living/carbon/C = A - if(C.can_breathe_gas()) - chemholder.reagents.copy_to(C, chemholder.reagents.total_volume) - qdel(smokeholder) - for(var/i=0, i=5 && created_volume < 10) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 2ae4e3ac828..dad2b6698ad 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -318,7 +318,7 @@ R.add_reagent(chosenchem , 15) investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor") var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 1, 0, src, 0, silent = 1) + smoke.set_up(R, src, TRUE) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() qdel(R) @@ -330,7 +330,7 @@ R.my_atom = src R.add_reagent(chosenchem , 15) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 1, 0, src, 0, silent = 1) + smoke.set_up(R, src, TRUE) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() qdel(R) @@ -417,7 +417,7 @@ R.add_reagent("frostoil" , 15) investigate_log("Experimentor has released frostoil gas.", "experimentor") var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 1, 0, src, 0, silent = 1) + smoke.set_up(R, src, TRUE) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() qdel(R) diff --git a/icons/goonstation/effects/64x64.dmi b/icons/goonstation/effects/64x64.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e1b168bbc116b3a920bef64a5940a130049e19b3 GIT binary patch literal 5895 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 A7XSbN literal 0 HcmV?d00001 diff --git a/paradise.dme b/paradise.dme index 094e49a99f0..ef8bcb0e31c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -785,6 +785,7 @@ #include "code\game\objects\effects\decals\Cleanable\robots.dm" #include "code\game\objects\effects\decals\Cleanable\tracks.dm" #include "code\game\objects\effects\effect_system\effect_system.dm" +#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm" #include "code\game\objects\effects\effect_system\effects_explosion.dm" #include "code\game\objects\effects\effect_system\effects_foam.dm" #include "code\game\objects\effects\effect_system\effects_other.dm" From ea752e71910a3d68f2e4abd967806fd06d7dfa17 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 19 Mar 2019 03:10:47 -0400 Subject: [PATCH 2/2] safety --- .../objects/effects/effect_system/effects_chem_smoke.dm | 7 +++---- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_chem_smoke.dm b/code/game/objects/effects/effect_system/effects_chem_smoke.dm index 26e6026a677..d68692a03e6 100644 --- a/code/game/objects/effects/effect_system/effects_chem_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_chem_smoke.dm @@ -49,10 +49,9 @@ /datum/effect_system/smoke_spread/chem/New() ..() - chemholder = new/obj() - var/datum/reagents/R = new/datum/reagents(500) - chemholder.reagents = R - R.my_atom = chemholder + chemholder = new + chemholder.create_reagents(1000) + chemholder.reagents.set_reacting(FALSE) // Just in case /datum/effect_system/smoke_spread/chem/Destroy() QDEL_NULL(chemholder) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index f873f7600f8..a83bf0f7989 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -233,8 +233,7 @@ datum/chemical_reaction/flash_powder /datum/chemical_reaction/smoke/on_reaction(datum/reagents/holder, created_volume) for(var/f_reagent in forbidden_reagents) - if(holder.has_reagent(f_reagent)) - holder.remove_reagent(f_reagent, holder.get_reagent_amount(f_reagent)) + holder.del_reagent(f_reagent) var/location = get_turf(holder.my_atom) var/datum/effect_system/smoke_spread/chem/S = new playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)