-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
This commit is contained in:
giacomand@gmail.com
2012-12-29 07:24:42 +00:00
parent 370ab8ebf9
commit 7af60a7fb5
7 changed files with 116 additions and 66 deletions
+26 -26
View File
@@ -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
+3 -3
View File
@@ -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)
+4 -4
View File
@@ -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
+61 -24
View File
@@ -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()
+13 -7
View File
@@ -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