From 73749028009eee7f82ac9a2607cc6364ae831aab Mon Sep 17 00:00:00 2001
From: Menshin <>
Date: Sat, 27 Feb 2016 22:44:17 +0100
Subject: [PATCH] * Cleaning field generator code * Fixes runtimes on field
shutdown
---
code/modules/admin/verbs/debug.dm | 13 +-
.../power/singularity/containment_field.dm | 6 +-
.../power/singularity/field_generator.dm | 262 ++++++++----------
3 files changed, 131 insertions(+), 150 deletions(-)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index eecfb9537d1..90a14e8d47c 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -200,7 +200,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
. += "[procname] returned an associative list:"
for(var/key in returnedlist)
. += "\n[key] = [returnedlist[key]]"
-
+
else
. += "[procname] returned a list:"
for(var/elem in returnedlist)
@@ -644,8 +644,15 @@ var/global/list/g_fancy_list_of_types = null
E.active = 1
for(var/obj/machinery/field/generator/F in machines)
- if(F.anchored)
- F.Varedit_start = 1
+ if(F.active == 0)
+ F.active = 1
+ F.state = 2
+ F.power = 250
+ F.anchored = 1
+ F.warming_up = 3
+ F.start_fields()
+ F.update_icon()
+
spawn(30)
for(var/obj/machinery/the_singularitygen/G in machines)
if(G.anchored)
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index c1bdb82a9d8..cb4d7e439f1 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -15,10 +15,8 @@
var/obj/machinery/field/generator/FG2 = null
/obj/machinery/field/containment/Destroy()
- if(FG1 && !FG1.clean_up)
- FG1.cleanup()
- if(FG2 && !FG2.clean_up)
- FG2.cleanup()
+ FG1.fields -= src
+ FG2.fields -= src
return ..()
/obj/machinery/field/containment/attack_hand(mob/user)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 008416ac9e5..47604070cbd 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -13,6 +13,15 @@ field_generator power level display
*/
#define field_generator_max_power 250
+
+#define FG_UNSECURED 0
+#define FG_SECURED 1
+#define FG_WELDED 2
+
+#define FG_OFFLINE 0
+#define FG_CHARGING 1
+#define FG_ONLINE 2
+
/obj/machinery/field/generator
name = "Field Generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
@@ -22,76 +31,51 @@ field_generator power level display
density = 1
use_power = 0
var/const/num_power_levels = 6 // Total number of power level icon has
- var/Varedit_start = 0
- var/Varpower = 0
- var/active = 0
+ var/power_level = 0
+ var/active = FG_OFFLINE
var/power = 20 // Current amount of power
- var/state = 0
+ var/state = FG_UNSECURED
var/warming_up = 0
var/list/obj/machinery/field/containment/fields
var/list/obj/machinery/field/generator/connected_gens
var/clean_up = 0
-
/obj/machinery/field/generator/update_icon()
overlays.Cut()
if(warming_up)
overlays += "+a[warming_up]"
if(fields.len)
overlays += "+on"
- // Power level indicator
- // Scale % power to % num_power_levels and truncate value
- var/level = round(num_power_levels * power / field_generator_max_power)
- // Clamp between 0 and num_power_levels for out of range power values
- level = Clamp(level, 0, num_power_levels)
- if(level)
- overlays += "+p[level]"
-
- return
+ if(power_level)
+ overlays += "+p[power_level]"
/obj/machinery/field/generator/New()
..()
fields = list()
connected_gens = list()
- return
/obj/machinery/field/generator/process()
- if(Varedit_start == 1)
- if(active == 0)
- active = 1
- state = 2
- power = field_generator_max_power
- anchored = 1
- warming_up = 3
- start_fields()
- update_icon()
- Varedit_start = 0
-
- if(src.active == 2)
+ if(active == FG_ONLINE)
calc_power()
- update_icon()
- return
-
/obj/machinery/field/generator/attack_hand(mob/user)
- if(state == 2)
+ if(state == FG_WELDED)
if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
- if(src.active >= 1)
- user << "You are unable to turn off the [src.name] once it is online!"
+ if(active >= FG_CHARGING)
+ user << "You are unable to turn off the [name] once it is online!"
return 1
else
- user.visible_message("[user.name] turns on the [src.name].", \
- "You turn on the [src.name].", \
+ user.visible_message("[user.name] turns on the [name].", \
+ "You turn on the [name].", \
"You hear heavy droning.")
turn_on()
investigate_log("activated by [user.key].","singulo")
- src.add_fingerprint(user)
+ add_fingerprint(user)
else
user << "The [src] needs to be firmly secured to the floor first!"
- return
/obj/machinery/field/generator/attackby(obj/item/W, mob/user, params)
@@ -100,54 +84,52 @@ field_generator power level display
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
- if(0)
+ if(FG_UNSECURED)
if(isinspace()) return
- state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secures [src.name] to the floor.", \
+ state = FG_SECURED
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet.")
- src.anchored = 1
- if(1)
- state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ anchored = 1
+ if(FG_SECURED)
+ state = FG_UNSECURED
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet.")
- src.anchored = 0
- if(2)
- user << "The [src.name] needs to be unwelded from the floor!"
- return
+ anchored = 0
+ if(FG_WELDED)
+ user << "The [name] needs to be unwelded from the floor!"
+
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
switch(state)
- if(0)
- user << "The [src.name] needs to be wrenched to the floor!"
- return
- if(1)
+ if(FG_UNSECURED)
+ user << "The [name] needs to be wrenched to the floor!"
+
+ if(FG_SECURED)
if (WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [name] to the floor.", \
"You start to weld \the [src] to the floor...", \
"You hear welding.")
if (do_after(user,20/W.toolspeed, target = src))
if(!src || !WT.isOn()) return
- state = 2
+ state = FG_WELDED
user << "You weld the field generator to the floor."
- else
- return
- if(2)
+
+ if(FG_WELDED)
if (WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
"You start to cut \the [src] free from the floor...", \
"You hear welding.")
if (do_after(user,20/W.toolspeed, target = src))
if(!src || !WT.isOn()) return
- state = 1
+ state = FG_SECURED
user << "You cut \the [src] free from the floor."
- else
- return
+
else
..()
@@ -164,28 +146,33 @@ field_generator power level display
/obj/machinery/field/generator/bullet_act(obj/item/projectile/Proj)
if(Proj.flag != "bullet")
- power += Proj.damage
- update_icon()
+ power = min(power + Proj.damage, field_generator_max_power)
+ check_power_level()
return 0
/obj/machinery/field/generator/Destroy()
- src.cleanup()
+ cleanup()
return ..()
+/obj/machinery/field/generator/proc/check_power_level()
+ var/new_level = round(num_power_levels * power / field_generator_max_power)
+ if(new_level != power_level)
+ power_level = new_level
+ update_icon()
/obj/machinery/field/generator/proc/turn_off()
- active = 0
+ active = FG_OFFLINE
spawn(1)
- src.cleanup()
+ cleanup()
while (warming_up>0 && !active)
sleep(50)
warming_up--
update_icon()
/obj/machinery/field/generator/proc/turn_on()
- active = 1
+ active = FG_CHARGING
spawn(1)
while (warming_up<3 && active)
sleep(50)
@@ -196,44 +183,35 @@ field_generator power level display
/obj/machinery/field/generator/proc/calc_power()
- if(Varpower)
- return 1
+ var/power_draw = 2 + fields.len
- update_icon()
- if(src.power > field_generator_max_power)
- src.power = field_generator_max_power
-
- var/power_draw = 2
- for (var/obj/machinery/field/containment/F in fields)
- if (isnull(F))
- continue
- power_draw++
if(draw_power(round(power_draw/2,1)))
+ check_power_level()
return 1
else
- visible_message("The [src.name] shuts down!", "You hear something shutting down.")
+ visible_message("The [name] shuts down!", "You hear something shutting down.")
turn_off()
investigate_log("ran out of power and deactivated","singulo")
- src.power = 0
+ power = 0
+ check_power_level()
return 0
//This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport
/obj/machinery/field/generator/proc/draw_power(draw = 0, failsafe = 0, obj/machinery/field/generator/G = null, obj/machinery/field/generator/last = null)
- if(Varpower)
- return 1
- if((G && G == src) || (failsafe >= 8))//Loopin, set fail
+ if((G && (G == src)) || (failsafe >= 8))//Loopin, set fail
return 0
else
failsafe++
- if(src.power >= draw)//We have enough power
- src.power -= draw
+
+ if(power >= draw)//We have enough power
+ power -= draw
return 1
+
else//Need more power
- draw -= src.power
- src.power = 0
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if(isnull(FG))
- continue
+ draw -= power
+ power = 0
+ for(var/CG in connected_gens)
+ var/obj/machinery/field/generator/FG = CG
if(FG == last)//We just asked you
continue
if(G)//Another gen is askin for power and we dont have it
@@ -249,7 +227,7 @@ field_generator power level display
/obj/machinery/field/generator/proc/start_fields()
- if(!src.state == 2 || !anchored)
+ if(state != FG_WELDED || !anchored)
turn_off()
return
spawn(1)
@@ -260,82 +238,72 @@ field_generator power level display
setup_field(4)
spawn(4)
setup_field(8)
- src.active = 2
+ active = FG_ONLINE
/obj/machinery/field/generator/proc/setup_field(NSEW)
- var/turf/T = src.loc
- var/obj/machinery/field/generator/G
+ var/turf/T = loc
+ if(!istype(T))
+ return 0
+
+ var/obj/machinery/field/generator/G = null
var/steps = 0
if(!NSEW)//Make sure its ran right
- return
- for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
+ return 0
+ for(var/dist in 0 to 7) // checks out to 8 tiles away for another generator
T = get_step(T, NSEW)
if(T.density)//We cant shoot a field though this
return 0
- for(var/atom/A in T.contents)
- if(ismob(A))
- continue
- if(!istype(A,/obj/machinery/field/generator))
- if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density))
- return 0
- steps += 1
+
G = locate(/obj/machinery/field/generator) in T
- if(!isnull(G))
+ if(G)
steps -= 1
if(!G.active)
return 0
break
- if(isnull(G))
- return
- T = src.loc
- for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
+
+ for(var/TC in T.contents)
+ var/atom/A = TC
+ if(ismob(A))
+ continue
+ if(A.density)
+ return 0
+
+ steps++
+
+ if(!G)
+ return 0
+
+ T = loc
+ for(var/dist in 0 to steps) // creates each field tile
var/field_dir = get_dir(T,get_step(G.loc, NSEW))
T = get_step(T, NSEW)
if(!locate(/obj/machinery/field/containment) in T)
var/obj/machinery/field/containment/CF = new/obj/machinery/field/containment()
CF.set_master(src,G)
- fields += CF
- G.fields += CF
CF.loc = T
CF.dir = field_dir
- for(var/mob/living/L in CF.loc)
+ fields += CF
+ G.fields += CF
+ for(var/mob/living/L in T)
CF.Crossed(L)
- var/listcheck = 0
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if (isnull(FG))
- continue
- if(FG == G)
- listcheck = 1
- break
- if(!listcheck)
- connected_gens.Add(G)
- listcheck = 0
- for(var/obj/machinery/field/generator/FG2 in G.connected_gens)
- if (isnull(FG2))
- continue
- if(FG2 == src)
- listcheck = 1
- break
- if(!listcheck)
- G.connected_gens.Add(src)
+
+ connected_gens |= G
+ G.connected_gens |= src
+ update_icon()
/obj/machinery/field/generator/proc/cleanup()
clean_up = 1
- for (var/obj/machinery/field/containment/F in fields)
- if (isnull(F))
- continue
+ for (var/F in fields)
qdel(F)
- fields = list()
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if (isnull(FG))
- continue
- FG.connected_gens.Remove(src)
+
+ for(var/CG in connected_gens)
+ var/obj/machinery/field/generator/FG = CG
+ FG.connected_gens -= src
if(!FG.clean_up)//Makes the other gens clean up as well
FG.cleanup()
- connected_gens.Remove(FG)
- connected_gens = list()
+ connected_gens -= FG
clean_up = 0
update_icon()
@@ -359,3 +327,11 @@ field_generator power level display
/obj/machinery/field/generator/bump_field(atom/movable/AM as mob|obj)
if(fields.len)
..()
+
+#undef FG_UNSECURED
+#undef FG_SECURED
+#undef FG_WELDED
+
+#undef FG_OFFLINE
+#undef FG_CHARGING
+#undef FG_ONLINE