Implements Goon Smoke

This commit is contained in:
Fox McCloud
2019-03-15 19:09:29 -04:00
parent 26db1292fb
commit f01af6ae20
10 changed files with 134 additions and 110 deletions
@@ -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 = "<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>[where]</a>"
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)
@@ -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 = "<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>[where]</a>"
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<number, i++)
if(holder)
location = get_turf(holder)
var/obj/effect/particle_effect/smoke/chem/S = new effect_type(location)
if(!direction)
if(cardinals)
S.direction = pick(cardinal)
else
S.direction = pick(alldirs)
else
S.direction = direction
S.steps = pick(0,1,1,1,2,2,2,3)
if(color)
S.icon += 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()
effect_type = /obj/effect/particle_effect/smoke/sleeping