Files
vgstation13/code/modules/power/solars/control.dm
DamianX f5c96279c6 Removed datum pooling (#26992)
* removed pooling

* replace returnToPool with qdel

* did stuff
2020-07-03 19:38:38 -03:00

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]&deg ([angle2text(sun.angle)])<BR>
Array Orientation : [rate_control(src,"cdir","[cdir]&deg",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]&deg/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))