Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Singulo and tesla now on NovaRat #32

Merged
merged 75 commits into from
Mar 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
fbae7f0
Close server name Discord link tag
Morb0 May 13, 2022
ae48d43
Limit body size range
Morb0 May 13, 2022
34913ff
* config: Disable taur
Morb0 May 3, 2023
a2845ed
Use external CDN (#2)
Morb0 May 3, 2023
1098342
Tweak: merge conflict detection branch
dj-34 May 4, 2023
f27174e
Tweak: moved cyrillic fix to modules (#18)
lebedev May 4, 2023
3abe69c
Fix mob_Hear runtimes (#60)
lebedev May 4, 2023
164398c
Feat: new world_topics (#34)
Furrior May 6, 2023
c5b5805
feat: paradise keybindings as default (#46)
larentoun May 8, 2023
9568738
FEAT: ru translation for italian moustache
Vallat May 8, 2023
589186b
feat: emote panel is now enabled by default (#44)
larentoun May 8, 2023
b984e82
Customer data refactoring (#58)
Vallat May 8, 2023
e76f6ab
Del: GBP (#28)
dj-34 May 8, 2023
eb708c2
Add ability to select atom/movable TTS voice (#61)
lebedev May 8, 2023
f861910
feat: TTS voice seeds for /obj and /mob, Part 1 (#64)
larentoun May 10, 2023
8f507bb
Added new TTS voices (#78)
AddRaiser May 12, 2023
8680d3e
Refactor: change ban table format for compatibility
Bizzonium Apr 4, 2022
6fc31c4
Feat: change collation for sql db
Bizzonium Apr 4, 2022
b2d4476
Feat: add secondary status topic
Bizzonium Apr 15, 2022
e3dd1a6
Feat: GC won't do unnecessary hard dels
Vallat Apr 15, 2022
f19c30a
Feat: add whitelist ticket system using database
Bizzonium Apr 15, 2022
5336325
Feat: allow to prevent jobbanned to pass through whitelist
Bizzonium Apr 15, 2022
10c486c
Feat: add Queue Engine Support
Bizzonium Apr 15, 2022
218d713
Tweak: make all tts seeds donator_level 1
Bizzonium May 8, 2023
f39e77d
Chore: bump rust-g to 3.0.0-ss220
Bizzonium May 8, 2023
cfd30da
Feat: discord authorization
Dimach May 15, 2023
4cf52c7
Really disable TTS for certain atoms
Dimach May 16, 2023
7533b4b
Remove "sexual things"
Dimach May 16, 2023
d4fd7d1
Lower chance and disable on lowpop wall fungus and supermatter surge
Dimach May 17, 2023
e52f1fe
Feat: FFmpeg CPU Affinity config
Bizzonium May 17, 2023
0c23170
Admins action now require R_ADMIN
Dimach May 18, 2023
a8e6370
Fix: check if preference file exists before fcopy to prevent crash
Bizzonium May 18, 2023
0821026
Fix: mentors and deadmins dont see looc
Dimach May 19, 2023
2eab1ab
Tweak: decrease prisoners amount
Dimach May 19, 2023
524e7ee
Tweak: make all TTS voices temporarily available to everyone
Bizzonium May 20, 2023
3c2ba55
Increase ban reason length
Dimach May 20, 2023
f1f8767
Change default keybinds
Dimach May 20, 2023
c6bfda3
Increase max paper length
Dimach May 20, 2023
41c2286
Fix: opforce title, description limits unicode characters fix
Dimach May 20, 2023
81dc52a
Fix: quartermaster now require supply XP to be unlocked
Dimach May 20, 2023
436ab0b
Feat: deployment action
Morb0 May 6, 2023
1efb230
Rename TTS to resolve conflict with TG TTS
Dimach May 23, 2023
2f758e1
Feat: add half head exp req option for jobs like warden
Dimach May 23, 2023
d55af0f
Feat: make Silero TTS url configurable via config
Bizzonium May 27, 2023
fea1a58
Feat: better TTS logging
Bizzonium May 29, 2023
58ab23e
Feat: improve TTS caching
Bizzonium Jun 4, 2023
9b24bf3
Feat: show TTS queue stats in MC
Bizzonium Jun 5, 2023
6a19c45
Tweak: increase max body size
IpBlade Jun 7, 2023
adb0221
Feat: add autocryo
Dimach Jun 8, 2023
50e3f9b
Feat: add atom_type and ckey fields to Silero TTS request
Bizzonium Jun 12, 2023
6df03b9
Fix: player panel no longer available without R_ADMIN
Dimach Jun 26, 2023
49bf607
Fix: close http client in rust_g to prevent memory leak issue
Bizzonium Jun 26, 2023
ebc17bf
Feat: add new 94 TTS voices from Witcher (27), Evil Islands (27), L4D…
Bizzonium Jul 23, 2023
34428f5
Fix: rust_g CI deps and use MariaDB instead of Mysql (#23)
Bizzonium Jul 23, 2023
e13ce48
Tweak: allow vote for all maps
Dimach Jul 26, 2023
d4114c6
Revert dynamic config changes
Dimach Jul 26, 2023
0cd87cf
Tweak: reduce pixel shift
Dimach Aug 6, 2023
a8c8eab
Disable tutorial
Dimach Aug 17, 2023
4a48d34
Fix: move play tts callback creation
Bizzonium Aug 23, 2023
f3e69ac
Feat: add shutdown on reboot option
Bizzonium Aug 28, 2023
74c9ece
Clown/mime not only for veterans
Dimach Sep 8, 2023
2447612
Tweak: Screentips/Say fonts (#25)
Dimach Jun 30, 2023
ab7481a
add: TTS voice change for AI and cyborgs (#26)
RosSample Sep 15, 2023
8f60531
Tweak: disable infect objective
Dimach Jun 27, 2023
c0c4f18
Cleanup admins config
Dimach Sep 24, 2023
32d337c
add: EX666 discord emojis (#27)
RosSample Oct 10, 2023
de780ac
Fix: ban reason compute unicode chars correctly
Dimach Nov 7, 2023
887c699
Feat: add new 69 TTS voices from Portal (1), TMNT (1), Star Wars (7),…
Bizzonium Dec 14, 2023
d6de4b2
Fix mob types for tts
Dimach Sep 24, 2023
1fa57d5
fix tgui
Dimach Jan 1, 2024
3e85c3f
Singulo and tesla now on NovaRat
SantaKO1 Feb 28, 2024
1177888
bring back
SantaKO1 Feb 28, 2024
6484e0d
rebrending
SantaKO1 Feb 28, 2024
33915cc
Merge branch 'ss220-space:nova' into nova
SantaKO1 Mar 5, 2024
7ae3493
sedali puki
SantaKO1 Mar 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion code/__DEFINES/_flags.dm
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
/// Zaps with this flag will generate less power through tesla coils
#define ZAP_LOW_POWER_GEN (1<<6)

#define ZAP_DEFAULT_FLAGS ZAP_MOB_STUN | ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE
#define ZAP_DEFAULT_FLAGS ZAP_MOB_STUN | ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_GENERATES_POWER
#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN
#define ZAP_SUPERMATTER_FLAGS ZAP_GENERATES_POWER

Expand Down
15 changes: 15 additions & 0 deletions code/__DEFINES/~nova_defines/particle_accelerator.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// CONSTRUCTION STATES
#define PA_CONSTRUCTION_UNSECURED 0
#define PA_CONSTRUCTION_UNWIRED 1
#define PA_CONSTRUCTION_PANEL_OPEN 2
#define PA_CONSTRUCTION_COMPLETE 3

// POWER STATES
#define PARTICLE_STRENGTH_WEAK 0
#define PARTICLE_STRENGTH_NORMAL 1
#define PARTICLE_STRENGTH_STRONG 2
#define PARTICLE_STRENGTH_MAX 3

#define ENERGY_REQ_SINGULARITY_CREATION 200

#define SINGULARITY_EFFECT_ANIM_TIME 62
2 changes: 1 addition & 1 deletion code/datums/components/singularity.dm
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@
if (STAGE_ONE)
steps = 1
if (STAGE_TWO)
steps = 3//Yes this is right
steps = 2//Yes this is right
if (STAGE_THREE)
steps = 3
if (STAGE_FOUR)
Expand Down
4 changes: 3 additions & 1 deletion code/modules/power/singularity/field_generator.dm
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ no power level overlay is currently in the overlays list.
///Check for asynk cleanups for this and the connected gens
var/clean_up = FALSE

var/shield_floor = TRUE
/datum/armor/field_generator
melee = 25
bullet = 10
Expand Down Expand Up @@ -337,7 +338,8 @@ no power level overlay is currently in the overlays list.

connected_gens |= found_generator
found_generator.connected_gens |= src
shield_floor(TRUE)
if(shield_floor)
shield_floor(TRUE)
update_appearance()


Expand Down
11 changes: 9 additions & 2 deletions code/modules/power/singularity/singularity.dm
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
/// What the game tells ghosts when you make one
var/ghost_notification_message = "IT'S LOOSE"

invisibility = INVISIBILITY_MAXIMUM

pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS
flags_1 = SUPERMATTER_IGNORES_1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
Expand All @@ -56,6 +58,10 @@
/obj/singularity/Initialize(mapload, starting_energy = 50)
. = ..()

new /obj/effect/singularity_creation(loc)

addtimer(CALLBACK(src, PROC_REF(make_visible)), SINGULARITY_EFFECT_ANIM_TIME)

energy = starting_energy

START_PROCESSING(SSsinguloprocess, src)
Expand Down Expand Up @@ -165,13 +171,14 @@
if(prob(event_chance))
event()
dissipate(seconds_per_tick)
hawking_pulse(seconds_per_tick)
check_energy()

/obj/singularity/proc/dissipate(seconds_per_tick)
if (!dissipate)
return

time_since_last_dissipiation += seconds_per_tick
time_since_last_dissipiation += seconds_per_tick SECONDS

// Uses a while in case of especially long delta times
while (time_since_last_dissipiation >= dissipate_delay)
Expand Down Expand Up @@ -449,7 +456,7 @@
)

/obj/singularity/proc/emp_area()
empulse(src, 8, 10)
empulse(src, 5, 8)

/obj/singularity/singularity_act()
var/gain = (energy/2)
Expand Down
11 changes: 9 additions & 2 deletions code/modules/power/tesla/energy_ball.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#define TESLA_DEFAULT_POWER 6.95304e8
#define TESLA_MINI_POWER 3.47652e8
#define TESLA_DEFAULT_POWER 5214780
#define TESLA_MINI_POWER 1738260
//Zap constants, speeds up targeting
#define BIKE (COIL + 1)
#define COIL (ROD + 1)
Expand Down Expand Up @@ -236,6 +236,13 @@
/obj/structure/lattice = FALSE,
/obj/structure/grille = FALSE,
/obj/structure/frame/machine = FALSE,
/obj/machinery/particle_accelerator/control_box = FALSE,
/obj/structure/particle_accelerator/fuel_chamber = FALSE,
/obj/structure/particle_accelerator/particle_emitter/center = FALSE,
/obj/structure/particle_accelerator/particle_emitter/left = FALSE,
/obj/structure/particle_accelerator/particle_emitter/right = FALSE,
/obj/structure/particle_accelerator/power_box = FALSE,
/obj/structure/particle_accelerator/end_cap = FALSE,
))

//Ok so we are making an assumption here. We assume that view() still calculates from the center out.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,3 +257,9 @@
"borg_upgrade_welding",
)
return ..()
// ENGINEERING
/datum/techweb_node/engineering/New()
design_ids += list(
"rad_collector",
)
return ..()
5 changes: 0 additions & 5 deletions modular_nova/modules/aesthetics/emitter/code/emitter.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,3 @@

/obj/machinery/field/generator
icon = 'modular_nova/modules/aesthetics/emitter/icons/field_generator.dmi'


/obj/machinery/power/rad_collector
icon = 'modular_nova/modules/aesthetics/emitter/icons/emitter.dmi'

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/datum/export/large/collector
cost = CARGO_CRATE_VALUE * 2
unit_name = "radiation collector"
export_types = list(/obj/machinery/power/energy_accumulator/rad_collector)
37 changes: 37 additions & 0 deletions modular_nova/modules/singularity_engine/code/cargo/packs.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/datum/supply_pack/engine/collector
name = "Radiation Collector Crate"
desc = "Contains three radiation collectors. Useful for collecting energy off nearby Supermatter Crystals, Singularities or Teslas!"
cost = CARGO_CRATE_VALUE * 8
contains = list(
/obj/machinery/power/energy_accumulator/rad_collector,
/obj/machinery/power/energy_accumulator/rad_collector,
/obj/machinery/power/energy_accumulator/rad_collector,
)
crate_name = "collector crate"

/datum/supply_pack/engine/particle_accelerator
name = "Particle Accelerator Crate"
desc = "A supermassive black hole or hyper-powered teslaball are the perfect way to spice up any party! This \"My First Apocalypse\" kit contains everything you need to build your own Particle Accelerator! Ages 10 and up."
cost = 10000
contains = list(/obj/structure/particle_accelerator/fuel_chamber,
/obj/machinery/particle_accelerator/control_box,
/obj/structure/particle_accelerator/particle_emitter/center,
/obj/structure/particle_accelerator/particle_emitter/left,
/obj/structure/particle_accelerator/particle_emitter/right,
/obj/structure/particle_accelerator/power_box,
/obj/structure/particle_accelerator/end_cap)
crate_name = "particle accelerator crate"

/datum/supply_pack/engine/sing_gen
name = "Singularity Generator Crate"
desc = "The key to unlocking the power of Lord Singuloth. Particle Accelerator not included."
cost = 25000
contains = list(/obj/machinery/singularity_generator)
crate_name = "singularity generator crate"

/datum/supply_pack/engine/tesla_gen
name = "Tesla Generator Crate"
desc = "The key to unlocking the power of the Tesla energy ball. Particle Accelerator not included."
cost = 25000 // bullshit 25k
contains = list(/obj/machinery/singularity_generator/tesla)
crate_name = "tesla generator crate"
204 changes: 204 additions & 0 deletions modular_nova/modules/singularity_engine/code/collector.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
//radiation needs to be over this amount to get power
#define RAD_COLLECTOR_THRESHOLD 80
//amount of joules created for each rad point over RAD_COLLECTOR_THRESHOLD
#define RAD_COLLECTOR_COEFFICIENT 200

/obj/machinery/power/energy_accumulator/rad_collector
name = "Hawking Radiation Collector Array"
desc = "A device which uses hawking radiation generated from singularities and plasma to produce power."
icon = 'modular_nova/modules/aesthetics/emitter/icons/emitter.dmi'
icon_state = "ca"
req_access = list(ACCESS_ENGINE_EQUIP, ACCESS_ATMOSPHERICS)
max_integrity = 350
integrity_failure = 0.2
rad_insulation = RAD_EXTREME_INSULATION
circuit = /obj/item/circuitboard/machine/rad_collector
/// Stores the loaded tank instance
var/obj/item/tank/internals/plasma/loaded_tank = null
/// Is the collector working?
var/active = FALSE
/// Is the collector locked with an id?
var/locked = FALSE
/// Amount of gas removed per tick
var/drain_ratio = 0.5
/// Multiplier for the amount of gas removed per tick
var/power_production_drain = 0.001
/// Base efficiency
var/efficiency_multiplier = 1.0

/obj/machinery/power/energy_accumulator/rad_collector/anchored
anchored = TRUE

/obj/machinery/power/energy_accumulator/rad_collector/process(delta_time)
if(!loaded_tank)
return
var/datum/gas_mixture/tank_mix = loaded_tank.return_air()
if(!tank_mix.gases[/datum/gas/plasma])
investigate_log("<font color='red'>out of fuel</font>.", INVESTIGATE_ENGINE)
playsound(src, 'sound/machines/ding.ogg', 50, TRUE)
eject()
return
var/gasdrained = min(power_production_drain * drain_ratio * delta_time, tank_mix.gases[/datum/gas/plasma][MOLES])
tank_mix.gases[/datum/gas/plasma][MOLES] -= gasdrained
tank_mix.assert_gas(/datum/gas/tritium)
tank_mix.gases[/datum/gas/tritium][MOLES] += gasdrained
tank_mix.garbage_collect()

. = ..()

/obj/machinery/power/energy_accumulator/rad_collector/interact(mob/user)
if(!anchored)
return
if(locked)
to_chat(user, span_warning("The controls are locked!"))
return
toggle_power()
user.visible_message(span_notice("[user.name] turns the [src.name] [active? "on":"off"]."), \
span_notice("You turn the [src.name] [active? "on":"off"]."))
var/datum/gas_mixture/tank_mix = loaded_tank?.return_air()
var/fuel
if(loaded_tank)
fuel = tank_mix.gases[/datum/gas/plasma]
fuel = fuel ? fuel[MOLES] : 0
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"<font color='red'>It is empty</font>"].", INVESTIGATE_ENGINE)

/obj/machinery/power/energy_accumulator/rad_collector/can_be_unfasten_wrench(mob/user, silent)
if(!loaded_tank)
return ..()
if(!silent)
to_chat(user, span_warning("Remove the plasma tank first!"))
return FAILED_UNFASTEN

/obj/machinery/power/energy_accumulator/rad_collector/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/tank/internals/plasma))
if(!anchored)
to_chat(user, span_warning("[src] needs to be secured to the floor first!"))
return TRUE
if(loaded_tank)
to_chat(user, span_warning("There's already a plasma tank loaded!"))
return TRUE
if(panel_open)
to_chat(user, span_warning("Close the maintenance panel first!"))
return TRUE
if(!user.transferItemToLoc(item, src))
return
loaded_tank = item
update_appearance()
else if(item.GetID())
if(!allowed(user))
to_chat(user, span_danger("Access denied."))
return TRUE
if(!active)
to_chat(user, span_warning("The controls can only be locked when \the [src] is active!"))
return TRUE
locked = !locked
to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the controls."))
return TRUE
else
return ..()

/obj/machinery/power/energy_accumulator/rad_collector/wrench_act(mob/living/user, obj/item/item)
. = ..()
default_unfasten_wrench(user, item)
return TRUE

/obj/machinery/power/energy_accumulator/rad_collector/screwdriver_act(mob/living/user, obj/item/item)
if(..())
return TRUE
if(!loaded_tank)
default_deconstruction_screwdriver(user, icon_state, icon_state, item)
return TRUE
to_chat(user, span_warning("Remove the plasma tank first!"))
return TRUE

/obj/machinery/power/energy_accumulator/rad_collector/crowbar_act(mob/living/user, obj/item/I)
if(loaded_tank)
if(!locked)
eject()
return TRUE
to_chat(user, span_warning("The controls are locked!"))
return TRUE
if(default_deconstruction_crowbar(I))
return TRUE
to_chat(user, span_warning("There isn't a tank loaded!"))
return TRUE

/obj/machinery/power/energy_accumulator/rad_collector/return_analyzable_air()
if(!loaded_tank)
return null
return loaded_tank.return_analyzable_air()

/obj/machinery/power/energy_accumulator/rad_collector/examine(mob/user)
. = ..()
if(!active)
. += span_notice("<b>[src]'s display displays the words:</b> \"Power production mode. Please insert <b>Plasma</b>.\"")
. += span_notice("[src]'s display states that it has stored <b>[display_joules(get_stored_joules())]</b>, and is processing <b>[display_power(get_power_output())]</b>.")

/obj/machinery/power/energy_accumulator/rad_collector/atom_break(damage_flag)
. = ..()
if(.)
eject()

/obj/machinery/power/energy_accumulator/rad_collector/RefreshParts()
. = ..()

// Reset the upgrades to base values
efficiency_multiplier = 1.0

// Calculate efficiency based on micro-laser parts
for(var/datum/stock_part/micro_laser/laser in component_parts)
efficiency_multiplier += (laser.tier - 1) * 0.2 // Each tier above 1 increases efficiency by 20%

/obj/machinery/power/energy_accumulator/rad_collector/proc/eject()
locked = FALSE
var/obj/item/tank/internals/plasma/tank = loaded_tank
if (!tank)
return
tank.forceMove(drop_location())
tank.layer = initial(tank.layer)
tank.plane = initial(tank.plane)
loaded_tank = null
if(active)
toggle_power()
else
update_appearance()

/obj/machinery/power/energy_accumulator/rad_collector/proc/hawking_pulse(atom/source, pulse_strength)
if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_THRESHOLD)
// Adjust energy calculation based on efficiency multiplier
stored_energy += joules_to_energy((pulse_strength - RAD_COLLECTOR_THRESHOLD) * RAD_COLLECTOR_COEFFICIENT * efficiency_multiplier)
new /obj/effect/temp_visual/hawking_radiation(get_turf(src))

/obj/machinery/power/energy_accumulator/rad_collector/update_overlays()
. = ..()
if(loaded_tank)
. += "ptank"
if(machine_stat & (NOPOWER|BROKEN))
return
if(active)
. += "on" // SKYRAT EDIT CHANGE - ORIGINAL. += loaded_tank ? "on" : "error"

/obj/machinery/power/energy_accumulator/rad_collector/proc/toggle_power()
active = !active
if(active)
icon_state = "ca_on"
flick("ca_active", src)
else
icon_state = "ca"
flick("ca_deactive", src)
update_appearance()
return

#undef RAD_COLLECTOR_THRESHOLD
#undef RAD_COLLECTOR_COEFFICIENT


/obj/item/circuitboard/machine/rad_collector
name = "Radiation Collector(hawking)"
greyscale_colors = CIRCUIT_COLOR_ENGINEERING
build_path = /obj/machinery/power/energy_accumulator/rad_collector
req_components = list(
/datum/stock_part/micro_laser = 1,
/obj/item/stack/cable_coil = 2,
/obj/item/stack/sheet/glass = 2)
needs_anchored = FALSE
13 changes: 13 additions & 0 deletions modular_nova/modules/singularity_engine/code/emp_proof_door.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/obj/machinery/door/airlock/external/glass/emp_proof
name = "emp proof airlock"

/obj/machinery/door/airlock/external/glass/emp_proof/emp_act(severity)
return

/obj/machinery/power/apc/auto_name/emp_proof
name = "emp proof apc"

/obj/machinery/power/apc/auto_name/emp_proof/emp_act(severity)
return

MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name/emp_proof, APC_PIXEL_OFFSET)
Loading
Loading