mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-28 11:02:08 +00:00
348 lines
11 KiB
Plaintext
348 lines
11 KiB
Plaintext
#define SETUP_OK 1 // All good
|
|
#define SETUP_WARNING 2 // Something that shouldn't happen happened, but it's not critical so we will continue
|
|
#define SETUP_ERROR 3 // Something bad happened, and it's important so we won't continue setup.
|
|
#define SETUP_DELAYED 4 // Wait for other things first.
|
|
|
|
#define EMITTERSHOTS *14.4
|
|
#define ENERGY_CARBONDIOXIDE 10 EMITTERSHOTS
|
|
#define ENERGY_HYDROGEN 17 EMITTERSHOTS
|
|
#define ENERGY_NITROGEN 8 EMITTERSHOTS
|
|
#define ENERGY_NITROUSOXIDE 7 EMITTERSHOTS
|
|
#define ENERGY_OXYGEN 7 EMITTERSHOTS
|
|
#define ENERGY_PHORON 21 EMITTERSHOTS // Phoron can take more but this is enough to max out both SMESs anyway
|
|
|
|
#define OPT_CARBONDIOXIDE "Carbon Dioxide (CO2)"
|
|
#define OPT_HYDROGEN "Hydrogen (H2)"
|
|
#define OPT_NITROGEN "Nitrogen (N2)"
|
|
#define OPT_NITROUSOXIDE "Nitrous Oxide (N2O) \[DANGEROUS]"
|
|
#define OPT_OXYGEN "Oxygen (O2) \[DANGEROUS]"
|
|
#define OPT_PHORON "Phoron"
|
|
#define OPT_ABORT "Abort"
|
|
|
|
/*
|
|
How to use (map) the Supermatter Auto-Setup feature:
|
|
1. Have (map) a SM engine like normal.
|
|
2. On top of every coolant injector (connector) ports add a `coolant_canister` marker.
|
|
3. For every pump that needs to be maxed / turned on add a `pump_max` marker.
|
|
4. For every connector port that needs an empty canister add a `empty_canister` marker.
|
|
5. For every filter that needs to be set up for the coolant add a `filter` marker.
|
|
Note that the filters must be set up to filter the coolant back into the core loop by default.
|
|
Otherwise the auto setup will mess up and you'll end up without the correct coolant gas!
|
|
6. For every freezer that needs to be on, add a `freezer` marker.
|
|
7. For every SMES that needs to be online and maxed, add a `smes` marker.
|
|
8. On top of the SM core map a `core` marker.
|
|
9. Make sure to test that it actually works and doesn't blow up.
|
|
*/
|
|
|
|
/datum/admins/proc/setup_supermatter()
|
|
set category = "Debug"
|
|
set name = "Setup Supermatter"
|
|
set desc = "Allows you to start the Supermatter engine."
|
|
|
|
if(!check_rights(R_DEBUG|R_DEV))
|
|
return
|
|
|
|
var/list/opts = list(
|
|
OPT_CARBONDIOXIDE,
|
|
OPT_HYDROGEN,
|
|
OPT_NITROGEN,
|
|
OPT_NITROUSOXIDE,
|
|
OPT_OXYGEN,
|
|
OPT_PHORON,
|
|
OPT_ABORT
|
|
)
|
|
var/response = input(usr, "Are you sure? This will start up the engine with selected gas as coolant.", "Engine setup") as null|anything in opts
|
|
if(!response || response == OPT_ABORT)
|
|
return
|
|
|
|
var/errors = 0
|
|
var/warnings = 0
|
|
var/success = 0
|
|
|
|
log_and_message_admins("## SUPERMATTER SETUP - Setup initiated by [usr] using coolant type [response].")
|
|
|
|
// CONFIGURATION PHASE
|
|
// Coolant canisters, set types according to response.
|
|
for(var/obj/effect/landmark/engine_setup/coolant_canister/C in landmarks_list)
|
|
switch(response)
|
|
if(OPT_CARBONDIOXIDE)
|
|
C.canister_type = /obj/machinery/portable_atmospherics/canister/carbon_dioxide
|
|
continue
|
|
if(OPT_HYDROGEN)
|
|
C.canister_type = /obj/machinery/portable_atmospherics/canister/phoron
|
|
continue
|
|
if(OPT_NITROGEN)
|
|
C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen
|
|
continue
|
|
if(OPT_NITROUSOXIDE)
|
|
C.canister_type = /obj/machinery/portable_atmospherics/canister/sleeping_agent
|
|
continue
|
|
if(OPT_OXYGEN)
|
|
C.canister_type = /obj/machinery/portable_atmospherics/canister/oxygen
|
|
continue
|
|
if(OPT_PHORON)
|
|
C.canister_type = /obj/machinery/portable_atmospherics/canister/hydrogen
|
|
continue
|
|
else
|
|
to_chat(usr, SPAN_DANGER("Did not find canister type for '[response]'! Aborting."))
|
|
return
|
|
|
|
var/core_count = 0
|
|
for(var/obj/effect/landmark/engine_setup/core/C in landmarks_list)
|
|
core_count++
|
|
switch(response)
|
|
if(OPT_CARBONDIOXIDE)
|
|
C.energy_setting = ENERGY_CARBONDIOXIDE
|
|
continue
|
|
if(OPT_HYDROGEN)
|
|
C.energy_setting = ENERGY_HYDROGEN
|
|
continue
|
|
if(OPT_NITROGEN)
|
|
C.energy_setting = ENERGY_NITROGEN
|
|
continue
|
|
if(OPT_NITROUSOXIDE)
|
|
C.energy_setting = ENERGY_NITROUSOXIDE
|
|
continue
|
|
if(OPT_OXYGEN)
|
|
C.energy_setting = ENERGY_OXYGEN
|
|
continue
|
|
if(OPT_PHORON)
|
|
C.energy_setting = ENERGY_PHORON
|
|
continue
|
|
else
|
|
to_chat(usr, SPAN_DANGER("Did not find energy setting for '[response]'! Aborting."))
|
|
return
|
|
|
|
if(core_count < 1)
|
|
log_and_message_admins("## SUPERMATTER SETUP ERROR: Found no Supermatter core markers! Make sure all SM setup markers are mapped in properly. Aborting.")
|
|
return
|
|
|
|
for(var/obj/effect/landmark/engine_setup/filter/F in landmarks_list)
|
|
switch(response)
|
|
if(OPT_CARBONDIOXIDE)
|
|
F.coolant = ATM_CO2
|
|
continue
|
|
if(OPT_HYDROGEN)
|
|
F.coolant = ATM_H2
|
|
continue
|
|
if(OPT_NITROGEN)
|
|
F.coolant = ATM_N2
|
|
continue
|
|
if(OPT_NITROUSOXIDE)
|
|
F.coolant = ATM_N2O
|
|
continue
|
|
if(OPT_OXYGEN)
|
|
F.coolant = ATM_O2
|
|
continue
|
|
if(OPT_PHORON)
|
|
F.coolant = ATM_P
|
|
continue
|
|
else
|
|
to_chat(usr, SPAN_DANGER("Did not find coolant setting for '[response]'! Aborting."))
|
|
return
|
|
|
|
var/list/delayed_objects = list()
|
|
// SETUP PHASE
|
|
for(var/obj/effect/landmark/engine_setup/S in landmarks_list)
|
|
var/result = S.activate(0)
|
|
switch(result)
|
|
if(SETUP_OK)
|
|
success++
|
|
continue
|
|
if(SETUP_WARNING)
|
|
warnings++
|
|
continue
|
|
if(SETUP_ERROR)
|
|
errors++
|
|
log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.")
|
|
break
|
|
if(SETUP_DELAYED)
|
|
delayed_objects.Add(S)
|
|
continue
|
|
|
|
if(!errors)
|
|
for(var/obj/effect/landmark/engine_setup/S in delayed_objects)
|
|
var/result = S.activate(1)
|
|
switch(result)
|
|
if(SETUP_OK)
|
|
success++
|
|
continue
|
|
if(SETUP_WARNING)
|
|
warnings++
|
|
continue
|
|
if(SETUP_ERROR)
|
|
errors++
|
|
log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.")
|
|
break
|
|
|
|
log_and_message_admins("## SUPERMATTER SETUP - Setup completed with [errors] errors, [warnings] warnings and [success] successful steps.")
|
|
|
|
return
|
|
|
|
|
|
/obj/effect/landmark/engine_setup
|
|
name = "Engine Setup Marker"
|
|
desc = "You shouldn't see this."
|
|
invisibility = 101
|
|
anchored = 1
|
|
density = 0
|
|
icon = 'icons/mob/screen/generic.dmi'
|
|
icon_state = "x4"
|
|
|
|
/obj/effect/landmark/engine_setup/proc/activate(var/last = 0)
|
|
return SETUP_OK
|
|
|
|
|
|
// Tries to locate a pump, enables it, and sets it to MAX. Triggers warning if unable to locate a pump.
|
|
/obj/effect/landmark/engine_setup/pump_max
|
|
name = "Pump Setup Marker"
|
|
|
|
/obj/effect/landmark/engine_setup/pump_max/activate()
|
|
..()
|
|
var/obj/machinery/atmospherics/binary/pump/P = locate() in get_turf(src)
|
|
if(!P)
|
|
log_and_message_admins("## WARNING: Unable to locate pump at [x] [y] [z]!")
|
|
return SETUP_WARNING
|
|
P.target_pressure = P.max_pressure_setting
|
|
P.update_use_power(POWER_USE_IDLE)
|
|
P.update_icon()
|
|
return SETUP_OK
|
|
|
|
|
|
// Spawns an empty canister on this turf, if it has a connector port. Triggers warning if unable to find a connector port
|
|
/obj/effect/landmark/engine_setup/empty_canister
|
|
name = "Empty Canister Marker"
|
|
|
|
/obj/effect/landmark/engine_setup/empty_canister/activate()
|
|
..()
|
|
var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src)
|
|
if(!P)
|
|
log_and_message_admins("## WARNING: Unable to locate connector port at [x] [y] [z]!")
|
|
return SETUP_WARNING
|
|
new/obj/machinery/portable_atmospherics/canister(get_turf(src)) // Canisters automatically connect to connectors in New()
|
|
return SETUP_OK
|
|
|
|
|
|
// Spawns a coolant canister on this turf, if it has a connector port.
|
|
// Triggers error when unable to locate connector port or when coolant canister type is unset.
|
|
/obj/effect/landmark/engine_setup/coolant_canister
|
|
name = "Coolant Canister Marker"
|
|
var/canister_type = null
|
|
|
|
/obj/effect/landmark/engine_setup/coolant_canister/activate()
|
|
..()
|
|
var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src)
|
|
if(!P)
|
|
log_and_message_admins("## ERROR: Unable to locate coolant connector port at [x] [y] [z]!")
|
|
return SETUP_ERROR
|
|
if(!canister_type)
|
|
log_and_message_admins("## ERROR: Canister type unset at [x] [y] [z]!")
|
|
return SETUP_ERROR
|
|
new canister_type(get_turf(src))
|
|
return SETUP_OK
|
|
|
|
|
|
// Energises the supermatter. Errors when unable to locate supermatter.
|
|
/obj/effect/landmark/engine_setup/core
|
|
name = "Supermatter Core Marker"
|
|
var/energy_setting = 0
|
|
|
|
/obj/effect/landmark/engine_setup/core/activate(var/last = 0)
|
|
if(!last)
|
|
return SETUP_DELAYED
|
|
..()
|
|
var/obj/machinery/power/supermatter/SM = locate() in get_turf(src)
|
|
if(!SM)
|
|
log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!")
|
|
return SETUP_ERROR
|
|
if(!energy_setting)
|
|
log_and_message_admins("## ERROR: Energy setting unset at [x] [y] [z]!")
|
|
return SETUP_ERROR
|
|
SM.power = energy_setting
|
|
return SETUP_OK
|
|
|
|
|
|
// Tries to enable the SMES on max input/output settings. With load balancing it should be fine as long as engine outputs at least ~500kW
|
|
/obj/effect/landmark/engine_setup/smes
|
|
name = "SMES Marker"
|
|
|
|
/obj/effect/landmark/engine_setup/smes/activate()
|
|
..()
|
|
var/obj/machinery/power/smes/S = locate() in get_turf(src)
|
|
if(!S)
|
|
log_and_message_admins("## WARNING: Unable to locate SMES unit at [x] [y] [z]!")
|
|
return SETUP_WARNING
|
|
S.input_attempt = 1
|
|
S.output_attempt = 1
|
|
S.input_level = S.input_level_max
|
|
S.output_level = S.output_level_max
|
|
S.update_icon()
|
|
return SETUP_OK
|
|
|
|
|
|
// Sets up filters. This assumes the filtered gas is the coolant - that it goes back into the core loop by default.
|
|
/obj/effect/landmark/engine_setup/filter
|
|
name = "Omni Filter Marker"
|
|
var/coolant = null
|
|
|
|
/obj/effect/landmark/engine_setup/filter/activate()
|
|
..()
|
|
var/obj/machinery/atmospherics/omni/filter/F = locate() in get_turf(src)
|
|
if(!F)
|
|
log_and_message_admins("## WARNING: Unable to locate omni filter at [x] [y] [z]!")
|
|
return SETUP_WARNING
|
|
if(isnull(coolant))
|
|
log_and_message_admins("## WARNING: No coolant type set for marker at [x] [y] [z]!")
|
|
return SETUP_WARNING
|
|
|
|
// set every filtering port to the target coolant
|
|
for(var/datum/omni_port/P in F.ports)
|
|
switch(P.mode)
|
|
if(ATM_NONE, ATM_INPUT , ATM_OUTPUT)
|
|
continue
|
|
else
|
|
P.mode = coolant
|
|
F.rebuild_filtering_list()
|
|
|
|
F.update_use_power(POWER_USE_IDLE)
|
|
F.update_icon()
|
|
return SETUP_OK
|
|
|
|
|
|
// Sets up freezers.
|
|
/obj/effect/landmark/engine_setup/freezer
|
|
name = "Freezer Marker"
|
|
|
|
/obj/effect/landmark/engine_setup/freezer/activate()
|
|
..()
|
|
var/obj/machinery/atmospherics/unary/freezer/F = locate() in get_turf(src)
|
|
if(!F)
|
|
log_and_message_admins("## WARNING: Unable to locate freezer at [x] [y] [z]!")
|
|
return SETUP_WARNING
|
|
|
|
F.update_use_power(POWER_USE_IDLE)
|
|
F.update_icon()
|
|
return SETUP_OK
|
|
|
|
|
|
#undef SETUP_OK
|
|
#undef SETUP_WARNING
|
|
#undef SETUP_ERROR
|
|
#undef SETUP_DELAYED
|
|
|
|
#undef ENERGY_CARBONDIOXIDE
|
|
#undef ENERGY_HYDROGEN
|
|
#undef ENERGY_NITROGEN
|
|
#undef ENERGY_NITROUSOXIDE
|
|
#undef ENERGY_OXYGEN
|
|
#undef ENERGY_PHORON
|
|
#undef EMITTERSHOTS
|
|
|
|
#undef OPT_CARBONDIOXIDE
|
|
#undef OPT_HYDROGEN
|
|
#undef OPT_NITROGEN
|
|
#undef OPT_NITROUSOXIDE
|
|
#undef OPT_OXYGEN
|
|
#undef OPT_PHORON
|
|
#undef OPT_ABORT
|