mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-01 04:21:42 +00:00
bring code up to latest standards, move many procs to named files inside _HELPERS no idea where to put some of these procs, help is appreciated made more files to contain some unique code, deleted unsorted.dm, we can rest now
231 lines
6.7 KiB
Plaintext
231 lines
6.7 KiB
Plaintext
/obj/machinery/power/generator
|
|
name = "thermoelectric generator"
|
|
desc = "It's a high efficiency thermoelectric generator."
|
|
icon_state = "teg"
|
|
density = TRUE
|
|
use_power = NO_POWER_USE
|
|
|
|
circuit = /obj/item/circuitboard/machine/generator
|
|
|
|
var/obj/machinery/atmospherics/components/binary/circulator/cold_circ
|
|
var/obj/machinery/atmospherics/components/binary/circulator/hot_circ
|
|
|
|
var/lastgen = 0
|
|
var/lastgenlev = -1
|
|
var/lastcirc = "00"
|
|
|
|
|
|
/obj/machinery/power/generator/Initialize(mapload)
|
|
. = ..()
|
|
find_circs()
|
|
connect_to_network()
|
|
SSair.start_processing_machine(src)
|
|
update_appearance()
|
|
|
|
/obj/machinery/power/generator/ComponentInitialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS )
|
|
|
|
/obj/machinery/power/generator/Destroy()
|
|
kill_circs()
|
|
SSair.stop_processing_machine(src)
|
|
return ..()
|
|
|
|
/obj/machinery/power/generator/update_overlays()
|
|
. = ..()
|
|
if(machine_stat & (NOPOWER|BROKEN))
|
|
return
|
|
|
|
var/L = min(round(lastgenlev / 100000), 11)
|
|
if(L != 0)
|
|
. += mutable_appearance('icons/obj/power.dmi', "teg-op[L]")
|
|
if(hot_circ && cold_circ)
|
|
. += "teg-oc[lastcirc]"
|
|
|
|
|
|
#define GENRATE 800 // generator output coefficient from Q
|
|
|
|
/obj/machinery/power/generator/process_atmos()
|
|
|
|
if(!cold_circ || !hot_circ)
|
|
return
|
|
|
|
if(powernet)
|
|
var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air()
|
|
var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air()
|
|
|
|
if(cold_air && hot_air)
|
|
|
|
var/cold_air_heat_capacity = cold_air.heat_capacity()
|
|
var/hot_air_heat_capacity = hot_air.heat_capacity()
|
|
|
|
var/delta_temperature = hot_air.temperature - cold_air.temperature
|
|
|
|
|
|
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
|
|
var/efficiency = 0.65
|
|
|
|
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
|
|
|
|
var/heat = energy_transfer*(1-efficiency)
|
|
lastgen += energy_transfer*efficiency
|
|
|
|
hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
|
|
cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
|
|
|
|
//add_avail(lastgen) This is done in process now
|
|
// update icon overlays only if displayed level has changed
|
|
|
|
if(hot_air)
|
|
var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1]
|
|
hot_circ_air1.merge(hot_air)
|
|
|
|
if(cold_air)
|
|
var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1]
|
|
cold_circ_air1.merge(cold_air)
|
|
|
|
update_appearance()
|
|
|
|
var/circ = "[cold_circ?.last_pressure_delta > 0 ? "1" : "0"][hot_circ?.last_pressure_delta > 0 ? "1" : "0"]"
|
|
if(circ != lastcirc)
|
|
lastcirc = circ
|
|
update_appearance()
|
|
|
|
src.updateDialog()
|
|
|
|
/obj/machinery/power/generator/process()
|
|
//Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math**
|
|
var/power_output = round(lastgen / 10)
|
|
add_avail(power_output)
|
|
lastgenlev = power_output
|
|
lastgen -= power_output
|
|
..()
|
|
|
|
/obj/machinery/power/generator/proc/get_menu(include_link = TRUE)
|
|
var/t = ""
|
|
if(!powernet)
|
|
t += "<span class='bad'>Unable to connect to the power network!</span>"
|
|
else if(cold_circ && hot_circ)
|
|
var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1]
|
|
var/datum/gas_mixture/cold_circ_air2 = cold_circ.airs[2]
|
|
var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1]
|
|
var/datum/gas_mixture/hot_circ_air2 = hot_circ.airs[2]
|
|
|
|
t += "<div class='statusDisplay'>"
|
|
|
|
t += "Output: [display_power(lastgenlev)]"
|
|
|
|
t += "<BR>"
|
|
|
|
t += "<B><font color='blue'>Cold loop</font></B><BR>"
|
|
t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K<BR>"
|
|
t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa<BR>"
|
|
|
|
t += "<B><font color='red'>Hot loop</font></B><BR>"
|
|
t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K<BR>"
|
|
t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa<BR>"
|
|
|
|
t += "</div>"
|
|
else if(!hot_circ && cold_circ)
|
|
t += "<span class='bad'>Unable to locate hot circulator!</span>"
|
|
else if(hot_circ && !cold_circ)
|
|
t += "<span class='bad'>Unable to locate cold circulator!</span>"
|
|
else
|
|
t += "<span class='bad'>Unable to locate any parts!</span>"
|
|
if(include_link)
|
|
t += "<BR><A href='?src=[REF(src)];close=1'>Close</A>"
|
|
|
|
return t
|
|
|
|
/obj/machinery/power/generator/ui_interact(mob/user)
|
|
. = ..()
|
|
var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300)
|
|
popup.set_content(get_menu())
|
|
popup.open()
|
|
|
|
/obj/machinery/power/generator/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
if( href_list["close"] )
|
|
usr << browse(null, "window=teg")
|
|
usr.unset_machine()
|
|
return FALSE
|
|
return TRUE
|
|
|
|
|
|
|
|
/obj/machinery/power/generator/proc/find_circs()
|
|
kill_circs()
|
|
var/list/circs = list()
|
|
var/obj/machinery/atmospherics/components/binary/circulator/C
|
|
var/circpath = /obj/machinery/atmospherics/components/binary/circulator
|
|
if(dir == NORTH || dir == SOUTH)
|
|
C = locate(circpath) in get_step(src, EAST)
|
|
if(C && C.dir == WEST)
|
|
circs += C
|
|
|
|
C = locate(circpath) in get_step(src, WEST)
|
|
if(C && C.dir == EAST)
|
|
circs += C
|
|
|
|
else
|
|
C = locate(circpath) in get_step(src, NORTH)
|
|
if(C && C.dir == SOUTH)
|
|
circs += C
|
|
|
|
C = locate(circpath) in get_step(src, SOUTH)
|
|
if(C && C.dir == NORTH)
|
|
circs += C
|
|
|
|
if(circs.len)
|
|
for(C in circs)
|
|
if(C.mode == CIRCULATOR_COLD && !cold_circ)
|
|
cold_circ = C
|
|
C.generator = src
|
|
else if(C.mode == CIRCULATOR_HOT && !hot_circ)
|
|
hot_circ = C
|
|
C.generator = src
|
|
|
|
/obj/machinery/power/generator/wrench_act(mob/living/user, obj/item/I)
|
|
. = ..()
|
|
if(!panel_open)
|
|
return
|
|
set_anchored(!anchored)
|
|
I.play_tool_sound(src)
|
|
if(!anchored)
|
|
kill_circs()
|
|
connect_to_network()
|
|
to_chat(user, span_notice("You [anchored?"secure":"unsecure"] [src]."))
|
|
return TRUE
|
|
|
|
/obj/machinery/power/generator/multitool_act(mob/living/user, obj/item/I)
|
|
. = ..()
|
|
if(!anchored)
|
|
return
|
|
find_circs()
|
|
to_chat(user, span_notice("You update [src]'s circulator links."))
|
|
return TRUE
|
|
|
|
/obj/machinery/power/generator/screwdriver_act(mob/user, obj/item/I)
|
|
if(..())
|
|
return TRUE
|
|
panel_open = !panel_open
|
|
I.play_tool_sound(src)
|
|
to_chat(user, span_notice("You [panel_open?"open":"close"] the panel on [src]."))
|
|
return TRUE
|
|
|
|
/obj/machinery/power/generator/crowbar_act(mob/user, obj/item/I)
|
|
default_deconstruction_crowbar(I)
|
|
return TRUE
|
|
|
|
/obj/machinery/power/generator/on_deconstruction()
|
|
kill_circs()
|
|
|
|
/obj/machinery/power/generator/proc/kill_circs()
|
|
if(hot_circ)
|
|
hot_circ.generator = null
|
|
hot_circ = null
|
|
if(cold_circ)
|
|
cold_circ.generator = null
|
|
cold_circ = null
|