Files
kiwistation/code/game/objects/effects/effect_system/effects_other.dm
T
nullbear 2a58dd54a9 Adds explosion helper proc w/ diminishing returns (#20319)
* Adds new explosion proc

Adds a new proc for calling explosions, which uses 'power' instead of a
set of ranges.

Power (1 - 100) is based on minimum explosions size (0, 0, 1) to maximum
explosion size (5, 10, 20)

Formula keeps explosions within a 'sane' range. So while it is possible
to bypass maxcap using this, it will require a LOT of work.

I've done some balance testing, and a halfcap (2,5,10) can be made using
a double bluespace beaker of water and potassium. A (3,7,14) can be made
using black powder, and the largest bluespace grenade explosion can be
made using nitroglycerine, at (6, 12, 24) which is only slightly larger
than maxcap.

You can check out https://www.desmos.com/calculator/pgfz0gqqxf to see
how the explosive power affects range. T is 'units of explosion' and P
is a multiplier. Multipliers for explosive reagents are: water/potass =
1/10, black powder/meth = 1/6, nitroglycerin = 1/2.

* Clarity Changes

Renames dynamic explosion proc for clarity.

Makes dyn_x explosions scaleable with DYN_EX_SCALE variable.

Adds debug dyn_x verbs, and a dyn_x drop_bomb proc to fun admin verbs.

* Adjusts formula

better efficiency and readability.

Adds debug proc for changing explosion scale.

Adds a comment containing common power/explosion sizes.

* oops
2016-09-11 20:46:26 +12:00

119 lines
3.2 KiB
Plaintext

/////////////////////////////////////////////
//////// 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/processing = 1
var/on = 1
/datum/effect_system/trail_follow/set_up(atom/atom)
attach(atom)
oldposition = get_turf(atom)
/datum/effect_system/trail_follow/Destroy()
oldposition = null
return ..()
/datum/effect_system/trail_follow/proc/stop()
processing = 0
on = 0
oldposition = null
/datum/effect_system/trail_follow/steam
effect_type = /obj/effect/particle_effect/steam
/datum/effect_system/trail_follow/steam/start()
if(!on)
on = 1
processing = 1
if(!oldposition)
oldposition = get_turf(holder)
if(processing)
processing = 0
if(number < 3)
var/obj/effect/particle_effect/steam/I = PoolOrNew(/obj/effect/particle_effect/steam, oldposition)
number++
I.setDir(holder.dir)
oldposition = get_turf(holder)
spawn(10)
qdel(I)
number--
spawn(2)
if(on)
processing = 1
start()
/obj/effect/particle_effect/ion_trails
name = "ion trails"
icon_state = "ion_trails"
anchored = 1
/datum/effect_system/trail_follow/ion
effect_type = /obj/effect/particle_effect/ion_trails
/datum/effect_system/trail_follow/ion/start() //Whoever is responsible for this abomination of code should become an hero
if(!on)
on = 1
processing = 1
if(!oldposition)
oldposition = get_turf(holder)
if(processing)
processing = 0
var/turf/T = get_turf(holder)
if(T != oldposition)
if(!T.has_gravity())
var/obj/effect/particle_effect/ion_trails/I = PoolOrNew(effect_type, oldposition)
I.setDir(holder.dir)
flick("ion_fade", I)
I.icon_state = ""
spawn(20)
qdel(I)
oldposition = T
spawn(2)
if(on)
processing = 1
start()
//Reagent-based explosion effect
/datum/effect_system/reagents_explosion
var/amount // TNT equivalent
var/flashing = 0 // does explosion creates flash effect?
var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion
var/explosion_message = 1 //whether we show a message to mobs.
/datum/effect_system/reagents_explosion/set_up(amt, loca, flash = 0, flash_fact = 0, message = 1)
amount = amt
explosion_message = message
if(isturf(loca))
location = loca
else
location = get_turf(loca)
flashing = flash
flashing_factor = flash_fact
/datum/effect_system/reagents_explosion/start()
if(explosion_message)
location.visible_message("<span class='danger'>The solution violently explodes!</span>", \
"<span class='italics'>You hear an explosion!</span>")
if (amount < 1)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.start()
for(var/mob/M in viewers(1, location))
if (prob (50 * amount))
M << "<span class='danger'>The explosion knocks you down.</span>"
M.Weaken(rand(1,5))
return
else
dyn_explosion(location, amount, flashing_factor)