From 80fcaa3cb016e12f4093545c3e9564b206d4d2af Mon Sep 17 00:00:00 2001 From: "rastaf.zero@gmail.com" Date: Mon, 27 Dec 2010 15:08:56 +0000 Subject: [PATCH] Engine: -fixed cyborgs/AI problems with emitters; -collector controller now without delay display state of singularity, beware red circle; APC repairing: -emagged APCs can be easily fixed; -blowed up and malfhacked APCs can be fixed with lot of work; --Note: malf timer will NOT slowdown due to gameplay reasons; -APC now actually use power for charging its cells; Power cells: -explosions strength now depends on charge; -in general explosions were nerfed; -power cells can lose quality in several circumstances; Food processor -now messages appears in right moments; -code rewritten, adding recipes now easy; -recipes still same; -new recipe: non-player monkey -> bucket of blood; git-svn-id: http://tgstation13.googlecode.com/svn/trunk@709 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/machinery/processor.dm | 214 +++++++++++++----------- code/game/machinery/singularity.dm | 250 +++++++++++++++-------------- code/modules/power/apc.dm | 246 ++++++++++++++++++---------- code/modules/power/cell.dm | 54 ++++++- code/modules/power/power.dm | 2 +- icons/obj/power.dmi | Bin 15734 -> 16114 bytes 6 files changed, 452 insertions(+), 314 deletions(-) diff --git a/code/game/machinery/processor.dm b/code/game/machinery/processor.dm index 080b270da73..5b7ad5d4358 100644 --- a/code/game/machinery/processor.dm +++ b/code/game/machinery/processor.dm @@ -1,105 +1,125 @@ -/obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(src.contents.len > 0) - user << "Something is already in the processing chamber." - return 0 - else - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/potato) || istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/wheat) || istype(O, /obj/item/weapon/reagent_containers/food/snacks/humanmeat) || istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeymeat)) - user.drop_item() - O.loc = src - else if(istype(O,/obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = O - if(istype(G.affecting, /mob/living/carbon/alien/larva/metroid)) - G.affecting.loc = src - user.drop_item() - else - user << "That probably won't blend." - return 0 +/datum/food_processor_process + var/input + var/output + var/time = 40 + proc/process(loc, what) + if (src.output && loc) + new src.output(loc) + if (what) + del(what) + /* objs */ + wheat + input = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat + output = /obj/item/weapon/reagent_containers/food/snacks/flour + monkeymeat + input = /obj/item/weapon/reagent_containers/food/snacks/monkeymeat + output = /obj/item/weapon/reagent_containers/food/snacks/faggot + + humanmeat + input = /obj/item/weapon/reagent_containers/food/snacks/humanmeat + output = /obj/item/weapon/reagent_containers/food/snacks/faggot + potato + input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato + output = /obj/item/weapon/reagent_containers/food/snacks/fries -/obj/machinery/processor/attack_hand(user as mob) - if(src.processing) - user << "The processor is in the process of processing." - return - for(var/obj/O in src.contents) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/wheat)) - src.processing = 1 - sleep(40) - playsound(src.loc, 'blender.ogg', 50, 1) - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] turns on \a [src].")) - del(O) - new /obj/item/weapon/reagent_containers/food/snacks/flour(src.loc) - src.processing = 0 - return - - if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeymeat)) - src.processing = 1 - sleep(40) - playsound(src.loc, 'blender.ogg', 50, 1) - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] turns on \a [src].")) - del(O) - new /obj/item/weapon/reagent_containers/food/snacks/faggot(src.loc) - src.processing = 0 - return - - if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/humanmeat)) - src.processing = 1 - sleep(40) - playsound(src.loc, 'blender.ogg', 50, 1) - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] turns on \a [src].")) - del(O) - new /obj/item/weapon/reagent_containers/food/snacks/faggot(src.loc) - processing = 0 - return - - if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/potato)) - src.processing = 1 - sleep(40) - playsound(src.loc, 'blender.ogg', 50, 1) - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] turns on \a [src].")) - del(O) - new /obj/item/weapon/reagent_containers/food/snacks/fries(src.loc) - processing = 0 - return - - - for(var/mob/O in src.contents) - if(istype(O, /mob/living/carbon/alien/larva/metroid)) - src.processing = 1 - sleep(40) - playsound(src.loc, 'blender.ogg', 50, 1) - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] turns on \a [src].")) - var/mob/dead/observer/newmob + /* mobs */ + mob + process(loc, what) + var/mob/O = what if (O.client) - newmob = new/mob/dead/observer(O) - O:client:mob = newmob - newmob:client:eye = newmob - del(O) - new /obj/item/weapon/reagent_containers/food/drinks/jar(src.loc) - src.processing = 0 - return - user << "There doesn't appear to be anything in the processing chamber." -/* -/obj/machinery/processor/attackby(obj/item/weapon/grab/G as obj, mob/user as mob) - if(istype(G.affecting, /mob/living/carbon/alien/larva/metroid)) - sleep(40) + var/mob/dead/observer/newmob = new/mob/dead/observer(O) + O.client.mob = newmob + newmob.client.eye = newmob + ..() + + + metroid + input = /mob/living/carbon/alien/larva/metroid + output = /obj/item/weapon/reagent_containers/food/drinks/jar + + monkey + process(loc, what) + var/mob/living/carbon/monkey/O = what + if (O.client) //grief-proof + O.loc = loc + O.visible_message("\blue Suddenly [O] jumps out from the processor!", \ + "You jump out from the processor", \ + "You hear chimp") + return + var/obj/item/weapon/reagent_containers/glass/bucket/bucket_of_blood = new(loc) + var/datum/reagent/blood/B = new() + B.holder = bucket_of_blood + B.volume = 70 + //set reagent data + B.data["donor"] = O + if(O.virus && O.virus.spread_type != SPECIAL) + B.data["virus"] = new O.virus.type(0) + B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0) + if(O.resistances&&O.resistances.len) + B.data["resistances"] = O.resistances.Copy() + bucket_of_blood.reagents.reagent_list += B + bucket_of_blood.reagents.update_total() + bucket_of_blood.on_reagent_change() + //bucket_of_blood.reagents.handle_reactions() //blood doesn't react + ..() + + input = /mob/living/carbon/monkey + output = null + +/obj/machinery/processor/proc/select_recipe(var/X) + for (var/Type in typesof(/datum/food_processor_process) - /datum/food_processor_process - /datum/food_processor_process/mob) + var/datum/food_processor_process/P = new Type() + if (!istype(X, P.input)) + continue + return P + return 0 + +/obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(src.processing) + user << "\red The processor is in the process of processing." + return 1 + if(src.contents.len > 0) //TODO: several items at once? several different items? + user << "\red Something is already in the processing chamber." + return 1 + var/what = O + if (istype(O, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = O + what = G.affecting + + var/datum/food_processor_process/P = select_recipe(what) + if (!P) + user << "\red That probably won't blend." + return 1 + user.visible_message("[user] put [what] into [src].", \ + "You put the [what] into [src].") + user.drop_item() + what:loc = src + return + +/obj/machinery/processor/attack_hand(var/mob/user as mob) + if(src.processing) + user << "\red The processor is in the process of processing." + return 1 + if(src.contents.len == 0) + user << "\red The processor is empty." + return 1 + for(var/O in src.contents) + var/datum/food_processor_process/P = select_recipe(O) + if (!P) + log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0 + continue + src.processing = 1 + user.visible_message("\blue [user] turns on \a [src].", \ + "You turn on \a [src].", \ + "You hear food processor") playsound(src.loc, 'blender.ogg', 50, 1) - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] turns on \a [src].")) - var/mob/dead/observer/newmob - if (G.affecting.client) - newmob = new/mob/dead/observer(G.affecting) - G.affecting:client:mob = newmob - newmob:client:eye = newmob - del(G.affecting) - del(G) - new /obj/item/weapon/reagent_containers/food/drinks/jar(src.loc) -*/ + sleep(P.time) + P.process(src.loc, O) + src.processing = 0 + src.visible_message("\blue \the [src] finished processing.", \ + "You hear food processor stop") diff --git a/code/game/machinery/singularity.dm b/code/game/machinery/singularity.dm index 9a4908f84f4..25297b5e833 100644 --- a/code/game/machinery/singularity.dm +++ b/code/game/machinery/singularity.dm @@ -5,6 +5,8 @@ tbh this could likely be better and I did not use all that many comments on it. However people seem to like it for some reason. *///////////////////////////////////////////////// +#define collector_control_range 12 + /////SINGULARITY SPAWNER /obj/machinery/the_singularitygen/ name = "Gravitational Singularity Generator" @@ -73,6 +75,7 @@ However people seem to like it for some reason. if(Ti) src.Dtime = Ti ..() + notify_collector_controller() /obj/machinery/the_singularity/attack_hand(mob/user as mob) return 1 @@ -83,12 +86,17 @@ However people seem to like it for some reason. /obj/machinery/the_singularity/ex_act(severity) switch(severity) if(1.0) - del(src) //TODO: some animation + del(src) return if(2.0 to 3.0) //no way return return +/obj/machinery/the_singularity/Del() + //TODO: some animation + notify_collector_controller() + ..() + /obj/machinery/the_singularity/process() eat() @@ -113,6 +121,7 @@ However people seem to like it for some reason. if ( is_surrounded && active ) src.active = 0 src.dieot = 0 + notify_collector_controller() spawn(50) if (!active) grav_pull = 6 @@ -121,12 +130,18 @@ However people seem to like it for some reason. src.active = 1 src.dieot = 1 grav_pull = 8 + notify_collector_controller() if(active == 1) move() spawn(5) move() +/obj/machinery/the_singularity/proc/notify_collector_controller() + var/oldsrc = src + src = 0 //for spawn() working even after Del(), see byond documentation about sleep() -rastaf0 + for(var/obj/machinery/power/collector_control/myCC in orange(collector_control_range,oldsrc)) + spawn() myCC.updatecons() /obj/machinery/the_singularity var/global/list/uneatable = list(\ @@ -287,6 +302,7 @@ However people seem to like it for some reason. new/obj/item/weapon/tile (X) X:break_tile_to_plating() else + X:break_tile() else if(istype(X,/turf/simulated/wall)) if (istype(X,/turf/simulated/wall/r_wall)) @@ -566,51 +582,30 @@ However people seem to like it for some reason. icon_state = "Emitter" /obj/machinery/emitter/attack_hand(mob/user as mob) - if (..()) - return if(state == 3) - if(!src.locked) + if(!src.locked || istype(user, /mob/living/silicon)) src.add_fingerprint(user) if(src.active==1) src.active = 0 - user << "You turn off the emitter." + user << "You turn off the [src]." else src.active = 1 - user << "You turn on the emitter." + user << "You turn on the [src]." src.shot_number = 0 src.fire_delay = 100 update_icon() else user << "The controls are locked!" else - user << "The emitter needs to be firmly secured to the floor first." + user << "The [src] needs to be firmly secured to the floor first." return 1 - -/obj/machinery/emitter/attack_ai(mob/user as mob) - if (..()) - return - if(state == 3) - src.add_fingerprint(user) - if(src.active==1) - src.active = 0 - user << "You turn off the emitter." - else - src.active = 1 - user << "You turn on the emitter." - src.shot_number = 0 - src.fire_delay = 100 - update_icon() - else - user << "The emitter needs to be firmly secured to the floor first." - - /obj/machinery/emitter/process() if(stat & (NOPOWER|BROKEN)) return - if(!src.state == 3) + if(!src.state == 3 || !anchored) src.active = 0 return @@ -661,7 +656,7 @@ However people seem to like it for some reason. /obj/machinery/emitter/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) if(active) - user << "\red Turn off the emitter first." + user << "\red Turn off the [src] first." return 1 else if(state == 0) @@ -685,10 +680,10 @@ However people seem to like it for some reason. else if(istype(W, /obj/item/weapon/weldingtool) && W:welding) if (state == 0) - user << "\red The emitter needs to be wrenched to the floor first." + user << "\red The [src] needs to be wrenched to the floor first." return 1 - if (W:get_fuel() < 1) + if (W:get_fuel() < 2) //weldingtool always uses 1 additional unit of fuel user << "\blue You need more welding fuel to complete this task." return 1 W:use_fuel(1) @@ -697,21 +692,21 @@ However people seem to like it for some reason. if(state == 1) user.visible_message("[user.name] start to weld [src.name] to the floor.", \ - "You start to weld the emitter to the floor.", \ + "You start to weld the [src] to the floor.", \ "You hear welding") if (do_after(user,20)) state = 3 - user << "You weld the emitter to the floor." + user << "You weld the [src] to the floor." else return 1 else if(state == 3) user.visible_message("[user.name] start to cut [src.name] to the floor.", \ - "You start to cut the emitter free from the floor.", \ + "You start to cut the [src] free from the floor.", \ "You hear welding") if (do_after(user,20)) state = 1 - user << "You cut the emitter free from the floor." + user << "You cut the [src] free from the floor." else return 1 @@ -776,20 +771,34 @@ However people seem to like it for some reason. icon_state = "ca" flick("ca_deactive", src) +/obj/machinery/power/collector_array/proc/eject() + var/obj/item/weapon/tank/plasma/Z = src.P + Z.loc = get_turf(src) + Z.layer = initial(Z.layer) + src.P = null + if (src.active) + src.active = 0 + updateicon_off() + else + updateicon() + if (CU) + CU.updatecons() + /obj/machinery/power/collector_array/power_change() ..() updateicon() /obj/machinery/power/collector_array/process() - - if(P) - if(P.air_contents.toxins <= 0) + if(src.active == 1) + if(P) + if(P.air_contents.toxins <= 0) + P.air_contents.toxins = 0 + src.active = 0 + updateicon_off() + else src.active = 0 updateicon_off() - else if(src.active == 1) - src.active = 0 - updateicon_off() - ..() + //use_power called from collector_array/process /obj/machinery/power/collector_array/attack_hand(mob/user as mob) if (..()) @@ -838,17 +847,7 @@ However people seem to like it for some reason. else if(istype(W, /obj/item/weapon/crowbar)) if(!P) return 1 - var/obj/item/weapon/tank/plasma/Z = src.P - Z.loc = get_turf(src) - Z.layer = initial(Z.layer) - src.P = null - if (src.active) - src.active = 0 - updateicon_off() - else - updateicon() - if (CU) - CU.updatecons() + eject() else if(istype(W, /obj/item/weapon/wrench)) if(active) @@ -866,8 +865,8 @@ However people seem to like it for some reason. user.visible_message("[user.name] unsecure [src.name] reinforcing bolts to the floor.", \ "You undo the external reinforcing bolts.", \ "You hear ratchet") - if (CU) - CU.updatecons() + for(var/obj/machinery/power/collector_control/myCC in orange(1,src)) + myCC.updatecons() else user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ @@ -878,11 +877,14 @@ However people seem to like it for some reason. /obj/machinery/power/collector_array/ex_act(severity) switch(severity) if(2.0 to 3.0) - var/obj/item/weapon/tank/plasma/Z = src.P - Z.loc = get_turf(src) - Z.layer = initial(Z.layer) - src.P = null + eject() return ..() + +/obj/machinery/power/collector_array/Del() + . = ..() + for(var/obj/machinery/power/collector_control/myCC in orange(1,src)) + myCC.updatecons() + ////////////CONTROL UNIT /obj/machinery/power/collector_control @@ -921,14 +923,19 @@ However people seem to like it for some reason. /obj/machinery/power/collector_control/proc/updatecons() S = list() - for(var/obj/machinery/the_singularity/myS in orange(12,src)) + for(var/obj/machinery/the_singularity/myS in orange(collector_control_range,src)) S += myS - for (var/ca_dir in cardinal) + for (var/ca_dir in list( WEST, EAST, NORTH, SOUTH ) /* cardinal*/ ) var/obj/machinery/power/collector_array/newCA = locate() in get_step(src,ca_dir) if (isnull(newCA)) continue - if (!newCA.anchored) + if (!isnull(newCA.CU) && newCA.CU != src) + var/n = CA.Find(newCA) + if (n) + CA[n] = null + continue + if (!newCA.anchored || (!isnull(newCA.CU) && newCA.CU != src)) var/n = CA.Find(newCA) if (n) CA[n] = null @@ -947,12 +954,14 @@ However people seem to like it for some reason. return overlays += image('singularity.dmi', "cu on") var/err = 0 - for (var/i = 1, ((i<= CA.len) && (i<=4)), i++) + for (var/i = 1, i <= CA.len, i++) var/obj/machinery/power/collector_array/myCA = CA[i] if(myCA) if (myCA.P) if(myCA.active) overlays += image('singularity.dmi', "cu [i] on") + if (myCA.P.air_contents.toxins <= 0) + err = 1 else err = 1 if(err) @@ -962,7 +971,7 @@ However people seem to like it for some reason. overlays += image('singularity.dmi', "cu sing") break for (var/obj/machinery/the_singularity/myS in S) - if(myS && !myS.active) + if(myS && myS.active) overlays += image('singularity.dmi', "cu conterr") break @@ -977,31 +986,30 @@ However people seem to like it for some reason. /obj/machinery/power/collector_control/process() if(stat & (NOPOWER|BROKEN)) return - if(src.active == 1) - var/power_a = 0 - var/power_s = 0 - var/power_p = 0 + if(!active) + return + var/power_a = 0 + var/power_s = 0 + var/power_p = 0 - for (var/obj/machinery/the_singularity/myS in S) - if(!isnull(myS)) - power_s += myS.energy + for (var/obj/machinery/the_singularity/myS in S) + if(!isnull(myS)) + power_s += myS.energy - for (var/i = 1, i<= CA.len, i++) - var/obj/machinery/power/collector_array/myCA = CA[i] - if (!myCA) - continue - var/obj/item/weapon/tank/plasma/myP = myCA.P - if(myP) - if (myCA.active) - myCA.use_power(250) - power_p += myP.air_contents.toxins - myP.air_contents.toxins -= 0.001 + for (var/i = 1, i<= CA.len, i++) + var/obj/machinery/power/collector_array/myCA = CA[i] + if (!myCA) + continue + var/obj/item/weapon/tank/plasma/myP = myCA.P + if (myCA.active && myP) + myCA.use_power(250) + power_p += myP.air_contents.toxins + myP.air_contents.toxins -= 0.001 - power_a = power_p*power_s*50 - src.lastpower = power_a - add_avail(power_a) - use_power(250) - ..() + power_a = power_p*power_s*50 + src.lastpower = power_a + add_avail(power_a) + use_power(250) /obj/machinery/power/collector_control/attack_hand(mob/user as mob) @@ -1013,14 +1021,14 @@ However people seem to like it for some reason. return 1 src.active = !src.active if(!src.active) - user << "You turn off the collector control." + user << "You turn off the [src]." src.lastpower = 0 updateicon() if(src.active) - user << "You turn on the collector control." + user << "You turn on the [src]." updatecons() else - user << "\red The collector control needs to be secured to the floor first." + user << "\red The [src] needs to be secured to the floor first." return 1 /obj/machinery/power/collector_control/attackby(obj/item/W, mob/user) @@ -1040,7 +1048,7 @@ However people seem to like it for some reason. connect_to_network() else user.visible_message("[user.name] unsecure [src.name] to the floor.", \ - "You undo the collector control securing bolts.", \ + "You undo the [src] securing bolts.", \ "You hear ratchet") disconnect_from_network() else @@ -1050,7 +1058,7 @@ However people seem to like it for some reason. src.add_fingerprint(user) /////FIELD GEN - +#define field_generator_max_power 250 /obj/machinery/field_generator name = "Field Generator" desc = "Projects an energy field when active" @@ -1063,7 +1071,6 @@ However people seem to like it for some reason. var/Varpower = 0 var/active = 0 var/power = 20 - var/max_power = 250 var/state = 0 //var/steps = 0 //var/last_check = 0 @@ -1081,9 +1088,9 @@ However people seem to like it for some reason. return var/level = 3 switch (power) - if(0 to 40) + if(0 to 60) level = 1 - if(41 to 220) + if(61 to 220) level = 2 if(221 to INFINITY) level = 3 @@ -1092,9 +1099,16 @@ However people seem to like it for some reason. powerlevel = level icon_state = "Field_Gen +a[powerlevel]" +/obj/machinery/field_generator/proc/turn_off() + src.active = 0 + spawn(1) + src.cleanup() + update_icon() + /obj/machinery/field_generator/proc/turn_on() src.active = 1 warming_up = 1 + powerlevel = 0 spawn(1) while (warming_up<3 && active) sleep(50) @@ -1104,36 +1118,23 @@ However people seem to like it for some reason. /obj/machinery/field_generator/attack_hand(mob/user as mob) if(state == 3) - if(!src.locked) + if(!src.locked || istype(user, /mob/living/silicon)) if(src.active >= 1) // src.active = 0 // icon_state = "Field_Gen" - user << "You are unable to turn off the field generator, wait till it powers down." + user << "You are unable to turn off the [src]r, wait till it powers down." // src.cleanup() return 1 else user.visible_message("[user.name] turn on [src.name]", \ - "You turn on the field generator.", \ + "You turn on the [src].", \ "You hear heavy droning") turn_on() src.add_fingerprint(user) else user << "The controls are locked!" else - user << "The field generator needs to be firmly secured to the floor first." - -/obj/machinery/field_generator/attack_ai(mob/user as mob) - if(state == 3) - if(src.active >= 1) - user << "You are unable to turn off the field generator, wait till it powers down." - else - user.visible_message("[user.name] turn on [src.name]", \ - "You turn on the field generator.", \ - "You hear heavy droning") - turn_on() - src.add_fingerprint(user) - else - user << "The field generator needs to be firmly secured to the floor first." + user << "The [src] needs to be firmly secured to the floor first." /obj/machinery/field_generator/New() ..() @@ -1146,13 +1147,14 @@ However people seem to like it for some reason. if(src.active == 0) src.active = 1 src.state = 3 - src.power = 250 + src.power = field_generator_max_power src.anchored = 1 + src.warming_up = 1 Varedit_start = 0 if(src.active == 1) - if(!src.state == 3) - src.active = 0 + if(!src.state == 3 || !anchored) + turn_off() return spawn(1) setup_field(1) @@ -1165,17 +1167,16 @@ However people seem to like it for some reason. src.active = 2 if(src.power < 0) src.power = 0 - if(src.power > src.max_power) - src.power = src.max_power + if(src.power > field_generator_max_power) + src.power = field_generator_max_power if(src.active >= 1) src.power -= 1 if(Varpower == 0) if(src.power <= 0) for(var/mob/M in viewers(src)) M.show_message("\red The [src.name] shuts down due to lack of power!") - src.active = 0 - spawn(1) - src.cleanup() + turn_off() + return update_icon() /obj/machinery/field_generator/proc/setup_field(var/NSEW) @@ -1214,7 +1215,7 @@ However people seem to like it for some reason. /obj/machinery/field_generator/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench) && state!=3) if(active) - user << "Turn off the field generator first." + user << "Turn off the [src] first." return 1 if(state == 0) @@ -1237,7 +1238,7 @@ However people seem to like it for some reason. if(state == 0) user << "\red The [src.name] needs to be wrenched to the floor first." return 1 - if (W:get_fuel() < 1) + if (W:get_fuel() < 2) user << "\blue You need more welding fuel to complete this task." return 1 W:use_fuel(1) @@ -1246,7 +1247,7 @@ However people seem to like it for some reason. if(state == 1) user.visible_message("[user.name] start to weld [src.name] to the floor.", \ - "You start to weld the field generator to the floor.", \ + "You start to weld the [src] to the floor.", \ "You hear welding") if (do_after(user,20)) state = 3 @@ -1256,11 +1257,11 @@ However people seem to like it for some reason. else if(state == 3) user.visible_message("[user.name] start to cut [src.name] free from the floor.", \ - "You start to cut the field generator free from the floor.", \ + "You start to cut the [src] free from the floor.", \ "You hear welding") if (do_after(user,20)) state = 1 - user << "You cut the field generator free from the floor." + user << "You cut the [src] free from the floor." else return 1 @@ -1302,7 +1303,8 @@ However people seem to like it for some reason. if (isnull(F)) continue G = (F.gen_primary == src) ? F.gen_secondary : F.gen_primary - G.fields -= F + if (G) + G.fields -= F del(F) fields = list() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ee14675e4e8..c98bd14d6b2 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -25,7 +25,7 @@ var/obj/item/weapon/cell/cell var/start_charge = 90 // initial cell charge % var/cell_type = 2500 // 0=no cell, 1=regular, 2=high-cap (x5) <- old, now it's just 0=no cell, otherwise dictate cellcapacity by changing this value. 1 used to be 1000, 2 was 2500 - var/opened = 0 + var/opened = 0 //0=closed, 1=opened, 2=cover removed var/shorted = 0 var/lighting = 3 var/equipment = 3 @@ -44,9 +44,9 @@ var/lastused_environ = 0 var/lastused_total = 0 var/main_status = 0 - var/light_consumption = 0 - var/equip_consumption = 0 - var/environ_consumption = 0 + var/light_consumption = 0 //not used + var/equip_consumption = 0 //not used + var/environ_consumption = 0 //not used var/emagged = 0 var/wiresexposed = 0 var/apcwires = 15 @@ -78,22 +78,24 @@ return apcwires /obj/machinery/power/apc/updateUsrDialog() + if (stat & (BROKEN|MAINT)) + return var/list/nearby = viewers(1, src) - if (!(stat & (BROKEN|MAINT))) // unbroken - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - src.interact(M) + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + src.interact(M) if (istype(usr, /mob/living/silicon)) if (!(usr in nearby)) if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. src.interact(usr) /obj/machinery/power/apc/updateDialog() - if(!(stat & BROKEN|MAINT)) // unbroken - var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) - if (M.client && M.machine == src) - src.interact(M) + if (stat & (BROKEN|MAINT)) + return + var/list/nearby = viewers(1, src) + for(var/mob/M in nearby) + if (M.client && M.machine == src) + src.interact(M) AutoUpdateAI(src) /obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) @@ -154,14 +156,14 @@ /obj/machinery/power/apc/examine() set src in oview(1) - if(usr && !usr.stat) + if(usr /*&& !usr.stat*/) usr << "A control terminal for the area electrical systems." if(stat & BROKEN) usr << "Looks broken." return if(opened) if(has_electronics && terminal) - usr << "The cover is open and the power cell is [ cell ? "installed" : "missing"]." + usr << "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." else if (!has_electronics && terminal) usr << "There are some wires but no any electronics." else if (has_electronics && !terminal) @@ -171,7 +173,9 @@ else if (stat & MAINT) - usr << "The cover is closed. Something wrong with this: it's doesn't work." + usr << "The cover is closed. Something wrong with it: it's doesn't work." + else if (emagged || malfhack) + usr << "The cover is broken. It's may be hard to force it open." else usr << "The cover is closed." @@ -180,11 +184,19 @@ // also add overlays for indicator lights /obj/machinery/power/apc/proc/updateicon() if(opened) - if (stat & MAINT) - icon_state = "apcmaint" - else - icon_state = "[ cell ? "apc2" : "apc1" ]" // if opened, show cell if it's inserted - src.overlays = null // also delete all overlays + var/basestate = "apc[ cell ? "2" : "1" ]" // if opened, show cell if it's inserted + if (opened==1) + if (stat & MAINT) + icon_state = "apcmaint" //disassembled APC cannot hold cell + else + icon_state = basestate + else if (opened == 2) + if ((stat & BROKEN) || malfhack ) + icon_state = "[basestate]-b-nocover" + else /* if (emagged)*/ + icon_state = "[basestate]-nocover" + src.overlays = null // also delete all overlays + return else if(emagged || malfhack) icon_state = "apcemag" src.overlays = null @@ -193,6 +205,10 @@ icon_state = "apcewires" src.overlays = null return + else if (stat & BROKEN) + icon_state = "apc-b" + src.overlays = null + return else icon_state = "apc0" @@ -211,35 +227,44 @@ //attack with an item - open/close cover, insert cell, or (un)lock interface -/obj/machinery/power/apc/attackby(obj/item/weapon/W, mob/user) +/obj/machinery/power/apc/attackby(obj/item/W, mob/user) - if(stat & BROKEN) return //TODO: repairing if (istype(user, /mob/living/silicon)) return src.attack_hand(user) - if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover - if(opened) - if (!terminal && has_electronics==1) - playsound(src.loc, 'Crowbar.ogg', 50, 1) - user << "You trying to remove the power control board..." - if(do_after(user, 50)) - has_electronics = 0 + if (istype(W, /obj/item/weapon/crowbar) && opened) + if (has_electronics==1) + if (terminal) + user << "\red Disconnect wires first." + return + playsound(src.loc, 'Crowbar.ogg', 50, 1) + user << "You trying to remove the power control board..." + if(do_after(user, 50)) + has_electronics = 0 + if ((stat & BROKEN) || malfhack) + user.visible_message(\ + "\red [user.name] has broken the power control board inside [src.name]!",\ + "You broke the charred power control board and remove remains.", + "You hear crack") + //ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 + else user.visible_message(\ "\red [user.name] has removed the power control board from [src.name]!",\ "You remove the power control board.") - new /obj/item/weapon/module/power_control(loc) - else - opened = 0 - updateicon() + else if (opened!=2) //cover isn't removed + opened = 0 + updateicon() + 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 - if(coverlocked) - user << "The cover is locked and cannot be opened." - else - opened = 1 - updateicon() + opened = 1 + updateicon() 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." + return else if (stat & MAINT) user << "\red There is no any connector for your power cell." @@ -255,9 +280,11 @@ else if (istype(W, /obj/item/weapon/screwdriver)) // haxing if(opened) if (cell) - user << "\red Close the APC first" //Less hints more mistery! + user << "\red Close the APC first." //Less hints more mystery! + return else if (!has_electronics || !terminal) user << "\red There is nothing to secure." + return else if (has_electronics==1) has_electronics = 2 @@ -270,7 +297,6 @@ playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "You unfasten the electronics." updateicon() - else if(emagged || malfhack) user << "The interface is broken" else @@ -280,7 +306,7 @@ 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 || malfhack) - user << "The interface is broken" + user << "The interface is broken." else if(opened) user << "You must close the cover to swipe an ID card." else if(wiresexposed) @@ -303,37 +329,35 @@ user << "Nothing happens." else flick("apc-spark", src) - sleep(6) - - if(prob(50)) - emagged = 1 - locked = 0 - user << "You emag the APC interface." - updateicon() - else - user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." + if (do_after(user,6)) + if(prob(50)) + emagged = 1 + locked = 0 + user << "You emag the APC interface." + updateicon() + 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) if (src.loc:intact) user << "\red You must remove the plating first." return var/obj/item/weapon/cable_coil/C = W - if(C.amount >= 10) - user << "You start adding cables to the APC frame..." - playsound(src.loc, 'Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - var/turf/T = get_turf_loc(src) - var/obj/cable/N = T.get_cable_node() - if (N.electrocute(usr, 50, N.netnum)) - return - C.amount -= 10 - if(!C.amount) del(C) - user.visible_message(\ - "\red [user.name] has added cables to the APC frame!",\ - "You add cables to the APC frame.") - make_terminal() - terminal.connect_to_network() - else + if(C.amount < 10) user << "\red You need more wires." + return + user << "You start adding cables to the APC frame..." + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + if(do_after(user, 20) && C.amount >= 10) + var/turf/T = get_turf_loc(src) + var/obj/cable/N = T.get_cable_node() + if (N && N.electrocute(usr, 50, N.netnum)) + return + C.use(10) + user.visible_message(\ + "\red [user.name] has added cables to the APC frame!",\ + "You add cables to the APC frame.") + make_terminal() + terminal.connect_to_network() else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) if (src.loc:intact) user << "\red You must remove the plating first." @@ -343,16 +367,15 @@ if(do_after(user, 50)) if (terminal.electrocute(usr, 50, terminal.netnum)) return - var/obj/item/weapon/cable_coil/C = new /obj/item/weapon/cable_coil(loc) - C.amount = 10 + new /obj/item/weapon/cable_coil(loc,10) user.visible_message(\ "\red [user.name] cut cables and dismantled the power terminal.",\ "You cut cables and dismantle the power terminal.") del(terminal) - else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0) + else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) user << "You trying to insert the power control board into the frame..." playsound(src.loc, 'Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) + if(do_after(user, 10)) has_electronics = 1 user << "You place the power control board inside the frame." del(W) @@ -361,11 +384,11 @@ user << "\blue You need more welding fuel to complete this task." return user << "You start welding APC frame..." - W:use_fuel(3) + W:use_fuel(2) W:eyecheck(user) playsound(src.loc, 'Welder.ogg', 50, 1) if(do_after(user, 50)) - if (emagged || malfhack) + if (emagged || malfhack || (stat & BROKEN) || opened==2) new /obj/item/weapon/sheet/metal(loc) user.visible_message(\ "\red [src] has been cut apart by [user.name] with the weldingtool.",\ @@ -378,18 +401,52 @@ "You cut APC frame from the wall.",\ "\red You hear welding.") del(src) - - -/obj/machinery/power/apc/attack_ai(mob/user) - return src.attack_hand(user) + else if (istype(W, /obj/item/apc_frame) && opened && emagged) + emagged = 0 + if (opened==2) + opened = 1 + user.visible_message(\ + "\red [user.name] has replace the damaged APC frontal panel with new one.",\ + "You replace the damaged APC frontal panel with new one.") + del(W) + updateicon() + else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack)) + if (has_electronics) + user << "You cannot repair this heavy damaged APC until broken electronics still inside." + return + user << "You begin to replace the damaged APC frame..." + if(do_after(user, 50)) + user.visible_message(\ + "\red [user.name] has replace the damaged APC frame with new one.",\ + "You replace the damaged APC frame with new one.") + del(W) + stat &= ~BROKEN + malfai = null + malfhack = 0 + if (opened==2) + opened = 1 + updateicon() + else + if ( ((stat & BROKEN) || malfhack) \ + && !opened \ + && W.force >= 5 \ + && W.w_class >= 3.0 \ + && !istype(W, /obj/item/weapon/gun) \ + && prob(10) ) + opened = 2 + 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() + else + user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ + "\red You hit the [src.name] with your [W.name]!", \ + "You hear bang") // attack with hand - remove cell (if cover open) or interact with the APC /obj/machinery/power/apc/attack_hand(mob/user) - add_fingerprint(user) - - if(stat & (BROKEN|MAINT)) return if(opened && (!istype(user, /mob/living/silicon))) if(cell) cell.loc = usr @@ -409,6 +466,7 @@ src.updateicon() else + if(stat & (BROKEN|MAINT)) return // do APC interaction src.interact(user) @@ -454,7 +512,7 @@ onclose(user, "apcwires") user.machine = src - var/t = "Area Power Controller ([area.name])
" + var/t = "[area.name] APCArea Power Controller ([area.name])
" if(locked && (!istype(user, /mob/living/silicon))) t += "(Swipe ID card to unlock inteface.)
" @@ -551,7 +609,7 @@ t += "

