mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 12:08:28 +01:00
Radiation Refactor (#19270)
* Part 1 * WIP * The rest of these * More stuff * Whoops, did that wrong * typo * gweeen * This all works * SHOWER * Rads * awa * rad * Update life.dm * edits * Makes lvl 3 rads give you a warning. You should already know by this point, but this makes it EXTRA clear you're getting fucked * Update vorestation.dme * aaa * propagate * gwah * more fixes * AAA * Update radiation.dm * Update radiation.dm * mobs rads * rads * fix this * Update _reagents.dm * these * Get rid of these * rad * Update config.txt * fixed * Update radiation_effects.dm
This commit is contained in:
@@ -333,7 +333,13 @@
|
||||
radiation += plasma_temperature/2
|
||||
plasma_temperature = 0
|
||||
|
||||
SSradiation.radiate(src, radiation)
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 7,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE,
|
||||
strength = energy * 0.001 //Might need to be increased.
|
||||
)
|
||||
Radiate()
|
||||
|
||||
/obj/effect/fusion_em_field/proc/Radiate()
|
||||
@@ -539,7 +545,13 @@
|
||||
|
||||
//Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output.
|
||||
/obj/effect/fusion_em_field/proc/radiation_scale()
|
||||
SSradiation.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR)
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 5,
|
||||
threshold = RAD_MEDIUM_INSULATION,
|
||||
chance = (URANIUM_IRRADIATION_CHANCE + (plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR)),
|
||||
strength = energy * 0.01 //Might need to be increased.
|
||||
)
|
||||
|
||||
//Somehow fixing the radiation issue managed to break this, but moving it to it's own proc seemed to have fixed it. I don't know.
|
||||
/obj/effect/fusion_em_field/proc/temp_dump()
|
||||
|
||||
@@ -11,6 +11,34 @@
|
||||
var/fuel_colour
|
||||
var/radioactivity = 0
|
||||
var/const/initial_amount = 3000000
|
||||
var/last_event = 0
|
||||
/// Mutex to prevent infinite recursion when propagating radiation pulses
|
||||
var/active = null
|
||||
|
||||
/obj/item/fuel_assembly/process()
|
||||
radiate()
|
||||
|
||||
/obj/item/fuel_assembly/proc/radiate()
|
||||
SIGNAL_HANDLER
|
||||
if(active)
|
||||
return
|
||||
if(world.time <= last_event + 1.5 SECONDS)
|
||||
return
|
||||
active = TRUE
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = (radioactivity * 0.5),
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DEFAULT_RADIATION_CHANCE,
|
||||
strength = radioactivity * 0.5
|
||||
)
|
||||
last_event = world.time
|
||||
active = FALSE
|
||||
|
||||
/obj/item/fuel_assembly/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/fuel_assembly/Initialize(mapload, var/_material, var/_colour)
|
||||
. = ..()
|
||||
@@ -38,17 +66,6 @@
|
||||
add_overlay(list(I, image(icon, "fuel_assembly_bracket")))
|
||||
rod_quantities[fuel_type] = initial_amount
|
||||
|
||||
/obj/item/fuel_assembly/process()
|
||||
if(!radioactivity)
|
||||
return PROCESS_KILL
|
||||
|
||||
if(istype(loc, /turf))
|
||||
SSradiation.radiate(src, max(1,CEILING(radioactivity/30, 1)))
|
||||
|
||||
/obj/item/fuel_assembly/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
// Mapper shorthand.
|
||||
/obj/item/fuel_assembly/deuterium/Initialize(mapload)
|
||||
. = ..(mapload, MAT_DEUTERIUM)
|
||||
|
||||
@@ -116,11 +116,13 @@ GLOBAL_LIST(fusion_reactions)
|
||||
|
||||
var/turf/origin = get_turf(holder)
|
||||
holder.Rupture()
|
||||
qdel(holder)
|
||||
var/radiation_level = 200
|
||||
|
||||
// Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana
|
||||
SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1)
|
||||
radiation_pulse(
|
||||
holder,
|
||||
max_range = 50,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE,
|
||||
strength = 500
|
||||
)
|
||||
|
||||
for(var/mob/living/mob in GLOB.living_mob_list)
|
||||
var/turf/T = get_turf(mob)
|
||||
@@ -135,8 +137,7 @@ GLOBAL_LIST(fusion_reactions)
|
||||
spawn(5)
|
||||
if(I && I.loc)
|
||||
qdel(I)
|
||||
|
||||
sleep(5)
|
||||
qdel(holder)
|
||||
explosion(origin, 1, 2, 5)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -378,7 +378,14 @@ GLOBAL_LIST_EMPTY(gravity_generators)
|
||||
|
||||
|
||||
/obj/machinery/gravity_generator/main/proc/pulse_radiation()
|
||||
SSradiation.radiate(src, 200)
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 7,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DEFAULT_RADIATION_CHANCE * 2,
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = charge_count * 2
|
||||
)
|
||||
|
||||
/obj/machinery/gravity_generator/main/proc/update_gravity(var/on)
|
||||
for(var/area/A in src.areas)
|
||||
|
||||
@@ -385,13 +385,25 @@
|
||||
/obj/machinery/power/port_gen/pacman/super/UseFuel()
|
||||
//produces a tiny amount of radiation when in use
|
||||
if (prob(2*power_output))
|
||||
SSradiation.radiate(src, 4)
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 2,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DEFAULT_RADIATION_CHANCE,
|
||||
strength = power_gen * 0.01
|
||||
)
|
||||
..()
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/super/explode()
|
||||
//a nice burst of radiation
|
||||
var/rads = 50 + (sheets + sheet_left)*1.5
|
||||
SSradiation.radiate(src, (max(20, rads)))
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = (rads/10),
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DEFAULT_RADIATION_CHANCE,
|
||||
strength = rads
|
||||
)
|
||||
|
||||
explosion(src.loc, 3, 3, 5, 3)
|
||||
qdel(src)
|
||||
|
||||
@@ -144,7 +144,14 @@
|
||||
..()
|
||||
add_avail(power_gen)
|
||||
if(panel_open && irradiate)
|
||||
SSradiation.radiate(src, 60)
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 3,
|
||||
threshold = RAD_MEDIUM_INSULATION,
|
||||
chance = DEFAULT_RADIATION_CHANCE,
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = power_gen * 0.01 //1000 power = 10 rads. 10000 power = 100 rads. You can get creative with rad collectors if you want.
|
||||
)
|
||||
|
||||
/obj/machinery/power/rtg/RefreshParts()
|
||||
var/part_level = 0
|
||||
@@ -593,9 +600,15 @@
|
||||
var/turf/T = get_turf(src)
|
||||
qdel(src)
|
||||
if(T)
|
||||
radiation_pulse(
|
||||
T,
|
||||
max_range = 50,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DEFAULT_RADIATION_CHANCE * 3,
|
||||
strength = power_gen * 0.01 ///1MW = 1000 rads. If you blow up a BLACK HOLE ENGINE, you deserve the radiation that comes with it.
|
||||
)
|
||||
empulse(T, 12, 14, 16, 18)
|
||||
explosion(T, 7, 12, 18, 20)
|
||||
SSradiation.radiate(T, 200)
|
||||
new /obj/effect/bhole(T)
|
||||
|
||||
/obj/machinery/power/rtg/antimatter_core/blob_act(obj/structure/blob/B)
|
||||
|
||||
@@ -14,33 +14,36 @@
|
||||
var/active = 0
|
||||
var/locked = 0
|
||||
var/drainratio = 1
|
||||
rad_insulation = RAD_EXTREME_INSULATION //It sucks up the radiation. If you're standing behind it, you're pretty safe.
|
||||
|
||||
/obj/machinery/power/rad_collector/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.rad_collectors += src
|
||||
AddElement(/datum/element/climbable)
|
||||
RegisterSignal(src, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(process_rads))
|
||||
|
||||
/obj/machinery/power/rad_collector/Destroy()
|
||||
GLOB.rad_collectors -= src
|
||||
UnregisterSignal(src, COMSIG_IN_RANGE_OF_IRRADIATION)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/rad_collector/process()
|
||||
/obj/machinery/power/rad_collector/proc/process_rads(datum/source, datum/radiation_pulse_information/pulse_information)
|
||||
SIGNAL_HANDLER
|
||||
//so that we don't zero out the meter if the SM is processed first.
|
||||
last_power = last_power_new
|
||||
last_power_new = 0
|
||||
|
||||
|
||||
if(P && active)
|
||||
var/rads = SSradiation.get_rads_at_turf(get_turf(src))
|
||||
if(rads)
|
||||
receive_pulse(rads * 5) //Maths is hard
|
||||
if(pulse_information)
|
||||
var/amount_of_rads = pulse_information.strength
|
||||
receive_pulse((amount_of_rads))
|
||||
|
||||
if(P)
|
||||
if(P.air_contents.gas[GAS_PHORON] == 0)
|
||||
investigate_log(span_red("out of fuel") + ".","singulo")
|
||||
eject()
|
||||
else
|
||||
P.air_contents.adjust_gas(GAS_PHORON, -0.001*drainratio)
|
||||
if(P.air_contents.gas[GAS_PHORON] == 0)
|
||||
investigate_log(span_red("out of fuel") + ".","singulo")
|
||||
eject()
|
||||
else
|
||||
P.air_contents.adjust_gas(GAS_PHORON, -0.0001*drainratio)
|
||||
return
|
||||
|
||||
|
||||
@@ -126,12 +129,15 @@
|
||||
else
|
||||
update_icons()
|
||||
|
||||
// Continuing here, SM giving us ~170 rads per pulse, a phoron canister full of 30 mols, and * 20 we get:
|
||||
// 102000W per collector...So 10 collectors will give us ~1MW.
|
||||
/obj/machinery/power/rad_collector/proc/receive_pulse(var/pulse_strength)
|
||||
if(P && active)
|
||||
var/power_produced = 0
|
||||
power_produced = P.air_contents.gas[GAS_PHORON]*pulse_strength*20
|
||||
add_avail(power_produced)
|
||||
last_power_new = power_produced
|
||||
if(power_produced)
|
||||
add_avail(power_produced)
|
||||
last_power_new = power_produced
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
@@ -148,13 +148,27 @@
|
||||
/obj/machinery/particle_smasher/process()
|
||||
if(!src.anchored) // Rapidly loses focus.
|
||||
if(energy)
|
||||
SSradiation.radiate(src, round(((src.energy-150)/50)*5,1))
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 7,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = round(((src.energy-150)/50)*5,1),
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = energy * 0.1 //60 rads at max energy.
|
||||
)
|
||||
energy = max(0, energy - 30)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(energy)
|
||||
SSradiation.radiate(src, round(((src.energy-150)/50)*5,1))
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 7,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = round(((src.energy-150)/50)*5,1),
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = energy * 0.1 //60 rads at max energy.
|
||||
)
|
||||
energy = CLAMP(energy - 5, 0, max_energy)
|
||||
|
||||
return
|
||||
@@ -184,7 +198,14 @@
|
||||
if(successful_craft)
|
||||
visible_message(span_warning("\The [src] fizzles."))
|
||||
if(prob(33)) // Why are you blasting it after it's already done!
|
||||
SSradiation.radiate(src, 10 + round(src.energy / 60, 1))
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 7,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE + round(src.energy / 60, 1),
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = energy * 0.1
|
||||
)
|
||||
energy = max(0, energy - 30)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -403,11 +403,16 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity)
|
||||
/obj/singularity/proc/toxmob()
|
||||
var/toxrange = 10
|
||||
var/toxdamage = 4
|
||||
var/radiation = 15
|
||||
if (src.energy>200)
|
||||
toxdamage = round(((src.energy-150)/50)*4,1)
|
||||
radiation = round(((src.energy-150)/50)*5,1)
|
||||
SSradiation.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 7,
|
||||
threshold = RAD_EXTREME_INSULATION - 0.1,
|
||||
chance = URANIUM_IRRADIATION_CHANCE + round(energy / 60, 1),
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = 250
|
||||
)
|
||||
for(var/mob/living/M in view(toxrange, src.loc))
|
||||
if(SEND_SIGNAL(M, COMSIG_CHECK_FOR_GODMODE) & COMSIG_GODMODE_CANCEL)
|
||||
return 0 // Cancelled by a component
|
||||
@@ -450,13 +455,28 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity)
|
||||
to_chat(M, span_danger("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat."))
|
||||
to_chat(M, span_danger("You don't even have a moment to react as you are reduced to ashes by the intense radiation."))
|
||||
M.dust()
|
||||
SSradiation.radiate(src, rand(energy))
|
||||
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 10,
|
||||
threshold = RAD_EXTREME_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE * 8,
|
||||
strength = 1000
|
||||
)
|
||||
return
|
||||
|
||||
/obj/singularity/proc/pulse()
|
||||
for(var/obj/machinery/power/rad_collector/R in GLOB.rad_collectors)
|
||||
if (get_dist(R, src) <= 15) //Better than using orange() every process.
|
||||
R.receive_pulse(energy)
|
||||
//Yes, this means rad collectors can double dip on the singulo, but you could always use the safer SM or tesla, so it gets a small buff.
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 15,
|
||||
threshold = RAD_EXTREME_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE * 8,
|
||||
strength = energy * 0.25
|
||||
)
|
||||
|
||||
/obj/singularity/proc/on_capture()
|
||||
chained = 1
|
||||
|
||||
@@ -170,12 +170,27 @@
|
||||
var/turf/TS = get_turf(src) // The turf supermatter is on. SM being in a locker, exosuit, or other container shouldn't block it's effects that way.
|
||||
if(!istype(TS))
|
||||
return
|
||||
radiation_pulse(
|
||||
TS,
|
||||
max_range = 255,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DETONATION_RADS,
|
||||
strength = DETONATION_RADS * 5
|
||||
)
|
||||
|
||||
var/list/affected_z = GetConnectedZlevels(TS.z)
|
||||
|
||||
// Effect 1: Radiation, weakening to all mobs on Z level
|
||||
for(var/z in affected_z)
|
||||
SSradiation.z_radiate(locate(1, 1, z), DETONATION_RADS, 1)
|
||||
for(var/z_to_affect in affected_z)
|
||||
var/turf/turf_to_hit = locate(TS.x, TS.y, z_to_affect)
|
||||
if(turf_to_hit)
|
||||
radiation_pulse(
|
||||
turf_to_hit,
|
||||
max_range = 255,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = DETONATION_RADS,
|
||||
strength = DETONATION_RADS * 5
|
||||
)
|
||||
|
||||
for(var/mob/living/mob in GLOB.living_mob_list)
|
||||
var/turf/TM = get_turf(mob)
|
||||
@@ -398,7 +413,16 @@
|
||||
if(!istype(l.glasses, /obj/item/clothing/glasses/meson) || l.is_incorporeal()) // VOREStation Edit - Only mesons can protect you! OR if they're not in the same plane of existence
|
||||
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
|
||||
|
||||
SSradiation.radiate(src, max(power * 1.5, 50) ) //Better close those shutters!
|
||||
if(power)
|
||||
// At a power mult of 0.025 for range, this means a 1000power SM (about normal) will reach 25 tiles and be putting off rad pulses of 500. With 0 protection, you have a 10% chance of getting hit.
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = CLAMP(max(round(power * 0.025), 3), 3, 50),
|
||||
threshold = CLAMP(RAD_HEAVY_INSULATION - (power * 0.00025), 0.1, 1),
|
||||
chance = round(power * 0.01),
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = round(power * 0.5)
|
||||
)
|
||||
|
||||
power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation
|
||||
|
||||
@@ -509,8 +533,13 @@
|
||||
span_warning("The unearthly ringing subsides and you notice you have new radiation burns."), 2)
|
||||
else
|
||||
l.show_message(span_warning("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns."), 2)
|
||||
var/rads = 500
|
||||
SSradiation.radiate(src, rads)
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 5,
|
||||
threshold = RAD_HEAVY_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE,
|
||||
strength = 200
|
||||
)
|
||||
|
||||
/proc/supermatter_pull(var/atom/target, var/pull_range = 255, var/pull_power = STAGE_FIVE)
|
||||
for(var/atom/A in range(pull_range, target))
|
||||
@@ -547,18 +576,31 @@
|
||||
desc = "The shattered remains of a supermatter shard plinth. It doesn't look safe to be around."
|
||||
icon = 'icons/obj/supermatter.dmi'
|
||||
icon_state = "darkmatter_broken"
|
||||
var/last_event = 0
|
||||
/// Mutex to prevent infinite recursion when propagating radiation pulses
|
||||
var/active = null
|
||||
|
||||
/obj/item/broken_sm/Initialize(mapload)
|
||||
. = ..()
|
||||
message_admins("Broken SM shard created at ([x],[y],[z] - <A href='byond://?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/broken_sm/process()
|
||||
SSradiation.radiate(src, 50)
|
||||
|
||||
/obj/item/broken_sm/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
/obj/item/broken_sm/proc/radiate()
|
||||
SIGNAL_HANDLER
|
||||
if(active)
|
||||
return
|
||||
if(world.time <= last_event + 1.5 SECONDS)
|
||||
return
|
||||
active = TRUE
|
||||
radiation_pulse(
|
||||
src,
|
||||
max_range = 5,
|
||||
threshold = RAD_MEDIUM_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE,
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
strength = 25
|
||||
)
|
||||
last_event = world.time
|
||||
active = FALSE
|
||||
|
||||
#undef POWER_FACTOR
|
||||
#undef DECAY_FACTOR
|
||||
|
||||
Reference in New Issue
Block a user