diff --git a/hyperstation/code/modules/power/reactor/rbmk.dm b/hyperstation/code/modules/power/reactor/rbmk.dm
index 441e5ca3..713f37b6 100644
--- a/hyperstation/code/modules/power/reactor/rbmk.dm
+++ b/hyperstation/code/modules/power/reactor/rbmk.dm
@@ -8,13 +8,15 @@
#define RBMK_TEMPERATURE_CRITICAL 800 //At this point the entire ship/station is alerted to a meltdown. This may need altering
#define RBMK_TEMPERATURE_MELTDOWN 900
+#define RBMK_NO_COOLANT_TOLERANCE 5 //How many process()ing ticks the reactor can sustain without coolant before slowly taking damage
+
#define RBMK_PRESSURE_OPERATING 1000 //PSI
#define RBMK_PRESSURE_CRITICAL 1469.59 //PSI
#define RBMK_MAX_CRITICALITY 3 //No more criticality than N for now.
//#define RBMK_POWER_FLAVOURISER 1000 //To turn those KWs into something usable
-#define RBMK_POWER_FLAVOURISER 5000 //Five times stronger. Previous numbers were baby numbers.
+#define RBMK_POWER_FLAVOURISER 8000 //To turn those KWs into something usable
//Math. Lame.
#define KPA_TO_PSI(A) (A/6.895)
@@ -108,6 +110,7 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
var/last_coolant_temperature = 0
var/last_output_temperature = 0
var/last_heat_delta = 0 //For administrative cheating only. Knowing the delta lets you know EXACTLY what to set K at.
+ var/no_coolant_ticks = 0 //How many times in succession did we not have enough coolant? Decays twice as fast as it accumulates.
var/last_user = null
var/current_desired_k = null
var/datum/powernet/powernet = null
@@ -168,6 +171,9 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
to_chat(user, "[src]'s reactor vessel is cracked and worn, you need to repair the cracks with a welder before you can repair the seals.")
return FALSE
if(do_after(user, 5 SECONDS, target=src))
+ if(vessel_integrity >= 350) //They might've stacked doafters
+ to_chat(user, "[src]'s seals are already in-tact, repairing them further would require a new set of seals.")
+ return FALSE
playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6)
user.visible_message("[user] applies sealant to some of [src]'s worn out seals.", "You apply sealant to some of [src]'s worn out seals.")
vessel_integrity += 10
@@ -183,6 +189,9 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
to_chat(user, "[src] is free from cracks. Further repairs must be carried out with flexi-seal sealant.")
return FALSE
if(I.use_tool(src, user, 0, volume=40))
+ if(vessel_integrity > 0.5 * initial(vessel_integrity))
+ to_chat(user, "[src] is free from cracks. Further repairs must be carried out with flexi-seal sealant.")
+ return FALSE
vessel_integrity += 20
to_chat(user, "You weld together some of [src]'s cracks. This'll do for now.")
return TRUE
@@ -190,16 +199,14 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
//Admin procs to mess with the reaction environment.
/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/lazy_startup()
- for(var/I=0;I<5;I++){
+ for(var/I=0;I<5;I++)
fuel_rods += new /obj/item/twohanded/required/fuel_rod(src)
- }
message_admins("Reactor started up by admins in [ADMIN_VERBOSEJMP(src)]")
start_up()
/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/deplete()
- for(var/obj/item/twohanded/required/fuel_rod/FR in fuel_rods){
+ for(var/obj/item/twohanded/required/fuel_rod/FR in fuel_rods)
FR.depletion = 100
- }
/obj/machinery/atmospherics/components/trinary/nuclear_reactor/Initialize()
. = ..()
@@ -241,13 +248,16 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
coolant_output.merge(coolant_input) //And now, shove the input into the output.
coolant_input.gases = list() //Clear out anything left in the input gate.
color = null
+ no_coolant_ticks = max(0, no_coolant_ticks-2) //Needs half as much time to recover the ticks than to acquire them
else
if(has_fuel())
- temperature += temperature / 500 //This isn't really harmful early game, but when your reactor is up to full power, this can get out of hand quite quickly.
- vessel_integrity -= temperature / 200 //Think fast loser.
- take_damage(10) //Just for the sound effect, to let you know you've fucked up.
- color = "[COLOR_RED]"
- investigate_log("Reactor taking damage from the lack of coolant", INVESTIGATE_SINGULO)
+ no_coolant_ticks++
+ if(no_coolant_ticks > RBMK_NO_COOLANT_TOLERANCE)
+ temperature += temperature / 500 //This isn't really harmful early game, but when your reactor is up to full power, this can get out of hand quite quickly.
+ vessel_integrity -= temperature / 200 //Think fast chucklenuts!
+ take_damage(10) //Just for the sound effect, to let you know you've fucked up.
+ color = "[COLOR_RED]"
+ investigate_log("Reactor taking damage from the lack of coolant", INVESTIGATE_SINGULO)
//Now, heat up the output and set our pressure.
coolant_output.temperature = CELSIUS_TO_KELVIN(temperature) //Heat the coolant output gas that we just had pass through us.
last_output_temperature = KELVIN_TO_CELSIUS(coolant_output.return_temperature())
@@ -270,7 +280,7 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
if(power >= 20)
coolant_output.gases[/datum/gas/nitryl] += total_fuel_moles/50 //Shove out nitryl into the air when it's fuelled. You need to filter this off, or you're gonna have a bad time.
var/obj/structure/cable/C = T.get_cable_node()
- if(!C || !C.powernet)
+ if(!C?.powernet)
//message_admins("No cable or cable has no powernet!")
return
else
@@ -394,8 +404,9 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
investigate_log("Reactor reaching critical temperature at [temperature] C with desired criticality at [desired_k]", INVESTIGATE_SINGULO)
message_admins("Reactor reaching critical temperature at [ADMIN_VERBOSEJMP(src)]")
if(temperature >= RBMK_TEMPERATURE_MELTDOWN)
- vessel_integrity -= (temperature / 100)
- if(vessel_integrity <= temperature/100) //It wouldn't be able to tank another hit.
+ var/temp_damage = min(temperature/100, initial(vessel_integrity)/40) //40 seconds to meltdown from full integrity, worst-case. Bit less than blowout since it's harder to spike heat that much.
+ vessel_integrity -= temp_damage
+ if(vessel_integrity <= temp_damage)
investigate_log("Reactor melted down at [temperature] C with desired criticality at [desired_k]", INVESTIGATE_SINGULO)
meltdown() //Oops! All meltdown
return
@@ -415,8 +426,9 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
playsound(loc, 'sound/machines/clockcult/steam_whoosh.ogg', 100, TRUE)
var/turf/T = get_turf(src)
T.atmos_spawn_air("water_vapor=[pressure/100];TEMP=[CELSIUS_TO_KELVIN(temperature)]")
- vessel_integrity -= (pressure/100)
- if(vessel_integrity <= pressure/100) //It wouldn't be able to tank another hit.
+ var/pressure_damage = min(pressure/100, initial(vessel_integrity)/45) //You get 45 seconds (if you had full integrity), worst-case. But hey, at least it can't be instantly nuked with a pipe-fire.. though it's still very difficult to save.
+ vessel_integrity -= pressure_damage
+ if(vessel_integrity <= pressure_damage) //It wouldn't
investigate_log("Reactor blowout at [pressure] PSI with desired criticality at [desired_k]", INVESTIGATE_SINGULO)
blowout()
return
@@ -455,7 +467,7 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
stop_relay(CHANNEL_REACTOR_ALERT)
NSW.fire() //This will take out engineering for a decent amount of time as they have to clean up the sludge.
for(var/obj/machinery/power/apc/apc in GLOB.apcs_list)
- if(prob(70))
+ if((apc.z == z) && prob(70))
apc.overload_lighting()
var/datum/gas_mixture/coolant_input = COOLANT_INPUT_GATE
var/datum/gas_mixture/moderator_input = MODERATOR_INPUT_GATE
@@ -555,6 +567,9 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
/obj/machinery/computer/reactor
name = "Reactor control console"
desc = "Scream"
+ light_color = "#55BA55"
+ light_power = 1
+ light_range = 3
icon = 'hyperstation/icons/obj/rbmk_computer.dmi'
icon_state = "oldcomp"
icon_screen = "library"
@@ -708,7 +723,8 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
var/newPressure = input(user, "Set new output pressure (kPa)", "Remote pump control", null) as num
if(!newPressure)
return
- signal(on, newPressure) //Number sanitization is handled on the actual pumps themselves.
+ newPressure = clamp(newPressure, 0, MAX_OUTPUT_PRESSURE) //Number sanitization is not handled in the pumps themselves, only during their ui_act which this doesn't use.
+ signal(on, newPressure)
/obj/machinery/computer/reactor/attack_robot(mob/user)
. = ..()