Close" - t += "
" + t += "
" user << browse(t, "window=apc") onclose(user, "apc") return @@ -825,6 +883,7 @@ if (src.cell) if (src.cell.charge > 0) src.cell.charge = 0 + cell.corrupt() src.malfhack = 1 malfai << "Hack complete. The APC is now under your exclusive control. Discharging cell to fuse interface." updateicon() @@ -843,9 +902,9 @@ else malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to lack of cell do discharge." - return src.updateUsrDialog() + return else usr << browse(null, "window=apc") @@ -972,9 +1031,13 @@ if(chargemode && charging == 1 && operating) if(excess > 0) // check to make sure we have enough to charge // Max charge is perapc share, capped to cell capacity, or % per second constant (Whichever is smallest) - var/ch = min(perapc, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) +/* var/ch = min(perapc, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) add_load(ch) // Removes the power we're taking from the grid cell.give(ch) // actually recharge the cell +*/ + var/ch = min(perapc*CELLRATE, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) + add_load(ch/CELLRATE) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell else charging = 0 // stop charging @@ -1016,7 +1079,8 @@ updateicon() update() - src.updateDialog() + //src.updateDialog() + src.updateUsrDialog() // val 0=off, 1=off(auto) 2=on 3=on(auto) // on 0=off, 1=on, 2=autooff @@ -1051,26 +1115,32 @@ switch(severity) if(1.0) //set_broken() //now Del() do what we need + if (cell) + cell.ex_act(1.0) // more lags woohoo del(src) return if(2.0) if (prob(50)) set_broken() + if (cell && prob(50)) + cell.ex_act(2.0) if(3.0) if (prob(25)) set_broken() + if (cell && prob(25)) + cell.ex_act(3.0) return /obj/machinery/power/apc/blob_act() if (prob(75)) set_broken() + if (cell && prob(5)) + cell.blob_act() /obj/machinery/power/apc/proc/set_broken() stat |= BROKEN - icon_state = "apc-b" - overlays = null - operating = 0 + updateicon() update() // overload all the lights in this APC area diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 649a22070c1..0591a2707a2 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -47,7 +47,7 @@ /obj/item/weapon/cell/examine() set src in view(1) - if(usr && !usr.stat) + if(usr /*&& !usr.stat*/) if(maxcharge <= 2500) usr << "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%." else @@ -80,8 +80,54 @@ /obj/item/weapon/cell/proc/explode() var/turf/T = get_turf(src.loc) - - explosion(T, 0, 1, 2, 2) //TODO: involve charge +/* + * 1000-cell explosion(T, -1, 0, 1, 1) + * 2500-cell explosion(T, -1, 0, 1, 1) + * 10000-cell explosion(T, -1, 1, 3, 3) + * 15000-cell explosion(T, -1, 2, 4, 4) + * */ + if (charge==0) + return + var/devastation_range = -1 //round(charge/11000) + var/heavy_impact_range = round(sqrt(charge)/60) + var/light_impact_range = round(sqrt(charge)/30) + var/flash_range = light_impact_range + if (light_impact_range==0) + rigged = 0 + corrupt() + return + //explosion(T, 0, 1, 2, 2) + explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) spawn(1) - del(src) \ No newline at end of file + del(src) + +/obj/item/weapon/cell/proc/corrupt() + charge /= 2 + maxcharge /= 2 + if (prob(10)) + rigged = 1 //broken batterys are dangerous + +/obj/item/weapon/cell/ex_act(severity) + + switch(severity) + if(1.0) + del(src) + return + if(2.0) + if (prob(50)) + del(src) + return + if (prob(50)) + corrupt() + if(3.0) + if (prob(25)) + del(src) + return + if (prob(25)) + corrupt() + return + +/obj/item/weapon/cell/blob_act() + if(prob(75)) + explode() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index b059b2af2df..50433f0c6a6 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -359,7 +359,7 @@ /obj/machinery/power/proc/connect_to_network() var/turf/T = src.loc var/obj/cable/C = T.get_cable_node() - if (!C.netnum) + if (!C || !C.netnum) return makepowernets() //TODO: find fast way diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 205989a0396fea38ae69c23c10979b8678a9d76a..55825b3d51c836fc889057249fcad7e6d11986d3 100644 GIT binary patch literal 16114 zcmb8W1yoew-!3{shcrmH(nxnBB@zM>QbP$ymvjr#AO;OXcOwlmgn&qQx6<7V4BXBC z+;6RO@3+o6=dhR=*n9Kx)~}xDd86KFDC6N!;ebFOyjLm;+8_|v?D2(#0bB_;&r<_| zP>6ir8h9wYceix=;NtPY*$D*l&iIk6?zF-CBz)$QJ5Yyeqt70QKfHjHXg{}W>O?Gnex za7z)vSmcs*BL@4@mBZ$+T*`O=54W@bruR#&Tl4US4=Sbxu^C@G6XAi73v)-!=9@cz zJeiZ;a&U{4`iP(Y^tnGP>xK~82|Dl&;hoL88yhQjj+L(E8f{&TXT@nt=iLU$jW+~C zDgQ3i1>YS&I=FETWk*k9EWlbbC0nL;x?Eaq_yyvp6_=ve`?2BQg%gFESEW(cn0`AM zPMj)RyuZ;Q`WVAInqq@LS6A^f{)*523+4yfplX{#@Vdsb=>=Bd9iCeP!xbhicF;OG zAx#!XM=XafV$*Ok9RWYT!?|YRD3B&o)Y$3wHgo=_tj!;JpHg3dFt4zsdS4^t1t&Q9)1-wI4j zENMa$&j%Nd#I~fO3riWo2(^7HzXpJT&$7{AY(@oQK{I)*L^QkkEEmzSYJLz^>G zQ@W#K!%!JW4I=D2N+APB<@;pV`3cV+jg+ z`YYXmDCLOHwY&7vclaQ)ZI{hke%l38a@Rd6Q6Nu0!3Kd$PRCn<--hw=!4+sl*eNWP6OAU+iz#!FXke&%MeaF zL_=Ij0rF5HiS`LV7Q;}cm&?&-89p0CaXhI zDk8myh-zk)&Yu5J(qfPF!iRrKpZRl}CnI@|KkeB+Aro{jX=rGuTBvVpV_XwSa}-{} zes@{X$S;0XY1|zAjWx*L0h*Tfhj&zUn)Ml53Th>TDiK(MPe=$I^af;h?;jyWYU!?{ zqr))6D=Hc}a}m?Ix|)5kG{YxUa5S;BL>mb#>6;92UqDNA=)VonU&W3nggs&1*ga`nnl0jku}d&!vGwJe_@)?QMT+Bvsv_fit@u;Nc7EUSlqlGCyw_kO?Mf4} z&o_Mud}ZIZntOZC)_W2n!qC8YO@oQ=hBy;dWO3~b?a{YMhy}TNUt%$S%?6VwTPZ_p zFRPNuft&J?&q&pE-$PIt!zQ1_{vX=O|H6F!+vPA;RK3rQ_J58& zxr<{M!@d}HO_ctg|3hnB5KJiVpIfU<$kU#`R*;;pxcbLaSEr%u^!)uwh_Ouh8p3=T zOtem7O!Nt`R;_nLyd{p_n7<^lIX)5bGKQ&y0`K{5CC9ByN*!T@OxXY9o$5cgFx39X zuz``;{^#cZ#pSnzuDVmcy6p(PhOKLO_B;4L`bRxG``J&?P{$|-9tJ4T40qZwzRgI9EgaDQe+1vdnaD_R3mP3V15Bq zE{w&c7`j7%buu=X_{p?%&p0pFPF9&C5C}II-0NsLZ3b@rU_+?CW^WRGe8CZ18Ep$E zx9y<2N$@)y+l5_l8^ip?HVF3rHU`E#H2EiBfFOZ4|72rFD<2;2_k+M7Y2?vE>oWw} zb*~64L?03$wBhRD5Q_ka%z1rIiKgA%Ys~`!$*1ZV=LvGV9 z{}D*5z+roQ$dfHiP~m}>xlut2G5j}K-uvMSP{YI1L>1|}y}@xCzRN+S6WoT_EsIZho%}+P zDY4iG3H0ILav%@TPzdeUIQ0f;?7)ltCem(H{f~d`gnJzF^%Bv%@rW{7vGm@u9vHp+3*8gmGS^A3c zWu?*^FLi-7kZ?75tP*L8|Cssz={{cls_;HOw=^sH3O`)F_pGi=pS=D%?nS`pigdYo z-=EORJdSxtCqiyxKA1=9t{Mllwx_GGf!K2x2|1@y4P+eNOR^h(j8*{w?OPl33kxL> zd<1%0l`|p~1&(DEbYEle#Kgpef{F?S^n`%G(#3@^FE0-iTm%iIQjVtqgC=KYEQd41 zK;=rtmEO_8t*xzKk0|nYP|SMYl1eDlZVH;2Idl`qlqkzaD(~)IcY^r}IX?#9DRf?6 z@(M~bf&b@4bgd9S&AOekflQy z5D*}?veN41%s8`Fb}w`*^Qj4EN^|MaqF$67kO#fRB%mAg<{^%v7-3~)O;mYS46#7A z9^F&7-5zT4iHSv}J0VyOVYeJ+$~)%?bV#r~BLzaj3sJDmRIm}jf zUN5D?K|mv5&=JbKI#2swO)94MZSDBZ7q~i?w!hH-1;bC`oL8sxAw%9Y)YP1RJz#r% z8?u8oL$-_Ufp41H$)0eavfiAF+KF3$bwOs4s6!mL3zN^v?I6-%rP+$2q zmL~&RtwQyCxbu3NamhO|HWo5Aru7oO;E}wvyc}Ox$Rc^Q=#CXGukwsIB_rb(5LI0M z{wBKq0PFI;rB!PXdEem^XP_%|=BGP{?KO}klMCkyrl}qvRd~}B2YSDQi~6O2V7sxC z|6(QJs%TX38yH~)b2{(qJ;!>hwT`uVTU0$FlYQys-Z?i_7DM7`4&!ZKDJwOUDgO{1SjJ~Gtn~wf#sf$GsS`8d9MKoGfHCa+beElr zPtO|fHNp93%SohR1Rp?Eh(G~BL92dnI(E2xNYTS-YE=zAf86xPRpg$#=d zW;;f!^W!4Q!MvkQ93P$UsY;{Y#76Jig*8HgNpB)QALlCD`c>0lvy$JW@vJ)b~?Xst^QI-@Y_-5 z0y#t8DHPfM;F8Bc;S?qy}s0nVRd%$ZMM)h*7Gmq1|8i`S@;`T4%LDOu|Gr0~9YvhyJh zwgw99ixNmBqRS(ECqh0a_WUJbkGC)Fli9Kp9Kh9miQZf~^6%qSSh0rvz?uf~{kMW$ z9-Kq|U?3gH$0=4gL;sIM#QWc82gQHfzK6Y)z{RH>|JvVEqVH;38l*e3m|Z;4yIAJLsa}Wh7HI;{$VNW~` z0w`#lB}H;Ib>31bFYfR{BGZ4O{retToz4Tg>t25bqG)y%!Rm(jH&b(Sb0?kMICcq| ztrN`9kMklO7#cr3BX}MkJjBfK=Q;YC6|DcS#m}BxrM?{UUwmC1pZM2ydChdEGLoL|7c5t#zd!_}Td( zSBSUW-zv`kTg(MdREkqRbIo%3R<#9UU%QWKIwr^<<5y$QSaed-Q)WDm#|7$%_p6M@ zYML|-QW>~r)D3U?;dNWQk{zK_RWZ_&C#}ZSL<-JDhNL-D6b?7OMdK1cPZT&s=fc?a zY{)LGe5<51e@5W0=lkTt~FRrmb%T06pJsyV2914;bf$w~a zhO4wGa-W=$_3lxCi`0JKu@Qc@mrj7N?0>&!3-7$Oh27+?WQ+SKkd_yBr_K2fHNUhB z3;BR^czUIlFc;6a1hbZ?{K9s<%L<+RwPjAa!DnJa;j3)StCLs((MB;>+8Tipv^`a5 z_^l6b2wXVItJogt2en(7RJu(__ae)+=M)0=i)G2gwwC< z3_oMzb`?&Bn;X3FaHsr0R`Bu#t^wDpe-tMlx-Kp7r$wDWVeg9hsA?#r~_ z#8+9>D*DD5eUHU5xcgPKDrOj~DW=>gi+J5xX*pBYF)UXnhHuX?59Ldv}9bwu;FH(h?u>$k1o{V2n40(_uw&|hmaEC&ZNFUsdVKVTRY6NJy%>$NE zryoiKHm8<7vhi?;J@E+9*WngYvQzw8>zzd?-|#xiXZgQ`P{ln zcyiB0&5;3BVr%Qla=){`Z!R<`_EP}P?bqec5D1Y?LrJ?6o-^Xz(AAnbIJL@$syK3E z@FYX1A%@!0bV(XVwcS4fn&O^wsYM8wvZZyt$fy>f5}HHHEfy1cBKPT3RnCeh9)FV6 zsSSX#Qn|cQTX0$mubG_yi}iu^@4p+*Tss{85GFIgutpW$k^_5ZUHn7$!xvRS9Zo(& zC$u$MvY=<(KTicUt2foMT3o9)4DNt!?h zrlt+hT4|la`&H3Gv1Q+1S6G=(GpN5Rsv&Au!Rk;Y#bkzNj3sEOjbSyo9fM8}7Ks#$ zcqyhTQxqFBmzdg3I56Oko`fQu#9`N*V2P%t5^fo<`kEGusT;37*-uz^cz);XlU60G z(6#gZ4fVPGu<6++4B#n?d{JGC#gdCDdOw%qz|oL zS<(l7Xtl?)e2_v6s7ZU;7!f1>XfWq@1j08qApsTC;ItH-(CBb-u-N6DKqIz3ax+~% z2BP9)^tA2x#gKk-xY%5medf5(fVX)z7KvRWkILc`r%zF$zuz|j{JQ=pSTVIjl>!Sd z-_Q2-m;jgRme`LpPLGmZ?ZZNk1BLUJ&M3%r?8*Oh<~Osu@0+J~**vej%8~ zl26rd*AXr5$R%r2d8#wa!o>vPV>2=K`@)hk;13Rn&Ch*NNkOvQ;FwPIZ+@tuzFx># zT2y~h?dicK<$fe*BW4ztM^HB}>j->2I0%$~t7Gmf@r8tlvT zOyVG(5G5lnlgZ=9Wi0EM4PRvql^cOEg%1w zcwOXHYVf4h`uhZFL1&J9{ptbN)jHo;P|%~ZH9a`^B={%ae4HroFX%lt$b7>l#oy@= zT9bGR)*A2xS5F$*yU%yF8AmnC>%4g#v*&)|tZ1^7PI(m7`WgDrMqj3fC(c#0j%N;Q z^*nH^f9U7{J*AV_oDU<3LIW|7;(&h(u3OYlSB)~~PrC}5jnzSgh+llls1`e=8{LcR_94qq<*FG2T7jq0Q79$7G5ZbRU%xg)SQl32~K-A@%QUd||PZh~L%H_^H9CQBxWZfj&AR%D*w*C|il zqwS_GUEy%~%><|;%c z=KPEciXKM^*uR*URjQ0P4@Deic3)6 zxOG^E?WEPDS0ZUHw|f2tzrUN%f%~7Ab$SeWmww)4VU=7z+s1l5-#LAwZ+9m2P3?t} z$r1yQCG}=Wl?XNGLcOE?(SeYcI%DcLbgS4Z*?3Lc(htUMaMo0AmGI1u^BRLGiq^4D zL?Va5UiU`gDB>qS#vcTxTcp*9*sM}=9FSaW6QzYhzVNKjq-Vqe9s6SpAc)Q2zw|X0 zwjVdqm(dNoIvFAF2c$b!7K>Lgk3LXP?p)Mgk0{s_O#{e& z0&va0dlayW!YFKVrg=wOThJHbKaXBDKHho=%rl?N|F4OTF@~mE1v)#zs!b%}b@*3J zRQrT&qJ$^B=}ICjbQjz@jE&0X;Ssh#=_HrRlTAP?5qL)e>ew8@1<5*Fy795(^4;B- z(E_WN3z>0)=pFS({ocZV^292odd|On{W<17DHuBEfe{01{mmz}=7n$IiN@ zH6FTG|NIrv8?uR*X*0BO!+{vijp?8vk>bh^amBwqvvBLsR;!9VFG$y@*t5wQUG&!C zv`DdEi?*G0&EP#x>vCeT7yZ~Y*LQ;><%-wylaU@M(`M_oXfF4`!%#RCtLE;92%vI} zjRi6FGn3d%Yr2#ykz&ml$ySj2=#FPWnOJ4kne#GDM+!UOYq$ox9rA^wr&>%8 z|EWa0Hy=dCt>ad^d(^^wGx!xA{}~TeuX2bes2&Yy>W0a@aTAw;Oub=;g^TZ$EW@Z# zBf%*TSxh}SK{SvQuW_BS}Q_s&V&9b?7hZ5j>lTOG8& zCkadB#gGLAzM8)c`Fs{V_qMNpR4}?2vw2ejsUnrU_1|>Z(?p*=j~-G>1MKFukY?LtaO#iefb#Z^=i06S6rvY*bm3 zB_Cth;z578f`)Fx4T|sieO)i@pQ(?ZsIsY#MuL_Tpo$!pQH&x@L*P~+Gl6n+ITcTT zNYXM)<$ccQ66#Cw*Z6w9INdTa`@DiY5EvPd6h2yOPDxw=?0bic5pM36P)Us~OKvQA z4}TG}4oIG4qm#)yg|uAtJjkcQgur6D(|^G>Ha57Guh#tVQ@(I85u#RFYmYg<^Jl+) z1igNQzkErRo!lz8A&5WAsj(5^%!;wa6$Hn4)EnEicg7W9ROA=kf9&Hj0CW!U zSO3>siy1f8*Kc0%Guqcuk?E$sCHWs|-FB-~DhMv49l0wV7O>d`D8S#!XNQ~}9LgQe zH%d!$@U9OYya#3rizm`@HS9&o$GL!~^dFyk_U%m)wti~F8Lrlw6u=5vI6u_+o}W)$S13u0;qWV`cG5fKq4v^?Uw(NjSV15Zc#5S^ArI%Cj$7}XqNtznWx>@;NWHVL)x zMvrw9%VXp--fV`Ug(*c&!#k06zpL#k0-Eb5Ke6|OWkui{Yt>tDqE=XkL%9>1Aw&-? z#rOMDu(r&bfEA_3(s`QR%!ZI%>T=;qo_+GpY7d}GVG14XCFXDbRF{6>{LnQe&)B%H zL24HW5U1Ew5T@0rVU2^$Z-y#sBGc)>bO8}vqWc=-mo8?rg zu0g%sj}yb@Bk35ew79cya?_3o`amqu_1%^X)HQagZD`A9J&Kj9k47eNv5Mub;5gpw z;Pth4XJ7R552u;kFb_ONg{_Ll<*sf5nT)dlP}5<{-V5y`XI9*={qX73ZG z7p85IKt6jLFh{2Tj*=JT;o;#uALQxz6p#iKS5=AZ_E}5xZEqL9hu75bnO*Fzzj*XS zq&PnF590-|n}8MqPrpG|fuFCBy9ve?7x$Z-nG!pMW{f`p+!+|O?0=?iw$^3A)11pL zfr=5_6GQGd5A0k=%7sn;fcSqGe>GVJF5k6yl(5qBuyr>q8b;wx=|B3yJ-KH?8%@aJ|p3TVMz@q^Z3W2T}eA#dzS8t^1C zuF4EiJyDs>{l)4b!voBhR0{Mg{KWIKM@)TaI` zYv$w|l-OV}IYxQ7j;1O0wW|N-Rn_JS>u)U4mk*pFuYMHVWA`JfSE@=TuT&d;&&07m zFggWzFpXk0$xA=9Z3J(e?8b$b`OqAP9YlPQXA?vOJWuS1euGu@tTq92Q`C%{$fZf1 z*-QkD5@pi%k31@)ZIXADywu)By22~_R}Mo8da#tln02YCXXHMWdOK}r?f+G*o?jHu|!Hor3#hs>D+4>x1RaHE5Vxl;qUj)y#M*4tlq*Lq8i{dGO!*oG0 z+?*T~srtS^6jND_&_eMo2WJoPXqP&gu{qgZ`y{G0np!0M?`ye~J+J`Ei@H=7iyt_N zB$o&(m*h}0DKmL~qO!M<8Pzj0!L6idd*Gt}1#EJ`O$|}dXCItz=ZJYnG_FCvk@^|E zw_%!*&=iR^5XC0D+W4M*BT+T)ktHtq^!Wolvl*a70GXk2p(=I60!dCcmcfhnWMI@( zW{Nf#&;ymVS!G`DfFZ0|>i0GsfvcVrR6uXnWt<{%TuBuu^BD$TzZ;M(t2XxxyT*Qa z_{+2eC^GW(N_KP;0R3VrjrLWidQM?t0=n@LcsdQgO4zz=dHa7d^+eMR6d$4T%K{`23S*frL7Rk>Ph0)y4gW6-qae`1FN6^2*uT&5hqV&XpD5hR+Ul+SwyHENyMExGDIVLba7q zCyN5P_fR_k>D1|=z<=mfJAe^XHqQKpVO(gn82a(!8qgu&RS<ZZ zzy=>sX8}$oR;Nfq?9jcB)(Zq$4)7wD?V9rW(D6PR`7{<$&=ZJjYBw9$d>}FbJPB}Q zSdSVUb%Xt&zgU2&VzH+I9P!}raBg!m<+pF&K4agGjgT%XJn6aAv9mLQ5^9r1m)aF+ zWCFyq0B9+)r*w}#;GBpQWLcy^DHGm-)fDSW6%CMvVT>SK0vJgsVzNp%KvB0IXcffE zvQ0gFHlqCCWHfBi?yUHM+>_C&&bnepd#R%oVgo*s=(+4pvgadK z+djBzX~<*MSO}Y&w_R=pJB=E0fb_n5{PYKC+x^96fg^<{Pd6CD2&vObIhd|E$MHd< zV`Jv~%u33}ZN(3yD35>?jSK(U+}t}5ulVNXV5;REmcrkC44`Ude1;4Bm8yFki}-5r z;)Xv7wigL6+904BP@z-M@E%GN%8LJ{7aKt+Uy4qIZC?ui*hBdrNx>|(^8Z=>r}2v+ zAH^r2pZGP=yo4t7#fQ0|-P^notduV}`7jt=zZG%6)%e-D!ESPb^nVlR?T0bv%fFd4 z&)cvWNJaI&RFG=$7`E`deC>Ta2tJr2xd4IGO(<0&CKt&Ys1f9qkYFKAXm@xY`RWcL zA!Lu-);-8uBj^Z58?w#0`xE019b{(VOGFn*+oj+^Yi&coDBZ4MA47}6OOS?8l|@u2 z-PY|r2ng1X)k~MON!G2j{fa!6};=;LkH*a>5Tx&@Tc6;c?H2M`pnb@1DbV_0yC88dA+xIWAf)Y z1(*7Wf7_ao*%=tD$?a%+#Wevn!m4mqiYkOyA+Wrft(R(1j1;5*hSu$-bUJz z|GnTU4O?kxg>f^nV~zPP3GUn>jz7L9Aiw8hU*gMES$n==rooiCew!muW> zn(k(2)BRsG>>$hUaxG4zoWv(bAG)Vq)5zlnOhY8P2I6-0U8%M-06`x884lPnsSy zkt4$*F*-jV-RvHMOYT9!B}_atb^mcscw_msU(G|BG?H&_t2MCl(q`fcanl+d42Uis zb(_uLgM)*t1a@+Ta}i0&eX-J=gwJEtxXj{2%H~PjbG??!paaci~RB-qurwYqAB@Y(0>`|3jx|^X)T*;vH zP-MUK%ZGRc)L^tj6~XM14;a7(rxrQvj^T0QSF0XXnN+_eF~DI6K}*8OhQg5=z`O-% zvSZaea~CF#LX*#VGpzg4KEy>3KP=>4m_bhw@#)hiAa)82R&zh?QxMD`y7?gwr%@9% zx{Z0hwDw(?9$0lNx2T%k!^5RkK56Orbg;ux3t7%6X<=a@2(+O8)4Y$9BuPb0Ybm{Y z+l4=Uq&M!iT4pXeC*iv^=;g!B0_h^b5OEZTU0Gqtt7JrKqI1J#>lF01%X8>p`$@o0 z<+jyJiJ<%Lw25s}O^n6GMF*dN<5jthW`kPFQD*C^0RerSvUS%X8ZvRk5=Tc6p)w&p zqfQVYqy+N3o{o;-9Qej3C6Mb&h?Z^zDWaAyXgRHAe5>vOJ=iC*XBcHP=xhHoVCWj$ zMungbG_zND(Fa}`k|m5ke|`UkmODlUTE_U|QSu-h>@(ZI9f0qQ2$*deD~FF3RHlCT zWf8|#j?_bvLl(oXR;~)~r>Z`4Z?PSojYzxod;@E0Xc*=$2-#1s<|Rn~ndRBWy54qd zeE+xL=>DSWH8Bw$!5*zP6Aoz=x}36g?Roeb&e=CWvNY!WMNMHQhg%q|yYxN!?rTbF zs%yaAU~Hho;{1HtF4yVPoPp_;aj_U1&Fx;Y7@?;HP{&_NFJ4H(K#3vl-Z%f$o3^sn z=b;1sAt=nNt?E6j02m220MgAzAadgdz=jV^8@S#`nTvK|4bsM~2e^~6T^7KC-sYXa zU{+DqN04_vi>JIROVeHa!$UEPk}R$cmnajH&2sB>P=l8;GrhNSB1T6?&2~zlk(J#F zTa*JeW45HNUPr^*D~S~k<>C(WTZZQsV90ehJjeM;Q*tL=+0NM8AI$O;zhxX!XD#8> zBo}nwOPzjv=ZNc~oZIPsdy&Y|0(RcX5W3{sBPRvZOS%0bMh>S6V1iV$t^z!4u{1w^ zM6YCi^8VkSAMcdI!{iwU0=v7rVgERQlwh8yS)o(m96aWO2AU00rw>->4GaYkyZ3Eg zM+NPoVN$(&4YQ1rSMRqr2Gk)69oFj)Q<3RX+ed&+Up9IXuY(|V=3S= zE-`3!dv0xQ9jhXfsA6>oLS%LTGp$#7F2VzVarI%+1wupZ$(O#;5l(3zSaSC`lpty) z!X)<&Fv?&(j|nyRwG;Hp1TvjcbU!D`i+tLLs@_;fBk@d3UQ$x9rY2|7;?da%Jv!+7 zd{DQG%*!&0Uyfb?z6|KQ0kLxJp#)%j@(~GIaABhM?a-+0a!WM373Y~sllZ;}dB#4h zpRjxBfxz`E11E%$IDC}?3}2O7VMoczL}qXz6QDOWmT3D8$SdxfP)ju9p!pUE0Lh7< z($Uk4C`ki|rUjrI8WjY6A-SnMXlb@GysW7P!1C)>nOo-#B>etLhL89{E=99qPoEQD zoGSd=-p9O8Z{Chs#>Nm75(2ASHE4Qx+HEc@15^{A?^=3VS~cJ-2VyItw#7v?R73-) z{uM!Ah?B-3a~P0AaO^dpLS8#){D{O&-~ma`uB!$e5;WQ~Vfx=5EH6CV+NY0xX}Pq0 z8x-_X_C3wxnP2^`2gWHz zH_wV?)F$=}rNiWch5re89CD5{c37r_$UAFu#>t`tf$-%8CnX1haCx9TA?r^jAIY)_ zP}4E5Hi920Wi3mq)qI~)$-g$<+pFtbAMGREBkMZvf9^zd@d9T82%2`P(6?*h5F|(Z z)e6tuSz`l)p7RKhF?;gs`b`>DknrvUQDBt^k|%vauddD!Ev`w@>$-;GA|q&N@wn0G ze76}b9{}kSAh8n^6kG+uk?TWDT95y^dkZwWtRya4np)GwmumLpPZ-hAFwhqL6r8_M zF8#u}*@LRIrO!(Gl{a@nNeSoKuAd`3nW~5Ua3P0nH#$`MVgJCZ5;L)p?zqdc52q3x z_pK*imV>~M8yTA$hoR0kw@=01jQGh1UHceyE43(fmT%MYq9t@eMZcYy<~K9^KFT@x z8tlc1sbhP_=L;~ypCR(P*?v;Ic@glMF=H|k7rp@9I~yrHsz>?&6|e9c8CN5+VHlJ` z!l)d3swI&7D?k40XBgWL+gI?M1YSZZWG+p<)G22ni_=fnf^l5?XB_8sKe~S^2lh-p z8!muzT-dNE8Afi;j$Cdb?&@~@9A);vTe9bOe(WkvMcjJVk->&DtiHP)G*Mue4Aa}o z1;o#HGE6dMfqA*gxjT-CbHlx+MccO?qGa?pn-g9fkuM6>Z&&UIM`V&=GnekKn8<&d zel425cqPV-{mlMV{;u)Y$Vcjz;b~9X@iodIa;-U5SDzTfdnijm^m4F;qnWA9S-ybw|Zk`-0e)ty3KWwx=xd>vBQ&F53_}cf#AbG{zXeti zo$PdR+RlxQOxaHSE?mK4$Y|MQI3LNa;oH9^iOE#gFKfB~;*3}~7Fh%|&~pCwVPDLC z+XEzUxs;y;Wf&NodwnW7kiho49PXrOq*kB*97j>BsJ;T4`62uFO&hbIhRno*N8)WeCPO`}#~ih>5D63!CXY{8ie*ah@Wz|4fkkODW-? zCL%xS2PWWiY!oU&;C<_eyuMnAplc7TuB`UxxQGxmYc+?RX{!$u9Bpku)M(9QA)I9? zWV(-JLcOdW>U5rR*-fuS3lO#k&CYD_S34V%)|Jotj#rIdk4;X7S@B10aFUk$DhjB{ zCeRfLRf)Zl^3?%HTx0{W=y-Kf8-)EVTLuToojI~PNAh5su{B3BaJ(O7K4h;U3caU| z3I`E4q2h8QMpha?R~s4TT_xfbX)_tsbW%n`SCo{lWiR3Lu4;0TWBAr*OXD}(j~k8{TTNYEZovZspmwikcw}rGUOyv#49IUkLO2XF zFcXOhnXwkLkJ6`|9G+}k7As~Tb>b`IQtX6vl4hKy%^YfZz|YA zxV%7MN$CKZ&DdvKKf5aA%zad!DlmZ`q3ZZs>xDy+$%Iw*hy(kXKg8Ho zCh60MhDP2$jm!S-hmmkXqZdpYf%T<$tsjHF|C3eN7bfcJz=z1iBN;QOd`VMsahXn} zm4xJ55QgUj1|qv5L9Dz1M965{85+D8;24xXC)5|HaVuc38$EbVdqaHo6#=ND?%%AfVDwU}S9fJq078Q;ArlRB zcd+8rH3NsueS_6H6J6$w5c@Rr?zo&=CEB2{*xS=YY2e{x1Xtuy%G+x zjk^X0ynfURb&*^S+|TVZ{n@sBc0=xp`Lt!4-q)Vp;XWkF_Q`|z{d;}H638*)}^39M2!{+Cx*aW0J`)e6WTJVnz2X_*xdT?B1kak$*nmO z)iy@)WYPUFzOj)WMCWhM-XeLOJa~zUNZvGEv~Rl{50n7p!oe8T#cw`HlCU_@z_wY5zqv)OGRAhQUa zI04Sr@uA!;>g}npX}wwwyhE)UCd&2;*uuIVu9!ALIy_E5OUX*}lwIh*h5Ij-Xc-mA zXOBnzN?bSRh@~0Q*Nue!g=O6xUa2s(^Z%mZ3Fm)KH(St`P^Sw|g+m8$1r-CU4 z_*Yy{^I2fw@T+z}s_^x6HfC7SLIe8QgdVzF9EEl4x3Um1)E|ew(`R85r%~KsFxe~} z`U%#K?0;6hl|W61qpl0Njk5p$pFrbauV21raG^mTOZpQMz0(dHX0x@mbqN^%{260o zVO)~t54S1@CPzHCl8lt%oK*dC;JTWorlvZzdPSoQmYas+bY9Up7cYa_V{66sLl~5HHZHy{|)w-!& z^ZN*5-UaK?IwPuNC&yeyI3tw+@y+5cL?8nGuT-`U!-_rjeS@aJIN7ha!aGv)^+-D#d6cw<%-aj+{~(_U+g)wzZZ*11T|5 zoXi5CgUIr%72gVw63g=S*be^a7`z~?-6`8;iMdf%&?PmD-Ru;=bojA4e!&Z(2oL_1 zw}QBl4w3*?p|ED8<;H185}T(da)0Ad^`Z4LI-0!~kZ9H9mNjd^+b-0FjW_b*$p z5a(tAp~0y~0h(|{;M|t_=NlBZ7T)IK90s*(0FwDP*+~7ShF0^kg@UQ5bT6L>8uNe{ zh6Z^e?X}eY+Cx8=mxKrS5UzhV6j^P%c%0YN$kNe=l8bk`rKRcRH_GRi>C6xrz3?WN z75sl)8@R{!w@lCsqZJw-#MoXHFm2qKtU1(aKE6i_N%Va49YIJS^=b?hKgF~Az#<om!N})6r#yYAX!Xw$gouYD2A`*b%$m&3gpzZt&R>UqCaQkz@$y4> zWYbU9Br$1}`*deS#!e(pYoI;DhRMg5F)tIsigJ_-QWNAV`U;`$^WlMOo3F9hxht6g zkwFy5sL@G?1?4-=E@mDNlbI4cpOhB`IKRsjojBmKbLEe;;PGVOEIa6xqJ~1Hyjke~0~c)_761SM literal 15734 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