Files
Bubberstation/code/modules/power/apc/apc_power_proc.dm
SyncIt21 9296672b1b APC now either locates/makes the terminal (#91541)
## About The Pull Request
During map export both the APC & its terminal are exported. However,
during import that terminal is not attached to the APC because it will
only attempt to create a new one if one is not already present and not
locate an existing terminal and re attach to it.

It now attempts to locate an existing terminal, from a previous map
export so the APC charges again and stuff

## Changelog
🆑
fix: map exported APC's now locate the terminals under them & attach to
it thus enabling charging & stuff
/🆑
2025-06-11 15:55:19 +00:00

157 lines
5.8 KiB
Plaintext

/obj/machinery/power/apc/get_cell()
return cell
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
//The terminal is what the power computer looks for anyway.
if(terminal)
terminal.connect_to_network()
/obj/machinery/power/apc/proc/make_terminal(terminal_cable_layer = cable_layer)
//attempt to locate a terminal if mappers/map export placed it here
terminal = locate(/obj/machinery/power/terminal) in loc
// create a terminal object at the same position as original turf loc
if(QDELETED(terminal))
terminal = new /obj/machinery/power/terminal(loc)
terminal.cable_layer = terminal_cable_layer
terminal.setDir(dir)
terminal.master = src
/obj/machinery/power/apc/proc/toggle_nightshift_lights(mob/user)
if(low_power_nightshift_lights)
balloon_alert(user, "power is too low!")
return
if(last_nightshift_switch > world.time - 10 SECONDS) //~10 seconds between each toggle to prevent spamming
balloon_alert(user, "night breaker is cycling!")
return
last_nightshift_switch = world.time
set_nightshift(!nightshift_lights)
/obj/machinery/power/apc/proc/update()
if(operating && !shorted && !failure_timer)
area.power_light = (lighting > APC_CHANNEL_AUTO_OFF)
area.power_equip = (equipment > APC_CHANNEL_AUTO_OFF)
area.power_environ = (environ > APC_CHANNEL_AUTO_OFF)
playsound(src.loc, 'sound/machines/terminal/terminal_on.ogg', 50, FALSE)
else
area.power_light = FALSE
area.power_equip = FALSE
area.power_environ = FALSE
playsound(src.loc, 'sound/machines/terminal/terminal_off.ogg', 50, FALSE)
area.power_change()
/obj/machinery/power/apc/proc/toggle_breaker(mob/user)
if(!is_operational || failure_timer)
return
operating = !operating
if (user)
var/enabled_or_disabled = operating ? "enabled" : "disabled"
balloon_alert(user, "power [enabled_or_disabled]")
user.log_message("turned [enabled_or_disabled] the [src]", LOG_GAME)
add_hiddenprint(user)
update()
update_appearance()
/// Returns the surplus energy from the terminal's grid.
/obj/machinery/power/apc/surplus()
if(terminal)
return terminal.surplus()
return 0
/// Adds load (energy) to the terminal's grid.
/obj/machinery/power/apc/add_load(amount)
if(terminal?.powernet)
terminal.add_load(amount)
/// Returns the amount of energy the terminal's grid has.
/obj/machinery/power/apc/avail(amount)
if(terminal)
return terminal.avail(amount)
return 0
/// Returns the surplus energy from the terminal's grid and the cell.
/obj/machinery/power/apc/available_energy()
return charge() + surplus()
/**
* Returns the new status value for an APC channel.
*
* // val 0=off, 1=off(auto) 2=on 3=on(auto)
* // on 0=off, 1=on, 2=autooff
* TODO: Make this use bitflags instead. It should take at most three lines, but it's out of scope for now.
*
* Arguments:
* - val: The current status of the power channel.
* - [APC_CHANNEL_OFF]: The APCs channel has been manually set to off. This channel will not automatically change.
* - [APC_CHANNEL_AUTO_OFF]: The APCs channel is running on automatic and is currently off. Can be automatically set to [APC_CHANNEL_AUTO_ON].
* - [APC_CHANNEL_ON]: The APCs channel has been manually set to on. This will be automatically changed only if the APC runs completely out of power or is disabled.
* - [APC_CHANNEL_AUTO_ON]: The APCs channel is running on automatic and is currently on. Can be automatically set to [APC_CHANNEL_AUTO_OFF].
* - on: An enum dictating how to change the channel's status.
* - [AUTOSET_FORCE_OFF]: The APC forces the channel to turn off. This includes manually set channels.
* - [AUTOSET_ON]: The APC allows automatic channels to turn back on.
* - [AUTOSET_OFF]: The APC turns automatic channels off.
*/
/obj/machinery/power/apc/proc/autoset(val, on)
switch(on)
if(AUTOSET_FORCE_OFF)
if(val == APC_CHANNEL_ON) // if on, return off
return APC_CHANNEL_OFF
else if(val == APC_CHANNEL_AUTO_ON) // if auto-on, return auto-off
return APC_CHANNEL_AUTO_OFF
if(AUTOSET_ON)
if(val == APC_CHANNEL_AUTO_OFF) // if auto-off, return auto-on
return APC_CHANNEL_AUTO_ON
if(AUTOSET_OFF)
if(val == APC_CHANNEL_AUTO_ON) // if auto-on, return auto-off
return APC_CHANNEL_AUTO_OFF
return val
/**
* Used by external forces to set the APCs channel status's.
*
* Arguments:
* - val: The desired value of the subsystem:
* - 1: Manually sets the APCs channel to be [APC_CHANNEL_OFF].
* - 2: Manually sets the APCs channel to be [APC_CHANNEL_AUTO_ON]. If the APC doesn't have any power this defaults to [APC_CHANNEL_OFF] instead.
* - 3: Sets the APCs channel to be [APC_CHANNEL_AUTO_ON]. If the APC doesn't have enough power this defaults to [APC_CHANNEL_AUTO_OFF] instead.
*/
/obj/machinery/power/apc/proc/setsubsystem(val)
if(cell && cell.charge > 0)
return (val == 1) ? APC_CHANNEL_OFF : val
if(val == 3)
return APC_CHANNEL_AUTO_OFF
return APC_CHANNEL_OFF
/obj/machinery/power/apc/disconnect_terminal()
if(terminal)
terminal.master = null
terminal = null
/obj/machinery/power/apc/proc/energy_fail(duration)
for(var/obj/machinery/failing_machine in area.contents)
if(failing_machine.critical_machine)
return
for(var/mob/living/silicon/ai as anything in GLOB.ai_list)
if(get_area(ai) == area)
return
failure_timer = max(failure_timer, round(duration))
update()
queue_icon_update()
/obj/machinery/power/apc/proc/set_nightshift(on)
set waitfor = FALSE
if(low_power_nightshift_lights && !on)
return
if(nightshift_lights == on)
return //no change
nightshift_lights = on
for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists())
for(var/turf/area_turf as anything in zlevel_turfs)
for(var/obj/machinery/light/night_light in area_turf)
if(night_light.nightshift_allowed)
night_light.nightshift_enabled = nightshift_lights
night_light.update(FALSE)
CHECK_TICK