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"