/
githubmirror
/
vgstation13
Обзор
Документация
Войти
/
githubmirror
/
vgstation13
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
Bleeding-Edge
code/modules/power/solars/control.dm
260 строк
7 KB
west3436
Virtual zLevels (vLevels) (#38861)
07 фев 2026, 05:04
Не верифицирован
07 фев 2026, 05:04
2f216ef
Код
Авторство
О чём код?
#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 = MACHINE_POWER_USE_IDLE 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 & (FORCEDISABLE|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_hand(mob/user) add_fingerprint(user) interact(user) /obj/machinery/power/solar/control/process() lastgen = gen gen = 0 if(stat & (NOPOWER | BROKEN | FORCEDISABLE)) 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 & (FORCEDISABLE | NOPOWER | BROKEN)) return cdir = angle set_panels(cdir) update_icon() updateDialog() /obj/machinery/power/solar/control/interact(mob/user) if(stat & (BROKEN | NOPOWER | FORCEDISABLE)) 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="" if(SSDayNight?.overwrite_solars && (src.get_virtual_z() in daynight_v_lvls) ) t = {"<TT><B>Solar Generator Control</B><HR><PRE> <B>Generated power</B> : [round(lastgen)] W<BR> Planet Rotational Period : [abs(SSDayNight.solar_orbit_period)] minutes<BR> Planet Rotational Direction : [SSDayNight.solar_orbit_period < 0 ? "CCW" : "CW"]<BR> Nearest Star Orientation : [SSDayNight.nearest_star_angle]°<BR> Array Orientation : [rate_control(src,"cdir","[cdir]°",1,10,60)]<BR> <BR><HR><BR> Tracking :"} else 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(HTML_SKELETON(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()) if(T.stat & BROKEN) continue 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) qdel(src) if(2) if (prob(50)) broken() if(3) 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))