diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm
index 181fa0d06db..aff9e5b7c54 100644
--- a/code/__HELPERS/reagents.dm
+++ b/code/__HELPERS/reagents.dm
@@ -86,8 +86,7 @@
/datum/reagents/proc/create_foam(foamtype, foam_volume, result_type = null, notification = null, log = FALSE)
var/location = get_turf(my_atom)
- var/datum/effect_system/fluid_spread/foam/foam = new foamtype()
- foam.set_up(amount = foam_volume, holder = my_atom, location = location, carry = src, result_type = result_type)
+ var/datum/effect_system/fluid_spread/foam/foam = new foamtype(location, null, foam_volume, my_atom, carry = src, result_type)
foam.start(log = log)
clear_reagents()
diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm
index 4ca6932cb3c..c01fe4f718f 100644
--- a/code/controllers/subsystem/explosions.dm
+++ b/code/controllers/subsystem/explosions.dm
@@ -383,13 +383,11 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec
shake_the_room(epicenter, orig_max_distance, far_dist, devastation_range, heavy_impact_range)
if(heavy_impact_range > 1)
- var/datum/effect_system/explosion/E
- if(smoke)
- E = new /datum/effect_system/explosion/smoke
- else
- E = new
- E.set_up(epicenter)
- E.start()
+ var/effect_type = /datum/effect_system/explosion
+ if (smoke)
+ effect_type = /datum/effect_system/explosion/smoke
+ var/datum/effect_system/explosion/system = new effect_type(epicenter)
+ system.start()
//flash mobs
if(flash_range)
diff --git a/code/controllers/subsystem/market.dm b/code/controllers/subsystem/market.dm
index 283a147d5ae..a56ad90b1fd 100644
--- a/code/controllers/subsystem/market.dm
+++ b/code/controllers/subsystem/market.dm
@@ -116,10 +116,7 @@ SUBSYSTEM_DEF(market)
return
var/atom/movable/thing = purchase.entry.spawn_item(target, purchase)
purchase.post_purchase_effects(thing)
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(5, 1, target)
- sparks.attach(thing)
- sparks.start()
+ do_sparks(5, TRUE, target)
qdel(purchase)
/// Used to add /datum/market_purchase to queued_purchases var. Returns TRUE when queued.
diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm
index 5498a8a81ef..65b3a9e1376 100644
--- a/code/datums/components/jetpack.dm
+++ b/code/datums/components/jetpack.dm
@@ -94,9 +94,8 @@
/datum/component/jetpack/proc/setup_trail(mob/user)
if(trail)
QDEL_NULL(trail)
- trail = new effect_type
+ trail = new effect_type(user)
trail.auto_process = FALSE
- trail.set_up(user)
trail.start()
/datum/component/jetpack/proc/activate(datum/source, mob/new_user)
diff --git a/code/datums/elements/deliver_first.dm b/code/datums/elements/deliver_first.dm
index b49c4dc28f4..7455c0646a1 100644
--- a/code/datums/elements/deliver_first.dm
+++ b/code/datums/elements/deliver_first.dm
@@ -97,8 +97,7 @@
///called to remove the element in a flavorful way, either from delivery or from emagging/breaking open the crate
/datum/element/deliver_first/proc/remove_lock(obj/structure/closet/target)
target.visible_message(span_notice("[target]'s delivery lock self destructs, spewing sparks from the mechanism!"))
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(4, 0, target.loc)
+ var/datum/effect_system/basic/spark_spread/spark_system = new(target.loc, 4, 0)
spark_system.start()
playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
target.RemoveElement(/datum/element/deliver_first, goal_area_type, payment)
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 9983761fa91..4d0b715d762 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -46,8 +46,7 @@
// if effects are not specified and not explicitly disabled, sparks
if((!effectin || !effectout) && !no_effects)
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(5, 1, teleatom)
+ var/datum/effect_system/basic/spark_spread/sparks = new(teleatom, 5, TRUE)
if (!effectin)
effectin = sparks
if (!effectout)
@@ -55,8 +54,7 @@
if(TELEPORT_CHANNEL_QUANTUM)
// if effects are not specified and not explicitly disabled, rainbow sparks
if ((!effectin || !effectout) && !no_effects)
- var/datum/effect_system/spark_spread/quantum/sparks = new
- sparks.set_up(5, 1, teleatom)
+ var/datum/effect_system/basic/spark_spread/quantum/sparks = new(teleatom, 5, TRUE)
if (!effectin)
effectin = sparks
if (!effectout)
@@ -127,8 +125,7 @@
if(sound)
playsound(location, sound, 60, TRUE)
if(effect)
- effect.attach(location)
- effect.start()
+ effect.attach(location).start()
/**
* Attempts to find a "safe" floor turf within some given z-levels
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 08cd5bdc61a..bca3a66c2a8 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -45,8 +45,7 @@
if(!COOLDOWN_FINISHED(src, foam_cooldown))
to_chat(user, span_warning("[src] cannot be activated for [DisplayTimeText(COOLDOWN_TIMELEFT(src, foam_cooldown))]!"))
return
- var/datum/effect_system/fluid_spread/foam/foam = new
- foam.set_up(4, holder = src, location = loc)
+ var/datum/effect_system/fluid_spread/foam/foam = new(loc, 4, holder = src)
foam.start()
uses--
to_chat(user, span_notice("You activate [src]. It now has [uses] uses of foam remaining."))
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 92e6c994305..58800d06398 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -518,9 +518,7 @@
return FALSE
if(!prob(prb))
return FALSE
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
return electrocute_mob(user, get_area(src), src, 0.7, TRUE)
/**
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 228391e6bde..0111a5c71b2 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -155,9 +155,7 @@
var/turf/T = get_turf(drone)
message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(drone)] at [ADMIN_VERBOSEJMP(T)]!")
log_silicon("[key_name(usr)] detonated [key_name(drone)]!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, TRUE, drone)
- s.start()
+ do_sparks(3, TRUE< drone)
drone.visible_message(span_danger("\the [drone] self-destructs!"))
drone.investigate_log("has been gibbed by a robotics console.", INVESTIGATE_DEATHS)
drone.gib()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 1951d84a775..2288eae191e 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -55,7 +55,7 @@
var/safe = TRUE
///whether the door is bolted or not.
var/locked = FALSE
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
///ignore this, just use explosion_block
var/real_explosion_block
///if TRUE, this door will always open on red alert
@@ -120,8 +120,7 @@
GLOB.elevator_doors += src
else
stack_trace("Elevator door [src] ([x],[y],[z]) has no linked elevator ID!")
- spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(2, 1, src)
+ spark_system = new(src, 2, TRUE)
if(density)
flags_1 |= PREVENT_CLICK_UNDER_1
else
@@ -178,9 +177,7 @@
/obj/machinery/door/Destroy()
if(elevator_mode)
GLOB.elevator_doors -= src
- if(spark_system)
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
QDEL_NULL(filler)
air_update_turf(TRUE, FALSE)
return ..()
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 285b19b6c4b..35c967e0f28 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -151,7 +151,7 @@
var/id = null
var/disable = 0
var/last_spark = 0
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26)
@@ -160,8 +160,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26)
/obj/machinery/sparker/Initialize(mapload)
. = ..()
- spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(2, 1, src)
+ spark_system = new(2, TRUE, src)
spark_system.attach(src)
register_context()
if(mapload)
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index e45daf7a98e..646d5288c51 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -184,9 +184,7 @@
if(!hidden)
playsound(target, 'sound/items/weapons/flash.ogg', 25, TRUE)
- var/datum/effect_system/spark_spread/quantum/spark_system = new /datum/effect_system/spark_spread/quantum()
- spark_system.set_up(5, TRUE, target)
- spark_system.start()
+ do_sparks(5, TRUE, target, spark_type = /datum/effect_system/basic/spark_spread/quantum)
sleep(teleport_speed)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 23579cf31e7..cf9f42ee778 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -94,7 +94,7 @@ DEFINE_BITFIELD(turret_flags, list(
/// Determines if our projectiles hit our faction
var/ignore_faction = FALSE
/// The spark system, used for generating... sparks?
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
/// The turret will try to shoot from a turf in that direction when in a wall
var/wall_turret_direction
/// If the turret is manually controlled
@@ -124,11 +124,9 @@ DEFINE_BITFIELD(turret_flags, list(
if(!base)
base = src
update_appearance()
- //Sets up a spark system
- spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(5, 0, src)
+ // Sets up a spark system
+ spark_system = new(src, 5, FALSE)
spark_system.attach(src)
-
tracker = new(src, scan_range)
tracker.recalculate_field(full_recalc = TRUE) // manually call this so that our tracker var is set before we set anything up
setup()
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index d09f2af6e7a..841f2099ca4 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -116,9 +116,7 @@
doteleport(user, target_pad)
/obj/machinery/quantumpad/proc/sparks()
- var/datum/effect_system/spark_spread/quantum/s = new /datum/effect_system/spark_spread/quantum
- s.set_up(5, 1, get_turf(src))
- s.start()
+ do_sparks(5, TRUE, src, spark_type = /datum/effect_system/basic/spark_spread/quantum)
/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
. = ..()
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index ded188b82bd..7a965b2c42c 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -149,8 +149,7 @@
if(obj_flags & EMAGGED)
return FALSE
obj_flags |= EMAGGED
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(4, 0, src.loc)
+ var/datum/effect_system/basic/spark_spread/spark_system = new(src.loc, 4, 0)
spark_system.start()
playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
balloon_alert(user, "machine rigged")
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 64e4e735afd..72fb2659959 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -507,9 +507,7 @@
if(uv_super)
visible_message(span_warning("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber."))
playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 50, TRUE)
- var/datum/effect_system/fluid_spread/smoke/bad/black/smoke = new
- smoke.set_up(0, holder = src, location = src)
- smoke.start()
+ do_smoke(0, src, src, smoke_type = /datum/effect_system/fluid_spread/smoke/bad/black)
QDEL_NULL(helmet)
QDEL_NULL(suit)
QDEL_NULL(mask)
@@ -568,12 +566,11 @@
charge_cell(charge_per_item, cell, grid_only = TRUE)
/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb)
- if(!prob(prb))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- if(electrocute_mob(user, src, src, 1, TRUE))
- return 1
+ if(prob(prb))
+ return
+ do_sparks(5, TRUE, src)
+ if(electrocute_mob(user, src, src, 1, TRUE))
+ return TRUE
/obj/machinery/suit_storage_unit/relaymove(mob/living/user, direction)
if(locked)
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index b822b0c4b69..20b77b00ee6 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -16,8 +16,6 @@
light_color = LIGHT_COLOR_GREEN
/// Server linked to.
var/obj/machinery/telecomms/message_server/linked_server = null
- /// Sparks effect - For emag
- var/datum/effect_system/spark_spread/spark_system
/// Computer properties.
/// 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
var/screen = MSG_MON_SCREEN_MAIN
@@ -34,7 +32,6 @@
/obj/machinery/computer/message_monitor/Initialize(mapload)
..()
- spark_system = new
return INITIALIZE_HINT_LATELOAD
/obj/machinery/computer/message_monitor/post_machine_initialize()
@@ -69,22 +66,21 @@
/obj/machinery/computer/message_monitor/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
return FALSE
- if(!isnull(linked_server))
- obj_flags |= EMAGGED
- screen = MSG_MON_SCREEN_HACKED
- spark_system.set_up(5, 0, src)
- spark_system.start()
- var/obj/item/paper/monitorkey/monitor_key_paper = new(loc, linked_server)
- // Will help make emagging the console not so easy to get away with.
- monitor_key_paper.add_raw_text("
£%@%(*$%&(£&?*(%&£/{}")
- var/time = 100 * length(linked_server.decryptkey)
- addtimer(CALLBACK(src, PROC_REF(unemag_console)), time)
- error_message = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!"
- linked_server.toggled = FALSE
- return TRUE
- else
+ if(isnull(linked_server))
to_chat(user, span_notice("A no server error appears on the screen."))
- return FALSE
+ return FALSE
+
+ obj_flags |= EMAGGED
+ screen = MSG_MON_SCREEN_HACKED
+ do_sparks(5, FALSE, src)
+ var/obj/item/paper/monitorkey/monitor_key_paper = new(loc, linked_server)
+ // Will help make emagging the console not so easy to get away with.
+ monitor_key_paper.add_raw_text("
£%@%(*$%&(£&?*(%&£/{}")
+ var/time = 100 * length(linked_server.decryptkey)
+ addtimer(CALLBACK(src, PROC_REF(unemag_console)), time)
+ error_message = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!"
+ linked_server.toggled = FALSE
+ return TRUE
/// Remove the emag effect from the console
/obj/machinery/computer/message_monitor/proc/unemag_console()
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index 85bce021f47..c3c6f9119ef 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -20,9 +20,7 @@
if (prob(40))
new /obj/effect/decal/cleanable/blood/splatter(loc, null, GET_ATOM_BLOOD_DNA(src))
else if (prob(10))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
// Doesn't have overlay support as of now
/obj/effect/decal/cleanable/blood/gibs/robot_debris/update_blood_color()
diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm
index 16254e9610c..c3bf2d97aa3 100644
--- a/code/game/objects/effects/decals/remains.dm
+++ b/code/game/objects/effects/decals/remains.dm
@@ -49,11 +49,7 @@
///Releases a cloud of smoke based on the randomly generated reagent in Initialize().
/obj/effect/decal/remains/human/smokey/proc/release_smoke(mob/living/smoke_releaser)
visible_message(span_warning("[smoke_releaser] disturbs [src], which releases a huge cloud of gas!"))
- var/datum/effect_system/fluid_spread/smoke/chem/cigarette_puff = new()
- cigarette_puff.chemholder.add_reagent(that_shit_that_killed_saddam, 15)
- cigarette_puff.attach(get_turf(src))
- cigarette_puff.set_up(range = 2, amount = DIAMOND_AREA(2), holder = src, location = get_turf(src), silent = TRUE)
- cigarette_puff.start()
+ do_chem_smoke(2, src, get_turf(src), that_shit_that_killed_saddam, 15)
///Subtype of smokey remains used for rare maintenance spawns.
/obj/effect/decal/remains/human/smokey/maintenance
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index 73ffc52a2bd..cbaa286f068 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -1,10 +1,12 @@
-/* This is an attempt to make some easily reusable "particle" type effect, to stop the code
-constantly having to be rewritten. An item like the jetpack that uses the ion_trail_follow system, just has one
-defined, then set up when it is created with New(). Then this same system can just be reused each time
-it needs to create more trails.A beaker could have a steam_trail_follow system set up, then the steam
-would spawn and follow the beaker, even if it is carried or thrown.
+/*
+ * This is an attempt to make some easily reusable "particle" type effect, to stop the code
+ * constantly having to be rewritten. An item like the jetpack that uses the ion_trail_follow system, just has one
+ * defined, then set up when it is created with New(). Then this same system can just be reused each time
+ * it needs to create more trails.A beaker could have a steam_trail_follow system set up, then the steam
+ * would spawn and follow the beaker, even if it is carried or thrown.
*/
+#define PER_SYSTEM_PARTICLE_CAP 20
/obj/effect/particle_effect
name = "particle effect"
@@ -17,36 +19,61 @@ would spawn and follow the beaker, even if it is carried or thrown.
return TRUE
/datum/effect_system
- var/number = 3
- var/cardinals_only = FALSE
- var/turf/location
- var/atom/holder
- var/effect_type
- var/total_effects = 0
- var/autocleanup = FALSE //will delete itself after use
+ // Does not contain any behaviors and should not be used by itself
+ abstract_type = /datum/effect_system
+ /// Turf on which to spawn the effects
+ var/turf/location = null
+ /// Atom that is spawning the particles whose location we're following
+ var/atom/holder = null
+
+/datum/effect_system/New(turf/location)
+ . = ..()
+ src.location = get_turf(location)
/datum/effect_system/Destroy()
holder = null
location = null
return ..()
-/datum/effect_system/proc/set_up(number = 3, cardinals_only = FALSE, location)
- src.number = min(number, 10)
- src.cardinals_only = cardinals_only
- src.location = get_turf(location)
-
-/datum/effect_system/proc/attach(atom/atom)
- holder = atom
+/// Instruct the effect system to start following an atom. Can be chained into .start()
+/datum/effect_system/proc/attach(atom/new_holder)
+ RETURN_TYPE(/datum/effect_system)
+ holder = new_holder
+ return src
+/// Start the effect system
/datum/effect_system/proc/start()
+ return
+
+/// Basic effect system which spawns a certain number of moving effects
+/datum/effect_system/basic
+ /// Total number of particles to spawn
+ var/amount = 3
+ /// Should we pick among cardinals or all directions when deciding where the particle should move
+ var/cardinals_only = FALSE
+ /// Typepath of the effect to spawn
+ var/effect_type = null
+ /// Total amount of effects we currently have active
+ var/total_effects = 0
+ /// Should the system delete itself after finishing?
+ var/autocleanup = FALSE
+
+/datum/effect_system/basic/New(turf/location, amount = null, cardinals_only = null)
+ . = ..()
+ if (!isnull(amount))
+ src.amount = amount
+ if (!isnull(cardinals_only))
+ src.cardinals_only = cardinals_only
+
+/datum/effect_system/basic/start()
if(QDELETED(src))
return
- for(var/i in 1 to number)
- if(total_effects > 20)
+ for(var/i in 1 to amount)
+ if(total_effects > PER_SYSTEM_PARTICLE_CAP)
return
generate_effect()
-/datum/effect_system/proc/generate_effect()
+/datum/effect_system/basic/proc/generate_effect()
if(holder)
location = get_turf(holder)
var/obj/effect/effect = new effect_type(location)
@@ -56,15 +83,17 @@ would spawn and follow the beaker, even if it is carried or thrown.
direction = pick(GLOB.cardinals)
else
direction = pick(GLOB.alldirs)
- var/step_amt = pick(1,2,3)
+
+ var/step_amt = rand(1, 3)
var/step_delay = 5
-
var/datum/move_loop/loop = GLOB.move_manager.move(effect, direction, step_delay, timeout = step_delay * step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
- RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(decrement_total_effect))
+ if (autocleanup)
+ RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(decrement_total_effect))
-/datum/effect_system/proc/decrement_total_effect(datum/source)
+/datum/effect_system/basic/proc/decrement_total_effect(datum/source)
SIGNAL_HANDLER
total_effects--
- if(!autocleanup || total_effects > 0)
- return
- QDEL_IN(src, 2 SECONDS)
+ if(total_effects == 0)
+ QDEL_IN(src, 2 SECONDS)
+
+#undef PER_SYSTEM_PARTICLE_CAP
diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm
index a8a3431ef9c..9f4db05d967 100644
--- a/code/game/objects/effects/effect_system/effects_explosion.dm
+++ b/code/game/objects/effects/effect_system/effects_explosion.dm
@@ -9,23 +9,20 @@
return INITIALIZE_HINT_LATELOAD
/obj/effect/particle_effect/expl_particles/LateInitialize()
- var/step_amt = pick(25;1,50;2,100;3,200;4)
-
+ var/step_amt = pick(25;1, 50;2, 100;3, 200;4)
var/datum/move_loop/loop = GLOB.move_manager.move(src, pick(GLOB.alldirs), 1, timeout = step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(end_particle))
/obj/effect/particle_effect/expl_particles/proc/end_particle(datum/source)
SIGNAL_HANDLER
- if(QDELETED(src))
- return
- qdel(src)
+ if (!QDELETED(src))
+ qdel(src)
-/datum/effect_system/expl_particles
- number = 10
+/datum/effect_system/basic/expl_particles
+ amount = 10
-/datum/effect_system/expl_particles/start()
- for(var/i in 1 to number)
- new /obj/effect/particle_effect/expl_particles(location)
+/datum/effect_system/basic/expl_particles/generate_effect()
+ new /obj/effect/particle_effect/expl_particles(location)
/obj/effect/explosion
name = "fire"
@@ -45,21 +42,16 @@
/datum/effect_system/explosion
-/datum/effect_system/explosion/set_up(location)
- src.location = get_turf(location)
-
/datum/effect_system/explosion/start()
- new/obj/effect/explosion( location )
- var/datum/effect_system/expl_particles/P = new/datum/effect_system/expl_particles()
- P.set_up(10, 0, location)
- P.start()
+ new /obj/effect/explosion(location)
+ var/datum/effect_system/basic/expl_particles/boom_particles = new(location)
+ boom_particles.start()
/datum/effect_system/explosion/smoke
/datum/effect_system/explosion/smoke/proc/create_smoke()
- var/datum/effect_system/fluid_spread/smoke/S = new
- S.set_up(2, holder = holder, location = location)
- S.start()
+ var/datum/effect_system/fluid_spread/smoke/smoke_system = new(location, range = 2)
+ smoke_system.attach(holder).start()
/datum/effect_system/explosion/smoke/start()
..()
diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm
deleted file mode 100644
index c47f4684283..00000000000
--- a/code/game/objects/effects/effect_system/effects_other.dm
+++ /dev/null
@@ -1,113 +0,0 @@
-
-/////////////////////////////////////////////
-//////// 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!
-/////////////////////////////////////////////
-
-/datum/effect_system/trail_follow
- var/turf/oldposition
- var/active = FALSE
- var/allow_overlap = FALSE
- var/auto_process = TRUE
- var/qdel_in_time = 10
- var/fadetype = "ion_fade"
- var/fade = TRUE
- var/nograv_required = FALSE
-
-/datum/effect_system/trail_follow/set_up(atom/atom)
- attach(atom)
- oldposition = get_turf(atom)
-
-/datum/effect_system/trail_follow/Destroy()
- oldposition = null
- stop()
- return ..()
-
-/datum/effect_system/trail_follow/proc/stop()
- oldposition = null
- STOP_PROCESSING(SSfastprocess, src)
- active = FALSE
- return TRUE
-
-/datum/effect_system/trail_follow/start()
- oldposition = get_turf(holder)
- if(!check_conditions())
- return FALSE
- if(auto_process)
- START_PROCESSING(SSfastprocess, src)
- active = TRUE
- return TRUE
-
-/datum/effect_system/trail_follow/process()
- generate_effect()
-
-/datum/effect_system/trail_follow/generate_effect()
- if(!check_conditions())
- return stop()
- if(oldposition && !(oldposition == get_turf(holder)))
- if(!oldposition.has_gravity() || !nograv_required)
- var/obj/effect/E = new effect_type(oldposition)
- set_dir(E)
- if(fade)
- flick(fadetype, E)
- E.icon_state = ""
- if(qdel_in_time)
- QDEL_IN(E, qdel_in_time)
- oldposition = get_turf(holder)
-
-/datum/effect_system/trail_follow/proc/check_conditions()
- if(!get_turf(holder))
- return FALSE
- return TRUE
-
-/datum/effect_system/trail_follow/steam
- effect_type = /obj/effect/particle_effect/steam
-
-/obj/effect/particle_effect/ion_trails
- name = "ion trails"
- icon_state = "ion_trails"
- anchored = TRUE
-
-/obj/effect/particle_effect/ion_trails/flight
- icon_state = "ion_trails_flight"
-
-/datum/effect_system/trail_follow/ion
- effect_type = /obj/effect/particle_effect/ion_trails
- nograv_required = TRUE
- qdel_in_time = 20
-
-/datum/effect_system/trail_follow/proc/set_dir(obj/effect/particle_effect/ion_trails/I)
- I.setDir(holder.dir)
-
-/datum/effect_system/trail_follow/ion/grav_allowed
- nograv_required = FALSE
-
-//Reagent-based explosion effect
-
-/datum/effect_system/reagents_explosion
- var/amount // TNT equivalent
- var/flashing_factor = null // factor of how powerful the flash effect relatively to the explosion
- var/flaming_factor = null // factor of how powerful the flame effect is relatively to explosion
- var/explosion_message = 1 //whether we show a message to mobs.
-
-/datum/effect_system/reagents_explosion/set_up(amt, loca, flash_fact = null, flame_fact = null, message = TRUE)
- amount = amt
- explosion_message = message
- if(isturf(loca))
- location = loca
- else
- location = get_turf(loca)
- flashing_factor = flash_fact
- flaming_factor = flame_fact
-
-/// Starts the explosion. The explosion_source is as part of logging and identifying the source of the explosion for logs.
-/datum/effect_system/reagents_explosion/start(atom/explosion_source = null)
- if(!explosion_source)
- stack_trace("Reagent explosion triggered without a source atom. This explosion may have incomplete logging.")
-
- if(explosion_message)
- location.visible_message(span_danger("The solution violently explodes!"), span_hear("You hear an explosion!"))
-
- dyn_explosion(location, amount, flash_range = flashing_factor, flame_range = flaming_factor, explosion_cause = explosion_source)
diff --git a/code/game/objects/effects/effect_system/effects_reagents_explosion.dm b/code/game/objects/effects/effect_system/effects_reagents_explosion.dm
new file mode 100644
index 00000000000..41a0292d8b1
--- /dev/null
+++ b/code/game/objects/effects/effect_system/effects_reagents_explosion.dm
@@ -0,0 +1,30 @@
+
+
+//Reagent-based explosion effect
+
+/datum/effect_system/reagents_explosion
+ /// Explosive power
+ var/amount
+ /// Factor of how powerful the flash effect relatively to the explosion
+ var/flashing_factor = null
+ /// Factor of how powerful the flame effect is relatively to explosion
+ var/flaming_factor = null
+ /// Whether we show a message to mobs.
+ var/explosion_message = 1
+
+/datum/effect_system/reagents_explosion/New(turf/location, amount, flash_fact = null, flame_fact = null, message = TRUE)
+ . = ..()
+ src.amount = amount
+ explosion_message = message
+ if (!isturf(location))
+ location = get_turf(location)
+ flashing_factor = flash_fact
+ flaming_factor = flame_fact
+
+/// Starts the explosion. The explosion_source is as part of logging and identifying the source of the explosion for logs.
+/datum/effect_system/reagents_explosion/start(atom/explosion_source = null)
+ if(!explosion_source)
+ stack_trace("Reagent explosion triggered without a source atom. This explosion may have incomplete logging.")
+ if(explosion_message)
+ location.visible_message(span_danger("The solution violently explodes!"), span_hear("You hear an explosion!"))
+ dyn_explosion(location, amount, flash_range = flashing_factor, flame_range = flaming_factor, explosion_cause = explosion_source)
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index feab1149c48..8a40659a003 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -5,13 +5,13 @@
// will always spawn at the items location.
/////////////////////////////////////////////
-/proc/do_sparks(number, cardinal_only, datum/source)
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(number, cardinal_only, source)
+/proc/do_sparks(number, cardinal_only, atom/source, atom/holder = null, spark_type = /datum/effect_system/basic/spark_spread)
+ var/datum/effect_system/basic/spark_spread/sparks = new spark_type(get_turf(source), number, cardinal_only)
+ if (holder)
+ sparks.attach(holder)
sparks.autocleanup = TRUE
sparks.start()
-
/obj/effect/particle_effect/sparks
name = "sparks"
icon_state = "sparks"
@@ -32,7 +32,7 @@
var/turf/location = loc
if(isturf(location))
affect_location(location, just_initialized = TRUE)
- QDEL_IN(src, 20)
+ QDEL_IN(src, 2 SECONDS)
/obj/effect/particle_effect/sparks/Destroy()
var/turf/location = loc
@@ -41,11 +41,15 @@
return ..()
/obj/effect/particle_effect/sparks/Move()
- ..()
+ . = ..()
var/turf/location = loc
if(isturf(location))
affect_location(location)
+/obj/effect/particle_effect/sparks/quantum
+ name = "quantum sparks"
+ icon_state = "quantum_sparks"
+
/*
* Apply the effects of this spark to its location.
*
@@ -56,7 +60,7 @@
* just_initialized - If the spark is just being created, and we need to manually affect everything in the location
*/
/obj/effect/particle_effect/sparks/proc/affect_location(turf/location, just_initialized = FALSE)
- location.hotspot_expose(1000,100)
+ location.hotspot_expose(1000, 100)
SEND_SIGNAL(location, COMSIG_ATOM_TOUCHED_SPARKS, src) // for plasma floors; other floor types only have to worry about the mysterious HAZARDOUS sparks
if(just_initialized)
for(var/atom/movable/singed in location)
@@ -79,27 +83,23 @@
if(reagents && !(reagents.flags & SEALED_CONTAINER))
reagents.expose_temperature(1000) // we set this at 1000 because that's the max reagent temp for a chem heater, higher temps require more than sparks
return
+
if(ishuman(singed))
var/mob/living/carbon/human/singed_human = singed
for(var/obj/item/anything in singed_human.get_visible_items())
sparks_touched(src, anything)
-/datum/effect_system/spark_spread
+/datum/effect_system/basic/spark_spread
effect_type = /obj/effect/particle_effect/sparks
-/datum/effect_system/spark_spread/quantum
+/datum/effect_system/basic/spark_spread/quantum
effect_type = /obj/effect/particle_effect/sparks/quantum
-
//electricity
/obj/effect/particle_effect/sparks/electricity
name = "lightning"
icon_state = "electricity"
-/obj/effect/particle_effect/sparks/quantum
- name = "quantum sparks"
- icon_state = "quantum_sparks"
-
-/datum/effect_system/lightning_spread
+/datum/effect_system/basic/lightning_spread
effect_type = /obj/effect/particle_effect/sparks/electricity
diff --git a/code/game/objects/effects/effect_system/effects_trail.dm b/code/game/objects/effects/effect_system/effects_trail.dm
new file mode 100644
index 00000000000..fa0e688fe92
--- /dev/null
+++ b/code/game/objects/effects/effect_system/effects_trail.dm
@@ -0,0 +1,103 @@
+
+/////////////////////////////////////////////
+//////// 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!
+/////////////////////////////////////////////
+
+/datum/effect_system/trail_follow
+ /// Previous position of the atom we're tracking
+ var/turf/oldposition
+ /// Are we currently spawning particles?
+ var/active = FALSE
+ /// Can the particles be spawned ontop of eachother?
+ var/allow_overlap = FALSE
+ /// Should we automatically start processing ourselves?
+ var/auto_process = TRUE
+ /// Delay before we delete the particles
+ var/qdel_in_time = 1 SECONDS
+ /// Typepath we should spawn
+ var/effect_type = null
+ /// Should we flick an icon state and blank out the particles afterwards?
+ var/fade = TRUE
+ /// icon_state to flick on our particles
+ var/fadetype = "ion_fade"
+ /// Are we restricted to zero-g only?
+ var/nograv_required = FALSE
+
+/datum/effect_system/trail_follow/New(turf/location)
+ . = ..()
+ attach(location)
+ oldposition = location
+
+/datum/effect_system/trail_follow/Destroy()
+ oldposition = null
+ stop()
+ return ..()
+
+/datum/effect_system/trail_follow/proc/stop()
+ oldposition = null
+ STOP_PROCESSING(SSfastprocess, src)
+ active = FALSE
+ return TRUE
+
+/datum/effect_system/trail_follow/start()
+ oldposition = get_turf(holder)
+ if(!check_conditions())
+ return FALSE
+ if(auto_process)
+ START_PROCESSING(SSfastprocess, src)
+ active = TRUE
+ return TRUE
+
+/datum/effect_system/trail_follow/process()
+ generate_effect()
+
+/datum/effect_system/trail_follow/proc/generate_effect()
+ if(!check_conditions())
+ return stop()
+
+ if(!oldposition || oldposition == get_turf(holder))
+ oldposition = get_turf(holder)
+ return
+
+ if(nograv_required && oldposition.has_gravity())
+ oldposition = get_turf(holder)
+ return
+
+ var/obj/effect/particle = new effect_type(oldposition)
+ set_dir(particle)
+ if(fade)
+ flick(fadetype, particle)
+ particle.icon_state = ""
+
+ if(qdel_in_time)
+ QDEL_IN(particle, qdel_in_time)
+
+/datum/effect_system/trail_follow/proc/check_conditions()
+ if(!get_turf(holder))
+ return FALSE
+ return TRUE
+
+/datum/effect_system/trail_follow/proc/set_dir(obj/effect/effect)
+ effect.setDir(holder.dir)
+
+/datum/effect_system/trail_follow/steam
+ effect_type = /obj/effect/particle_effect/steam
+
+/obj/effect/particle_effect/ion_trails
+ name = "ion trails"
+ icon_state = "ion_trails"
+ anchored = TRUE
+
+/obj/effect/particle_effect/ion_trails/flight
+ icon_state = "ion_trails_flight"
+
+/datum/effect_system/trail_follow/ion
+ effect_type = /obj/effect/particle_effect/ion_trails
+ nograv_required = TRUE
+ qdel_in_time = 2 SECONDS
+
+/datum/effect_system/trail_follow/ion/grav_allowed
+ nograv_required = FALSE
diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm
index f94e5d0e31c..f8f62c13b1b 100644
--- a/code/game/objects/effects/effect_system/effects_water.dm
+++ b/code/game/objects/effects/effect_system/effects_water.dm
@@ -4,15 +4,17 @@
name = "water"
icon_state = "extinguish"
pass_flags = PASSTABLE | PASSMACHINE | PASSSTRUCTURE | PASSGRILLE | PASSBLOB | PASSVEHICLE
- var/life = 15
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ /// Amount of turfs we pass before deleting ourselves
+ var/life = 15
/obj/effect/particle_effect/water/Initialize(mapload)
. = ..()
- QDEL_IN(src, 70)
+ QDEL_IN(src, 7 SECONDS)
/obj/effect/particle_effect/water/Move(turf/newloc)
- if (--src.life < 1)
+ life -= 1
+ if (life <= 0)
qdel(src)
return FALSE
return ..()
@@ -20,8 +22,7 @@
/obj/effect/particle_effect/water/Bump(atom/A)
if(reagents)
reagents.expose(A)
- if(A.reagents)
- A.reagents.expose_temperature(-25)
+ A.reagents?.expose_temperature(reagents.chem_temp)
return ..()
///Extinguisher snowflake
@@ -71,17 +72,11 @@
/////////////////////////////////////////////
// GENERIC STEAM SPREAD SYSTEM
-//Usage: set_up(number of bits of steam, use North/South/East/West only, spawn location)
+// Usage: set_up(number of bits of steam, use North/South/East/West only, spawn location)
// The attach(atom/atom) proc is optional, and can be called to attach the effect
// to something, like a smoking beaker, so then you can just call start() and the steam
// 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
- *steam.set_up(5, 0, mob.loc) -- sets up variables
- *OPTIONAL: steam.attach(mob)
- *steam.start() -- spawns the effect
-*/
/////////////////////////////////////////////
/obj/effect/particle_effect/steam
name = "steam"
@@ -90,11 +85,7 @@
/obj/effect/particle_effect/steam/Initialize(mapload)
. = ..()
- QDEL_IN(src, 20)
+ QDEL_IN(src, 2 SECONDS)
-/datum/effect_system/steam_spread
+/datum/effect_system/basic/steam_spread
effect_type = /obj/effect/particle_effect/steam
-
-/obj/effect/particle_effect/water/Bump(atom/A)
- if(A.reagents && reagents)
- A.reagents.expose_temperature(reagents.chem_temp)
diff --git a/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm b/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm
index a55f7caf5ac..9a4fb9f1f78 100644
--- a/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm
+++ b/code/game/objects/effects/effect_system/fluid_spread/_fluid_spread.dm
@@ -115,13 +115,16 @@
* A factory which produces fluid groups.
*/
/datum/effect_system/fluid_spread
- effect_type = /obj/effect/particle_effect/fluid
- /// The amount of smoke to produce.
+ /// The amount of fluid to produce.
var/amount = 10
+ /// Type of the effect we're spawning
+ var/effect_type = /obj/effect/particle_effect/fluid
-/datum/effect_system/fluid_spread/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location, ...)
- src.holder = holder
- src.location = location
+/datum/effect_system/fluid_spread/New(turf/location, range = 1, amount = null, atom/holder = null)
+ . = ..()
+ attach(holder)
+ if (isnull(amount))
+ amount = DIAMOND_AREA(range)
src.amount = amount
/datum/effect_system/fluid_spread/start(log = FALSE)
@@ -144,7 +147,6 @@
var/blame_msg
if (holder)
holder.transfer_fingerprints_to(flood) // This is important. If this doesn't exist thermobarics are annoying to adjudicate.
-
source_msg = "from inside of [ismob(holder) ? ADMIN_LOOKUPFLW(holder) : ADMIN_VERBOSEJMP(holder)]"
var/lastkey = holder.fingerprintslast
if (lastkey)
diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
index 0f96caf617e..736be058ee4 100644
--- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
@@ -178,31 +178,59 @@
if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated
kill_foam()
+/// Proc to quickly spawn foam
+/// reagent_type can accept a list of reagents, optionally as a key-value pair with values overriding reagent_volume if not null
+/proc/do_foam(range = 1, atom/holder = null, turf/location = null, datum/reagent/reagent_type = null, reagent_volume = 10, datum/reagents/carry = null, amount = null, log = FALSE, datum/effect_system/fluid_spread/foam/foam_type = /datum/effect_system/fluid_spread/foam, result_type = null, stop_reactions = FALSE, reagent_scale = FOAM_REAGENT_SCALE)
+ if (carry || isnull(reagent_type))
+ var/datum/effect_system/fluid_spread/foam/foam = new foam_type(location, range, amount, holder || location, carry, result_type, stop_reactions, reagent_scale)
+ foam.start(log = log)
+ return
+
+ if (ispath(reagent_type, /datum/reagent))
+ var/datum/reagents/foam_reagents = new /datum/reagents(reagent_volume)
+ foam_reagents.add_reagent(reagent_type, reagent_volume)
+ var/datum/effect_system/fluid_spread/foam/foam = new foam_type(location, range, amount, holder || location, foam_reagents, result_type, stop_reactions, reagent_scale)
+ foam.start(log = log)
+ return
+
+
+ if (!islist(reagent_type))
+ CRASH("do_foam passed a non-reagent path, non-list reagent_type [reagent_type]!")
+
+ var/list/reagent_list = reagent_type
+ var/chem_volume = 0
+ for (var/chem_type in reagent_list)
+ chem_volume += reagent_list[chem_type] || reagent_volume
+
+ var/datum/reagents/foam_reagents = new /datum/reagents(chem_volume)
+ for (var/chem_type in reagent_list)
+ foam_reagents.add_reagent(chem_type, reagent_list[chem_type] || reagent_volume)
+
+ var/datum/effect_system/fluid_spread/foam/foam = new foam_type(location, range, amount, holder || location, foam_reagents, result_type, stop_reactions, reagent_scale)
+ foam.start(log = log)
+
/// A factory for foam fluid floods.
/datum/effect_system/fluid_spread/foam
effect_type = /obj/effect/particle_effect/fluid/foam
/// A container for all of the chemicals we distribute through the foam.
- var/datum/reagents/chemholder
- /// The amount that
+ var/datum/reagents/chemholder = null
+ /// The amount that we multiply the payload by
var/reagent_scale = FOAM_REAGENT_SCALE
/// What type of thing the foam should leave behind when it dissipates.
var/atom/movable/result_type = null
-
-/datum/effect_system/fluid_spread/foam/New()
- ..()
+/datum/effect_system/fluid_spread/foam/New(turf/location, range = 1, amount = null, atom/holder = null, datum/reagents/carry = null, result_type = null, stop_reactions = FALSE, reagent_scale = FOAM_REAGENT_SCALE)
+ . = ..()
chemholder = new(1000, NO_REACT)
+ carry?.trans_to(chemholder, carry.total_volume, no_react = stop_reactions, copy_only = TRUE)
+ if(!isnull(result_type))
+ src.result_type = result_type
+ src.reagent_scale = reagent_scale
/datum/effect_system/fluid_spread/foam/Destroy()
QDEL_NULL(chemholder)
return ..()
-/datum/effect_system/fluid_spread/foam/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location = null, datum/reagents/carry = null, result_type = null, stop_reactions = FALSE)
- . = ..()
- carry?.trans_to(chemholder, carry.total_volume, no_react = stop_reactions, copy_only = TRUE)
- if(!isnull(result_type))
- src.result_type = result_type
-
/datum/effect_system/fluid_spread/foam/start(log = FALSE)
var/obj/effect/particle_effect/fluid/foam/foam = new effect_type(location, new /datum/fluid_group(amount))
var/foamcolor = mix_color_from_reagents(chemholder.reagent_list)
@@ -235,7 +263,6 @@
effect_type = /obj/effect/particle_effect/fluid/foam/long_life
reagent_scale = FOAM_REAGENT_SCALE * (30 / 8)
-
// Firefighting foam
/// A variant of foam which absorbs plasma in the air if there is a fire.
/obj/effect/particle_effect/fluid/foam/firefighting
@@ -468,9 +495,7 @@
/obj/effect/spawner/foam_starter/Initialize(mapload)
. = ..()
-
- var/datum/effect_system/fluid_spread/foam/foam = new foam_type()
- foam.set_up(foam_size, holder = src, location = loc)
+ var/datum/effect_system/fluid_spread/foam/foam = new foam_type(loc, foam_size, holder = src)
foam.start()
/obj/effect/spawner/foam_starter/small
diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm
index 83ef6e55293..be62c9a97f8 100644
--- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm
@@ -165,12 +165,13 @@
* - range: The amount of smoke to produce as number of steps from origin covered.
* - amount: The amount of smoke to produce as the total desired coverage area. Autofilled from the range arg if not set.
* - location: Where to produce the smoke cloud.
- * - smoke_type: The smoke typepath to spawn.
+ * - smoke_type - Typepath for the effect system to use
+ * - effect_type: The smoke typepath to spawn.
+ * - log: Should the system log the smoke spawned?
*/
-/proc/do_smoke(range = 0, amount = DIAMOND_AREA(range), atom/holder = null, location = null, smoke_type = /obj/effect/particle_effect/fluid/smoke, log = FALSE)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.effect_type = smoke_type
- smoke.set_up(amount = amount, holder = holder, location = location)
+/proc/do_smoke(range = 0, atom/holder = null, location = null, amount = null, smoke_type = /datum/effect_system/fluid_spread/smoke, effect_type = /obj/effect/particle_effect/fluid/smoke, log = FALSE)
+ var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_type(location, range, amount, holder)
+ smoke.effect_type = effect_type
smoke.start(log = log)
/////////////////////////////////////////////
@@ -205,7 +206,6 @@
. = ..()
if(!.)
return
-
smoker.drop_all_held_items()
smoker.adjust_oxy_loss(1)
smoker.emote("cough")
@@ -275,6 +275,10 @@
/// Whether to make sure each affected turf is actually within range before cooling it.
var/distcheck = TRUE
+/datum/effect_system/fluid_spread/smoke/freezing/New(turf/location, range = 1, amount = null, atom/holder = null, blast_radius = 0)
+ . = ..()
+ blast = blast_radius
+
/**
* Chills an open turf.
*
@@ -286,7 +290,7 @@
* Arguments:
* - [chilly][/turf/open]: The open turf to chill
*/
-/datum/effect_system/fluid_spread/smoke/freezing/proc/Chilled(turf/open/chilly)
+/datum/effect_system/fluid_spread/smoke/freezing/proc/chill_turf(turf/open/chilly)
if(!istype(chilly))
return
@@ -319,14 +323,10 @@
for(var/obj/item/potential_tinder in chilly)
potential_tinder.extinguish()
-/datum/effect_system/fluid_spread/smoke/freezing/set_up(range = 5, amount = DIAMOND_AREA(range), atom/holder, atom/location, blast_radius = 0)
- . = ..()
- blast = blast_radius
-
/datum/effect_system/fluid_spread/smoke/freezing/start(log = FALSE)
if(blast)
for(var/turf/T in RANGE_TURFS(blast, location))
- Chilled(T)
+ chill_turf(T)
return ..()
/// A variant of the base freezing smoke formerly used by the vent decontamination event.
@@ -398,13 +398,33 @@
return TRUE
/// Helper to quickly create a cloud of reagent smoke
-/proc/do_chem_smoke(range = 0, amount = DIAMOND_AREA(range), atom/holder = null, location = null, reagent_type = /datum/reagent/water, reagent_volume = 10, log = FALSE, datum/effect_system/fluid_spread/smoke/chem/smoke_type = /datum/effect_system/fluid_spread/smoke/chem)
- var/datum/reagents/smoke_reagents = new/datum/reagents(reagent_volume)
- smoke_reagents.add_reagent(reagent_type, reagent_volume)
+/// reagent_type can accept a list of reagents, optionally as a key-value pair with values overriding reagent_volume if not null
+/proc/do_chem_smoke(range = 0, atom/holder = null, location = null, reagent_type = /datum/reagent/water, reagent_volume = 10, datum/reagents/carry = null, carry_limit = null, log = FALSE, amount = null, datum/effect_system/fluid_spread/smoke/chem/smoke_type = /datum/effect_system/fluid_spread/smoke/chem, silent = TRUE)
+ if (carry)
+ var/datum/effect_system/fluid_spread/smoke/chem/smoke = new smoke_type(location, range, amount, holder || location, carry, carry_limit, silent)
+ smoke.start(log = log)
+ return
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new smoke_type
- smoke.attach(location)
- smoke.set_up(amount = amount, holder = holder, location = location, carry = smoke_reagents, silent = TRUE)
+ if (ispath(reagent_type, /datum/reagent))
+ var/datum/reagents/smoke_reagents = new /datum/reagents(reagent_volume)
+ smoke_reagents.add_reagent(reagent_type, reagent_volume)
+ var/datum/effect_system/fluid_spread/smoke/chem/smoke = new smoke_type(location, range, amount, holder || location, smoke_reagents, carry_limit, silent)
+ smoke.start(log = log)
+ return
+
+ if (!islist(reagent_type))
+ CRASH("do_chem_smoke passed a non-reagent path, non-list reagent_type [reagent_type]!")
+
+ var/list/reagent_list = reagent_type
+ var/chem_volume = 0
+ for (var/chem_type in reagent_list)
+ chem_volume += reagent_list[chem_type] || reagent_volume
+
+ var/datum/reagents/smoke_reagents = new /datum/reagents(chem_volume)
+ for (var/chem_type in reagent_list)
+ smoke_reagents.add_reagent(chem_type, reagent_list[chem_type] || reagent_volume)
+
+ var/datum/effect_system/fluid_spread/smoke/chem/smoke = new smoke_type(location, range, amount, holder || location, smoke_reagents, carry_limit, silent)
smoke.start(log = log)
/// A factory which produces clouds of chemical bearing smoke.
@@ -413,18 +433,10 @@
var/datum/reagents/chemholder
effect_type = /obj/effect/particle_effect/fluid/smoke/chem
-/datum/effect_system/fluid_spread/smoke/chem/New()
- ..()
- chemholder = new(1000, NO_REACT)
-
-/datum/effect_system/fluid_spread/smoke/chem/Destroy()
- QDEL_NULL(chemholder)
- return ..()
-
-
-/datum/effect_system/fluid_spread/smoke/chem/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location = null, datum/reagents/carry = null, silent = FALSE)
+/datum/effect_system/fluid_spread/smoke/chem/New(turf/location, range = 1, amount = null, atom/holder = null, datum/reagents/carry = null, carry_limit = null, silent = FALSE)
. = ..()
- carry?.trans_to(chemholder, carry.total_volume, copy_only = TRUE)
+ chemholder = new(1000, NO_REACT)
+ carry?.trans_to(chemholder, isnull(carry_limit) ? carry.total_volume : carry_limit, copy_only = TRUE)
if(silent)
return
@@ -436,18 +448,22 @@
var/where = "[AREACOORD(location)]"
var/contained = length(contained_reagents) ? "\[[contained_reagents.Join(", ")]\] @ [chemholder.chem_temp]K" : null
var/area/fluid_area = get_area(location)
- if(carry.my_atom?.fingerprintslast) //Some reagents don't have a my_atom in some cases
- var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
- var/more = ""
- if(M)
- more = "[ADMIN_LOOKUPFLW(M)] "
- if(!istype(carry.my_atom, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS)) // I like to be able to see my logs thank you
- message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. Key: [more ? more : carry.my_atom.fingerprintslast].")
- log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last touched by [carry.my_atom.fingerprintslast].")
- else
- if(!istype(carry.my_atom, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS)) // Deathmatch has way too much smoke to log
+ // Some reagents don't have a my_atom in some cases
+ if(!carry.my_atom?.fingerprintslast)
+ // Deathmatch has way too much smoke to log
+ if(!istype(carry.my_atom, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS))
message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. No associated key.")
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
+ return
+
+ var/mob/bomber = get_mob_by_key(carry.my_atom.fingerprintslast)
+ if(!istype(carry.my_atom, /obj/machinery/plumbing) && !(fluid_area.area_flags & QUIET_LOGS)) // I like to be able to see my logs thank you
+ message_admins("Smoke: ([ADMIN_VERBOSEJMP(location)])[contained]. Key: [bomber ? "[ADMIN_LOOKUPFLW(bomber)] " : carry.my_atom.fingerprintslast].")
+ log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last touched by [carry.my_atom.fingerprintslast].")
+
+/datum/effect_system/fluid_spread/smoke/chem/Destroy()
+ QDEL_NULL(chemholder)
+ return ..()
/datum/effect_system/fluid_spread/smoke/chem/start(log = FALSE)
var/start_loc = holder ? get_turf(holder) : src.location
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 28ebbd5cf3e..2e022e3aba9 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -138,9 +138,7 @@
else
visible_message(span_danger("[icon2html(src, viewers(src))] [src] detonates!"))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ do_sparks(3, TRUE, src)
mineEffect(triggerer)
triggered = TRUE
SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED, triggerer)
diff --git a/code/game/objects/effects/effect_system/effect_shield.dm b/code/game/objects/effects/shield.dm
similarity index 80%
rename from code/game/objects/effects/effect_system/effect_shield.dm
rename to code/game/objects/effects/shield.dm
index d76712626b8..7776c7bceb4 100644
--- a/code/game/objects/effects/effect_system/effect_shield.dm
+++ b/code/game/objects/effects/shield.dm
@@ -5,17 +5,18 @@
layer = ABOVE_NORMAL_TURF_LAYER
flags_1 = PREVENT_CLICK_UNDER_1
anchored = TRUE
+ /// Our turf's previous heat capacity
var/old_heat_capacity
/obj/effect/shield/Initialize(mapload)
. = ..()
var/turf/location = get_turf(src)
- old_heat_capacity=location.heat_capacity
+ old_heat_capacity = location.heat_capacity
location.heat_capacity = INFINITY
/obj/effect/shield/Destroy()
var/turf/location = get_turf(src)
- location.heat_capacity=old_heat_capacity
+ location.heat_capacity = old_heat_capacity
return ..()
/obj/effect/shield/singularity_act()
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index 8a76d885b47..88c186f5d9a 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -129,6 +129,4 @@
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
gibtypes[/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb] = pick(0, 1, 2)
. = ..()
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(2, 1, drop_location())
- sparks.start()
+ do_sparks(2, TRUE, drop_location())
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index b1574d1f8b9..f6107d37c4d 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -174,22 +174,16 @@
M.Move(dest)
if(entersparks)
- var/datum/effect_system/spark_spread/s = new
- s.set_up(4, 1, src)
- s.start()
+ do_sparks(4, TRUE, src)
+
if(exitsparks)
- var/datum/effect_system/spark_spread/s = new
- s.set_up(4, 1, dest)
- s.start()
+ do_sparks(4, TRUE, dest)
if(entersmoke)
- var/datum/effect_system/fluid_spread/smoke/s = new
- s.set_up(4, holder = src, location = src)
- s.start()
+ do_smoke(4, src, src)
+
if(exitsmoke)
- var/datum/effect_system/fluid_spread/smoke/s = new
- s.set_up(4, holder = src, location = dest)
- s.start()
+ do_smoke(4, dest, dest)
uses--
if(uses == 0)
diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm
index 03033b0f1d2..a3366601f1e 100644
--- a/code/game/objects/items/cigarettes.dm
+++ b/code/game/objects/items/cigarettes.dm
@@ -1122,9 +1122,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
balloon_alert(user, "voltage maximized")
icon_state = "vapeopen_high"
set_greyscale(new_config = /datum/greyscale_config/vape/open_high)
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
- sp.set_up(5, 1, src)
- sp.start()
+ do_sparks(5, TRUE, src)
return TRUE
/obj/item/vape/attack_self(mob/user)
@@ -1170,11 +1168,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
vaper.adjust_fire_stacks(2)
vaper.ignite_mob()
- if(reagents.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire
- var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(round(reagents.get_reagent_amount(/datum/reagent/toxin/plasma) / 2.5, 1), get_turf(src), 0)
- e.start(src)
+ // Preserve old welding fuel behavior
+ if(reagents.spark_act(0, TRUE, banned_reagents = /datum/reagent/fuel) & SPARK_ACT_DESTRUCTIVE)
qdel(src)
+ return
if(!reagents.trans_to(vaper, REAGENTS_METABOLISM, methods = INHALE, ignore_stomach = TRUE))
reagents.remove_all(REAGENTS_METABOLISM)
@@ -1198,23 +1195,21 @@ CIGARETTE PACKETS ARE IN FANCY.DM
//Time to start puffing those fat vapes, yo.
COOLDOWN_START(src, drag_cooldown, dragtime)
if(obj_flags & EMAGGED)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new
- puff.set_up(4, holder = src, location = loc, carry = reagents, efficiency = 24)
- puff.start()
+ var/smoke_amount = DIAMOND_AREA(4)
+ do_chem_smoke(amount = smoke_amount, holder = src, location = loc, carry = reagents, carry_limit = 20, smoke_type = /datum/effect_system/fluid_spread/smoke/chem/smoke_machine)
+ reagents.remove_all(smoke_amount / 24)
if(prob(5)) //small chance for the vape to break and deal damage if it's emagged
playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, FALSE)
M.apply_damage(20, BURN, BODY_ZONE_HEAD)
M.Paralyze(300)
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread
- sp.set_up(5, 1, src)
- sp.start()
+ do_sparks(5, TRUE, src)
to_chat(M, span_userdanger("[src] suddenly explodes in your mouth!"))
qdel(src)
return
else if(super)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new
- puff.set_up(1, holder = src, location = loc, carry = reagents, efficiency = 24)
- puff.start()
+ var/smoke_amount = DIAMOND_AREA(1)
+ do_chem_smoke(amount = smoke_amount, holder = src, location = loc, carry = reagents, carry_limit = 20, smoke_type = /datum/effect_system/fluid_spread/smoke/chem/smoke_machine)
+ reagents.remove_all(smoke_amount / 24)
handle_reagents()
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index c0e35ee303a..c08b1c3fcd2 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -141,9 +141,7 @@
/obj/item/soap/suicide_act(mob/living/user)
user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!", forced="soap suicide")
user.visible_message(span_suicide("[user] lifts [src] to [user.p_their()] mouth and gnaws on it furiously, producing a thick froth! [user.p_They()]'ll never get that BB gun now!"))
- var/datum/effect_system/fluid_spread/foam/foam = new
- foam.set_up(1, holder = src, location = get_turf(user))
- foam.start()
+ do_foam(1, src, get_turf(user))
return TOXLOSS
/obj/item/soap/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner)
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 5783b3c867f..7b854d26bfe 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -101,10 +101,7 @@
if(active_dummy)
for(var/mob/M in active_dummy)
to_chat(M, span_danger("Your chameleon projector deactivates."))
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
- spark_system.start()
+ do_sparks(5, FALSE, src, src)
eject_all()
if(delete_dummy)
qdel(active_dummy)
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index c7507b31bd0..7b3d48a69dd 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -72,10 +72,7 @@
step(L, pick(GLOB.cardinals))
to_chat(L, span_danger("You feel a sharp shock!"))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, L)
- s.start()
-
+ do_sparks(3, TRUE, L)
L.Paralyze(100)
if(master)
diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm
index 416abb3064e..e7cb7bac4f0 100644
--- a/code/game/objects/items/dice.dm
+++ b/code/game/objects/items/dice.dm
@@ -389,7 +389,7 @@
//Cookie
selected_turf.visible_message(span_userdanger("A cookie appears out of thin air!"))
var/obj/item/food/cookie/ooh_a_cookie = new(drop_location())
- do_smoke(0, holder = src, location = drop_location())
+ do_smoke(0, src, drop_location())
ooh_a_cookie.name = "Cookie of Fate"
if(12)
//Healing
@@ -410,12 +410,12 @@
if(14)
//Free Gun
selected_turf.visible_message(span_userdanger("An impressive gun appears!"))
- do_smoke(0, holder = src, location = drop_location())
+ do_smoke(0, src, drop_location())
new /obj/item/gun/ballistic/revolver/mateba(drop_location())
if(15)
//Random One-use spellbook
selected_turf.visible_message(span_userdanger("A magical looking book drops to the floor!"))
- do_smoke(0, holder = src, location = drop_location())
+ do_smoke(0, src, drop_location())
new /obj/item/book/granter/action/spell/random(drop_location())
if(16)
//Servant & Servant Summon
@@ -426,12 +426,12 @@
//Tator Kit
selected_turf.visible_message(span_userdanger("A suspicious box appears!"))
new /obj/item/storage/box/syndicate/bundle_a(drop_location())
- do_smoke(0, holder = src, location = drop_location())
+ do_smoke(0, src, drop_location())
if(18)
//Captain ID
selected_turf.visible_message(span_userdanger("A golden identification card appears!"))
new /obj/item/card/id/advanced/gold/captains_spare(drop_location())
- do_smoke(0, holder = src, location = drop_location())
+ do_smoke(0, src, drop_location())
if(19)
//Instrinct Resistance
selected_turf.visible_message(span_userdanger("[user] looks very robust!"))
diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm
index 05811a6dd9f..f2b444901eb 100644
--- a/code/game/objects/items/food/burgers.dm
+++ b/code/game/objects/items/food/burgers.dm
@@ -697,9 +697,7 @@
/obj/item/food/burger/crazy/process(seconds_per_tick) // DIT EES HORRIBLE
if(SPT_PROB(2.5, seconds_per_tick))
- var/datum/effect_system/fluid_spread/smoke/bad/green/smoke = new
- smoke.set_up(0, holder = src, location = src)
- smoke.start()
+ do_smoke(0, src, loc, smoke_type = /datum/effect_system/fluid_spread/smoke/bad/green)
// empty burger you can customize
/obj/item/food/burger/empty
diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm
index 371df2167c1..3ebdddb439c 100644
--- a/code/game/objects/items/grenades/smokebomb.dm
+++ b/code/game/objects/items/grenades/smokebomb.dm
@@ -43,10 +43,7 @@
update_mob()
playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3)
- var/datum/effect_system/fluid_spread/smoke/bad/smoke = new
- smoke.set_up(4, holder = src, location = src)
- smoke.start()
- qdel(smoke) //And deleted again. Sad really.
+ do_smoke(4, src, loc, smoke_type = /datum/effect_system/fluid_spread/smoke/bad)
for(var/obj/structure/blob/blob in view(8, src))
var/damage = round(30/(get_dist(blob, src) + 1))
blob.take_damage(damage, BURN, MELEE, 0)
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 393df069ffe..444cfa8ed60 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -56,9 +56,7 @@
/obj/item/implant/smoke/activate()
. = ..()
uses--
- var/datum/effect_system/fluid_spread/smoke/bad/smoke = new
- smoke.set_up(6, holder = imp_in, location = imp_in)
- smoke.start()
+ do_smoke(6, imp_in, imp_in.loc, smoke_type = /datum/effect_system/fluid_spread/smoke/bad)
if(!uses)
qdel(src)
diff --git a/code/game/objects/items/implants/security/implant_noteleport.dm b/code/game/objects/items/implants/security/implant_noteleport.dm
index 36fd56aa1d4..38efeb1a028 100644
--- a/code/game/objects/items/implants/security/implant_noteleport.dm
+++ b/code/game/objects/items/implants/security/implant_noteleport.dm
@@ -40,9 +40,7 @@
to_chat(teleportee, span_holoparasite("You feel yourself teleporting, but are suddenly flung back to where you just were!"))
teleportee.apply_status_effect(/datum/status_effect/incapacitating/paralyzed, 5 SECONDS)
- var/datum/effect_system/spark_spread/quantum/spark_system = new()
- spark_system.set_up(5, TRUE, teleportee)
- spark_system.start()
+ do_sparks(5, TRUE, teleportee, spark_type = /datum/effect_system/basic/spark_spread/quantum)
return TRUE
/// Signal for COMSIG_MOB_PRE_JAUNT that prevents a user from entering a jaunt.
@@ -52,9 +50,7 @@
to_chat(jaunter, span_holoparasite("As you attempt to jaunt, you slam directly into the barrier between realities and are sent crashing back into corporeality!"))
jaunter.apply_status_effect(/datum/status_effect/incapacitating/paralyzed, 5 SECONDS)
- var/datum/effect_system/spark_spread/quantum/spark_system = new()
- spark_system.set_up(5, TRUE, jaunter)
- spark_system.start()
+ do_sparks(5, TRUE, jaunter, spark_type = /datum/effect_system/basic/spark_spread/quantum)
return COMPONENT_BLOCK_JAUNT
/obj/item/implantcase/teleport_blocker
diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm
index 2b08fc42b72..202c8503558 100644
--- a/code/game/objects/items/rcd/RHD.dm
+++ b/code/game/objects/items/rcd/RHD.dm
@@ -21,7 +21,7 @@
armor_type = /datum/armor/item_construction
resistance_flags = FIRE_PROOF
/// the spark system which sparks whever the ui options are dited
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
/// current local matter inside the device, not used when silo link is on
var/matter = 0
/// maximum local matter this device can hold, not used when silo link is on
@@ -47,8 +47,7 @@
/obj/item/construction/Initialize(mapload)
. = ..()
- spark_system = new /datum/effect_system/spark_spread
- spark_system.set_up(5, 0, src)
+ spark_system = new(5, FALSE, src)
spark_system.attach(src)
if(construction_upgrades & RCD_UPGRADE_SILO_LINK)
silo_mats = new (src, mapload, FALSE)
diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm
index 11f1a1fc2c3..9cbe5a9bd3e 100644
--- a/code/game/objects/items/rcd/RPD.dm
+++ b/code/game/objects/items/rcd/RPD.dm
@@ -40,7 +40,7 @@
pickup_sound = 'sound/items/handling/tools/rpd_pickup.ogg'
sound_vary = TRUE
///Sparks system used when changing device in the UI
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
///Direction of the device we are going to spawn, set up in the UI
var/p_dir = NORTH
///Initial direction of the smart pipe we are going to spawn, set up in the UI
@@ -80,8 +80,7 @@
/obj/item/pipe_dispenser/Initialize(mapload)
. = ..()
- spark_system = new
- spark_system.set_up(5, 0, src)
+ spark_system = new(src, 5, FALSE)
spark_system.attach(src)
if(!first_atmos)
first_atmos = GLOB.atmos_pipe_recipes[GLOB.atmos_pipe_recipes[1]][1]
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 2ee732b274b..b8eff3ae304 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -605,9 +605,7 @@
var/prev_lockcharge = borg.lockcharge
borg.SetLockdown(TRUE)
borg.set_anchored(TRUE)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(1, holder = borg, location = borg.loc)
- smoke.start()
+ do_smoke(1, borg, borg.loc)
sleep(0.2 SECONDS)
for(var/i in 1 to 4)
playsound(borg, pick(
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 3891f34bd09..47007dd3a63 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -358,9 +358,7 @@
anchored = TRUE
/obj/effect/resin_container/proc/Smoke()
- var/datum/effect_system/fluid_spread/foam/metal/resin/foaming = new
- foaming.set_up(4, holder = src, location = loc)
- foaming.start()
+ do_foam(4, src, loc, foam_type = /datum/effect_system/fluid_spread/foam/metal/resin)
playsound(src,'sound/effects/bamf.ogg',100,TRUE)
qdel(src)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 70b757369e3..ce765778cb6 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -829,10 +829,8 @@
w_class = WEIGHT_CLASS_TINY
var/ash_type = /obj/effect/decal/cleanable/ash
-/obj/item/toy/snappop/proc/pop_burst(n=3, c=1)
- var/datum/effect_system/spark_spread/s = new()
- s.set_up(n, c, src)
- s.start()
+/obj/item/toy/snappop/proc/pop_burst(n = 3, c = TRUE)
+ do_sparks(n, c, src)
new ash_type(loc)
visible_message(span_warning("[src] explodes!"),
span_hear("You hear a snap!"))
diff --git a/code/game/objects/items/weaponry/melee/energy.dm b/code/game/objects/items/weaponry/melee/energy.dm
index 8c450549066..0c6ed38d674 100644
--- a/code/game/objects/items/weaponry/melee/energy.dm
+++ b/code/game/objects/items/weaponry/melee/energy.dm
@@ -358,7 +358,7 @@
heat = 3500
w_class = WEIGHT_CLASS_BULKY
/// Our linked spark system that emits from our sword.
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
var/list/alt_continuous = list("stabs", "pierces", "impales")
var/list/alt_simple = list("stab", "pierce", "impale")
@@ -368,8 +368,7 @@
alt_continuous = string_list(alt_continuous)
alt_simple = string_list(alt_simple)
AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -10)
- spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src)
+ spark_system = new(5, FALSE, src)
spark_system.attach(src)
START_PROCESSING(SSobj, src)
ADD_TRAIT(src, TRAIT_TRANSFORM_ACTIVE, INNATE_TRAIT) // Functions as an extended esword
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index ed3aa733d66..f4a31fbe713 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -343,10 +343,7 @@
return FALSE
if(prob(50)) // Shocking hurts the grille (to weaken monkey powersinks)
take_damage(1, BURN, FIRE, sound_effect = FALSE)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(3, 1, src)
- sparks.start()
-
+ do_sparks(3, TRUE, src)
return TRUE
/obj/structure/grille/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm
index 19e35d30a5e..99c4ca02a60 100644
--- a/code/game/objects/structures/hivebot.dm
+++ b/code/game/objects/structures/hivebot.dm
@@ -10,9 +10,7 @@
/obj/structure/hivebot_beacon/Initialize(mapload)
. = ..()
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(2, holder = src, location = loc)
- smoke.start()
+ do_smoke(2, src, loc)
visible_message(span_bolddanger("[src] warps in!"))
playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE)
addtimer(CALLBACK(src, PROC_REF(warpbots)), rand(1 SECONDS, 1 MINUTES))
diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm
index 3409c3a49c1..c6be3348e74 100644
--- a/code/game/objects/structures/maintenance.dm
+++ b/code/game/objects/structures/maintenance.dm
@@ -325,9 +325,7 @@ at the cost of risking a vicious bite.**/
return
if(!ismob(leaving))
return
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(range = 1, amount = 1, location = src)
- smoke.start()
+ do_smoke(1, src, loc)
playsound(src, 'sound/machines/steam_hiss.ogg', 75, TRUE, -2)
COOLDOWN_START(src, steam_vent_interact, steam_speed)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 00a7dec2bf6..4db81bd526d 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -833,10 +833,7 @@
if(!electrocute_mob(user, cable_node, src, 1, TRUE))
return FALSE
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(3, TRUE, src)
- sparks.start()
-
+ do_sparks(3, TRUE, src)
return TRUE
/obj/structure/table/bronze
diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm
index e4ff9776cea..47e9c64f99c 100644
--- a/code/game/objects/structures/toiletbong.dm
+++ b/code/game/objects/structures/toiletbong.dm
@@ -56,9 +56,10 @@
user.balloon_alert(user, "[item.name] is blocking the pipes!")
continue
playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new
- puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20)
- puff.start()
+
+ var/smoke_amount = DIAMOND_AREA(smokeradius)
+ do_chem_smoke(amount = smoke_amount, holder = src, location = loc, carry = reagents, carry_limit = 20, smoke_type = /datum/effect_system/fluid_spread/smoke/chem/smoke_machine)
+ reagents.remove_all(smoke_amount / 20)
if (prob(5) && !(obj_flags & EMAGGED))
if(user.get_liked_foodtypes() & GORE)
user.balloon_alert(user, "a hidden treat!")
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index a14a5137b02..a1dfbd5a830 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -16,14 +16,12 @@
var/list/mob/immune_minds = list()
var/sparks = TRUE
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
/obj/structure/trap/Initialize(mapload)
. = ..()
flare_message = span_warning("[src] flares brightly!")
- spark_system = new
- spark_system.set_up(4,1,src)
- spark_system.attach(src)
+ spark_system = new(src, 4, TRUE)
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
@@ -37,9 +35,8 @@
))
/obj/structure/trap/Destroy()
- qdel(spark_system)
- spark_system = null
- . = ..()
+ QDEL_NULL(spark_system)
+ return ..()
/obj/structure/trap/examine(mob/user)
. = ..()
@@ -147,7 +144,7 @@
icon_state = "bounty_trap_off"
var/obj/structure/trap/stun/hunter/stored_trap
var/obj/item/radio/radio
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
/obj/item/bountytrap/Initialize(mapload)
. = ..()
@@ -155,8 +152,7 @@
radio.subspace_transmission = TRUE
radio.canhear_range = 0
radio.recalculateChannels()
- spark_system = new
- spark_system.set_up(4,1,src)
+ spark_system = new(src, 4, TRUE)
spark_system.attach(src)
name = "[name] #[rand(1, 999)]"
stored_trap = new(src)
diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
index 3cdbda71f79..fd75708e57f 100644
--- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
+++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
@@ -484,9 +484,7 @@ Return to step 11 of normal process."}
/obj/item/restraints/handcuffs/energy/on_uncuffed(datum/source, mob/living/wearer)
. = ..()
wearer.visible_message(span_danger("[wearer]'s [name] breaks in a discharge of energy!"), span_userdanger("[wearer]'s [name] breaks in a discharge of energy!"))
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(4,0,wearer.loc)
- sparks.start()
+ do_sparks(4, FALSE, wearer.loc)
qdel(src)
/obj/item/melee/baton/abductor/examine(mob/user)
diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm
index 1610d9a6cff..391ac36789a 100644
--- a/code/modules/antagonists/abductor/machinery/pad.dm
+++ b/code/modules/antagonists/abductor/machinery/pad.dm
@@ -58,9 +58,7 @@
/obj/effect/temp_visual/teleport_abductor/Initialize(mapload)
. = ..()
- var/datum/effect_system/spark_spread/S = new
- S.set_up(10,0,loc)
- S.start()
+ do_sparks(10, FALSE, loc)
/obj/effect/temp_visual/teleport_golem
name = "bluespace silhouette"
diff --git a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm
index 34d10b05789..dd829c4ce8a 100644
--- a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm
+++ b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm
@@ -106,9 +106,7 @@
color = "#d6ad8b"
/obj/item/clothing/suit/armor/reactive/psykerboost/cooldown_activation(mob/living/carbon/human/owner)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ do_sparks(1, TRUE, src)
return ..()
/obj/item/clothing/suit/armor/reactive/psykerboost/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm
index 659ed72854b..71f79a51cbd 100644
--- a/code/modules/antagonists/heretic/influences.dm
+++ b/code/modules/antagonists/heretic/influences.dm
@@ -147,8 +147,7 @@
else
human_user.gib(DROP_ALL_REMAINS)
human_user.investigate_log("has died from using telekinesis on a heretic influence.", INVESTIGATE_DEATHS)
- var/datum/effect_system/reagents_explosion/explosion = new()
- explosion.set_up(1, get_turf(human_user), 1)
+ var/datum/effect_system/reagents_explosion/explosion = new(get_turf(human_user), 1, 1, 1)
explosion.start(src)
/obj/effect/visible_heretic_influence/examine(mob/living/user)
diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm
index f099050ecfb..f3a9a9da712 100644
--- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm
@@ -303,8 +303,7 @@
var/obj/item/bodypart/head/head = locate() in carbon_view.bodyparts
if(!head?.dismember())
carbon_view.gib(DROP_ALL_REMAINS)
- var/datum/effect_system/reagents_explosion/explosion = new()
- explosion.set_up(1, get_turf(carbon_view), 1)
+ var/datum/effect_system/reagents_explosion/explosion = new(get_turf(carbon_view), 1, 1, 1)
explosion.start(src)
else
attempt_conversion(carbon_view, source)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm
index f2cc848a8b3..5f873c463b2 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm
@@ -57,13 +57,7 @@
return ..()
/obj/machinery/nuclearbomb/beer/proc/local_foam()
- var/datum/reagents/tmp_holder = new/datum/reagents(1000)
- tmp_holder.my_atom = src
- tmp_holder.add_reagent(flood_reagent, 100)
-
- var/datum/effect_system/fluid_spread/foam/foam = new
- foam.set_up(200, holder = src, location = get_turf(src), carry = tmp_holder)
- foam.start()
+ do_foam(200, src, get_turf(src), flood_reagent, 100)
disarm_nuke()
/obj/machinery/nuclearbomb/beer/really_actually_explode(detonation_status)
diff --git a/code/modules/antagonists/space_ninja/equipment/energy_katana.dm b/code/modules/antagonists/space_ninja/equipment/energy_katana.dm
index 7ae1929d6d3..f02df8b5926 100644
--- a/code/modules/antagonists/space_ninja/equipment/energy_katana.dm
+++ b/code/modules/antagonists/space_ninja/equipment/energy_katana.dm
@@ -36,14 +36,13 @@
max_integrity = 200
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
item_flags = NEEDS_PERMIT
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
var/datum/action/innate/dash/ninja/jaunt
/obj/item/energy_katana/Initialize(mapload)
. = ..()
jaunt = new(src)
- spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src)
+ spark_system = new(src, 5, FALSE)
spark_system.attach(src)
/obj/item/energy_katana/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers)
diff --git a/code/modules/antagonists/wizard/equipment/wizard_hammer.dm b/code/modules/antagonists/wizard/equipment/wizard_hammer.dm
index 9c6f50392ef..4a4b945632b 100644
--- a/code/modules/antagonists/wizard/equipment/wizard_hammer.dm
+++ b/code/modules/antagonists/wizard/equipment/wizard_hammer.dm
@@ -105,9 +105,8 @@
/obj/item/mjollnir/proc/shock(mob/living/target)
target.Stun(1.5 SECONDS)
target.Knockdown(10 SECONDS)
- var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread
- s.set_up(5, 1, target.loc)
- s.start()
+ var/datum/effect_system/basic/lightning_spread/lightning = new(target.loc, 5, TRUE)
+ lightning.start()
target.visible_message(span_danger("[target.name] is shocked by [src]!"), \
span_userdanger("You feel a powerful shock course through your body sending you flying!"), \
span_hear("You hear a heavy electrical crack!"))
diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm
index c86c6a84bf3..140b63cf92a 100644
--- a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm
+++ b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm
@@ -247,9 +247,7 @@
/datum/grand_side_effect/smoke/trigger(potency, turf/ritual_location, mob/invoker)
playsound(src, 'sound/effects/magic/smoke.ogg', 50, TRUE)
var/range = LERP(2, 4, potency/GRAND_RITUAL_FINALE_COUNT)
- var/datum/effect_system/fluid_spread/smoke/colourful/smoke = new
- smoke.set_up(range, holder = ritual_location, location = ritual_location)
- smoke.start()
+ do_smoke(round(range), ritual_location, ritual_location, smoke_type = /datum/effect_system/fluid_spread/smoke/colourful)
/// Spawns randomly coloured smoke
/datum/effect_system/fluid_spread/smoke/colourful
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index 96404d02b22..adddd5dd1b3 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -8,7 +8,7 @@
desc = "A small electronic device able to ignite combustible substances."
icon_state = "igniter"
custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.5)
- var/datum/effect_system/spark_spread/sparks
+ var/datum/effect_system/basic/spark_spread/sparks
heat = 1000
drop_sound = 'sound/items/handling/component_drop.ogg'
pickup_sound = 'sound/items/handling/component_pickup.ogg'
@@ -21,15 +21,12 @@
/obj/item/assembly/igniter/Initialize(mapload)
. = ..()
- sparks = new
- sparks.set_up(2, 0, src)
+ sparks = new(src, 2, FALSE)
sparks.attach(src)
/obj/item/assembly/igniter/Destroy()
- if(sparks)
- qdel(sparks)
- sparks = null
- . = ..()
+ QDEL_NULL(sparks)
+ return ..()
/obj/item/assembly/igniter/activate()
if(!..())
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 64cd36ca239..d215c1c6803 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -887,9 +887,7 @@
var/obj/effect/particle_effect/fluid/foam/foam = locate() in location
var/obj/structure/foamedmetal/resin = locate() in location
if(heat_efficiency > HALON_COMBUSTION_MINIMUM_RESIN_MOLES && isopenturf(location) && !foam && !resin) // Don't resin if there is aleady resin or we are not in an open turf.
- var/datum/effect_system/fluid_spread/foam/metal/resin/halon/foaming = new
- foaming.set_up(amount = HALON_COMBUSTION_RESIN_VOLUME, holder = holder, location = location)
- foaming.start()
+ do_foam(amount = HALON_COMBUSTION_RESIN_VOLUME, holder = holder, location = location, foam_type = /datum/effect_system/fluid_spread/foam/metal/resin/halon)
. |= VOLATILE_REACTION
. |= REACTING
diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm
index 943a10766bb..9e3b30f0825 100644
--- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm
+++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm
@@ -167,13 +167,10 @@
return FALSE
if(!prob(prb))
return FALSE //you lucked out, no shock for you
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start() //sparks always.
+ do_sparks(5, TRUE, src)
if (electrocute_mob(user, get_area(src), src, 1, TRUE))
return TRUE
- else
- return FALSE
+ return FALSE
/obj/item/electronics/airalarm
name = "air alarm electronics"
diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm
index 69bf48fe2ae..440be922316 100644
--- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm
+++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm
@@ -48,12 +48,5 @@
/obj/item/nitrium_crystal/attack_self(mob/user)
. = ..()
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new
- var/turf/location = get_turf(src)
- create_reagents(5)
- reagents.add_reagent(/datum/reagent/nitrium_low_metabolization, 3)
- reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, 2)
- smoke.attach(location)
- smoke.set_up(cloud_size, holder = src, location = location, carry = reagents, silent = TRUE)
- smoke.start()
+ do_chem_smoke(cloud_size, src, get_turf(src), list(/datum/reagent/nitrium_low_metabolization = 3, /datum/reagent/nitrium_high_metabolization = 2))
qdel(src)
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index 6d338e5ec26..2fa38219a1f 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -29,9 +29,7 @@
SpeakPeace(list("Welcome to the error handling room.","Something's goofed up bad to send you here.","You should probably tell an admin what you were doing, or make a bug report."))
for(var/obj/structure/signpost/salvation/sign in orange(7))
sign.SetInvisibility(INVISIBILITY_NONE)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(1, holder = src, location = sign.loc)
- smoke.start()
+ do_smoke(1, src, sign.loc)
break
if(1)
SpeakPeace(list("Take that ladder up.","It'll send you back to the station.","Hopefully you'll never need to see this place again."))
diff --git a/code/modules/bitrunning/components/bitrunning_points.dm b/code/modules/bitrunning/components/bitrunning_points.dm
index b800d586e94..039f3a9d338 100644
--- a/code/modules/bitrunning/components/bitrunning_points.dm
+++ b/code/modules/bitrunning/components/bitrunning_points.dm
@@ -32,9 +32,5 @@
var/turf/tile = parent
var/obj/structure/closet/crate/secure/bitrunning/encrypted/crate = new()
crate.forceMove(tile) // Triggers any on-move effects on that turf
-
- var/datum/effect_system/spark_spread/quantum/sparks = new(tile)
- sparks.set_up(number = 5, location = tile)
- sparks.start()
-
+ do_sparks(5, FALSE, tile, spark_type = /datum/effect_system/basic/spark_spread/quantum)
qdel(src)
diff --git a/code/modules/bitrunning/objects/byteforge.dm b/code/modules/bitrunning/objects/byteforge.dm
index a4ceb6fb534..5fccb167a5c 100644
--- a/code/modules/bitrunning/objects/byteforge.dm
+++ b/code/modules/bitrunning/objects/byteforge.dm
@@ -60,10 +60,7 @@
/obj/machinery/byteforge/proc/flash(atom/movable/thing)
playsound(src, 'sound/effects/magic/blink.ogg', 50, TRUE)
- var/datum/effect_system/spark_spread/quantum/sparks = new()
- sparks.set_up(5, 1, loc)
- sparks.start()
-
+ do_sparks(5, TRUE, loc, spark_type = /datum/effect_system/basic/spark_spread/quantum)
set_light(l_on = FALSE)
/// Forge begins to process
diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm
index ce79ee7aa5b..ae15698f09d 100644
--- a/code/modules/bitrunning/server/util.dm
+++ b/code/modules/bitrunning/server/util.dm
@@ -135,9 +135,7 @@
/// Do some magic teleport sparks
/obj/machinery/quantum_server/proc/spark_at_location(obj/cache)
playsound(cache, 'sound/effects/magic/blink.ogg', 50, vary = TRUE)
- var/datum/effect_system/spark_spread/quantum/sparks = new()
- sparks.set_up(5, location = get_turf(cache))
- sparks.start()
+ do_sparks(5, FALSE, get_turf(cache), spark_type = /datum/effect_system/basic/spark_spread/quantum)
/// Starts building a new avatar for the player.
diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm
index 445cd329603..6383be5e95c 100644
--- a/code/modules/cargo/markets/market_telepad.dm
+++ b/code/modules/cargo/markets/market_telepad.dm
@@ -366,11 +366,7 @@
receiving.post_purchase_effects(receiving.item)
use_energy(energy_usage_per_teleport / power_efficiency)
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(5, 1, get_turf(src))
- sparks.attach(receiving.item)
- sparks.start()
-
+ do_sparks(5, TRUE, src, receiving.item)
transmitting = receiving
receiving = null
diff --git a/code/modules/clothing/head/perceptomatrix.dm b/code/modules/clothing/head/perceptomatrix.dm
index b2cdb061bdf..f3753224138 100644
--- a/code/modules/clothing/head/perceptomatrix.dm
+++ b/code/modules/clothing/head/perceptomatrix.dm
@@ -164,17 +164,6 @@
var/stagger_duration = 3 SECONDS
/// The amount of hallucination to apply
var/hallucination_duration = 25 SECONDS
- /// Spark system
- var/datum/effect_system/spark_spread/quantum/spark_sys
-
-/datum/action/cooldown/spell/pointed/percept_hallucination/New(Target)
- . = ..()
-
- spark_sys = new /datum/effect_system/spark_spread/quantum
-
-/datum/action/cooldown/spell/pointed/percept_hallucination/Destroy()
- QDEL_NULL(spark_sys)
- return ..()
/datum/action/cooldown/spell/pointed/percept_hallucination/is_valid_target(atom/cast_on)
. = ..()
@@ -216,11 +205,8 @@
/datum/action/cooldown/spell/pointed/percept_hallucination/proc/cast_fx(atom/cast_on)
owner.Beam(cast_on, icon_state = "greyscale_lightning", beam_color = COLOR_FADED_PINK, time = 0.5 SECONDS)
-
- spark_sys.set_up(2, 1, get_turf(owner))
- spark_sys.start()
- spark_sys.set_up(4, 1, get_turf(cast_on))
- spark_sys.start()
+ do_sparks(2, TRUE, get_turf(owner), spark_type = /datum/effect_system/basic/spark_spread/quantum)
+ do_sparks(4, TRUE, get_turf(owner), spark_type = /datum/effect_system/basic/spark_spread/quantum)
/datum/action/cooldown/spell/pointed/percept_hallucination/cast(mob/living/carbon/human/cast_on)
. = ..()
diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm
index 1efa8210db7..add97bc164a 100644
--- a/code/modules/clothing/head/tophat.dm
+++ b/code/modules/clothing/head/tophat.dm
@@ -22,7 +22,7 @@
COOLDOWN_START(src, rabbit_cooldown, RABBIT_CD_TIME)
playsound(get_turf(src), 'sound/items/weapons/emitter.ogg', 70)
- do_smoke(amount = DIAMOND_AREA(1), holder = src, location = src, smoke_type=/obj/effect/particle_effect/fluid/smoke/quick)
+ do_smoke(1, src, src, effect_type = /obj/effect/particle_effect/fluid/smoke/quick)
if(prob(10))
magician.visible_message(span_danger("[magician] taps [src] with [hitby_wand], then reaches in and pulls out a bu- wait, those are bees!"), span_danger("You tap [src] with your [hitby_wand.name] and pull out... BEES!"))
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index e74144abedc..2f524915820 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -240,9 +240,7 @@
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE
/obj/item/clothing/suit/armor/reactive/tesla/cooldown_activation(mob/living/carbon/human/owner)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ do_sparks(1, TRUE, src)
..()
/obj/item/clothing/suit/armor/reactive/tesla/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
@@ -337,9 +335,7 @@
clothing_traits = list(TRAIT_MADNESS_IMMUNE)
/obj/item/clothing/suit/armor/reactive/hallucinating/cooldown_activation(mob/living/carbon/human/owner)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ do_sparks(1, TRUE, src)
return ..()
/obj/item/clothing/suit/armor/reactive/hallucinating/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
@@ -392,9 +388,7 @@
r_legs = typesof(/obj/item/bodypart/leg/right)
/obj/item/clothing/suit/armor/reactive/bioscrambling/cooldown_activation(mob/living/carbon/human/owner)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ do_sparks(1, TRUE, src)
..()
/obj/item/clothing/suit/armor/reactive/bioscrambling/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
@@ -508,8 +502,7 @@
owner.visible_message(span_danger("The reactive armor alters the weather around [owner], shielding [owner.p_them()] from [attack_text]!"))
playsound(src, 'sound/effects/magic/lightningshock.ogg', 33, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
- var/datum/effect_system/steam_spread/steam = new()
- steam.set_up(10, FALSE, owner.loc)
+ var/datum/effect_system/basic/steam_spread/steam = new(owner.loc, 10, FALSE)
steam.start()
var/list/affected_turfs = list()
@@ -531,8 +524,7 @@
owner.visible_message(span_danger("The reactive armor malfunctions, calling down a storm upon [owner.p_them()]!"))
playsound(src, 'sound/effects/magic/lightningshock.ogg', 33, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
- var/datum/effect_system/steam_spread/steam = new()
- steam.set_up(2, FALSE, owner.loc)
+ var/datum/effect_system/basic/steam_spread/steam = new(owner.loc, 2, FALSE)
steam.start()
owner.adjust_wet_stacks(10)
diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
index 96254bba8fd..9f64535e13b 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
@@ -176,8 +176,4 @@
addtimer(CALLBACK(src, PROC_REF(check_fire_state)), extinguish_cooldown)
owner.visible_message(span_warning("[owner]'s suit spews space lube everywhere!"), span_warning("Your suit spews space lube everywhere!"))
owner.extinguish_mob()
- var/datum/effect_system/fluid_spread/foam/foam = new
- var/datum/reagents/foamreagent = new /datum/reagents(15)
- foamreagent.add_reagent(/datum/reagent/lube, 15)
- foam.set_up(4, holder = src, location = get_turf(owner), carry = foamreagent)
- foam.start() //Truly terrifying.
+ do_foam(4, src, get_turf(owner), /datum/reagent/lube, 15)
diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm
index 3a52689c8c1..e2404bbc090 100644
--- a/code/modules/events/immovable_rod/immovable_rod.dm
+++ b/code/modules/events/immovable_rod/immovable_rod.dm
@@ -164,9 +164,7 @@
// they ALSO collapse into a singulo.
if(istype(clong, /obj/effect/immovablerod))
visible_message(span_danger("[src] collides with [clong]! This cannot end well."))
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(2, holder = src, location = get_turf(src))
- smoke.start()
+ do_smoke(2, src, get_turf(src))
var/obj/singularity/bad_luck = new(get_turf(src))
bad_luck.energy = 800
qdel(clong)
diff --git a/code/modules/events/radiation_leak.dm b/code/modules/events/radiation_leak.dm
index a5aee22a8b2..56e6e87b9a9 100644
--- a/code/modules/events/radiation_leak.dm
+++ b/code/modules/events/radiation_leak.dm
@@ -135,13 +135,9 @@
/// Helper to shoot some smoke into the air around the passed atom
/datum/round_event/radiation_leak/proc/puff_some_smoke(atom/where)
+ // Causes radioation and mutations
var/turf/below_where = get_turf(where)
- var/datum/effect_system/fluid_spread/smoke/chem/gross_smoke = new()
- gross_smoke.chemholder.add_reagent(/datum/reagent/toxin/polonium, 10) // Polonium (it causes radiation)
- gross_smoke.chemholder.add_reagent(/datum/reagent/toxin/mutagen, 10) // Mutagen (it causes mutations. Also it's green... Primarily because it's green.)
- gross_smoke.attach(below_where)
- gross_smoke.set_up(2, holder = where, location = below_where, silent = TRUE)
- gross_smoke.start()
+ do_chem_smoke(2, where, below_where, list(/datum/reagent/toxin/polonium = 10, /datum/reagent/toxin/mutagen = 10))
playsound(below_where, 'sound/effects/smoke.ogg', 50, vary = TRUE)
/**
diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm
index fbe824c06e6..18f0213c5d7 100644
--- a/code/modules/events/wisdomcow.dm
+++ b/code/modules/events/wisdomcow.dm
@@ -32,7 +32,7 @@
else
targetloc = get_safe_random_station_turf()
var/mob/living/basic/cow/wisdom/wise = new(targetloc, selected_wisdom, selected_experience, forced_reagent_type)
- do_smoke(1, holder = wise, location = targetloc)
+ do_smoke(1, wise, targetloc)
announce_to_ghosts(wise)
/datum/event_admin_setup/set_location/wisdom_cow
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index ab305bbff99..e05bd86b681 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -83,9 +83,7 @@
victims += target
for(var/mob/living/carbon/human/victim as anything in victims)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = victim, location = victim.loc)
- smoke.start()
+ do_smoke(0, victim, victim.loc)
#undef BIG_FAT_DOOBIE
#undef BOXING
diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm
index 460fe7b8a2f..b7961fa4cfa 100644
--- a/code/modules/events/wizard/shuffle.dm
+++ b/code/modules/events/wizard/shuffle.dm
@@ -34,9 +34,7 @@
moblocs.len -= 1
for(var/mob/living/carbon/human/victim in GLOB.alive_mob_list)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = victim, location = victim.loc)
- smoke.start()
+ do_smoke(0, victim, victim.loc)
//---//
@@ -69,9 +67,7 @@
mobnames.len -= 1
for(var/mob/living/carbon/human/victim in GLOB.alive_mob_list)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = victim, location = victim.loc)
- smoke.start()
+ do_smoke(0, victim, victim.loc)
//---//
@@ -107,6 +103,4 @@
qdel(swapper)
for(var/mob/living/carbon/human/alive_human in GLOB.alive_mob_list)
- var/datum/effect_system/fluid_spread/smoke/smoke = new()
- smoke.set_up(0, holder = alive_human, location = alive_human.loc)
- smoke.start()
+ do_smoke(0, alive_human, alive_human.loc)
diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm
index 08fc0ae9142..ad2a55592e5 100644
--- a/code/modules/explorer_drone/exodrone.dm
+++ b/code/modules/explorer_drone/exodrone.dm
@@ -437,7 +437,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers)
*/
/obj/machinery/exodrone_launcher/proc/launch_effect()
playsound(src,'sound/effects/podwoosh.ogg',50, FALSE)
- do_smoke(1, holder = src, location = get_turf(src))
+ do_smoke(1, src, get_turf(src))
/obj/machinery/exodrone_launcher/Exited(atom/movable/gone, direction)
. = ..()
diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm
index 75c8a06359d..e6e664eb346 100644
--- a/code/modules/food_and_drinks/machinery/grill.dm
+++ b/code/modules/food_and_drinks/machinery/grill.dm
@@ -43,9 +43,7 @@
new /obj/item/stack/rods(loc, 5)
if(grill_fuel > 0)
- var/datum/effect_system/fluid_spread/smoke/bad/smoke = new
- smoke.set_up(1, holder = src, location = loc)
- smoke.start()
+ do_smoke(1, src, loc, smoke_type = /datum/effect_system/fluid_spread/smoke/bad)
/obj/machinery/grill/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = NONE
@@ -273,9 +271,7 @@
//use fuel, create smoke puffs for immersion
grill_fuel -= fuel_usage
if(SPT_PROB(0.5, seconds_per_tick))
- var/datum/effect_system/fluid_spread/smoke/bad/smoke = new
- smoke.set_up(1, holder = src, location = loc)
- smoke.start()
+ do_smoke(1, src, loc, smoke_type = /datum/effect_system/fluid_spread/smoke/bad)
fuel_usage = GRILL_FUELUSAGE_ACTIVE * seconds_per_tick
if(!QDELETED(grilled_item))
diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm
index 2235b5b243b..fce07350527 100644
--- a/code/modules/food_and_drinks/machinery/microwave.dm
+++ b/code/modules/food_and_drinks/machinery/microwave.dm
@@ -643,9 +643,7 @@
/obj/machinery/microwave/proc/spark()
visible_message(span_warning("Sparks fly around [src]!"))
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(2, 1, src)
- sparks.start()
+ do_sparks(2, TRUE, src)
/**
* The start of the cook loop
diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
index ff9e49dbffc..f046278142d 100644
--- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
@@ -205,10 +205,7 @@
if(holder.total_volume >= holder.maximum_volume * 0.95)
below_pot.visible_message(span_warning("[pot] starts to boil over!"))
// Create a spread of dirty foam
- var/datum/effect_system/fluid_spread/foam/dirty/soup_mess = new()
- soup_mess.reagent_scale = 0.1 // (Just a little)
- soup_mess.set_up(range = 1, holder = pot, location = below_pot, carry = holder, stop_reactions = TRUE)
- soup_mess.start()
+ do_foam(1, pot, below_pot, carry = holder, foam_type = /datum/effect_system/fluid_spread/foam/dirty, stop_reactions = TRUE, reagent_scale = 0.1)
// Loses a bit from the foam
for(var/datum/reagent/reagent as anything in holder.reagent_list)
reagent.volume *= 0.5
diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm
index 2f61f9e832e..55535d4b570 100644
--- a/code/modules/holodeck/holo_effect.dm
+++ b/code/modules/holodeck/holo_effect.dm
@@ -36,9 +36,7 @@
/obj/effect/holodeck_effect/sparks/activate(obj/machinery/computer/holodeck/HC)
var/turf/T = get_turf(src)
if(T)
- var/datum/effect_system/spark_spread/s = new
- s.set_up(3, 1, T)
- s.start()
+ do_sparks(3, TRUE, T)
T.temperature = 5000 //Why? not quite sure to be honest with you
T.hotspot_expose(50000,50000,1)
diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm
index 45f4d1251de..326c4ac761a 100644
--- a/code/modules/hydroponics/grown/onion.dm
+++ b/code/modules/hydroponics/grown/onion.dm
@@ -50,12 +50,8 @@
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/onion_slice/red, 2, 15, screentip_verb = "Cut")
/obj/item/food/grown/onion/UsedforProcessing(mob/living/user, obj/item/I, list/chosen_option, list/created_atoms)
- var/datum/effect_system/fluid_spread/smoke/chem/cry_about_it = new //Since the onion is destroyed when it's sliced,
var/splat_location = get_turf(src) //we need to set up the smoke beforehand
- cry_about_it.attach(splat_location)
- cry_about_it.set_up(0, holder = src, location = splat_location, carry = reagents, silent = FALSE)
- cry_about_it.start()
- qdel(cry_about_it)
+ do_chem_smoke(0, src, splat_location, carry = reagents, silent = FALSE)
return ..()
/obj/item/food/onion_slice
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 0844708b3ff..2835d49908f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -691,13 +691,10 @@
SIGNAL_HANDLER
our_plant.investigate_log("made smoke at [AREACOORD(target)]. Last touched by: [our_plant.fingerprintslast].", INVESTIGATE_BOTANY)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new ()
var/obj/item/seeds/our_seed = our_plant.get_plant_seed()
var/splat_location = get_turf(target)
var/range = sqrt(our_seed.potency * 0.1)
- smoke.attach(splat_location)
- smoke.set_up(round(range), holder = our_plant, location = splat_location, carry = our_plant.reagents, silent = FALSE)
- smoke.start(log = TRUE)
+ do_chem_smoke(round(range), our_plant, splat_location, carry = our_plant.reagents, silent = FALSE, log = TRUE)
our_plant.reagents.clear_reagents()
/// Makes the plant and its seeds fireproof. From lavaland plants.
diff --git a/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm b/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm
index dee9f5d53c5..c025b21069a 100644
--- a/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm
+++ b/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm
@@ -12,7 +12,7 @@
max_integrity = 100
/// list of emotes whose cd is overridden by this skillchip. can be edited in mapping or ingame
var/list/affected_emotes = list("spin", "flip", "backflip")
- var/datum/effect_system/spark_spread/sparks
+ var/datum/effect_system/basic/spark_spread/sparks
/// you can use this without lowering integrity! let's be honest. nobody's doing that
var/allowed_usage = 5
/// How many seconds does it take for it to recover one allowed usage
@@ -49,7 +49,8 @@
take_damage(1, sound_effect = FALSE)
if(!sparks)
- sparks = new(src)
+ sparks = new(src, 5, FALSE)
+ sparks.attach(src)
// minimum roll is by default capped at 50, with the min value lowering as integrity is reduced.
var/mintegrity = clamp(50 - (100 - get_integrity()), 1, 100)
@@ -84,8 +85,7 @@
// does not necessarily kill you directly. instead it causes cranial fissure + something to drop from your head. could be eyes, tongue, ears, brain, even implants
new /obj/effect/gibspawner/generic(get_turf(bozo), bozo)
-
- sparks.set_up(15, cardinals_only = FALSE, location = get_turf(src))
+ sparks.amount = 15
sparks.start()
qdel(src)
@@ -101,8 +101,7 @@
bozo.set_eye_blur_if_lower(10 SECONDS)
// but the rest of the effects will happen either way
bozo.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20 - get_integrity())
-
- sparks.set_up(5, cardinals_only = FALSE, location = get_turf(src))
+ sparks.amount = 5
sparks.start()
// brain Smoking. you should probably stop now
@@ -142,8 +141,7 @@
particle_effect.set_particle_position(-2, 12, 0)
bozo.apply_status_effect(/datum/status_effect/temperature_over_time/chip_overheat, 15 SECONDS)
QDEL_IN(particle_effect, 15 SECONDS)
-
- sparks.set_up(10, cardinals_only = FALSE, location = get_turf(src))
+ sparks.amount = 10
sparks.start()
// hey, something isn't right...
@@ -152,7 +150,7 @@
span_warning("[bozo]'s head sparks."),
)
- sparks.set_up(rand(1,2), cardinals_only = TRUE, location = get_turf(src))
+ sparks.amount = rand(1, 2)
sparks.start()
return COMPONENT_EMOTE_COOLDOWN_BYPASS
diff --git a/code/modules/meteors/meteor_dark_matteor.dm b/code/modules/meteors/meteor_dark_matteor.dm
index acf21a3c434..051f53c412d 100644
--- a/code/modules/meteors/meteor_dark_matteor.dm
+++ b/code/modules/meteors/meteor_dark_matteor.dm
@@ -14,7 +14,7 @@
/// distortion to really give you that sense of oh shit
var/atom/movable/warp_effect/warp
/// and another oh shit in the form of quantum sparks
- var/datum/effect_system/spark_spread/quantum/spark_system
+ var/datum/effect_system/basic/spark_spread/quantum/spark_system
/// in case we miss, we can go back to the previous security level
var/previous_security_level
@@ -26,8 +26,7 @@
SSsecurity_level.set_level(SEC_LEVEL_RED)
warp = new(src)
vis_contents += warp
- spark_system = new /datum/effect_system/spark_spread/quantum()
- spark_system.set_up(4, TRUE, src)
+ spark_system = new /datum/effect_system/basic/spark_spread/quantum(src, 4, TRUE)
spark_system.attach(src)
START_PROCESSING(SSobj, src)
diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm
index 27729c24031..b76bcaba2eb 100644
--- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm
+++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm
@@ -47,7 +47,7 @@
/// Make a cloud which applies brimdust to everyone nearby
/obj/item/organ/monster_core/brimdust_sac/on_triggered_internal()
var/turf/origin_turf = get_turf(owner)
- do_smoke(range = 2, holder = owner, location = origin_turf, smoke_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust)
+ do_smoke(2, owner, origin_turf, effect_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust)
/// Smoke which applies brimdust to you, and is also bad for your lungs
/obj/effect/particle_effect/fluid/smoke/bad/brimdust
diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_abilities.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_abilities.dm
index 9c334b41338..0073f472e5d 100644
--- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_abilities.dm
+++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_abilities.dm
@@ -29,8 +29,6 @@
/datum/action/cooldown/mob_cooldown/bot/foam/Activate(mob/living/firer, atom/target)
owner.visible_message(span_danger("[owner] whirs and bubbles violently, before releasing a plume of froth!"))
- var/datum/effect_system/fluid_spread/foam/foam = new
- foam.set_up(foam_range, holder = owner, location = owner.loc)
- foam.start()
+ do_foam(foam_range, owner, owner.loc)
StartCooldown()
return TRUE
diff --git a/code/modules/mob/living/basic/bots/firebot/firebot.dm b/code/modules/mob/living/basic/bots/firebot/firebot.dm
index b6ef076c629..b49aa011bbb 100644
--- a/code/modules/mob/living/basic/bots/firebot/firebot.dm
+++ b/code/modules/mob/living/basic/bots/firebot/firebot.dm
@@ -134,9 +134,7 @@
/mob/living/basic/bot/firebot/atmos_expose(datum/gas_mixture/air, exposed_temperature)
if(!COOLDOWN_FINISHED(src, foam_cooldown))
return
- var/datum/effect_system/fluid_spread/foam/firefighting/foam = new
- foam.set_up(3, holder = src, location = loc)
- foam.start()
+ do_foam(3, src, loc, foam_type = /datum/effect_system/fluid_spread/foam/firefighting)
COOLDOWN_START(src, foam_cooldown, FOAM_INTERVAL)
/mob/living/basic/bot/firebot/proc/spray_water(atom/attacked_atom, list/modifiers)
diff --git a/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm b/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm
index eb4dd4565fd..4c8d04c6391 100644
--- a/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm
+++ b/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm
@@ -68,9 +68,7 @@
RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_attack))
/mob/living/basic/bot/hygienebot/explode()
- var/datum/effect_system/fluid_spread/foam/foam = new
- foam.set_up(2, holder = src, location = loc)
- foam.start()
+ do_foam(2, src, loc)
return ..()
/mob/living/basic/bot/hygienebot/generate_speak_list()
diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm
index 674077dbc28..4452ae3100f 100644
--- a/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm
+++ b/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm
@@ -44,7 +44,7 @@
if(!stat && !user.combat_mode)
to_chat(user, span_nicegreen("[src] whispers you some intense wisdoms and then disappears!"))
user.mind?.adjust_experience(granted_wisdom, granted_experience)
- do_smoke(1, holder = src, location = get_turf(src))
+ do_smoke(1, src, get_turf(src))
qdel(src)
return
return ..()
diff --git a/code/modules/mob/living/basic/minebots/minebot_abilities.dm b/code/modules/mob/living/basic/minebots/minebot_abilities.dm
index 95948b328f7..58ee70181c7 100644
--- a/code/modules/mob/living/basic/minebots/minebot_abilities.dm
+++ b/code/modules/mob/living/basic/minebots/minebot_abilities.dm
@@ -153,9 +153,7 @@
/obj/effect/temp_visual/falling_rocket/proc/create_explosion()
playsound(src, 'sound/items/weapons/minebot_rocket.ogg', 100, FALSE)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(1, holder = src)
- smoke.start()
+ do_smoke(1, src, loc)
for(var/mob/living/living_target in oview(explosion_radius, src))
if(living_target.incorporeal_move)
continue
@@ -171,9 +169,7 @@
/obj/effect/mine/minebot/mineEffect(mob/living/victim)
if(!istype(victim))
return
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src)
- smoke.start()
+ do_smoke(0, src, loc)
playsound(src, 'sound/effects/explosion/explosion3.ogg', 100)
victim.apply_damage(damage_to_apply)
diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm
index c484a8b977c..e04649353ff 100644
--- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm
+++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm
@@ -119,9 +119,7 @@
continue
light.visible_message(span_boldwarning("[light] suddenly flares brightly and begins to spark!"))
- var/datum/effect_system/spark_spread/light_sparks = new /datum/effect_system/spark_spread()
- light_sparks.set_up(4, 0, light)
- light_sparks.start()
+ do_sparks(4, FALSE, light)
new /obj/effect/temp_visual/revenant(get_turf(light))
addtimer(CALLBACK(src, PROC_REF(overload_shock), light, caster), 2 SECONDS)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 60cfb34eebb..1075ee898ff 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -57,8 +57,7 @@
INVOKE_ASYNC(src, PROC_REF(set_core_display_icon), null, client)
- spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src)
+ spark_system = new /datum/effect_system/basic/spark_spread(src, 5, FALSE)
spark_system.attach(src)
add_verb(src, /mob/living/silicon/ai/proc/show_laws_verb)
diff --git a/code/modules/mob/living/silicon/ai/ai_defines.dm b/code/modules/mob/living/silicon/ai/ai_defines.dm
index 1dbf35d3342..6ffcd8bc66c 100644
--- a/code/modules/mob/living/silicon/ai/ai_defines.dm
+++ b/code/modules/mob/living/silicon/ai/ai_defines.dm
@@ -172,4 +172,4 @@
/// Used as a fake multitool in tcomms machinery
VAR_FINAL/obj/item/multitool/aiMulti
/// Helper effect that creates sparks when the AI is damaged
- VAR_FINAL/datum/effect_system/spark_spread/spark_system
+ VAR_FINAL/datum/effect_system/basic/spark_spread/spark_system
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 75cbaaa97aa..176caf3f346 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1,6 +1,5 @@
/mob/living/silicon/robot/Initialize(mapload)
- spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src)
+ spark_system = new /datum/effect_system/basic/spark_spread(src, 5, FALSE)
spark_system.attach(src)
add_traits(list(TRAIT_CAN_STRIP, TRAIT_FORCED_STANDING, TRAIT_KNOW_ENGI_WIRES, TRAIT_IGNORE_SURGERY_MODIFIERS), INNATE_TRAIT)
@@ -250,8 +249,7 @@
return
if(!ion_trail)
- ion_trail = new
- ion_trail.set_up(src)
+ ion_trail = new(src)
ionpulse_on = !ionpulse_on
to_chat(src, span_notice("You [ionpulse_on ? null :"de"]activate your ion thrusters."))
diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm
index 8ae9d1cf0c6..2cf30e5a5d9 100644
--- a/code/modules/mob/living/silicon/robot/robot_defines.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defines.dm
@@ -116,7 +116,7 @@
///Whether the robot has no charge left.
var/low_power_mode = FALSE
///So they can initialize sparks whenever/N
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
///Smoke particle type for brute damage
var/smoke_particles
///Spark particle type for burn damage
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index 1210cb357ad..5b5178ac5a8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -231,9 +231,7 @@
visible_message(span_boldwarning("[src] spews smoke from the tip of their spine!"))
else
visible_message(span_boldwarning("[src] spews smoke from its maw!"))
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(2, holder = src, location = smoke_location)
- smoke.start()
+ do_smoke(2, src, smoke_location)
//The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head.
/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
index e45e59c5f2a..092bdd654b9 100644
--- a/code/modules/mod/modules/modules_general.dm
+++ b/code/modules/mod/modules/modules_general.dm
@@ -1026,6 +1026,4 @@
/obj/item/mod/module/shock_absorber/proc/mob_batoned(datum/source)
SIGNAL_HANDLER
drain_power(use_energy_cost)
- var/datum/effect_system/lightning_spread/sparks = new /datum/effect_system/lightning_spread
- sparks.set_up(number = 5, cardinals_only = TRUE, location = mod.wearer.loc)
- sparks.start()
+ do_sparks(5, TRUE, mod.wearer.loc)
diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm
index d4723b04ca6..ae72a93df3a 100644
--- a/code/modules/mod/modules/modules_ninja.dm
+++ b/code/modules/mod/modules/modules_ninja.dm
@@ -265,30 +265,31 @@
var/maxcapacity = FALSE //Safety check for batteries
var/drain = 0 //Drain amount from batteries
var/drain_total = 0
- if(cell?.charge)
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, loc)
- while(cell.charge> 0 && !maxcapacity)
- drain = rand(NINJA_MIN_DRAIN, NINJA_MAX_DRAIN)
- if(cell.charge < drain)
- drain = cell.charge
- if(hacking_module.mod.get_charge() + drain > hacking_module.mod.get_max_charge())
- drain = hacking_module.mod.get_max_charge() - hacking_module.mod.get_charge()
- maxcapacity = TRUE//Reached maximum battery capacity.
- if (do_after(ninja, 1 SECONDS, target = src, hidden = TRUE))
- spark_system.start()
- playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- cell.use(drain)
- hacking_module.mod.add_charge(drain)
- drain_total += drain
- else
- break
- if(!(obj_flags & EMAGGED))
- flick("apc-spark", hacking_module)
+ if(!cell?.charge)
+ hacking_module.charge_message(src, drain_total)
+ return
+ var/datum/effect_system/basic/spark_spread/spark_system = new(loc, 5, FALSE)
+ while(cell.charge> 0 && !maxcapacity)
+ drain = rand(NINJA_MIN_DRAIN, NINJA_MAX_DRAIN)
+ if(cell.charge < drain)
+ drain = cell.charge
+ if(hacking_module.mod.get_charge() + drain > hacking_module.mod.get_max_charge())
+ drain = hacking_module.mod.get_max_charge() - hacking_module.mod.get_charge()
+ maxcapacity = TRUE//Reached maximum battery capacity.
+ if (do_after(ninja, 1 SECONDS, target = src, hidden = TRUE))
+ spark_system.start()
playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- obj_flags |= EMAGGED
- locked = FALSE
- update_appearance()
+ cell.use(drain)
+ hacking_module.mod.add_charge(drain)
+ drain_total += drain
+ else
+ break
+ if(!(obj_flags & EMAGGED))
+ flick("apc-spark", hacking_module)
+ playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ obj_flags |= EMAGGED
+ locked = FALSE
+ update_appearance()
hacking_module.charge_message(src, drain_total)
//SMES, Drains power to supply your modsuit
@@ -302,8 +303,7 @@
var/maxcapacity = FALSE //Safety check for batteries
var/drain = 0 //Drain amount from batteries
var/drain_total = 0
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, loc)
+ var/datum/effect_system/basic/spark_spread/spark_system = new(loc, 5, FALSE)
while(charge > 0 && !maxcapacity)
drain = rand(NINJA_MIN_DRAIN, NINJA_MAX_DRAIN)
if(charge < drain)
@@ -525,9 +525,7 @@
//20 uses for a standard cell. 200 for high capacity cells.
if(hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN*10))
//Got that electric touch
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, loc)
- spark_system.start()
+ do_sparks(5, FALSE, loc)
visible_message(span_danger("[ninja] electrocutes [src] with [ninja.p_their()] touch!"), span_userdanger("[ninja] electrocutes you with [ninja.p_their()] touch!"))
addtimer(CALLBACK(src, PROC_REF(ninja_knockdown)), 0.3 SECONDS)
return NONE
diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm
index a519651ce81..9f5f1a257b9 100644
--- a/code/modules/mod/modules/modules_security.dm
+++ b/code/modules/mod/modules/modules_security.dm
@@ -91,12 +91,7 @@
/obj/item/mod/module/pepper_shoulders/on_use(mob/activator)
playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6)
- var/datum/reagents/capsaicin_holder = new(10)
- capsaicin_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 10)
- var/datum/effect_system/fluid_spread/smoke/chem/quick/smoke = new
- smoke.set_up(1, holder = src, location = get_turf(src), carry = capsaicin_holder)
- smoke.start(log = TRUE)
- QDEL_NULL(capsaicin_holder) // Reagents have a ref to their holder which has a ref to them. No leaks please.
+ do_chem_smoke(1, src, get_turf(src), /datum/reagent/consumable/condensedcapsaicin, 10, log = TRUE, smoke_type = /datum/effect_system/fluid_spread/smoke/chem/quick)
/obj/item/mod/module/pepper_shoulders/proc/on_check_block()
SIGNAL_HANDLER
diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm
index c40e3552bce..1ef5a55b5c5 100644
--- a/code/modules/mod/modules/modules_service.dm
+++ b/code/modules/mod/modules/modules_service.dm
@@ -49,17 +49,13 @@
balloon_alert(mod.wearer, "not in storage!")
return
var/obj/item/microwave_target = target
- var/datum/effect_system/spark_spread/spark_effect = new()
- spark_effect.set_up(2, 1, mod.wearer)
- spark_effect.start()
+ do_sparks(2, TRUE, mod.wearer)
mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5)
if(microwave_target.microwave_act(microwaver = mod.wearer) & COMPONENT_MICROWAVE_SUCCESS)
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE)
else
balloon_alert(mod.wearer, "can't be microwaved!")
- var/datum/effect_system/spark_spread/spark_effect_two = new()
- spark_effect_two.set_up(2, 1, microwave_target)
- spark_effect_two.start()
+ do_sparks(2, TRUE, microwave_target)
drain_power(use_energy_cost)
//Waddle - Makes you waddle and squeak.
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
index 5163557eb04..d1c035d1452 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -34,8 +34,7 @@
if(computer.internal_cell && prob(25))
QDEL_NULL(computer.internal_cell)
computer.visible_message(span_notice("\The [computer]'s battery explodes in rain of sparks."))
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
- spark_system.start()
+ do_sparks(3, FALSE, src)
/datum/computer_file/program/revelation/ui_act(action, params, datum/tgui/ui, datum/ui_state/state)
. = ..()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index b2064b0acdf..7bde7c5e829 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -46,7 +46,7 @@
///What's the projectile sound?
var/projectile_sound = 'sound/items/weapons/emitter.ogg'
///Sparks emitted with every shot
- var/datum/effect_system/spark_spread/sparks
+ var/datum/effect_system/basic/spark_spread/sparks
///Stores the type of gun we are using inside the emitter
var/obj/item/gun/energy/gun
///List of all the properties of the inserted gun
@@ -74,9 +74,8 @@
set_anchored(TRUE)
connect_to_network()
- sparks = new
+ sparks = new(src, 5, TRUE)
sparks.attach(src)
- sparks.set_up(5, TRUE, src)
AddElement(/datum/element/simple_rotation)
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 8df354201f9..4382be5fa8c 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -100,11 +100,8 @@
/obj/item/ammo_casing/shotgun/buckshot/old/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
. = ..()
- if(!fired_from)
- return
-
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = fired_from, location = fired_from)
+ if(fired_from)
+ do_smoke(0, fired_from, fired_from)
/obj/item/ammo_casing/shotgun/buckshot/milspec
name = "milspec buckshot shell"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index f7ff0ddf2aa..53667d5e122 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -195,17 +195,13 @@
/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user, suicide = FALSE)
if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC))
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(3, holder = src, location = user.loc)
- smoke.start()
+ do_smoke(3, src, user.loc)
charges--
return ..()
/obj/item/gun/magic/wand/teleport/do_suicide(mob/living/user)
playsound(loc, fire_sound, 50, TRUE, -1)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(3, holder = src, location = user.loc)
- smoke.start()
+ do_smoke(3, src, user.loc)
if (!iscarbon(user))
return SHAME
@@ -247,11 +243,11 @@
var/turf/origin = get_turf(user)
var/turf/destination = find_safe_turf(extended_safety_checks = TRUE)
- if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC))
- for(var/t in list(origin, destination))
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = t)
- smoke.start()
+ if(!do_teleport(user, destination, channel = TELEPORT_CHANNEL_MAGIC))
+ return ..()
+
+ for(var/turf/smoke_turf as anything in list(origin, destination))
+ do_smoke(0, src, smoke_turf)
return ..()
/obj/item/gun/magic/wand/safety/do_suicide(mob/living/user)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 33d8e98b373..b5890679eae 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -95,13 +95,13 @@
if(!isturf(target))
teleloc = target.loc
for(var/atom/movable/stuff in teleloc)
- if(!stuff.anchored && stuff.loc && !isobserver(stuff))
- if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC))
- teleammount++
- var/smoke_range = max(round(4 - teleammount), 0)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(smoke_range, holder = src, location = stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
- smoke.start()
+ if(stuff.anchored || isobserver(stuff))
+ continue
+ if(!do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC))
+ continue
+ teleammount++
+ var/smoke_range = max(round(4 - teleammount), 0)
+ do_smoke(smoke_range, src, stuff.loc)
/// Teleports you somewhere on the station where the local conditions won't kill you
/obj/projectile/magic/safety
@@ -116,11 +116,11 @@
var/turf/origin_turf = get_turf(target)
var/turf/destination_turf = find_safe_turf(extended_safety_checks = TRUE)
- if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC))
- for(var/t in list(origin_turf, destination_turf))
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = t)
- smoke.start()
+ if(!do_teleport(target, destination_turf, channel = TELEPORT_CHANNEL_MAGIC))
+ return
+
+ for(var/turf/smoke_turf as anything in list(origin_turf, destination_turf))
+ do_smoke(0, src, smoke_turf)
/// Turns walls into doors, or opens doors
/obj/projectile/magic/door
diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm
index 2efa0963556..b13010cca42 100644
--- a/code/modules/reagents/chem_splash.dm
+++ b/code/modules/reagents/chem_splash.dm
@@ -79,11 +79,8 @@
*/
/proc/spread_reagents(datum/reagents/source, atom/epicenter, spread_range)
spread_range = min(spread_range, 20) // Fuck off with trying to do more then this
- var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread()
- steam.set_up(10, 0, epicenter)
- steam.attach(epicenter)
- steam.start()
-
+ var/datum/effect_system/basic/steam_spread/steam = new /datum/effect_system/basic/steam_spread(epicenter, 10, FALSE)
+ steam.attach(epicenter).start()
// This is a basic floodfill algorithm of atmos connected tiles
// Turfs will be stored in the form turf -> TRUE
var/chem_temp = source.chem_temp
diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
index e41296a589a..d1c33fc4a29 100644
--- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm
+++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
@@ -30,14 +30,6 @@
opacity = FALSE
alpha = 100
-/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location, datum/reagents/carry, efficiency = 10, silent = FALSE)
- src.holder = holder
- src.location = get_turf(location)
- src.amount = amount
- if(carry)
- carry.trans_to(chemholder, 20, copy_only = TRUE)
- carry.remove_all(amount / efficiency)
-
/obj/machinery/smoke_machine/Initialize(mapload)
create_reagents(REAGENTS_BASE_VOLUME, INJECTABLE)
@@ -163,12 +155,14 @@
return PROCESS_KILL
var/turf/location = get_turf(src)
- if(!(locate(/obj/effect/particle_effect/fluid/smoke) in location))
- var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/smoke = new()
- smoke.set_up(setting * 3, holder = src, location = location, carry = reagents, efficiency = efficiency)
- smoke.start()
- use_energy(active_power_usage * (setting / max_range))
- update_appearance(UPDATE_ICON_STATE)
+ if(locate(/obj/effect/particle_effect/fluid/smoke) in location)
+ return
+
+ var/smoke_amount = DIAMOND_AREA(setting * 3)
+ do_chem_smoke(amount = smoke_amount, holder = src, location = location, carry = reagents, carry_limit = 20, smoke_type = /datum/effect_system/fluid_spread/smoke/chem/smoke_machine)
+ reagents.remove_all(smoke_amount / efficiency)
+ use_energy(active_power_usage * (setting / max_range))
+ update_appearance(UPDATE_ICON_STATE)
/obj/machinery/smoke_machine/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 6d52d85b529..d5a7e2f84f0 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -129,9 +129,8 @@
if(source.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)
return
var/location = get_turf(holder.my_atom)
- var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(1 + round(volume / 6, 1), location, message = FALSE)
- e.start(holder.my_atom)
+ var/datum/effect_system/reagents_explosion/expl = new(location, 1 + round(volume / 6, 1), message = FALSE)
+ expl.start(holder.my_atom)
holder.clear_reagents()
/datum/reagent/gunpowder/on_spark_act(power_charge, spark_flags)
@@ -225,15 +224,13 @@
if ((spark_flags & SPARK_ACT_ENCLOSED) && !ismob(holder.my_atom))
return
var/location = get_turf(holder.my_atom)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke_system = new()
playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3)
if (iscarbon(holder.my_atom))
var/mob/living/carbon/victim = holder.my_atom
if (victim.stat != DEAD)
victim.visible_message(span_warning("[victim] starts violently coughing up smoke!"))
victim.adjust_organ_loss(ORGAN_SLOT_LUNGS, volume / 15)
- smoke_system.set_up(amount = volume / 1.5, holder = holder.my_atom, location = location, carry = holder, silent = FALSE)
- smoke_system.start(log = TRUE)
+ do_chem_smoke(amount = volume / 1.5, holder = holder.my_atom, location = location, carry = holder, silent = FALSE, log = TRUE)
return SPARK_ACT_NON_DESTRUCTIVE | SPARK_ACT_CLEAR_ALL
/datum/reagent/sonic_powder
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index e07c14d0484..ff4438037a0 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -305,8 +305,7 @@
if (!istype(holder.my_atom, /obj/machinery/plumbing)) //excludes standard plumbing equipment from spamming admins with this shit
message_admins("Reagent explosion reaction occurred at [ADMIN_VERBOSEJMP(our_turf)][inside_msg]. Last Fingerprint: [touch_msg].")
log_game("Reagent explosion reaction occurred at [AREACOORD(our_turf)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
- var/datum/effect_system/reagents_explosion/explosion_system = new()
- explosion_system.set_up(power, our_turf, flash_fact = flash_factor, flame_fact = flame_factor)
+ var/datum/effect_system/reagents_explosion/explosion_system = new(our_turf, power, flash_fact = flash_factor, flame_fact = flame_factor)
explosion_system.start(holder.my_atom)
if (istype(holder.my_atom, /obj/item/organ/stomach))
@@ -370,7 +369,6 @@
//Spews out the inverse of the chems in the beaker of the products/reactants only
/datum/chemical_reaction/proc/explode_invert_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, force_range = 0, clear_products = TRUE, clear_reactants = TRUE, accept_impure = TRUE)
var/datum/reagents/invert_reagents = new (2100, NO_REACT)//I think the biggest size we can get is 2100?
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new()
var/sum_volume = 0
invert_reagents.my_atom = holder.my_atom //Give the gas a fingerprint
for(var/datum/reagent/reagent as anything in holder.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding
@@ -386,8 +384,7 @@
if(!force_range)
force_range = (sum_volume/6) + 3
if(invert_reagents.reagent_list)
- smoke.set_up(force_range, holder = holder.my_atom, location = holder.my_atom, carry = invert_reagents)
- smoke.start(log = TRUE)
+ do_chem_smoke(force_range, holder.my_atom, holder.my_atom, carry = invert_reagents, log = TRUE)
holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!")
if(clear_reactants)
clear_reactants(holder)
@@ -397,7 +394,6 @@
//Spews out the corrisponding reactions reagents (products/required) of the beaker in a smokecloud. Doesn't spew catalysts
/datum/chemical_reaction/proc/explode_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, force_range = 0, clear_products = TRUE, clear_reactants = TRUE)
var/datum/reagents/reagents = new/datum/reagents(2100, NO_REACT)//Lets be safe first
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new()
reagents.my_atom = holder.my_atom //fingerprint
var/sum_volume = 0
for (var/datum/reagent/reagent as anything in holder.reagent_list)
@@ -407,8 +403,7 @@
if(!force_range)
force_range = (sum_volume/6) + 3
if(reagents.reagent_list)
- smoke.set_up(force_range, holder = holder.my_atom, location = holder.my_atom, carry = reagents)
- smoke.start(log = TRUE)
+ do_chem_smoke(force_range, holder = holder.my_atom, location = holder.my_atom, carry = reagents, log = TRUE)
holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!")
if(clear_reactants)
clear_reactants(holder)
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
index f4f89f6af36..8b563bb9b1a 100644
--- a/code/modules/reagents/chemistry/recipes/drugs.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -72,9 +72,8 @@
if(!istype(holder.my_atom, /obj/machinery/plumbing)) //excludes standard plumbing equipment from spamming admins with this shit
message_admins("Reagent explosion reaction occurred at [ADMIN_VERBOSEJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].")
log_game("Reagent explosion reaction occurred at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
- var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(power, T)
- e.start(holder.my_atom)
+ var/datum/effect_system/reagents_explosion/expl = new(T, power)
+ expl.start(holder.my_atom)
holder.clear_reagents()
///Amount of meth required to make a crystal
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 876bfc6d78e..d627f119cd9 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -393,12 +393,8 @@
return
holder.remove_reagent(/datum/reagent/smoke_powder, created_volume * 3)
var/location = get_turf(holder.my_atom)
- var/datum/effect_system/fluid_spread/smoke/chem/S = new
- S.attach(location)
+ do_chem_smoke(amount = created_volume * 3, holder = holder.my_atom, location = location, carry = holder, silent = FALSE, log = TRUE)
playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3)
- if(S)
- S.set_up(amount = created_volume * 3, holder = holder.my_atom, location = location, carry = holder, silent = FALSE)
- S.start(log = TRUE)
if(holder?.my_atom)
holder.clear_reagents()
if (!iscarbon(holder?.my_atom))
@@ -417,12 +413,8 @@
/datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
- var/datum/effect_system/fluid_spread/smoke/chem/S = new
- S.attach(location)
+ do_chem_smoke(amount = created_volume, holder = holder.my_atom, location = location, carry = holder, log = TRUE, silent = FALSE)
playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3)
- if(S)
- S.set_up(amount = created_volume, holder = holder.my_atom, location = location, carry = holder, silent = FALSE)
- S.start(log = TRUE)
if(holder?.my_atom)
holder.clear_reagents()
if(holder?.my_atom)
diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm
index 181a7e1d6e1..8a8faa72bae 100644
--- a/code/modules/reagents/reagent_containers/inhaler.dm
+++ b/code/modules/reagents/reagent_containers/inhaler.dm
@@ -260,21 +260,11 @@
/obj/item/reagent_containers/inhaler_canister/handle_deconstruct(disassembled)
if (!reagents?.total_volume)
+ visible_message(span_warning("[src] breaks open - but is empty!"))
return ..()
- var/datum/reagents/smoke_reagents = new/datum/reagents() // Lets be safe first, our own reagents may be qdelled if we get deleted
- var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/smoke = new()
- smoke_reagents.my_atom = src
- for (var/datum/reagent/reagent as anything in reagents.reagent_list)
- smoke_reagents.add_reagent(reagent.type, reagent.volume, added_purity = reagent.purity)
- reagents.remove_reagent(reagent.type, reagent.volume)
- if (smoke_reagents.reagent_list)
- smoke.set_up(1, holder = src, location = get_turf(src), carry = smoke_reagents)
- smoke.start(log = TRUE)
- visible_message(span_warning("[src] breaks open and sprays its aerosilized contents everywhere!"))
- else
- visible_message(span_warning("[src] breaks open - but is empty!"))
-
+ do_chem_smoke(1, src, get_turf(src), carry = reagents, log = TRUE)
+ visible_message(span_warning("[src] breaks open and sprays its aerosilized contents everywhere!"))
return ..()
/obj/item/inhaler/medical
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 60af82540d2..b052473d55f 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -211,11 +211,8 @@
return FALSE
/obj/structure/reagent_dispensers/proc/knock_down()
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new ()
var/range = reagents.total_volume / REAGENT_SPILL_DIVISOR
- smoke.attach(drop_location())
- smoke.set_up(round(range), holder = drop_location(), location = drop_location(), carry = reagents, silent = FALSE)
- smoke.start(log = TRUE)
+ do_chem_smoke(round(range), drop_location(), drop_location(), carry = reagents, silent = FALSE, log = TRUE)
reagents.clear_reagents()
qdel(src)
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 6f7e8fc0d4e..457b4cca52a 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -233,9 +233,7 @@
use_energy(750 JOULES)
/obj/machinery/rnd/experimentor/proc/throwSmoke(turf/where)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = where)
- smoke.start()
+ do_smoke(0, src, where)
/obj/machinery/rnd/experimentor/proc/experiment(exp,obj/item/exp_on)
recentlyExperimented = 1
@@ -307,27 +305,15 @@
else if(prob(EFFECT_PROB_VERYLOW * (100 - malfunction_probability_coeff) * 0.01))
visible_message(span_danger("[src] destroys [exp_on], leaking dangerous gas!"))
chosenchem = pick(/datum/reagent/carbon,/datum/reagent/uranium/radium,/datum/reagent/toxin,/datum/reagent/consumable/condensedcapsaicin,/datum/reagent/drug/mushroomhallucinogen,/datum/reagent/drug/space_drugs,/datum/reagent/consumable/ethanol,/datum/reagent/consumable/ethanol/beepsky_smash)
- var/datum/reagents/tmp_holder = new/datum/reagents(50)
- tmp_holder.my_atom = src
- tmp_holder.add_reagent(chosenchem , 50)
+ do_chem_smoke(0, src, loc, chosenchem, 50)
investigate_log("Experimentor has released [chosenchem] smoke.", INVESTIGATE_EXPERIMENTOR)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new
- smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE)
playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3)
- smoke.start()
- qdel(tmp_holder)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_VERYLOW * (100 - malfunction_probability_coeff) * 0.01))
visible_message(span_danger("[src]'s chemical chamber has sprung a leak!"))
chosenchem = pick(/datum/reagent/mutationtoxin/classic,/datum/reagent/cyborg_mutation_nanomachines,/datum/reagent/toxin/acid)
- var/datum/reagents/tmp_holder = new/datum/reagents(50)
- tmp_holder.my_atom = src
- tmp_holder.add_reagent(chosenchem , 50)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new
- smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE)
+ do_chem_smoke(0, src, loc, chosenchem, 50)
playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3)
- smoke.start()
- qdel(tmp_holder)
ejectItem(TRUE)
warn_admins(usr, "[chosenchem] smoke")
investigate_log("Experimentor has released [chosenchem] smoke!", INVESTIGATE_EXPERIMENTOR)
@@ -398,15 +384,9 @@
investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_VERYLOW * (100 - malfunction_probability_coeff) * 0.01))
visible_message(span_danger("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!"))
- var/datum/reagents/tmp_holder = new/datum/reagents(50)
- tmp_holder.my_atom = src
- tmp_holder.add_reagent(/datum/reagent/consumable/frostoil, 50)
+ do_chem_smoke(0, src, loc, /datum/reagent/consumable/frostoil, 50)
investigate_log("Experimentor has released frostoil gas.", INVESTIGATE_EXPERIMENTOR)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new
- smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE)
playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3)
- smoke.start()
- qdel(tmp_holder)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW * (100 - malfunction_probability_coeff) * 0.01))
visible_message(span_warning("[src] malfunctions, shattering [exp_on] and leaking cold air!"))
@@ -419,9 +399,7 @@
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM * (100 - malfunction_probability_coeff) * 0.01))
visible_message(span_warning("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!"))
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = loc)
- smoke.start()
+ do_smoke(0, src, loc)
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_OBLITERATE)
@@ -571,19 +549,11 @@
COOLDOWN_DECLARE(cooldown)
//What visual theme this artefact has. Current possible choices: "prototype", "necrotech"
var/artifact_theme = "prototype"
- var/datum/effect_system/spark_spread/sparks
/obj/item/relic/Initialize(mapload)
. = ..()
- sparks = new()
- sparks.set_up(5, 1, src)
- sparks.attach(src)
random_themed_appearance()
-/obj/item/relic/Destroy(force)
- QDEL_NULL(sparks)
- . = ..()
-
/obj/item/relic/proc/random_themed_appearance()
var/themed_name_prefix
var/themed_name_suffix
@@ -642,9 +612,7 @@
call(src, hidden_power)(user)
/obj/item/relic/proc/throw_smoke(turf/where)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = get_turf(where))
- smoke.start()
+ do_smoke(0, src, get_turf(where))
// Artefact Powers \\
@@ -740,7 +708,7 @@
/obj/item/relic/proc/drink_dispenser(mob/user)
var/obj/item/reagent_containers/cup/glass/drinkingglass/freebie = new(get_step_rand(user))
playsound(freebie, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- sparks.start()
+ do_sparks(5, TRUE, src, src)
addtimer(CALLBACK(src, PROC_REF(dispense_drink), freebie), 0.5 SECONDS)
/obj/item/relic/proc/dispense_drink(obj/item/reagent_containers/cup/glass/glasser)
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 8ccfc9c97bb..a8a686d7a18 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -45,12 +45,7 @@ Burning extracts:
/obj/item/slimecross/burning/orange/do_effect(mob/user)
user.visible_message(span_danger("[src] boils over with a caustic gas!"))
- var/datum/reagents/tmp_holder = new/datum/reagents(100)
- tmp_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 100)
-
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new
- smoke.set_up(7, holder = src, location = get_turf(user), carry = tmp_holder)
- smoke.start(log = TRUE)
+ do_chem_smoke(7, user, get_turf(user), /datum/reagent/consumable/condensedcapsaicin, 100, log = TRUE)
..()
/obj/item/slimecross/burning/purple
@@ -120,12 +115,8 @@ Burning extracts:
/obj/item/slimecross/burning/darkblue/do_effect(mob/user)
user.visible_message(span_danger("[src] releases a burst of chilling smoke!"))
- var/datum/reagents/tmp_holder = new/datum/reagents(100)
- tmp_holder.add_reagent(/datum/reagent/consumable/frostoil, 40)
user.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 10)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new
- smoke.set_up(7, holder = src, location = get_turf(user), carry = tmp_holder)
- smoke.start(log = TRUE)
+ do_chem_smoke(7, user, get_turf(user), /datum/reagent/consumable/frostoil, 40, log = TRUE)
..()
/obj/item/slimecross/burning/silver
diff --git a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm
index 4a564b58b13..0b73e235140 100644
--- a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm
+++ b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm
@@ -97,9 +97,7 @@
new /obj/effect/gibspawner/generic(get_turf(vat)) //Spawn some gibs.
/datum/micro_organism/cell_line/proc/succeed_growing(obj/machinery/vatgrower/vat)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = vat, location = vat.loc)
- smoke.start()
+ do_smoke(0, vat, vat.loc)
for(var/x in 1 to resulting_atom_count)
var/atom/thing = new resulting_atom(get_turf(vat))
ADD_TRAIT(thing, TRAIT_VATGROWN, "vatgrowing")
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index 90e30ea03f8..1f5413a09ed 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -363,9 +363,7 @@
if(sparks_amt)
do_sparks(sparks_amt, FALSE, get_turf(owner))
if(ispath(smoke_type, /datum/effect_system/fluid_spread/smoke))
- var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_type()
- smoke.set_up(smoke_amt, holder = owner, location = get_turf(owner))
- smoke.start()
+ do_smoke(smoke_amt, owner, get_turf(owner))
// Send signals last in case they delete the spell
SEND_SIGNAL(owner, COMSIG_MOB_AFTER_SPELL_CAST, src, cast_on)
diff --git a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm
index 58fcbb6ff50..96cf2a46cdf 100644
--- a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm
@@ -165,8 +165,7 @@
/// Does some steam effects from the jaunt at passed loc.
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_steam_effects(turf/loc)
- var/datum/effect_system/steam_spread/steam = new()
- steam.set_up(10, FALSE, loc)
+ var/datum/effect_system/basic/steam_spread/steam = new(loc, 10, FALSE)
steam.start()
diff --git a/code/modules/spells/spell_types/pointed/swap.dm b/code/modules/spells/spell_types/pointed/swap.dm
index 57b74fba056..d8690754a62 100644
--- a/code/modules/spells/spell_types/pointed/swap.dm
+++ b/code/modules/spells/spell_types/pointed/swap.dm
@@ -38,7 +38,7 @@
/datum/action/cooldown/spell/pointed/swap/InterceptClickOn(mob/living/clicker, params, atom/target)
if(!LAZYACCESS(params2list(params), RIGHT_CLICK))
return ..()
-
+
if(!IsAvailable(feedback = TRUE))
return FALSE
if(!target)
@@ -69,16 +69,13 @@
to_chat(cast_on, span_userdanger("You feel space bending."))
if(ispath(smoke_type, /datum/effect_system/fluid_spread/smoke))
- var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_type()
- smoke.set_up(smoke_amt, holder = owner, location = get_turf(owner))
- smoke.start()
+ do_smoke(smoke_amt, owner, get_turf(owner), smoke_type = smoke_type)
+
var/turf/target_location = get_turf(cast_on)
if(!isnull(second_target) && get_dist(owner, second_target) <= cast_range && !(cast_on == second_target))
to_chat(second_target, span_userdanger("You feel space bending."))
if(ispath(smoke_type, /datum/effect_system/fluid_spread/smoke))
- var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_type()
- smoke.set_up(smoke_amt, holder = owner, location = get_turf(second_target))
- smoke.start()
+ do_smoke(smoke_amt, owner, get_turf(second_target))
var/turf/second_location = get_turf(second_target)
do_teleport(second_target, owner.loc, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC)
do_teleport(cast_on, second_location, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC)
diff --git a/code/modules/spells/spell_types/summon/servant.dm b/code/modules/spells/spell_types/summon/servant.dm
index 63f30e913a2..12ad4de5775 100644
--- a/code/modules/spells/spell_types/summon/servant.dm
+++ b/code/modules/spells/spell_types/summon/servant.dm
@@ -79,7 +79,7 @@
spawn_location.visible_message(span_userdanger("A Magical [servant_title] appears in a cloud of smoke!"))
var/mob/living/carbon/human/human_servant = new(spawn_location)
human_servant.equipOutfit(/datum/outfit/butler)
- do_smoke(0, holder = src, location = spawn_location)
+ do_smoke(0, src, spawn_location)
human_servant.PossessByPlayer(chosen_one.key)
summon_weakref = WEAKREF(human_servant)
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 7e9b94ec724..857db82f335 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -368,9 +368,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE)
if(notice)
return null
//Totally nanite construction system not an immersion breaking spawning
- var/datum/effect_system/fluid_spread/smoke/fourth_wall_guard = new
- fourth_wall_guard.set_up(4, holder = src, location = get_turf(centerpiece))
- fourth_wall_guard.start()
+ do_smoke(4, get_turf(centerpiece), get_turf(centerpiece))
var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction())
QDEL_NULL(centerpiece.front_ref)
QDEL_NULL(centerpiece.back_ref)
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
index 510468ffa0f..8765b0dc373 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
@@ -210,9 +210,7 @@
owner.set_stamina_loss(0)
addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living, set_stamina_loss), 0), stun_resistance_time)
- var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
- sparks.set_up(5, 1, src)
- sparks.start()
+ do_sparks(5, TRUE, src)
give_stun_buffs(owner)
addtimer(CALLBACK(src, PROC_REF(remove_stun_buffs), owner), stun_resistance_time)
diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm
index 1567eed0f97..8137bca7509 100644
--- a/code/modules/vehicles/atv.dm
+++ b/code/modules/vehicles/atv.dm
@@ -108,9 +108,7 @@
return PROCESS_KILL
if(SPT_PROB(10, seconds_per_tick))
return
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = src)
- smoke.start()
+ do_smoke(0, src, src)
/obj/vehicle/ridden/atv/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked)
if(prob(50) || !LAZYLEN(buckled_mobs))
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 67424be210d..0672586220c 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -97,11 +97,7 @@
. = ..()
if(prob(33))
visible_message(span_danger("[src] spews out a ton of space lube!"))
- var/datum/effect_system/fluid_spread/foam/foam = new
- var/datum/reagents/foamreagent = new /datum/reagents(25)
- foamreagent.add_reagent(/datum/reagent/lube, 25)
- foam.set_up(4, holder = src, location = loc, carry = foamreagent)
- foam.start()
+ do_foam(4, src, loc, /datum/reagent/lube, 25)
/obj/vehicle/sealed/car/clowncar/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(!istype(tool, /obj/item/food/grown/banana))
@@ -218,12 +214,7 @@
new /obj/item/grown/bananapeel/specialpeel(loc)
if(2)
visible_message(span_danger("[user] presses one of the colorful buttons on [src], and unknown chemicals flood out of it."))
- var/datum/reagents/randomchems = new/datum/reagents(300)
- randomchems.my_atom = src
- randomchems.add_reagent(get_random_reagent_id(), 100)
- var/datum/effect_system/fluid_spread/foam/foam = new
- foam.set_up(200, holder = src, location = loc, carry = randomchems)
- foam.start(log = TRUE)
+ do_foam(200, src, loc, get_random_reagent_id(), 100, log = TRUE)
if(3)
visible_message(span_danger("[user] presses one of the colorful buttons on [src], and the clown car turns on its singularity disguise system."))
icon = 'icons/obj/machines/engine/singularity.dmi'
@@ -231,13 +222,8 @@
addtimer(CALLBACK(src, PROC_REF(reset_icon)), 10 SECONDS)
if(4)
visible_message(span_danger("[user] presses one of the colorful buttons on [src], and the clown car spews out a cloud of laughing gas."))
- var/datum/reagents/funnychems = new/datum/reagents(300)
- funnychems.my_atom = src
- funnychems.add_reagent(/datum/reagent/consumable/superlaughter, 50)
- var/datum/effect_system/fluid_spread/smoke/chem/smoke = new()
- smoke.set_up(4, holder = src, location = src, carry = funnychems)
- smoke.attach(src)
- smoke.start(log = TRUE)
+ do_chem_smoke(4, src, src, /datum/reagent/consumable/superlaughter, 50, log = TRUE)
+
if(5)
visible_message(span_danger("[user] presses one of the colorful buttons on [src], and the clown car starts dropping an oil trail."))
RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(cover_in_oil))
diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm
index 44690288175..7bd4ffd709a 100644
--- a/code/modules/vehicles/mecha/_mecha.dm
+++ b/code/modules/vehicles/mecha/_mecha.dm
@@ -59,7 +59,7 @@
var/mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | BEACON_TRACKABLE | AI_COMPATIBLE | BEACON_CONTROLLABLE
///Spark effects are handled by this datum
- var/datum/effect_system/spark_spread/spark_system
+ var/datum/effect_system/basic/spark_spread/spark_system
///How powerful our lights are
var/lights_power = 6
///Just stop the mech from doing anything
@@ -230,13 +230,9 @@
RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater))
- spark_system = new
- spark_system.set_up(2, 0, src)
+ spark_system = new(src, 2, FALSE)
spark_system.attach(src)
-
- smoke_system = new
- smoke_system.set_up(3, holder = src, location = src)
- smoke_system.attach(src)
+ smoke_system = new(src, 3, holder = src)
cabin_air = new(cabin_volume)
diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm
index d3f1ff5ba10..3e1b6cf86cb 100644
--- a/code/modules/vehicles/scooter.dm
+++ b/code/modules/vehicles/scooter.dm
@@ -42,7 +42,7 @@
density = FALSE
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10)
///Sparks datum for when we grind on tables
- var/datum/effect_system/spark_spread/sparks
+ var/datum/effect_system/basic/spark_spread/sparks
///Whether the board is currently grinding
var/grinding = FALSE
///Stores the time of the last crash plus a short cooldown, affects availability and outcome of certain actions
@@ -56,16 +56,14 @@
/obj/vehicle/ridden/scooter/skateboard/Initialize(mapload)
. = ..()
- sparks = new
- sparks.set_up(1, 0, src)
+ sparks = new(src, 1, FALSE)
sparks.attach(src)
/obj/vehicle/ridden/scooter/skateboard/make_ridable()
AddElement(/datum/element/ridable, /datum/component/riding/vehicle/scooter/skateboard)
/obj/vehicle/ridden/scooter/skateboard/Destroy()
- if(sparks)
- QDEL_NULL(sparks)
+ QDEL_NULL(sparks)
return ..()
/obj/vehicle/ridden/scooter/skateboard/relaymove(mob/living/user, direction)
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index cf784e77ca4..86e26b735d3 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -30,9 +30,7 @@
return PROCESS_KILL
if(SPT_PROB(10, seconds_per_tick))
return
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src, location = src)
- smoke.start()
+ do_smoke(0, src, src)
/obj/vehicle/ridden/secway/welder_act(mob/living/user, obj/item/W)
if(user.combat_mode)
diff --git a/tgstation.dme b/tgstation.dme
index 6114fda8931..fa648bd841c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2432,6 +2432,7 @@
#include "code\game\objects\effects\powerup.dm"
#include "code\game\objects\effects\rcd.dm"
#include "code\game\objects\effects\shared_particle_holder.dm"
+#include "code\game\objects\effects\shield.dm"
#include "code\game\objects\effects\spiderwebs.dm"
#include "code\game\objects\effects\step_triggers.dm"
#include "code\game\objects\effects\wanted_poster.dm"
@@ -2464,11 +2465,11 @@
#include "code\game\objects\effects\decals\turfdecal\markings.dm"
#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm"
#include "code\game\objects\effects\decals\turfdecal\weather.dm"
-#include "code\game\objects\effects\effect_system\effect_shield.dm"
#include "code\game\objects\effects\effect_system\effect_system.dm"
#include "code\game\objects\effects\effect_system\effects_explosion.dm"
-#include "code\game\objects\effects\effect_system\effects_other.dm"
+#include "code\game\objects\effects\effect_system\effects_reagents_explosion.dm"
#include "code\game\objects\effects\effect_system\effects_sparks.dm"
+#include "code\game\objects\effects\effect_system\effects_trail.dm"
#include "code\game\objects\effects\effect_system\effects_water.dm"
#include "code\game\objects\effects\effect_system\fluid_spread\_fluid_spread.dm"
#include "code\game\objects\effects\effect_system\fluid_spread\effects_foam.dm"