From c70380f996008cb059c6252233bd9009bfb6385a Mon Sep 17 00:00:00 2001
From: Alphas00 <154434082+Alphas00@users.noreply.github.com>
Date: Wed, 1 May 2024 17:01:30 +0200
Subject: [PATCH] Adipoelectric Generator
Added the adipoelectric generator, a machine that takes fat from the person who uses it and turns into current for the wire it's placed on. Unlocked at roundstart
Internal cleanup for the adipoelectric transformer
---
.../code/machinery/adipoelectric_generator.dm | 149 ++++++++++++++++++
.../machinery/adipoelectric_transformer.dm | 6 +-
code/modules/research/techweb/all_nodes.dm | 2 +-
tgstation.dme | 1 +
4 files changed, 153 insertions(+), 5 deletions(-)
create mode 100644 GainStation13/code/machinery/adipoelectric_generator.dm
diff --git a/GainStation13/code/machinery/adipoelectric_generator.dm b/GainStation13/code/machinery/adipoelectric_generator.dm
new file mode 100644
index 00000000..609e3d96
--- /dev/null
+++ b/GainStation13/code/machinery/adipoelectric_generator.dm
@@ -0,0 +1,149 @@
+/obj/machinery/power/adipoelectric_generator
+ name = "adipoelectric generator"
+ desc = "This device uses calorite technology to transform excess blubber into power!"
+ icon = 'GainStation13/icons/obj/adipoelectric_transformer.dmi'
+ icon_state = "state_off"
+ density = FALSE
+ anchored = FALSE
+ use_power = NO_POWER_USE
+ state_open = TRUE
+ circuit = /obj/item/circuitboard/machine/power/adipoelectric_generator
+ occupant_typecache = list(/mob/living/carbon)
+ var/laser_modifier
+ var/max_fat
+ var/obj/structure/cable/attached
+ var/conversion_rate = 10000
+ var/emp_timer = 0
+ var/active = FALSE
+ var/datum/looping_sound/generator/soundloop
+
+/obj/machinery/power/adipoelectric_generator/Initialize()
+ . = ..()
+ soundloop = new(list(src), active)
+ if(anchored)
+ connect_to_network()
+ update_icon()
+
+/obj/machinery/power/adipoelectric_generator/RefreshParts()
+ laser_modifier = 0
+ max_fat = 0
+ for(var/obj/item/stock_parts/micro_laser/C in component_parts)
+ laser_modifier += C.rating
+ for(var/obj/item/stock_parts/matter_bin/C in component_parts)
+ max_fat += C.rating * 2
+
+/obj/machinery/power/adipoelectric_generator/process()
+ if(occupant:fatness_real > 0 && powernet && anchored && (emp_timer < world.time))
+ active = TRUE
+ add_avail(conversion_rate * laser_modifier * max_fat)
+ occupant:adjust_fatness(-max_fat, FATTENING_TYPE_ITEM)
+ soundloop.start()
+ else
+ active = FALSE
+ soundloop.stop()
+ update_icon()
+
+/obj/machinery/power/adipoelectric_generator/relaymove(mob/user)
+ if(user.stat)
+ return
+ open_machine()
+ soundloop.stop()
+
+/obj/machinery/power/adipoelectric_generator/emp_act(severity)
+ . = ..()
+ if(!(stat & (BROKEN|NOPOWER)))
+ emp_timer = world.time + 600
+ if(occupant)
+ open_machine()
+
+/obj/machinery/power/adipoelectric_generator/attackby(obj/item/P, mob/user, params)
+ if(state_open)
+ if(default_deconstruction_screwdriver(user, "state_open", "state_off", P))
+ return
+
+ if(default_pry_open(P))
+ return
+
+ if(default_deconstruction_crowbar(P))
+ return
+
+ if(istype(P, /obj/item/wrench) && !active)
+ if(!anchored && !isinspace())
+ connect_to_network()
+ to_chat(user, "You secure the generator to the floor.")
+ anchored = TRUE
+ dir = SOUTH
+ else if(anchored)
+ disconnect_from_network()
+ to_chat(user, "You unsecure the generator from the floor.")
+ anchored = FALSE
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
+ return
+
+ return ..()
+
+/obj/machinery/power/adipoelectric_generator/interact(mob/user)
+ toggle_open()
+ return TRUE
+
+/obj/machinery/power/adipoelectric_generator/proc/toggle_open()
+ if(state_open)
+ close_machine()
+ else
+ open_machine()
+ soundloop.stop()
+ update_icon()
+
+/obj/machinery/power/adipoelectric_generator/open_machine()
+ . = ..()
+
+/obj/machinery/power/adipoelectric_generator/close_machine()
+ . = ..()
+ if(occupant && anchored && !panel_open)
+ add_fingerprint(occupant)
+ else
+ open_machine()
+
+/obj/machinery/power/adipoelectric_generator/update_icon()
+ cut_overlays()
+ if(panel_open)
+ icon_state = "state_open"
+ return
+ if(occupant)
+ var/image/occupant_overlay
+ occupant_overlay = image(occupant.icon, occupant.icon_state)
+ occupant_overlay.copy_overlays(occupant)
+ occupant_overlay.dir = SOUTH
+ occupant_overlay.pixel_y = 10
+ add_overlay(occupant_overlay)
+ if(!active)
+ icon_state = "state_off"
+ else
+ icon_state = "state_on"
+ else
+ icon_state = "state_off"
+
+/obj/machinery/power/adipoelectric_generator/power_change()
+ ..()
+ update_icon()
+
+/obj/machinery/power/adipoelectric_generator/Destroy()
+ QDEL_NULL(soundloop)
+ . = ..()
+
+/obj/item/circuitboard/machine/power/adipoelectric_generator
+ name = "Adipoelectric Generator (Machine Board)"
+ build_path = /obj/machinery/power/adipoelectric_generator
+ req_components = list(
+ /obj/item/stock_parts/micro_laser = 5,
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/stack/cable_coil = 2)
+ needs_anchored = FALSE
+
+/datum/design/board/adipoelectric_generator
+ name = "Machine Design (Adipoelectric Generator Board)"
+ desc = "The circuit board for an Adipoelectric Generator."
+ id = "adipoelectric_generator"
+ build_path = /obj/item/circuitboard/machine/power/adipoelectric_generator
+ category = list("Engineering Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
diff --git a/GainStation13/code/machinery/adipoelectric_transformer.dm b/GainStation13/code/machinery/adipoelectric_transformer.dm
index a43652ab..027b3c04 100644
--- a/GainStation13/code/machinery/adipoelectric_transformer.dm
+++ b/GainStation13/code/machinery/adipoelectric_transformer.dm
@@ -1,14 +1,12 @@
GLOBAL_LIST_EMPTY(adipoelectric_transformer)
/obj/machinery/adipoelectric_transformer
- name = "adipoelectric transformer" //change name to adipoelectric generator
+ name = "adipoelectric transformer"
desc = "This device uses calorite technology to store excess current in the wire it's placed on into whoever steps on!"
icon = 'GainStation13/icons/obj/adipoelectric_transformer.dmi'
icon_state = "state_off"
density = FALSE
- use_power = IDLE_POWER_USE
- idle_power_usage = 0
- active_power_usage = 0
+ use_power = NO_POWER_USE
state_open = TRUE
circuit = /obj/item/circuitboard/machine/adipoelectric_transformer
occupant_typecache = list(/mob/living/carbon)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 72fb0daf..6d579ac3 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -12,7 +12,7 @@
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
"space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","chem_pack","medkit_cabinet",
- "disposable_hypospray","plastic_knife","plastic_fork","plastic_spoon","large_beaker")
+ "disposable_hypospray","plastic_knife","plastic_fork","plastic_spoon","large_beaker", "adipoelectric_generator")
/datum/techweb_node/mmi
id = "mmi"
diff --git a/tgstation.dme b/tgstation.dme
index d735453a..f1820fd9 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3085,6 +3085,7 @@
#include "GainStation13\code\game\objects\effects\spawners\choco_slime_delivery.dm"
#include "GainStation13\code\game\turfs\closed.dm"
#include "GainStation13\code\game\turfs\open.dm"
+#include "GainStation13\code\machinery\adipoelectric_generator.dm"
#include "GainStation13\code\machinery\adipoelectric_transformer.dm"
#include "GainStation13\code\machinery\fattening_turret.dm"
#include "GainStation13\code\machinery\feeding_tube.dm"