HFR more explosion difference between the various fuel mixes (#61242)

High effort HFR mixes should not have the same meltdown of the low effort ones, encourages the players to create high tiers mixes
This commit is contained in:
Ghilker
2021-09-06 14:09:44 -07:00
committed by GitHub
parent aeb4628745
commit b582c48dae
4 changed files with 128 additions and 8 deletions
@@ -50,3 +50,14 @@
#define HYPERTORUS_SUBCRITICAL_MOLES 2000
#define HYPERTORUS_HYPERCRITICAL_MOLES 10000
#define HYPERTORUS_MAX_MOLE_DAMAGE 10
#define HYPERTORUS_FLAG_BASE_EXPLOSION (1<<0)
#define HYPERTORUS_FLAG_MEDIUM_EXPLOSION (1<<1)
#define HYPERTORUS_FLAG_DEVASTATING_EXPLOSION (1<<2)
#define HYPERTORUS_FLAG_RADIATION_PULSE (1<<3)
#define HYPERTORUS_FLAG_EMP (1<<4)
#define HYPERTORUS_FLAG_MINIMUM_SPREAD (1<<5)
#define HYPERTORUS_FLAG_MEDIUM_SPREAD (1<<6)
#define HYPERTORUS_FLAG_BIG_SPREAD (1<<7)
#define HYPERTORUS_FLAG_MASSIVE_SPREAD (1<<8)
#define HYPERTORUS_FLAG_CRITICAL_MELTDOWN (1<<9)
@@ -34,6 +34,8 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
var/primary_products = list()
///Gases that gets produced in the moderator gasmix or directly ejected (must be 6 gases), the order indicate at what power level the gases are going to be made (from power level 1 to 6)
var/secondary_products = list()
///Flags to decide what behaviour the meltdown will have depending on the fuel mix used
var/meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION
/datum/hfr_fuel/hydrogen_tritium_fuel
id = "h2_t2_fuel"
@@ -47,6 +49,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/hydrogen, /datum/gas/tritium)
primary_products = list(/datum/gas/helium)
secondary_products = list(/datum/gas/helium, /datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/bz, /datum/gas/hypernoblium)
meltdown_flags = HYPERTORUS_FLAG_MEDIUM_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MEDIUM_SPREAD
/datum/hfr_fuel/hydrogen_oxy_fuel
id = "h2_o2_fuel"
@@ -60,6 +63,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/hydrogen, /datum/gas/oxygen)
primary_products = list(/datum/gas/helium, /datum/gas/nitrogen)
secondary_products = list(/datum/gas/helium, /datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/bz, /datum/gas/hypernoblium)
meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MEDIUM_SPREAD
/datum/hfr_fuel/tritium_oxy_fuel
id = "t2_o2_fuel"
@@ -73,6 +77,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/tritium, /datum/gas/oxygen)
primary_products = list(/datum/gas/helium, /datum/gas/pluoxium)
secondary_products = list(/datum/gas/helium, /datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/bz, /datum/gas/hypernoblium)
meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_MEDIUM_SPREAD
/datum/hfr_fuel/plasma_oxy_fuel
id = "plasma_o2_fuel"
@@ -86,6 +91,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/plasma, /datum/gas/oxygen)
primary_products = list(/datum/gas/carbon_dioxide, /datum/gas/water_vapor)
secondary_products = list(/datum/gas/carbon_dioxide, /datum/gas/water_vapor, /datum/gas/freon, /datum/gas/nitrous_oxide, /datum/gas/pluoxium, /datum/gas/halon)
meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION | HYPERTORUS_FLAG_MINIMUM_SPREAD
/datum/hfr_fuel/hypernob_hydrogen_fuel
id = "hypernob_hydrogen_fuel"
@@ -99,6 +105,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/hypernoblium, /datum/gas/hydrogen)
primary_products = list(/datum/gas/antinoblium)
secondary_products = list(/datum/gas/antinoblium, /datum/gas/helium, /datum/gas/proto_nitrate, /datum/gas/zauker, /datum/gas/healium, /datum/gas/miasma)
meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_BIG_SPREAD
/datum/hfr_fuel/hypernob_trit_fuel
id = "hypernob_trit_fuel"
@@ -112,6 +119,7 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/hypernoblium, /datum/gas/tritium)
primary_products = list(/datum/gas/antinoblium)
secondary_products = list(/datum/gas/antinoblium, /datum/gas/helium, /datum/gas/proto_nitrate, /datum/gas/zauker, /datum/gas/healium, /datum/gas/miasma)
meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_BIG_SPREAD
/datum/hfr_fuel/hypernob_antinob_fuel
id = "hypernob_antinob_fuel"
@@ -125,3 +133,4 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list())
requirements = list(/datum/gas/hypernoblium, /datum/gas/antinoblium)
primary_products = list(/datum/gas/helium)
secondary_products = list(/datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/proto_nitrate, /datum/gas/stimulum, /datum/gas/miasma)
meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MASSIVE_SPREAD | HYPERTORUS_FLAG_CRITICAL_MELTDOWN
@@ -294,6 +294,10 @@
return
final_countdown = TRUE
var/critical = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_CRITICAL_MELTDOWN
if(critical)
priority_announce("WARNING - The explosion will likely cover a big part of the station and the coming EMP will wipe out most of the electronics. \
Get as far away as possible from the reactor or find a way to shut it down.", "Alert")
var/speaking = "[emergency_alert] The Hypertorus fusion reactor has reached critical integrity failure. Emergency magnetic dampeners online."
radio.talk_into(src, speaking, common_channel, language = get_selected_language())
for(var/i in HYPERTORUS_COUNTDOWN_TIME to 0 step -10)
@@ -305,6 +309,8 @@
sleep(10)
continue
else if(i > 50)
if(i == 10 SECONDS && critical)
sound_to_playing_players('sound/machines/hypertorus/HFR_critical_explosion.ogg')
speaking = "[DisplayTimeText(i, TRUE)] remain before total integrity failure."
else
speaking = "[i*0.1]..."
@@ -318,10 +324,76 @@
* Create the explosion + the gas emission before deleting the machine core.
*/
/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/meltdown()
explosion(src, light_impact_range = power_level * 5, flash_range = power_level * 6, adminlog = TRUE, ignorecap = TRUE)
radiation_pulse(loc, power_level * 7000, (1 / (power_level + 5)), TRUE)
empulse(loc, power_level * 5, power_level * 7, TRUE)
var/list/around_turfs = circlerangeturfs(src, power_level * 5)
var/flash_explosion = 0
var/light_impact_explosion = 0
var/heavy_impact_explosion = 0
var/devastating_explosion = 0
var/em_pulse = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_EMP
var/rad_pulse = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_RADIATION_PULSE
var/emp_light_size = 0
var/emp_heavy_size = 0
var/rad_pulse_size = 0
var/rad_pulse_strength = 0
var/gas_spread = 0
var/gas_pockets = 0
var/critical = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_CRITICAL_MELTDOWN
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_BASE_EXPLOSION)
flash_explosion = power_level * 3
light_impact_explosion = power_level * 2
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MEDIUM_EXPLOSION)
flash_explosion = power_level * 6
light_impact_explosion = power_level * 5
heavy_impact_explosion = power_level * 0.5
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_DEVASTATING_EXPLOSION)
flash_explosion = power_level * 8
light_impact_explosion = power_level * 7
heavy_impact_explosion = power_level * 2
devastating_explosion = power_level
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MINIMUM_SPREAD)
if(em_pulse)
emp_light_size = power_level * 3
emp_heavy_size = power_level * 1
if(rad_pulse)
rad_pulse_size = (1 / (power_level + 1))
rad_pulse_strength = power_level * 3000
gas_pockets = 5
gas_spread = power_level * 2
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MEDIUM_SPREAD)
if(em_pulse)
emp_light_size = power_level * 5
emp_heavy_size = power_level * 3
if(rad_pulse)
rad_pulse_size = (1 / (power_level + 3))
rad_pulse_strength = power_level * 5000
gas_pockets = 7
gas_spread = power_level * 4
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_BIG_SPREAD)
if(em_pulse)
emp_light_size = power_level * 7
emp_heavy_size = power_level * 5
if(rad_pulse)
rad_pulse_size = (1 / (power_level + 5))
rad_pulse_strength = power_level * 7000
gas_pockets = 10
gas_spread = power_level * 6
if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MASSIVE_SPREAD)
if(em_pulse)
emp_light_size = power_level * 9
emp_heavy_size = power_level * 7
if(rad_pulse)
rad_pulse_size = (1 / (power_level + 7))
rad_pulse_strength = power_level * 9000
gas_pockets = 15
gas_spread = power_level * 8
var/list/around_turfs = circlerangeturfs(src, gas_spread)
for(var/turf/turf as anything in around_turfs)
if(isclosedturf(turf) || isspaceturf(turf))
around_turfs -= turf
@@ -330,8 +402,8 @@
if(internal_fusion.total_moles() > 0)
remove_fusion = internal_fusion.remove_ratio(0.2)
var/datum/gas_mixture/remove
for(var/i in 1 to 10)
remove = remove_fusion.remove_ratio(0.1)
for(var/i in 1 to gas_pockets)
remove = remove_fusion.remove_ratio(1/gas_pockets)
var/turf/local = pick(around_turfs)
local.assume_air(remove)
loc.assume_air(internal_fusion)
@@ -339,11 +411,39 @@
if(moderator_internal.total_moles() > 0)
remove_moderator = moderator_internal.remove_ratio(0.2)
var/datum/gas_mixture/remove
for(var/i in 1 to 10)
remove = remove_moderator.remove_ratio(0.1)
for(var/i in 1 to gas_pockets)
remove = remove_moderator.remove_ratio(1/gas_pockets)
var/turf/local = pick(around_turfs)
local.assume_air(remove)
loc.assume_air(moderator_internal)
//Max explosion ranges: devastation = 12, heavy = 24, light = 42
explosion(
origin = src,
devastation_range = critical ? devastating_explosion * 2 : devastating_explosion,
heavy_impact_range = critical ? heavy_impact_explosion * 2 : heavy_impact_explosion,
light_impact_range = light_impact_explosion,
flash_range = flash_explosion,
adminlog = TRUE,
ignorecap = TRUE
)
if(rad_pulse)
radiation_pulse(
source = loc,
intensity = rad_pulse_strength,
range_modifier = rad_pulse_size,
log = TRUE
)
if(em_pulse)
empulse(
epicenter = loc,
heavy_range = critical ? emp_heavy_size * 2 : emp_heavy_size,
light_range = critical ? emp_light_size * 2 : emp_heavy_size,
log = TRUE
)
qdel(src)
/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_cracked_parts()
Binary file not shown.