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
This commit is contained in:
nullbear
2016-09-11 20:46:26 +12:00
committed by oranges
parent c3c2a90e41
commit 2a58dd54a9
4 changed files with 68 additions and 20 deletions
@@ -105,7 +105,7 @@
if(explosion_message)
location.visible_message("<span class='danger'>The solution violently explodes!</span>", \
"<span class='italics'>You hear an explosion!</span>")
if (amount <= 2)
if (amount < 1)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.start()
@@ -116,22 +116,4 @@
M.Weaken(rand(1,5))
return
else
var/devastation = -1
var/heavy = -1
var/light = -1
var/flash = -1
// Clamp all values to MAX_EXPLOSION_RANGE
if (round(amount/12) > 0)
devastation = min (MAX_EX_DEVESTATION_RANGE, devastation + round(amount/12))
if (round(amount/6) > 0)
heavy = min (MAX_EX_HEAVY_RANGE, heavy + round(amount/6))
if (round(amount/3) > 0)
light = min (MAX_EX_LIGHT_RANGE, light + round(amount/3))
if (flashing && flashing_factor)
flash += (round(amount/4) * flashing_factor)
explosion(location, devastation, heavy, light, flash)
dyn_explosion(location, amount, flashing_factor)