mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-21 12:08:55 +01:00
109 lines
4.3 KiB
Plaintext
109 lines
4.3 KiB
Plaintext
/////////////////////////////////////////////
|
|
//SPARK SYSTEM (like steam system)
|
|
// The attach(atom/atom) proc is optional, and can be called to attach the effect
|
|
// to something, like the RCD, so then you can just call start() and the sparks
|
|
// will always spawn at the items location.
|
|
/////////////////////////////////////////////
|
|
|
|
/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"
|
|
anchored = TRUE
|
|
light_system = OVERLAY_LIGHT
|
|
light_range = 1.5
|
|
light_power = 0.8
|
|
light_color = LIGHT_COLOR_FIRE
|
|
|
|
/obj/effect/particle_effect/sparks/Initialize(mapload)
|
|
..()
|
|
return INITIALIZE_HINT_LATELOAD
|
|
|
|
/obj/effect/particle_effect/sparks/LateInitialize()
|
|
RegisterSignals(src, list(COMSIG_MOVABLE_CROSS, COMSIG_MOVABLE_CROSS_OVER), PROC_REF(sparks_touched))
|
|
flick(icon_state, src)
|
|
playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
|
var/turf/location = loc
|
|
if(isturf(location))
|
|
affect_location(location, just_initialized = TRUE)
|
|
QDEL_IN(src, 2 SECONDS)
|
|
|
|
/obj/effect/particle_effect/sparks/Destroy()
|
|
var/turf/location = loc
|
|
if(isturf(location))
|
|
affect_location(location)
|
|
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.
|
|
*
|
|
* When the spark is first created, Cross() and Crossed() don't get called,
|
|
* so for the first initialization, we make sure to specifically invoke the
|
|
* behavior of the spark on all the mobs and objects in the location.
|
|
* turf/location - The place the spark is affectiong
|
|
* 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)
|
|
#ifndef UNIT_TESTS // Bubber Edit: Start - I have no fucking idea what makes us so special to have our sparks explode the unit testing chamber.
|
|
location.hotspot_expose(1000, 100)
|
|
#endif // Bubber Edit: End
|
|
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)
|
|
sparks_touched(src, singed)
|
|
|
|
/*
|
|
* This is called when anything passes through the same tiles as a spark, or when a spark passes through something's tile.
|
|
*
|
|
* This is invoked by the signals sent by every atom when they're crossed or crossing something. It
|
|
* signifies that something has been touched by sparks, and should be affected by possible pyrotechnic affects..
|
|
* datum/source - Can either be the spark itself or an object that just walked into it
|
|
* mob/living/singed - What was touched by the spark
|
|
*/
|
|
/obj/effect/particle_effect/sparks/proc/sparks_touched(datum/source, atom/singed)
|
|
SIGNAL_HANDLER
|
|
|
|
SEND_SIGNAL(singed, COMSIG_ATOM_TOUCHED_SPARKS, src)
|
|
#ifndef UNIT_TESTS // Bubber Edit: I have no fucking idea what makes us so special to have our sparks explode the unit testing chamber.
|
|
if(isobj(singed))
|
|
var/datum/reagents/reagents = singed.reagents // heat up things that contain reagents before we check to see if they burn
|
|
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
|
|
#endif // Bubber edit End.
|
|
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/basic/spark_spread
|
|
effect_type = /obj/effect/particle_effect/sparks
|
|
|
|
/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"
|
|
|
|
/datum/effect_system/basic/lightning_spread
|
|
effect_type = /obj/effect/particle_effect/sparks/electricity
|