diff --git a/code/modules/power/cells/device_cells_vr.dm b/code/modules/power/cells/device_cells_vr.dm
new file mode 100644
index 00000000000..7718778844f
--- /dev/null
+++ b/code/modules/power/cells/device_cells_vr.dm
@@ -0,0 +1,50 @@
+
+//The device cell
+/obj/item/weapon/cell/device/weapon/recharge/alien
+ name = "void cell (device)"
+ var/swaps_to = /obj/item/weapon/cell/void
+
+/obj/item/weapon/cell/device/weapon/recharge/alien/attack_self(var/mob/user)
+ user.remove_from_mob(src)
+ to_chat(user, "You swap [src] to 'machinery cell' mode.")
+ var/obj/item/weapon/cell/newcell = new swaps_to(null)
+ user.put_in_active_hand(newcell)
+ var/percentage = charge/maxcharge
+ newcell.charge = newcell.maxcharge * percentage
+ qdel(src)
+
+
+//The machine cell
+/obj/item/weapon/cell/void
+ name = "void cell (machinery)"
+ desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
+ origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cell"
+ maxcharge = 4800 //10x the device version
+ charge_amount = 1200 //10x the device version
+ self_recharge = TRUE
+ charge_delay = 50
+ matter = null
+ var/swaps_to = /obj/item/weapon/cell/device/weapon/recharge/alien
+
+/obj/item/weapon/cell/void/attack_self(var/mob/user)
+ user.remove_from_mob(src)
+ to_chat(user, "You swap [src] to 'device cell' mode.")
+ var/obj/item/weapon/cell/newcell = new swaps_to(null)
+ user.put_in_active_hand(newcell)
+ var/percentage = charge/maxcharge
+ newcell.charge = newcell.maxcharge * percentage
+ qdel(src)
+
+
+// Bloo friendlier hybrid tech
+/obj/item/weapon/cell/device/weapon/recharge/alien/hybrid
+ icon = 'icons/obj/power_vr.dmi'
+ icon_state = "cellb"
+ swaps_to = /obj/item/weapon/cell/void/hybrid
+
+/obj/item/weapon/cell/void/hybrid
+ icon = 'icons/obj/power_vr.dmi'
+ icon_state = "cellb"
+ swaps_to = /obj/item/weapon/cell/device/weapon/recharge/alien/hybrid
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 4515b6125cd..1cc83536edd 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -2,8 +2,8 @@
/obj/machinery/power/port_gen
name = "Placeholder Generator" //seriously, don't use this. It can't be anchored without VV magic.
desc = "A portable generator for emergency backup power"
- icon = 'icons/obj/power.dmi'
- icon_state = "portgen0"
+ icon = 'icons/obj/power_vr.dmi' //VOREStation Edit
+ icon_state = "portgen0" //VOREStation Edit
density = 1
anchored = 0
use_power = USE_POWER_OFF
@@ -372,11 +372,11 @@
if(href_list["action"] == "enable")
if(!active && HasFuel() && !IsBroken())
active = 1
- icon_state = "portgen1"
+ icon_state = "[initial(icon_state)]_1" //VOREStation Edit
if(href_list["action"] == "disable")
if (active)
active = 0
- icon_state = "portgen0"
+ icon_state = initial(icon_state) //VOREStation Edit
if(href_list["action"] == "eject")
if(!active)
DropFuel()
diff --git a/code/modules/power/port_gen_vr.dm b/code/modules/power/port_gen_vr.dm
index e6e805e1d77..643f0df9670 100644
--- a/code/modules/power/port_gen_vr.dm
+++ b/code/modules/power/port_gen_vr.dm
@@ -9,3 +9,226 @@
temperature_gain = 80 //how much the temperature increases per power output level, in degrees per level
max_temperature = 450
anchored = 1
+
+// Circuits for the RTGs below
+/obj/item/weapon/circuitboard/machine/rtg
+ name = T_BOARD("radioisotope TEG")
+ build_path = /obj/machinery/power/rtg
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_DATA = 3, TECH_POWER = 3, TECH_PHORON = 3, TECH_ENGINEERING = 3)
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/stack/material/uranium = 10) // We have no Pu-238, and this is the closest thing to it.
+
+/obj/item/weapon/circuitboard/machine/rtg/advanced
+ name = T_BOARD("advanced radioisotope TEG")
+ build_path = /obj/machinery/power/rtg/advanced
+ origin_tech = list(TECH_DATA = 5, TECH_POWER = 5, TECH_PHORON = 5, TECH_ENGINEERING = 5)
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/stack/material/uranium = 10,
+ /obj/item/stack/material/phoron = 5)
+
+/obj/item/weapon/circuitboard/machine/abductor/core
+ name = T_BOARD("void generator")
+ build_path = /obj/machinery/power/rtg/abductor
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_DATA = 8, TECH_POWER = 8, TECH_PHORON = 8, TECH_ENGINEERING = 8)
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor/omni = 1)
+
+/obj/item/weapon/circuitboard/machine/abductor/core/hybrid
+ name = T_BOARD("void generator (hybrid)")
+ build_path = /obj/machinery/power/rtg/abductor/hybrid
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_DATA = 8, TECH_POWER = 8, TECH_PHORON = 8, TECH_ENGINEERING = 8)
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor/omni = 1)
+
+// 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/power_vr.dmi'
+ icon_state = "rtg"
+ density = TRUE
+ use_power = USE_POWER_OFF
+ circuit = /obj/item/weapon/circuitboard/machine/rtg
+
+ // You can buckle someone to RTG, then open its panel. Fun stuff.
+ can_buckle = TRUE
+ buckle_lying = FALSE
+
+ var/power_gen = 1000 // Enough to power a single APC. 4000 output with T4 capacitor.
+ var/irradiate = TRUE // RTGs irradiate surroundings, but only when panel is open.
+
+/obj/machinery/power/rtg/Initialize()
+ . = ..()
+ if(ispath(circuit))
+ circuit = new circuit(src)
+ default_apply_parts()
+ connect_to_network()
+
+/obj/machinery/power/rtg/process()
+ ..()
+ add_avail(power_gen)
+ if(panel_open && irradiate)
+ SSradiation.radiate(src, 60)
+
+/obj/machinery/power/rtg/RefreshParts()
+ var/part_level = 0
+ for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
+ part_level += C.rating
+
+ power_gen = initial(power_gen) * part_level
+
+/obj/machinery/power/rtg/examine(mob/user)
+ . = ..()
+ if(Adjacent(user, src) || isobserver(user))
+ to_chat(user, "The status display reads: Power generation now at [power_gen*0.001]kW.")
+
+/obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, I))
+ return
+ else if(default_deconstruction_crowbar(user, I))
+ return
+ return ..()
+
+/obj/machinery/power/rtg/update_icon()
+ if(panel_open)
+
+ icon_state = "[initial(icon_state)]-open"
+ else
+ icon_state = initial(icon_state)
+
+/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 = 2000 // 2000 on T1, 8000 on T4.
+ circuit = /obj/item/weapon/circuitboard/machine/rtg/advanced
+
+/obj/machinery/power/rtg/fake_gen
+ name = "area power generator"
+ desc = "Some power generation equipment that might be powering the current area."
+ icon_state = "rtg_gen"
+ power_gen = 6000
+ circuit = /obj/item/weapon/circuitboard/machine/rtg
+ can_buckle = FALSE
+
+/obj/machinery/power/rtg/fake_gen/RefreshParts()
+ return
+/obj/machinery/power/rtg/fake_gen/attackby(obj/item/I, mob/user, params)
+ return
+/obj/machinery/power/rtg/fake_gen/update_icon()
+ return
+
+// 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_state = "core-nocell"
+ desc = "An alien power source that produces energy seemingly out of nowhere."
+ circuit = /obj/item/weapon/circuitboard/machine/abductor/core
+ power_gen = 10000
+ irradiate = FALSE // Green energy!
+ can_buckle = FALSE
+ pixel_y = 7
+ var/going_kaboom = FALSE // Is it about to explode?
+ var/obj/item/weapon/cell/void/cell
+
+ var/icon_base = "core"
+
+/obj/machinery/power/rtg/abductor/RefreshParts()
+ ..()
+ if(!cell)
+ power_gen = 0
+
+/obj/machinery/power/rtg/abductor/proc/asplod()
+ if(going_kaboom)
+ return
+ going_kaboom = TRUE
+ visible_message("\The [src] lets out an shower of sparks as it starts to lose stability!",\
+ "You hear a loud electrical crack!")
+ playsound(src.loc, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5)
+ tesla_zap(src, 5, power_gen * 0.05)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion.
+
+/obj/machinery/power/rtg/abductor/bullet_act(obj/item/projectile/Proj)
+ . = ..()
+ if(!going_kaboom && istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
+ log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered an Abductor Core explosion at [x],[y],[z] via projectile.")
+ asplod()
+
+/obj/machinery/power/rtg/abductor/attack_hand(var/mob/living/user)
+ if(!istype(user) || (. = ..()))
+ return
+
+ if(cell)
+ cell.forceMove(get_turf(src))
+ user.put_in_active_hand(cell)
+ cell = null
+ RefreshParts()
+ update_icon()
+ playsound(src, 'sound/effects/metal_close.ogg', 50, 1)
+ return TRUE
+
+/obj/machinery/power/rtg/abductor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/cell/void) && !cell)
+ user.remove_from_mob(I)
+ I.forceMove(src)
+ cell = I
+ RefreshParts()
+ update_icon()
+ playsound(src, 'sound/effects/metal_close.ogg', 50, 1)
+ return
+ return ..()
+
+/obj/machinery/power/rtg/abductor/update_icon()
+ if(cell)
+ ..()
+ else
+ icon_state = "[icon_base]-nocell"
+
+/obj/machinery/power/rtg/abductor/blob_act(obj/structure/blob/B)
+ asplod()
+
+/obj/machinery/power/rtg/abductor/ex_act()
+ if(going_kaboom)
+ qdel(src)
+ else
+ asplod()
+
+/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
+ asplod()
+
+/obj/machinery/power/rtg/abductor/tesla_act()
+ ..() //extend the zap
+ asplod()
+
+// Comes with an installed cell
+/obj/machinery/power/rtg/abductor/built
+ icon_state = "core"
+
+/obj/machinery/power/rtg/abductor/built/Initialize()
+ . = ..()
+ cell = new(src)
+ RefreshParts()
+
+// Bloo version
+/obj/machinery/power/rtg/abductor/hybrid
+ icon_state = "coreb-nocell"
+ icon_base = "coreb"
+ circuit = /obj/item/weapon/circuitboard/machine/abductor/core/hybrid
+
+/obj/machinery/power/rtg/abductor/hybrid/built
+ icon_state = "coreb"
+
+/obj/machinery/power/rtg/abductor/hybrid/built/Initialize()
+ . = ..()
+ cell = new /obj/item/weapon/cell/void/hybrid(src)
+ RefreshParts()
diff --git a/code/modules/research/designs/circuits/circuits_vr.dm b/code/modules/research/designs/circuits/circuits_vr.dm
index fefb2b2db38..0dac20efafe 100644
--- a/code/modules/research/designs/circuits/circuits_vr.dm
+++ b/code/modules/research/designs/circuits/circuits_vr.dm
@@ -146,4 +146,18 @@
id = "quantum_pad"
req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5)
build_path = /obj/item/weapon/circuitboard/quantumpad
- sort_string = "HAAC"
\ No newline at end of file
+ sort_string = "HAAC"
+
+/datum/design/circuit/rtg
+ name = "radioisotope TEG"
+ id = "rtg"
+ req_tech = list(TECH_DATA = 3, TECH_POWER = 3, TECH_PHORON = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/machine/rtg
+ sort_string = "HAAD"
+
+/datum/design/circuit/rtg_advanced
+ name = "advanced radioisotope TEG"
+ id = "adv_rtg"
+ req_tech = list(TECH_DATA = 5, TECH_POWER = 5, TECH_PHORON = 5, TECH_ENGINEERING = 5)
+ build_path = /obj/item/weapon/circuitboard/machine/rtg/advanced
+ sort_string = "HAAE"
\ No newline at end of file
diff --git a/icons/obj/power_vr.dmi b/icons/obj/power_vr.dmi
index 05a1cfa484f..6ebb949321d 100644
Binary files a/icons/obj/power_vr.dmi and b/icons/obj/power_vr.dmi differ
diff --git a/maps/tether/submaps/om_ships/aro2.dmm b/maps/tether/submaps/om_ships/aro2.dmm
index cfa69433367..78cbff06f30 100644
--- a/maps/tether/submaps/om_ships/aro2.dmm
+++ b/maps/tether/submaps/om_ships/aro2.dmm
@@ -383,7 +383,6 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/aro2/cockpit)
"aY" = (
-/obj/machinery/power/terminal,
/obj/structure/railing,
/turf/simulated/floor/greengrid,
/area/aro2/powerroom)
@@ -534,12 +533,12 @@
/turf/simulated/floor/reinforced/airless,
/area/aro2/powerroom)
"bp" = (
-/obj/machinery/power/smes/buildable/hybrid,
/obj/structure/cable/cyan{
d2 = 2;
icon_state = "0-2"
},
-/turf/simulated/floor/tiled/techmaint,
+/obj/machinery/power/rtg/abductor/hybrid/built,
+/turf/simulated/floor/tiled/techfloor/grid,
/area/aro2/powerroom)
"bq" = (
/obj/structure/cable/cyan{
@@ -2102,6 +2101,7 @@
icon_state = "1-2"
},
/obj/structure/table/steel,
+/obj/item/weapon/cell/void/hybrid,
/turf/simulated/floor/tiled/techmaint,
/area/aro2/powerroom)
"ei" = (
@@ -4715,7 +4715,6 @@
/turf/simulated/floor/carpet/bcarpet,
/area/shuttle/aroboat2)
"Mq" = (
-/obj/machinery/power/terminal,
/obj/structure/railing,
/obj/machinery/firealarm{
dir = 4;
diff --git a/vorestation.dme b/vorestation.dme
index bb18968a33b..92fb771725d 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2985,6 +2985,7 @@
#include "code\modules\power\antimatter\control.dm"
#include "code\modules\power\antimatter\shielding.dm"
#include "code\modules\power\cells\device_cells.dm"
+#include "code\modules\power\cells\device_cells_vr.dm"
#include "code\modules\power\cells\power_cells.dm"
#include "code\modules\power\fusion\_setup.dm"
#include "code\modules\power\fusion\fusion_circuits.dm"