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