From 7af60a7fb5f7a4c8fba2ebaa2f00c6c5378faaeb Mon Sep 17 00:00:00 2001 From: "giacomand@gmail.com" Date: Sat, 29 Dec 2012 07:24:42 +0000 Subject: [PATCH] -Changed the powernet nodes list to be a dictionary list (associative list, hashtable, etc..) -Added a solars_list. The sun will use this list instead of the machines list. I made a proc which decided on whether to use this list or the powernet nodes list depending on what is smallest. I replaced some loops to use this proc. -The sun will reference this list for debugging purposes. The sun will also remove solar equipment in the list which are not connected to a powernet. -Cut down on some duplicated code. -Fixed an issue with solar panels not updating their direction correctly. -Changed the proc updateicon()'s name to update_icon() git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5418 316c924e-a436-60f5-8080-3fe189b3f50e --- code/datums/sun.dm | 9 +- code/game/gamemodes/events/ninja_equipment.dm | 2 +- code/modules/power/apc.dm | 52 ++++++------ code/modules/power/cable.dm | 6 +- code/modules/power/power.dm | 8 +- code/modules/power/solar.dm | 85 +++++++++++++------ code/modules/power/tracker.dm | 20 +++-- 7 files changed, 116 insertions(+), 66 deletions(-) diff --git a/code/datums/sun.dm b/code/datums/sun.dm index 47355c2f64f..3517ad6d98e 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -4,8 +4,11 @@ var/dy var/counter = 50 // to make the vars update during 1st call var/rate + var/list/solars // for debugging purposes, references solars_list at the constructor /datum/sun/New() + + solars = solars_list rate = rand(75,125)/100 // 75% - 125% of standard rotation if(prob(50)) rate = -rate @@ -41,7 +44,11 @@ dy = c / abs(s) - for(var/M in machines) + for(var/obj/machinery/power/M in solars_list) + + if(!M.powernet) + solars_list.Remove(M) + continue // Solar Tracker if(istype(M, /obj/machinery/power/tracker)) diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm index e0047e2d3c9..6dcd6ea4015 100644 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ b/code/game/gamemodes/events/ninja_equipment.dm @@ -976,7 +976,7 @@ ________________________________________________________________________________ flick("apc-spark", src) A.emagged = 1 A.locked = 0 - A.updateicon() + A.update_icon() else U << "\red This APC has run dry of power. You must find another source." diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 82bd6994613..5db7068469a 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -109,7 +109,7 @@ operating = 0 name = "[area.name] APC" stat |= MAINT - src.updateicon() + src.update_icon() spawn(5) src.update() @@ -137,7 +137,7 @@ src.area = A else src.area = get_area_name(areastring) - updateicon() + update_icon() make_terminal() @@ -173,7 +173,7 @@ // update the APC icon to show the three base states // also add overlays for indicator lights -/obj/machinery/power/apc/proc/updateicon() +/obj/machinery/power/apc/update_icon() overlays.Cut() if(opened) var/basestate = "apc[ cell ? "2" : "1" ]" // if opened, show cell if it's inserted @@ -229,14 +229,14 @@ new /obj/item/weapon/module/power_control(loc) else if (opened!=2) //cover isn't removed opened = 0 - updateicon() + update_icon() else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) if(coverlocked && !(stat & MAINT)) user << "\red The cover is locked and cannot be opened." return else opened = 1 - updateicon() + update_icon() else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside if(cell) user << "There is a power cell already installed." @@ -252,7 +252,7 @@ "\red [user.name] has inserted the power cell to [src.name]!",\ "You insert the power cell.") chargecount = 0 - updateicon() + update_icon() else if (istype(W, /obj/item/weapon/screwdriver)) // haxing if(opened) if (cell) @@ -272,13 +272,13 @@ else /* has_electronics==0 */ user << "\red There is nothing to secure." return - updateicon() + update_icon() else if(emagged) user << "The interface is broken." else wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" - updateicon() + update_icon() else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged) @@ -293,7 +293,7 @@ if(src.allowed(usr)) locked = !locked user << "You [ locked ? "lock" : "unlock"] the APC interface." - updateicon() + update_icon() else user << "\red Access denied." else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card @@ -310,7 +310,7 @@ emagged = 1 locked = 0 user << "You emag the APC interface." - updateicon() + update_icon() else user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." else if (istype(W, /obj/item/weapon/cable_coil) && !terminal && opened && has_electronics!=2) @@ -395,7 +395,7 @@ "\red [user.name] has replaced the damaged APC frontal panel with a new one.",\ "You replace the damaged APC frontal panel with a new one.") del(W) - updateicon() + update_icon() else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack)) if (has_electronics) user << "You cannot repair this APC until you remove the electronics still inside." @@ -411,7 +411,7 @@ malfhack = 0 if (opened==2) opened = 1 - updateicon() + update_icon() else if ( ((stat & BROKEN) || malfhack) \ && !opened \ @@ -422,7 +422,7 @@ user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \ "\red You knock down the APC cover with your [W.name]!", \ "You hear bang") - updateicon() + update_icon() else if (istype(user, /mob/living/silicon)) return src.attack_hand(user) @@ -452,7 +452,7 @@ user.visible_message("\red [user.name] removes the power cell from [src.name]!", "You remove the power cell.") //user << "You remove the power cell." charging = 0 - src.updateicon() + src.update_icon() return if(stat & (BROKEN|MAINT)) return @@ -477,13 +477,13 @@ break if(beenhit >= pick(3, 4) && wiresexposed != 1) wiresexposed = 1 - src.updateicon() + src.update_icon() src.visible_message("\red The [src.name]'s cover flies open, exposing the wires!") else if(wiresexposed == 1 && allcut == 0) for(var/wire in apcwirelist) cut(apcwirelist[wire]) - src.updateicon() + src.update_icon() src.visible_message("\red The [src.name]'s wires are shredded!") else beenhit += 1 @@ -824,20 +824,20 @@ operating ? ticker.mode:apcs++ : ticker.mode:apcs-- src.update() - updateicon() + update_icon() else if (href_list["cmode"]) chargemode = !chargemode if(!chargemode) charging = 0 - updateicon() + update_icon() else if (href_list["eqp"]) var/val = text2num(href_list["eqp"]) equipment = (val==1) ? 0 : val - updateicon() + update_icon() update() else if (href_list["lgt"]) @@ -845,14 +845,14 @@ lighting = (val==1) ? 0 : val - updateicon() + update_icon() update() else if (href_list["env"]) var/val = text2num(href_list["env"]) environ = (val==1) ? 0 :val - updateicon() + update_icon() update() else if( href_list["close"] ) usr << browse(null, "window=apc") @@ -889,7 +889,7 @@ else src.malfai = usr malfai << "Hack complete. The APC is now under your exclusive control." - updateicon() + update_icon() else if (href_list["occupyapc"]) malfoccupy(usr) @@ -954,7 +954,7 @@ src.cell.charge = 0 cell.corrupt() src.malfhack = 1 - updateicon() + update_icon() var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() smoke.set_up(3, 0, src.loc) smoke.attach(src) @@ -1140,10 +1140,10 @@ // update icon & area power if anything changed if(last_lt != lighting || last_eq != equipment || last_en != environ) - updateicon() + update_icon() update() else if (last_ch != charging) - updateicon() + update_icon() //src.updateDialog() src.updateDialog() @@ -1225,7 +1225,7 @@ operating = 0 if(occupant) malfvacate(1) - updateicon() + update_icon() update() // overload all the lights in this APC area diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index f9d4041cd9c..7acda3f36d6 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -41,7 +41,7 @@ powernets += NC.powernet NC.powernet.cables += NC powernet = NC.powernet - NC.powernet.nodes += src + NC.powernet.nodes[src] = src NC.mergeConnectedNetworksOnTurf() coil.use(1) @@ -489,7 +489,7 @@ merge_powernets(powernet, N.terminal.powernet) else N.terminal.powernet = powernet - powernet.nodes += N.terminal + powernet.nodes[N.terminal] = N.terminal else if(istype(AM,/obj/machinery/power)) var/obj/machinery/power/M = AM @@ -498,7 +498,7 @@ merge_powernets(powernet, M.powernet) else M.powernet = powernet - powernet.nodes += M + powernet.nodes[M] = M obj/structure/cable/proc/cableColor(var/colorC) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 0d74119f2e0..0579d079081 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -99,7 +99,7 @@ for(var/obj/machinery/power/M in machines) if(!M.powernet) continue // APCs have powernet=0 so they don't count as network nodes directly - M.powernet.nodes += M + M.powernet.nodes[M] = M // returns a list of all power-related objects (nodes, cable, junctions) in turf, @@ -274,7 +274,7 @@ if(Node && !Node.powernet) Node.powernet = PN nodes.Cut(i,i+1) - PN.nodes += Node + PN.nodes[Node] = Node continue i++ @@ -364,7 +364,7 @@ var/obj/machinery/power/Node = net2.nodes[i] if(Node) Node.powernet = net1 - net1.nodes += Node + net1.nodes[Node] = Node for(var/i=1,i<=net2.cables.len,i++) var/obj/structure/cable/Cable = net2.cables[i] @@ -382,7 +382,7 @@ if(!C || !C.powernet) return // makepowernets() //TODO: find fast way //EWWWW what are you doing!? powernet = C.powernet - powernet.nodes += src + powernet.nodes[src] = src /obj/machinery/power/proc/disconnect_from_network() if(!powernet) return diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 1d09cf7d265..7d2950c5db7 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -1,7 +1,20 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 -#define SOLAR_MAX_DIST 50 +#define SOLAR_MAX_DIST 40 #define SOLARGENRATE 1500 + +var/list/solars_list = list() + +// This will choose whether to get the solar list from the powernet or the powernet nodes, +// depending on the size of the nodes. +/obj/machinery/power/proc/get_solars_powernet() + if(!powernet) + return list() + if(solars_list.len < powernet.nodes) + return solars_list + else + return powernet.nodes + /obj/machinery/power/solar name = "solar panel" desc = "A solar electrical generator." @@ -22,15 +35,30 @@ var/turn_angle = 0 var/obj/machinery/power/solar_control/control = null -/obj/machinery/power/solar/New(var/turf/loc, var/obj/item/solar_assembly/S) +/obj/machinery/power/solar/New(var/turf/loc, var/obj/item/solar_assembly/S, var/process = 1) ..(loc) + Make(S) + connect_to_network(process) + + +/obj/machinery/power/solar/disconnect_from_network() + ..() + solars_list.Remove(src) + +/obj/machinery/power/solar/connect_to_network(var/process) + ..() + if(process) + solars_list.Add(src) + + +/obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S) if(!S) S = new /obj/item/solar_assembly(src) S.glass_type = /obj/item/stack/sheet/glass S.anchored = 1 S.loc = src update_icon() - connect_to_network() + /obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user) @@ -98,19 +126,20 @@ /obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY if(stat & BROKEN) return if(!control) return - if(obscured) return - - var/sgen = SOLARGENRATE * sunfrac - add_avail(sgen) - if(powernet && control) - if(control in powernet.nodes) //this line right here... - control.gen += sgen if(adir != ndir) adir = (360+adir+dd_range(-10,10,ndir-adir))%360 update_icon() update_solar_exposure() + if(obscured) return + + var/sgen = SOLARGENRATE * sunfrac + add_avail(sgen) + if(powernet && control) + if(powernet.nodes[control]) + control.gen += sgen + /obj/machinery/power/solar/proc/broken() stat |= BROKEN @@ -151,6 +180,9 @@ src.density = 0 +/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S) + ..(loc, S, 0) + /obj/machinery/power/solar/fake/process() . = PROCESS_KILL return @@ -257,16 +289,19 @@ initialize() connect_to_network() +/obj/machinery/power/solar_control/disconnect_from_network() + ..() + solars_list.Remove(src) + +/obj/machinery/power/solar_control/connect_to_network() + ..() + if(powernet) + solars_list.Add(src) /obj/machinery/power/solar_control/initialize() ..() if(!powernet) return - for(var/obj/machinery/power/solar/S in powernet.nodes) - if(get_dist(S, src) < SOLAR_MAX_DIST) - cdir = S.adir//The hell is this even doing? - S.control = src - update_icon() - + set_panels(cdir) /obj/machinery/power/solar_control/update_icon() if(stat & BROKEN) @@ -415,9 +450,10 @@ if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate) track = text2num(href_list["track"]) if(powernet && (track == 2)) - var/obj/machinery/power/tracker/T = locate() in powernet.nodes - if(T) - cdir = T.sun_angle + for(var/obj/machinery/power/tracker/T in get_solars_powernet()) + if(powernet.nodes[T]) + cdir = T.sun_angle + break set_panels(cdir) update_icon() @@ -427,11 +463,12 @@ /obj/machinery/power/solar_control/proc/set_panels(var/cdir) if(!powernet) return - for(var/obj/machinery/power/solar/S in powernet.nodes) - if(get_dist(S, src) < SOLAR_MAX_DIST) - if(!S.control) - S.control = src - S.ndir = cdir + for(var/obj/machinery/power/solar/S in get_solars_powernet()) + if(powernet.nodes[S]) + if(get_dist(S, src) < SOLAR_MAX_DIST) + if(!S.control) + S.control = src + S.ndir = cdir /obj/machinery/power/solar_control/power_change() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 307c592e5c2..3312ff9deee 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -11,6 +11,7 @@ anchored = 1 density = 1 directwired = 1 + use_power = 0 var/sun_angle = 0 // sun angle as set by sun datum @@ -24,6 +25,14 @@ S.loc = src connect_to_network() +/obj/machinery/power/tracker/disconnect_from_network() + ..() + solars_list.Remove(src) + +/obj/machinery/power/tracker/connect_to_network() + ..() + solars_list.Add(src) + // called by datum/sun/calc_position() as sun's angle changes /obj/machinery/power/tracker/proc/set_angle(var/angle) sun_angle = angle @@ -39,9 +48,10 @@ // currently, just update all controllers in world // ***TODO: better communication system using network if(powernet) - for(var/obj/machinery/power/solar_control/C in powernet.nodes) - if(get_dist(C, src) < SOLAR_MAX_DIST) - C.tracker_update(angle) + for(var/obj/machinery/power/solar_control/C in get_solars_powernet()) + if(powernet.nodes[C]) + if(get_dist(C, src) < SOLAR_MAX_DIST) + C.tracker_update(angle) /obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user) @@ -71,10 +81,6 @@ else stat |= NOPOWER -// override power change to do nothing since we don't care about area power -/obj/machinery/power/tracker/power_change() - return - // Tracker Electronic