From 6cbdad58cf646dade5af5b967243fdd253115ee7 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 13 Jul 2015 20:54:10 -0400 Subject: [PATCH 1/2] Sun Controller Scheduler Integration --- code/controllers/Processes/sun.dm | 50 +++++++++++++++++++++++-- code/datums/sun.dm | 61 ------------------------------- code/modules/mob/mob.dm | 4 +- code/modules/power/solar.dm | 8 ++-- paradise.dme | 1 - 5 files changed, 52 insertions(+), 72 deletions(-) delete mode 100644 code/datums/sun.dm diff --git a/code/controllers/Processes/sun.dm b/code/controllers/Processes/sun.dm index f09806cef53..93e626af3bb 100644 --- a/code/controllers/Processes/sun.dm +++ b/code/controllers/Processes/sun.dm @@ -1,7 +1,51 @@ +var/global/datum/controller/process/sun/sun + +/datum/controller/process/sun + var/angle + var/dx + var/dy + var/rate + var/list/solars = list() // for debugging purposes, references solars list at the constructor + /datum/controller/process/sun/setup() name = "sun" - schedule_interval = 20 // every second - sun = new + schedule_interval = 600 // every 60 seconds + sun = src + + angle = rand (0,360) // the station position to the sun is randomised at round start + rate = rand(50,200)/100 // 50% - 200% of standard rotation + if(prob(50)) // same chance to rotate clockwise than counter-clockwise + rate = -rate /datum/controller/process/sun/doWork() - sun.calc_position() + calc_position() + update_solar_machinery() + + +// calculate the sun's position given the time of day +// at the standard rate (100%) the angle is increase/decreased by 6 degrees every minute. +// a full rotation thus take a game hour in that case +/datum/controller/process/sun/proc/calc_position() + angle = (360 + angle + rate * 6) % 360 // increase/decrease the angle to the sun, adjusted by the rate + + // now calculate and cache the (dx,dy) increments for line drawing + var/s = sin(angle) + var/c = cos(angle) + + // Either "abs(s) < abs(c)" or "abs(s) >= abs(c)" + // In both cases, the greater is greater than 0, so, no "if 0" check is needed for the divisions + + if(abs(s) < abs(c)) + dx = s / abs(c) + dy = c / abs(c) + else + dx = s / abs(s) + dy = c / abs(s) + +//now tell the solar control computers to update their status and linked devices +/datum/controller/process/sun/proc/update_solar_machinery() + for(var/obj/machinery/power/solar_control/SC in solars) + if(!SC.powernet) + solars.Remove(SC) + continue + SC.update() diff --git a/code/datums/sun.dm b/code/datums/sun.dm deleted file mode 100644 index eafbcd1ee0c..00000000000 --- a/code/datums/sun.dm +++ /dev/null @@ -1,61 +0,0 @@ -#define SOLAR_UPDATE_TIME 600 //duration between two updates of the whole sun/solars positions - -var/global/datum/sun/sun - -/datum/sun - var/angle - var/dx - var/dy - var/rate - var/list/solars // for debugging purposes, references solars_list at the constructor - var/solar_next_update // last time the sun position was checked and adjusted - -/datum/sun/New() - - solars = solars_list - rate = rand(50,200)/100 // 50% - 200% of standard rotation - if(prob(50)) // same chance to rotate clockwise than counter-clockwise - rate = -rate - solar_next_update = world.time // init the timer - angle = rand (0,360) // the station position to the sun is randomised at round start - -/* HANDLED IN PROCESS SCHEDULER -/hook/startup/proc/createSun() - sun = new /datum/sun() - return 1 -*/ -// calculate the sun's position given the time of day -// at the standard rate (100%) the angle is increase/decreased by 6 degrees every minute. -// a full rotation thus take a game hour in that case -/datum/sun/proc/calc_position() - - if(world.time < solar_next_update) //if less than 60 game secondes have passed, do nothing - return; - - angle = (360 + angle + rate * 6) % 360 // increase/decrease the angle to the sun, adjusted by the rate - - solar_next_update += SOLAR_UPDATE_TIME // since we updated the angle, set the proper time for the next loop - - // now calculate and cache the (dx,dy) increments for line drawing - - var/s = sin(angle) - var/c = cos(angle) - - // Either "abs(s) < abs(c)" or "abs(s) >= abs(c)" - // In both cases, the greater is greater than 0, so, no "if 0" check is needed for the divisions - - if( abs(s) < abs(c)) - - dx = s / abs(c) - dy = c / abs(c) - - else - dx = s/abs(s) - dy = c / abs(s) - - //now tell the solar control computers to update their status and linked devices - for(var/obj/machinery/power/solar_control/SC in solars_list) - if(!SC.powernet) - solars_list.Remove(SC) - continue - SC.update() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5002f258cac..f8eeff8c5f1 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -978,8 +978,8 @@ var/list/slot_equipment_priority = list( \ process = processScheduler.getProcess("garbage") stat(null, "GAR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - //process = processScheduler.getProcess("sun") - //stat(null, "SUN\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + process = processScheduler.getProcess("sun") + stat(null, "SUN([sun.solars.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") //process = processScheduler.getProcess("garbage") //stat(null, "GAR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 93c1a961073..43f0911d41c 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -1,8 +1,6 @@ #define SOLAR_MAX_DIST 40 #define SOLARGENRATE 1500 -var/list/solars_list = list() - /obj/machinery/power/solar name = "solar panel" desc = "A solar electrical generator." @@ -308,12 +306,12 @@ var/list/solars_list = list() /obj/machinery/power/solar_control/disconnect_from_network() ..() - solars_list.Remove(src) + sun.solars.Remove(src) /obj/machinery/power/solar_control/connect_to_network() var/to_return = ..() - if(powernet) //if connected and not already in solar_list... - solars_list |= src //... add it + if(powernet) //if connected and not already in solar list... + sun.solars |= src return to_return //search for unconnected panels and trackers in the computer powernet and connect them diff --git a/paradise.dme b/paradise.dme index e2b6c726137..e4f7845b468 100644 --- a/paradise.dme +++ b/paradise.dme @@ -184,7 +184,6 @@ #include "code\datums\periodic_news.dm" #include "code\datums\recipe.dm" #include "code\datums\spell.dm" -#include "code\datums\sun.dm" #include "code\datums\supplypacks.dm" #include "code\datums\uplink_item.dm" #include "code\datums\helper_datums\construction_datum.dm" From 822dc6bac12facb8702075540fbfdf518aa1b1fb Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 14 Jul 2015 00:23:58 -0400 Subject: [PATCH 2/2] solar tweaks --- code/modules/power/solar.dm | 59 ++++++++++++++++++------------------ icons/obj/computer.dmi | Bin 34032 -> 33807 bytes 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 43f0911d41c..3eb5b0dc8e3 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -3,7 +3,7 @@ /obj/machinery/power/solar name = "solar panel" - desc = "A solar electrical generator." + desc = "A solar panel. Generates electricity when in contact with sunlight." icon = 'icons/obj/power.dmi' icon_state = "sp_base" anchored = 1 @@ -59,14 +59,14 @@ if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] begins to take the glass off the solar panel.") + user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the solar panel.") + user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.") qdel(src) return else if (W) @@ -106,8 +106,6 @@ //calculates the fraction of the sunlight that the panel recieves /obj/machinery/power/solar/proc/update_solar_exposure() - if(!sun) - return if(obscured) sunfrac = 0 return @@ -125,7 +123,7 @@ /obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY if(stat & BROKEN) return - if(!sun || !control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed + if(!control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed return if(powernet) @@ -176,10 +174,12 @@ var/ax = x // start at the solar panel var/ay = y var/turf/T = null + var/dx = sun.dx + var/dy = sun.dy for(var/i = 1 to 20) // 20 steps is enough - ax += sun.dx // do step - ay += sun.dy + ax += dx // do step + ay += dy T = locate( round(ax,0.5),round(ay,0.5),z) @@ -226,13 +226,13 @@ if(!anchored && isturf(loc)) if(istype(W, /obj/item/weapon/wrench)) anchored = 1 - user.visible_message("[user] wrenches the solar assembly into place.") + user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) return 1 else if(istype(W, /obj/item/weapon/wrench)) anchored = 0 - user.visible_message("[user] unwrenches the solar assembly from it's place.") + user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) return 1 @@ -241,7 +241,7 @@ if(S.use(2)) glass_type = W.type playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] places the glass on the solar assembly.") + user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") if(tracker) new /obj/machinery/power/tracker(get_turf(src), src) else @@ -253,16 +253,17 @@ if(!tracker) if(istype(W, /obj/item/weapon/tracker_electronics)) + if(!user.drop_item()) + return tracker = 1 - user.drop_item() qdel(W) - user.visible_message("[user] inserts the electronics into the solar assembly.") + user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") return 1 else if(istype(W, /obj/item/weapon/crowbar)) new /obj/item/weapon/tracker_electronics(src.loc) tracker = 0 - user.visible_message("[user] takes out the electronics from the solar assembly.") + user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") return 1 ..() @@ -274,11 +275,13 @@ name = "solar panel control" desc = "A controller for solar panel arrays." icon = 'icons/obj/computer.dmi' - icon_state = "solar" + icon_state = "computer" anchored = 1 density = 1 use_power = 1 idle_power_usage = 250 + var/icon_screen = "solar" + var/icon_keyboard = "power_key" var/id = 0 var/cdir = 0 var/targetdir = 0 // target angle in manual tracking (since it updates every game minute) @@ -286,7 +289,7 @@ var/lastgen = 0 var/track = 0 // 0= off 1=timed 2=auto (tracker) var/trackrate = 600 // 300-900 seconds - var/nexttime = 0 // time for a panel to rotate of 1� in manual tracking + var/nexttime = 0 // time for a panel to rotate of 1° in manual tracking var/obj/machinery/power/tracker/connected_tracker = null var/list/connected_panels = list() @@ -311,7 +314,7 @@ /obj/machinery/power/solar_control/connect_to_network() var/to_return = ..() if(powernet) //if connected and not already in solar list... - sun.solars |= src + sun.solars |= src //... add it return to_return //search for unconnected panels and trackers in the computer powernet and connect them @@ -351,19 +354,17 @@ set_panels(cdir) /obj/machinery/power/solar_control/update_icon() - if(stat & BROKEN) - icon_state = "broken" - overlays.Cut() - return - if(stat & NOPOWER) - icon_state = "c_unpowered" - overlays.Cut() - return - icon_state = "solar" overlays.Cut() + if(stat & NOPOWER) + overlays += "[icon_keyboard]_off" + return + overlays += icon_keyboard + if(stat & BROKEN) + overlays += "[icon_state]_broken" + else + overlays += icon_screen if(cdir > -1) overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir)) - return /obj/machinery/power/solar_control/attack_hand(mob/user) if(!..()) @@ -437,9 +438,9 @@ connected_tracker.unset_control() if(track==1 && trackrate) //manual tracking and set a rotation speed - if(nexttime <= world.time) //every time we need to increase/decrease the angle by 1�... + if(nexttime <= world.time) //every time we need to increase/decrease the angle by 1°... targetdir = (targetdir + trackrate/abs(trackrate) + 360) % 360 //... do it - nexttime += 36000/abs(trackrate) //reset the counter for the next 1� + nexttime += 36000/abs(trackrate) //reset the counter for the next 1° /obj/machinery/power/solar_control/Topic(href, href_list) if(..()) diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 4576c253f01f57b80775d0f7d6af1af0d178b060..c70af829c12eb56bb1ae3707092626e69938a98f 100644 GIT binary patch delta 11769 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