diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index e18125ab284..21155f2d2dd 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -41,4 +41,5 @@ var/MAX_EX_HEAVY_RANGE = 7 var/MAX_EX_LIGHT_RANGE = 14 var/MAX_EX_FLASH_RANGE = 14 var/MAX_EX_FLAME_RANGE = 14 +var/DYN_EX_SCALE = 0.5 diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm index fe303b4782c..585dfedf0ab 100644 --- a/code/game/objects/effects/effect_system/effects_other.dm +++ b/code/game/objects/effects/effect_system/effects_other.dm @@ -105,7 +105,7 @@ if(explosion_message) location.visible_message("The solution violently explodes!", \ "You hear an explosion!") - 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) \ No newline at end of file diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 248a17a77f0..2802cce4314 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -246,4 +246,18 @@ T.color = null T.maptext = "" +proc/dyn_explosion(turf/epicenter, power, flash_range, adminlog = 1, ignorecap = 1, flame_range = 0 ,silent = 0, smoke = 1) + if(!power) + return + var/range = 0 + range = round((2 * power)**DYN_EX_SCALE) + explosion(epicenter, round(range * 0.25), round(range * 0.5), round(range), flash_range*range, adminlog, ignorecap, flame_range*range, silent, smoke) +// Using default dyn_ex scale: +// 100 explosion power is a (5, 10, 20) explosion. +// 75 explosion power is a (4, 8, 17) explosion. +// 50 explosion power is a (3, 7, 14) explosion. +// 25 explosion power is a (2, 5, 10) explosion. +// 10 explosion power is a (1, 3, 6) explosion. +// 5 explosion power is a (0, 1, 3) explosion. +// 1 explosion power is a (0, 0, 1) explosion. \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index c67f8d1c3b2..43cd0a61fdc 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -82,6 +82,8 @@ var/list/admin_verbs_fun = list( /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, + /client/proc/set_dynex_scale, + /client/proc/drop_dynex_bomb, /client/proc/cinematic, /client/proc/one_click_antag, /client/proc/send_space_ninja, @@ -142,6 +144,9 @@ var/list/admin_verbs_debug = list( /client/proc/check_bomb_impacts, /proc/machine_upgrade, /client/proc/populate_world, + /client/proc/get_dynex_power, //*debug verbs for dynex explosions. + /client/proc/get_dynex_range, //*debug verbs for dynex explosions. + /client/proc/set_dynex_scale, /client/proc/cmd_display_del_log, /client/proc/reset_latejoin_spawns, /client/proc/create_outfits, @@ -196,6 +201,10 @@ var/list/admin_verbs_hideable = list( /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, + /client/proc/drop_dynex_bomb, + /client/proc/get_dynex_range, + /client/proc/get_dynex_power, + /client/proc/set_dynex_scale, /client/proc/cinematic, /client/proc/send_space_ninja, /client/proc/cmd_admin_add_freeform_ai_law, @@ -514,6 +523,48 @@ var/list/admin_verbs_hideable = list( message_admins("[ckey] creating an admin explosion at [epicenter.loc].") feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/drop_dynex_bomb() + set category = "Special Verbs" + set name = "Drop DynEx Bomb" + set desc = "Cause an explosion of varying strength at your location." + + var/ex_power = input("Explosive Power:") as null|num + var/turf/epicenter = mob.loc + if(ex_power && epicenter) + dyn_explosion(epicenter, ex_power) + message_admins("[ckey] creating an admin explosion at [epicenter.loc].") + feedback_add_details("admin_verb","DDXB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/get_dynex_range() + set category = "Debug" + set name = "Get DynEx Range" + set desc = "Get the estimated range of a bomb, using explosive power." + + var/ex_power = input("Explosive Power:") as null|num + var/range = round((2 * ex_power)**DYN_EX_SCALE) + usr << "Estimated Explosive Range: (Devestation: [round(range*0.25)], Heavy: [round(range*0.5)], Light: [round(range)])" + +/client/proc/get_dynex_power() + set category = "Debug" + set name = "Get DynEx Power" + set desc = "Get the estimated required power of a bomb, to reach a specific range." + + var/ex_range = input("Light Explosion Range:") as null|num + var/power = (0.5 * ex_range)**(1/DYN_EX_SCALE) + usr << "Estimated Explosive Power: [power]" + +/client/proc/set_dynex_scale() + set category = "Debug" + set name = "Set DynEx Scale" + set desc = "Set the scale multiplier of dynex explosions. The default is 0.5." + + var/ex_scale = input("New DynEx Scale:") as null|num + if(!ex_scale) + return + DYN_EX_SCALE = ex_scale + log_admin("[key_name(usr)] has modified Dynamic Explosion Scale: [ex_scale]") + message_admins("[key_name_admin(usr)] has modified Dynamic Explosion Scale: [ex_scale]") + /client/proc/give_spell(mob/T in mob_list) set category = "Fun" set name = "Give Spell"