Makes effect system code more OOP.

obj/effect/effect is now renamed obj/effect/particle_effect for better usability.
datum/effect/system and /datum/effect/effect/system are now both /datum/effect_system.
Fixes a bug where wall mounted igniters (and other spark producing objects) didn't produce sparks sometimes.
Moved explosion_particles.dm into the effect_system folder, because it has effect_systems code.
This commit is contained in:
phil235
2015-10-21 23:28:29 +02:00
committed by phil235
parent e6ef77aeff
commit d3ee910211
109 changed files with 381 additions and 529 deletions
@@ -6,56 +6,67 @@ would spawn and follow the beaker, even if it is carried or thrown.
*/
/obj/effect/effect
name = "effect"
/obj/effect/particle_effect
name = "particle effect"
icon = 'icons/effects/effects.dmi'
mouse_opacity = 0
unacidable = 1//So effect are not targeted by alien acid.
unacidable = 1//So effects are not targeted by alien acid.
pass_flags = PASSTABLE | PASSGRILLE
/obj/effect/effect/New()
/obj/effect/particle_effect/New()
..()
if(ticker)
cameranet.updateVisibility(src)
/obj/effect/effect/Destroy()
/obj/effect/particle_effect/Destroy()
if(ticker)
cameranet.updateVisibility(src)
..()
return QDEL_HINT_PUTINPOOL
/*
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.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 = A.alpha / frames
for(var/i = 0, i < frames, i++)
A.alpha -= step
sleep(world.tick_lag)
return
*/
/datum/effect/effect/system
/datum/effect_system
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/setup = 0
var/effect_type
var/total_effects = 0
/datum/effect/effect/system/Destroy()
/datum/effect_system/Destroy()
holder = null
location = null
return ..()
/datum/effect/effect/system/proc/set_up(n = 3, c = 0, turf/loc)
/datum/effect_system/proc/set_up(n = 3, c = 0, loca)
if(n > 10)
n = 10
number = n
cardinals = c
location = loc
setup = 1
if(isturf(loca))
location = loca
else
location = get_turf(loca)
/datum/effect/effect/system/proc/attach(atom/atom)
/datum/effect_system/proc/attach(atom/atom)
holder = atom
/datum/effect/effect/system/proc/start()
/datum/effect_system/proc/start()
for(var/i in 1 to number)
if(total_effects > 20)
return
spawn(0)
if(holder)
location = get_turf(holder)
var/obj/effect/E = PoolOrNew(effect_type, location)
total_effects++
var/direction
if(cardinals)
direction = pick(cardinal)
else
direction = pick(alldirs)
var/steps_amt = pick(1,2,3)
for(var/j in 1 to steps_amt)
sleep(5)
step(E,direction)
spawn(20)
total_effects--
@@ -1,7 +1,7 @@
// Foam
// Similar to smoke, but slower and mobs absorb its reagent through their exposed skin.
/obj/effect/effect/foam
/obj/effect/particle_effect/foam
name = "foam"
icon_state = "foam"
opacity = 0
@@ -15,29 +15,29 @@
var/lifetime = 6
/obj/effect/effect/foam/metal
/obj/effect/particle_effect/foam/metal
name = "aluminium foam"
metal = 1
icon_state = "mfoam"
/obj/effect/effect/foam/metal/iron
/obj/effect/particle_effect/foam/metal/iron
name = "iron foam"
metal = 2
/obj/effect/effect/foam/New(loc)
/obj/effect/particle_effect/foam/New(loc)
..(loc)
create_reagents(1000) //limited by the size of the reagent holder anyway.
SSobj.processing |= src
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
/obj/effect/effect/foam/Destroy()
/obj/effect/particle_effect/foam/Destroy()
SSobj.processing.Remove(src)
return ..()
/obj/effect/effect/foam/proc/kill_foam()
/obj/effect/particle_effect/foam/proc/kill_foam()
SSobj.processing.Remove(src)
if(metal)
var/obj/structure/foamedmetal/M = new(src.loc)
@@ -48,7 +48,7 @@
qdel(src)
/obj/effect/effect/foam/process()
/obj/effect/particle_effect/foam/process()
lifetime--
if(lifetime < 1)
kill_foam()
@@ -71,7 +71,7 @@
return
spread_foam()
/obj/effect/effect/foam/proc/foam_mob(mob/living/L)
/obj/effect/particle_effect/foam/proc/foam_mob(mob/living/L)
if(lifetime<1)
return 0
if(!istype(L))
@@ -81,66 +81,66 @@
lifetime--
return 1
/obj/effect/effect/foam/Crossed(atom/movable/AM)
/obj/effect/particle_effect/foam/Crossed(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(atom/movable/AM)
/obj/effect/particle_effect/foam/metal/Crossed(atom/movable/AM)
return
/obj/effect/effect/foam/proc/spread_foam()
/obj/effect/particle_effect/foam/proc/spread_foam()
var/turf/t_loc = get_turf(src)
for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
var/obj/effect/effect/foam/foundfoam = locate() in T //Don't spread foam where there's already foam!
var/obj/effect/particle_effect/foam/foundfoam = locate() in T //Don't spread foam where there's already foam!
if(foundfoam)
continue
for(var/mob/living/L in T)
foam_mob(L)
var/obj/effect/effect/foam/F = PoolOrNew(src.type, T)
var/obj/effect/particle_effect/foam/F = PoolOrNew(src.type, T)
F.amount = amount
reagents.copy_to(F, (reagents.total_volume))
F.color = color
F.metal = metal
/obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/effect/particle_effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated
kill_foam()
/obj/effect/effect/foam/metal/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/effect/particle_effect/foam/metal/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
///////////////////////////////////////////////
//FOAM EFFECT DATUM
/datum/effect/effect/system/foam_spread
/datum/effect_system/foam_spread
var/amount = 10 // the size of the foam spread.
var/obj/chemholder
var/obj/effect/effect/foam/foamtype = /obj/effect/effect/foam
effect_type = /obj/effect/particle_effect/foam
var/metal = 0
/datum/effect/effect/system/foam_spread/metal
foamtype = /obj/effect/effect/foam/metal
/datum/effect_system/foam_spread/metal
effect_type = /obj/effect/particle_effect/foam/metal
/datum/effect/effect/system/foam_spread/New()
/datum/effect_system/foam_spread/New()
..()
chemholder = PoolOrNew(/obj)
var/datum/reagents/R = new/datum/reagents(1000)
chemholder.reagents = R
R.my_atom = chemholder
/datum/effect/effect/system/foam_spread/Destroy()
/datum/effect_system/foam_spread/Destroy()
qdel(chemholder)
chemholder = null
return ..()
/datum/effect/effect/system/foam_spread/set_up(amt=5, loca, datum/reagents/carry = null)
/datum/effect_system/foam_spread/set_up(amt=5, loca, datum/reagents/carry = null)
if(istype(loca, /turf/))
location = loca
else
@@ -149,16 +149,16 @@
amount = round(sqrt(amt / 2), 1)
carry.copy_to(chemholder, 4*carry.total_volume) //The foam holds 4 times the total reagents volume for balance purposes.
/datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, datum/reagents/carry = null, metaltype)
/datum/effect_system/foam_spread/metal/set_up(amt=5, loca, datum/reagents/carry = null, metaltype)
..()
metal = metaltype
/datum/effect/effect/system/foam_spread/start()
var/obj/effect/effect/foam/foundfoam = locate() in location
/datum/effect_system/foam_spread/start()
var/obj/effect/particle_effect/foam/foundfoam = locate() in location
if(foundfoam)//If there was already foam where we start, we add our foaminess to it.
foundfoam.amount += amount
else
var/obj/effect/effect/foam/F = PoolOrNew(foamtype, location)
var/obj/effect/particle_effect/foam/F = PoolOrNew(effect_type, location)
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount)
F.color = foamcolor
@@ -1,83 +1,114 @@
/////////////////////////////////////////////
//////// Attach an Ion trail to any object, that spawns when it moves (like for the jetpack)
//////// Attach a trail to any object, that spawns when it moves (like for the jetpack)
/// just pass in the object to attach it to in set_up
/// Then do start() to start it and stop() to stop it, obviously
/// and don't call start() in a loop that will be repeated otherwise it'll get spammed!
/////////////////////////////////////////////
/obj/effect/effect/ion_trails
name = "ion trails"
icon_state = "ion_trails"
anchored = 1
/datum/effect/effect/system/ion_trail_follow
/datum/effect_system/trail_follow
var/turf/oldposition
var/processing = 1
var/on = 1
/datum/effect/effect/system/ion_trail_follow/Destroy()
/datum/effect_system/trail_follow/set_up(atom/atom)
attach(atom)
oldposition = get_turf(atom)
/datum/effect_system/trail_follow/Destroy()
oldposition = null
return ..()
/datum/effect/effect/system/ion_trail_follow/set_up(atom/atom)
attach(atom)
/datum/effect_system/trail_follow/proc/stop()
processing = 0
on = 0
oldposition = null
/datum/effect_system/trail_follow/steam
effect_type = /obj/effect/particle_effect/steam
/datum/effect/effect/system/ion_trail_follow/start() //Whoever is responsible for this abomination of code should become an hero
if(!src.on)
src.on = 1
src.processing = 1
if(src.processing)
src.processing = 0
var/turf/T = get_turf(src.holder)
if(T != src.oldposition)
/datum/effect_system/trail_follow/steam/start()
if(!on)
on = 1
processing = 1
if(!oldposition)
oldposition = get_turf(holder)
if(processing)
processing = 0
if(number < 3)
var/obj/effect/particle_effect/steam/I = PoolOrNew(/obj/effect/particle_effect/steam, oldposition)
number++
I.dir = holder.dir
oldposition = get_turf(holder)
spawn(10)
qdel(I)
number--
spawn(2)
if(on)
processing = 1
start()
/obj/effect/particle_effect/ion_trails
name = "ion trails"
icon_state = "ion_trails"
anchored = 1
/datum/effect_system/trail_follow/ion
effect_type = /obj/effect/particle_effect/ion_trails
/datum/effect_system/trail_follow/ion/start() //Whoever is responsible for this abomination of code should become an hero
if(!on)
on = 1
processing = 1
if(!oldposition)
oldposition = get_turf(holder)
if(processing)
processing = 0
var/turf/T = get_turf(holder)
if(T != oldposition)
if(!has_gravity(T))
var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, oldposition)
I.dir = src.holder.dir
var/obj/effect/particle_effect/ion_trails/I = PoolOrNew(effect_type, oldposition)
I.dir = holder.dir
flick("ion_fade", I)
I.icon_state = ""
spawn( 20 )
spawn(20)
qdel(I)
src.oldposition = T
oldposition = T
spawn(2)
if(src.on)
src.processing = 1
src.start()
if(on)
processing = 1
start()
/datum/effect/effect/system/ion_trail_follow/proc/stop()
src.processing = 0
src.on = 0
oldposition = null
//Reagent-based explosion effect
/datum/effect/effect/system/reagents_explosion
/datum/effect_system/reagents_explosion
var/amount // TNT equivalent
var/flashing = 0 // does explosion creates flash effect?
var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion
var/explosion_message = 1 //whether we show a message to mobs.
/datum/effect/effect/system/reagents_explosion/set_up (amt, loc, flash = 0, flash_fact = 0, message = 1)
/datum/effect_system/reagents_explosion/set_up(amt, loca, flash = 0, flash_fact = 0, message = 1)
amount = amt
explosion_message = message
if(istype(loc, /turf/))
location = loc
if(isturf(loca))
location = loca
else
location = get_turf(loc)
location = get_turf(loca)
flashing = flash
flashing_factor = flash_fact
return
/datum/effect/effect/system/reagents_explosion/start()
/datum/effect_system/reagents_explosion/start()
if(explosion_message)
location.visible_message("<span class='danger'>The solution violently explodes!</span>", \
"<span class='italics'>You hear an explosion!</span>")
if (amount <= 2)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.start()
@@ -2,7 +2,7 @@
//// SMOKE SYSTEMS
/////////////////////////////////////////////
/obj/effect/effect/smoke
/obj/effect/particle_effect/smoke
name = "smoke"
icon = 'icons/effects/96x96.dmi'
icon_state = "smoke"
@@ -17,7 +17,7 @@
var/opaque = 1 //whether the smoke can block the view when in enough amount
/obj/effect/effect/smoke/proc/fade_out(frames = 16)
/obj/effect/particle_effect/smoke/proc/fade_out(frames = 16)
if(alpha == 0) //Handle already transparent case
return
if(frames == 0)
@@ -27,24 +27,24 @@
alpha -= step
sleep(world.tick_lag)
/obj/effect/effect/smoke/New()
/obj/effect/particle_effect/smoke/New()
..()
create_reagents(500)
SSobj.processing |= src
/obj/effect/effect/smoke/Destroy()
/obj/effect/particle_effect/smoke/Destroy()
SSobj.processing.Remove(src)
return ..()
/obj/effect/effect/smoke/proc/kill_smoke()
/obj/effect/particle_effect/smoke/proc/kill_smoke()
SSobj.processing.Remove(src)
spawn(0)
fade_out()
spawn(10)
qdel(src)
/obj/effect/effect/smoke/process()
/obj/effect/particle_effect/smoke/process()
lifetime--
if(lifetime < 1)
kill_smoke()
@@ -53,7 +53,7 @@
smoke_mob(L)
return 1
/obj/effect/effect/smoke/proc/smoke_mob(mob/living/carbon/C)
/obj/effect/particle_effect/smoke/proc/smoke_mob(mob/living/carbon/C)
if(!istype(C))
return 0
if(lifetime<1)
@@ -68,16 +68,16 @@
C.smoke_delay = 0
return 1
/obj/effect/effect/smoke/proc/spread_smoke()
/obj/effect/particle_effect/smoke/proc/spread_smoke()
var/turf/t_loc = get_turf(src)
var/list/newsmokes = list()
for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
var/obj/effect/effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke!
var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke!
if(foundsmoke)
continue
for(var/mob/living/L in T)
smoke_mob(L)
var/obj/effect/effect/smoke/S = new type(T)
var/obj/effect/particle_effect/smoke/S = new type(T)
reagents.copy_to(S, reagents.total_volume)
S.dir = pick(cardinal)
S.amount = amount-1
@@ -90,25 +90,25 @@
if(newsmokes.len)
spawn(1) //the smoke spreads rapidly but not instantly
for(var/obj/effect/effect/smoke/SM in newsmokes)
for(var/obj/effect/particle_effect/smoke/SM in newsmokes)
SM.spread_smoke()
/datum/effect/effect/system/smoke_spread
/datum/effect_system/smoke_spread
var/amount = 10
var/smoke_type = /obj/effect/effect/smoke
effect_type = /obj/effect/particle_effect/smoke
/datum/effect/effect/system/smoke_spread/set_up(radius = 5, loca)
/datum/effect_system/smoke_spread/set_up(radius = 5, loca)
if(isturf(loca))
location = loca
else
location = get_turf(loca)
amount = radius
/datum/effect/effect/system/smoke_spread/start()
/datum/effect_system/smoke_spread/start()
if(holder)
location = get_turf(holder)
var/obj/effect/effect/smoke/S = new smoke_type(location)
var/obj/effect/particle_effect/smoke/S = new effect_type(location)
S.amount = amount
if(S.amount)
S.spread_smoke()
@@ -118,17 +118,17 @@
// Bad smoke
/////////////////////////////////////////////
/obj/effect/effect/smoke/bad
/obj/effect/particle_effect/smoke/bad
lifetime = 8
/obj/effect/effect/smoke/bad/smoke_mob(mob/living/carbon/M)
/obj/effect/particle_effect/smoke/bad/smoke_mob(mob/living/carbon/M)
if(..())
M.drop_item()
M.adjustOxyLoss(1)
M.emote("cough")
return 1
/obj/effect/effect/smoke/bad/CanPass(atom/movable/mover, turf/target, height=0)
/obj/effect/particle_effect/smoke/bad/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
if(istype(mover, /obj/item/projectile/beam))
var/obj/item/projectile/beam/B = mover
@@ -137,23 +137,23 @@
/datum/effect/effect/system/smoke_spread/bad
smoke_type = /obj/effect/effect/smoke/bad
/datum/effect_system/smoke_spread/bad
effect_type = /obj/effect/particle_effect/smoke/bad
/////////////////////////////////////////////
// Nanofrost smoke
/////////////////////////////////////////////
/obj/effect/effect/smoke/freezing
/obj/effect/particle_effect/smoke/freezing
name = "nanofrost smoke"
color = "#B2FFFF"
opaque = 0
/datum/effect/effect/system/smoke_spread/freezing
smoke_type = /obj/effect/effect/smoke/freezing
/datum/effect_system/smoke_spread/freezing
effect_type = /obj/effect/particle_effect/smoke/freezing
var/blast = 0
/datum/effect/effect/system/smoke_spread/freezing/proc/Chilled(atom/A)
/datum/effect_system/smoke_spread/freezing/proc/Chilled(atom/A)
if(istype(A, /turf/simulated))
var/turf/simulated/T = A
if(T.air)
@@ -177,11 +177,11 @@
Item.extinguish()
return
/datum/effect/effect/system/smoke_spread/freezing/set_up(radius = 5, loca, blasting = 0)
/datum/effect_system/smoke_spread/freezing/set_up(radius = 5, loca, blasting = 0)
..()
blast = blasting
/datum/effect/effect/system/smoke_spread/freezing/start()
/datum/effect_system/smoke_spread/freezing/start()
if(blast)
for(var/turf/T in trange(2, location))
Chilled(T)
@@ -193,29 +193,29 @@
// Sleep smoke
/////////////////////////////////////////////
/obj/effect/effect/smoke/sleeping
/obj/effect/particle_effect/smoke/sleeping
color = "#9C3636"
lifetime = 10
/obj/effect/effect/smoke/sleeping/smoke_mob(mob/living/carbon/M)
/obj/effect/particle_effect/smoke/sleeping/smoke_mob(mob/living/carbon/M)
if(..())
M.drop_item()
M.sleeping = max(M.sleeping,10)
M.emote("cough")
return 1
/datum/effect/effect/system/smoke_spread/sleeping
smoke_type = /obj/effect/effect/smoke/sleeping
/datum/effect_system/smoke_spread/sleeping
effect_type = /obj/effect/particle_effect/smoke/sleeping
/////////////////////////////////////////////
// Chem smoke
/////////////////////////////////////////////
/obj/effect/effect/smoke/chem
/obj/effect/particle_effect/smoke/chem
lifetime = 10
/obj/effect/effect/smoke/chem/process()
/obj/effect/particle_effect/smoke/chem/process()
if(..())
var/turf/T = get_turf(src)
var/fraction = 1/initial(lifetime)
@@ -227,7 +227,7 @@
reagents.reaction(T, TOUCH, fraction)
return 1
/obj/effect/effect/smoke/chem/smoke_mob(mob/living/carbon/M)
/obj/effect/particle_effect/smoke/chem/smoke_mob(mob/living/carbon/M)
if(lifetime<1)
return 0
if(!istype(M))
@@ -242,23 +242,23 @@
/datum/effect/effect/system/smoke_spread/chem
/datum/effect_system/smoke_spread/chem
var/obj/chemholder
smoke_type = /obj/effect/effect/smoke/chem
effect_type = /obj/effect/particle_effect/smoke/chem
/datum/effect/effect/system/smoke_spread/chem/New()
/datum/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/smoke_spread/chem/Destroy()
/datum/effect_system/smoke_spread/chem/Destroy()
qdel(chemholder)
chemholder = null
return ..()
/datum/effect/effect/system/smoke_spread/chem/set_up(datum/reagents/carry = null, radius = 1, loca, silent = 0)
/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, radius = 1, loca, silent = 0)
if(istype(loca, /turf/))
location = loca
else
@@ -289,11 +289,11 @@
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
/datum/effect/effect/system/smoke_spread/chem/start()
/datum/effect_system/smoke_spread/chem/start()
var/color = mix_color_from_reagents(chemholder.reagents.reagent_list)
if(holder)
location = get_turf(holder)
var/obj/effect/effect/smoke/chem/S = new smoke_type(location)
var/obj/effect/particle_effect/smoke/chem/S = new effect_type(location)
if(chemholder.reagents.total_volume > 1) // can't split 1 very well
chemholder.reagents.copy_to(S, chemholder.reagents.total_volume)
@@ -5,110 +5,42 @@
// will always spawn at the items location.
/////////////////////////////////////////////
/obj/effect/effect/sparks
/obj/effect/particle_effect/sparks
name = "sparks"
icon_state = "sparks"
var/amount = 6
anchored = 1
mouse_opacity = 0
/obj/effect/effect/sparks/New()
/obj/effect/particle_effect/sparks/New()
..()
flick("sparks", src) // replay the animation
playsound(src.loc, "sparks", 100, 1)
var/turf/T = src.loc
if (istype(T, /turf))
T.hotspot_expose(1000,100)
spawn (100)
spawn(20)
qdel(src)
/obj/effect/effect/sparks/Destroy()
/obj/effect/particle_effect/sparks/Destroy()
var/turf/T = src.loc
if (istype(T, /turf))
T.hotspot_expose(1000,100)
return ..()
/obj/effect/effect/sparks/Move()
/obj/effect/particle_effect/sparks/Move()
..()
var/turf/T = src.loc
if (istype(T, /turf))
if(isturf(T))
T.hotspot_expose(1000,100)
return
/datum/effect/effect/system/spark_spread
var/total_sparks = 0 // To stop it being spammed and lagging!
/datum/effect/effect/system/spark_spread/set_up(n = 3, c = 0, loca)
if(n > 10)
n = 10
number = n
cardinals = c
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
/datum/effect/effect/system/spark_spread/start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_sparks > 20)
return
spawn(0)
if(holder)
src.location = get_turf(holder)
var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, location)
src.total_sparks++
var/direction
if(src.cardinals)
direction = pick(cardinal)
else
direction = pick(alldirs)
for(i=0, i<pick(1,2,3), i++)
sleep(5)
step(sparks,direction)
spawn(20)
qdel(sparks)
src.total_sparks--
/datum/effect_system/spark_spread
effect_type = /obj/effect/particle_effect/sparks
//electricity
/obj/effect/effect/sparks/electricity
/obj/effect/particle_effect/sparks/electricity
name = "lightning"
icon_state = "electricity"
/datum/effect/effect/system/lightning_spread
var/total_sparks = 0 // To stop it being spammed and lagging!
/datum/effect/effect/system/lightning_spread/set_up(n = 3, c = 0, loca)
if(n > 10)
n = 10
number = n
cardinals = c
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
/datum/effect/effect/system/lightning_spread/start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_sparks > 20)
return
spawn(0)
if(holder)
src.location = get_turf(holder)
var/obj/effect/effect/sparks/electricity/sparks = PoolOrNew(/obj/effect/effect/sparks/electricity, location)
src.total_sparks++
var/direction
if(src.cardinals)
direction = pick(cardinal)
else
direction = pick(alldirs)
for(i=0, i<pick(1,2,3), i++)
sleep(5)
step(sparks,direction)
spawn(20)
qdel(sparks)
src.total_sparks--
/datum/effect_system/lightning_spread
effect_type = /obj/effect/particle_effect/sparks/electricity
@@ -1,6 +1,6 @@
//WATER EFFECTS
/obj/effect/effect/water
/obj/effect/particle_effect/water
name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish"
@@ -8,12 +8,12 @@
mouse_opacity = 0
/obj/effect/effect/water/New()
/obj/effect/particle_effect/water/New()
..()
spawn( 70 )
qdel(src)
/obj/effect/effect/water/Move(turf/newloc)
/obj/effect/particle_effect/water/Move(turf/newloc)
if (--src.life < 1)
qdel(src)
return 0
@@ -21,7 +21,7 @@
return 0
.=..()
/obj/effect/effect/water/Bump(atom/A)
/obj/effect/particle_effect/water/Bump(atom/A)
if(reagents)
reagents.reaction(A)
return ..()
@@ -36,85 +36,22 @@
// will always spawn at the items location, even if it's moved.
/* Example:
var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() -- creates new system
var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() -- creates new system
steam.set_up(5, 0, mob.loc) -- sets up variables
OPTIONAL: steam.attach(mob)
steam.start() -- spawns the effect
*/
/////////////////////////////////////////////
/obj/effect/effect/steam
/obj/effect/particle_effect/steam
name = "steam"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish"
density = 0
/datum/effect/effect/system/steam_spread
/obj/effect/particle_effect/steam/New()
..()
spawn(20)
qdel(src)
/datum/effect/effect/system/steam_spread/set_up(n = 3, c = 0, turf/loc)
if(n > 10)
n = 10
number = n
cardinals = c
location = loc
/datum/effect/effect/system/steam_spread/start()
var/i = 0
for(i=0, i<src.number, i++)
spawn(0)
if(holder)
src.location = get_turf(holder)
var/obj/effect/effect/steam/steam = PoolOrNew(/obj/effect/effect/steam, location)
var/direction
if(src.cardinals)
direction = pick(cardinal)
else
direction = pick(alldirs)
for(i=0, i<pick(1,2,3), i++)
sleep(5)
step(steam,direction)
spawn(20)
qdel(steam)
/////////////////////////////////////////////
//////// Attach a steam trail to an object (eg. a reacting beaker) that will follow it
// even if it's carried of thrown.
/////////////////////////////////////////////
/datum/effect/effect/system/steam_trail_follow
var/turf/oldposition
var/processing = 1
var/on = 1
/datum/effect/effect/system/steam_trail_follow/set_up(atom/atom)
attach(atom)
oldposition = get_turf(atom)
/datum/effect/effect/system/steam_trail_follow/start()
if(!src.on)
src.on = 1
src.processing = 1
if(src.processing)
src.processing = 0
spawn(0)
if(src.number < 3)
var/obj/effect/effect/steam/I = PoolOrNew(/obj/effect/effect/steam, oldposition)
src.number++
src.oldposition = get_turf(holder)
I.dir = src.holder.dir
spawn(10)
qdel(I)
src.number--
spawn(2)
if(src.on)
src.processing = 1
src.start()
else
spawn(2)
if(src.on)
src.processing = 1
src.start()
/datum/effect/effect/system/steam_trail_follow/proc/stop()
src.processing = 0
src.on = 0
/datum/effect_system/steam_spread
effect_type = /obj/effect/particle_effect/steam