mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-28 02:21:53 +00:00
Added priority overlays to atoms, which will not be removed when overlays are cut and will always remain on top when new overlays are added. This requires everyone to use add_overlay() and cut_overlays() instead of overlays += and overlays.Cut(). These procs are found in __HELPERS/icons.dm, and the priority overlay list is found in game/atoms.dm. Everything else is replacing deprecated overlay manipulation.
200 lines
6.1 KiB
Plaintext
200 lines
6.1 KiB
Plaintext
// dummy generator object for testing
|
|
|
|
/*/obj/machinery/power/generator/verb/set_amount(var/g as num)
|
|
set src in view(1)
|
|
|
|
gen_amount = g
|
|
|
|
*/
|
|
|
|
/obj/machinery/power/generator
|
|
name = "thermoelectric generator"
|
|
desc = "It's a high efficiency thermoelectric generator."
|
|
icon_state = "teg"
|
|
anchored = 1
|
|
density = 1
|
|
use_power = 0
|
|
|
|
var/obj/machinery/atmospherics/components/binary/circulator/cold_circ
|
|
var/obj/machinery/atmospherics/components/binary/circulator/hot_circ
|
|
|
|
//note: these currently only support EAST and WEST
|
|
var/cold_dir = WEST
|
|
var/hot_dir = EAST
|
|
|
|
var/lastgen = 0
|
|
var/lastgenlev = -1
|
|
var/lastcirc = "00"
|
|
|
|
|
|
/obj/machinery/power/generator/initialize()
|
|
var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator
|
|
cold_circ = locate(circpath) in get_step(src, cold_dir)
|
|
hot_circ = locate(circpath) in get_step(src, hot_dir)
|
|
connect_to_network()
|
|
|
|
if(cold_circ)
|
|
switch(cold_dir)
|
|
if(EAST)
|
|
cold_circ.side = circpath.CIRC_RIGHT
|
|
if(WEST)
|
|
cold_circ.side = circpath.CIRC_LEFT
|
|
cold_circ.update_icon()
|
|
|
|
if(hot_circ)
|
|
switch(hot_dir)
|
|
if(EAST)
|
|
hot_circ.side = circpath.CIRC_RIGHT
|
|
if(WEST)
|
|
hot_circ.side = circpath.CIRC_LEFT
|
|
hot_circ.update_icon()
|
|
|
|
if(!cold_circ || !hot_circ)
|
|
stat |= BROKEN
|
|
|
|
update_icon()
|
|
|
|
|
|
/obj/machinery/power/generator/update_icon()
|
|
|
|
if(stat & (NOPOWER|BROKEN))
|
|
cut_overlays()
|
|
else
|
|
cut_overlays()
|
|
|
|
if(lastgenlev != 0)
|
|
add_overlay(image('icons/obj/power.dmi', "teg-op[lastgenlev]"))
|
|
|
|
add_overlay(image('icons/obj/power.dmi', "teg-oc[lastcirc]"))
|
|
|
|
|
|
#define GENRATE 800 // generator output coefficient from Q
|
|
|
|
/obj/machinery/power/generator/process()
|
|
|
|
if(!cold_circ || !hot_circ)
|
|
return
|
|
|
|
lastgen = 0
|
|
|
|
if(powernet)
|
|
//world << "cold_circ and hot_circ pass"
|
|
|
|
var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air()
|
|
var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air()
|
|
|
|
//world << "hot_air = [hot_air]; cold_air = [cold_air];"
|
|
|
|
if(cold_air && hot_air)
|
|
|
|
//world << "hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];"
|
|
|
|
//world << "coldair and hotair pass"
|
|
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
|
|
|
|
//world << "delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]"
|
|
|
|
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
|
|
|
|
//world << "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];"
|
|
|
|
hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
|
|
cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
|
|
|
|
//world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]"
|
|
|
|
add_avail(lastgen)
|
|
// update icon overlays only if displayed level has changed
|
|
|
|
if(hot_air)
|
|
var/datum/gas_mixture/hot_circ_air1 = hot_circ.AIR1
|
|
hot_circ_air1.merge(hot_air)
|
|
|
|
if(cold_air)
|
|
var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1
|
|
cold_circ_air1.merge(cold_air)
|
|
|
|
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
|
|
var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]"
|
|
if((genlev != lastgenlev) || (circ != lastcirc))
|
|
lastgenlev = genlev
|
|
lastcirc = circ
|
|
update_icon()
|
|
|
|
src.updateDialog()
|
|
|
|
/obj/machinery/power/generator/attack_hand(mob/user)
|
|
if(..())
|
|
user << browse(null, "window=teg")
|
|
return
|
|
interact(user)
|
|
|
|
/obj/machinery/power/generator/proc/get_menu(include_link = 1)
|
|
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.AIR1
|
|
var/datum/gas_mixture/cold_circ_air2 = cold_circ.AIR2
|
|
var/datum/gas_mixture/hot_circ_air1 = hot_circ.AIR1
|
|
var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2
|
|
|
|
t += "<div class='statusDisplay'>"
|
|
|
|
t += "Output: [round(lastgen)] W"
|
|
|
|
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
|
|
t += "<span class='bad'>Unable to locate all parts!</span>"
|
|
if(include_link)
|
|
t += "<BR><A href='?src=\ref[src];close=1'>Close</A>"
|
|
|
|
return t
|
|
|
|
/obj/machinery/power/generator/interact(mob/user)
|
|
|
|
user.set_machine(src)
|
|
|
|
//user << browse(t, "window=teg;size=460x300")
|
|
//onclose(user, "teg")
|
|
|
|
var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300)
|
|
popup.set_content(get_menu())
|
|
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
|
popup.open()
|
|
return 1
|
|
|
|
|
|
/obj/machinery/power/generator/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
if( href_list["close"] )
|
|
usr << browse(null, "window=teg")
|
|
usr.unset_machine()
|
|
return 0
|
|
return 1
|
|
|
|
|
|
/obj/machinery/power/generator/power_change()
|
|
..()
|
|
update_icon()
|