Power Magnets Optimization #1

Currently removed all instances of makepowernets() and update_network() (Update network just called makepowernets()) from cable.dm.

All actings regarding cables went from 0.5 to <0.08 per call.

-Added a verb in the debug panel called Make Powernets. This calls makepowernets().

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1729 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
rockdtben
2011-06-25 16:25:55 +00:00
parent 0c5529a2de
commit f0155a6b2a
3 changed files with 218 additions and 98 deletions

View File

@@ -79,6 +79,7 @@
verbs += /client/proc/modifytemperature verbs += /client/proc/modifytemperature
verbs += /client/proc/callproc verbs += /client/proc/callproc
verbs += /client/proc/Cell verbs += /client/proc/Cell
verbs += /client/proc/cmd_debug_make_powernets
verbs += /client/proc/cmd_debug_del_all verbs += /client/proc/cmd_debug_del_all
verbs += /client/proc/cmd_debug_tog_aliens verbs += /client/proc/cmd_debug_tog_aliens
verbs += /client/proc/Debug2 //debug toggle switch verbs += /client/proc/Debug2 //debug toggle switch

View File

@@ -236,7 +236,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return return
if(istype(M, /mob/living/carbon/human)) if(istype(M, /mob/living/carbon/human))
log_admin("[key_name(src)] has made [M.key] an abomination.") log_admin("[key_name(src)] has made [M.key] an abomination.")
// spawn(10) // spawn(10)
// M.make_abomination() // M.make_abomination()
@@ -296,6 +296,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
log_admin("[key_name(src)] has deleted all instances of [hsbitem].") log_admin("[key_name(src)] has deleted all instances of [hsbitem].")
message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0)
/client/proc/cmd_debug_make_powernets()
set category = "Debug"
set name = "Make Powernets"
makepowernets()
log_admin("[key_name(src)] has remade the powernet. makepowernets() called.")
message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0)
/client/proc/cmd_debug_tog_aliens() /client/proc/cmd_debug_tog_aliens()
set category = "Server" set category = "Server"
set name = "Toggle Aliens" set name = "Toggle Aliens"
@@ -361,18 +368,18 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), M.slot_r_hand) M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand) M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/smokebomb(M), M.slot_r_store) M.equip_if_possible(new /obj/item/weapon/smokebomb(M), M.slot_r_store)
if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0 if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0
M.equip_if_possible(new /obj/item/clothing/under/det(M), M.slot_w_uniform) M.equip_if_possible(new /obj/item/clothing/under/det(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes) M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/suit/det_suit(M), M.slot_wear_suit) M.equip_if_possible(new /obj/item/clothing/suit/det_suit(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/glasses/thermal/monocle(M), M.slot_glasses) M.equip_if_possible(new /obj/item/clothing/glasses/thermal/monocle(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/head/det_hat(M), M.slot_head) M.equip_if_possible(new /obj/item/clothing/head/det_hat(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/cloaking_device(M), M.slot_r_store) M.equip_if_possible(new /obj/item/weapon/cloaking_device(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/gun/projectile(M), M.slot_r_hand) M.equip_if_possible(new /obj/item/weapon/gun/projectile(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/ammo_magazine(M), M.slot_l_store) M.equip_if_possible(new /obj/item/ammo_magazine(M), M.slot_l_store)
@@ -381,13 +388,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/clothing/suit/chef(M), M.slot_wear_suit) M.equip_if_possible(new /obj/item/clothing/suit/chef(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes) M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/head/chefhat(M), M.slot_head) M.equip_if_possible(new /obj/item/clothing/head/chefhat(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/kitchen/rollingpin(M), M.slot_r_hand) M.equip_if_possible(new /obj/item/weapon/kitchen/rollingpin(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand) M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_r_store) M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_s_store) M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_s_store)
if ("tournament janitor") if ("tournament janitor")
M.equip_if_possible(new /obj/item/clothing/under/rank/janitor(M), M.slot_w_uniform) M.equip_if_possible(new /obj/item/clothing/under/rank/janitor(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes) M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
@@ -395,12 +402,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for(var/obj/item/I in backpack) for(var/obj/item/I in backpack)
del(I) del(I)
M.equip_if_possible(backpack, M.slot_back) M.equip_if_possible(backpack, M.slot_back)
M.equip_if_possible(new /obj/item/weapon/mop(M), M.slot_r_hand) M.equip_if_possible(new /obj/item/weapon/mop(M), M.slot_r_hand)
var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M) var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
bucket.reagents.add_reagent("water", 70) bucket.reagents.add_reagent("water", 70)
M.equip_if_possible(bucket, M.slot_l_hand) M.equip_if_possible(bucket, M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_r_store) M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_l_store) M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/stack/tile/steel(M), M.slot_in_backpack) M.equip_if_possible(new /obj/item/stack/tile/steel(M), M.slot_in_backpack)

View File

@@ -26,25 +26,32 @@
var/obj/cable/NC = new(T) var/obj/cable/NC = new(T)
var/color = "red" NC.cableColor(coil.color)
if(coil.color)
color = coil.color
NC.color = coil.color
switch(color)
if("red")
NC.icon = 'power_cond_red.dmi'
if("yellow")
NC.icon = 'power_cond_yellow.dmi'
if("green")
NC.icon = 'power_cond_green.dmi'
if("blue")
NC.icon = 'power_cond_blue.dmi'
NC.d1 = 0 NC.d1 = 0
NC.d2 = dirn NC.d2 = dirn
NC.add_fingerprint() NC.add_fingerprint()
NC.updateicon() NC.updateicon()
NC.update_network()
NC.mergeConnectedNetworks(NC.d2)
NC.mergeConnectedNetworksOnTurf()
if(netnum == 0 && NC.netnum == 0)
var/datum/powernet/PN = new()
PN.number = powernets.len + 1
powernets += PN
NC.netnum = PN.number
netnum = PN.number
PN.cables += NC
PN.nodes += src
powernet = PN
else if(netnum == 0)
netnum = NC.netnum
var/datum/powernet/PN = powernets[netnum]
powernet = PN
PN.nodes += src
NC.mergeConnectedNetworksOnTurf()
coil.use(1) coil.use(1)
return return
else else
@@ -297,30 +304,33 @@
var/obj/cable/C = new(F) var/obj/cable/C = new(F)
var/color_n = "red" C.cableColor(color)
if(color)
color_n = color
C.color = color_n
switch(color)
if("red")
C.icon = 'power_cond_red.dmi'
if("yellow")
C.icon = 'power_cond_yellow.dmi'
if("green")
C.icon = 'power_cond_green.dmi'
if("blue")
C.icon = 'power_cond_blue.dmi'
C.d1 = 0 C.d1 = 0
C.d2 = dirn C.d2 = dirn
C.add_fingerprint(user) C.add_fingerprint(user)
C.updateicon() C.updateicon()
C.update_network() C.mergeConnectedNetworks(C.d2)
C.mergeConnectedNetworksOnTurf()
if(C.netnum == 0)
var/counter = 1
while(counter < powernets.len + 1)
if(!powernets[counter])
C.netnum = counter
var/datum/powernet/PN = powernets[counter]
PN.cables += C
break
counter++
if(C.netnum == 0)
var/datum/powernet/PN = new()
PN.number = powernets.len + 1
powernets += PN
C.netnum = PN.number
PN.cables += C
use(1) use(1)
if (C.shock(user, 50))
if (prob(50))
new/obj/item/weapon/cable_coil(C.loc, C.d1 ? 2 : 1, C.color)
del(C)
//src.laying = 1 //src.laying = 1
//last = C //last = C
@@ -329,7 +339,6 @@
/obj/item/weapon/cable_coil/proc/cable_join(obj/cable/C, mob/user) /obj/item/weapon/cable_coil/proc/cable_join(obj/cable/C, mob/user)
var/turf/U = user.loc var/turf/U = user.loc
if(!isturf(U)) if(!isturf(U))
return return
@@ -365,39 +374,27 @@
return return
var/obj/cable/NC = new(U) var/obj/cable/NC = new(U)
NC.cableColor(color)
var/color_n = "red"
if(color)
color_n = color
NC.color = color_n
switch(color)
if("red")
NC.icon = 'power_cond_red.dmi'
if("yellow")
NC.icon = 'power_cond_yellow.dmi'
if("green")
NC.icon = 'power_cond_green.dmi'
if("blue")
NC.icon = 'power_cond_blue.dmi'
NC.d1 = 0 NC.d1 = 0
NC.d2 = fdirn NC.d2 = fdirn
NC.add_fingerprint() NC.add_fingerprint()
NC.updateicon() NC.updateicon()
NC.update_network()
NC.netnum = C.netnum
var/datum/powernet/PN = powernets[C.netnum]
PN.cables += NC
NC.mergeConnectedNetworksOnTurf()
use(1) use(1)
if (NC.shock(user, 50)) C.shock(user, 25)
if (prob(50))
new/obj/item/weapon/cable_coil(NC.loc, NC.d1 ? 2 : 1, NC.color)
del(NC)
return return
else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub
// if so, make it a full cable pointing from it's old direction to our dirn // if so, make it a full cable pointing from it's old direction to our dirn
var/nd1 = C.d2 // these will be the new directions var/nd1 = C.d2 // these will be the new directions
var/nd2 = dirn var/nd2 = dirn
if(nd1 > nd2) // swap directions to match icons/states if(nd1 > nd2) // swap directions to match icons/states
nd1 = dirn nd1 = dirn
nd2 = C.d2 nd2 = C.d2
@@ -410,48 +407,163 @@
user << "There's already a cable at that position." user << "There's already a cable at that position."
return return
C.shock(user, 25) C.shock(user, 25)
del(C)
var/obj/cable/NC = new(T)
var/color_n = "red"
if(color)
color_n = color
NC.color = color_n
switch(color)
if("red")
NC.icon = 'power_cond_red.dmi'
if("yellow")
NC.icon = 'power_cond_yellow.dmi'
if("green")
NC.icon = 'power_cond_green.dmi'
if("blue")
NC.icon = 'power_cond_blue.dmi'
NC.d1 = nd1 C.cableColor(color)
NC.d2 = nd2
NC.add_fingerprint() C.d1 = nd1
NC.updateicon() C.d2 = nd2
NC.update_network()
C.add_fingerprint()
C.updateicon()
C.mergeConnectedNetworks(C.d1)
C.mergeConnectedNetworks(C.d2)
use(1) use(1)
if (NC.shock(user, 50))
if (prob(50))
new/obj/item/weapon/cable_coil(NC.loc, NC.d1 ? 2 : 1, NC.color)
del(NC)
return return
/obj/cable/proc/mergeConnectedNetworks(var/direction)
var/turf/TB
if((d1 == direction || d2 == direction) != 1)
return
TB = get_step(src, direction)
// called when a new cable is created for(var/obj/cable/TC in TB)
// can be 1 of 3 outcomes: if(src == TC)
// 1. Isolated cable (or only connects to isolated machine) -> create new powernet continue
// 2. Joins to end or bridges loop of a single network (may also connect isolated machine) -> add to old network
// 3. Bridges gap between 2 networks -> merge the networks (must rebuild lists also)
var/fdir = (!direction)? 0 : turn(direction, 180)
if(TC.d1 == fdir || TC.d2 == fdir)
/obj/cable/proc/update_network() if(!netnum)
// easy way: do /makepowernets again var/datum/powernet/PN = powernets[TC.netnum]
makepowernets() netnum = TC.netnum
// do things more logically if this turns out to be too slow PN = powernets[netnum]
// may just do this for case 3 anyway (simpler than refreshing list) PN.cables += src
continue
if(TC.netnum != netnum)
var/datum/powernet/PN = powernets[netnum]
var/datum/powernet/TPN = powernets[TC.netnum]
var/kingNetnum = netnum
if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len)
kingNetnum = TC.netnum
var/datum/powernet/temp = PN
PN = TPN
TPN = temp
for(var/obj/cable/C in TPN.cables)
TPN.cables -= C
PN.cables += C
C.netnum = kingNetnum
for(var/obj/machinery/power/M in TPN.nodes)
if(M.netnum < 0) // APCs have netnum=-1 so they don't count as network nodes directly
continue
TPN.nodes -= M
PN.nodes += M
M.netnum = kingNetnum
M.powernet = powernets[M.netnum]
TC.netnum = kingNetnum
TPN.cables -= TC
PN.cables += TC
for(var/obj/machinery/power/M in TB)
if(!netnum)
if(!M.netnum)
continue
else
netnum = M.netnum
var/datum/powernet/PN = powernets[netnum]
PN.nodes += src
/obj/cable/proc/mergeConnectedNetworksOnTurf()
var/turf/TB
TB = loc
for(var/obj/cable/C in TB)
if(C == src)
continue
if(netnum == 0)
var/datum/powernet/PN = powernets[C.netnum]
netnum = C.netnum
PN.cables += src
continue
var/datum/powernet/PN = powernets[netnum]
var/datum/powernet/TPN = powernets[C.netnum]
var/kingNetnum = netnum
if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len)
kingNetnum = C.netnum
var/datum/powernet/temp = PN
PN = TPN
TPN = temp
TPN.cables -= C
PN.cables += C
C.netnum = kingNetnum
for(var/obj/machinery/power/M in TB)
if(M.netnum < 0)
continue
if(M.netnum == 0)
var/datum/powernet/PN = powernets[netnum]
PN.nodes += M
M.netnum = netnum
M.powernet = powernets[M.netnum]
var/datum/powernet/PN = powernets[netnum]
var/datum/powernet/TPN = powernets[M.netnum]
var/kingNetnum = netnum
if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len)
kingNetnum = M.netnum
var/datum/powernet/temp = PN
PN = TPN
TPN = temp
TPN.nodes -= M
PN.nodes += M
M.netnum = kingNetnum
M.powernet = powernets[M.netnum]
for(var/obj/machinery/power/apc/N in TB)
var/obj/machinery/power/M
M = N.terminal
if(M.netnum == 0)
if(netnum == 0)
continue
var/datum/powernet/PN = powernets[netnum]
PN.nodes += M
M.netnum = netnum
M.powernet = powernets[M.netnum]
continue
var/datum/powernet/PN = powernets[netnum]
var/datum/powernet/TPN = powernets[M.netnum]
var/kingNetnum = netnum
if(PN.cables.len + PN.nodes.len < TPN.cables.len + TPN.nodes.len)
kingNetnum = M.netnum
var/datum/powernet/temp = PN
PN = TPN
TPN = temp
TPN.nodes -= M
PN.nodes += M
M.netnum = kingNetnum
M.powernet = powernets[M.netnum]
obj/cable/proc/cableColor(var/colorC)
var/color_n = "red"
if(colorC)
color_n = colorC
color = color_n
switch(colorC)
if("red")
icon = 'power_cond_red.dmi'
if("yellow")
icon = 'power_cond_yellow.dmi'
if("green")
icon = 'power_cond_green.dmi'
if("blue")
icon = 'power_cond_blue.dmi'