mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
248 lines
6.9 KiB
Plaintext
248 lines
6.9 KiB
Plaintext
/obj/machinery/power/solar/control
|
|
name = "solar panel control"
|
|
desc = "A controller for solar panel arrays."
|
|
icon = 'icons/obj/computer.dmi'
|
|
icon_state = "solar"
|
|
use_power = 1
|
|
idle_power_usage = 50
|
|
active_power_usage = 300
|
|
var/id_tag = 0
|
|
var/cdir = 0
|
|
var/gen = 0
|
|
var/lastgen = 0
|
|
var/track = 0 //0 = off 1 = manual 2 = automatic
|
|
var/trackrate = 60 //Measured in tenths of degree per minute (i.e. defaults to 6.0 deg/min)
|
|
var/trackdir = 1 //-1 = CCW, 1 = CW
|
|
var/nexttime = 0 //Next clock time that manual tracking will move the array
|
|
|
|
l_color = "#FF9933"
|
|
|
|
/obj/machinery/power/solar/control/initialize()
|
|
..()
|
|
|
|
if(powernet)
|
|
set_panels(cdir)
|
|
|
|
/obj/machinery/power/solar/control/Destroy()
|
|
for(var/obj/machinery/power/solar/panel/P in getPowernetNodes())
|
|
if(P.control == src)
|
|
P.control = null
|
|
|
|
..()
|
|
|
|
/obj/machinery/power/solar/control/update_icon()
|
|
overlays.len = 0
|
|
|
|
if(stat & BROKEN)
|
|
icon_state = "broken"
|
|
return
|
|
|
|
if(stat & NOPOWER)
|
|
icon_state = "c_unpowered"
|
|
return
|
|
|
|
icon_state = "solar"
|
|
|
|
if(cdir > 0)
|
|
overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))
|
|
|
|
/obj/machinery/power/solar/control/attack_ai(mob/user)
|
|
add_hiddenprint(user)
|
|
interact(user)
|
|
|
|
/obj/machinery/power/solar/control/attack_hand(mob/user)
|
|
add_fingerprint(user)
|
|
interact(user)
|
|
|
|
/obj/machinery/power/solar/control/process()
|
|
lastgen = gen
|
|
gen = 0
|
|
|
|
if(stat & (NOPOWER | BROKEN))
|
|
return
|
|
|
|
if(track == 1 && nexttime < world.time && trackdir * trackrate)
|
|
// Increments nexttime using itself and not world.time to prevent drift
|
|
nexttime = nexttime + 6000 / trackrate
|
|
// Nudges array 1 degree in desired direction
|
|
cdir = (cdir + trackdir + 360) % 360
|
|
set_panels(cdir)
|
|
update_icon()
|
|
|
|
updateDialog()
|
|
|
|
/obj/machinery/power/solar/control/attackby(I as obj, user as mob)
|
|
if(istype(I, /obj/item/weapon/screwdriver))
|
|
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
|
|
if(do_after(user, 20))
|
|
if(src.stat & BROKEN)
|
|
visible_message("<span class='notice'>[user] clears the broken monitor off of [src].</span>", \
|
|
"You clear the broken monitor off of [src]")
|
|
var/obj/structure/computerframe/A = new /obj/structure/computerframe(src.loc)
|
|
getFromPool(/obj/item/weapon/shard, loc)
|
|
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control(A)
|
|
for (var/obj/C in src)
|
|
C.loc = src.loc
|
|
A.circuit = M
|
|
A.state = 3
|
|
A.icon_state = "3"
|
|
A.anchored = 1
|
|
qdel(src)
|
|
else
|
|
visible_message("[user] begins to unscrew \the [src]'s monitor.",
|
|
"You begin to unscrew the monitor...")
|
|
var/obj/structure/computerframe/A = new /obj/structure/computerframe(src.loc)
|
|
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control(A)
|
|
for (var/obj/C in src)
|
|
C.loc = src.loc
|
|
A.circuit = M
|
|
A.state = 4
|
|
A.icon_state = "4"
|
|
A.anchored = 1
|
|
qdel(src)
|
|
else
|
|
src.attack_hand(user)
|
|
|
|
// called by solar tracker when sun position changes (somehow, that's not supposed to be in process)
|
|
/obj/machinery/power/solar/control/proc/tracker_update(angle)
|
|
if(track != 2 || stat & (NOPOWER | BROKEN))
|
|
return
|
|
|
|
cdir = angle
|
|
set_panels(cdir)
|
|
update_icon()
|
|
updateDialog()
|
|
|
|
/obj/machinery/power/solar/control/interact(mob/user)
|
|
if(stat & (BROKEN | NOPOWER))
|
|
return
|
|
|
|
if ((get_dist(src, user) > 1))
|
|
if (!issilicon(user)&&!isobserver(user))
|
|
user.unset_machine()
|
|
user << browse(null, "window=solcon")
|
|
return
|
|
|
|
user.set_machine(src)
|
|
|
|
|
|
// AUTOFIXED BY fix_string_idiocy.py
|
|
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\solar.dm:407: var/t = "<TT><B>Solar Generator Control</B><HR><PRE>"
|
|
var/t = {"<TT><B>Solar Generator Control</B><HR><PRE>
|
|
<B>Generated power</B> : [round(lastgen)] W<BR>
|
|
Station Orbital Period : [60/abs(sun.rotationRate)] minutes<BR>
|
|
Station Orbital Direction : [sun.rotationRate < 0 ? "CCW" : "CW"]<BR>
|
|
Star Orientation : [sun.angle]° ([angle2text(sun.angle)])<BR>
|
|
Array Orientation : [rate_control(src,"cdir","[cdir]°",1,10,60)] ([angle2text(cdir)])<BR>
|
|
<BR><HR><BR>
|
|
Tracking :"}
|
|
// END AUTOFIX
|
|
switch(track)
|
|
if(0)
|
|
t += "<B>Off</B> <A href='?src=\ref[src];track=1'>Manual</A> <A href='?src=\ref[src];track=2'>Automatic</A><BR>"
|
|
if(1)
|
|
t += "<A href='?src=\ref[src];track=0'>Off</A> <B>Manual</B> <A href='?src=\ref[src];track=2'>Automatic</A><BR>"
|
|
if(2)
|
|
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Manual</A> <B>Automatic</B><BR>"
|
|
|
|
|
|
// AUTOFIXED BY fix_string_idiocy.py
|
|
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\solar.dm:423: t += "Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]°/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>"
|
|
t += {"Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]°/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>
|
|
Manual Tracking Direction:"}
|
|
// END AUTOFIX
|
|
switch(trackdir)
|
|
if(-1)
|
|
t += "<A href='?src=\ref[src];trackdir=1'>CW</A> <B>CCW</B><BR>"
|
|
if(1)
|
|
t += "<B>CW</B> <A href='?src=\ref[src];trackdir=-1'>CCW</A><BR>"
|
|
t += "<A href='?src=\ref[src];close=1'>Close</A></TT>"
|
|
user << browse(t, "window=solcon")
|
|
onclose(user, "solcon")
|
|
return
|
|
|
|
/obj/machinery/power/solar/control/Topic(href, href_list)
|
|
if(..())
|
|
usr << browse(null, "window=solcon")
|
|
usr.unset_machine()
|
|
return
|
|
|
|
if(href_list["close"] )
|
|
usr << browse(null, "window=solcon")
|
|
usr.unset_machine()
|
|
return
|
|
|
|
if(href_list["dir"])
|
|
cdir = text2num(href_list["dir"])
|
|
set_panels(cdir)
|
|
update_icon()
|
|
|
|
if(href_list["rate control"])
|
|
if(href_list["cdir"])
|
|
cdir = dd_range(0, 359, (360 + cdir + text2num(href_list["cdir"])) % 360)
|
|
spawn(1)
|
|
set_panels(cdir)
|
|
update_icon()
|
|
if(href_list["tdir"])
|
|
trackrate = dd_range(0, 360, trackrate + text2num(href_list["tdir"]))
|
|
if(trackrate)
|
|
nexttime = world.time + 6000 / trackrate
|
|
|
|
if(href_list["track"])
|
|
if(trackrate)
|
|
nexttime = world.time + 6000 / trackrate
|
|
|
|
track = text2num(href_list["track"])
|
|
|
|
if(track == 2)
|
|
for(var/obj/machinery/power/solar/panel/tracker/T in getPowernetNodes())
|
|
cdir = T.sun_angle
|
|
break
|
|
|
|
if(href_list["trackdir"])
|
|
trackdir = text2num(href_list["trackdir"])
|
|
|
|
set_panels(cdir)
|
|
update_icon()
|
|
updateUsrDialog()
|
|
|
|
/obj/machinery/power/solar/control/proc/set_panels(var/cdir)
|
|
for(var/obj/machinery/power/solar/panel/P in getPowernetNodes())
|
|
if(get_dist(P, src) < SOLAR_MAX_DIST)
|
|
if(!P.control)
|
|
P.control = src
|
|
|
|
P.ndir = cdir
|
|
|
|
/obj/machinery/power/solar/control/power_change()
|
|
if(powered())
|
|
stat &= ~NOPOWER
|
|
update_icon()
|
|
else
|
|
spawn(rand(0, 15))
|
|
stat |= NOPOWER
|
|
update_icon()
|
|
|
|
/obj/machinery/power/solar/control/proc/broken()
|
|
stat |= BROKEN
|
|
update_icon()
|
|
|
|
/obj/machinery/power/solar/control/meteorhit()
|
|
broken()
|
|
return
|
|
|
|
/obj/machinery/power/solar/control/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
qdel(src)
|
|
if(2.0)
|
|
if (prob(50))
|
|
broken()
|
|
if(3.0)
|
|
if (prob(25))
|
|
broken()
|
|
|
|
/obj/machinery/power/solar/control/blob_act()
|
|
if(prob(75))
|
|
broken()
|
|
density = 0 |