mirror of
https://github.com/cybergirlvannie/OpenSS13.git
synced 2026-06-17 12:02:52 +01:00
395 lines
12 KiB
Plaintext
395 lines
12 KiB
Plaintext
/*
|
|
* Freezer -- freezer part of cryocell system.
|
|
* attaches to the cryocell via a (flex)pipe
|
|
*
|
|
* TODO: Better handling of gas flow when freezer is turned off
|
|
* TODO: Improve flask finding in process()
|
|
* TODO: Logically, the freezer should warm the environment somewhat just like a real freezer
|
|
*/
|
|
|
|
obj/machinery/freezer
|
|
name = "freezer"
|
|
icon = 'Cryogenic2.dmi'
|
|
icon_state = "freezer_0"
|
|
density = 1
|
|
p_dir = 4 // the pipe connection direction (west)
|
|
anchored = 1
|
|
capmult = 1 // capacity multiplier
|
|
|
|
var
|
|
connector = null // the flask connecter overlay object
|
|
obj/machinery/line_out = null // the pipe object connected
|
|
obj/machinery/vnode = null // the pipeline object associated with line_out
|
|
c_used = 1.0 // coolant amount used
|
|
status = 0.0 // true if cooling
|
|
t_flags = 3.0 // bitflags for oxygen (bit-0) and plasma (bit-1) delivery
|
|
transfer = 0.0 // true if transfering to cryocell
|
|
temperature = 60.0+T0C // the temperature setpoint (kelvin)
|
|
|
|
obj/substance/gas/gas // the gas reservoir
|
|
obj/substance/gas/ngas // the new value of the gas reservoir
|
|
|
|
|
|
// Create a new freezer
|
|
// Create the overlay object for the flask connectors
|
|
// Create the 3 flasks (as contents of the freezer)
|
|
// Allocate the gas reservoir and register with the gasflowlist
|
|
|
|
New()
|
|
..()
|
|
var/obj/overlay/O1 = new /obj/overlay( )
|
|
O1.icon = 'Cryogenic2.dmi'
|
|
O1.icon_state = "canister connector_0"
|
|
O1.pixel_y = -16.0
|
|
src.overlays += O1
|
|
src.connector = O1
|
|
new /obj/item/weapon/flasks/oxygen( src )
|
|
new /obj/item/weapon/flasks/coolant( src )
|
|
new /obj/item/weapon/flasks/plasma( src )
|
|
rebuild_overlay()
|
|
|
|
gas = new/obj/substance/gas()
|
|
ngas = new/obj/substance/gas()
|
|
|
|
gasflowlist += src
|
|
|
|
|
|
// Find the (flex)pipe connected to the freezer
|
|
|
|
buildnodes()
|
|
var/turf/T = src.loc
|
|
|
|
line_out = get_machine(level, T, p_dir )
|
|
|
|
if(line_out)
|
|
vnode = line_out.getline() // the pipeline associated with the pipe
|
|
else
|
|
vnode = null
|
|
|
|
|
|
// Update gas levels with the new levels calculated in process()
|
|
|
|
gas_flow()
|
|
gas.replace_by(ngas)
|
|
|
|
|
|
// Called to leak gas to the turf one step east, if the pipe is not present
|
|
|
|
proc/leak_to_turf()
|
|
var/turf/T = get_step(src, EAST)
|
|
|
|
if(T.density)
|
|
T = src.loc
|
|
if(T.density)
|
|
return
|
|
|
|
flow_to_turf(gas, ngas, T)
|
|
|
|
|
|
// Returns the gas fullness value
|
|
|
|
get_gas_val(from)
|
|
return gas.tot_gas()
|
|
|
|
|
|
// Returns the gas reservoir
|
|
|
|
get_gas(from)
|
|
return gas
|
|
|
|
|
|
// Interact by monkey same as human
|
|
|
|
attack_paw(mob/user)
|
|
return src.attack_hand(user)
|
|
|
|
// AI interact
|
|
attack_ai(mob/user)
|
|
return src.attack_hand(user)
|
|
|
|
// Interact by human
|
|
// Show the interaction window
|
|
|
|
attack_hand(mob/user)
|
|
|
|
user.machine = src
|
|
|
|
if ((!( istype(usr, /mob/human) ) && (!( ticker ) || (ticker && ticker.mode != "monkey"))) && (!istype(usr, /mob/ai)))
|
|
var/d1
|
|
if (locate(/obj/item/weapon/flasks, src))
|
|
var/counter = 1
|
|
|
|
for(var/obj/item/weapon/flasks/F in src)
|
|
d1 += text("<A href = '?src=\ref[];flask=[]'><B>Flask []</B></A>: [] / [] / []<BR>", src, counter, counter, F.oxygen, F.plasma, F.coolant)
|
|
counter++
|
|
d1 += "Key: Oxygen / Plasma / Coolant<BR>"
|
|
else
|
|
d1 = "<B>No flasks!</B>"
|
|
var/t1 = null
|
|
switch(src.t_flags)
|
|
if(0.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=1'>Oxygen-No</A> <A href = '?src=\ref[];plasma=1'>Plasma-No</A>", src, src)
|
|
if(1.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=0'>Oxygen-Yes</A> <A href = '?src=\ref[];plasma=1'>Plasma-No</A>", src, src)
|
|
if(2.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=1'>Oxygen-No</A> <A href = '?src=\ref[];plasma=0'>Plasma-Yes</A>", src, src)
|
|
if(3.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=0'>Oxygen-Yes</A> <A href = '?src=\ref[];plasma=0'>Plasma-Yes</A>", src, src)
|
|
else
|
|
var/t2 = null
|
|
if (src.status)
|
|
t2 = text("Cooling-[] <A href = '?src=\ref[];cool=0'>Stop</A>", src.c_used, src)
|
|
else
|
|
t2 = text("<A href = '?src=\ref[];cool=1'>Cool</A> Stopped", src)
|
|
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><BR>\n\t\t<B>Temperature</B>: []<BR>\n\t\t<B>Transfer Status</B>: []<BR>\n\t\t <B>Chemicals Used</B>: []<BR>\n\t\t<B>Freezer status</B>: []<BR>\n\t\t <A href='?src=\ref[];cp=-5'>-</A> <A href='?src=\ref[];cp=-1'>-</A> [] <A href='?src=\ref[];cp=1'>+</A> <A href='?src=\ref[];cp=5'>+</A><BR>\n<BR>\n\t[]<BR>\n<BR>\n<BR>\n\t<A href='?src=\ref[];mach_close=freezer'>Close</A><BR>\n\t</TT></BODY></HTML>", src.temperature-T0C, (src.transfer ? text("Transfering <A href='?src=\ref[];transfer=0'>Stop</A>", src) : text("<A href='?src=\ref[];transfer=1'>Transfer</A> Stopped", src)), t1, t2, src, src, src.c_used, src, src, d1, user)
|
|
user.client_mob() << browse(dat, "window=freezer;size=400x500")
|
|
else
|
|
var/d1 = null
|
|
if (locate(/obj/item/weapon/flasks, src))
|
|
var/counter = 1
|
|
for(var/obj/item/weapon/flasks/F in src)
|
|
d1 += text("<A href = '?src=\ref[];flask=[]'><B>[] []</B></A>: []<BR>", src, counter, stars("Flask"), counter, stars(text("[] / [] / []", F.oxygen, F.plasma, F.coolant)))
|
|
counter++
|
|
d1 += "Key: Oxygen / Plasma / Coolant<BR>"
|
|
else
|
|
d1 = "<B>No flasks!</B>"
|
|
var/t1 = null
|
|
switch(src.t_flags)
|
|
if(0.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=1'>[]</A> <A href = '?src=\ref[];plasma=1'>[]</A>", src, stars("Oxygen-No"), src, stars("Plasma-No"))
|
|
if(1.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=0'>[]</A> <A href = '?src=\ref[];plasma=1'>[]</A>", src, stars("Oxygen-Yes"), src, stars("Plasma-No"))
|
|
if(2.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=1'>[]</A> <A href = '?src=\ref[];plasma=0'>[]</A>", src, stars("Oxygen-No"), src, stars("Plasma-Yes"))
|
|
if(3.0)
|
|
t1 = text("<A href = '?src=\ref[];oxygen=0'>[]</A> <A href = '?src=\ref[];plasma=0'>[]</A>", src, stars("Oxygen-Yes"), src, stars("Plasma-Yes"))
|
|
else
|
|
var/t2 = null
|
|
if (src.status)
|
|
t2 = text("Cooling-[] <A href = '?src=\ref[];cool=0'>[]</A>", src.c_used, src, stars("Stop"))
|
|
else
|
|
t2 = text("<A href = '?src=\ref[];cool=1'>Cool</A> []", src, stars("Stopped"))
|
|
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><BR>\n\t\t<B>[]</B>: []<BR>\n\t\t<B>[]</B>: []<BR>\n\t\t <B>[]</B>: []<BR>\n\t\t<B>[]</B>: []<BR>\n\t\t <A href='?src=\ref[];cp=-5'>-</A> <A href='?src=\ref[];cp=-1'>-</A> [] <A href='?src=\ref[];cp=1'>+</A> <A href='?src=\ref[];cp=5'>+</A><BR>\n<BR>\n\t[]<BR>\n<BR>\n<BR>\n\t<A href='?src=\ref[];mach_close=freezer'>Close</A>\n\t</TT></BODY></HTML>", stars("Temperature"), src.temperature-T0C, stars("Transfer Status"), (src.transfer ? text("Transfering <A href='?src=\ref[];transfer=0'>Stop</A>", src) : text("<A href='?src=\ref[];transfer=1'>Transfer</A> Stopped", src)), stars("Chemicals Used"), t1, stars("Freezer status"), t2, src, src, src.c_used, src, src, d1, user)
|
|
user.client_mob() << browse(dat, "window=freezer;size=400x500")
|
|
|
|
|
|
// Handle topic links from interaction window
|
|
|
|
Topic(href, href_list)
|
|
..()
|
|
if ((!( istype(usr, /mob/human) ) && (!( ticker ) || (ticker && ticker.mode != "monkey"))))
|
|
if (!istype(usr, /mob/ai))
|
|
usr.client_mob() << "\red You don't have the dexterity to do this!"
|
|
return
|
|
if ((usr.stat || usr.restrained()))
|
|
if (!istype(usr, /mob/ai))
|
|
return
|
|
if ((usr.contents.Find(src) || (get_dist(src, usr) <= 1 && istype(src.loc, /turf))))
|
|
usr.machine = src
|
|
if (href_list["cp"])
|
|
var/cp = text2num(href_list["cp"])
|
|
src.c_used += cp
|
|
src.c_used = min(max(round(src.c_used), 0), 10)
|
|
if (href_list["oxygen"])
|
|
var/t1 = text2num(href_list["oxygen"])
|
|
if (t1)
|
|
src.t_flags |= 1
|
|
else
|
|
src.t_flags &= 65534
|
|
if (href_list["plasma"])
|
|
var/t1 = text2num(href_list["plasma"])
|
|
if (t1)
|
|
src.t_flags |= 2
|
|
else
|
|
src.t_flags &= 65533
|
|
if (href_list["cool"])
|
|
src.status = text2num(href_list["cool"])
|
|
src.icon_state = text("freezer_[]", src.status)
|
|
if (href_list["transfer"])
|
|
src.transfer = text2num(href_list["transfer"])
|
|
if (href_list["flask"])
|
|
var/t1 = text2num(href_list["flask"])
|
|
if (t1 <= src.contents.len)
|
|
var/obj/F = src.contents[t1]
|
|
F.loc = src.loc
|
|
src.rebuild_overlay()
|
|
src.add_fingerprint(usr)
|
|
|
|
|
|
// Attack with item
|
|
// If a flask, add to contents and rebuild overlays
|
|
|
|
attackby(obj/item/weapon/flasks/F, mob/user)
|
|
|
|
if (!( istype(F, /obj/item/weapon/flasks) ))
|
|
return
|
|
if (src.contents.len >= 3)
|
|
user.client_mob() << "\blue All slots are full!"
|
|
return
|
|
else
|
|
user.drop_item()
|
|
F.loc = src
|
|
src.rebuild_overlay()
|
|
|
|
|
|
// Called when area power state changes
|
|
// Set icon state depending on power status
|
|
|
|
power_change()
|
|
..()
|
|
if(stat & NOPOWER)
|
|
icon_state = "freezer_0"
|
|
else
|
|
src.icon_state = "freezer_[status]"
|
|
|
|
|
|
// Called to update the overlays of the connector and flasks
|
|
|
|
proc/rebuild_overlay()
|
|
for(var/x in src.overlays)
|
|
src.overlays -= x
|
|
|
|
src.overlays += src.connector
|
|
var/counter = 0
|
|
|
|
for(var/obj/item/weapon/flasks/F in src.contents)
|
|
var/obj/overlay/O = new /obj/overlay( )
|
|
O.icon = F.icon
|
|
O.icon_state = F.icon_state
|
|
O.pixel_y = -17.0
|
|
O.pixel_x = counter * 12
|
|
src.overlays += O
|
|
counter++
|
|
if (counter >= 3)
|
|
return
|
|
return
|
|
|
|
|
|
// Timed process
|
|
// Deplete flasks and cool/add to gas reservoir as appropriate
|
|
// Perform flow into pipe
|
|
// Note: Flask finding/depletion process is rather inefficient - rewrite?
|
|
// TODO: Make gas flow when not transfering from flasks
|
|
|
|
process()
|
|
|
|
if(stat & NOPOWER)
|
|
return
|
|
|
|
use_power(50)
|
|
|
|
var/obj/item/weapon/flasks/F1
|
|
var/obj/item/weapon/flasks/F2
|
|
var/obj/item/weapon/flasks/F3
|
|
if (src.contents.len >= 3)
|
|
F3 = src.contents[3]
|
|
if (src.contents.len >= 2)
|
|
F2 = src.contents[2]
|
|
if (src.contents.len >= 1)
|
|
F1 = src.contents[1]
|
|
var/u_cool = 0
|
|
if (src.status)
|
|
u_cool = src.c_used
|
|
|
|
if ((F2 && F2.coolant))
|
|
if (F2.coolant >= u_cool)
|
|
F2.coolant -= u_cool
|
|
else
|
|
u_cool = F2.coolant
|
|
F2.coolant = 0
|
|
|
|
else if ((F1 && F1.coolant))
|
|
if (F1.coolant >= u_cool)
|
|
F1.coolant -= u_cool
|
|
else
|
|
u_cool = F1.coolant
|
|
F1.coolant = 0
|
|
|
|
else if ((F3 && F3.coolant))
|
|
if (F3.coolant >= u_cool)
|
|
F3.coolant -= u_cool
|
|
else
|
|
u_cool = F3.coolant
|
|
F3.coolant = 0
|
|
else
|
|
u_cool = 0
|
|
|
|
if (u_cool)
|
|
src.temperature = max((-100.0+T0C), src.temperature - (u_cool * 5) )
|
|
use_power(200)
|
|
|
|
src.temperature = min(src.temperature + 5, 20+T0C)
|
|
if (src.transfer)
|
|
var/u_oxy = 0
|
|
var/u_pla = 0
|
|
|
|
if (src.t_flags & 1)
|
|
u_oxy = 1
|
|
if ((F1 && F1.oxygen))
|
|
if (F1.oxygen >= u_oxy)
|
|
F1.oxygen -= u_oxy
|
|
else
|
|
u_oxy = F1.oxygen
|
|
F1.oxygen = 0
|
|
else
|
|
if ((F2 && F2.oxygen))
|
|
if (F2.oxygen >= u_oxy)
|
|
F2.oxygen -= u_oxy
|
|
else
|
|
u_oxy = F2.oxygen
|
|
F2.oxygen = 0
|
|
else
|
|
if ((F3 && F3.oxygen))
|
|
if (F3.oxygen >= u_oxy)
|
|
F3.oxygen -= u_oxy
|
|
else
|
|
u_oxy = F3.oxygen
|
|
F3.oxygen = 0
|
|
else
|
|
u_oxy = 0
|
|
|
|
if (src.t_flags & 2)
|
|
u_pla = 1
|
|
if ((F3 && F3.plasma))
|
|
if (F3.plasma >= u_pla)
|
|
F3.plasma -= u_pla
|
|
else
|
|
u_pla = F3.plasma
|
|
F3.plasma = 0
|
|
else
|
|
if ((F2 && F2.plasma))
|
|
if (F2.plasma >= u_pla)
|
|
F2.plasma -= u_pla
|
|
else
|
|
u_pla = F2.plasma
|
|
F2.plasma = 0
|
|
else
|
|
if ((F1 && F1.plasma))
|
|
if (F1.plasma >= u_pla)
|
|
F1.plasma -= u_pla
|
|
else
|
|
u_pla = F1.plasma
|
|
F1.plasma = 0
|
|
else
|
|
u_pla = 0
|
|
if ( (u_oxy + u_pla) > 0)
|
|
ngas.oxygen += u_oxy
|
|
ngas.plasma += u_pla
|
|
ngas.temperature = src.temperature
|
|
spawn( 1 )
|
|
if (src.line_out)
|
|
|
|
if(vnode)
|
|
var/delta_gt = FLOWFRAC * ( vnode.get_gas_val(src) - gas.tot_gas() / capmult)
|
|
calc_delta( src, gas, ngas, vnode, delta_gt)
|
|
else
|
|
leak_to_turf()
|
|
|
|
return
|
|
|
|
src.updateDialog()
|
|
return
|
|
|
|
|
|
|