mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
252 lines
6.8 KiB
Plaintext
252 lines
6.8 KiB
Plaintext
#define TRACK_CW 1
|
|
#define TRACK_CCW -1
|
|
|
|
#define TRACK_OFF 0
|
|
#define TRACK_MANUAL 1
|
|
#define TRACK_AUTOMATIC 2
|
|
|
|
/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
|
|
id_tag = 0
|
|
var/cdir = 0
|
|
var/gen = 0
|
|
var/lastgen = 0
|
|
var/track = TRACK_OFF //TRACK_OFF, TRACK_MANUAL, TRACK_AUTOMATIC
|
|
var/trackrate = 60 //Measured in tenths of degree per minute (i.e. defaults to 6.0 deg/min)
|
|
var/trackdir = TRACK_CW //TRACK_CW or TRACK_CCW
|
|
var/nexttime = 0 //Next clock time that manual tracking will move the array
|
|
|
|
light_color = LIGHT_COLOR_YELLOW
|
|
use_auto_lights = 1
|
|
light_range_on = 3
|
|
light_power_on = 2
|
|
|
|
/obj/machinery/power/solar/control/initialize()
|
|
..()
|
|
|
|
if(get_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 = "solarb"
|
|
return
|
|
|
|
if(stat & NOPOWER)
|
|
icon_state = "solar0"
|
|
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(obj/item/I as obj, mob/user as mob)
|
|
if(I.is_screwdriver(user))
|
|
I.playtoolsound(src, 50)
|
|
if(do_after(user, src, 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)
|
|
new /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.forceMove(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.forceMove(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 != TRACK_AUTOMATIC || 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 (!src.Adjacent(user))
|
|
if (!issilicon(user)&&!isobserver(user))
|
|
user.unset_machine()
|
|
user << browse(null, "window=solcon")
|
|
return
|
|
|
|
user.set_machine(src)
|
|
|
|
|
|
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 :"}
|
|
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>"
|
|
|
|
|
|
t += {"Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]°/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>
|
|
Manual Tracking Direction:"}
|
|
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 = clamp((360 + cdir + text2num(href_list["cdir"])) % 360, 0, 359)
|
|
spawn(1)
|
|
set_panels(cdir)
|
|
update_icon()
|
|
if(href_list["tdir"])
|
|
set_trackrate(trackrate + text2num(href_list["tdir"]))
|
|
|
|
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_trackrate(new_value)
|
|
trackrate = clamp(new_value, 0, 360)
|
|
if(trackrate > 0)
|
|
nexttime = world.time + 6000 / trackrate
|
|
|
|
/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()
|
|
. = ..()
|
|
update_icon()
|
|
|
|
/obj/machinery/power/solar/control/proc/broken()
|
|
stat |= BROKEN
|
|
update_icon()
|
|
|
|
/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()
|
|
setDensity(FALSE)
|
|
|
|
/obj/machinery/power/solar/control/npc_tamper_act(mob/living/L)
|
|
track = rand(0,TRACK_AUTOMATIC)
|
|
trackdir = pick(TRACK_CW, TRACK_CCW)
|
|
set_trackrate(rand(0, 360))
|