From 5fabd286d177ff06df338650640124f039dd4de1 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Tue, 27 Mar 2012 05:50:15 +0100 Subject: [PATCH] TG: Added Invisty's Emitter sprites. Cleaned up part of the door code and moved some defines to their proper files. Firelocks can now be welded open and now shows the welded overlay properly. Borgs can now properly mess with door wiring. r2895 --- baystation12.dme | 2 +- code/game/machinery/doors/door.dm | 661 ++++++++---------- code/game/machinery/doors/firedoor.dm | 138 ++-- code/game/machinery/doors/poddoor.dm | 118 +++- code/game/machinery/doors/unpowered.dm | 25 + code/game/machinery/doors/windowdoor.dm | 90 ++- code/modules/power/singularity/emitter.dm | 6 +- code/modules/projectiles/guns/energy/laser.dm | 5 + code/modules/projectiles/projectile/beams.dm | 9 + icons/obj/doors/Doorfire.dmi | Bin 3066 -> 3407 bytes icons/obj/singularity.dmi | Bin 27972 -> 34101 bytes 11 files changed, 595 insertions(+), 459 deletions(-) create mode 100644 code/game/machinery/doors/unpowered.dm diff --git a/baystation12.dme b/baystation12.dme index 429cc471504..00bfb911c1b 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -318,7 +318,6 @@ #include "code\defines\obj\clothing.dm" #include "code\defines\obj\computer.dm" #include "code\defines\obj\decal.dm" -#include "code\defines\obj\door.dm" #include "code\defines\obj\hydro.dm" #include "code\defines\obj\machinery.dm" #include "code\defines\obj\radio.dm" @@ -548,6 +547,7 @@ #include "code\game\machinery\doors\firedoor.dm" #include "code\game\machinery\doors\poddoor.dm" #include "code\game\machinery\doors\shutters.dm" +#include "code\game\machinery\doors\unpowered.dm" #include "code\game\machinery\doors\windowdoor.dm" #include "code\game\machinery\embedded_controller\access_controller.dm" #include "code\game\machinery\embedded_controller\airlock_controller.dm" diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 128b01d9eef..641f4bfde38 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -1,195 +1,287 @@ -/obj/machinery/door/Bumped(atom/AM) - if(p_open || operating) return - if(ismob(AM)) - var/mob/M = AM - if(world.time - AM.last_bumped <= 60) return //NOTE do we really need that? - if(M.client && !M:handcuffed) - bumpopen(M) - else if(istype(AM, /obj/machinery/bot)) - var/obj/machinery/bot/bot = AM - if(src.check_access(bot.botcard)) - if(density) - open() - else if(istype(AM, /obj/effect/critter)) - var/obj/effect/critter/critter = AM - if(critter.opensdoors) return - if(src.check_access_list(critter.access_list)) - if(density) - open() -// else if(istype(AM, /obj/effect/alien/facehugger)) -// if(src.check_access(null)) -// if(density) -// open() - else if(istype(AM, /obj/mecha)) - var/obj/mecha/mecha = AM +/obj/machinery/door + name = "Door" + desc = "It opens and closes." + icon = 'doorint.dmi' + icon_state = "door1" + opacity = 1 + density = 1 + layer = 2.7 + anchored = 1 + var/secondsElectrified = 0 + var/visible = 1 + var/p_open = 0 + var/operating = 0 + var/autoclose = 0 + var/glass = 0 + var/forcecrush = 0 + var/holdopen = 0 + + proc/bumpopen(mob/user as mob) + proc/update_nearby_tiles(need_rebuild) + proc/requiresID() return 1 + proc/animate(animation) + proc/open() + proc/close() + + + New() + ..() if(density) - if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access))) + layer = 3.1 //Above most items if closed + else + layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 + update_nearby_tiles(need_rebuild=1) + return + + + Del() + update_nearby_tiles() + ..() + return + + + Bumped(atom/AM) + if(p_open || operating) return + if(ismob(AM)) + var/mob/M = AM + if(world.time - M.last_bumped <= 60) return + if(M.client && !M:handcuffed) + bumpopen(M) + return + + if(istype(AM, /obj/machinery/bot)) + var/obj/machinery/bot/bot = AM + if(src.check_access(bot.botcard)) + if(density) + open() + return + + if(istype(AM, /obj/effect/critter)) + var/obj/effect/critter/critter = AM + if(critter.opensdoors) return + if(src.check_access_list(critter.access_list)) + if(density) + open() + return + + if(istype(AM, /obj/mecha)) + var/obj/mecha/mecha = AM + if(density) + if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access))) + open() + else + flick("door_deny", src) + return + return + + + CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 0 + if(istype(mover) && mover.checkpass(PASSGLASS)) + return !opacity + return !density + + + bumpopen(mob/user as mob) + if(operating) return + src.add_fingerprint(user) + if(!src.requiresID()) + user = null + + if(allowed(user) && density) + open() + else if(density) + flick("door_deny", src) + return + + meteorhit(obj/M as obj) + src.open() + return + + + attack_ai(mob/user as mob) + return src.attack_hand(user) + + + attack_paw(mob/user as mob) + return src.attack_hand(user) + + + attack_hand(mob/user as mob) + return src.attackby(user, user) + + + attackby(obj/item/I as obj, mob/user as mob) + if(src.operating) return + src.add_fingerprint(user) + if(!src.requiresID()) + user = null + if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade))) + flick("door_spark", src) + sleep(6) + open() + operating = -1 + return 1 + if(src.allowed(user)) + if(src.density) open() else - flick("door_deny", src) - - -/obj/machinery/door/proc/bumpopen(mob/user as mob) - if (src.operating) + close() + return + if(src.density) + flick("door_deny", src) return - //if(world.timeofday-last_used <= 10) - // return - src.add_fingerprint(user) - if (!src.requiresID()) - //don't care who they are or what they have, act as if they're NOTHING - user = null - if (src.allowed(user)) - if (src.density) - //last_used = world.timeofday + + blob_act() + if(prob(40)) + del(src) + return + + + emp_act(severity) + if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) open() - else if (src.density) - flick("door_deny", src) - return + if(prob(40/severity)) + if(secondsElectrified == 0) + secondsElectrified = -1 + spawn(300) + secondsElectrified = 0 + ..() -/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) return 0 - if(istype(mover) && mover.checkpass(PASSGLASS)) - return !opacity - return !density - -/obj/machinery/door/proc/update_nearby_tiles(need_rebuild) - if(!air_master) return 0 - - var/turf/simulated/source = loc - var/turf/simulated/north = get_step(source,NORTH) - var/turf/simulated/south = get_step(source,SOUTH) - var/turf/simulated/east = get_step(source,EAST) - var/turf/simulated/west = get_step(source,WEST) - - if(need_rebuild) - if(istype(source)) //Rebuild/update nearby group geometry - if(source.parent) - air_master.groups_to_rebuild += source.parent - else - air_master.tiles_to_update += source - if(istype(north)) - if(north.parent) - air_master.groups_to_rebuild += north.parent - else - air_master.tiles_to_update += north - if(istype(south)) - if(south.parent) - air_master.groups_to_rebuild += south.parent - else - air_master.tiles_to_update += south - if(istype(east)) - if(east.parent) - air_master.groups_to_rebuild += east.parent - else - air_master.tiles_to_update += east - if(istype(west)) - if(west.parent) - air_master.groups_to_rebuild += west.parent - else - air_master.tiles_to_update += west - else - if(istype(source)) air_master.tiles_to_update += source - if(istype(north)) air_master.tiles_to_update += north - if(istype(south)) air_master.tiles_to_update += south - if(istype(east)) air_master.tiles_to_update += east - if(istype(west)) air_master.tiles_to_update += west - - return 1 - -/obj/machinery/door/New() - ..() - if(density) - layer = 3.1 //Above most items if closed - else - layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 - update_nearby_tiles(need_rebuild=1) - -/obj/machinery/door/Del() - update_nearby_tiles() - - ..() - - -/obj/machinery/door/meteorhit(obj/M as obj) - src.open() - return - -/obj/machinery/door/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/attack_hand(mob/user as mob) - return src.attackby(user, user) - -/obj/machinery/door/proc/requiresID() - return 1 - -/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/device/detective_scanner)) - return ..() - if (src.operating || isrobot(user)) - return - src.add_fingerprint(user) - if (!src.requiresID()) - //don't care who they are or what they have, act as if they're NOTHING - user = null - if (src.density && (istype(I, /obj/item/weapon/card/emag) ||istype(I, /obj/item/weapon/melee/energy/blade))) - if(istype(I, /obj/item/weapon/card/emag)) - var/obj/item/weapon/card/emag/E = I - if(E.uses) - E.uses-- - else - return - src.operating = -1 - if(istype(I, /obj/item/weapon/melee/energy/blade)) - if(istype(src, /obj/machinery/door/airlock)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, src.loc) - spark_system.start() - playsound(src.loc, 'blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) - for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue The door has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) - if((!src:arePowerSystemsOn()) || (stat & NOPOWER) || src:isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) - var/obj/structure/door_assembly/temp - var/failsafe=0 - switch(src:doortype) - if(0) temp=new/obj/structure/door_assembly/door_assembly_0(src.loc) - if(1) temp=new/obj/structure/door_assembly/door_assembly_com(src.loc) - if(2) temp=new/obj/structure/door_assembly/door_assembly_sec(src.loc) - if(3) temp=new/obj/structure/door_assembly/door_assembly_eng(src.loc) - if(4) temp=new/obj/structure/door_assembly/door_assembly_med(src.loc) - if(5) temp=new/obj/structure/door_assembly/door_assembly_mai(src.loc) - if(6) temp=new/obj/structure/door_assembly/door_assembly_ext(src.loc) - if(7) temp=new/obj/structure/door_assembly/door_assembly_g(src.loc) - else failsafe=1 - if(!failsafe) - temp.anchored=0 - step_away(temp,usr,15) - else del(temp) + ex_act(severity) + switch(severity) + if(1.0) + del(src) + if(2.0) + if(prob(25)) del(src) - return - else - src:welded = 0 - src:locked = 0 - update_icon() - flick("door_spark", src) - sleep(6) - open() - return 1 - if (src.allowed(user)) - if (src.density) - open() + if(3.0) + if(prob(80)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + return + + + update_icon() + if(density) + icon_state = "door1" else - close() - else if (src.density) - flick("door_deny", src) + icon_state = "door0" + return + + + animate(animation) + switch(animation) + if("opening") + if(p_open) + flick("o_doorc0", src) + else + flick("doorc0", src) + if("closing") + if(p_open) + flick("o_doorc1", src) + else + flick("doorc1", src) + if("deny") + flick("door_deny", src) + return + + + open() + if(!density) return 1 + if(operating > 0) return + if(!ticker) return 0 + if(!operating) operating = 1 + + animate("opening") + sleep(10) + src.layer = 2.7 + src.density = 0 + update_icon() + src.sd_SetOpacity(0) + update_nearby_tiles() + + if(operating) operating = 0 + + if(autoclose) + spawn(150) + autoclose() + return 1 + + + close() + if(density) return 1 + if(operating) return + operating = 1 + + animate("closing") + src.density = 1 + src.layer = 3.1 + sleep(10) + update_icon() + + if(visible && !glass) + src.sd_SetOpacity(1) + operating = 0 + update_nearby_tiles() + return + + + update_nearby_tiles(need_rebuild) + if(!air_master) return 0 + + var/turf/simulated/source = loc + var/turf/simulated/north = get_step(source,NORTH) + var/turf/simulated/south = get_step(source,SOUTH) + var/turf/simulated/east = get_step(source,EAST) + var/turf/simulated/west = get_step(source,WEST) + + if(need_rebuild) + if(istype(source)) //Rebuild/update nearby group geometry + if(source.parent) + air_master.groups_to_rebuild += source.parent + else + air_master.tiles_to_update += source + if(istype(north)) + if(north.parent) + air_master.groups_to_rebuild += north.parent + else + air_master.tiles_to_update += north + if(istype(south)) + if(south.parent) + air_master.groups_to_rebuild += south.parent + else + air_master.tiles_to_update += south + if(istype(east)) + if(east.parent) + air_master.groups_to_rebuild += east.parent + else + air_master.tiles_to_update += east + if(istype(west)) + if(west.parent) + air_master.groups_to_rebuild += west.parent + else + air_master.tiles_to_update += west + else + if(istype(source)) air_master.tiles_to_update += source + if(istype(north)) air_master.tiles_to_update += north + if(istype(south)) air_master.tiles_to_update += south + if(istype(east)) air_master.tiles_to_update += east + if(istype(west)) air_master.tiles_to_update += west + return 1 + + +/obj/machinery/door/proc/autoclose() + var/obj/machinery/door/airlock/A = src + if(!A.density && !A.operating && !A.locked && !A.welded) + close() return + +/* /obj/machinery/door/airlock/proc/ion_act() if(src.z == 1 && src.density) if(length(req_access) > 0 && !(12 in req_access)) @@ -216,211 +308,4 @@ else close() return - -/obj/machinery/door/blob_act() - if(prob(40)) - del(src) - -/obj/machinery/door/emp_act(severity) - if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) - open() - if(prob(40/severity)) - if(secondsElectrified == 0) - secondsElectrified = -1 - spawn(300) - secondsElectrified = 0 - ..() - -/obj/machinery/door/ex_act(severity) - switch(severity) - if(1.0) - del(src) - if(2.0) - if(prob(25)) - del(src) - if(3.0) - if(prob(80)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, src) - s.start() - -/obj/machinery/door/update_icon() - if(density) - icon_state = "door1" - else - icon_state = "door0" - return - -/obj/machinery/door/proc/animate(animation) - switch(animation) - if("opening") - if(p_open) - flick("o_doorc0", src) - else - flick("doorc0", src) - if("closing") - if(p_open) - flick("o_doorc1", src) - else - flick("doorc1", src) - if("deny") - flick("door_deny", src) - return - -/obj/machinery/door/proc/open() - if(!density) - return 1 - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - - animate("opening") - sleep(10) - src.layer = 2.7 - src.density = 0 - update_icon() - - src.sd_SetOpacity(0) - update_nearby_tiles() - - if(operating == 1) //emag again - src.operating = 0 - - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/proc/close() - if(density) - return 1 - if (src.operating) - return - src.operating = 1 - - var/X = src:x - var/Y = src:y - var/Z = src:z - var/held = 1 - - if(src.holdopen && !forcecrush) - while(held == 1 && holdopen && !forcecrush) //If it is no longer hold open, it should close. - sleep(held? 10:40) - held = 0 - var/list/objects = locate(X,Y,Z) - for(var/obj/T in objects) - if(!istype(T,/obj/machinery/door) && !(istype(T,/obj/machinery) && T.anchored == 1) && !istype(T,/obj/structure/cable) && !istype(T,/obj/structure/disposalpipe) && !(T.loc == get_turf(src))) - held = 1 - for(var/mob/living/T in objects) //Geez, ghosts were OP. - held = 1 - animate("closing") - src.density = 1 - spawn(4) - if(!istype(src, /obj/machinery/door/window)) - for(var/mob/living/L in src.loc) // Crush mobs and move them out of the way - - if(src.forcecrush) // Save an AI, crush a limb - var/limbname = pick("l_arm", "r_arm", "l_hand","r_hand", "l_foot", "r_foot") - var/limbdisplay - - for(var/organ in L:organs) - var/datum/organ/external/temp = L:organs["[organ]"] - if (istype(temp, /datum/organ/external) && temp.name == limbname) - limbdisplay = temp.display_name // Take the name for down below - temp.take_damage(rand(50,80), 0) //OH GOD IT HURTS - break - - L << "\red The airlock crushes your [limbdisplay]!" - for(var/mob/O in viewers(L, null)) - if(O == L) - continue - O.show_message("\red The airlock crushes [L.name]'s [limbdisplay]!", 1) - sleep(rand(2,8)) - - L << "\red The airlock forces you out of the way!" //Lucky you - for(var/mob/O in viewers(L, null)) - O.show_message("\red The airlock pushes [L.name] out of the way!", 1) - var/list/lst = list(NORTH,SOUTH,EAST,WEST) - var/turf/T = get_random_turf(L, lst) - if(T) - L.loc = T - - if(!src.forcecrush) - for(var/obj/item/I in src.loc) // Move items out of the way - if(!I.anchored) - var/list/lst = list(NORTH,SOUTH,EAST,WEST) - var/turf/T = get_random_turf(I, lst) - if(T) - I.loc = T - - sleep(6) - update_icon() - - if(src.visible && (!src.glass)) - src.sd_SetOpacity(1) - if(operating == 1) - operating = 0 - update_nearby_tiles() - -/obj/machinery/door/proc/autoclose() - var/obj/machinery/door/airlock/A = src - if ((!A.density) && !( A.operating ) && !(A.locked) && !( A.welded )) - close() - else return - -/////////////////////////////////////////////////// Unpowered doors - -/obj/machinery/door/unpowered/Bumped(atom/AM) - if(p_open || operating) return - if (src.locked) - return - if(ismob(AM)) - var/mob/M = AM - if(world.time - AM.last_bumped <= 60) return - if(M.client && !M:handcuffed) - bumpopen(M) - else if(istype(AM, /obj/machinery/bot)) - var/obj/machinery/bot/bot = AM - if(src.check_access(bot.botcard)) - if(density) - open() -// else if(istype(AM, /obj/effect/alien/facehugger)) -// if(src.check_access(null)) -// if(density) -// open() - -/obj/machinery/door/unpowered - autoclose = 0 - var/locked = 0 - -/obj/machinery/door/unpowered/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/unpowered/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/unpowered/attack_hand(mob/user as mob) - return src.attackby(null, user) - -/obj/machinery/door/unpowered/attackby(obj/item/I as obj, mob/user as mob) - if (src.operating) - return - if (src.locked) - return - src.add_fingerprint(user) - if (src.allowed(user)) - if (src.density) - open() - else - close() - return - -/obj/machinery/door/unpowered/shuttle - icon = 'shuttle.dmi' - name = "door" - icon_state = "door1" - opacity = 1 - density = 1 \ No newline at end of file +*/ \ No newline at end of file diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d8f563836c4..87c8051ec8d 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,73 +1,95 @@ /var/const/OPEN = 1 /var/const/CLOSED = 2 -/obj/machinery/door/firedoor/Bumped(atom/AM) - if(p_open || operating) - return - if(!density) - return ..() - else + +/obj/machinery/door/firedoor + name = "Firelock" + desc = "Apply crowbar" + icon = 'Doorfire.dmi' + icon_state = "door_open" + var/blocked = 0 + opacity = 0 + density = 0 + var/nextstate = null + + + Bumped(atom/AM) + if(p_open || operating) return + if(!density) return ..() return 0 -/obj/machinery/door/firedoor/power_change() - if( powered(ENVIRON) ) - stat &= ~NOPOWER - else - stat |= NOPOWER + power_change() + if(powered(ENVIRON)) + stat &= ~NOPOWER + else + stat |= NOPOWER + return -/obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob) - src.add_fingerprint(user) - if ((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) - var/obj/item/weapon/weldingtool/W = C - if(W.remove_fuel(0, user)) - src.blocked = !src.blocked - user << text("\red You [blocked?"welded":"unwelded"] the [src]") - update_icon() - return - if (istype(C, /obj/item/weapon/crowbar) || (istype(C,/obj/item/weapon/fireaxe) && C.wielded == 1) ) - if (!src.blocked && !src.operating) + + attackby(obj/item/weapon/C as obj, mob/user as mob) + src.add_fingerprint(user) + if(operating) return//Already doing something. + if(istype(C, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(0, user)) + src.blocked = !src.blocked + user << text("\red You [blocked?"welded":"unwelded"] the [src]") + update_icon() + return + + if (istype(C, /obj/item/weapon/crowbar) || (istype(C,/obj/item/weapon/fireaxe) && C.wielded == 1)) + if(blocked || operating) return if(src.density) - spawn( 0 ) - src.operating = 1 - - animate("opening") - sleep(15) - layer = 2.7 - src.density = 0 - update_icon() - - src.sd_SetOpacity(0) - src.operating = 0 + spawn(0) + open() return else //close it up again - spawn( 0 ) - src.operating = 1 - - animate("closing") - src.density = 1 - layer = 3.1 - sleep(15) - update_icon() - - src.sd_SetOpacity(1) - src.operating = 0 + spawn(0) + close() return - return - -/obj/machinery/door/firedoor/process() - if(src.operating) return - if(src.nextstate) - if(src.nextstate == OPEN && src.density) - spawn() - src.open() - else if(src.nextstate == CLOSED && !src.density) - spawn() - src.close() - src.nextstate = null + + process() + if(operating || stat & NOPOWER || !nextstate) return + switch(nextstate) + if(OPEN) + spawn() + open() + if(CLOSED) + spawn() + close() + nextstate = null + return + + + animate(animation) + switch(animation) + if("opening") + flick("door_opening", src) + if("closing") + flick("door_closing", src) + return + + + update_icon() + overlays = null + if(density) + icon_state = "door_closed" + if(blocked) + overlays += "welded" + else + icon_state = "door_open" + if(blocked) + overlays += "welded_open" + return + + + +//border_only fire doors are special when it comes to air groups /obj/machinery/door/firedoor/border_only + CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group) var/direction = get_dir(src,target) @@ -78,9 +100,9 @@ return (dir != direction) else return 0 - return 1 + update_nearby_tiles(need_rebuild) if(!air_master) return 0 @@ -98,9 +120,7 @@ air_master.groups_to_rebuild += destination.parent else air_master.tiles_to_update += destination - else if(istype(source)) air_master.tiles_to_update += source if(istype(destination)) air_master.tiles_to_update += destination - return 1 \ No newline at end of file diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 21d98a7511a..5aacc6f1f92 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -1,9 +1,10 @@ -//cael - added this for the lockdown computer -/obj/machinery/door/poddoor/Topic(href, href_list) - if(href_list["close"]) - close() - if(href_list["open"]) - open() +/obj/machinery/door/poddoor + name = "Podlock" + desc = "A type of powerful blast door." + icon = 'rapid_pdoor.dmi' + icon_state = "pdoor1" + var/id = 1.0 + var/networkTag = "" /obj/machinery/door/poddoor/Bumped(atom/AM) if(!density) @@ -270,4 +271,107 @@ sleep(10) src.operating = 0 - return \ No newline at end of file + return + + + + +/obj/machinery/door/poddoor/two_tile_hor + var/obj/machinery/door/poddoor/filler_object/f1 + var/obj/machinery/door/poddoor/filler_object/f2 + icon = '1x2blast_hor.dmi' + + New() + ..() + f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) + f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,EAST)) + f1.density = density + f2.density = density + f1.sd_SetOpacity(opacity) + f2.sd_SetOpacity(opacity) + + Del() + del f1 + del f2 + ..() + +/obj/machinery/door/poddoor/two_tile_ver + var/obj/machinery/door/poddoor/filler_object/f1 + var/obj/machinery/door/poddoor/filler_object/f2 + icon = '1x2blast_vert.dmi' + + New() + ..() + f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) + f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,NORTH)) + f1.density = density + f2.density = density + f1.sd_SetOpacity(opacity) + f2.sd_SetOpacity(opacity) + + Del() + del f1 + del f2 + ..() + +/obj/machinery/door/poddoor/four_tile_hor + var/obj/machinery/door/poddoor/filler_object/f1 + var/obj/machinery/door/poddoor/filler_object/f2 + var/obj/machinery/door/poddoor/filler_object/f3 + var/obj/machinery/door/poddoor/filler_object/f4 + icon = '1x4blast_hor.dmi' + + New() + ..() + f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) + f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST)) + f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,EAST)) + f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,EAST)) + f1.density = density + f2.density = density + f3.density = density + f4.density = density + f1.sd_SetOpacity(opacity) + f2.sd_SetOpacity(opacity) + f4.sd_SetOpacity(opacity) + f3.sd_SetOpacity(opacity) + + Del() + del f1 + del f2 + del f3 + del f4 + ..() + +/obj/machinery/door/poddoor/four_tile_ver + var/obj/machinery/door/poddoor/filler_object/f1 + var/obj/machinery/door/poddoor/filler_object/f2 + var/obj/machinery/door/poddoor/filler_object/f3 + var/obj/machinery/door/poddoor/filler_object/f4 + icon = '1x4blast_vert.dmi' + + New() + ..() + f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) + f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH)) + f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,NORTH)) + f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,NORTH)) + f1.density = density + f2.density = density + f3.density = density + f4.density = density + f1.sd_SetOpacity(opacity) + f2.sd_SetOpacity(opacity) + f4.sd_SetOpacity(opacity) + f3.sd_SetOpacity(opacity) + + Del() + del f1 + del f2 + del f3 + del f4 + ..() + +/obj/machinery/door/poddoor/filler_object + name = "" + icon_state = "" \ No newline at end of file diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm new file mode 100644 index 00000000000..36cd2095baa --- /dev/null +++ b/code/game/machinery/doors/unpowered.dm @@ -0,0 +1,25 @@ +/obj/machinery/door/unpowered + autoclose = 0 + var/locked = 0 + + + Bumped(atom/AM) + if(src.locked) return + ..() + return + + + attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)) return + if(src.locked) return + ..() + return + + + +/obj/machinery/door/unpowered/shuttle + icon = 'shuttle.dmi' + name = "door" + icon_state = "door1" + opacity = 1 + density = 1 \ No newline at end of file diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a75600c9cea..50baa203d0d 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -1,3 +1,14 @@ +/obj/machinery/door/window + name = "interior door" + desc = "A door made from a window, yet it can not break nor be depowered." + icon = 'windoor.dmi' + icon_state = "left" + var/base_state = "left" + visible = 0.0 + flags = ON_BORDER + opacity = 0 + + /obj/machinery/door/window/update_nearby_tiles(need_rebuild) if(!air_master) return 0 @@ -147,4 +158,81 @@ close() else if (src.density) flick(text("[]deny", src.base_state), src) - return \ No newline at end of file + return + + + +/obj/machinery/door/window/brigdoor + name = "Brig Door" + icon = 'windoor.dmi' + icon_state = "leftsecure" + base_state = "leftsecure" + req_access = list(access_security) + var/id = null + + +/obj/machinery/door/window/northleft + dir = NORTH + +/obj/machinery/door/window/eastleft + dir = EAST + +/obj/machinery/door/window/westleft + dir = WEST + +/obj/machinery/door/window/southleft + dir = SOUTH + +/obj/machinery/door/window/northright + dir = NORTH + icon_state = "right" + base_state = "right" + +/obj/machinery/door/window/eastright + dir = EAST + icon_state = "right" + base_state = "right" + +/obj/machinery/door/window/westright + dir = WEST + icon_state = "right" + base_state = "right" + +/obj/machinery/door/window/southright + dir = SOUTH + icon_state = "right" + base_state = "right" + + +/obj/machinery/door/window/brigdoor/northleft + dir = NORTH + +/obj/machinery/door/window/brigdoor/eastleft + dir = EAST + +/obj/machinery/door/window/brigdoor/westleft + dir = WEST + +/obj/machinery/door/window/brigdoor/southleft + dir = SOUTH + +/obj/machinery/door/window/brigdoor/northright + dir = NORTH + icon_state = "rightsecure" + base_state = "rightsecure" + +/obj/machinery/door/window/brigdoor/eastright + dir = EAST + icon_state = "rightsecure" + base_state = "rightsecure" + +/obj/machinery/door/window/brigdoor/westright + dir = WEST + icon_state = "rightsecure" + base_state = "rightsecure" + +/obj/machinery/door/window/brigdoor/southright + dir = SOUTH + icon_state = "rightsecure" + base_state = "rightsecure" + diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 3de1d4897e3..e358be33532 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -2,7 +2,7 @@ name = "Emitter" desc = "A heavy duty industrial laser" icon = 'singularity.dmi' - icon_state = "Emitter" + icon_state = "emitter" anchored = 0 density = 1 req_access = list(access_engine) @@ -39,9 +39,9 @@ update_icon() if (active && !(stat & (NOPOWER|BROKEN))) - icon_state = "Emitter +a" + icon_state = "emitter_+a" else - icon_state = "Emitter" + icon_state = "emitter" attack_hand(mob/user as mob) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 207e60f114c..a9462687a9f 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -10,6 +10,11 @@ origin_tech = "combat=3;magnets=2" projectile_type = "/obj/item/projectile/beam" +/obj/item/weapon/gun/energy/laser/practice + name = "practice laser gun" + desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." + projectile_type = "/obj/item/projectile/beam/practice" + obj/item/weapon/gun/energy/laser/retro name ="\improper Retro Laser" diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 8e80b8a8024..a431b6ffc05 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -47,6 +47,15 @@ spawn(0) del(src) +/obj/item/projectile/beam/practice + name = "laser" + icon_state = "laser" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 0 + damage_type = BURN + flag = "laser" + eyeblur = 2 + /obj/item/projectile/beam/heavylaser name = "\improper Heavy Laser" icon_state = "heavylaser" diff --git a/icons/obj/doors/Doorfire.dmi b/icons/obj/doors/Doorfire.dmi index 1b0ddbe4eb14b50f0341e4b887ee7213345e5e3f..e996780a74c4114cbfd579f7faaa477b7503b2ee 100644 GIT binary patch delta 2801 zcmXw5c|6nqA0M)EatqsAM zXKB0>0~O%ib?+aj-bYE^KaK)kXsbL_Qd*guEOZcj4G2DTM$LD21|X3o+A1^*<}Wll z;es6V-MiJ{;raUd>qunjF%`Nh<`G&cTNxeeFPC;qDO46&WsG`y1e2$XUY(j;o0`l< zqjQzfg{qij3#Erf!qq0I=SMO5f1uZ$>b@|Zy?KEL_M`3md7}bqWpZc5+B~L*h z`rILD3NVU1EJ_v@gn+rj;cjsFSvcIOOqPo0*P%x7M^W$cA*tPb`U1Kd8dMZN3aO)` z6BZU$6K$o%+XWxd`P6BU`OMcVJm(!%NZ=WOCqQu-<9g2L8V7p?WnY4B1X38#EmJlK zv_Hs}fOGjXcPWPw;bJM-=9zgBdrtgLpOoZlJV>h8)}9GUuFBcOxqahjP5?0BcMoKv^Q7z=z$cEC27v~7r2(Xbm%%hmdi#~%n?@EY7s4}e}M+o$#->h&F(Gs7Z_Q6 zEOM43*`8j|yF}0r%xwhygy42Lt%eNU*JoJ>q4E?Lt?W;d6|9sP_8sLW$6{U!5rZI_~_($lMcd6yq93khVifo4D zU<3Y%n^UJjt15^XynFEQ5%sF6V3%v>OET578o#vA284&tWqzwYITF645Ltb9vt2ud>iz49^ytjJ7etvH%> z6sI9W3vS>DfMEz@v?hI4M8?=}EQYhUEqRlw?VZ_piN!Ipks2}KrS6SaK0^c=9t ztz$R8(%#BstE&v?BnfL70G*%t28u*g6Pbb*MGi=Td!fYjrTZ(=aKEx~Y(Ob=c$*4+c|YkMVV`vrKEEnp zDB+7~~ZuTbhDjrYe)~b1`R+MxL|?AKK#j@IFX~DdH#}G zlbAqgfYy*isPTy-amF>iG4(m`0@F-W-mk0usJ(pClP=o*BXg$DL@(&Vzm7%auV5dQ z0^eV34*RIcI7vSD%?qzeKIa>=lo!6ZSQ`-WL4mP%=X+i4&ur0w!&x#hG2l{^#S+;MzO_a54uKfAp$DB@@ zz^&-InO-4X)0?&O1Ftypm?n41;lL#bo3F=e4!A0jEb6%9Zg*!+({8h2^;&1mKThCA z4s#z3Djn>W9(Uw;WuI7mfhmw5>0h%Qzeci7TelW&6H*F9lm>EOhFJX=@Wn&polX0* zz~AF7Exq5>C7LF5t8CkNP=q=_^M;b%WftJ1Q^E-;P12eVRx~|?t<7HZWrSgxS`Fde z03CTlBf@*D>I89SN}JRXsYah{pX>W?U@gXe<4|djKlU^{VL7j=?V|>U;>&fa3(AbF zkJF7HS@Yo56Y;0I6WXumU;lQEv*|fbzKi`4&Y2|+Nip)44Juid$)jGnjazxlo+r#c z6AG-}Mx@CvcEyNUmbTEBa2n!S2n2!?u&JZCh#+@qq|0Oq@eK%wU-W@}9}1PzFYb|k zj@vp~DI61E-$@hqECi32J8Iw)%UY!85OEDnp&t>{ey4iO1T{|dZA?ABXIW9;fnl3; zJm~?ek;nw)j;hWd@|0Y)ZGwy=ucrLpBd;3J4z3v~%T1>E0H*$4frN|gTl6dk#EbR) zL)!J28EV3jhUTzT&1AOkUj)Z4=~mKf`!BRCo?m!p#USjL&eWf5cp3w$_= zZCtJB#1-r5UEG!(s$Eo@Q=DrCVDuB$EK<#m%!)RFr?*gT3a@r?8Kd4{?O#+i06ra2 zj8kiZ0xhc$r)UWB-hehIaaxqlzH^VyKRS{1i_$F`C+s&t@#83FD?sJUCCqr-m0fct zC~^yxZI(C-iG}nvUGMv*ZfpjZH5b~$zZqrin)`uFcH!NCLd%+frH&dII>Ej(2D>|AaE zhsaH)ce2So0>{l-whBTyioTAS3O>6|1_1mR=F{)Vp)wiMltTdE(yKu9xU{;k- zSdtv7T6345>(^|1wo5TOg51_G%J`=)+g4&rXR+mfhfOa<{J7m4xnp`eql6n4=)CLL zHZ~|~y8CgFyQ1|E zQe?M1&9i3ifIe7oqroliQh+0!BVD49AkvxF>O&UaXt3D}DHWOc&!+bJByD>ZMjz6* z*?L@y`>BjuiFnu;p>Gpf{`nVsVtd@SqS3aC7NQe_Y+>hBM<3GrGc6F@ zb#>&*2U0s$pc#>*>A7>fSHRv<}|mYNi40p}Ccdh&9taEHtA<1Fx}D;cNpcv(Z0?=MF$|W z&9G%hb!yG@9OdK+^s&h()FPLgY=>lARE@Pjoj3$Lp#?jk40}wGyydDoSyi>v+dExb zOOH~IwM3Nxk{De`Of<$H4lmTlX5(<_XmlVPUUV4y=pZf?jk=FPUsi!v8Y7=*;xaJk zr7`ZZ`WW{<8qLO_A0Nae6J)AQkoj7;hZ^YR@7$H|Tw9&JNgZlQ>uM}5F*M6r%#cMF zhqL0vkP=69by+FmhOA;SHCDSglGP?=05LEy2n`LrD^6GRc9fYBNfo~;QVJ#??M zc3xguUUpG+DSCg7Mz;d^m;_D}7mEqAwXLj58|?drd5X34sd?H%k9&=V`lA7h@wNw5 z%nZViNv#?G1`Yofh8TRcxm`1#MZ`llZm0P*IX&dPXJ8$`|@*z=bc=eXPe(7pj8o|eVb~^R4)Og&H_qE~^ z)@92!yq1=I9y*+6_|c2sw28!q1`J`8%YE>3KxdC-kh}<+F!+htijNZy4p$pqqX+GF4aR2Un(-NiV&B;Fa#8||XwZKalL=?!$+a7(JENQ1bP91B6UbH)?pb9mQ!8M5R437r*JQ|SiR>8ivOMsDaBVeAuRC@cOV10F=3 zo3WnBSx<@@Lo9h{M6o@)aW`eEe)~A$zzil=fjCo2Z?4@Jn2_%eSD5)u8H@uLA{9uT z30oF|)<#4)W6HO>#x(be--PG7fR7vn4Z4t)oq~AD_#M`y4pm;FMK@DYvA8qG!v=l^~2|^41l?`ocA!SZ&~CaNsEoC7~ia1vX8)cqn0_&{KF$zKCRS>d;$$Ve~zL1OS04Z~Z{IXG9qNG0ZkjA{xY;*ZuT zZUzFOZ%pg?q{3OwgMR43J9;tfbxf(6VJv(nc8;RcEW2$XxVfDpZ#$x}3~No?%B~v& ztd@gf{)+g^wBh|}W=``R9nICn(MP2|R{P?WUFz4X7af>)5Y0wAsp?x}ykOQFW83)y z>!qS5=5Dv<%4?JEfwj_2>m2nSHhLdScmCz#(!G2E#7YxF&NzI{Zc6?R1x|5%zkZQz zuc(2)IIJ^bll6*J<%C!rx+>K81nhn~nVUv)KJm0qW%t&jr~}XMfNux<;_7KN_0fe{ zKB17zzv|M#?q!zyrf@tXbls65Mp!LdYD>23n`|K@Pv#TjJOvJ3Ox*Em1i zmW*%FKdGZ2($bq(fiL3};`VIF+=NHO3w~j7T?g4YA@rq|re?q5P^g5?#+Ha!JsCHnKk&<=8|WG=X0Iez8CW(b|)k`sM^vx&MuH^c-`$=Z28Ql-c(X^x%yaBI4TyrGBi|P{Qqh%Yz z5g*pG|Arc3F6(rJXncmmQzdi(qi-)wo04_U#{y#g{56vM^K)RZ4d=Fa9#o!vNlXKi zCW4j6VPYPFe|yV%(@z2M?$u3RkNv!5#t0EZEWO49ehb$l*M&Joc*}p>C7xr-Jl311 zLMtqF4C;XEE?a1gH-svqH(vmFykUYt@L@JDVDQtWCQo`L< z=P%RK)7%!}I;k#kVncD1yCFHw-GFRXM@cURBMpD3H5>nL^j;EKZ*{?5lXq*VZXthy f#~#Mj33hRqkOyZt#_FO^1?c!OvgLDgPsYCiyot0{ diff --git a/icons/obj/singularity.dmi b/icons/obj/singularity.dmi index 350052781f7d12c98c156d4ce1f71538b71f00cc..cf1360c99c5e6e4cfff643f4fd33e866030ee841 100644 GIT binary patch delta 14760 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 delta 8594 zcmY+KWmHsO^!JDE0R(AjM5LP`q`SMMq(K@4sY^&BE!{aF0@4gENSA=5l!JhDGXo<$ z{Qgg@_1qU{t^4Ah``PF0yW@LqOFa7E3R(&!V2z6n0)ZMM>!d&+H2pvW6JG^;A6su{ zPhV#bcMvEb|4W9n>i{3gcgF*Lx=|{9=2dQsu4bfsw4JkmnVGTqJOt}++Ha2yCUSXO zn@<#)5gS1#g(*TYRafu)!+wUc^Xzqf#bhJ*S5FP5ndHt$ab$M>A;fJZTKJSDgU_4+ zAQFV-s5E=gtG!S-Kb|L*%3$;mGl8o5+BVGnq;O{ZgNaALHvCtPl}6&HJf6U(Y7LC@ zLyvRR&AFN8^=Cu-$f^|Ig+liL!={eS_MLl&Tp_!%GwDRF+CAGw`}W^_KOpF6c)CU@ zir(*8jTO8x_wxPto$^aW=LbDo*px({0jQPV2_?^W{z{p@v4^f;7G4aDJf*gZWPbvy z+!d+$bR=F2*%9hhHOU{^LJikOF3`G66?jMAjp2l54_nXm?-CihIYS@^p9nDR<#h^o zq!oMEpV4jx&3ZBUm@pVMtegx|QsCDQzE}PA6a-=fsVc}C1mquf2W7lA4mm+CHx;2B zssp?9&y@Xkk<(vlLdVnCTK*WP*u4$!dj}eR-~UG3F3XP3H0}F`g2Rc%l!7&dr2L6v zRWSdk+(@F0_7s;X=Q{zkGF@ ztXrpCu_9m4DN@@}Ph9HYUSH;NPU-(A^U0g=nRQv`>rZ^UEpZ5RR~u2M=V>p#eGvd^ z5>^5UJdO)zefCIRr7f{pMBOWwWysy@$A5e@#-v}XYnD)&E9Jqfb z)^{80Wg0PMiBpD@iW4)`Uh75kMU_*Ix7UgV{6qX{*|e(a1KC2xCg8D!AeM{iL3{Epa~Yb=e-gJn6P#)n+NlLJkB z^y^|b=Te;SfVyFZ?!1&T?I%JCoH|*7LG*XtAEb__w795(n^L6jz#!1S1Qmdq{w`N- zehm0LCf7z0!WWhDAbuZko?J``Nj~h^Cg_BLeszbl_HBIIjhD7~8%rOGu*u}LDtth$ zcL#M`EtqSI*ZhWS-u$DNzS=hXZI2e1w0nM%a~D??a!+{Po7)Bd5)vmZHA@N6TgX4E zulAwPRTbukLE>{i;$<*NegIbNEIv@$mn1&u8jShW-%*i0)XN&0B4ivlR8*f5^t7-c z3sNH(lDCK*6+im2azkTN^e_ih?qjV%quvIoygw=Qyl%s}(%cP9H!b>f7a7H%g&@NU zeR!U!uC2tAr|)?#Mis!PmaLy})qXjiGJlv43}AQJC{bQ>xOhH>Rs!^+W>v-wkeLRi z3z5)xXI(lM(j{mbIl)?I5n);0AX@k!s@Ywv;)PmM)rH|_hxu)B~hjgX%{lDik$7!QGUz^Uv- zxUkQ+k~C>Man8^Ae+(KTSPn}V{$P&jfH$8i!MnN}`<}z$_dx$g6rPhar!5_!N{DfO z!1*A``t8ib&@**6=Ee4*S5ao_Co+ou2K>2u!VxQAN&IG((ce)iHN__~GKm@m3@@oi z>|Sy!N6Dyl%|01BwZKI#_qg;P_$lf8GvcI3!o?W~;#e5TXJ(CzJisb$WAJIyv8Zd% zYIt%PoySVSQy@mSq;A&!22^ud5L4q=HlUu zg=SRzBSMvP-{Z^RzhH`X{1-M%9{k_xop&IN+>GS&fB+<+`#Z|i9~9^M%0RmAdK&ZP z2o=u)yz1M->KTNQtfs0eCO}e4TYGwR!?NqD(m!zFym zo{MpS-fT~qdR<-D^)eDlU7W?Y!?uP=y;ebjE@WYH!CbB_E$mGvXwc*isSpP93E)l6{6Hbx9hptU!a~h>2;GaJVopU8svVN=1ga+~-~O zpMX@vSjS~?eAjo~XD~G#uoIPGkR|txifD{1GuB>igSI_tJ-bk*k=&4dm^0>REhqaJ zkqmRa2jq@qRs2zB&gU#>Ybv{k0;{@rB&$F;r|zBXg$}6}_Uyj`$FDkC4LDDue5ih= zewMf66RO2Z9l0Fx*b66o=Uhc3p}W=283y0Z#+iSz%}nSk^i6?!sI-W1m@goeCp2;r zZGNMy4o`v}Pl})P(T72LK^i~r&oTqHUtuc$6i9NC`lPv)li`ShpNT1J`}Bm>FV6u| zqd}G(QeJlj&-&$WE@N)@i$;1Z&vbVMDB!0Q9&=H-e$!}eL?!07I8Xfq4LrF@WW}uQ z#v-EYC|r}jQ31ll)!8aKDvlVtWt1TK9| z`OZK44;0bH&sR16#UDQtN&D3FcSr&#iZB5yZNS^D1m)q=9l^AIIP-}DJuNTfYdaQ8 zDaBrI2G20Q?F#AWsd80kN=5fn5p1>)WOE9hs%AOQ3lC}j=|jmd8Lar=3hYn^&x?}i;2R7 z?(&mmdm~{80O%$V3v1iIpU_sNnu93XZztGc;H)r-^)x_O+R7MQaSNe zxu!EdD)D*1`|dCwXsqBgi~#eZ%x9(1sID8}^M5OFU)%N}KOSEo+%+6n37)ntce#iS zz-ntAfcj9aT}tJ2CC(4i2OVA#7ONE9&R2ojAMWp>ri()E?QXq)kE`E&JyC!6q9FEf z$vNqq*;~~FIuX4j8X4XJBXl&vF_tZ!;%-1J9XvXcgfs|w=--wfNKe&bQ z{!6xQ(aL!J4o382lrVX^$l_iBCgIh#uDUxcp*TDVk?MR&$M+4b1dC0fF{whGj(VPG zwU3Ha4qTUHqHirO2~RRPwt;yQCQO@`lzNmhf6N%kt`gnwaQ2txKW5~W=* zOKsSN7SjaMytp)RRTEPPUBWe{My?6XmQ(+pJ{&&l8{N+Qjjgi842QkBmnQk29nbo#*dJ~akLD*u zfQ_trAK5sCH?7+Ji(D>d;7!-KdJEtDa87-*lb8DAJfkDNIgw?~a)Oas+fGYybouJY zIxMc>tEp|{1i>wB)22zBrDkXSP$QTZT#0|#wMzZf#_lxhhCgVxt&$x3_T!+`;<5cS z42|0_htwDShqVluUdCRM0*=kz>_T%Y;Iu+xIg|GnwiDI@1bDoe{_Mwf_g6G+12I=! zxGmO0ijSutWStO}5zR-K^RxM_=?b-FfHMG?c4Io z%4p3zkJZ%JW3M_N`$0ojD$Qq1nd{Rba4gK9 zj>XwxBhOIBC45~j*nI*xZ|}u;X#cvmle!`fVMBg$j*o6aknG%H?=D>GbvV9R-8OMrh6CG*R{;eSF7n)cJEM4 zg(nBU(nNkFJftA5TY7~G5rNGbJdjuULA@MDvCaJ=XpTZBz_)`uQ$%<3{D2opL3fU8 zB)_9#KoW=LE^%H@K4L5*SCQgEF!O09R#Fw6Nvz8Ul9#u&8JkO+Cb3h66D|Eu?q>g< zv+L>Wr(+6Ze6Fr8c{IPW^7-=oJZplZ^?Hz_o+DXrNk7%FhZEma-r2NBug$;Pvqj+F z?cCUnpSw#wfU%Un)OEW!G-s8p)J$-fly^0Y#xA)Th{nrso)*3~7!U@#P6ZAArOKk+}1z=4q~-Q#f3Mg8#hqRo9- z;QrQQ+1m`+Go|^_6g`mXOzykjioO*=R)d(Z6YnRirhinY{FwI8V;LKz10BNRm7W$R zv51%X+oNCmh3xGY_@ti_Vgqd(zaA<)p5Ncs)w7?_8IyX@Z5Ung@L;SHaLGR1!sp)y zQn+p;DKI#73akp>O%wFB%6#jpwFwoVBD^1uL$K>9Dq?;4^2K(+IxjEp!isVV#Q8Gb z;z#xPtqi%&YB`jHd z(-tb?Tv#s24+sbg3y+SCsqOFYgIcgVZHK`NwWjhuK7x~zleMNz(a$8_Z97`~`S}?b z8BN8KN^T(Y-0z!T0~TgVKkL@?cZ`o#CiiC>sre&zB{mj2z63KbIg$Yv(w(+3G|__B zQAy_4SNhPxZ2tK~0JonfkL2I_UBm}|!Z#89)% zgfQYwPa+qKdremDG8m<^3btqG9MyxOi0@HP+QG-d9E2lkQg+Y*e$vdnZB zT`fD>n$c@Uop8n&#wcr&pZFf6X-`;w(JWWWd(HFB%qM=t; zS0EuFAy9+gff4BXXf;bTqSODR@Y00umF?VaQFgB{Ac&(JZE9gQ1U#H2k9_AGKE;sg zM!|tw&UZv~j?O|u{RszJzG6iu=OH+rq3W#Zsv>M6-4EY4J?@L#64W&%lnLAM+9&)# z&m({%Xf%eiP~gnW4-Ulv>}aosuXw*brN9ibYfLD?v_&1-jv7x%F~!*$;rL^+_%S;xuyqklL<^h`d2IB=NtgsmuXeo`%oFu^G?bg0`|Wzy zdySX9)6x*&s$U*-X-@Icy!Euz<)J^yN$87}c1Ot@ns?k5zb~prZl3iaxiPHyX4+xP!}bUkp$64Se~+u=uaxR*M-{A2Qu_uzH^$t-mSW&TN-$TpcIC=H2z4hA|&4B zXZO0V`M?ne3;*~YRumrX((*?U5fQyzgMAv}Hs8D7k|#^*J!_rb$x?E-y)9C`Pdcb8 z>)yP3a}UEq9E5okhFJwqyy>aG(8uocax8v=DW^Yb?xTynDg$u;AuRp9KY*)7vUJ&$ zQDM-4t(xr~s+uYE$LW%hN{%rVlf+2{J<;J1AI+4LQYd!&R`t77PjrcFrWiH_g;&Ow z^zped`jPwVA8MQOT>tK)U5+Uy{CnymZu#wCo` zswcQWSpZaOR=(k-5nkqSh;HwTH5SGx&ykbN8Y9mhQFiHx=JAGKA(o`TPONT)%?E7^ z0WSU~%p$XbrH03})*!GHE}#}98LC#9BhMj10g+*kjWiQ9>cC7RNR>>slTITy9dq8H z>Q?Dv1%@meRkA$VQK2_=WJjOYEt6>UN+yYl6sCHiFW&IA1G^mnsp8D+@C;;Z9yi1A50qSH_^T_f8-`Cv z*C6sAsNS8hM1RFCJyufF*(zsHWKQjhkcV`(C#mC+7SqN&w;UeYky7FDzW|Htq^d)x zy5S@wvsXP#>{+`Q$iRI!H#c~p|KSq<&O*@L^%0zB`!Sqf95h;LphlBSp-picGk|r2 z-)CVCV72wYr0qDy_SK0Sy7o}fUiKVyZyVk%@xfwK_tDG;c>PLCo&-J8bRBnU`${?; z6@7KE46`3EN4dGhm>3Ukw1!9!v2SYoYFPCUhFQ06TOAc^9PF8hm4`90w$ftLD1QIR zFt{^^+sYV#HTwDZy5VDFr2Nw~OaL6&7rIHJ^G7aP=lhDD%*ae9QDQ%NH8}YMliz3Q z(pG@b*G4Z{i7K}ub264QVcua>AO?Cr097;=>5FzA!qw!qb)f% z^YL*aVReK9Y3~;6|BiL;^nH}H zr_^!Z!EkinW26yy%>b!F7`>j34_TlS#=q!l92JTTr2=BRqRY+Kv$mtdJ>bMGoFfgL zbWg!kYKk*f7NR<%R6`P9~;8+3PyL$UxCV2h!M(YpM~Ek+yIimn%YxXT-h^#M(npc z`h!Fj}`2)^YHSN7iwSI0iE3Ak#QnP zjv^)|0!FVNORT9@J=|T1hu1vc`BsBB(DFCNB*KEoZY**M@As>iB)Yu&=qa+$j6sjx z$mDCw=ifba?HTo;rzJE7wY|o$ft4$|k>vQX44{u&|Z*Mm%JC^=XmU&G8!Y4+-x)*x=vQ!omV-`mt6LJ^})Zq`!8(ar&3}{jub! z9JGS<=6DZSFZOwf+@o}h0CXgH6J^vxvuB*{-__C=Jk28D)ashM$v6`?M5}V0@`ea7 ze2tgE9LM67a;W^tR0X|P`3+OG%{-qvE9H}lBv%OZnKCaeWNBGcPaqi~|9xl?jw9df znrn@V5I)6GYR|`dov6n1S>8=W8V7}oV5%_~)DC<00^UnvSYsydhG`C!^Ss!NCe|1# z()jrCV`*EPs8vvRMMV^?M^|crg#QjOes=t;BmME#O9Qf=!x#FB;Xm}RuA5?OpN%zh zHo60UCQ?}yogBPg%nk)D`uvNe)<4c8!@nXTaFVwL1z?Z5`Zh(2iGofrc(7ek=3!eo zEzl?6mSb5;CQ~gb9}`6amM-VRQ4`Z685wMVmc1~4&ki4%TUQhJN|T`;z+hmVdI~lD z=baHwT$UIF_G{B6s8xc5SsMJ^6BG0{%`&Uy2iyPGn~Wbzf#KT>fDtQ zi>8fN5Esf-lSQg<|DKDGf=(JZ$X#`P_Mgq&Sm#{kGMzBGd<@nlNfj-EKh2GfMJvCh zE2dWg{(O@xk;1(bpbB6hHEPIyaZ*w6B8Y0!^hmKvfF}42W5H40^f!-|4(lolmk-Li5(_8PErjCXC}+~4(Q* z>54HELWRJaGgx$NiZLVJTr+tEl<`uFIcknOI<03V+mY<31Fr2XEaoc?c8jwb3}=}0 zz#9nVSM+pv*MJRIpiWb8y`2KKpD_vcEX@ZZ7JV8*?HuWxuB(OW=Ix7hiFENi1mL>( zuEBQLBvd}K|Nh_ZFv2mf_d1$($!pEew*KMv>d-&^QVZv?A*=S%+(HXYLG@p#Pu$iM zneWgBF1dItDycX#>Gh5G8Evj!o?5KD4{Jk`enBO^YyB}MNVjGBrC=jrAp5IEkO@K8 zigdOFMTIXMK5FHwF_@Pqoi=_{4d5!9MVf_4iFe5`O#c{Wz!ezzGhr+2_gd>&mfo-c z&ki$%enMqd+QOs8tY#+1d}{V!UFRr{ireOPCZFn~p`}%{wJm#57(TguKD<0~llzVG zoFMO8(E+^3t!I%ubmEHF2_Fzg{3j!HVw_%fZ~Fsxe+IKwZ%prc>|$ntI4FG$u7l~e z7=(@vj1j}MaiXhs)tajtV?IVUqp=>h+$kBNMcA9oFiWW zB9Dp&x8^O$^IX~p9_#yW#rk>v*K=hH{60aMFmIr?%s!L^kwoh8%48>whn5W&NkFsrD2-_IIvh;9{K{ zw&S0Hd)%ZtA}TVARQ$V7G~LwJB`TI~^?$y-2tkS)Z%c$-m_IQ5%Bu;q@o1ZV{P6;$ Os;H%aStn;5@xK5)pV{gF