diff --git a/code/__DEFINES/power_defines.dm b/code/__DEFINES/power_defines.dm index 15d4e1c1baa..c7397a99d84 100644 --- a/code/__DEFINES/power_defines.dm +++ b/code/__DEFINES/power_defines.dm @@ -39,4 +39,10 @@ /// APC battery is at 100% #define APC_FULLY_CHARGED 2 -#define KW *1000 +#define KW * 1e3 +#define MW * 1e6 +#define GW * 1e9 + +#define KJ * 1e3 +#define MJ * 1e6 +#define GJ * 1e9 diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm index 8ef863e2dcb..29af3fd3860 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm @@ -5,6 +5,9 @@ #define PULSEDEMON_SMES_DRAIN_MULTIPLIER 10 #define ALERT_CATEGORY_NOPOWER "pulse_nopower" #define ALERT_CATEGORY_NOREGEN "pulse_noregen" +/// Conversion ratio from Watt ticks to joules. +/// Should be a pulse demon's life tick length in seconds. +#define WATT_TICK_TO_JOULE 2 /mob/living/simple_animal/demon/pulse_demon name = "pulse demon" @@ -56,20 +59,20 @@ /// List of sounds that is picked from when the demon dies or is EMP'd. var/list/hurt_sounds = list("sound/voice/pdwail1.ogg", "sound/voice/pdwail2.ogg", "sound/voice/pdwail3.ogg") - /// Current quantity of power the demon currently holds, spent while purchasing, upgrading or using spells or upgrades. Use adjust_charge to modify this. + /// Current quantity of energy the demon currently holds (Joules), spent while purchasing, upgrading or using spells or upgrades. Use adjust_charge to modify this. var/charge = 1000 - /// Maximum quantity of power the demon can hold at once. + /// Maximum quantity of energy the demon can hold at once (Joules). var/maxcharge = 1000 - /// Book keeping for objective win conditions. + /// Book keeping for objective win conditions (Joules). var/charge_drained = 0 /// Controls whether the demon will drain power from sources. Toggled by a spell. var/do_drain = TRUE - /// Amount of power (in watts) to drain from power sources every Life tick. + /// Amount of power (Watts) to drain from power sources every Life tick. var/power_drain_rate = 1000 - /// Maximum value for power_drain_rate based on upgrades. + /// Maximum value for power_drain_rate based on upgrades. (Watts) var/max_drain_rate = 1000 - /// Amount of power (in watts) required to regenerate health. + /// Amount of power (Watts) required to regenerate health. var/power_per_regen = 1000 /// Amount of health lost per Life tick when the power requirement was not met. var/health_loss_rate = 5 @@ -90,7 +93,7 @@ /// The time it takes to hijack APCs and cyborgs. var/hijack_time = 30 SECONDS - /// The color of light the demon emits. The range of the light is proportional to charge. + /// The color of light the demon emits. The range of the light is proportional to energy stored. var/glow_color = "#bbbb00" /// Area being controlled, should be maintained as long as the demon does not move outside a container (APC, object, robot, bot). @@ -268,9 +271,9 @@ /mob/living/simple_animal/demon/pulse_demon/get_status_tab_items() var/list/status_tab_data = ..() . = status_tab_data - status_tab_data[++status_tab_data.len] = list("Charge:", "[format_si_suffix(charge)]W") - status_tab_data[++status_tab_data.len] = list("Maximum Charge:", "[format_si_suffix(maxcharge)]W") - status_tab_data[++status_tab_data.len] = list("Drained Charge:", "[format_si_suffix(charge_drained)]W") + status_tab_data[++status_tab_data.len] = list("Energy:", "[format_si_suffix(charge)]J") + status_tab_data[++status_tab_data.len] = list("Maximum Energy:", "[format_si_suffix(maxcharge)]J") + status_tab_data[++status_tab_data.len] = list("Drained Energy:", "[format_si_suffix(charge_drained)]J") status_tab_data[++status_tab_data.len] = list("Hijacked APCs:", "[length(hijacked_apcs)]") status_tab_data[++status_tab_data.len] = list("Drain Rate:", "[format_si_suffix(power_drain_rate)]W") status_tab_data[++status_tab_data.len] = list("Hijack Time:", "[hijack_time / 10] seconds") @@ -452,14 +455,16 @@ /mob/living/simple_animal/demon/pulse_demon/proc/drain_APC(obj/machinery/power/apc/A, multiplier = 1) if(A.being_hijacked) return PULSEDEMON_SOURCE_DRAIN_INVALID - var/amount_to_drain = clamp(A.cell.charge, 0, power_drain_rate * multiplier) - A.cell.use(min(amount_to_drain, maxcharge - charge)) // calculated seperately because the apc charge multiplier shouldn't affect the actual consumption + //CELLRATE is the conversion ratio between a watt tick and powercell energy storage units + var/amount_to_drain = clamp(A.cell.charge / GLOB.CELLRATE, 0, power_drain_rate * WATT_TICK_TO_JOULE * multiplier) + A.cell.use(min(amount_to_drain * GLOB.CELLRATE, maxcharge - charge)) // calculated seperately because the apc charge multiplier shouldn't affect the actual consumption return adjust_charge(amount_to_drain * PULSEDEMON_APC_CHARGE_MULTIPLIER) /mob/living/simple_animal/demon/pulse_demon/proc/drain_SMES(obj/machinery/power/smes/S, multiplier = 1) - var/amount_to_drain = clamp(S.charge, 0, power_drain_rate * multiplier * PULSEDEMON_SMES_DRAIN_MULTIPLIER) + //CELLRATE is the conversion ratio between a watt tick and powercell energy storage units. + var/amount_to_drain = clamp(S.charge / GLOB.CELLRATE, 0, power_drain_rate * WATT_TICK_TO_JOULE * multiplier * PULSEDEMON_SMES_DRAIN_MULTIPLIER) var/drained = adjust_charge(amount_to_drain) - S.charge -= drained + S.charge -= drained * GLOB.CELLRATE return drained /mob/living/simple_animal/demon/pulse_demon/Life(seconds, times_fired) @@ -862,3 +867,4 @@ #undef PULSEDEMON_PLATING_SPARK_CHANCE #undef PULSEDEMON_APC_CHARGE_MULTIPLIER #undef PULSEDEMON_SMES_DRAIN_MULTIPLIER +#undef WATT_TICK_TO_JOULE diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm index 1892a86ddd6..f611824bcf1 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm @@ -13,9 +13,9 @@ clothes_req = FALSE action_background_icon_state = "bg_pulsedemon" var/locked = TRUE - var/unlock_cost = 1 KW - var/cast_cost = 1 KW - var/upgrade_cost = 1 KW + var/unlock_cost = 1 KJ + var/cast_cost = 1 KJ + var/upgrade_cost = 1 KJ var/requires_area = FALSE base_cooldown = 20 SECONDS level_max = 4 @@ -122,9 +122,9 @@ name = "Cable Hop" desc = "Jump to another cable in view." action_icon_state = "pd_cablehop" - unlock_cost = 15 KW - cast_cost = 5 KW - upgrade_cost = 75 KW + unlock_cost = 15 KJ + cast_cost = 5 KJ + upgrade_cost = 75 KJ /datum/spell/pulse_demon/cablehop/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) var/turf/O = get_turf(user) @@ -151,9 +151,9 @@ name = "Electromagnetic Tamper" desc = "Unlocks hidden programming in machines. Must be inside a hijacked APC to use." action_icon_state = "pd_emag" - unlock_cost = 50 KW - cast_cost = 20 KW - upgrade_cost = 200 KW + unlock_cost = 50 KJ + cast_cost = 20 KJ + upgrade_cost = 200 KJ requires_area = TRUE /datum/spell/pulse_demon/emagtamper/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) @@ -165,9 +165,9 @@ name = "Electromagnetic Pulse" desc = "Creates an EMP where you click. Be careful not to use it on yourself!" action_icon_state = "pd_emp" - unlock_cost = 50 KW - cast_cost = 10 KW - upgrade_cost = 200 KW + unlock_cost = 50 KJ + cast_cost = 10 KJ + upgrade_cost = 200 KJ requires_area = TRUE /datum/spell/pulse_demon/emp/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) @@ -179,9 +179,9 @@ name = "Overload Machine" desc = "Overloads a machine, causing it to explode." action_icon_state = "pd_overload" - unlock_cost = 300 KW - cast_cost = 50 KW - upgrade_cost = 500 KW + unlock_cost = 300 KJ + cast_cost = 50 KJ + upgrade_cost = 500 KJ requires_area = TRUE /datum/spell/pulse_demon/overload/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) @@ -206,8 +206,8 @@ name = "Remote Hijack" desc = "Remotely hijacks an APC." action_icon_state = "pd_remotehack" - unlock_cost = 15 KW - cast_cost = 10 KW + unlock_cost = 15 KJ + cast_cost = 10 KJ level_max = 0 base_cooldown = 3 SECONDS // you have to wait for the regular hijack time anyway @@ -224,9 +224,9 @@ name = "Remote Drain" desc = "Remotely drains a power source." action_icon_state = "pd_remotedrain" - unlock_cost = 5 KW + unlock_cost = 5 KJ cast_cost = 100 - upgrade_cost = 100 KW + upgrade_cost = 100 KJ /datum/spell/pulse_demon/remotedrain/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) if(isapc(target)) @@ -295,8 +295,8 @@ desc = "Toggle whether you can move outside of cables or power sources." base_message = "move outside of cables." action_icon_state = "pd_toggle_exit" - unlock_cost = 100 KW - upgrade_cost = 300 KW + unlock_cost = 100 KJ + upgrade_cost = 300 KJ level_max = 3 /datum/spell/pulse_demon/toggle/can_exit_cable/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) @@ -391,27 +391,27 @@ if(PD_UPGRADE_HIJACK_SPEED) if(user.hijack_time <= 1 SECONDS) return -1 - cost = (100 / (user.hijack_time / (1 SECONDS))) * 20 KW + cost = (100 / (user.hijack_time / (1 SECONDS))) * 20 KJ if(PD_UPGRADE_DRAIN_SPEED) - if(user.max_drain_rate >= 500 KW) + if(user.max_drain_rate >= 500 KJ) return -1 cost = user.max_drain_rate * 15 if(PD_UPGRADE_MAX_HEALTH) if(user.maxHealth >= 200) return -1 - cost = user.maxHealth * 5 KW + cost = user.maxHealth * 5 KJ if(PD_UPGRADE_HEALTH_REGEN) if(user.health_regen_rate >= 100) return -1 - cost = user.health_regen_rate * 50 KW + cost = user.health_regen_rate * 50 KJ if(PD_UPGRADE_HEALTH_LOSS) if(user.health_loss_rate <= 1) return -1 - cost = (100 / user.health_loss_rate) * 20 KW + cost = (100 / user.health_loss_rate) * 20 KJ if(PD_UPGRADE_HEALTH_COST) if(user.power_per_regen <= 1) return -1 - cost = (100 / user.power_per_regen) * 50 KW + cost = (100 / user.power_per_regen) * 50 KJ if(PD_UPGRADE_MAX_CHARGE) cost = user.maxcharge else @@ -434,7 +434,7 @@ to_chat(user, "Pulse Demon upgrades:") for(var/upgrade in upgrade_descs) var/cost = calc_cost(user, upgrade) - to_chat(user, "[upgrade] ([cost == -1 ? "Fully Upgraded" : "[format_si_suffix(cost)]W"]) - [upgrade_descs[upgrade]]") + to_chat(user, "[upgrade] ([cost == -1 ? "Fully Upgraded" : "[format_si_suffix(cost)]J"]) - [upgrade_descs[upgrade]]") /datum/spell/pulse_demon/open_upgrades/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) var/upgrades = get_upgrades(user) @@ -461,10 +461,10 @@ to_chat(user, "You have upgraded your [choice], it now takes [user.hijack_time / (1 SECONDS)] second\s to hijack APCs.") if(PD_UPGRADE_DRAIN_SPEED) var/old = user.max_drain_rate - user.max_drain_rate = min(round(user.max_drain_rate * 1.5), 500 KW) + user.max_drain_rate = min(round(user.max_drain_rate * 1.5), 500 KJ) if(user.power_drain_rate == old) user.power_drain_rate = user.max_drain_rate - to_chat(user, "You have upgraded your [choice], you can now drain [format_si_suffix(user.max_drain_rate)]W per cycle.") + to_chat(user, "You have upgraded your [choice], you can now drain [format_si_suffix(user.max_drain_rate)]W.") if(PD_UPGRADE_MAX_HEALTH) user.maxHealth = min(round(user.maxHealth * 1.5), 200) to_chat(user, "You have upgraded your [choice], your max health is now [user.maxHealth].") @@ -480,7 +480,7 @@ to_chat(user, "Additionally, if you enable draining while on a cable, any excess power that would've been used regenerating will be added to your charge.") if(PD_UPGRADE_MAX_CHARGE) user.maxcharge = round(user.maxcharge * 2) - to_chat(user, "You have upgraded your [choice], you can now store [format_si_suffix(user.maxcharge)]W of charge.") + to_chat(user, "You have upgraded your [choice], you can now store [format_si_suffix(user.maxcharge)]J of energy.") else return FALSE return TRUE diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 1d6b8da9934..6904c345779 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -10,6 +10,7 @@ pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null var/chargelevel = -1 + /// Cell charge rate (Watts) var/charge_rate = 500 /obj/machinery/cell_charger/Initialize(mapload) diff --git a/code/modules/power/apc/apc.dm b/code/modules/power/apc/apc.dm index 8703241cb0b..e1f99ebb895 100644 --- a/code/modules/power/apc/apc.dm +++ b/code/modules/power/apc/apc.dm @@ -32,21 +32,21 @@ /// The status of the terminals powernet that this APC is connected to: not connected, no power, or recieving power var/main_status = APC_EXTERNAL_POWER_NOTCONNECTED - /// amount of power used in the last cycle for lighting channel + /// amount of power used in the last cycle for lighting channel (Watts) var/last_used_lighting = 0 - /// amount of power used in the last cycle for equipment channel + /// amount of power used in the last cycle for equipment channel (Watts) var/last_used_equipment = 0 - /// amount of power used in the last cycle for environment channel + /// amount of power used in the last cycle for environment channel (Watts) var/last_used_environment = 0 - /// amount of power used in the last cycle in total + /// amount of power used in the last cycle in total (Watts) var/last_used_total = 0 /*** APC Cell Vars ***/ - /// the cell type stored in this APC + /// the cell type stored in this APC. APC uses cell energy capacity (kilojoules) var/obj/item/stock_parts/cell/cell /// the percentage charge the internal battery will start with var/start_charge = 90 - /// Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs + /// Base cell has a 2500 kJ capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty edited APCs var/cell_type = 2500 /*** APC Status Vars ***/ diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 5725dd924f4..17064e2253c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -10,16 +10,16 @@ throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - ///How much charge the battery currently has + /// Battery's current state of charge (kilojoules) var/charge = 0 - ///How much charge the battery can hold + /// Battery's maximum state of charge (kilojoules) var/maxcharge = 1000 - ///How much charge the battery should start with + /// How much energy the cell starts with (kilojoules) var/starting_charge materials = list(MAT_METAL = 700, MAT_GLASS = 50) ///If the battery will explode var/rigged = FALSE - ///How much charge is given every tick when recharging + /// How much energy is given to a recharging cell every tick (kilojoules / tick) var/chargerate = 100 ///Whether it will recharge automatically var/self_recharge = FALSE @@ -36,7 +36,8 @@ START_PROCESSING(SSobj, src) charge = !isnull(starting_charge) ? starting_charge : maxcharge if(ratingdesc) - desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it." + // State of charge is in kJ so we multiply it by 1000 to get Joules + desc += " This one has a power rating of [DisplayJoules(maxcharge * 1000)], and you should not swallow it." update_icon(UPDATE_OVERLAYS) /obj/item/stock_parts/cell/Destroy() diff --git a/code/modules/power/power_machine.dm b/code/modules/power/power_machine.dm index 0c732508501..a4a329b833e 100644 --- a/code/modules/power/power_machine.dm +++ b/code/modules/power/power_machine.dm @@ -13,38 +13,40 @@ /obj/machinery/power/Destroy() disconnect_from_network() return ..() - +/// Adds available power to the next powernet process (Watts) /obj/machinery/power/proc/produce_direct_power(amount) if(powernet) powernet.queued_power_production += amount return TRUE return FALSE -/// Adds power demand to the powernet, machines should use this +/// Adds power demand to the powernet (Watts) +/// machines should use this proc /obj/machinery/power/proc/consume_direct_power(amount) powernet?.power_demand += amount -/// Gets surplus power available on this machines powernet, machines should use this proc +/// Gets surplus power available on this machine's powernet (Watts) /obj/machinery/power/proc/get_surplus() return powernet ? powernet.calculate_surplus() : 0 -/// Gets surplus power available on this machines powernet, machines should use this proc +/// Gets surplus power available on this machine's powernet (Watts) /obj/machinery/power/proc/get_power_balance() return powernet ? powernet.calculate_power_balance() : 0 -/// Gets power available (NOT EXTRA) on this cables powernet, machines should use this +/// Gets power available (NOT EXTRA) on this cables powernet (Watts) +/// machines should use this proc /obj/machinery/power/proc/get_available_power() return powernet ? powernet.available_power : 0 -/// Adds queued power demand to be met next process cycle +/// Adds queued power demand to be met next process cycle (Watts) /obj/machinery/power/proc/add_queued_power_demand(amount) powernet?.queued_power_demand += amount -/// Gets surplus power queued for next process cycle on this cables powernet +/// Gets surplus power queued for next process cycle on this cables powernet (Watts) /obj/machinery/power/proc/get_queued_surplus() return powernet?.calculate_queued_surplus() -/// Gets available (NOT EXTRA) power queued for next process cycle on this machines powernet +/// Gets available (NOT EXTRA) power queued for next process cycle on this machine's powernet (Watts) /obj/machinery/power/proc/get_queued_available_power() return powernet?.queued_power_production diff --git a/code/modules/power/powernets/regional_powernet.dm b/code/modules/power/powernets/regional_powernet.dm index 67d03d660e1..d5ab288448e 100644 --- a/code/modules/power/powernets/regional_powernet.dm +++ b/code/modules/power/powernets/regional_powernet.dm @@ -12,18 +12,18 @@ /// All Power Machines that are connected to this powernet var/list/nodes = list() - /// the current available power in the powernet + /// the current available power in the powernet (Watts) var/available_power = 0 - /// the current load on the powernet, increased by each machine at processing + /// the current load on the powernet, increased by each machine at processing (Watts) var/power_demand = 0 - /// what available power was gathered last tick, then becomes... + /// what available power was gathered last tick, then becomes... (Watts) var/queued_power_production = 0 - /// load applied to powernet between power ticks. + /// load applied to powernet between power ticks. (Watts) var/queued_power_demand = 0 - /// excess power on the powernet (typically avail-load) + /// excess power on the powernet (typically avail-load) (Watts) var/excess_power = 0 - /// the available power as it appears on the power console (gradually updated) + /// the available power as it appears on the power console (gradually updated) (Watts) var/smoothed_available_power = 0 /// the load as it appears on the power console (gradually updated) var/smoothed_demand = 0 diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index e93791afb08..e0949d814ff 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -1,6 +1,7 @@ #define SMESMAXCHARGELEVEL 200000 #define SMESMAXOUTPUT 200000 -#define SMESRATE 0.05 // rate of internal charge to external power +/// Conversion ratio between a Watt-tick and SMES capacity units (should be the same as power cells) +#define SMESRATE GLOB.CELLRATE /obj/machinery/power/smes name = "power storage unit" @@ -8,17 +9,17 @@ icon_state = "smes" density = TRUE - /// Maximum charge of the SMES - var/capacity = 5e6 + /// Maximum amount of energy the SMES can store (kilojoules) + var/capacity = 0.2e6 /// Current charge level var/charge = 0 /// Set TRUE if SMES attempting to charge, FALSE if not var/input_attempt = TRUE /// Set TRUE if SMES is inputting, FALSE if not var/inputting = TRUE - /// Amount of power the SMES attempts to charge by + /// How much power the SMES will draw from the grid to recharge itself (Watts) var/input_level = 50000 - /// Maximum input level + /// Maximum input level (Watts) var/input_level_max = 200000 /// Charge amount available from input last tick var/input_available = 0 @@ -26,9 +27,9 @@ var/output_attempt = TRUE /// TRUE = actually outputting, FALSE = not outputting var/outputting = TRUE - /// Amount of power the SMES attempts to output + /// Amount of power the SMES attempts to output (Watts) var/output_level = 50000 - /// Cap on output_level + /// Cap on output_level (Watts) var/output_level_max = 200000 /// Amount of power actually outputted. may be less than output_level if the powernet returns excess power var/output_used = 0 @@ -87,7 +88,7 @@ output_level_max = 200000 * IO for(var/obj/item/stock_parts/cell/PC in component_parts) C += PC.maxcharge - capacity = C / (15000) * 1e6 + capacity = C * 1e3 / 375 /obj/machinery/power/smes/update_overlays() . = ..() @@ -448,7 +449,7 @@ ..() /obj/machinery/power/smes/engineering - charge = 2e6 // Engineering starts with some charge for singulo + charge = 0.08e6 // Engineering starts with some charge for singulo /obj/machinery/power/smes/magical name = "magical power storage unit" diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm index 7222ffba256..aae9f1755e6 100644 --- a/code/modules/station_goals/bluespace_tap.dm +++ b/code/modules/station_goals/bluespace_tap.dm @@ -174,9 +174,6 @@ /obj/item/food/sliceable/xenomeatbread //maybe add some dangerous/special food here, ie robobuger? ) -#define kW *1000 -#define MW kW *1000 -#define GW MW *1000 #define BASE_ENERGY_CONVERSION 4e-6 #define BASE_POINTS 2 @@ -205,8 +202,8 @@ luminosity = 1 /// Correspond to power required for a mining level, first entry for level 1, etc. - var/list/power_needs = list(1 kW, 2 kW, 5 kW, 10 kW, 15 kW, - 25 kW, 50 kW, 100 kW, 250 kW, 500 kW, + var/list/power_needs = list(1 KW, 2 KW, 5 KW, 10 KW, 15 KW, + 25 KW, 50 KW, 100 KW, 250 KW, 500 KW, 1 MW, 2 MW, 5 MW, 10 MW, 15 MW, 20 MW, 25 MW, 30 MW, 40 MW, 50 MW, 60 MW, 70 MW, 80 MW, 90 MW, 100 MW) @@ -583,8 +580,5 @@
Device highly experimental. Not for sale. Do not operate near small children or vital NT assets. Do not tamper with machine. In case of existential dread, stop machine immediately. \ Please document any and all extradimensional incursions. In case of imminent death, please leave said documentation in plain sight for clean-up teams to recover.
" -#undef kW -#undef MW -#undef GW #undef BASE_ENERGY_CONVERSION #undef BASE_POINTS