mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 16:45:42 +00:00
## About The Pull Request Zap strength is now measured in joules. Scales everything to account for this. NT CIMS will now display the zap power transmission in watts, instead of a modifier. This will allow you to actually see how much power the supermatter is generating accurately, without knowledge of hidden multipliers. NT CIMs will also show the internal energy gain from heat in eV/K/s, so you can easily figure out how internal energy gain works, and how much energy gain it actually gives. The internal energy measurement will also adjust its prefix. Internal energy is now a measure of internal energy, rather than internal energy density, removing the "/cm^3". Here is what it looked like:  This image was created on an earlier commit where the numbers were wrong due to a hidden multiplier that got removed later, so keep that in mind. Also fixes inactive supermatters unnecessarily scaling delta time. The high energy (>5GeV) additional zaps now also scale with delta time. The code in this PR is absolute garbage trash and there are some major issues, so I'm drafting this for now. ## Why It's Good For The Game Makes it more clear what the factors add, and also how much power the SM is releasing. Zap strength being measured in joules will simplify a lot of things, making power balance more clear rather than guessimating. Adjusting the prefix for internal energy is just the natural thing to do. The per cubic centimeter part of internal energy would imply it is energy density, however it is functionally not. It would probably confuse people thinking the volume of the turf or the size of the supermatter actually matters for what the internal energy does, when it does not (except for gas absorption I guess, which changes heating/mol requirements, but nothing else), so I am removing that part. ## Changelog 🆑 qol: NT CIMs shows how much power the supermatter is releasing. qol: NT CIMs internal energy will adjust its prefix. qol: Energy displays (such as multitooling grid) will use the full range of SI prefixes available, up to the peta prefix if you somehow managed to reach that. del: Removes the per cubic centimeter part of internal energy. fix: Fix unnecessary delta time scaling on inactive supermatters. fix: Fix high energy zaps not scaling with delta time. fix: Fixes grounding rods lying about potential power you can generate. code: Convert supermatter_zap() and tesla_zap() zap_str argument unit to be in joules, and scales everything that uses that argument. /🆑
161 lines
5.2 KiB
Plaintext
161 lines
5.2 KiB
Plaintext
// Radioisotope Thermoelectric Generator (RTG)
|
|
// Simple power generator that would replace "magic SMES" on various derelicts.
|
|
|
|
/obj/machinery/power/rtg
|
|
name = "radioisotope thermoelectric generator"
|
|
desc = "A simple nuclear power generator, used in small outposts to reliably provide power for decades."
|
|
icon = 'icons/obj/machines/engine/other.dmi'
|
|
icon_state = "rtg"
|
|
density = TRUE
|
|
use_power = NO_POWER_USE
|
|
circuit = /obj/item/circuitboard/machine/rtg
|
|
|
|
// You can buckle someone to RTG, then open its panel. Fun stuff.
|
|
can_buckle = TRUE
|
|
buckle_lying = 0
|
|
buckle_requires_restraints = TRUE
|
|
|
|
var/power_gen = 1000 // Enough to power a single APC. 4000 output with T4 capacitor.
|
|
|
|
/obj/machinery/power/rtg/Initialize(mapload)
|
|
. = ..()
|
|
connect_to_network()
|
|
|
|
/obj/machinery/power/rtg/process()
|
|
..()
|
|
add_avail(power_gen)
|
|
|
|
/obj/machinery/power/rtg/RefreshParts()
|
|
. = ..()
|
|
var/part_level = 0
|
|
for(var/datum/stock_part/stock_part in component_parts)
|
|
part_level += stock_part.tier
|
|
|
|
power_gen = initial(power_gen) * part_level
|
|
|
|
/obj/machinery/power/rtg/examine(mob/user)
|
|
. = ..()
|
|
if(in_range(user, src) || isobserver(user))
|
|
. += span_notice("The status display reads: Power generation now at <b>[power_gen*0.001]</b>kW.")
|
|
|
|
/obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params)
|
|
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I))
|
|
return
|
|
else if(default_deconstruction_crowbar(I))
|
|
return
|
|
return ..()
|
|
|
|
/obj/machinery/power/rtg/advanced
|
|
desc = "An advanced RTG capable of moderating isotope decay, increasing power output but reducing lifetime. It uses plasma-fueled radiation collectors to increase output even further."
|
|
power_gen = 1250 // 2500 on T1, 10000 on T4.
|
|
circuit = /obj/item/circuitboard/machine/rtg/advanced
|
|
|
|
// Void Core, power source for Abductor ships and bases.
|
|
// Provides a lot of power, but tends to explode when mistreated.
|
|
|
|
/obj/machinery/power/rtg/abductor
|
|
name = "Void Core"
|
|
icon = 'icons/obj/antags/abductor.dmi'
|
|
icon_state = "core"
|
|
desc = "An alien power source that produces energy seemingly out of nowhere."
|
|
circuit = /obj/item/circuitboard/machine/abductor/core
|
|
power_gen = 20000 // 280 000 at T1, 400 000 at T4. Starts at T4.
|
|
can_buckle = FALSE
|
|
pixel_y = 7
|
|
var/going_kaboom = FALSE // Is it about to explode?
|
|
|
|
/obj/machinery/power/rtg/abductor/proc/overload()
|
|
if(going_kaboom)
|
|
return
|
|
going_kaboom = TRUE
|
|
visible_message(span_danger("\The [src] lets out a shower of sparks as it starts to lose stability!"),\
|
|
span_hear("You hear a loud electrical crack!"))
|
|
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
|
|
tesla_zap(src, 5, power_gen * 20)
|
|
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, 2, 3, 4, null, 8), 10 SECONDS) // Not a normal explosion.
|
|
|
|
/obj/machinery/power/rtg/abductor/bullet_act(obj/projectile/Proj)
|
|
. = ..()
|
|
if(!going_kaboom && istype(Proj) && Proj.damage > 0 && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
|
|
log_bomber(Proj.firer, "triggered a", src, "explosion via projectile")
|
|
overload()
|
|
|
|
/obj/machinery/power/rtg/abductor/blob_act(obj/structure/blob/B)
|
|
overload()
|
|
|
|
/obj/machinery/power/rtg/abductor/ex_act()
|
|
if(going_kaboom)
|
|
qdel(src)
|
|
else
|
|
overload()
|
|
|
|
return TRUE
|
|
|
|
/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
|
|
overload()
|
|
|
|
/obj/machinery/power/rtg/abductor/zap_act(power, zap_flags)
|
|
. = ..() //extend the zap
|
|
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
|
|
overload()
|
|
|
|
/obj/machinery/power/rtg/debug
|
|
name = "Debug RTG"
|
|
desc = "You really shouldn't be seeing this if you're not a coder or jannie."
|
|
power_gen = 20000
|
|
circuit = null
|
|
|
|
/obj/machinery/power/rtg/debug/RefreshParts()
|
|
SHOULD_CALL_PARENT(FALSE)
|
|
return
|
|
|
|
/obj/machinery/power/rtg/lavaland
|
|
name = "Lava powered RTG"
|
|
desc = "This device only works when exposed to the toxic fumes of Lavaland"
|
|
circuit = null
|
|
power_gen = 1500
|
|
anchored = TRUE
|
|
resistance_flags = LAVA_PROOF
|
|
|
|
/obj/machinery/power/rtg/lavaland/Initialize(mapload)
|
|
. = ..()
|
|
var/turf/our_turf = get_turf(src)
|
|
if(!islava(our_turf))
|
|
power_gen = 0
|
|
if(!is_mining_level(z))
|
|
power_gen = 0
|
|
|
|
/obj/machinery/power/rtg/lavaland/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
|
|
. = ..()
|
|
var/turf/our_turf = get_turf(src)
|
|
if(!islava(our_turf))
|
|
power_gen = 0
|
|
return
|
|
if(!is_mining_level(z))
|
|
power_gen = 0
|
|
return
|
|
power_gen = initial(power_gen)
|
|
|
|
/obj/machinery/power/rtg/old_station
|
|
name = "Old RTG"
|
|
desc = "A very old RTG, it seems on the verge of being destroyed"
|
|
circuit = null
|
|
power_gen = 750
|
|
anchored = TRUE
|
|
|
|
/obj/machinery/power/rtg/old_station/attackby(obj/item/I, mob/user, params)
|
|
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I))
|
|
to_chat(user,span_warning("You feel it crumbling under your hands!"))
|
|
return
|
|
else if(default_deconstruction_crowbar(I, user = user))
|
|
return
|
|
return ..()
|
|
|
|
/obj/machinery/power/rtg/old_station/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct, mob/user)
|
|
to_chat(user,span_warning("It's starting to fall off!"))
|
|
if(!do_after(user, 3 SECONDS, src))
|
|
return TRUE
|
|
to_chat(user,span_notice("You feel like you made a mistake"))
|
|
new /obj/effect/decal/cleanable/ash/large(loc)
|
|
qdel(src)
|