diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 13a8c2294ac..cbdbc03932c 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -338,3 +338,15 @@ initial_loc.air_vent_names -= id_tag ..() return + +/* + Alt-click to ventcrawl - Monkeys, aliens, and slimes + This is a little buggy but somehow that just seems to plague ventcrawl. + I am sorry, I don't know why. +*/ +/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/carbon/ML) + if(!istype(ML)) + return + var/list/ventcrawl_verbs = list(/mob/living/carbon/monkey/verb/ventcrawl, /mob/living/carbon/alien/verb/ventcrawl, /mob/living/carbon/slime/verb/ventcrawl) + if(length(ML.verbs & ventcrawl_verbs)) // alien queens have this removed, an istype would be complicated + ML.handle_ventcrawl(src) diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm index 33953434e6d..d4cc945cc6c 100644 --- a/code/WorkInProgress/buildmode.dm +++ b/code/WorkInProgress/buildmode.dm @@ -57,7 +57,7 @@ dir = NORTHWEST if(NORTHWEST) dir = NORTH - return + return 1 /obj/effect/bmode/buildhelp icon = 'icons/misc/buildmode.dmi' @@ -95,7 +95,7 @@ usr << "\blue Left Mouse Button on turf/obj/mob = Throw" usr << "\blue Right Mouse Button on turf/obj/mob = Select" usr << "\blue ***********************************************************" - return + return 1 /obj/effect/bmode/buildquit icon_state = "buildquit" @@ -103,6 +103,7 @@ Click() togglebuildmode(master.cl.mob) + return 1 /obj/effect/bmode/buildholder density = 0 @@ -142,7 +143,7 @@ else if(pa.Find("right")) switch(master.cl.buildmode) if(1) - return + return 1 if(2) objholder = input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet") var/P = text2path(objholder) @@ -157,9 +158,9 @@ master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name") if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0)) - return + return 1 var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference") - if(!thetype) return + if(!thetype) return 1 switch(thetype) if("text") master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text @@ -171,9 +172,10 @@ master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world if("turf-reference") master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world + return 1 -/proc/build_click(var/mob/user, buildmode, location, control, params, var/obj/object) +/proc/build_click(var/mob/user, buildmode, params, var/obj/object) var/obj/effect/bmode/buildholder/holder = null for(var/obj/effect/bmode/buildholder/H) if(H.cl == user.client) diff --git a/code/__DEFINES.dm b/code/__DEFINES.dm index 30b1390e423..a7e0d755370 100644 --- a/code/__DEFINES.dm +++ b/code/__DEFINES.dm @@ -48,17 +48,17 @@ #define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere //To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. -#define TABLEPASS 2 // can pass by a table or rack +#define TABLEPASS 2 // can pass by a table or rack ~ apparently actually unused, uses pass_flags instead #define MASKINTERNALS 8 // mask allows internals //#define SUITSPACE 8 // suit protects against space -#define USEDELAY 16 // 1 second extra delay on use (Can be used once every 2s) -#define NODELAY 32768 // 1 second attackby delay skipped (Can be used once every 0.2s). Most objects have a 1s attackby delay, which doesn't require a flag. +#define USEDELAY 16 // For adding extra delay to heavy items, not currently used #define NOSHIELD 32 // weapon not affected by shield #define CONDUCT 64 // conducts electricity (metal etc.) #define FPRINT 256 // takes a fingerprint #define ON_BORDER 512 // item has priority to check when entering or leaving +#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() #define GLASSESCOVERSEYES 1024 #define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm new file mode 100644 index 00000000000..c02737400ba --- /dev/null +++ b/code/_onclick/adjacent.dm @@ -0,0 +1,124 @@ +/* + Adjacency proc for determining touch range + + This is mostly to determine if a user can enter a square for the purposes of touching something. + Examples include reaching a square diagonally or reaching something on the other side of a glass window. + + This is calculated by looking for border items, or in the case of clicking diagonally from yourself, dense items. + This proc will NOT notice if you are trying to attack a window on the other side of a dense object in its turf. There is a window helper for that. + + Note that in all cases the neighbor is handled simply; this is usually the user's mob, in which case it is up to you + to check that the mob is not inside of something +*/ +/atom/proc/Adjacent(var/atom/neighbor) // basic inheritance, unused + return 0 + +// Not a sane use of the function and (for now) indicative of an error elsewhere +/area/Adjacent(var/atom/neighbor) + CRASH("Call to /area/Adjacent(), unimplemented proc") + + +/* + Adjacency (to turf): + * If you are in the same turf, always true + * If you are vertically/horizontally adjacent, ensure there are no border objects + * If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square. + * Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays. +*/ +/turf/Adjacent(var/atom/neighbor, var/atom/target = null) + var/turf/T0 = get_turf(neighbor) + if(T0 == src) + return 1 + if(get_dist(src,T0) > 1) + return 0 + + if(T0.x == x || T0.y == y) + // Check for border blockages + return T0.ClickCross(get_dir(T0,src), border_only = 1) && src.ClickCross(get_dir(src,T0), border_only = 1, target_atom = target) + + // Not orthagonal + var/in_dir = get_dir(neighbor,src) // eg. northwest (1+8) + var/d1 = in_dir&(in_dir-1) // eg west (1+8)&(8) = 8 + var/d2 = in_dir - d1 // eg north (1+8) - 8 = 1 + + for(var/d in list(d1,d2)) + if(!T0.ClickCross(d, border_only = 1)) + continue // could not leave T0 in that direction + + var/turf/T1 = get_step(T0,d) + if(!T1 || T1.density || !T1.ClickCross(get_dir(T1,T0) & get_dir(T1,src), border_only = 0)) + continue // couldn't enter or couldn't leave T1 + + if(!src.ClickCross(get_dir(src,T1), border_only = 1, target_atom = target)) + continue // could not enter src + + return 1 // we don't care about our own density + return 0 + +/* + Adjacency (to anything else): + * Must be on a turf + * In the case of a multiple-tile object, all valid locations are checked for adjacency. + + Note: Multiple-tile objects are created when the bound_width and bound_height are creater than the tile size. + This is not used in stock /tg/station currently. +*/ +/atom/movable/Adjacent(var/atom/neighbor) + if(neighbor == loc) return 1 + if(!isturf(loc)) return 0 + for(var/turf/T in locs) + if(isnull(T)) continue + if(T.Adjacent(neighbor,src)) return 1 + return 0 + +// This is necessary for storage items not on your person. +/obj/item/Adjacent(var/atom/neighbor, var/recurse = 1) + if(neighbor == loc) return 1 + if(istype(loc,/obj/item)) + if(recurse > 0) + return loc.Adjacent(neighbor,recurse - 1) + return 0 + return ..() +/* + Special case: This allows you to reach a door when it is visally on top of, + but technically behind, a fire door + + You could try to rewrite this to be faster, but I'm not sure anything would be. + This can be safely removed if border firedoors are ever moved to be on top of doors + so they can be interacted with without opening the door. +*/ +/obj/machinery/door/Adjacent(var/atom/neighbor) + var/obj/machinery/door/firedoor/border_only/BOD = locate() in loc + if(BOD) + BOD.throwpass = 1 // allow click to pass + . = ..() + BOD.throwpass = 0 + return . + return ..() + + +/* + This checks if you there is uninterrupted airspace between that turf and this one. + This is defined as any dense ON_BORDER object, or any dense object without throwpass. + The border_only flag allows you to not objects (for source and destination squares) +*/ +/turf/proc/ClickCross(var/target_dir, var/border_only, var/target_atom = null) + for(var/obj/O in src) + if( !O.density || O == target_atom || O.throwpass) continue // throwpass is used for anything you can click through + + if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first + if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically + return 0 + + else if( !border_only ) // dense, not on border, cannot pass over + return 0 + return 1 +/* + Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not + a thrown object should stop after already successfully entering a square. Currently the throw code involved + only seems to affect hitting mobs, because the checks performed against objects are already performed when + entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively + useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags). + + Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here. +*/ \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm new file mode 100644 index 00000000000..1ffe3b37d55 --- /dev/null +++ b/code/_onclick/ai.dm @@ -0,0 +1,120 @@ +/* + AI ClickOn() + + Note currently ai restrained() returns 0 in all cases, + therefore restrained code has been removed + + The AI can double click to move the camera (this was already true but is cleaner), + or double click a mob to track them. + + Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner. +*/ +/mob/living/silicon/ai/DblClickOn(var/atom/A) + if(control_disabled || stat) return + next_move = world.time + 9 + + if(ismob(A)) + ai_actual_track(A) + else + A.move_camera_by_click() + + +/mob/living/silicon/ai/ClickOn(var/atom/A, params) + if(world.time <= next_click) + return + next_click = world.time + 1 + + if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked + build_click(src, client.buildmode, params, A) + return + + var/list/modifiers = params2list(params) + if("middle" in modifiers) + MiddleClickOn(A) + return + if("shift" in modifiers) + ShiftClickOn(A) + return + if("ctrl" in modifiers) + CtrlClickOn(A) + return + if("alt" in modifiers) + AltClickOn(A) + return + if(control_disabled || stat || world.time <= next_move) return + next_move = world.time + 9 + + /* + AI restrained() currently does nothing + if(restrained()) + RestrainedClickOn(A) + else + */ + A.attack_ai(src) + +/* + AI has no need for the UnarmedAttack() and RangedAttack() procs, + because the AI code is not generic; attack_ai() is used instead. + The below is only really for safety, or you can alter the way + it functions and re-insert it above. +*/ +/mob/living/silicon/ai/UnarmedAttack(atom/A) + A.attack_ai(src) +/mob/living/silicon/ai/RangedAttack(atom/A) + A.attack_ai(src) + +/atom/proc/attack_ai(mob/user as mob) + return + +/* + Since the AI handles shift, ctrl, and alt-click differently + than anything else in the game, atoms have separate procs + for AI shift, ctrl, and alt clicking. +*/ +/mob/living/silicon/ai/ShiftClickOn(var/atom/A) + A.AIShiftClick(src) +/mob/living/silicon/ai/CtrlClickOn(var/atom/A) + A.AICtrlClick(src) +/mob/living/silicon/ai/AltClickOn(var/atom/A) + A.AIAltClick(src) + +/* + The following criminally helpful code is just the previous code cleaned up; + I have no idea why it was in atoms.dm instead of respective files. +*/ + +/atom/proc/AIShiftClick() + return + +/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! + if(density) + Topic("aiEnable=7", list("aiEnable"="7"), 1) // 1 meaning no window (consistency!) + else + Topic("aiDisable=7", list("aiDisable"="7"), 1) + return + + +/atom/proc/AICtrlClick() + return + +/obj/machinery/door/airlock/AICtrlClick() // Bolts doors + if(locked) + Topic("aiEnable=4", list("aiEnable"="4"), 1)// 1 meaning no window (consistency!) + else + Topic("aiDisable=4", list("aiDisable"="4"), 1) + +/obj/machinery/power/apc/AICtrlClick() // turns off APCs. + Topic("breaker=1", list("breaker"="1"), 0) // 0 meaning no window (consistency! wait...) + + +/atom/proc/AIAltClick() + return + +/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. + if(!secondsElectrified) + // permenant shock + Topic("aiEnable=6", list("aiEnable"="6"), 1) // 1 meaning no window (consistency!) + else + // disable/6 is not in Topic; disable/5 disables both temporary and permenant shock + Topic("aiDisable=5", list("aiDisable"="5"), 1) + return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm new file mode 100644 index 00000000000..f66bd303e94 --- /dev/null +++ b/code/_onclick/click.dm @@ -0,0 +1,294 @@ +/* + Click code cleanup + ~Sayu +*/ + +// 1 decisecond click delay (above and beyond mob/next_move) +/mob/var/next_click = 0 + +/* + Before anything else, defer these calls to a per-mobtype handler. This allows us to + remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. + + Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however, + that's a lot of code duplication and is hard to maintain. + + Note that this proc can be overridden, and is in the case of screen objects. +*/ +/atom/Click(location,control,params) + usr.ClickOn(src, params) +/atom/DblClick(location,control,params) + usr.DblClickOn(src,params) + +/* + Standard mob ClickOn() + Handles exceptions: Buildmode, middle click, modified clicks, mech actions + + After that, mostly just check your state, check whether you're holding an item, + check whether you're adjacent to the target, then pass off the click to whoever + is recieving it. + The most common are: + * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves + * atom/attackby(item,user) - used only when adjacent + * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent + * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed +*/ +/mob/proc/ClickOn( var/atom/A, var/params ) + if(world.time <= next_click) + return + next_click = world.time + 1 + + if(client.buildmode) + build_click(src, client.buildmode, params, A) + return + + var/list/modifiers = params2list(params) + if("middle" in modifiers) + MiddleClickOn(A) + return + if("shift" in modifiers) + ShiftClickOn(A) + return + if("ctrl" in modifiers) + CtrlClickOn(A) + return + if("alt" in modifiers) + AltClickOn(A) + return + + if(stat || paralysis || stunned || weakened) + return + + face_atom(A) // change direction to face what you clicked on + + if(next_move > world.time) // in the year 2000... + return + + if(istype(loc,/obj/mecha)) + var/obj/mecha/M = loc + return M.click_action(A,src) + + if(restrained()) + RestrainedClickOn(A) + return + + if(in_throw_mode) + throw_item(A) + return + + var/obj/item/W = get_active_hand() + + if(W == A) + next_move = world.time + 6 + if(W.flags&USEDELAY) + next_move += 5 + W.attack_self(src) + if(hand) + update_inv_l_hand(0) + else + update_inv_r_hand(0) + + return + + // operate two levels deep here (item in backpack in src; NOT item in box in backpack in src) + if(A == loc || (A in loc) || (A in contents) || (A.loc in contents)) + + // faster access to objects already on you + if(A in contents) + next_move = world.time + 6 // on your person + else + next_move = world.time + 8 // in a box/bag or in your square + + // No adjacency needed + if(W) + if(W.flags&USEDELAY) + next_move += 5 + + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) // 1 indicates adjacency + else + UnarmedAttack(A) + return + + if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that + return + + // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that + if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc))) + next_move = world.time + 10 + + if(A.Adjacent(src)) // see adjacent.dm + if(W) + if(W.flags&USEDELAY) + next_move += 5 + + // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) // 1: clicking something Adjacent + else + UnarmedAttack(A, 1) + return + else // non-adjacent click + if(W) + W.afterattack(A,src,0,params) // 0: not Adjacent + else + RangedAttack(A, params) + + return + +// Default behavior: ignore double clicks, consider them normal clicks instead +/mob/proc/DblClickOn(var/atom/A, var/params) + ClickOn(A,params) + + +/* + Translates into attack_hand, etc. + + Note: proximity_flag here is used to distinguish between normal usage (flag=1), + and usage when clicking on things telekinetically (flag=0). This proc will + not be called at ranged except with telekinesis. + + proximity_flag is not currently passed to attack_hand, and is instead used + in human click code to allow glove touches only at melee range. +*/ +/mob/proc/UnarmedAttack(var/atom/A, var/proximity_flag) + return + +/* + Ranged unarmed attack: + + This currently is just a default for all mobs, involving + laser eyes and telekinesis. You could easily add exceptions + for things like ranged glove touches, spitting alien acid/neurotoxin, + animals lunging, etc. +*/ +/mob/proc/RangedAttack(var/atom/A, var/params) + if(!mutations.len) return + if((LASER in mutations) && a_intent == "harm") + LaserEyes(A) // moved into a proc below + else if(TK in mutations) + switch(get_dist(src,A)) + if(0) + ; + if(1 to 5) // not adjacent may mean blocked by window + next_move += 2 + if(5 to 7) + next_move += 5 + if(8 to tk_maxrange) + next_move += 10 + else + return + A.attack_tk(src) +/* + Restrained ClickOn + + Used when you are handcuffed and click things. + Not currently used by anything but could easily be. +*/ +/mob/proc/RestrainedClickOn(var/atom/A) + return + +/* + Middle click + Only used for swapping hands +*/ +/mob/proc/MiddleClickOn(var/atom/A) + return +/mob/living/carbon/MiddleClickOn(var/atom/A) + swap_hand() + +// In case of use break glass +/* +/atom/proc/MiddleClick(var/mob/M as mob) + return +*/ + +/* + Shift click + For most mobs, examine. + This is overridden in ai.dm +*/ +/mob/proc/ShiftClickOn(var/atom/A) + A.ShiftClick(src) + return +/atom/proc/ShiftClick(var/mob/user) + if(user.client && user.client.eye == user) + examine() + return + +/* + Ctrl click + For most objects, pull +*/ +/mob/proc/CtrlClickOn(var/atom/A) + A.CtrlClick(src) + return +/atom/proc/CtrlClick(var/mob/user) + return + +/atom/movable/CtrlClick(var/mob/user) + if(Adjacent(user)) + user.start_pulling(src) + +/* + Alt click + Unused except for AI +*/ +/mob/proc/AltClickOn(var/atom/A) + A.AltClick(src) + return + +/atom/proc/AltClick(var/mob/user) + return + +/* + Misc helpers + + Laser Eyes: as the name implies, handles this since nothing else does currently + face_atom: turns the mob towards what you clicked on +*/ +/mob/proc/LaserEyes(atom/A) + return + +/mob/living/LaserEyes(atom/A) + next_move = world.time + 6 + var/turf/T = get_turf(src) + var/turf/U = get_turf(A) + + var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc ) + LE.icon = 'icons/effects/genetics.dmi' + LE.icon_state = "eyelasers" + playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + + LE.firer = src + LE.def_zone = get_organ_target() + LE.original = A + LE.current = T + LE.yo = U.y - T.y + LE.xo = U.x - T.x + spawn( 1 ) + LE.process() + +/mob/living/carbon/human/LaserEyes() + if(nutrition>0) + ..() + nutrition = max(nutrition - rand(1,5),0) + handle_regular_hud_updates() + else + src << "\red You're out of energy! You need food!" + +// Simple helper to face what you clicked on, in case it should be needed in more than one place +/mob/proc/face_atom(var/atom/A) + if( buckled || !A || !x || !y || !A.x || !A.y ) return + var/dx = A.x - x + var/dy = A.y - y + if(!dx && !dy) return + + if(abs(dx) < abs(dy)) + if(dy > 0) usr.dir = NORTH + else usr.dir = SOUTH + else + if(dx > 0) usr.dir = EAST + else usr.dir = WEST \ No newline at end of file diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm new file mode 100644 index 00000000000..e3089d22f60 --- /dev/null +++ b/code/_onclick/cyborg.dm @@ -0,0 +1,112 @@ +/* + Cyborg ClickOn() + + Cyborgs have no range restriction on attack_robot(), because it is basically an AI click. + However, they do have a range restriction on item use, so they cannot do without the + adjacency code. +*/ + +/mob/living/silicon/robot/ClickOn(var/atom/A, var/params) + if(world.time <= next_click) + return + next_click = world.time + 1 + + if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked + build_click(src, client.buildmode, params, A) + return + + var/list/modifiers = params2list(params) + if("middle" in modifiers) + MiddleClickOn(A) + return + if("shift" in modifiers) + ShiftClickOn(A) + return + if("ctrl" in modifiers) + CtrlClickOn(A) + return + if("alt" in modifiers) + AltClickOn(A) + return + + if(stat || lockcharge || weakened || stunned || paralysis) + return + + if(next_move >= world.time) + return + + face_atom(A) // change direction to face what you clicked on + + /* + cyborg restrained() currently does nothing + if(restrained()) + RestrainedClickOn(A) + return + */ + + var/obj/item/W = get_active_hand() + + // Cyborgs have no range-checking unless there is item use + if(!W) + A.attack_robot(src) + return + + // buckled cannot prevent machine interlinking but stops arm movement + if( buckled ) + return + + if(W == A) + next_move = world.time + 8 + if(W.flags&USEDELAY) + next_move += 5 + + W.attack_self(src) + return + + // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) + if(A == loc || (A in loc) || (A in contents)) + // No adjacency checks + next_move = world.time + 8 + if(W.flags&USEDELAY) + next_move += 5 + + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) + return + + if(!isturf(loc)) + return + + // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) + if(isturf(A) || isturf(A.loc)) + if(A.Adjacent(src)) // see adjacent.dm + next_move = world.time + 10 + if(W.flags&USEDELAY) + next_move += 5 + + var/resolved = A.attackby(W, src) + if(!resolved && A && W) + W.afterattack(A, src, 1, params) + return + else + next_move = world.time + 10 + W.afterattack(A, src, 0, params) + return + return +/* + As with AI, these are not used in click code, + because the code for robots is specific, not generic. + + If you would like to add advanced features to robot + clicks, you can do so here, but you will have to + change attack_robot() above to the proper function +*/ +/mob/living/silicon/robot/UnarmedAttack(atom/A) + A.attack_robot(src) +/mob/living/silicon/robot/RangedAttack(atom/A) + A.attack_robot(src) + +/atom/proc/attack_robot(mob/user as mob) + attack_ai(user) + return diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm new file mode 100644 index 00000000000..42a0574f4d8 --- /dev/null +++ b/code/_onclick/drag_drop.dm @@ -0,0 +1,18 @@ +/* + MouseDrop: + + Called on the atom you're dragging. In a lot of circumstances we want to use the + recieving object instead, so that's the default action. This allows you to drag + almost anything into a trash can. +*/ +/atom/MouseDrop(atom/over) + if(!usr || !over) return + if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows + + spawn(0) + over.MouseDrop_T(src,usr) + return + +// recieve a mousedrop +/atom/proc/MouseDrop_T(atom/dropping, mob/user) + return diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm new file mode 100644 index 00000000000..9f37952c0b5 --- /dev/null +++ b/code/_onclick/hud/_defines.dm @@ -0,0 +1,104 @@ +/* + These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. + + The short version: + + Everything is encoded as strings because apparently that's how Byond rolls. + + "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. + "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. + Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. + + The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". + Therefore, the top right corner (except during admin shenanigans) is at "15,15" +*/ + +//Upper left action buttons, displayed when you pick up an item that has this enabled. +#define ui_action_slot1 "1:6,14:26" +#define ui_action_slot2 "2:8,14:26" +#define ui_action_slot3 "3:10,14:26" +#define ui_action_slot4 "4:12,14:26" +#define ui_action_slot5 "5:14,14:26" + +//Lower left, persistant menu +#define ui_inventory "1:6,1:5" + +//changeling chem indicator +#define ui_lingchemdisplay "1,7:15" + +//Lower center, persistant menu +#define ui_sstore1 "3:10,1:5" +#define ui_id "4:12,1:5" +#define ui_belt "5:14,1:5" +#define ui_back "6:14,1:5" +#define ui_rhand "7:16,1:5" +#define ui_lhand "8:16,1:5" +#define ui_equip "7:16,2:5" +#define ui_swaphand1 "7:16,2:5" +#define ui_swaphand2 "8:16,2:5" +#define ui_storage1 "9:18,1:5" +#define ui_storage2 "10:20,1:5" + +#define ui_inv1 "6:16,1:5" //borgs +#define ui_inv2 "7:16,1:5" //borgs +#define ui_inv3 "8:16,1:5" //borgs +#define ui_borg_store "9:16,1:5" //borgs + +#define ui_monkey_mask "5:14,1:5" //monkey +#define ui_monkey_back "6:15,1:5" //monkey + +#define ui_alien_storage_l "6:14,1:5" +#define ui_alien_storage_r "9:18,1:5" + +//Lower right, persistant menu +#define ui_drop_throw "14:28,2:7" +#define ui_pull_resist "13:26,2:7" +#define ui_movi "13:26,1:5" +#define ui_acti "12:24,1:5" +#define ui_zonesel "14:28,1:5" +#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12) + +#define ui_borg_pull "12:24,2:7" +#define ui_borg_module "13:26,2:7" +#define ui_borg_panel "14:28,2:7" + +//Upper-middle right (damage indicators) +#define ui_toxin "14:28,13:27" +#define ui_fire "14:28,12:25" +#define ui_oxygen "14:28,11:23" +#define ui_pressure "14:28,10:21" + +#define ui_alien_toxin "14:28,13:25" +#define ui_alien_fire "14:28,12:25" +#define ui_alien_oxygen "14:28,11:25" + +//Middle right (status indicators) +#define ui_nutrition "14:28,5:11" +#define ui_temp "14:28,6:13" +#define ui_health "14:28,7:15" +#define ui_internal "14:28,8:17" + //borgs +#define ui_borg_health "14:28,6:13" //borgs have the health display where humans have the pressure damage indicator. +#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator. + +//Pop-up inventory +#define ui_shoes "2:8,1:5" + +#define ui_iclothing "1:6,2:7" +#define ui_oclothing "2:8,2:7" +#define ui_gloves "3:10,2:7" + +#define ui_glasses "1:6,3:9" +#define ui_mask "2:8,3:9" +#define ui_ears "3:10,3:9" + +#define ui_head "2:8,4:11" + +#define ui_hand "6:14,1:5" +#define ui_hstore1 "5,5" +#define ui_sleep "EAST+1, NORTH-13" +#define ui_rest "EAST+1, NORTH-14" + + +#define ui_iarrowleft "SOUTH-1,11" +#define ui_iarrowright "SOUTH-1,13" diff --git a/code/modules/mob/living/carbon/alien/humanoid/hud.dm b/code/_onclick/hud/alien.dm similarity index 96% rename from code/modules/mob/living/carbon/alien/humanoid/hud.dm rename to code/_onclick/hud/alien.dm index 7b47201fd18..a073462a596 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/hud.dm +++ b/code/_onclick/hud/alien.dm @@ -1,166 +1,166 @@ -/datum/hud/proc/alien_hud() - adding = list() - other = list() - - var/obj/screen/using - var/obj/screen/inventory/inv_box - -//equippable shit - -//hands - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "hand_r_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_r_active" - inv_box.screen_loc = ui_rhand - inv_box.layer = 19 - r_hand_hud_object = inv_box - inv_box.slot_id = slot_r_hand - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "hand_l_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_l_active" - inv_box.screen_loc = ui_lhand - inv_box.layer = 19 - inv_box.slot_id = slot_l_hand - l_hand_hud_object = inv_box - adding += inv_box - -//pocket 1 - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_alien_storage_l - inv_box.slot_id = slot_l_store - inv_box.layer = 19 - adding += inv_box - -//pocket 2 - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_alien_storage_r - inv_box.slot_id = slot_r_store - inv_box.layer = 19 - adding += inv_box - -//begin buttons - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - adding += using - - using = new /obj/screen() - using.name = "act_intent" - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - adding += using - - using = new /obj/screen() - using.name = "resist" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.layer = 19 - adding += using - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen_alien.dmi' - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen_alien.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - -//begin indicators - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen_alien.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_alien_health - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel/alien() - mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += adding + other - +/datum/hud/proc/alien_hud() + adding = list() + other = list() + + var/obj/screen/using + var/obj/screen/inventory/inv_box + +//equippable shit + +//hands + inv_box = new /obj/screen/inventory() + inv_box.name = "r_hand" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "hand_r_inactive" + if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use + inv_box.icon_state = "hand_r_active" + inv_box.screen_loc = ui_rhand + inv_box.layer = 19 + r_hand_hud_object = inv_box + inv_box.slot_id = slot_r_hand + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "l_hand" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "hand_l_inactive" + if(mymob && mymob.hand) //This being 1 means the left hand is in use + inv_box.icon_state = "hand_l_active" + inv_box.screen_loc = ui_lhand + inv_box.layer = 19 + inv_box.slot_id = slot_l_hand + l_hand_hud_object = inv_box + adding += inv_box + +//pocket 1 + inv_box = new /obj/screen/inventory() + inv_box.name = "storage1" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_alien_storage_l + inv_box.slot_id = slot_l_store + inv_box.layer = 19 + adding += inv_box + +//pocket 2 + inv_box = new /obj/screen/inventory() + inv_box.name = "storage2" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_alien_storage_r + inv_box.slot_id = slot_r_store + inv_box.layer = 19 + adding += inv_box + +//begin buttons + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "swap_1" + using.screen_loc = ui_swaphand1 + using.layer = 19 + adding += using + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "swap_2" + using.screen_loc = ui_swaphand2 + using.layer = 19 + adding += using + + using = new /obj/screen() + using.name = "act_intent" + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + + using = new /obj/screen() + using.name = "mov_intent" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.layer = 20 + adding += using + move_intent = using + + using = new /obj/screen() + using.name = "drop" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "act_drop" + using.screen_loc = ui_drop_throw + using.layer = 19 + adding += using + + using = new /obj/screen() + using.name = "resist" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "act_resist" + using.screen_loc = ui_pull_resist + using.layer = 19 + adding += using + + mymob.throw_icon = new /obj/screen() + mymob.throw_icon.icon = 'icons/mob/screen_alien.dmi' + mymob.throw_icon.icon_state = "act_throw_off" + mymob.throw_icon.name = "throw/catch" + mymob.throw_icon.screen_loc = ui_drop_throw + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen_alien.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_pull_resist + +//begin indicators + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_alien_oxygen + + mymob.toxin = new /obj/screen() + mymob.toxin.icon = 'icons/mob/screen_alien.dmi' + mymob.toxin.icon_state = "tox0" + mymob.toxin.name = "toxin" + mymob.toxin.screen_loc = ui_alien_toxin + + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen_alien.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_alien_fire + + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen_alien.dmi' + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_alien_health + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "1,1" + mymob.blind.layer = 0 + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen_alien.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel/alien() + mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += adding + other + diff --git a/code/modules/mob/living/carbon/alien/larva/hud.dm b/code/_onclick/hud/alien_larva.dm similarity index 95% rename from code/modules/mob/living/carbon/alien/larva/hud.dm rename to code/_onclick/hud/alien_larva.dm index ff0f24447c3..32c7a67106e 100644 --- a/code/modules/mob/living/carbon/alien/larva/hud.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -1,77 +1,77 @@ -/datum/hud/proc/larva_hud() - adding = list() - other = list() - - var/obj/screen/using - - using = new /obj/screen() - using.name = "act_intent" - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - adding += using - move_intent = using - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - - - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen_alien.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_alien_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen_alien.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel/alien() - mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) +/datum/hud/proc/larva_hud() + adding = list() + other = list() + + var/obj/screen/using + + using = new /obj/screen() + using.name = "act_intent" + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + + using = new /obj/screen() + using.name = "mov_intent" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.layer = 20 + adding += using + move_intent = using + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_alien_oxygen + + mymob.toxin = new /obj/screen() + mymob.toxin.icon = 'icons/mob/screen_alien.dmi' + mymob.toxin.icon_state = "tox0" + mymob.toxin.name = "toxin" + mymob.toxin.screen_loc = ui_alien_toxin + + + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen_alien.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_alien_fire + + + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen_alien.dmi' + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_alien_health + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen_alien.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_pull_resist + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "1,1" + mymob.blind.layer = 0 + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen_alien.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel/alien() + mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += adding + other \ No newline at end of file diff --git a/code/datums/hud.dm b/code/_onclick/hud/hud.dm similarity index 62% rename from code/datums/hud.dm rename to code/_onclick/hud/hud.dm index d4e02804fac..c494298cb85 100644 --- a/code/datums/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -1,268 +1,238 @@ -//Upper left action buttons, displayed when you pick up an item that has this enabled. -#define ui_action_slot1 "1:6,14:26" -#define ui_action_slot2 "2:8,14:26" -#define ui_action_slot3 "3:10,14:26" -#define ui_action_slot4 "4:12,14:26" -#define ui_action_slot5 "5:14,14:26" - -//Lower left, persistant menu -#define ui_inventory "1:6,1:5" - -//changeling chem indicator -#define ui_lingchemdisplay "1,7:15" - -//Lower center, persistant menu -#define ui_sstore1 "3:10,1:5" -#define ui_id "4:12,1:5" -#define ui_belt "5:14,1:5" -#define ui_back "6:14,1:5" -#define ui_rhand "7:16,1:5" -#define ui_lhand "8:16,1:5" -#define ui_equip "7:16,2:5" -#define ui_swaphand1 "7:16,2:5" -#define ui_swaphand2 "8:16,2:5" -#define ui_storage1 "9:18,1:5" -#define ui_storage2 "10:20,1:5" - -#define ui_inv1 "6:16,1:5" //borgs -#define ui_inv2 "7:16,1:5" //borgs -#define ui_inv3 "8:16,1:5" //borgs -#define ui_borg_store "9:16,1:5" //borgs - -#define ui_monkey_mask "5:14,1:5" //monkey -#define ui_monkey_back "6:15,1:5" //monkey - -#define ui_alien_storage_l "6:14,1:5" -#define ui_alien_storage_r "9:18,1:5" - -//Lower right, persistant menu -#define ui_drop_throw "14:28,2:7" -#define ui_pull_resist "13:26,2:7" -#define ui_movi "13:26,1:5" -#define ui_acti "12:24,1:5" -#define ui_zonesel "14:28,1:5" -#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12) - -#define ui_borg_pull "12:24,2:7" -#define ui_borg_module "13:26,2:7" -#define ui_borg_panel "14:28,2:7" - -//Upper-middle right (damage indicators) -#define ui_toxin "14:28,13:27" -#define ui_fire "14:28,12:25" -#define ui_oxygen "14:28,11:23" -#define ui_pressure "14:28,10:21" - -#define ui_alien_toxin "14:28,13:25" -#define ui_alien_fire "14:28,12:25" -#define ui_alien_oxygen "14:28,11:25" - -//Middle right (status indicators) -#define ui_nutrition "14:28,5:11" -#define ui_temp "14:28,6:13" -#define ui_health "14:28,7:15" -#define ui_internal "14:28,8:17" - //borgs -#define ui_borg_health "14:28,6:13" //borgs have the health display where humans have the pressure damage indicator. -#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator. - -//Pop-up inventory -#define ui_shoes "2:8,1:5" - -#define ui_iclothing "1:6,2:7" -#define ui_oclothing "2:8,2:7" -#define ui_gloves "3:10,2:7" - -#define ui_glasses "1:6,3:9" -#define ui_mask "2:8,3:9" -#define ui_ears "3:10,3:9" - -#define ui_head "2:8,4:11" - -#define ui_hand "6:14,1:5" -#define ui_hstore1 "5,5" -#define ui_sleep "EAST+1, NORTH-13" -#define ui_rest "EAST+1, NORTH-14" - - -#define ui_iarrowleft "SOUTH-1,11" -#define ui_iarrowright "SOUTH-1,13" - -var/datum/global_hud/global_hud = new() - -/datum/global_hud - var/obj/screen/druggy - var/obj/screen/blurry - var/list/vimpaired - var/list/darkMask - -/datum/global_hud/New() - //420erryday psychedellic colours screen overlay for when you are high - druggy = new /obj/screen() - druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" - druggy.icon_state = "druggy" - druggy.layer = 17 - druggy.mouse_opacity = 0 - - //that white blurry effect you get when you eyes are damaged - blurry = new /obj/screen() - blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" - blurry.icon_state = "blurry" - blurry.layer = 17 - blurry.mouse_opacity = 0 - - var/obj/screen/O - var/i - //that nasty looking dither you get when you're short-sighted - vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen) - O = vimpaired[1] - O.screen_loc = "1,1 to 5,15" - O = vimpaired[2] - O.screen_loc = "5,1 to 10,5" - O = vimpaired[3] - O.screen_loc = "6,11 to 10,15" - O = vimpaired[4] - O.screen_loc = "11,1 to 15,15" - - //welding mask overlay black/dither - darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) - O = darkMask[1] - O.screen_loc = "3,3 to 5,13" - O = darkMask[2] - O.screen_loc = "5,3 to 10,5" - O = darkMask[3] - O.screen_loc = "6,11 to 10,13" - O = darkMask[4] - O.screen_loc = "11,3 to 13,13" - O = darkMask[5] - O.screen_loc = "1,1 to 15,2" - O = darkMask[6] - O.screen_loc = "1,3 to 2,15" - O = darkMask[7] - O.screen_loc = "14,3 to 15,15" - O = darkMask[8] - O.screen_loc = "3,14 to 13,15" - - for(i = 1, i <= 4, i++) - O = vimpaired[i] - O.icon_state = "dither50" - O.layer = 17 - O.mouse_opacity = 0 - - O = darkMask[i] - O.icon_state = "dither50" - O.layer = 17 - O.mouse_opacity = 0 - - for(i = 5, i <= 8, i++) - O = darkMask[i] - O.icon_state = "black" - O.layer = 17 - O.mouse_opacity = 0 - - -/datum/hud - var/mob/mymob - - var/hud_shown = 1 //Used for the HUD toggle (F12) - var/inventory_shown = 1 //the inventory - var/show_intent_icons = 0 - var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - - var/obj/screen/lingchemdisplay - var/obj/screen/blobpwrdisplay - var/obj/screen/blobhealthdisplay - var/obj/screen/r_hand_hud_object - var/obj/screen/l_hand_hud_object - var/obj/screen/action_intent - var/obj/screen/move_intent - - var/list/adding - var/list/other - var/list/obj/screen/hotkeybuttons - - var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. - - -datum/hud/New(mob/owner) - mymob = owner - instantiate() - ..() - - -/datum/hud/proc/hidden_inventory_update() - if(!mymob) - return - - if(ishuman(mymob)) - var/mob/living/carbon/human/H = mymob - if(H.handcuffed) - H.handcuffed.screen_loc = null //no handcuffs in my UI! - if(inventory_shown && hud_shown) - if(H.shoes) H.shoes.screen_loc = ui_shoes - if(H.gloves) H.gloves.screen_loc = ui_gloves - if(H.ears) H.ears.screen_loc = ui_ears - if(H.glasses) H.glasses.screen_loc = ui_glasses - if(H.w_uniform) H.w_uniform.screen_loc = ui_iclothing - if(H.wear_suit) H.wear_suit.screen_loc = ui_oclothing - if(H.wear_mask) H.wear_mask.screen_loc = ui_mask - if(H.head) H.head.screen_loc = ui_head - else - if(H.shoes) H.shoes.screen_loc = null - if(H.gloves) H.gloves.screen_loc = null - if(H.ears) H.ears.screen_loc = null - if(H.glasses) H.glasses.screen_loc = null - if(H.w_uniform) H.w_uniform.screen_loc = null - if(H.wear_suit) H.wear_suit.screen_loc = null - if(H.wear_mask) H.wear_mask.screen_loc = null - if(H.head) H.head.screen_loc = null - - -/datum/hud/proc/persistant_inventory_update() - if(!mymob) - return - - if(ishuman(mymob)) - var/mob/living/carbon/human/H = mymob - if(hud_shown) - if(H.s_store) H.s_store.screen_loc = ui_sstore1 - if(H.wear_id) H.wear_id.screen_loc = ui_id - if(H.belt) H.belt.screen_loc = ui_belt - if(H.back) H.back.screen_loc = ui_back - if(H.l_store) H.l_store.screen_loc = ui_storage1 - if(H.r_store) H.r_store.screen_loc = ui_storage2 - else - if(H.s_store) H.s_store.screen_loc = null - if(H.wear_id) H.wear_id.screen_loc = null - if(H.belt) H.belt.screen_loc = null - if(H.back) H.back.screen_loc = null - if(H.l_store) H.l_store.screen_loc = null - if(H.r_store) H.r_store.screen_loc = null - - -/datum/hud/proc/instantiate() - if(!ismob(mymob)) - return 0 - if(!mymob.client) - return 0 - - var/ui_style = ui_style2icon(mymob.client.prefs.UI_style) - - if(ishuman(mymob)) - human_hud(ui_style) // Pass the player the UI style chosen in preferences - else if(ismonkey(mymob)) - monkey_hud(ui_style) - else if(isbrain(mymob)) - brain_hud(ui_style) - else if(islarva(mymob)) - larva_hud() - else if(isalien(mymob)) - alien_hud() - else if(isAI(mymob)) - ai_hud() - else if(isrobot(mymob)) - robot_hud() - else if(isobserver(mymob)) - ghost_hud() - else if(isovermind(mymob)) - blob_hud() +/* + The global hud: + Uses the same visual objects for all players. +*/ +var/datum/global_hud/global_hud = new() + +/datum/global_hud + var/obj/screen/druggy + var/obj/screen/blurry + var/list/vimpaired + var/list/darkMask + +/datum/global_hud/New() + //420erryday psychedellic colours screen overlay for when you are high + druggy = new /obj/screen() + druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" + druggy.icon_state = "druggy" + druggy.layer = 17 + druggy.mouse_opacity = 0 + + //that white blurry effect you get when you eyes are damaged + blurry = new /obj/screen() + blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" + blurry.icon_state = "blurry" + blurry.layer = 17 + blurry.mouse_opacity = 0 + + var/obj/screen/O + var/i + //that nasty looking dither you get when you're short-sighted + vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen) + O = vimpaired[1] + O.screen_loc = "1,1 to 5,15" + O = vimpaired[2] + O.screen_loc = "5,1 to 10,5" + O = vimpaired[3] + O.screen_loc = "6,11 to 10,15" + O = vimpaired[4] + O.screen_loc = "11,1 to 15,15" + + //welding mask overlay black/dither + darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) + O = darkMask[1] + O.screen_loc = "3,3 to 5,13" + O = darkMask[2] + O.screen_loc = "5,3 to 10,5" + O = darkMask[3] + O.screen_loc = "6,11 to 10,13" + O = darkMask[4] + O.screen_loc = "11,3 to 13,13" + O = darkMask[5] + O.screen_loc = "1,1 to 15,2" + O = darkMask[6] + O.screen_loc = "1,3 to 2,15" + O = darkMask[7] + O.screen_loc = "14,3 to 15,15" + O = darkMask[8] + O.screen_loc = "3,14 to 13,15" + + for(i = 1, i <= 4, i++) + O = vimpaired[i] + O.icon_state = "dither50" + O.layer = 17 + O.mouse_opacity = 0 + + O = darkMask[i] + O.icon_state = "dither50" + O.layer = 17 + O.mouse_opacity = 0 + + for(i = 5, i <= 8, i++) + O = darkMask[i] + O.icon_state = "black" + O.layer = 17 + O.mouse_opacity = 0 + +/* + The hud datum + Used to show and hide huds for all the different mob types, + including inventories and item quick actions. +*/ + +/datum/hud + var/mob/mymob + + var/hud_shown = 1 //Used for the HUD toggle (F12) + var/inventory_shown = 1 //the inventory + var/show_intent_icons = 0 + var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + + var/obj/screen/lingchemdisplay + var/obj/screen/blobpwrdisplay + var/obj/screen/blobhealthdisplay + var/obj/screen/r_hand_hud_object + var/obj/screen/l_hand_hud_object + var/obj/screen/action_intent + var/obj/screen/move_intent + + var/list/adding + var/list/other + var/list/obj/screen/hotkeybuttons + + var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. + + +datum/hud/New(mob/owner) + mymob = owner + instantiate() + ..() + + +/datum/hud/proc/hidden_inventory_update() + if(!mymob) + return + + if(ishuman(mymob)) + var/mob/living/carbon/human/H = mymob + if(H.handcuffed) + H.handcuffed.screen_loc = null //no handcuffs in my UI! + if(inventory_shown && hud_shown) + if(H.shoes) H.shoes.screen_loc = ui_shoes + if(H.gloves) H.gloves.screen_loc = ui_gloves + if(H.ears) H.ears.screen_loc = ui_ears + if(H.glasses) H.glasses.screen_loc = ui_glasses + if(H.w_uniform) H.w_uniform.screen_loc = ui_iclothing + if(H.wear_suit) H.wear_suit.screen_loc = ui_oclothing + if(H.wear_mask) H.wear_mask.screen_loc = ui_mask + if(H.head) H.head.screen_loc = ui_head + else + if(H.shoes) H.shoes.screen_loc = null + if(H.gloves) H.gloves.screen_loc = null + if(H.ears) H.ears.screen_loc = null + if(H.glasses) H.glasses.screen_loc = null + if(H.w_uniform) H.w_uniform.screen_loc = null + if(H.wear_suit) H.wear_suit.screen_loc = null + if(H.wear_mask) H.wear_mask.screen_loc = null + if(H.head) H.head.screen_loc = null + + +/datum/hud/proc/persistant_inventory_update() + if(!mymob) + return + + if(ishuman(mymob)) + var/mob/living/carbon/human/H = mymob + if(hud_shown) + if(H.s_store) H.s_store.screen_loc = ui_sstore1 + if(H.wear_id) H.wear_id.screen_loc = ui_id + if(H.belt) H.belt.screen_loc = ui_belt + if(H.back) H.back.screen_loc = ui_back + if(H.l_store) H.l_store.screen_loc = ui_storage1 + if(H.r_store) H.r_store.screen_loc = ui_storage2 + else + if(H.s_store) H.s_store.screen_loc = null + if(H.wear_id) H.wear_id.screen_loc = null + if(H.belt) H.belt.screen_loc = null + if(H.back) H.back.screen_loc = null + if(H.l_store) H.l_store.screen_loc = null + if(H.r_store) H.r_store.screen_loc = null + + +/datum/hud/proc/instantiate() + if(!ismob(mymob)) + return 0 + if(!mymob.client) + return 0 + + var/ui_style = ui_style2icon(mymob.client.prefs.UI_style) + + if(ishuman(mymob)) + human_hud(ui_style) // Pass the player the UI style chosen in preferences + else if(ismonkey(mymob)) + monkey_hud(ui_style) + else if(isbrain(mymob)) + brain_hud(ui_style) + else if(islarva(mymob)) + larva_hud() + else if(isalien(mymob)) + alien_hud() + else if(isAI(mymob)) + ai_hud() + else if(isrobot(mymob)) + robot_hud() + else if(isobserver(mymob)) + ghost_hud() + else if(isovermind(mymob)) + blob_hud() + +//Triggered when F12 is pressed (Unless someone changed something in the DMF) +/mob/verb/button_pressed_F12() + set name = "F12" + set hidden = 1 + + if(hud_used) + if(ishuman(src)) + if(!src.client) return + + if(hud_used.hud_shown) + hud_used.hud_shown = 0 + if(src.hud_used.adding) + src.client.screen -= src.hud_used.adding + if(src.hud_used.other) + src.client.screen -= src.hud_used.other + if(src.hud_used.hotkeybuttons) + src.client.screen -= src.hud_used.hotkeybuttons + if(src.hud_used.item_action_list) + src.client.screen -= src.hud_used.item_action_list + + //Due to some poor coding some things need special treatment: + //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay + src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible + src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible + src.client.screen += src.hud_used.action_intent //we want the intent swticher visible + src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. + + //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. + src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. + + else + hud_used.hud_shown = 1 + if(src.hud_used.adding) + src.client.screen += src.hud_used.adding + if(src.hud_used.other && src.hud_used.inventory_shown) + src.client.screen += src.hud_used.other + if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden) + src.client.screen += src.hud_used.hotkeybuttons + + + src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position + src.client.screen += src.zone_sel //This one is a special snowflake + + hud_used.hidden_inventory_update() + hud_used.persistant_inventory_update() + update_action_buttons() + else + usr << "\red Inventory hiding is currently only supported for human mobs, sorry." + else + usr << "\red This mob type does not use a HUD." diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/_onclick/hud/human.dm similarity index 96% rename from code/modules/mob/living/carbon/human/hud.dm rename to code/_onclick/hud/human.dm index 9cc6c297a01..04b32735c09 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/_onclick/hud/human.dm @@ -1,375 +1,375 @@ -/datum/hud/proc/human_hud(ui_style = 'icons/mob/screen_midnight.dmi') - adding = list() - other = list() - hotkeybuttons = list() //These can be disabled for hotkey users - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - hotkeybuttons += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "i_clothing" - inv_box.icon = ui_style - inv_box.slot_id = slot_w_uniform - inv_box.icon_state = "uniform" - inv_box.screen_loc = ui_iclothing - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "o_clothing" - inv_box.icon = ui_style - inv_box.slot_id = slot_wear_suit - inv_box.icon_state = "suit" - inv_box.screen_loc = ui_oclothing - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.icon = ui_style - inv_box.icon_state = "hand_r_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_r_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - r_hand_hud_object = inv_box - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.icon = ui_style - inv_box.icon_state = "hand_l_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_l_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - l_hand_hud_object = inv_box - adding += inv_box - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "id" - inv_box.icon = ui_style - inv_box.icon_state = "id" - inv_box.screen_loc = ui_id - inv_box.slot_id = slot_wear_id - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.icon = ui_style - inv_box.icon_state = "mask" - inv_box.screen_loc = ui_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.icon = ui_style - inv_box.icon_state = "back" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage1 - inv_box.slot_id = slot_l_store - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage2 - inv_box.slot_id = slot_r_store - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "suit storage" - inv_box.icon = ui_style - inv_box.icon_state = "suit_storage" - inv_box.screen_loc = ui_sstore1 - inv_box.slot_id = slot_s_store - inv_box.layer = 19 - adding += inv_box - - using = new /obj/screen() - using.name = "resist" - using.icon = ui_style - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.layer = 19 - hotkeybuttons += using - - using = new /obj/screen() - using.name = "toggle" - using.icon = ui_style - using.icon_state = "toggle" - using.screen_loc = ui_inventory - using.layer = 20 - adding += using - - using = new /obj/screen() - using.name = "equip" - using.icon = ui_style - using.icon_state = "act_equip" - using.screen_loc = ui_equip - using.layer = 20 - adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "gloves" - inv_box.icon = ui_style - inv_box.icon_state = "gloves" - inv_box.screen_loc = ui_gloves - inv_box.slot_id = slot_gloves - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "eyes" - inv_box.icon = ui_style - inv_box.icon_state = "glasses" - inv_box.screen_loc = ui_glasses - inv_box.slot_id = slot_glasses - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "ears" - inv_box.icon = ui_style - inv_box.icon_state = "ears" - inv_box.screen_loc = ui_ears - inv_box.slot_id = slot_ears - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "head" - inv_box.icon = ui_style - inv_box.icon_state = "head" - inv_box.screen_loc = ui_head - inv_box.slot_id = slot_head - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "shoes" - inv_box.icon = ui_style - inv_box.icon_state = "shoes" - inv_box.screen_loc = ui_shoes - inv_box.slot_id = slot_shoes - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "belt" - inv_box.icon = ui_style - inv_box.icon_state = "belt" - inv_box.screen_loc = ui_belt - inv_box.slot_id = slot_belt - inv_box.layer = 19 - adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" - mymob.throw_icon.screen_loc = ui_drop_throw - hotkeybuttons += mymob.throw_icon - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon_state = "nutrition0" - mymob.nutrition_icon.name = "nutrition" - mymob.nutrition_icon.screen_loc = ui_nutrition - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - hotkeybuttons += mymob.pullin - - lingchemdisplay = new /obj/screen() - lingchemdisplay.name = "chemical storage" - lingchemdisplay.icon_state = "power_display" - lingchemdisplay.screen_loc = ui_lingchemdisplay - lingchemdisplay.layer = 20 - lingchemdisplay.invisibility = 101 - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.mouse_opacity = 0 - mymob.blind.layer = 0 - - mymob.damageoverlay = new /obj/screen() - mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi' - mymob.damageoverlay.icon_state = "oxydamageoverlay0" - mymob.damageoverlay.name = "dmg" - mymob.damageoverlay.screen_loc = "1,1" - mymob.damageoverlay.mouse_opacity = 0 - mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. - - mymob.flash = new /obj/screen() - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = ui_style - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, lingchemdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) - mymob.client.screen += adding + hotkeybuttons - inventory_shown = 0; - - -/mob/living/carbon/human/verb/toggle_hotkey_verbs() - set category = "OOC" - set name = "Toggle hotkey buttons" - set desc = "This disables or enables the user interface buttons which can be used with hotkeys." - - if(hud_used.hotkey_ui_hidden) - client.screen += hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 0 - else - client.screen -= hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 1 - - -/mob/living/carbon/human/update_action_buttons() - var/num = 1 - if(!hud_used) return - if(!client) return - - if(!hud_used.hud_shown) //Hud toggled to minimal - return - - client.screen -= hud_used.item_action_list - - for(var/obj/item/I in src) - if(I.action_button_name) - if(hud_used.item_action_list.len < num) - var/obj/screen/item_action/N = new(hud_used) - hud_used.item_action_list += N - - var/obj/screen/item_action/A = hud_used.item_action_list[num] - - A.icon = ui_style2icon(client.prefs.UI_style) - A.icon_state = "template" - - A.overlays = list() - var/image/img = image(I.icon, A, I.icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - A.overlays += img - - A.name = I.action_button_name - A.owner = I - - client.screen += hud_used.item_action_list[num] - - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. +/datum/hud/proc/human_hud(ui_style = 'icons/mob/screen_midnight.dmi') + adding = list() + other = list() + hotkeybuttons = list() //These can be disabled for hotkey users + + var/obj/screen/using + var/obj/screen/inventory/inv_box + + using = new /obj/screen() + using.name = "act_intent" + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + + using = new /obj/screen() + using.name = "mov_intent" + using.icon = ui_style + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.layer = 20 + adding += using + move_intent = using + + using = new /obj/screen() + using.name = "drop" + using.icon = ui_style + using.icon_state = "act_drop" + using.screen_loc = ui_drop_throw + using.layer = 19 + hotkeybuttons += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "i_clothing" + inv_box.icon = ui_style + inv_box.slot_id = slot_w_uniform + inv_box.icon_state = "uniform" + inv_box.screen_loc = ui_iclothing + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "o_clothing" + inv_box.icon = ui_style + inv_box.slot_id = slot_wear_suit + inv_box.icon_state = "suit" + inv_box.screen_loc = ui_oclothing + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "r_hand" + inv_box.icon = ui_style + inv_box.icon_state = "hand_r_inactive" + if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use + inv_box.icon_state = "hand_r_active" + inv_box.screen_loc = ui_rhand + inv_box.slot_id = slot_r_hand + inv_box.layer = 19 + r_hand_hud_object = inv_box + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "l_hand" + inv_box.icon = ui_style + inv_box.icon_state = "hand_l_inactive" + if(mymob && mymob.hand) //This being 1 means the left hand is in use + inv_box.icon_state = "hand_l_active" + inv_box.screen_loc = ui_lhand + inv_box.slot_id = slot_l_hand + inv_box.layer = 19 + l_hand_hud_object = inv_box + adding += inv_box + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = ui_style + using.icon_state = "swap_1" + using.screen_loc = ui_swaphand1 + using.layer = 19 + adding += using + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = ui_style + using.icon_state = "swap_2" + using.screen_loc = ui_swaphand2 + using.layer = 19 + adding += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "id" + inv_box.icon = ui_style + inv_box.icon_state = "id" + inv_box.screen_loc = ui_id + inv_box.slot_id = slot_wear_id + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "mask" + inv_box.icon = ui_style + inv_box.icon_state = "mask" + inv_box.screen_loc = ui_mask + inv_box.slot_id = slot_wear_mask + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "back" + inv_box.icon = ui_style + inv_box.icon_state = "back" + inv_box.screen_loc = ui_back + inv_box.slot_id = slot_back + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "storage1" + inv_box.icon = ui_style + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_storage1 + inv_box.slot_id = slot_l_store + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "storage2" + inv_box.icon = ui_style + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_storage2 + inv_box.slot_id = slot_r_store + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "suit storage" + inv_box.icon = ui_style + inv_box.icon_state = "suit_storage" + inv_box.screen_loc = ui_sstore1 + inv_box.slot_id = slot_s_store + inv_box.layer = 19 + adding += inv_box + + using = new /obj/screen() + using.name = "resist" + using.icon = ui_style + using.icon_state = "act_resist" + using.screen_loc = ui_pull_resist + using.layer = 19 + hotkeybuttons += using + + using = new /obj/screen() + using.name = "toggle" + using.icon = ui_style + using.icon_state = "toggle" + using.screen_loc = ui_inventory + using.layer = 20 + adding += using + + using = new /obj/screen() + using.name = "equip" + using.icon = ui_style + using.icon_state = "act_equip" + using.screen_loc = ui_equip + using.layer = 20 + adding += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "gloves" + inv_box.icon = ui_style + inv_box.icon_state = "gloves" + inv_box.screen_loc = ui_gloves + inv_box.slot_id = slot_gloves + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "eyes" + inv_box.icon = ui_style + inv_box.icon_state = "glasses" + inv_box.screen_loc = ui_glasses + inv_box.slot_id = slot_glasses + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "ears" + inv_box.icon = ui_style + inv_box.icon_state = "ears" + inv_box.screen_loc = ui_ears + inv_box.slot_id = slot_ears + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "head" + inv_box.icon = ui_style + inv_box.icon_state = "head" + inv_box.screen_loc = ui_head + inv_box.slot_id = slot_head + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "shoes" + inv_box.icon = ui_style + inv_box.icon_state = "shoes" + inv_box.screen_loc = ui_shoes + inv_box.slot_id = slot_shoes + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "belt" + inv_box.icon = ui_style + inv_box.icon_state = "belt" + inv_box.screen_loc = ui_belt + inv_box.slot_id = slot_belt + inv_box.layer = 19 + adding += inv_box + + mymob.throw_icon = new /obj/screen() + mymob.throw_icon.icon = ui_style + mymob.throw_icon.icon_state = "act_throw_off" + mymob.throw_icon.name = "throw/catch" + mymob.throw_icon.screen_loc = ui_drop_throw + hotkeybuttons += mymob.throw_icon + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_oxygen + + mymob.pressure = new /obj/screen() + mymob.pressure.icon_state = "pressure0" + mymob.pressure.name = "pressure" + mymob.pressure.screen_loc = ui_pressure + + mymob.toxin = new /obj/screen() + mymob.toxin.icon_state = "tox0" + mymob.toxin.name = "toxin" + mymob.toxin.screen_loc = ui_toxin + + mymob.internals = new /obj/screen() + mymob.internals.icon_state = "internal0" + mymob.internals.name = "internal" + mymob.internals.screen_loc = ui_internal + + mymob.fire = new /obj/screen() + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_fire + + mymob.bodytemp = new /obj/screen() + mymob.bodytemp.icon_state = "temp1" + mymob.bodytemp.name = "body temperature" + mymob.bodytemp.screen_loc = ui_temp + + mymob.healths = new /obj/screen() + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_health + + mymob.nutrition_icon = new /obj/screen() + mymob.nutrition_icon.icon_state = "nutrition0" + mymob.nutrition_icon.name = "nutrition" + mymob.nutrition_icon.screen_loc = ui_nutrition + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = ui_style + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_pull_resist + hotkeybuttons += mymob.pullin + + lingchemdisplay = new /obj/screen() + lingchemdisplay.name = "chemical storage" + lingchemdisplay.icon_state = "power_display" + lingchemdisplay.screen_loc = ui_lingchemdisplay + lingchemdisplay.layer = 20 + lingchemdisplay.invisibility = 101 + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "1,1" + mymob.blind.mouse_opacity = 0 + mymob.blind.layer = 0 + + mymob.damageoverlay = new /obj/screen() + mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi' + mymob.damageoverlay.icon_state = "oxydamageoverlay0" + mymob.damageoverlay.name = "dmg" + mymob.damageoverlay.screen_loc = "1,1" + mymob.damageoverlay.mouse_opacity = 0 + mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. + + mymob.flash = new /obj/screen() + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel() + mymob.zone_sel.icon = ui_style + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, lingchemdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += adding + hotkeybuttons + inventory_shown = 0; + + +/mob/living/carbon/human/verb/toggle_hotkey_verbs() + set category = "OOC" + set name = "Toggle hotkey buttons" + set desc = "This disables or enables the user interface buttons which can be used with hotkeys." + + if(hud_used.hotkey_ui_hidden) + client.screen += hud_used.hotkeybuttons + hud_used.hotkey_ui_hidden = 0 + else + client.screen -= hud_used.hotkeybuttons + hud_used.hotkey_ui_hidden = 1 + + +/mob/living/carbon/human/update_action_buttons() + var/num = 1 + if(!hud_used) return + if(!client) return + + if(!hud_used.hud_shown) //Hud toggled to minimal + return + + client.screen -= hud_used.item_action_list + + for(var/obj/item/I in src) + if(I.action_button_name) + if(hud_used.item_action_list.len < num) + var/obj/screen/item_action/N = new(hud_used) + hud_used.item_action_list += N + + var/obj/screen/item_action/A = hud_used.item_action_list[num] + + A.icon = ui_style2icon(client.prefs.UI_style) + A.icon_state = "template" + + A.overlays = list() + var/image/img = image(I.icon, A, I.icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + A.overlays += img + + A.name = I.action_button_name + A.owner = I + + client.screen += hud_used.item_action_list[num] + + switch(num) + if(1) + A.screen_loc = ui_action_slot1 + if(2) + A.screen_loc = ui_action_slot2 + if(3) + A.screen_loc = ui_action_slot3 + if(4) + A.screen_loc = ui_action_slot4 + if(5) + A.screen_loc = ui_action_slot5 + break //5 slots available, so no more can be added. num++ diff --git a/code/modules/mob/living/carbon/monkey/hud.dm b/code/_onclick/hud/monkey.dm similarity index 100% rename from code/modules/mob/living/carbon/monkey/hud.dm rename to code/_onclick/hud/monkey.dm diff --git a/code/game/gamemodes/blob/hud.dm b/code/_onclick/hud/other_mobs.dm similarity index 50% rename from code/game/gamemodes/blob/hud.dm rename to code/_onclick/hud/other_mobs.dm index e4d459888bd..9ecb1419315 100644 --- a/code/game/gamemodes/blob/hud.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -1,3 +1,21 @@ + +/datum/hud/proc/unplayer_hud() + return + +/datum/hud/proc/ghost_hud() + return + +/datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen_midnight.dmi') + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "1,1" + mymob.blind.layer = 0 + +/datum/hud/proc/ai_hud() + return + /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') blobpwrdisplay = new /obj/screen() @@ -14,4 +32,4 @@ mymob.client.screen = null - mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) \ No newline at end of file + mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) diff --git a/code/modules/mob/living/silicon/robot/hud.dm b/code/_onclick/hud/robot.dm similarity index 96% rename from code/modules/mob/living/silicon/robot/hud.dm rename to code/_onclick/hud/robot.dm index 9de71fc3ace..324fbb0dd58 100644 --- a/code/modules/mob/living/silicon/robot/hud.dm +++ b/code/_onclick/hud/robot.dm @@ -1,143 +1,143 @@ -/datum/hud/proc/robot_hud() - adding = list() - other = list() - - var/obj/screen/using - - -//Radio - using = new /obj/screen() - using.name = "radio" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "radio" - using.screen_loc = ui_movi - using.layer = 20 - adding += using - -//Module select - - using = new /obj/screen() - using.name = "module1" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv1" - using.screen_loc = ui_inv1 - using.layer = 20 - adding += using - mymob:inv1 = using - - using = new /obj/screen() - using.name = "module2" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv2" - using.screen_loc = ui_inv2 - using.layer = 20 - adding += using - mymob:inv2 = using - - using = new /obj/screen() - using.name = "module3" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv3" - using.screen_loc = ui_inv3 - using.layer = 20 - adding += using - mymob:inv3 = using - -//End of module select - -//Intent - using = new /obj/screen() - using.name = "act_intent" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - -//Cell - mymob:cells = new /obj/screen() - mymob:cells.icon = 'icons/mob/screen_cyborg.dmi' - mymob:cells.icon_state = "charge-empty" - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin - -//Health - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen_cyborg.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_borg_health - -//Installed Module - mymob.hands = new /obj/screen() - mymob.hands.icon = 'icons/mob/screen_cyborg.dmi' - mymob.hands.icon_state = "nomod" - mymob.hands.name = "module" - mymob.hands.screen_loc = ui_borg_module - -//Module Panel - using = new /obj/screen() - using.name = "panel" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "panel" - using.screen_loc = ui_borg_panel - using.layer = 19 - adding += using - -//Store - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen_cyborg.dmi' - mymob.throw_icon.icon_state = "store" - mymob.throw_icon.name = "store" - mymob.throw_icon.screen_loc = ui_borg_store - -//Temp - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon_state = "temp0" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen_cyborg.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen_cyborg.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen_cyborg.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_borg_pull - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_cyborg.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = 'icons/mob/screen_cyborg.dmi' - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += adding + other - - return +/datum/hud/proc/robot_hud() + adding = list() + other = list() + + var/obj/screen/using + + +//Radio + using = new /obj/screen() + using.name = "radio" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "radio" + using.screen_loc = ui_movi + using.layer = 20 + adding += using + +//Module select + + using = new /obj/screen() + using.name = "module1" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "inv1" + using.screen_loc = ui_inv1 + using.layer = 20 + adding += using + mymob:inv1 = using + + using = new /obj/screen() + using.name = "module2" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "inv2" + using.screen_loc = ui_inv2 + using.layer = 20 + adding += using + mymob:inv2 = using + + using = new /obj/screen() + using.name = "module3" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "inv3" + using.screen_loc = ui_inv3 + using.layer = 20 + adding += using + mymob:inv3 = using + +//End of module select + +//Intent + using = new /obj/screen() + using.name = "act_intent" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + +//Cell + mymob:cells = new /obj/screen() + mymob:cells.icon = 'icons/mob/screen_cyborg.dmi' + mymob:cells.icon_state = "charge-empty" + mymob:cells.name = "cell" + mymob:cells.screen_loc = ui_toxin + +//Health + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen_cyborg.dmi' + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_borg_health + +//Installed Module + mymob.hands = new /obj/screen() + mymob.hands.icon = 'icons/mob/screen_cyborg.dmi' + mymob.hands.icon_state = "nomod" + mymob.hands.name = "module" + mymob.hands.screen_loc = ui_borg_module + +//Module Panel + using = new /obj/screen() + using.name = "panel" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "panel" + using.screen_loc = ui_borg_panel + using.layer = 19 + adding += using + +//Store + mymob.throw_icon = new /obj/screen() + mymob.throw_icon.icon = 'icons/mob/screen_cyborg.dmi' + mymob.throw_icon.icon_state = "store" + mymob.throw_icon.name = "store" + mymob.throw_icon.screen_loc = ui_borg_store + +//Temp + mymob.bodytemp = new /obj/screen() + mymob.bodytemp.icon_state = "temp0" + mymob.bodytemp.name = "body temperature" + mymob.bodytemp.screen_loc = ui_temp + + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon = 'icons/mob/screen_cyborg.dmi' + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_oxygen + + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen_cyborg.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_fire + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen_cyborg.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_borg_pull + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "1,1" + mymob.blind.layer = 0 + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen_cyborg.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel() + mymob.zone_sel.icon = 'icons/mob/screen_cyborg.dmi' + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += adding + other + + return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm new file mode 100644 index 00000000000..6f1b8481bad --- /dev/null +++ b/code/_onclick/hud/screen_objects.dm @@ -0,0 +1,358 @@ +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/obj/screen + name = "" + icon = 'icons/mob/screen_gen.dmi' + layer = 20.0 + unacidable = 1 + var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + + +/obj/screen/text + icon = null + icon_state = null + mouse_opacity = 0 + screen_loc = "CENTER-7,CENTER-7" + maptext_height = 480 + maptext_width = 480 + + +/obj/screen/inventory + var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. + + +/obj/screen/close + name = "close" + +/obj/screen/close/Click() + if(master) + if(istype(master, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = master + S.close(usr) + return 1 + + +/obj/screen/item_action + var/obj/item/owner + +/obj/screen/item_action/Click() + if(!usr || !owner) + return 1 + if(usr.next_move >= world.time) + return + usr.next_move = world.time + 10 + + if(usr.stat || usr.restrained() || usr.stunned || usr.lying) + return 1 + + if(!(owner in usr)) + return 1 + + owner.ui_action_click() + return 1 + +//This is the proc used to update all the action buttons. It just returns for all mob types except humans. +/mob/proc/update_action_buttons() + return + + +/obj/screen/grab + name = "grab" + +/obj/screen/grab/Click() + var/obj/item/weapon/grab/G = master + G.s_click(src) + return 1 + +/obj/screen/grab/attack_hand() + return + +/obj/screen/grab/attackby() + return + + +/obj/screen/storage + name = "storage" + +/obj/screen/storage/Click() + if(world.time <= usr.next_move) + return 1 + if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) + return 1 + if(master) + var/obj/item/I = usr.get_active_hand() + if(I) + master.attackby(I, usr) + usr.next_move = world.time+2 + return 1 + +/obj/screen/zone_sel + name = "damage zone" + icon_state = "zone_sel" + screen_loc = ui_zonesel + var/selecting = "chest" + +/obj/screen/zone_sel/Click(location, control,params) + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/old_selecting = selecting //We're only going to update_icon() if there's been a change + + switch(icon_y) + if(1 to 9) //Legs + switch(icon_x) + if(10 to 15) + selecting = "r_leg" + if(17 to 22) + selecting = "l_leg" + else + return 1 + if(10 to 13) //Hands and groin + switch(icon_x) + if(8 to 11) + selecting = "r_arm" + if(12 to 20) + selecting = "groin" + if(21 to 24) + selecting = "l_arm" + else + return 1 + if(14 to 22) //Chest and arms to shoulders + switch(icon_x) + if(8 to 11) + selecting = "r_arm" + if(12 to 20) + selecting = "chest" + if(21 to 24) + selecting = "l_arm" + else + return 1 + if(23 to 30) //Head, but we need to check for eye or mouth + if(icon_x in 12 to 20) + selecting = "head" + switch(icon_y) + if(23 to 24) + if(icon_x in 15 to 17) + selecting = "mouth" + if(26) //Eyeline, eyes are on 15 and 17 + if(icon_x in 14 to 18) + selecting = "eyes" + if(25 to 27) + if(icon_x in 15 to 17) + selecting = "eyes" + + if(old_selecting != selecting) + update_icon() + return 1 + +/obj/screen/zone_sel/update_icon() + overlays.Cut() + overlays += image('icons/mob/screen_gen.dmi', "[selecting]") + + +/obj/screen/Click(location, control, params) + if(!usr) return 1 + + switch(name) + if("toggle") + if(usr.hud_used.inventory_shown) + usr.hud_used.inventory_shown = 0 + usr.client.screen -= usr.hud_used.other + else + usr.hud_used.inventory_shown = 1 + usr.client.screen += usr.hud_used.other + + usr.hud_used.hidden_inventory_update() + + if("equip") + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.quick_equip() + + if("resist") + if(isliving(usr)) + var/mob/living/L = usr + L.resist() + + if("mov_intent") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(C.legcuffed) + C << "You are legcuffed! You cannot run until you get [C.legcuffed] removed!" + C.m_intent = "walk" //Just incase + C.hud_used.move_intent.icon_state = "walking" + return 1 + switch(usr.m_intent) + if("run") + usr.m_intent = "walk" + usr.hud_used.move_intent.icon_state = "walking" + if("walk") + usr.m_intent = "run" + usr.hud_used.move_intent.icon_state = "running" + if(istype(usr,/mob/living/carbon/alien/humanoid)) + usr.update_icons() + if("m_intent") + if(!usr.m_int) + switch(usr.m_intent) + if("run") + usr.m_int = "13,14" + if("walk") + usr.m_int = "14,14" + if("face") + usr.m_int = "15,14" + else + usr.m_int = null + if("walk") + usr.m_intent = "walk" + usr.m_int = "14,14" + if("face") + usr.m_intent = "face" + usr.m_int = "15,14" + if("run") + usr.m_intent = "run" + usr.m_int = "13,14" + if("Reset Machine") + usr.unset_machine() + if("internal") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) + if(C.internal) + C.internal = null + C << "No longer running on internals." + if(C.internals) + C.internals.icon_state = "internal0" + else + if(!istype(C.wear_mask, /obj/item/clothing/mask)) + C << "You are not wearing a mask." + return 1 + else + if(istype(C.l_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.l_hand] on your left hand." + C.internal = C.l_hand + else if(istype(C.r_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.r_hand] on your right hand." + C.internal = C.r_hand + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." + H.internal = H.s_store + else if(istype(H.belt, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.belt] on your belt." + H.internal = H.belt + else if(istype(H.l_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.l_store] in your left pocket." + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.r_store] in your right pocket." + H.internal = H.r_store + + //Seperate so CO2 jetpacks are a little less cumbersome. + if(!C.internal && istype(C.back, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.back] on your back." + C.internal = C.back + + if(C.internal) + if(C.internals) + C.internals.icon_state = "internal1" + else + C << "You don't have an oxygen tank." + if("act_intent") + usr.a_intent_change("right") + if("pull") + usr.stop_pulling() + if("throw/catch") + if(!usr.stat && isturf(usr.loc) && !usr.restrained()) + usr:toggle_throw_mode() + if("drop") + usr.drop_item_v() + + if("module") + if(issilicon(usr)) + if(usr:module) + return 1 + usr:pick_module() + + if("radio") + if(issilicon(usr)) + usr:radio_menu() + if("panel") + if(issilicon(usr)) + usr:installed_modules() + + if("store") + if(issilicon(usr)) + usr:uneq_active() + + if("module1") + if(usr:module_state_1) + if(usr:module_active != usr:module_state_1) + usr:inv1.icon_state = "inv1 +a" + usr:inv2.icon_state = "inv2" + usr:inv3.icon_state = "inv3" + usr:module_active = usr:module_state_1 + else + usr:inv1.icon_state = "inv1" + usr:module_active = null + + if("module2") + if(usr:module_state_2) + if(usr:module_active != usr:module_state_2) + usr:inv1.icon_state = "inv1" + usr:inv2.icon_state = "inv2 +a" + usr:inv3.icon_state = "inv3" + usr:module_active = usr:module_state_2 + else + usr:inv2.icon_state = "inv2" + usr:module_active = null + + if("module3") + if(usr:module_state_3) + if(usr:module_active != usr:module_state_3) + usr:inv1.icon_state = "inv1" + usr:inv2.icon_state = "inv2" + usr:inv3.icon_state = "inv3 +a" + usr:module_active = usr:module_state_3 + else + usr:inv3.icon_state = "inv3" + usr:module_active = null + + else + return 0 + return 1 + +/obj/screen/inventory/Click() + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return 1 + if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) + return 1 + switch(name) + if("r_hand") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.activate_hand("r") + usr.next_move = world.time+2 + if("l_hand") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.activate_hand("l") + usr.next_move = world.time+2 + if("swap") + usr:swap_hand() + if("hand") + usr:swap_hand() + else + if(usr.attack_ui(slot_id)) + usr.update_inv_l_hand(0) + usr.update_inv_r_hand(0) + usr.next_move = world.time+6 + return 1 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm new file mode 100644 index 00000000000..25ccdb506b4 --- /dev/null +++ b/code/_onclick/item_attack.dm @@ -0,0 +1,161 @@ + +// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. +/obj/item/proc/attack_self(mob/user) + return + +// No comment +/atom/proc/attackby(obj/item/W, mob/user) + return +/atom/movable/attackby(obj/item/W, mob/user) + if(!(W.flags&NOBLUDGEON)) + visible_message("[src] has been hit by [user] with [W].") + +/mob/living/attackby(obj/item/I, mob/user) + if(istype(I) && ismob(user)) + I.attack(src, user) + + +// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. +// Click parameters is the params string from byond Click() code, see that documentation. +/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + return + + +/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone) + + if (!istype(M)) // not sure if this is the right thing... + return + var/messagesource = M + + if (istype(M,/mob/living/carbon/brain)) + messagesource = M:container + if (hitsound) + playsound(loc, hitsound, 50, 1, -1) + ///////////////////////// + user.lastattacked = M + M.lastattacker = user + + user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" + log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" ) + + //spawn(1800) // this wont work right + // M.lastattacker = null + ///////////////////////// + + var/power = force + if(HULK in user.mutations) + power *= 2 + + if(!istype(M, /mob/living/carbon/human)) + if(istype(M, /mob/living/carbon/slime)) + var/mob/living/carbon/slime/slime = M + if(prob(25)) + user << "\red [src] passes right through [M]!" + return + + if(power > 0) + slime.attacked += 10 + + if(slime.Discipline && prob(50)) // wow, buddy, why am I getting attacked?? + slime.Discipline = 0 + + if(power >= 3) + if(istype(slime, /mob/living/carbon/slime/adult)) + if(prob(5 + round(power/2))) + + if(slime.Victim) + if(prob(80) && !slime.client) + slime.Discipline++ + slime.Victim = null + slime.anchored = 0 + + spawn() + if(slime) + slime.SStun = 1 + sleep(rand(5,20)) + if(slime) + slime.SStun = 0 + + spawn(0) + if(slime) + slime.canmove = 0 + step_away(slime, user) + if(prob(25 + power)) + sleep(2) + if(slime && user) + step_away(slime, user) + slime.canmove = 1 + + else + if(prob(10 + power*2)) + if(slime) + if(slime.Victim) + if(prob(80) && !slime.client) + slime.Discipline++ + + if(slime.Discipline == 1) + slime.attacked = 0 + + spawn() + if(slime) + slime.SStun = 1 + sleep(rand(5,20)) + if(slime) + slime.SStun = 0 + + slime.Victim = null + slime.anchored = 0 + + + spawn(0) + if(slime && user) + step_away(slime, user) + slime.canmove = 0 + if(prob(25 + power*4)) + sleep(2) + if(slime && user) + step_away(slime, user) + slime.canmove = 1 + + + var/showname = "." + if(user) + showname = " by [user]." + if(!(user in viewers(M, null))) + showname = "." + + for(var/mob/O in viewers(messagesource, null)) + if(attack_verb.len) + O.show_message("\red [M] has been [pick(attack_verb)] with [src][showname] ", 1) + else + O.show_message("\red [M] has been attacked with [src][showname] ", 1) + + if(!showname && user) + if(user.client) + user << "\red You attack [M] with [src]. " + + + + if(istype(M, /mob/living/carbon/human)) + M:attacked_by(src, user, def_zone) + else + switch(damtype) + if("brute") + if(istype(src, /mob/living/carbon/slime)) + M.adjustBrainLoss(power) + + else + + M.take_organ_damage(power) + if (prob(33)) // Added blood for whacking non-humans too + var/turf/location = M.loc + if (istype(location, /turf/simulated)) + location.add_blood_floor(M) + if("fire") + if (!(COLD_RESISTANCE in M.mutations)) + M.take_organ_damage(0, power) + M << "Aargh it burns!" + M.updatehealth() + add_fingerprint(user) + return 1 diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm new file mode 100644 index 00000000000..a6290cf870f --- /dev/null +++ b/code/_onclick/observer.dm @@ -0,0 +1,85 @@ +/mob/dead/observer/DblClickOn(var/atom/A) + if(can_reenter_corpse && mind && mind.current) + if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it + reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) + return // seems legit. + + // Things you might plausibly want to follow + if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/machinery/singularity)) + ManualFollow(A) + + // Otherwise jump + else + loc = get_turf(A) + +/mob/dead/observer/ClickOn(var/atom/A) + if(world.time <= next_move) return + next_move = world.time + 8 + // You are responsible for checking config.ghost_interaction when you override this function + // Not all of them require checking, see below + A.attack_ghost(src) + +// This is the ghost's follow verb with an argument +/mob/dead/observer/proc/ManualFollow(var/atom/target) + following = target + if(target) + src << "\blue Now following [target]" + spawn(0) + var/turf/pos = get_turf(src) + while(loc == pos && target && following == target) + + var/turf/T = get_turf(target) + if(!T) + break + if(following != target) + break + if(!client) + break + loc = T + pos = loc + sleep(15) + following = null + +// Oh by the way this didn't work with old click code which is why clicking shit didn't spam you +/atom/proc/attack_ghost(mob/user as mob) + examine() + return + +// --------------------------------------- +// And here are some good things for free: +// Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu + +/obj/machinery/teleport/hub/attack_ghost(mob/user as mob) + var/atom/l = loc + var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(l.x - 2, l.y, l.z)) + if(com.locked) + user.loc = get_turf(com.locked) + +/obj/effect/portal/attack_ghost(mob/user as mob) + if(target) + user.loc = get_turf(target) + +/obj/machinery/gateway/centerstation/attack_ghost(mob/user as mob) + if(awaygate) + user.loc = awaygate.loc + else + user << "[src] has no destination." + +/obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob) + if(stationgate) + user.loc = stationgate.loc + else + user << "[src] has no destination." + +// ------------------------------------------- +// This was supposed to be used by adminghosts +// I think it is a *terrible* idea +// but I'm leaving it here anyway +// commented out, of course. +/* +/atom/proc/attack_admin(mob/user as mob) + if(!user || !user.client || !user.client.holder) + return + attack_hand(user) + +*/ diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm new file mode 100644 index 00000000000..2d52a26390a --- /dev/null +++ b/code/_onclick/oldcode.dm @@ -0,0 +1,376 @@ +/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE + if(!usr) return + + // ------- TIME SINCE LAST CLICK ------- + if (world.time <= usr:lastDblClick+1) + return + else + usr:lastDblClick = world.time + + //Putting it here for now. It diverts stuff to the mech clicking procs. Putting it here stops us drilling items in our inventory Carn + if(istype(usr.loc,/obj/mecha)) + if(usr.client && (src in usr.client.screen)) + return + var/obj/mecha/Mech = usr.loc + Mech.click_action(src,usr) + return + + // ------- DIR CHANGING WHEN CLICKING ------ + if( iscarbon(usr) && !usr.buckled ) + if( src.x && src.y && usr.x && usr.y ) + var/dx = src.x - usr.x + var/dy = src.y - usr.y + + if(dy || dx) + if(abs(dx) < abs(dy)) + if(dy > 0) usr.dir = NORTH + else usr.dir = SOUTH + else + if(dx > 0) usr.dir = EAST + else usr.dir = WEST + else + if(pixel_y > 16) usr.dir = NORTH + else if(pixel_y < -16) usr.dir = SOUTH + else if(pixel_x > 16) usr.dir = EAST + else if(pixel_x < -16) usr.dir = WEST + + + + + // ------- AI ------- + else if (istype(usr, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = usr + if (ai.control_disabled) + return + + // ------- CYBORG ------- + else if (istype(usr, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/bot = usr + if (bot.lockcharge) return + ..() + + + // ------- SHIFT-CLICK ------- + + if(params) + var/parameters = params2list(params) + + if(parameters["shift"]){ + if(!isAI(usr)) + ShiftClick(usr) + else + AIShiftClick(usr) + return + } + + // ------- ALT-CLICK ------- + + if(parameters["alt"]){ + if(!isAI(usr)) + AltClick(usr) + else + AIAltClick(usr) + return + } + + // ------- CTRL-CLICK ------- + + if(parameters["ctrl"]){ + if(!isAI(usr)) + CtrlClick(usr) + else + AICtrlClick(usr) + return + } + + // ------- MIDDLE-CLICK ------- + + if(parameters["middle"]){ + if(!isAI(usr)) + MiddleClick(usr) + return + } + + // ------- THROW ------- + if(usr.in_throw_mode) + return usr:throw_item(src) + + // ------- ITEM IN HAND DEFINED ------- + var/obj/item/W = usr.get_active_hand() +/* Now handled by get_active_hand() + // ------- ROBOT ------- + if(istype(usr, /mob/living/silicon/robot)) + if(!isnull(usr:module_active)) + W = usr:module_active + else + W = null +*/ + // ------- ATTACK SELF ------- + if (W == src && usr.stat == 0) + W.attack_self(usr) + if(usr.hand) + usr.update_inv_l_hand(0) //update in-hand overlays + else + usr.update_inv_r_hand(0) + return + + // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) ------- + if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) + return + + // ------- CLICKING STUFF IN CONTAINERS ------- + if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) )))))) + if (istype(usr, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = usr + if (ai.control_disabled || ai.malfhacking) + return + else + return + + // ------- 1 TILE AWAY ------- + var/t5 + // ------- AI CAN CLICK ANYTHING ------- + if(istype(usr, /mob/living/silicon/ai)) + t5 = 1 + // ------- CYBORG CAN CLICK ANYTHING WHEN NOT HOLDING STUFF ------- + else if(istype(usr, /mob/living/silicon/robot) && !W) + t5 = 1 + else + t5 = in_range(src, usr) || src.loc == usr + +// world << "according to dblclick(), t5 is [t5]" + + // ------- ACTUALLY DETERMINING STUFF ------- + if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) + + // ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN ------- + + if (usr.next_move < world.time) + usr.prev_move = usr.next_move + usr.next_move = world.time + 10 + else + // ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND ------- + return + + // ------- DELAY CHECK PASSED ------- + + if ((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc))) + + // ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE ------- + + var/direct = get_dir(usr, src) + var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc ) + var/ok = 0 + if ( (direct - 1) & direct) + + // ------- CLICKED OBJECT IS LOCATED IN A DIAGONAL POSITION FROM THE PERSON ------- + + var/turf/Step_1 + var/turf/Step_2 + switch(direct) + if(5.0) + Step_1 = get_step(usr, NORTH) + Step_2 = get_step(usr, EAST) + + if(6.0) + Step_1 = get_step(usr, SOUTH) + Step_2 = get_step(usr, EAST) + + if(9.0) + Step_1 = get_step(usr, NORTH) + Step_2 = get_step(usr, WEST) + + if(10.0) + Step_1 = get_step(usr, SOUTH) + Step_2 = get_step(usr, WEST) + + else + if(Step_1 && Step_2) + + // ------- BOTH CARDINAL DIRECTIONS OF THE DIAGONAL EXIST IN THE GAME WORLD ------- + + var/check_1 = 0 + var/check_2 = 0 + if(step_to(D, Step_1)) + check_1 = 1 + for(var/obj/border_obstacle in Step_1) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, src)) + check_1 = 0 + // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON ONE OF THE DIRECITON TILES ------- + for(var/obj/border_obstacle in get_turf(src)) + if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) + if(!border_obstacle.CanPass(D, D.loc, 1, 0)) + // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON THE TILE YOU'RE ON ------- + check_1 = 0 + + D.loc = usr.loc + if(step_to(D, Step_2)) + check_2 = 1 + + for(var/obj/border_obstacle in Step_2) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, src)) + check_2 = 0 + for(var/obj/border_obstacle in get_turf(src)) + if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) + if(!border_obstacle.CanPass(D, D.loc, 1, 0)) + check_2 = 0 + + + if(check_1 || check_2) + ok = 1 + // ------- YOU CAN REACH THE ITEM THROUGH AT LEAST ONE OF THE TWO DIRECTIONS. GOOD. ------- + + /* + More info: + If you're trying to click an item in the north-east of your mob, the above section of code will first check if tehre's a tile to the north or you and to the east of you + These two tiles are Step_1 and Step_2. After this, a new dummy object is created on your location. It then tries to move to Step_1, If it succeeds, objects on the turf you're on and + the turf that Step_1 is are checked for items which have the ON_BORDER flag set. These are itmes which limit you on only one tile border. Windows, for the most part. + CheckExit() and CanPass() are use to determine this. The dummy object is then moved back to your location and it tries to move to Step_2. Same checks are performed here. + If at least one of the two checks succeeds, it means you can reach the item and ok is set to 1. + */ + else + // ------- OBJECT IS ON A CARDINAL TILE (NORTH, SOUTH, EAST OR WEST OR THE TILE YOU'RE ON) ------- + if(loc == usr.loc) + ok = 1 + // ------- OBJECT IS ON THE SAME TILE AS YOU ------- + else + ok = 1 + + //Now, check objects to block exit that are on the border + for(var/obj/border_obstacle in usr.loc) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, src)) + ok = 0 + + //Next, check objects to block entry that are on the border + for(var/obj/border_obstacle in get_turf(src)) + if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) + if(!border_obstacle.CanPass(D, D.loc, 1, 0)) + ok = 0 + /* + See the previous More info, for... more info... + */ + + //del(D) + // Garbage Collect Dummy + D.loc = null + D = null + + // ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE ------- + if (!( ok )) + // ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE ------- + return 0 + + if (!( usr.restrained() || (usr.lying && usr.buckled!=src) )) + // ------- YOU ARE NOT REASTRAINED ------- + + if (W) + // ------- YOU HAVE AN ITEM IN YOUR HAND - HANDLE ATTACKBY AND AFTERATTACK ------- + var/ignoreAA = 0 //Ignore afterattack(). Surgery uses this. + if (t5) + ignoreAA = src.attackby(W, usr) + if (W && !ignoreAA) + W.afterattack(src, usr, (t5 ? 1 : 0), params) + + else + // ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND ------- + if (istype(usr, /mob/living/carbon/human)) + // ------- YOU ARE HUMAN ------- + src.attack_hand(usr, usr.hand) + else + // ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED ------- + if (istype(usr, /mob/living/carbon/monkey)) + src.attack_paw(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + if(usr.m_intent == "walk" && istype(usr, /mob/living/carbon/alien/humanoid/hunter)) + usr.m_intent = "run" + usr.hud_used.move_intent.icon_state = "running" + usr.update_icons() + src.attack_alien(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/larva)) + src.attack_larva(usr) + else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + src.attack_ai(usr, usr.hand) + else if(istype(usr, /mob/living/carbon/slime)) + src.attack_slime(usr) + else if(istype(usr, /mob/living/simple_animal)) + src.attack_animal(usr) + else + // ------- YOU ARE RESTRAINED. DETERMINE WHAT YOU ARE AND ATTACK WITH THE PROPER HAND_X PROC ------- + if (istype(usr, /mob/living/carbon/human)) + src.hand_h(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/monkey)) + src.hand_p(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + src.hand_al(usr, usr.hand) + else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + src.hand_a(usr, usr.hand) + + else + // ------- ITEM INACESSIBLE OR CLICKING ON SCREEN ------- + if (istype(src, /obj/screen)) + // ------- IT'S THE HUD YOU'RE CLICKING ON ------- + usr.prev_move = usr.next_move + usr:lastDblClick = world.time + 2 + if (usr.next_move < world.time) + usr.next_move = world.time + 2 + else + return + + // ------- 2 DECISECOND DELAY FOR CLICKING PASSED ------- + + if (!( usr.restrained() )) + + // ------- YOU ARE NOT RESTRAINED ------- + if ((W && !( istype(src, /obj/screen) ))) + // ------- IT SHOULD NEVER GET TO HERE, DUE TO THE ISTYPE(SRC, /OBJ/SCREEN) FROM PREVIOUS IF-S - I TESTED IT WITH A DEBUG OUTPUT AND I COULDN'T GET THIST TO SHOW UP. ------- + src.attackby(W, usr) + if (W) + W.afterattack(src, usr,, params) + else + // ------- YOU ARE NOT RESTRAINED, AND ARE CLICKING A HUD OBJECT ------- + if (istype(usr, /mob/living/carbon/human)) + src.attack_hand(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/monkey)) + src.attack_paw(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + src.attack_alien(usr, usr.hand) + else + // ------- YOU ARE RESTRAINED CLICKING ON A HUD OBJECT ------- + if (istype(usr, /mob/living/carbon/human)) + src.hand_h(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/monkey)) + src.hand_p(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + src.hand_al(usr, usr.hand) + else + // ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD ------- + if((LASER in usr:mutations) && usr:a_intent == "harm" && world.time >= usr.next_move) + // ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED ------- + + var/turf/T = get_turf(usr) + var/turf/U = get_turf(src) + + + if(istype(usr, /mob/living/carbon/human)) + usr:nutrition -= rand(1,5) + usr:handle_regular_hud_updates() + + var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( usr.loc ) + A.icon = 'icons/effects/genetics.dmi' + A.icon_state = "eyelasers" + playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + + A.firer = usr + A.def_zone = usr:get_organ_target() + A.original = src + A.current = T + A.yo = U.y - T.y + A.xo = U.x - T.x + spawn( 1 ) + A.process() + + usr.next_move = world.time + 6 + return diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm new file mode 100644 index 00000000000..69c4f3e0ce3 --- /dev/null +++ b/code/_onclick/other_mobs.dm @@ -0,0 +1,129 @@ +/* + Humans: + Adds an exception for gloves, to allow special glove types like the ninja ones. + + Otherwise pretty standard. +*/ +/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity) + var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines + + // Special glove functions: + // If the gloves do anything, have them return 1 to stop + // normal attack_hand() here. + if(proximity && istype(G) && G.Touch(A,1)) + return + + A.attack_hand(src) +/atom/proc/attack_hand(mob/user as mob) + return + +/mob/living/carbon/human/RestrainedClickOn(var/atom/A) + return + +/mob/living/carbon/human/RangedAttack(var/atom/A) + if(!gloves && !mutations.len) return + var/obj/item/clothing/gloves/G = gloves + if((LASER in mutations) && a_intent == "harm") + LaserEyes(A) // moved into a proc below + + else if(istype(G) && G.Touch(A,0)) // for magic gloves + return + + else if(TK in mutations) + switch(get_dist(src,A)) + if(1 to 5) // not adjacent may mean blocked by window + next_move += 2 + if(5 to 7) + next_move += 5 + if(8 to 15) + next_move += 10 + if(16 to 128) + return + A.attack_tk(src) + +/* + Animals & All Unspecified +*/ +/mob/living/UnarmedAttack(var/atom/A) + A.attack_animal(src) +/atom/proc/attack_animal(mob/user as mob) + return +/mob/living/RestrainedClickOn(var/atom/A) + return + +/* + Monkeys +*/ +/mob/living/carbon/monkey/UnarmedAttack(var/atom/A) + A.attack_paw(src) +/atom/proc/attack_paw(mob/user as mob) + return + +/* + Monkey RestrainedClickOn() was apparently the + one and only use of all of the restrained click code + (except to stop you from doing things while handcuffed); + moving it here instead of various hand_p's has simplified + things considerably +*/ +/mob/living/carbon/monkey/RestrainedClickOn(var/atom/A) + if(a_intent != "harm" || !ismob(A)) return + if(istype(wear_mask, /obj/item/clothing/mask/muzzle)) + return + var/mob/living/carbon/ML = A + var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") + var/datum/limb/affecting = null + if(ishuman(ML)) // why the hell is this not more general + affecting = ML:get_organ(ran_zone(dam_zone)) + var/armor = ML.run_armor_check(affecting, "melee") + if(prob(75)) + ML.apply_damage(rand(1,3), BRUTE, affecting, armor) + for(var/mob/O in viewers(ML, null)) + O.show_message("\red [name] has bit [ML]!", 1) + if(armor >= 2) return + if(ishuman(ML)) + ML = ML.monkeyize() + if(ismonkey(ML)) + for(var/datum/disease/D in viruses) + if(istype(D, /datum/disease/jungle_fever)) + ML.contract_disease(D,1,0) + else + for(var/mob/O in viewers(ML, null)) + O.show_message("\red [src] has attempted to bite [ML]!", 1) + +/* + Aliens + Defaults to same as monkey in most places +*/ +/mob/living/carbon/alien/UnarmedAttack(var/atom/A) + A.attack_alien(src) +/atom/proc/attack_alien(mob/user as mob) + attack_paw(user) + return +/mob/living/carbon/alien/RestrainedClickOn(var/atom/A) + return + +// Babby aliens +/mob/living/carbon/alien/larva/UnarmedAttack(var/atom/A) + A.attack_larva(src) +/atom/proc/attack_larva(mob/user as mob) + return + + +/* + Slimes + Nothing happening here +*/ +/mob/living/carbon/slime/UnarmedAttack(var/atom/A) + A.attack_slime(src) +/atom/proc/attack_slime(mob/user as mob) + return +/mob/living/carbon/slime/RestrainedClickOn(var/atom/A) + return + +/* + New Players: + Have no reason to click on anything at all. +*/ +/mob/new_player/ClickOn() + return diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm new file mode 100644 index 00000000000..0abb637cce9 --- /dev/null +++ b/code/_onclick/telekinesis.dm @@ -0,0 +1,208 @@ +/* + Telekinesis + + This needs more thinking out, but I might as well. +*/ +var/const/tk_maxrange = 15 + +/* + Telekinetic attack: + + By default, emulate the user's unarmed attack +*/ +/atom/proc/attack_tk(mob/user) + if(user.stat) return + user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc + return + +/* + This is similar to item attack_self, but applies to anything + that you can grab with a telekinetic grab. + + It is used for manipulating things at range, for example, opening and closing closets. + There are not a lot of defaults at this time, add more where appropriate. +*/ +/atom/proc/attack_self_tk(mob/user) + return + +/obj/attack_tk(mob/user) + if(user.stat) return + if(anchored) + ..() + return + + var/obj/item/tk_grab/O = new(src) + user.put_in_active_hand(O) + O.host = user + O.focus_object(src) + return + +/obj/item/attack_tk(mob/user) + if(user.stat || !isturf(loc)) return + if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here + var/obj/item/tk_grab/O = new(src) + user.put_in_active_hand(O) + O.host = user + O.focus_object(src) + else + warning("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])") + return + + +/mob/attack_tk(mob/user) + return // needs more thinking about + +/* + TK Grab Item (the workhorse of old TK) + + * If you have not grabbed something, do a normal tk attack + * If you have something, throw it at the target. If it is already adjacent, do a normal attackby() + * If you click what you are holding, or attack_self(), do an attack_self_tk() on it. + * Deletes itself if it is ever not in your hand, or if you should have no access to TK. +*/ +/obj/item/tk_grab + name = "Telekinetic Grab" + desc = "Magic" + icon = 'icons/obj/magic.dmi'//Needs sprites + icon_state = "2" + flags = NOBLUDGEON + //item_state = null + w_class = 10.0 + layer = 20 + + var/last_throw = 0 + var/atom/movable/focus = null + var/mob/living/host = null + + + dropped(mob/user as mob) + if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item + if(focus.Adjacent(loc)) + focus.loc = loc + + del(src) + return + + + //stops TK grabs being equipped anywhere but into hands + equipped(var/mob/user, var/slot) + if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return + del(src) + return + + + attack_self(mob/user as mob) + if(focus) + focus.attack_self_tk(user) + + afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this + if(!target || !user) return + if(last_throw+3 > world.time) return + if(!host || host != user) + del(src) + return + if(!(TK in host.mutations)) + del(src) + return + if(isobj(target) && !isturf(target.loc)) + return + + var/d = get_dist(user, target) + if(focus) d = max(d,get_dist(user,focus)) // whichever is further + switch(d) + if(0) + ; + if(1 to 5) // not adjacent may mean blocked by window + if(!proximity) + user.next_move += 2 + if(5 to 7) + user.next_move += 5 + if(8 to tk_maxrange) + user.next_move += 10 + else + user << "\blue Your mind won't reach that far." + return + + if(!focus) + focus_object(target, user) + return + + if(target == focus) + target.attack_self_tk(user) + return // todo: something like attack_self not laden with assumptions inherent to attack_self + + + if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, user:get_organ_target()) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + + + else + apply_focus_overlay() + focus.throw_at(target, 10, 1) + last_throw = world.time + return + + attack(mob/living/M as mob, mob/living/user as mob, def_zone) + return + + + proc/focus_object(var/obj/target, var/mob/living/user) + if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later + if(target.anchored || !isturf(target.loc)) + del src + return + focus = target + update_icon() + apply_focus_overlay() + return + + + proc/apply_focus_overlay() + if(!focus) return + var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) + O.name = "sparkles" + O.anchored = 1 + O.density = 0 + O.layer = FLY_LAYER + O.dir = pick(cardinal) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + spawn(5) + O.delete() + return + + + update_icon() + overlays.Cut() + if(focus && focus.icon && focus.icon_state) + overlays += icon(focus.icon,focus.icon_state) + return + +/*Not quite done likely needs to use something thats not get_step_to + proc/check_path() + var/turf/ref = get_turf(src.loc) + var/turf/target = get_turf(focus.loc) + if(!ref || !target) return 0 + var/distance = get_dist(ref, target) + if(distance >= 10) return 0 + for(var/i = 1 to distance) + ref = get_step_to(ref, target, 0) + if(ref != target) return 0 + return 1 +*/ + +//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1) +/* + if(istype(user, /mob/living/carbon)) + if(user:mutations & TK && get_dist(source, user) <= 7) + if(user:get_active_hand()) return 0 + var/X = source:x + var/Y = source:y + var/Z = source:z + +*/ + diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 9fc8ff1b449..996a710b1ab 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,4 +1,19 @@ +/obj/effect/datacore + name = "datacore" + var/medical[] = list() + var/general[] = list() + var/security[] = list() + //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). + var/locked[] = list() + +/datum/data + var/name = "data" + +/datum/data/record + name = "record" + var/list/fields = list() + /obj/effect/datacore/proc/manifest(var/nosleep = 0) spawn() if(!nosleep) diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm index 1430901e296..c815d34cbe9 100644 --- a/code/datums/mixed.dm +++ b/code/datums/mixed.dm @@ -1,12 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/datum/data - var/name = "data" - -/datum/data/record - name = "record" - var/list/fields = list() - /datum/powernet var/list/cables = list() // all cables & junctions var/list/nodes = list() // all APCs & sources diff --git a/code/datums/spell.dm b/code/datums/spell.dm index f7be885cfa5..7a5607b2efd 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -117,12 +117,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin charge_counter = charge_max /obj/effect/proc_holder/spell/Click() - ..() - - if(!cast_check()) - return - - choose_targets() + if(cast_check()) + choose_targets() + return 1 /obj/effect/proc_holder/spell/proc/choose_targets(mob/user = usr) //depends on subtype - /targeted or /aoe_turf return diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 026ff11473c..707d14390bb 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -31,15 +31,6 @@ var/def_zone pass_flags = PASSTABLE -/obj/effect/datacore - name = "datacore" - var/medical[] = list() - var/general[] = list() - var/security[] = list() - //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). - var/locked[] = list() - - /obj/effect/list_container name = "list container" @@ -84,7 +75,7 @@ throwforce = 0.0 throw_speed = 1 throw_range = 20 - flags = FPRINT | USEDELAY | TABLEPASS + flags = FPRINT | TABLEPASS afterattack(atom/target as mob|obj|turf|area, mob/user as mob) user.drop_item() src.throw_at(target, throw_range, throw_speed) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index fe4dcef4cfa..c312f18125e 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -163,20 +163,6 @@ item_state = "card-id" w_class = 1.0 -//TODO: Figure out wtf this is and possibly remove it -Nodrak -/obj/item/weapon/dummy - name = "dummy" - invisibility = 101.0 - anchored = 1.0 - flags = TABLEPASS - -/obj/item/weapon/dummy/ex_act() - return - -/obj/item/weapon/dummy/blob_act() - return - - /* /obj/item/weapon/game_kit name = "Gaming Kit" @@ -441,7 +427,8 @@ origin_tech = "materials=2;combat=2" attack_verb = list("chopped", "sliced", "cut", "reaped") -/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob) +/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity) + if(!proximity) return if(istype(A, /obj/effect/spacevine)) for(var/obj/effect/spacevine/B in orange(A,1)) if(prob(80)) diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 8e9b956429e..a1c6c823e98 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -20,12 +20,14 @@ proc/spawn_room(var/atom/start_loc, var/x_size, var/y_size, var/list/walltypes, if(x == 0 || x == x_size-1 || y == 0 || y == y_size-1) var/wall = pickweight(walltypes)//totally-solid walls are pretty boring. - T = new wall(cur_loc) + T = cur_loc + T.ChangeTurf(wall) room_turfs["walls"] += T else - T = new floor(cur_loc) + T = cur_loc + T.ChangeTurf(floor) room_turfs["floors"] += T A.contents += T diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7c3e49ab482..a2ac031fe19 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -224,9 +224,6 @@ its easier to just keep the beam vertical. //usr << "[name]: Dn:[density] dir:[dir] cont:[contents] icon:[icon] is:[icon_state] loc:[loc]" return -/atom/proc/MouseDrop_T() - return - /atom/proc/relaymove() return @@ -239,72 +236,9 @@ its easier to just keep the beam vertical. /atom/proc/fire_act() return -/atom/proc/attack_hand(mob/user as mob) - return - -/atom/proc/attack_paw(mob/user as mob) - return - -/atom/proc/attack_ai(mob/user as mob) - return - -/atom/proc/attack_robot(mob/user as mob) - attack_ai(user) - return - -/atom/proc/attack_animal(mob/user as mob) - return - -/atom/proc/attack_ghost(mob/user as mob) - src.examine() - return - -/atom/proc/attack_admin(mob/user as mob) - if(!user || !user.client || !user.client.holder) - return - attack_hand(user) - -//for aliens, it works the same as monkeys except for alien-> mob interactions which will be defined in the -//appropiate mob files -/atom/proc/attack_alien(mob/user as mob) - src.attack_paw(user) - return - -/atom/proc/attack_larva(mob/user as mob) - return - -// for slimes -/atom/proc/attack_slime(mob/user as mob) - return - -/atom/proc/hand_h(mob/user as mob) //human (hand) - restrained - return - -/atom/proc/hand_p(mob/user as mob) //monkey (paw) - restrained - return - -/atom/proc/hand_a(mob/user as mob) //AI - restrained - return - -/atom/proc/hand_r(mob/user as mob) //Cyborg (robot) - restrained - src.hand_a(user) - return - -/atom/proc/hand_al(mob/user as mob) //alien - restrained - src.hand_p(user) - return - -/atom/proc/hand_m(mob/user as mob) //slime - restrained - return - - /atom/proc/hitby(atom/movable/AM as mob|obj) return -/atom/proc/attackby(obj/item/weapon/W, mob/user) - if(isturf(src)) return - if(!istype(W, /obj/item/weapon/grab) && !istype(W, /obj/item/weapon/plastique) && !istype(W, /obj/item/weapon/reagent_containers/spray) && !istype(W, /obj/item/weapon/packageWrap) && !istype(W, /obj/item/device/detective_scanner)) - visible_message("[src] has been hit by [user] with [W].") var/list/blood_splatter_icons = list() @@ -399,797 +333,6 @@ var/list/blood_splatter_icons = list() return 1 - -/atom/MouseDrop(atom/over_object as mob|obj|turf|area) - spawn(0) - if (istype(over_object, /atom)) - over_object.MouseDrop_T(src, usr) - return - ..() - return - - -/atom/Click(location,control,params) - //world << "atom.Click() on [src] by [usr] : src.type is [src.type]" - if(usr.client.buildmode) - build_click(usr, usr.client.buildmode, location, control, params, src) - return -// if(using_new_click_proc) //TODO ERRORAGE (see message below) -// return DblClickNew() - return DblClick(location, control, params) - -var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblClickNew() proc is being tested) - -/atom/proc/DblClickNew() - if(!usr) return -// TODO DOOHL: Intergrate params to new proc. Saved for another time because var/valid_place is a fucking brainfuck - - //Spamclick server-overloading prevention delay... THING - if (world.time <= usr:lastDblClick+1) - return - else - usr:lastDblClick = world.time - - //paralysis and critical condition - if(usr.stat == 1) //Death is handled in attack_ghost() - return - - if(!istype(usr, /mob/living/silicon/ai)) - if (usr.paralysis || usr.stunned || usr.weakened) - return - - //handle the hud separately - if(istype(src,/obj/screen)) - if( usr.restrained() ) - if(ishuman(usr)) - src.attack_hand(usr) - else if(isAI(usr)) - src.attack_ai(usr) - else if(isrobot(usr)) - src.attack_ai(usr) - else if(isobserver(usr)) - src.attack_ghost(usr) - else if(ismonkey(usr)) - src.attack_paw(usr) - else if(isalienadult(usr)) - src.attack_alien(usr) - else if(isslime(usr)) - src.attack_slime(usr) - else if(isanimal(usr)) - src.attack_animal(usr) - else - usr << "This mob type does not support clicks to the HUD. Contact a coder." - else - if(ishuman(usr)) - src.hand_h(usr, usr.hand) - else if(isAI(usr)) - src.hand_a(usr, usr.hand) - else if(isrobot(usr)) - src.hand_a(usr, usr.hand) - else if(isobserver(usr)) - return - else if(ismonkey(usr)) - src.hand_p(usr, usr.hand) - else if(isalienadult(usr)) - src.hand_al(usr, usr.hand) - else if(isslime(usr)) - return - else if(isanimal(usr)) - return - else - usr << "This mob type does not support restrained clicks to the HUD. Contact a coder." - return - - //Gets equipped item or used module of robots - var/obj/item/W = usr.get_active_hand() - - //Attack self - if (W == src && usr.stat == 0) -// spawn (0) //causes runtimes under heavy lag - W.attack_self(usr) - return - - //Attackby, attack_hand, afterattack, etc. can only be done once every 1 second, unless an object has the NODELAY or USEDELAY flags set - //This segment of code determins this. - if(W) - if( !( (src.loc && src.loc == usr) || (src.loc.loc && src.loc.loc == usr) ) ) - //The check above checks that you are not targeting an item which you are holding. - //If you are, (example clicking a backpack), the delays are ignored. - if(W.flags & USEDELAY) - //Objects that use the USEDELAY flag can only attack once every 2 seconds - if (usr.next_move < world.time) - usr.prev_move = usr.next_move - usr.next_move = world.time + 20 - else - return //A click has recently been handled already, you need to wait until the anti-spam delay between clicks passes - else if(!(W.flags & NODELAY)) - //Objects with NODELAY don't have a delay between uses, while most objects have the standard 1 second delay. - if (usr.next_move < world.time) - usr.prev_move = usr.next_move - usr.next_move = world.time + 10 - else - return //A click has recently been handled already, you need to wait until the anti-spam delay between clicks passes - else - //Empty hand - if (usr.next_move < world.time) - usr.prev_move = usr.next_move - usr.next_move = world.time + 10 - else - return //A click has recently been handled already, you need to wait until the anti-spam delay between clicks passes - - //Is the object in a valid place? - var/valid_place = 0 - if ( isturf(src) || ( src.loc && isturf(src.loc) ) || ( src.loc.loc && isturf(src.loc.loc) ) ) - //Object is either a turf of placed on a turf, thus valid. - //The third one is that it is in a container, which is on a turf, like a box, - //which you mouse-drag opened. Also a valid location. - valid_place = 1 - - if ( ( src.loc && (src.loc == usr) ) || ( src.loc.loc && (src.loc.loc == usr) ) ) - //User has the object on them (in their inventory) and it is thus valid - valid_place = 1 - - //Afterattack gets performed every time you click, no matter if it's in range or not. It's used when - //clicking targets for guns and such. If you are clicking on a target that's not in range - //with an item in your hands only afterattack() needs to be performed. - //If the range is valid, afterattack() will be handled in the separate mob-type - //sections below, however only after attackby(). Attack_hand and simmilar procs are handled - //in the mob-type sections below, as some require you to be in range to work (human, monkey..) while others don't (ai, cyborg) - //Also note that afterattack does not differentiate between the holder/attacker's mob-type. - if( W && !valid_place) - W.afterattack(src, usr, (valid_place ? 1 : 0)) - return - - if(ishuman(usr)) - var/mob/living/carbon/human/human = usr - //-human stuff- - - if(human.stat) - return - - if(human.in_throw_mode) - return human.throw_item(src) - - var/in_range = in_range(src, human) || src.loc == human - - if (in_range) - if (!( human.restrained() || human.lying )) - if (W) - attackby(W,human) - if (W) - W.afterattack(src, human) - else - attack_hand(human) - else - hand_h(human, human.hand) - else - if ( (W) && !human.restrained() ) - W.afterattack(src, human) - - - else if(isAI(usr)) - var/mob/living/silicon/ai/ai = usr - //-ai stuff- - - if(ai.stat) - return - - if (ai.control_disabled) - return - - if( !ai.restrained() ) - attack_ai(ai) - else - hand_a(ai, ai.hand) - - else if(isrobot(usr)) - var/mob/living/silicon/robot/robot = usr - //-cyborg stuff- - - if(robot.stat) - return - - if (robot.lockcharge) - return - - - - if(W) - var/in_range = in_range(src, robot) || src.loc == robot - if(in_range) - attackby(W,robot) - if (W) - W.afterattack(src, robot) - else - if( !robot.restrained() ) - attack_robot(robot) - else - hand_r(robot, robot.hand) - - else if(isobserver(usr)) - var/mob/dead/observer/ghost = usr - //-ghost stuff- - - if(ghost) - if(W) - if(usr.client && usr.client.holder) - src.attackby(W, ghost) //This is so admins can interact with things ingame. - else - src.attack_ghost(ghost) //Something's gone wrong, non-admin ghosts shouldn't be able to hold things. - else - if(usr.client && usr.client.holder) - src.attack_admin(ghost) //This is so admins can interact with things ingame. - else - src.attack_ghost(ghost) //Standard click as ghost - - - else if(ismonkey(usr)) - var/mob/living/carbon/monkey/monkey = usr - //-monkey stuff- - - if(monkey.stat) - return - - if(monkey.in_throw_mode) - return monkey.throw_item(src) - - var/in_range = in_range(src, monkey) || src.loc == monkey - - if (in_range) - if ( !monkey.restrained() ) - if (W) - attackby(W,monkey) - if (W) - W.afterattack(src, monkey) - else - attack_paw(monkey) - else - hand_p(monkey, monkey.hand) - else - if ( (W) && !monkey.restrained() ) - W.afterattack(src, monkey) - - else if(isalienadult(usr)) - var/mob/living/carbon/alien/humanoid/alien = usr - //-alien stuff- - - if(alien.stat) - return - - var/in_range = in_range(src, alien) || src.loc == alien - - if (in_range) - if ( !alien.restrained() ) - if (W) - attackby(W,alien) - if (W) - W.afterattack(src, alien) - else - attack_alien(alien) - else - hand_al(alien, alien.hand) - else - if ( (W) && !alien.restrained() ) - W.afterattack(src, alien) - - else if(islarva(usr)) - var/mob/living/carbon/alien/larva/alien = usr - if(alien.stat) - return - - var/in_range = in_range(src, alien) || src.loc == alien - - if (in_range) - if ( !alien.restrained() ) - attack_larva(alien) - - else if(isslime(usr)) - var/mob/living/carbon/slime/slime = usr - //-slime stuff- - - if(slime.stat) - return - - var/in_range = in_range(src, slime) || src.loc == slime - - if (in_range) - if ( !slime.restrained() ) - if (W) - attackby(W,slime) - if (W) - W.afterattack(src, slime) - else - attack_slime(slime) - else - hand_m(slime, slime.hand) - else - if ( (W) && !slime.restrained() ) - W.afterattack(src, slime) - - - else if(isanimal(usr)) - var/mob/living/simple_animal/animal = usr - //-simple animal stuff- - - if(animal.stat) - return - - var/in_range = in_range(src, animal) || src.loc == animal - - if (in_range) - if ( !animal.restrained() ) - attack_animal(animal) - -/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE - if(!usr) return - - // ------- TIME SINCE LAST CLICK ------- - if (world.time <= usr:lastDblClick+1) -// world << "BLOCKED atom.DblClick() on [src] by [usr] : src.type is [src.type]" - return - else -// world << "atom.DblClick() on [src] by [usr] : src.type is [src.type]" - usr:lastDblClick = world.time - - //Putting it here for now. It diverts stuff to the mech clicking procs. Putting it here stops us drilling items in our inventory Carn - if(istype(usr.loc,/obj/mecha)) - if(usr.client && (src in usr.client.screen)) - return - var/obj/mecha/Mech = usr.loc - Mech.click_action(src,usr) - return - - // ------- DIR CHANGING WHEN CLICKING ------ - if( iscarbon(usr) && !usr.buckled ) - if( src.x && src.y && usr.x && usr.y ) - var/dx = src.x - usr.x - var/dy = src.y - usr.y - - if(dy || dx) - if(abs(dx) < abs(dy)) - if(dy > 0) usr.dir = NORTH - else usr.dir = SOUTH - else - if(dx > 0) usr.dir = EAST - else usr.dir = WEST - else - if(pixel_y > 16) usr.dir = NORTH - else if(pixel_y < -16) usr.dir = SOUTH - else if(pixel_x > 16) usr.dir = EAST - else if(pixel_x < -16) usr.dir = WEST - - - - - // ------- AI ------- - else if (istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = usr - if (ai.control_disabled) - return - - // ------- CYBORG ------- - else if (istype(usr, /mob/living/silicon/robot)) - var/mob/living/silicon/robot/bot = usr - if (bot.lockcharge) return - ..() - - - // ------- SHIFT-CLICK ------- - - if(params) - var/parameters = params2list(params) - - if(parameters["shift"]){ - if(!isAI(usr)) - ShiftClick(usr) - else - AIShiftClick(usr) - return - } - - // ------- ALT-CLICK ------- - - if(parameters["alt"]){ - if(!isAI(usr)) - AltClick(usr) - else - AIAltClick(usr) - return - } - - // ------- CTRL-CLICK ------- - - if(parameters["ctrl"]){ - if(!isAI(usr)) - CtrlClick(usr) - else - AICtrlClick(usr) - return - } - - // ------- MIDDLE-CLICK ------- - - if(parameters["middle"]){ - if(!isAI(usr)) - MiddleClick(usr) - return - } - - // ------- THROW ------- - if(usr.in_throw_mode) - return usr:throw_item(src) - - // ------- ITEM IN HAND DEFINED ------- - var/obj/item/W = usr.get_active_hand() -/* Now handled by get_active_hand() - // ------- ROBOT ------- - if(istype(usr, /mob/living/silicon/robot)) - if(!isnull(usr:module_active)) - W = usr:module_active - else - W = null -*/ - // ------- ATTACK SELF ------- - if (W == src && usr.stat == 0) - W.attack_self(usr) - if(usr.hand) - usr.update_inv_l_hand(0) //update in-hand overlays - else - usr.update_inv_r_hand(0) - return - - // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) ------- - if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) - return - - // ------- CLICKING STUFF IN CONTAINERS ------- - if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) )))))) - if (istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = usr - if (ai.control_disabled || ai.malfhacking) - return - else - return - - // ------- 1 TILE AWAY ------- - var/t5 - // ------- AI CAN CLICK ANYTHING ------- - if(istype(usr, /mob/living/silicon/ai)) - t5 = 1 - // ------- CYBORG CAN CLICK ANYTHING WHEN NOT HOLDING STUFF ------- - else if(istype(usr, /mob/living/silicon/robot) && !W) - t5 = 1 - else - t5 = in_range(src, usr) || src.loc == usr - -// world << "according to dblclick(), t5 is [t5]" - - // ------- ACTUALLY DETERMINING STUFF ------- - if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) - - // ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN ------- - - if (usr.next_move < world.time) - usr.prev_move = usr.next_move - usr.next_move = world.time + 10 - else - // ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND ------- - return - - // ------- DELAY CHECK PASSED ------- - - if ((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc))) - - // ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE ------- - - var/direct = get_dir(usr, src) - var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc ) - var/ok = 0 - if ( (direct - 1) & direct) - - // ------- CLICKED OBJECT IS LOCATED IN A DIAGONAL POSITION FROM THE PERSON ------- - - var/turf/Step_1 - var/turf/Step_2 - switch(direct) - if(5.0) - Step_1 = get_step(usr, NORTH) - Step_2 = get_step(usr, EAST) - - if(6.0) - Step_1 = get_step(usr, SOUTH) - Step_2 = get_step(usr, EAST) - - if(9.0) - Step_1 = get_step(usr, NORTH) - Step_2 = get_step(usr, WEST) - - if(10.0) - Step_1 = get_step(usr, SOUTH) - Step_2 = get_step(usr, WEST) - - else - if(Step_1 && Step_2) - - // ------- BOTH CARDINAL DIRECTIONS OF THE DIAGONAL EXIST IN THE GAME WORLD ------- - - var/check_1 = 0 - var/check_2 = 0 - if(step_to(D, Step_1)) - check_1 = 1 - for(var/obj/border_obstacle in Step_1) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, src)) - check_1 = 0 - // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON ONE OF THE DIRECITON TILES ------- - for(var/obj/border_obstacle in get_turf(src)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON THE TILE YOU'RE ON ------- - check_1 = 0 - - D.loc = usr.loc - if(step_to(D, Step_2)) - check_2 = 1 - - for(var/obj/border_obstacle in Step_2) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, src)) - check_2 = 0 - for(var/obj/border_obstacle in get_turf(src)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - check_2 = 0 - - - if(check_1 || check_2) - ok = 1 - // ------- YOU CAN REACH THE ITEM THROUGH AT LEAST ONE OF THE TWO DIRECTIONS. GOOD. ------- - - /* - More info: - If you're trying to click an item in the north-east of your mob, the above section of code will first check if tehre's a tile to the north or you and to the east of you - These two tiles are Step_1 and Step_2. After this, a new dummy object is created on your location. It then tries to move to Step_1, If it succeeds, objects on the turf you're on and - the turf that Step_1 is are checked for items which have the ON_BORDER flag set. These are itmes which limit you on only one tile border. Windows, for the most part. - CheckExit() and CanPass() are use to determine this. The dummy object is then moved back to your location and it tries to move to Step_2. Same checks are performed here. - If at least one of the two checks succeeds, it means you can reach the item and ok is set to 1. - */ - else - // ------- OBJECT IS ON A CARDINAL TILE (NORTH, SOUTH, EAST OR WEST OR THE TILE YOU'RE ON) ------- - if(loc == usr.loc) - ok = 1 - // ------- OBJECT IS ON THE SAME TILE AS YOU ------- - else - ok = 1 - - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in usr.loc) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, src)) - ok = 0 - - //Next, check objects to block entry that are on the border - for(var/obj/border_obstacle in get_turf(src)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - ok = 0 - /* - See the previous More info, for... more info... - */ - - //del(D) - // Garbage Collect Dummy - D.loc = null - D = null - - // ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE ------- - if (!( ok )) - // ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE ------- - return 0 - - if (!( usr.restrained() || (usr.lying && usr.buckled!=src) )) - // ------- YOU ARE NOT REASTRAINED ------- - - if (W) - // ------- YOU HAVE AN ITEM IN YOUR HAND - HANDLE ATTACKBY AND AFTERATTACK ------- - var/ignoreAA = 0 //Ignore afterattack(). Surgery uses this. - if (t5) - ignoreAA = src.attackby(W, usr) - if (W && !ignoreAA) - W.afterattack(src, usr, (t5 ? 1 : 0), params) - - else - // ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND ------- - if (istype(usr, /mob/living/carbon/human)) - // ------- YOU ARE HUMAN ------- - src.attack_hand(usr, usr.hand) - else - // ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED ------- - if (istype(usr, /mob/living/carbon/monkey)) - src.attack_paw(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - if(usr.m_intent == "walk" && istype(usr, /mob/living/carbon/alien/humanoid/hunter)) - usr.m_intent = "run" - usr.hud_used.move_intent.icon_state = "running" - usr.update_icons() - src.attack_alien(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/larva)) - src.attack_larva(usr) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) - src.attack_ai(usr, usr.hand) - else if(istype(usr, /mob/living/carbon/slime)) - src.attack_slime(usr) - else if(istype(usr, /mob/living/simple_animal)) - src.attack_animal(usr) - else - // ------- YOU ARE RESTRAINED. DETERMINE WHAT YOU ARE AND ATTACK WITH THE PROPER HAND_X PROC ------- - if (istype(usr, /mob/living/carbon/human)) - src.hand_h(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) - src.hand_p(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - src.hand_al(usr, usr.hand) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) - src.hand_a(usr, usr.hand) - - else - // ------- ITEM INACESSIBLE OR CLICKING ON SCREEN ------- - if (istype(src, /obj/screen)) - // ------- IT'S THE HUD YOU'RE CLICKING ON ------- - usr.prev_move = usr.next_move - usr:lastDblClick = world.time + 2 - if (usr.next_move < world.time) - usr.next_move = world.time + 2 - else - return - - // ------- 2 DECISECOND DELAY FOR CLICKING PASSED ------- - - if (!( usr.restrained() )) - - // ------- YOU ARE NOT RESTRAINED ------- - if ((W && !( istype(src, /obj/screen) ))) - // ------- IT SHOULD NEVER GET TO HERE, DUE TO THE ISTYPE(SRC, /OBJ/SCREEN) FROM PREVIOUS IF-S - I TESTED IT WITH A DEBUG OUTPUT AND I COULDN'T GET THIST TO SHOW UP. ------- - src.attackby(W, usr) - if (W) - W.afterattack(src, usr,, params) - else - // ------- YOU ARE NOT RESTRAINED, AND ARE CLICKING A HUD OBJECT ------- - if (istype(usr, /mob/living/carbon/human)) - src.attack_hand(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) - src.attack_paw(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - src.attack_alien(usr, usr.hand) - else - // ------- YOU ARE RESTRAINED CLICKING ON A HUD OBJECT ------- - if (istype(usr, /mob/living/carbon/human)) - src.hand_h(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) - src.hand_p(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - src.hand_al(usr, usr.hand) - else - // ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD ------- - if((LASER in usr:mutations) && usr:a_intent == "harm" && world.time >= usr.next_move) - // ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED ------- - - var/turf/T = get_turf(usr) - var/turf/U = get_turf(src) - - - if(istype(usr, /mob/living/carbon/human)) - usr:nutrition -= rand(1,5) - usr:handle_regular_hud_updates() - - var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( usr.loc ) - A.icon = 'icons/effects/genetics.dmi' - A.icon_state = "eyelasers" - playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) - - A.firer = usr - A.def_zone = usr:get_organ_target() - A.original = src - A.current = T - A.yo = U.y - T.y - A.xo = U.x - T.x - spawn( 1 ) - A.process() - - usr.next_move = world.time + 6 - return - -/atom/proc/ShiftClick(var/mob/M as mob) - - if(istype(M.machine, /obj/machinery/computer/security)) //No examining by looking through cameras - return - - //I dont think this was ever really a problem and it's only creating more bugs... -// if(( abs(src.x-M.x)<8 || abs(src.y-M.y)<8 ) && src.z == M.z ) //This should prevent non-observers to examine stuff from outside their view. - examine() - - return - -/atom/proc/AltClick() - - /* // NOT UNTIL I FIGURE OUT A GOOD WAY TO DO THIS SHIT - if((HULK in usr.mutations) || (SUPRSTR in usr.augmentations)) - if(!istype(src, /obj/item) && !istype(src, /mob) && !istype(src, /turf)) - if(!usr.get_active_hand()) - - var/liftable = 0 - for(var/x in liftable_structures) - if(findtext("[src.type]", "[x]")) - liftable = 1 - break - - if(liftable) - - add_fingerprint(usr) - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(usr) - G.assailant = usr - usr.put_in_active_hand(G) - G.structure = src - G.synch() - - visible_message("\red [usr] has picked up [src]!") - - return - else - usr << "\red You can't pick this up!" - */ - - return - -/atom/proc/CtrlClick() - if(hascall(src,"pull")) - src:pull() - return - -/atom/proc/AIShiftClick() // Opens and closes doors! - if(istype(src , /obj/machinery/door/airlock)) - if(src:density) - var/nhref = "src=\ref[src];aiEnable=7" - src.Topic(nhref, params2list(nhref), src, 1) - else - var/nhref = "src=\ref[src];aiDisable=7" - src.Topic(nhref, params2list(nhref), src, 1) - - return - -/atom/proc/AIAltClick() // Eletrifies doors. - if(istype(src , /obj/machinery/door/airlock)) - if(!src:secondsElectrified) - var/nhref = "src=\ref[src];aiEnable=6" - src.Topic(nhref, params2list(nhref), src, 1) - else - var/nhref = "src=\ref[src];aiDisable=5" - src.Topic(nhref, params2list(nhref), src, 1) - - - return - -/atom/proc/AICtrlClick() // Bolts doors, turns off APCs. - if(istype(src , /obj/machinery/door/airlock)) - if(src:locked) - var/nhref = "src=\ref[src];aiEnable=4" - src.Topic(nhref, params2list(nhref), src, 1) - else - var/nhref = "src=\ref[src];aiDisable=4" - src.Topic(nhref, params2list(nhref), src, 1) - - else if (istype(src , /obj/machinery/power/apc/)) - var/obj/machinery/power/apc/A = src - A.toggle_breaker() - - return - -/atom/proc/MiddleClick(var/mob/M as mob) // switch hands - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/U = M - U.swap_hand() - - /atom/proc/get_global_map_pos() if(!islist(global_map) || isemptylist(global_map)) return var/cur_x = null @@ -1208,16 +351,3 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl /atom/proc/checkpass(passflag) return pass_flags&passflag - -/* -/client/verb/check_dummy() - set name = "List Dummies" - set category = "Debug" - - var/list/dummies = list() - for(var/obj/item/weapon/dummy/D in world) - usr << "[D] - [D.x], [D.y], [D.z] - [D.loc]" - dummies += D - usr << "[dummies.len] found!" -*/ - diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 307ce09d7f1..ddf101acff1 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -44,7 +44,7 @@ return 1 return 0 -/atom/movable/proc/hit_check() +/atom/movable/proc/hit_check() // todo: this is partly obsolete due to passflags already, add throwing stuff to mob CanPass and finish it if(src.throwing) for(var/atom/A in get_turf(src)) if(A == src) continue @@ -150,7 +150,7 @@ //done throwing, either because it hit something or it finished moving src.throwing = 0 - if(isobj(src)) src:throw_impact(get_turf(src)) + if(isobj(src)) src.throw_impact(get_turf(src)) //Overlays diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 285c6b84e90..cbda89004ca 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -28,7 +28,7 @@ datum/hSB var/hsbinfo = null var/global/list/spawn_forbidden = list( - /obj/item/weapon/grab, /obj/item/tk_grab, /obj/item/weapon/dummy, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you + /obj/item/weapon/grab, /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you /obj/item/assembly,/obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai, /obj/item/device/uplink/hidden, /obj/item/smallDelivery, /obj/item/missile,/obj/item/projectile, /obj/item/borg/sight,/obj/item/borg/overdrive,/obj/item/borg/stun) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index aebbf30d9c1..a3ded38503e 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -495,7 +495,7 @@ /obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if (istype(mover,/obj/item) && mover.throwing) var/obj/item/I = mover - if(istype(I, /obj/item/weapon/dummy) || istype(I, /obj/item/projectile)) + if(istype(I, /obj/item/projectile)) return if(prob(50)) I.loc = src.loc diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index b5157bd4fcd..7a9b02e5b6a 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -180,15 +180,6 @@ A.transfer_ai("INACTIVE","AICARD",src,user) return - attack_hand(var/mob/user as mob) - if(ishuman(user))//Checks to see if they are ninja - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - if(user:wear_suit:s_control) - user:wear_suit:transfer_ai("INACTIVE","NINJASUIT",src,user) - else - user << "\red ERROR: \black Remote access channel disabled." - return - /* This is a good place for AI-related object verbs so I'm sticking it here. If adding stuff to this, don't forget that an AI need to cancel_camera() whenever it physically moves to a different location. diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index aa5d2b48d5b..4c382dce3a4 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -60,14 +60,6 @@ if(..()) return - if(ishuman(user))//Checks to see if they are ninja - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - if(user:wear_suit:s_control) - user:wear_suit.transfer_ai("AIFIXER","NINJASUIT",src,user) - else - user << "\red ERROR: \black Remote access channel disabled." - return - user.set_machine(src) var/dat = "" diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 40f01898536..8cc72d07354 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -108,11 +108,18 @@ return src.attackby(user, user) +/obj/machinery/door/attack_tk(mob/user as mob) + if(requiresID() && !allowed(null)) + return + ..() + /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 //borgs can't attack doors open because it conflicts with their AI-like interaction with them. src.add_fingerprint(user) + if(!Adjacent(user)) + user = null if(!src.requiresID()) user = null if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade))) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 7f7bcb8521a..c78daf49e99 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -419,7 +419,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co //human_or_robot_user << browse(dat, "window=newscaster_main;size=400x600") //onclose(human_or_robot_user, "newscaster_main") - + var/datum/browser/popup = new(human_or_robot_user, "newscaster_main", "Newscaster Unit #[src.unit_no]", 400, 600) popup.set_content(dat) popup.set_title_image(human_or_robot_user.browse_rsc_icon(src.icon, src.icon_state)) @@ -737,9 +737,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co user << "This does nothing." src.update_icon() -/obj/machinery/newscaster/attack_ai(mob/user as mob) - return src.attack_hand(user) //or maybe it'll have some special functions? No idea. - /obj/machinery/newscaster/attack_paw(mob/user as mob) user << "The newscaster controls are far too complicated for your tiny brain!" @@ -754,6 +751,23 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co photo = user.get_active_hand() user.drop_item() photo.loc = src + if(istype(usr,/mob/living/silicon/ai)) + var/list/nametemp = list() + var/find + var/datum/picture/selection + var/mob/living/silicon/ai/tempAI = user + for(var/datum/picture/t in tempAI.aicamera.aipictures) + nametemp += t.fields["name"] + find = input("Select picture (numbered in order taken)") in nametemp + var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() + for(var/datum/picture/q in tempAI.aicamera.aipictures) + if(q.fields["name"] == find) + selection = q + break // just in case some AI decides to take 10 thousand pictures in a round + P.icon = selection.fields["icon"] + P.img = selection.fields["img"] + P.desc = selection.fields["desc"] + photo = P diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 8fe160b2827..8a088f3cb86 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -417,11 +417,6 @@ /obj/mecha/attack_hand(mob/user as mob) src.log_message("Attack by hand/paw. Attacker - [user].",1) - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("MECHA",src,user:wear_suit) - return - if ((HULK in user.mutations) && !prob(src.deflect_chance)) src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 06186355393..828c0c852ec 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -123,8 +123,7 @@ else if(isliving(src.loc)) return - user.lastDblClick = world.time + 2 - user.next_move = world.time + 2 + user.next_move = max(user.next_move+2,world.time + 2) src.pickup(user) add_fingerprint(user) user.put_in_active_hand(src) @@ -149,8 +148,7 @@ if(istype(src.loc, /mob/living)) return src.pickup(user) - user.lastDblClick = world.time + 2 - user.next_move = world.time + 2 + user.next_move = max(user.next_move+2,world.time + 2) user.put_in_active_hand(src) return @@ -200,150 +198,7 @@ return -/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone) - - if (!istype(M)) // not sure if this is the right thing... - return - var/messagesource = M - - if (istype(M,/mob/living/carbon/brain)) - messagesource = M:container - if (src.hitsound) - playsound(src.loc, hitsound, 50, 1, -1) - ///////////////////////// - user.lastattacked = M - M.lastattacker = user - - user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" - log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" ) - - //spawn(1800) // this wont work right - // M.lastattacker = null - ///////////////////////// - - var/power = src.force - if(HULK in user.mutations) - power *= 2 - - if(!istype(M, /mob/living/carbon/human)) - if(istype(M, /mob/living/carbon/slime)) - var/mob/living/carbon/slime/slime = M - if(prob(25)) - user << "\red [src] passes right through [M]!" - return - - if(power > 0) - slime.attacked += 10 - - if(slime.Discipline && prob(50)) // wow, buddy, why am I getting attacked?? - slime.Discipline = 0 - - if(power >= 3) - if(istype(slime, /mob/living/carbon/slime/adult)) - if(prob(5 + round(power/2))) - - if(slime.Victim) - if(prob(80) && !slime.client) - slime.Discipline++ - slime.Victim = null - slime.anchored = 0 - - spawn() - if(slime) - slime.SStun = 1 - sleep(rand(5,20)) - if(slime) - slime.SStun = 0 - - spawn(0) - if(slime) - slime.canmove = 0 - step_away(slime, user) - if(prob(25 + power)) - sleep(2) - if(slime && user) - step_away(slime, user) - slime.canmove = 1 - - else - if(prob(10 + power*2)) - if(slime) - if(slime.Victim) - if(prob(80) && !slime.client) - slime.Discipline++ - - if(slime.Discipline == 1) - slime.attacked = 0 - - spawn() - if(slime) - slime.SStun = 1 - sleep(rand(5,20)) - if(slime) - slime.SStun = 0 - - slime.Victim = null - slime.anchored = 0 - - - spawn(0) - if(slime && user) - step_away(slime, user) - slime.canmove = 0 - if(prob(25 + power*4)) - sleep(2) - if(slime && user) - step_away(slime, user) - slime.canmove = 1 - - - var/showname = "." - if(user) - showname = " by [user]." - if(!(user in viewers(M, null))) - showname = "." - - for(var/mob/O in viewers(messagesource, null)) - if(src.attack_verb.len) - O.show_message("\red [M] has been [pick(src.attack_verb)] with [src][showname] ", 1) - else - O.show_message("\red [M] has been attacked with [src][showname] ", 1) - - if(!showname && user) - if(user.client) - user << "\red You attack [M] with [src]. " - - - - if(istype(M, /mob/living/carbon/human)) - M:attacked_by(src, user, def_zone) - else - switch(src.damtype) - if("brute") - if(istype(src, /mob/living/carbon/slime)) - M.adjustBrainLoss(power) - - else - - M.take_organ_damage(power) - if (prob(33)) // Added blood for whacking non-humans too - var/turf/location = M.loc - if (istype(location, /turf/simulated)) - location.add_blood_floor(M) - if("fire") - if (!(COLD_RESISTANCE in M.mutations)) - M.take_organ_damage(0, power) - M << "Aargh it burns!" - M.updatehealth() - src.add_fingerprint(user) - return 1 - -/obj/item/proc/attack_self() - return - -/obj/item/proc/afterattack() - return +// afterattack() and attack() prototypes moved to _onclick/item_attack.dm for consistency /obj/item/proc/talk_into(mob/M as mob, text) return @@ -567,12 +422,12 @@ set category = "Object" set name = "Pick up" - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(src, usr)) + if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) return if(ishuman(usr) || ismonkey(usr)) if(usr.get_active_hand() == null) - src.Click() // Let me know if this has any problems -Giacom + usr.UnarmedAttack(src) // Let me know if this has any problems -Giacom | Actually let me know now. -Sayu /* if(usr.get_active_hand() == null) src.attack_hand(usr) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 27b38ac5f0c..ad757325b95 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -65,7 +65,8 @@ shadeColour = input(user, "Please select the shade colour.", "Crayon colour") as color return -/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob) +/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity) + if(!proximity) return if(istype(target,/turf/simulated/floor)) var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter") switch(drawtype) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index b00f525adfc..5e5182008ea 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -907,7 +907,8 @@ var/global/list/obj/item/device/pda/PDAs = list() else user.show_message("\blue No radiation detected.") -/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob) +/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) + if(!proximity) return switch(scanmode) if(3) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 9a1294c3e2b..1053bf4024f 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -1,7 +1,7 @@ /obj/item/device/chameleon name = "chameleon-projector" icon_state = "shield0" - flags = FPRINT | TABLEPASS| CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS| CONDUCT slot_flags = SLOT_BELT item_state = "electronic" throwforce = 5.0 @@ -22,7 +22,8 @@ /obj/item/device/chameleon/attack_self() toggle() -/obj/item/device/chameleon/afterattack(atom/target, mob/user , flag) +/obj/item/device/chameleon/afterattack(atom/target, mob/user , proximity) + if(!proximity) return if(!active_dummy) if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear)) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index b5f64ce481b..50a6f44bbc4 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -226,7 +226,8 @@ ..() return -/obj/item/device/flashlight/emp/afterattack(atom/A as mob|obj, mob/user) +/obj/item/device/flashlight/emp/afterattack(atom/A as mob|obj, mob/user, proximity) + if(!proximity) return if (emp_charges > 0) A.emp_act(1) A.visible_message("[user] blinks \the [src] at \the [A].", \ diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 3e98a0fe200..bb327ce0160 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -6,7 +6,7 @@ icon_state = "pointer" item_state = "pen" var/pointer_icon_state - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BELT m_amt = 500 g_amt = 500 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 20069c324a0..5130265ab81 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -268,7 +268,8 @@ ..() -/obj/item/weapon/shard/afterattack(atom/A as mob|obj, mob/user) +/obj/item/weapon/shard/afterattack(atom/A as mob|obj, mob/user, proximity) + if(!proximity || !(src in user)) return if(isturf(A)) return if(istype(A, /obj/item/weapon/storage)) diff --git a/code/game/objects/items/tk_grab.dm b/code/game/objects/items/tk_grab.dm deleted file mode 100644 index 1839460d927..00000000000 --- a/code/game/objects/items/tk_grab.dm +++ /dev/null @@ -1,128 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/obj/item/tk_grab - name = "Telekinetic Grab" - desc = "Magic" - icon = 'icons/obj/magic.dmi'//Needs sprites - icon_state = "2" - flags = USEDELAY - //item_state = null - w_class = 10.0 - layer = 20 - - var/last_throw = 0 - var/obj/focus = null - var/mob/living/host = null - - - dropped(mob/user as mob) - del(src) - return - - - //stops TK grabs being equipped anywhere but into hands - equipped(var/mob/user, var/slot) - if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return - del(src) - return - -/* - attack_self(mob/user as mob) - if(!istype(focus,/obj/item)) return - if(!check_path()) return//No clear path - - user.put_in_hands(focus) - add_fingerprint(user) - user.update_inv_l_hand(0) - user.update_inv_r_hand() - spawn(0) - del(src) - return -*/ - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)//TODO: go over this - if(!target || !user) return - if(last_throw+3 > world.time) return - if(!host) - del(src) - return - if(!(TK in host.mutations)) - del(src) - return - if(isobj(target)) - if(!target.loc || !isturf(target.loc)) - del(src) - return - if(!focus) - focus_object(target, user) - return - var/focusturf = get_turf(focus) - if(get_dist(focusturf, target) <= 1 && !istype(target, /turf)) - target.attackby(focus, user, user:get_organ_target()) - - else if(get_dist(focusturf, target) <= 16) - apply_focus_overlay() - focus.throw_at(target, 10, 1) - last_throw = world.time - return - - - proc/focus_object(var/obj/target, var/mob/living/user) - if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later - if(target.anchored) - target.attack_hand(user) // you can use shit now! - return//No throwing anchored things - if(!isturf(target.loc)) - return - focus = target - update_icon() - apply_focus_overlay() - return - - - proc/apply_focus_overlay() - if(!focus) return - var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) - O.name = "sparkles" - O.anchored = 1 - O.density = 0 - O.layer = FLY_LAYER - O.dir = pick(cardinal) - O.icon = 'icons/effects/effects.dmi' - O.icon_state = "nothing" - flick("empdisable",O) - spawn(5) - O.delete() - return - - - update_icon() - overlays.Cut() - if(focus && focus.icon && focus.icon_state) - overlays += icon(focus.icon,focus.icon_state) - return - -/*Not quite done likely needs to use something thats not get_step_to - proc/check_path() - var/turf/ref = get_turf(src.loc) - var/turf/target = get_turf(focus.loc) - if(!ref || !target) return 0 - var/distance = get_dist(ref, target) - if(distance >= 10) return 0 - for(var/i = 1 to distance) - ref = get_step_to(ref, target, 0) - if(ref != target) return 0 - return 1 -*/ - -//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1) -/* - if(istype(user, /mob/living/carbon)) - if(user:mutations & TK && get_dist(source, user) <= 7) - if(user:get_active_hand()) return 0 - var/X = source:x - var/Y = source:y - var/Z = source:z - -*/ - diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index cc78be5afc2..98e29755c23 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -35,7 +35,8 @@ /obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob) return -/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob) +/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity) + if(!proximity) return if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) A.reagents.trans_to(src, 10) user << "\blue You fill the balloon with the contents of [A]." @@ -120,7 +121,7 @@ icon = 'icons/obj/gun.dmi' icon_state = "revolver" item_state = "gun" - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BELT w_class = 3.0 g_amt = 10 @@ -197,7 +198,7 @@ icon = 'icons/obj/gun.dmi' icon_state = "crossbow" item_state = "crossbow" - flags = FPRINT | TABLEPASS | USEDELAY + flags = FPRINT | TABLEPASS w_class = 2.0 attack_verb = list("attacked", "struck", "hit") var/bullets = 5 diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 2ebee6885a7..24d67a0424f 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -141,7 +141,8 @@ RCD playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - afterattack(atom/A, mob/user) + afterattack(atom/A, mob/user, proximity) + if(!proximity) return 0 if(disabled && !isrobot(user)) return 0 if(istype(A,/area/shuttle)||istype(A,/turf/space/transit)) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 5ffed7b6d1a..fa55fc8e624 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -61,7 +61,8 @@ RSF return // Change mode -/obj/item/weapon/rsf/afterattack(atom/A, mob/user as mob) +/obj/item/weapon/rsf/afterattack(atom/A, mob/user as mob, proximity) + if(!proximity) return if (!(istype(A, /obj/structure/table) || istype(A, /turf/simulated/floor))) return diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 9519b81ff6f..6130cde3dd2 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -111,7 +111,8 @@ access = list(access_maint_tunnels, access_syndicate) origin_tech = "syndicate=3" -/obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob) +/obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob, proximity) + if(!proximity) return if(istype(O, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/I = O src.access |= I.access diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index b4d881fa314..15dee70e78f 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -118,8 +118,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM return -/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob) - ..() +/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob, proximity) + if(!proximity) return if(istype(glass)) //you can dip cigarettes into beakers var/transfered = glass.reagents.trans_to(src, chem_volume) if(transfered) //if reagents were transfered, show the message @@ -160,7 +160,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/turf/T = get_turf(src) T.visible_message(flavor_text) processing_objects.Add(src) - + //can't think of any other way to update the overlays :< if(ismob(loc)) var/mob/M = loc diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 1f3b451e628..49f0b2e45f5 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -35,7 +35,8 @@ M.Stun(3) M.Weaken(2) -/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob) +/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity) + if(!proximity) return //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index e5ecb9d6d55..bc10c25778e 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "plastic-explosive0" item_state = "plasticx" - flags = FPRINT | TABLEPASS | USEDELAY + flags = FPRINT | TABLEPASS | NOBLUDGEON w_class = 2.0 origin_tech = "syndicate=2" var/datum/wires/explosive/plastic/wires = null diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index f140c2efb55..0c5f84a4b73 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -5,7 +5,7 @@ icon_state = "fire_extinguisher0" item_state = "fire_extinguisher" hitsound = 'sound/weapons/smash.ogg' - flags = FPRINT | USEDELAY | TABLEPASS | CONDUCT + flags = FPRINT | TABLEPASS | CONDUCT throwforce = 10 w_class = 3.0 throw_speed = 2 @@ -24,7 +24,7 @@ icon_state = "miniFE0" item_state = "miniFE" hitsound = null //it is much lighter, after all. - flags = FPRINT | USEDELAY | TABLEPASS + flags = FPRINT | TABLEPASS throwforce = 2 w_class = 2.0 force = 3.0 @@ -127,4 +127,4 @@ step(user, user.inertia_dir) else return ..() - return + return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 9c0dd273c52..c6fa18b5377 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/flamethrower.dmi' icon_state = "flamethrowerbase" item_state = "flamethrower_0" - flags = FPRINT | TABLEPASS| CONDUCT | USEDELAY // USEDELAY flag needed in order to use afterattack() for things that are not in reach. I.E: Shooting flames. + flags = FPRINT | TABLEPASS| CONDUCT force = 3.0 throwforce = 10.0 throw_speed = 1 @@ -61,6 +61,7 @@ return /obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, flag) + if(flag) return // too close // Make sure our user is still holding us if(user && user.get_active_hand() == src) var/turf/target_turf = get_turf(target) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index da5c22b8177..1f4e373cbc6 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -5,7 +5,7 @@ icon_state = "flashbang" det_time = 20 item_state = "flashbang" - flags = FPRINT | TABLEPASS | USEDELAY + flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT var/datum/effect/effect/system/bad_smoke_spread/smoke diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index fd3f2e8c7f2..27935c4f874 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -28,7 +28,8 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) reagents.remove_any(1) //reaction() doesn't use up the reagents -/obj/item/weapon/mop/afterattack(atom/A, mob/user) +/obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity) + if(!proximity) return if(istype(A, /turf/simulated) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune)) if(reagents.total_volume < 1) user << "Your mop is dry!" diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 081aa7a5e68..fbd001c87c1 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -76,7 +76,8 @@ var/global/list/cached_icons = list() return -/obj/item/weapon/paint/afterattack(turf/target, mob/user as mob) +/obj/item/weapon/paint/afterattack(turf/target, mob/user as mob, proximity) + if(!proximity) return if(paintleft <= 0) icon_state = "paint_empty" return @@ -99,7 +100,8 @@ var/global/list/cached_icons = list() name = "Paint remover" icon_state = "paint_neutral" - afterattack(turf/target, mob/user as mob) + afterattack(turf/target, mob/user as mob,proximity) + if(!proximity) return if(istype(target) && target.icon != initial(target.icon)) target.icon = initial(target.icon) return diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm index c4ce7f308ea..88deea093c6 100644 --- a/code/game/objects/items/weapons/singularityhammer.dm +++ b/code/game/objects/items/weapons/singularityhammer.dm @@ -58,8 +58,8 @@ -/obj/item/weapon/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob) - ..() +/obj/item/weapon/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) + if(!proximity) return if(wielded) if(charged == 5) charged = 0 diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 609ffafb431..28f007f30db 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -87,7 +87,8 @@ playsound(src.loc, "punch", 25, 1, -1) return -/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob) +/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob, proximity) + if(!proximity) return if (istype(A, /turf/simulated/floor)) user << "\blue You hit the floor with the bible." if(user.mind && (user.mind.assigned_role == "Chaplain")) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 06d026303b2..adb5bcdcb45 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -26,8 +26,17 @@ /obj/item/weapon/storage/MouseDrop(obj/over_object) if(ishuman(usr) || ismonkey(usr)) //so monkeys can take off their backpacks -- Urist var/mob/M = usr + + if(over_object == M && Adjacent(M)) // this must come before the screen objects only block + orient2hud(M) // dunno why it wasn't before + if(M.s_active) + M.s_active.close(M) + show_to(M) + return + if(!( istype(over_object, /obj/screen) )) return ..() + if(!(loc == usr) || (loc && loc.loc == usr)) return playsound(loc, "rustle", 50, 1, -5) @@ -41,10 +50,6 @@ M.put_in_l_hand(src) add_fingerprint(usr) return - if(over_object == usr && in_range(src, usr) || usr.contents.Find(src)) - if(usr.s_active) - usr.s_active.close(usr) - show_to(usr) /obj/item/weapon/storage/proc/return_inv() @@ -292,33 +297,24 @@ if(isrobot(user)) user << "You're a robot. No." - return //Robots can't interact with storage items. + return 1 //Robots can't interact with storage items. if(!can_be_inserted(W)) - return + return 1 if(istype(W, /obj/item/weapon/tray)) //THIS ISN'T HOW OOP WORKS var/obj/item/weapon/tray/T = W if(T.calc_carry() > 0) user << "[T] won't fit in [src]." - return + return 1 handle_item_insertion(W) + return 1 /obj/item/weapon/storage/dropped(mob/user) return - -/obj/item/weapon/storage/MouseDrop(over_object, src_location, over_location) - ..() - orient2hud(usr) - if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) - if(usr.s_active) - usr.s_active.close(usr) - show_to(usr) - - /obj/item/weapon/storage/attack_hand(mob/user) playsound(loc, "rustle", 50, 1, -5) @@ -409,4 +405,4 @@ //Clicking on itself will empty it, if it has the verb to do that. if(user.get_active_hand() == src) if(verbs.Find(/obj/item/weapon/storage/verb/quick_empty)) - quick_empty() \ No newline at end of file + quick_empty() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index c84360665bf..452fac28fd4 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -190,7 +190,8 @@ location.hotspot_expose(700, 5) -/obj/item/weapon/weldingtool/afterattack(obj/O, mob/user) +/obj/item/weapon/weldingtool/afterattack(obj/O, mob/user, proximity) + if(!proximity) return if(istype(O, /obj/structure/reagent_dispensers/fueltank) && in_range(src, O)) if(!welding) O.reagents.trans_to(src, max_fuel) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index a5517b4f0fd..97245af7786 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -134,8 +134,8 @@ icon_state = "fireaxe[wielded]" return -/obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob) - ..() +/obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) + if(!proximity) return if(A && wielded && (istype(A,/obj/structure/window) || istype(A,/obj/structure/grille))) //destroys windows and grilles in one hit if(istype(A,/obj/structure/window)) //should just make a window.Break() proc but couldn't bother with it var/obj/structure/window/W = A diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index f42261cdbf6..261a6c17910 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -171,4 +171,26 @@ LINEN BINS hidden = null - add_fingerprint(user) \ No newline at end of file + add_fingerprint(user) +/obj/structure/bedsheetbin/attack_tk(mob/user as mob) + if(amount >= 1) + amount-- + + var/obj/item/weapon/bedsheet/B + if(sheets.len > 0) + B = sheets[sheets.len] + sheets.Remove(B) + + else + B = new /obj/item/weapon/bedsheet(loc) + + B.loc = loc + user << "You telekinetically remove [B] from [src]." + update_icon() + + if(hidden) + hidden.loc = loc + hidden = null + + + add_fingerprint(user) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b9ee15d2b4b..9255a83c851 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -177,6 +177,8 @@ src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet else user << "The locker is too small to stuff [W] into!" + if(istype(W,/obj/item/tk_grab)) + return 0 if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W @@ -192,10 +194,7 @@ if(isrobot(user)) return - user.drop_item() - - if(W) - W.loc = src.loc + user.drop_item(src) else if(istype(W, /obj/item/weapon/packageWrap)) return @@ -260,6 +259,13 @@ if(!src.toggle()) usr << "It won't budge!" +// tk grab then use on self +/obj/structure/closet/attack_self_tk(mob/user as mob) + src.add_fingerprint(user) + + if(!src.toggle()) + usr << "It won't budge!" + /obj/structure/closet/verb/verb_toggleopen() set src in oview(1) set category = "Object" diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index dbe5bf9f10b..3219a1fe942 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -137,6 +137,15 @@ src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) spawn(10) update_icon() + attack_tk(mob/user as mob) + if(localopened && fireaxe) + fireaxe.loc = loc + user << "\blue You telekinetically remove the fire axe." + fireaxe = null + update_icon() + return + attack_hand(user) + verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri set name = "Open/Close" set category = "Object" diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 517c51a6061..5daadc94866 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -7,11 +7,13 @@ anchored = 1 /obj/structure/dresser/attack_hand(mob/user as mob) + if(!Adjacent(user))//no tele-grooming + return if(ishuman(user)) var/mob/living/carbon/human/H = user var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_all - if(!in_range(src, user))//no tele-grooming + if(!Adjacent(user))//no tele-grooming return if(new_undies) H.underwear = new_undies diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 1606d63d4ac..964f634d1f4 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -36,7 +36,15 @@ else opened = !opened update_icon() - +/obj/structure/extinguisher_cabinet/attack_tk(mob/user) + if(has_extinguisher) + has_extinguisher.loc = loc + user << "You telekinetically remove [has_extinguisher] from [src]." + has_extinguisher = null + opened = 1 + else + opened = !opened + update_icon() /obj/structure/extinguisher_cabinet/attack_paw(mob/user) attack_hand(user) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 6bb2cf69ab9..9f546bcf15c 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -133,12 +133,7 @@ layer = 2.0 var/obj/structure/morgue/connected = null anchored = 1.0 - -/obj/structure/m_tray/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if (istype(mover, /obj/item/weapon/dummy)) - return 1 - else - return ..() + throwpass = 1 /obj/structure/m_tray/attack_paw(mob/user as mob) return src.attack_hand(user) @@ -352,12 +347,7 @@ layer = 2.0 var/obj/structure/crematorium/connected = null anchored = 1.0 - -/obj/structure/c_tray/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if (istype(mover, /obj/item/weapon/dummy)) - return 1 - else - return ..() + throwpass = 1 /obj/structure/c_tray/attack_paw(mob/user as mob) return src.attack_hand(user) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 4176d3cd62a..c68305a7b28 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -26,6 +26,12 @@ SK.loc = E SK.master = E del(src) +/obj/structure/stool/bed/chair/attack_tk(mob/user as mob) + if(buckled_mob) + ..() + else + rotate() + return /obj/structure/stool/bed/chair/proc/handle_rotation() //making this into a seperate proc so office chairs can call it on Move() if(src.dir == NORTH) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 3801eafcd69..5a81d92b0c6 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -200,12 +200,6 @@ del(src) return - -/obj/structure/table/hand_p(mob/user as mob) - return src.attack_paw(user) - return - - /obj/structure/table/attack_paw(mob/user) if(HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) @@ -260,6 +254,8 @@ density = 0 del(src) +/obj/structure/table/attack_tk() // no telehulk sorry + return /obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group || (height==0)) return 1 @@ -281,7 +277,7 @@ return -/obj/structure/table/attackby(obj/item/weapon/W, mob/user) +/obj/structure/table/attackby(obj/item/W, mob/user) if (istype(W, /obj/item/weapon/grab) && get_dist(src, user) < 2) var/obj/item/weapon/grab/G = W if(G.affecting.buckled) @@ -564,4 +560,6 @@ visible_message("[user] smashes [src] apart!") new /obj/item/weapon/rack_parts(loc) density = 0 - del(src) \ No newline at end of file + del(src) +/obj/structure/rack/attack_tk() // no telehulk sorry + return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 76622dcb729..67552863327 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -67,7 +67,7 @@ /obj/structure/dispenser/Topic(href, href_list) if(usr.stat || usr.restrained()) return - if(get_dist(src, usr) <= 1) + if(Adjacent(usr)) usr.set_machine(src) if(href_list["oxygen"]) if(oxygentanks > 0) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 7340d7b5569..00aa0e3d787 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -337,20 +337,20 @@ /obj/structure/sink/attack_hand(mob/user) if(isrobot(user) || isAI(user)) return + if(!Adjacent(user)) + return if(busy) user << "Someone's already washing here." return - var/turf/location = user.loc - if(!isturf(location)) return user << "You start washing your hands." busy = 1 sleep(40) busy = 0 - if(user.loc != location) return //Person has moved away from the sink + if(!Adjacent(user)) return //Person has moved away from the sink user.clean_blood() user.visible_message("[user] washes their hands in [src].") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 799038a9148..eb7fd562651 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -96,6 +96,9 @@ if(reinf) new /obj/item/stack/rods(loc) del(src) +/obj/structure/window/attack_tk(mob/user as mob) + user.visible_message("Something knocks on [src].") + playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1) /obj/structure/window/attack_hand(mob/user as mob) if(!can_be_reached(user)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 50b5cee9c0c..6f660eda079 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -40,17 +40,6 @@ air_master.add_to_active(T) ..() -/turf/DblClick() - if(istype(usr, /mob/living/silicon/ai)) - return move_camera_by_click() - if(usr.stat || usr.restrained() || usr.lying) - return ..() - return ..() - -/turf/Click() - if(!isAI(usr)) - ..() - /turf/attack_hand(mob/user as mob) user.Move_Pulled(src) diff --git a/code/game/verbs/atom_verbs.dm b/code/game/verbs/atom_verbs.dm index 459ada21724..2ff6efcf260 100644 --- a/code/game/verbs/atom_verbs.dm +++ b/code/game/verbs/atom_verbs.dm @@ -1,9 +1,10 @@ /atom/movable/verb/pull() set name = "Pull" - set category = "IC" + set category = "Object" set src in oview(1) - usr.start_pulling(src) + if(Adjacent(usr)) + usr.start_pulling(src) return /atom/verb/point() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9a4368923c8..745d9cd6caa 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -534,15 +534,6 @@ var/list/admin_verbs_hideable = list( log_admin("[key_name(usr)] used 'kill air'.") message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1) -/client/proc/toggle_clickproc() //TODO ERRORAGE (This is a temporary verb here while I test the new clicking proc) - set name = "Toggle NewClickProc" - set category = "Debug" - - if(!holder) return - using_new_click_proc = !using_new_click_proc - world << "Testing of new click proc [using_new_click_proc ? "enabled" : "disabled"]" - feedback_add_details("admin_verb","TNCP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/deadmin_self() set name = "De-admin self" set category = "Admin" diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index e87bf74e2d5..b05dbe49fba 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -33,15 +33,15 @@ largest_move_time = M.next_move - world.time else largest_move_time = 1 - if(M.lastDblClick >= largest_click_time) + if(M.next_click >= largest_click_time) largest_click_mob = M - if(M.lastDblClick > world.time) - largest_click_time = M.lastDblClick - world.time + if(M.next_click > world.time) + largest_click_time = M.next_click - world.time else largest_click_time = 0 - log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.lastDblClick] world.time = [world.time]") + log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]") M.next_move = 1 - M.lastDblClick = 0 + M.next_click = 0 message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!", 1) message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1) message_admins("world.time = [world.time]", 1) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 5bfd81a1c00..8dbbfada292 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -59,6 +59,10 @@ BLIND // can't see anything ..() return +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + //Head /obj/item/clothing/head name = "head" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 7b0825f414d..b5845e7bfd2 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -1,14 +1,3 @@ -/obj/item/clothing/gloves/space_ninja - desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance." - name = "ninja gloves" - icon_state = "s-ninja" - item_state = "s-ninja" - siemens_coefficient = 0 - var/draining = 0 - var/candrain = 0 - var/mindrain = 200 - var/maxdrain = 400 - /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim. Swanky." name = "captain's gloves" diff --git a/code/modules/clothing/gloves/ninja.dm b/code/modules/clothing/gloves/ninja.dm new file mode 100644 index 00000000000..15e7c40c3b3 --- /dev/null +++ b/code/modules/clothing/gloves/ninja.dm @@ -0,0 +1,113 @@ +/* + Dear ninja gloves + + This isn't because I like you + this is because your father is a bastard + + ... + I guess you're a little cool. + -Sayu +*/ + +/obj/item/clothing/gloves/space_ninja + desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance." + name = "ninja gloves" + icon_state = "s-ninja" + item_state = "s-ninja" + siemens_coefficient = 0 + var/draining = 0 + var/candrain = 0 + var/mindrain = 200 + var/maxdrain = 400 + +/* + This runs the gamut of what ninja gloves can do + The other option would be a dedicated ninja touch bullshit proc on everything + which would probably more efficient, but ninjas are pretty rare. + This was mostly introduced to keep ninja code from contaminating other code; + with this in place it would be easier to untangle the rest of it. + + For the drain proc, see events/ninja.dm +*/ +/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity) + if(!candrain || draining) return 0 + + var/mob/living/carbon/human/H = loc + if(!istype(H)) return 0 // what + var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit + if(!istype(suit)) return 0 + if(isturf(A)) return 0 + + if(!proximity) // todo: you could add ninja stars or computer hacking here + return 0 + + // Move an AI into and out of things + if(istype(A,/mob/living/silicon/ai)) + if(suit.s_control) + A.add_fingerprint(H) + suit.transfer_ai("AICORE", "NINJASUIT", A, H) + return 1 + else + H << "\red ERROR: \black Remote access channel disabled." + return 0 + + if(istype(A,/obj/structure/AIcore/deactivated)) + if(suit.s_control) + A.add_fingerprint(H) + suit.transfer_ai("INACTIVE","NINJASUIT",A, H) + return 1 + else + H << "\red ERROR: \black Remote access channel disabled." + return 0 + if(istype(A,/obj/machinery/computer/aifixer)) + if(suit.s_control) + A.add_fingerprint(H) + suit.transfer_ai("AIFIXER","NINJASUIT",A, H) + return 1 + else + H << "\red ERROR: \black Remote access channel disabled." + return 0 + + // steal energy from powered things + if(istype(A,/mob/living/silicon/robot)) + A.add_fingerprint(H) + drain("CYBORG",A,suit) + return 1 + if(istype(A,/obj/machinery/power/apc)) + A.add_fingerprint(H) + drain("APC",A,suit) + return 1 + if(istype(A,/obj/structure/cable)) + A.add_fingerprint(H) + drain("WIRE",A,suit) + return 1 + if(istype(A,/obj/structure/grille)) + var/obj/structure/cable/C = locate() in A.loc + if(C) + drain("WIRE",C,suit) + return 1 + if(istype(A,/obj/machinery/power/smes)) + A.add_fingerprint(H) + drain("SMES",A,suit) + return 1 + if(istype(A,/obj/mecha)) + A.add_fingerprint(H) + drain("MECHA",A,suit) + return 1 + + // download research + if(istype(A,/obj/machinery/computer/rdconsole)) + A.add_fingerprint(H) + drain("RESEARCH",A,suit) + return 1 + if(istype(A,/obj/machinery/r_n_d/server)) + A.add_fingerprint(H) + var/obj/machinery/r_n_d/server/S = A + if(S.disabled) + return 1 + if(S.shocked) + S.shock(H,50) + return 1 + drain("RESEARCH",A,suit) + return 1 + diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index c0991dcd3a2..8e75055e17b 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -8,16 +8,13 @@ item_state = "" w_class = 1 -/obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user as mob) - if(!in_range(I, user)) +/obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user as mob,proximity) + if(!proximity) return if(!istype(I) || I.anchored == 1) return ..() - if(istype(I, /obj/item/weapon/storage)) - return ..() - if(istype(I, /obj/item/weapon/evidencebag)) user << "You find putting an evidence bag in another evidence bag to be slightly absurd." return diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index 4100de5b514..6068378d742 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -52,7 +52,8 @@ else ..() -/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob) +/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob,proximity) + if(!proximity) return if(istype(A) && src in user) user.visible_message("[user] starts to wipe down [A] with [src]!") if(do_after(user,30)) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index c2a9a5c46f2..0fb2e322a54 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -8,7 +8,7 @@ icon_state = "forensic1" w_class = 3.0 item_state = "electronic" - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON slot_flags = SLOT_BELT var/scanning = 0 var/list/log = list() @@ -43,9 +43,8 @@ scan(M, user) -/obj/item/device/detective_scanner/afterattack(atom/A as obj|turf|area, mob/user as mob) - - if(!in_range(A,user)) +/obj/item/device/detective_scanner/afterattack(atom/A as obj|turf|area, mob/user as mob,proximity) + if(!proximity) return if(!isturf(A) && !isobj(A)) return @@ -171,4 +170,4 @@ CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!") /proc/get_timestamp() - return time2text(world.time + 432000, ":ss") \ No newline at end of file + return time2text(world.time + 432000, ":ss") diff --git a/code/modules/hydroponics/hydroitemcode.dm b/code/modules/hydroponics/hydroitemcode.dm index 1d66bb3acb9..eaec018f589 100644 --- a/code/modules/hydroponics/hydroitemcode.dm +++ b/code/modules/hydroponics/hydroitemcode.dm @@ -14,7 +14,8 @@ M << "\red You are heated by the warmth of the of the [name]!" M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT -/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob) +/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity) + if(!proximity) return if(endurance > 0) endurance -= rand(1,(endurance/3)+1) else @@ -38,7 +39,8 @@ else user.take_organ_damage(0,force) -/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob) +/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity) + if(!proximity) return if(force > 0) force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) @@ -81,7 +83,8 @@ M.Weaken(force/15) M.drop_item() -/obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob) +/obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity) + if(!proximity) return if (force > 0) force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index ba484f9d5fb..6cadee4b764 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -20,7 +20,7 @@ name = "weed-spray" icon_state = "weedspray" item_state = "spray" - flags = TABLEPASS | OPENCONTAINER | FPRINT | USEDELAY + flags = TABLEPASS | OPENCONTAINER | FPRINT slot_flags = SLOT_BELT throwforce = 4 w_class = 2.0 @@ -39,7 +39,7 @@ name = "pest-spray" icon_state = "pestspray" item_state = "spray" - flags = TABLEPASS | OPENCONTAINER | FPRINT | USEDELAY + flags = TABLEPASS | OPENCONTAINER | FPRINT slot_flags = SLOT_BELT throwforce = 4 w_class = 2.0 @@ -58,7 +58,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "hoe" item_state = "hoe" - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT force = 5.0 throwforce = 7.0 w_class = 2.0 diff --git a/code/modules/mob/dead/observer/hud.dm b/code/modules/mob/dead/observer/hud.dm deleted file mode 100644 index 4290ca5d3a3..00000000000 --- a/code/modules/mob/dead/observer/hud.dm +++ /dev/null @@ -1,3 +0,0 @@ - -/datum/hud/proc/ghost_hud() - return \ No newline at end of file diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index bd7d35f03d5..212970e9900 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -79,6 +79,7 @@ if(W) if(client) client.screen -= W u_equip(W) + if(!W) return 1 // self destroying objects (tk, grabs) W.layer = initial(W.layer) W.loc = loc diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 436f616982e..35055b1a056 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -132,16 +132,6 @@ updatehealth() return - -/mob/living/carbon/alien/humanoid/hand_p(mob/living/carbon/user) - if(user.a_intent == "harm") - if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) - return - if(health > 0) - visible_message("[user] has bit [src]!") - adjustBruteLoss(rand(1, 3)) - updatehealth() - /mob/living/carbon/alien/humanoid/attack_paw(mob/living/carbon/monkey/M as mob) if(!ismonkey(M)) return//Fix for aliens receiving double messages when attacking other aliens. diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index ccacad6456e..69537b98bbf 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -135,17 +135,6 @@ updatehealth() return - -/mob/living/carbon/alien/larva/hand_p(mob/living/carbon/user) - if(user.a_intent == "harm") - if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) - return - if(health > 0) - visible_message("[user] has bit [src]!") - adjustBruteLoss(rand(1, 3)) - updatehealth() - - /mob/living/carbon/alien/larva/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") diff --git a/code/modules/mob/living/carbon/brain/hud.dm b/code/modules/mob/living/carbon/brain/hud.dm deleted file mode 100644 index 90eb96a387a..00000000000 --- a/code/modules/mob/living/carbon/brain/hud.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen_midnight.dmi') - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f2be95e217c..f0faf8f357f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -128,10 +128,10 @@ if(istext(selhand)) selhand = lowertext(selhand) - if(selhand == "right" || selhand == "r") - selhand = 0 - if(selhand == "left" || selhand == "l") - selhand = 1 + if(selhand == "right" || selhand == "r") + selhand = 0 + if(selhand == "left" || selhand == "l") + selhand = 1 if(selhand != src.hand) swap_hand() @@ -209,88 +209,97 @@ // ++++ROCKDTBEN++++ MOB PROCS //END -/mob/living/carbon/proc/handle_ventcrawl() // -- TLE -- Merged by Carn - - if(!stat) - if(!lying) - - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) - if(!v.welded) - vent_found = v - else - src << "\red That vent is welded." - - if(vent_found) - if(vent_found.network&&vent_found.network.normal_members.len) - var/list/vents[0] - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) - if(temp_vent.loc == loc) - continue - if(temp_vent.welded) - continue - var/turf/T = get_turf(temp_vent) - - if(!T || T.z != loc.z) - continue - - var/i = 1 - var/index = "[T.loc.name]\[[i]\]" - while(index in vents) - i++ - index = "[T.loc.name]\[[i]\]" - vents[index] = temp_vent - if(!vents.len) - src << "\red There are no available vents to travel to, they could be welded." - return - - var/turf/startloc = loc - var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortList(vents) - if(!selection) return - if(loc==startloc) - for(var/obj/item/carried_item in contents)//If the monkey got on objects. - if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger - src << "\red You can't be carrying items or have items equipped when vent crawling!" - return - var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection] - if(target_vent) - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) - loc = target_vent - - var/travel_time = round(get_dist(loc, target_vent.loc) / 2) - - spawn(travel_time) - - if(!target_vent) return - for(var/mob/O in hearers(target_vent,null)) - O.show_message("You hear something squeezing through the ventilation ducts.",2) - - sleep(travel_time) - - if(!target_vent) return - if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled. - target_vent = vent_found //travel back. No additional time required. - src << "\red The vent you were heading to appears to be welded." - loc = target_vent.loc - var/area/new_area = get_area(loc) - if(new_area) - new_area.Entered(src) - - else - src << "You need to remain still while entering a vent." - else - src << "This vent is not connected to anything." - - else - src << "You must be standing on or beside an air vent to enter it." - - else - src << "You can't vent crawl while you're stunned!" - - else +/mob/living/carbon/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null) // -- TLE -- Merged by Carn + if(stat) src << "You must be conscious to do this!" - return + return + if(lying) + src << "You can't vent crawl while you're stunned!" + return + + if(vent_found) // one was passed in, probably from vent/AltClick() + if(vent_found.welded) + src << "That vent is welded shut." + return + if(!vent_found.Adjacent(src)) + return // don't even acknowledge that + else + for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) + if(!v.welded) + if(v.Adjacent(src)) + vent_found = v + if(!vent_found) + src << "You'll need a non-welded vent to crawl into!" + return + + if(!vent_found.network || !vent_found.network.normal_members.len) + src << "This vent is not connected to anything." + return + + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) + if(temp_vent.welded) + continue + if(temp_vent in loc) + continue + var/turf/T = get_turf(temp_vent) + + if(!T || T.z != loc.z) + continue + + var/i = 1 + var/index = "[T.loc.name]\[[i]\]" + while(index in vents) + i++ + index = "[T.loc.name]\[[i]\]" + vents[index] = temp_vent + if(!vents.len) + src << "\red There are no available vents to travel to, they could be welded." + return + + var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents) + if(!selection) return + + if(!vent_found.Adjacent(src)) + src << "Never mind, you left." + return + + for(var/obj/item/carried_item in contents)//If the monkey got on objects. + if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger + src << "\red You can't be carrying items or have items equipped when vent crawling!" + return + if(isslime(src)) + var/mob/living/carbon/slime/S = src + if(S.Victim) + src << "\red You'll have to let [S.Victim] go or finish eating \him first." + return + + var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection] + if(!target_vent) + return + + for(var/mob/O in viewers(src, null)) + O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) + loc = target_vent + + var/travel_time = round(get_dist(loc, target_vent.loc) / 2) + + spawn(travel_time) + + if(!target_vent) return + for(var/mob/O in hearers(target_vent,null)) + O.show_message("You hear something squeezing through the ventilation ducts.",2) + + sleep(travel_time) + + if(!target_vent) return + if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled. + target_vent = vent_found //travel back. No additional time required. + src << "\red The vent you were heading to appears to be welded." + loc = target_vent.loc + var/area/new_area = get_area(loc) + if(new_area) + new_area.Entered(src) /mob/living/carbon/clean_blood() @@ -310,19 +319,6 @@ //Throwing stuff /mob/living/carbon/proc/toggle_throw_mode() - var/obj/item/I = get_active_hand() - if(!I)//Not holding anything - if(client && (TK in mutations)) - var/obj/item/tk_grab/O = new(src) - put_in_active_hand(O) - O.host = src - return - - if(istype(I, /obj/item/tk_grab)) - if(hand) del(l_hand) - else del(r_hand) - return - if(in_throw_mode) throw_mode_off() else @@ -338,8 +334,9 @@ in_throw_mode = 1 throw_icon.icon_state = "act_throw_on" - -/mob/living/carbon/proc/throw_item(atom/target) +/mob/proc/throw_item(atom/target) + return +/mob/living/carbon/throw_item(atom/target) throw_mode_off() if(usr.stat || !target) return diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ebbe0d17232..5adb01ed182 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -228,23 +228,6 @@ return -/mob/living/carbon/human/hand_p(mob/M as mob) - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/datum/limb/affecting = get_organ(ran_zone(dam_zone)) - var/armor = run_armor_check(affecting, "melee") - apply_damage(rand(1,2), BRUTE, affecting, armor) - if(armor >= 2) return - - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/jungle_fever)) - var/mob/living/carbon/human/H = src - src = null - src = H.monkeyize() - contract_disease(D,1,0) - return - - - /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 00052ab09ac..e5f6be49d08 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,3 +1,22 @@ +/mob/living/carbon/human/verb/quick_equip() + set name = "quick-equip" + set hidden = 1 + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/obj/item/I = H.get_active_hand() + if(!I) + H << "You are not holding anything to equip." + return + if(H.equip_to_appropriate_slot(I)) + if(hand) + update_inv_l_hand(0) + else + update_inv_r_hand(0) + else + H << "\red You are unable to equip that." + + /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/I, list/slots, del_on_fail = 1) for(var/slot in slots) if(equip_to_slot_if_possible(I, slots[slot], del_on_fail = 0)) @@ -171,6 +190,7 @@ l_hand = null else if(I == r_hand) r_hand = null + if(client) client.screen -= I // will get put back if visible switch(slot) if(slot_back) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index a8a83d7395e..642ec17de74 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -103,7 +103,7 @@ sleep(15) Atkcool = 0 - if(get_obstacle_ok(Target)) + if(Target.Adjacent(src)) Target.attack_slime(src) //world << "retrun 1" return @@ -116,7 +116,7 @@ sleep(25) Atkcool = 0 - if(get_obstacle_ok(Target)) + if(Target.Adjacent(src)) Target.attack_slime(src) @@ -124,16 +124,16 @@ step_to(src, Target) else - if(!Atkcool && get_obstacle_ok(Target)) + if(!Atkcool && Target.Adjacent(src)) Feedon(Target) else - if(!Atkcool && get_obstacle_ok(Target)) + if(!Atkcool && Target.Adjacent(src)) Feedon(Target) else if(Target in view(7, src)) - if(get_obstacle_ok(Target)) + if(Target.Adjacent(src)) step_to(src, Target) else diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index f9200e27c40..2cd69c6b476 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -592,87 +592,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /mob/living/carbon/slime/toggle_throw_mode() return -/mob/living/carbon/slime/proc/get_obstacle_ok(atom/A) - var/direct = get_dir(src, A) - var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( src.loc ) - var/ok = 0 - if ( (direct - 1) & direct) - var/turf/Step_1 - var/turf/Step_2 - switch(direct) - if(5.0) - Step_1 = get_step(src, NORTH) - Step_2 = get_step(src, EAST) - - if(6.0) - Step_1 = get_step(src, SOUTH) - Step_2 = get_step(src, EAST) - - if(9.0) - Step_1 = get_step(src, NORTH) - Step_2 = get_step(src, WEST) - - if(10.0) - Step_1 = get_step(src, SOUTH) - Step_2 = get_step(src, WEST) - - else - if(Step_1 && Step_2) - var/check_1 = 0 - var/check_2 = 0 - if(step_to(D, Step_1)) - check_1 = 1 - for(var/obj/border_obstacle in Step_1) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, A)) - check_1 = 0 - for(var/obj/border_obstacle in get_turf(A)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - check_1 = 0 - - D.loc = src.loc - if(step_to(D, Step_2)) - check_2 = 1 - - for(var/obj/border_obstacle in Step_2) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, A)) - check_2 = 0 - for(var/obj/border_obstacle in get_turf(A)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - check_2 = 0 - if(check_1 || check_2) - ok = 1 - else - if(loc == src.loc) - ok = 1 - else - ok = 1 - - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in src.loc) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, A)) - ok = 0 - - //Next, check objects to block entry that are on the border - for(var/obj/border_obstacle in get_turf(A)) - if((border_obstacle.flags & ON_BORDER) && (A != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - ok = 0 - - //del(D) - //Garbage Collect Dummy - D.loc = null - D = null - if (!( ok )) - - return 0 - - return 1 - /obj/item/slime_extract name = "slime extract" diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index cf6b0caeedf..d85711f414d 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -80,24 +80,6 @@ //mob/living/carbon/monkey/bullet_act(var/obj/item/projectile/Proj)taken care of in living -/mob/living/carbon/monkey/hand_p(mob/M as mob) - if ((M.a_intent == "harm" && !( istype(wear_mask, /obj/item/clothing/mask/muzzle) ))) - if ((prob(75) && health > 0)) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [M.name] has bit []!", src), 1) - var/damage = rand(1, 5) - if (HULK in mutations) damage += 10 - adjustBruteLoss(damage) - updatehealth() - - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/jungle_fever)) - contract_disease(D,1,0) - else - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [M.name] has attempted to bite []!", src), 1) - return - /mob/living/carbon/monkey/attack_paw(mob/M as mob) ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 98a0eb129ce..59830a39815 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -380,4 +380,163 @@ if(update_slimes) for(var/mob/living/carbon/slime/M in view(1,src)) - M.UpdateFeed(src) \ No newline at end of file + M.UpdateFeed(src) + +/mob/living/verb/resist() + set name = "Resist" + set category = "IC" + + if(!isliving(usr) || usr.next_move > world.time) + return + usr.next_move = world.time + 20 + + var/mob/living/L = usr + + //resisting grabs (as if it helps anyone...) + if(!L.stat && L.canmove && !L.restrained()) + var/resisting = 0 + for(var/obj/O in L.requests) + del(O) + resisting++ + for(var/obj/item/weapon/grab/G in usr.grabbed_by) + resisting++ + if(G.state == GRAB_PASSIVE) + del(G) + else + if(G.state == GRAB_AGGRESSIVE) + if(prob(25)) + L.visible_message("[L] has broken free of [G.assailant]'s grip!") + del(G) + else + if(G.state == GRAB_NECK) + if(prob(5)) + L.visible_message("[L] has broken free of [G.assailant]'s headlock!") + del(G) + if(resisting) + L.visible_message("[L] resists!") + + + //unbuckling yourself + if(L.buckled && L.last_special <= world.time) + if(iscarbon(L)) + var/mob/living/carbon/C = L + if(C.handcuffed) + C.next_move = world.time + 100 + C.last_special = world.time + 100 + C.visible_message("[usr] attempts to unbuckle themself!", \ + "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still.)") + spawn(0) + if(do_after(usr, 1200)) + if(!C.buckled) + return + C.visible_message("[usr] manages to unbuckle themself!", \ + "You successfully unbuckle yourself.") + C.buckled.manual_unbuckle(C) + else + L.buckled.manual_unbuckle(L) + else + L.buckled.manual_unbuckle(L) + + //Breaking out of a locker? + else if(loc && istype(loc, /obj/structure/closet)) + var/obj/structure/closet/C = L.loc + var/breakout_time = 2 //2 minutes by default + if(istype(L.loc, /obj/structure/closet/critter) && !C.welded) + breakout_time = 0.75 //45 seconds if it's an unwelded critter crate + + if(C.opened || (!C.welded && !C.locked)) + return //Door's open, not locked or welded, no point in resisting. + + //okay, so the closet is either welded or locked... resist!!! + usr.next_move = world.time + 100 + L.last_special = world.time + 100 + L << "You lean on the back of [C] and start pushing the door open. (this will take about [breakout_time] minutes.)" + for(var/mob/O in viewers(C)) + O << "[C] begins to shake violently!" + + if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds + if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened || (!C.locked && !C.welded)) + return + //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting + + C.welded = 0 //applies to all lockers lockers + C.locked = 0 //applies to critter crates and secure lockers only + C.broken = 1 //applies to secure lockers only + L.visible_message("[L] successfully broke out of [C]!", \ + "You successfully break out of [C]!") + if(istype(C.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) + var/obj/structure/bigDelivery/BD = C.loc + BD.attack_hand(usr) + C.open() + + //breaking out of handcuffs + else if(iscarbon(L)) + var/mob/living/carbon/CM = L + if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) + CM.next_move = world.time + 100 + CM.last_special = world.time + 100 + if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here. + CM.visible_message("[CM] is trying to break [CM.handcuffed]!", \ + "You attempt to break [CM.handcuffed]. (This will take around 5 seconds and you need to stand still.)") + spawn(0) + if(do_after(CM, 50)) + if(!CM.handcuffed || CM.buckled) + return + CM.visible_message("[CM] manages to break [CM.handcuffed]!" , \ + "You successfully break [CM.handcuffed]!") + CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + del(CM.handcuffed) + CM.handcuffed = null + CM.update_inv_handcuffed(0) + else + var/obj/item/weapon/handcuffs/HC = CM.handcuffed + var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + CM.visible_message("[usr] attempts to remove [HC]!", \ + "You attempt to remove [HC]. (This will take around [displaytime] minutes and you need to stand still.)") + spawn(0) + if(do_after(CM, breakouttime)) + if(!CM.handcuffed || CM.buckled) + return // time leniency for lag which also might make this whole thing pointless but the server + CM.visible_message("[CM] manages to remove [CM.handcuffed]!", \ + "You successfully remove [CM.handcuffed].") + CM.handcuffed.loc = usr.loc + CM.handcuffed = null + CM.update_inv_handcuffed(0) + else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) + CM.next_move = world.time + 100 + CM.last_special = world.time + 100 + if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here. + CM.visible_message("[CM] is trying to break [CM.legcuffed]!", \ + "You attempt to break [CM.legcuffed]. (This will take around 5 seconds and you need to stand still.)") + spawn(0) + if(do_after(CM, 50)) + if(!CM.legcuffed || CM.buckled) + return + CM.visible_message("[CM] manages to break [CM.legcuffed]!", \ + "You successfully break [CM.legcuffed].") + CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + del(CM.legcuffed) + CM.legcuffed = null + CM.update_inv_legcuffed(0) + else + var/obj/item/weapon/legcuffs/HC = CM.legcuffed + var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + CM.visible_message("[CM] attempts to remove [HC]!", \ + "You attempt to remove [HC]. (This will take around [displaytime] minutes and you need to stand still.)") + spawn(0) + if(do_after(CM, breakouttime)) + if(!CM.legcuffed || CM.buckled) + return //time leniency for lag which also might make this whole thing pointless but the server + CM.visible_message("[CM] manages to remove [CM.legcuffed]!", \ + "You successfully remove [CM.legcuffed].") + CM.legcuffed.loc = usr.loc + CM.legcuffed = null + CM.update_inv_legcuffed(0) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 1d002c1b77d..3b53d5d549a 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -376,7 +376,8 @@ var/list/department_radio_keys = list( for(var/mob/M in heard_a + heard_b) if(M.client) speech_bubble_recipients.Add(M.client) - flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30) + spawn(0) + flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30) log_say("[name]/[key] : [message]") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 4a1efcfe614..9be5fa05662 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -29,6 +29,7 @@ var/list/ai_list = list() var/icon/holo_icon//Default is assigned when AI is created. var/obj/item/device/pda/ai/aiPDA = null var/obj/item/device/multitool/aiMulti = null + var/obj/item/device/camera/ai_camera/aicamera = null //MALFUNCTION var/datum/module_picker/malf_picker @@ -84,6 +85,7 @@ var/list/ai_list = list() aiPDA.name = name + " (" + aiPDA.ownjob + ")" aiMulti = new(src) + aicamera = new/obj/item/device/camera/ai_camera(src) if (istype(loc, /turf)) verbs.Add(/mob/living/silicon/ai/proc/ai_call_shuttle,/mob/living/silicon/ai/proc/ai_camera_track, \ @@ -406,16 +408,6 @@ var/list/ai_list = list() O.show_message(text("\red [] took a swipe at []!", M, src), 1) return -/mob/living/silicon/ai/attack_hand(mob/living/carbon/M as mob) - if(ishuman(M))//Checks to see if they are ninja - if(istype(M:gloves, /obj/item/clothing/gloves/space_ninja)&&M:gloves:candrain&&!M:gloves:draining) - if(M:wear_suit:s_control) - M:wear_suit:transfer_ai("AICORE", "NINJASUIT", src, M) - else - M << "\red ERROR: \black Remote access channel disabled." - return - - /mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") @@ -689,3 +681,4 @@ var/list/ai_list = list() set name = "State Laws" checklaws() + diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index a838e80042d..f9da2399c9a 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -130,6 +130,10 @@ var/datum/cameranet/cameranet = new() // 0xf = 15 var/turf/position = get_turf(target) + return checkTurfVis(position) + + +/datum/cameranet/proc/checkTurfVis(var/turf/position) var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) if(chunk.changed) @@ -147,4 +151,4 @@ var/datum/cameranet/cameranet = new() if(cameranet.chunkGenerated(x, y, z)) var/datum/camerachunk/chunk = cameranet.getCameraChunk(x, y, z) usr.client.debug_variables(chunk) -*/ \ No newline at end of file +*/ diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index d692d5cba21..7f911fa56ad 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -63,18 +63,6 @@ AI.cameraFollow = null AI.eyeobj.setLoc(src) -/mob/living/Click() - if(isAI(usr)) - return - ..() - -/mob/living/DblClick() - if(isAI(usr) && usr != src) - var/mob/living/silicon/ai/A = usr - A.ai_actual_track(src) - return - ..() - // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. diff --git a/code/modules/mob/living/silicon/ai/hud.dm b/code/modules/mob/living/silicon/ai/hud.dm deleted file mode 100644 index 79ca8f172ba..00000000000 --- a/code/modules/mob/living/silicon/ai/hud.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/hud/proc/ai_hud() - return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e7fee9d1821..07aa7c7d67c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -734,12 +734,6 @@ user.visible_message("[user] pets [src]!", \ "You pet [src]!") - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("CYBORG",src,user:wear_suit) - return - - /mob/living/silicon/robot/attack_paw(mob/user) return attack_hand(user) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index e71a3bdf790..81a9c45bfd6 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -75,7 +75,8 @@ speech_bubble_recipients.Add(M.client) //speech bubble - flick_overlay(image('icons/mob/talk.dmi', src, "hR[say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30) + spawn(0) + flick_overlay(image('icons/mob/talk.dmi', src, "hR[say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30) /*Radios "filter out" this conversation channel so we don't need to account for them. This is another way of saying that we won't bother dealing with them.*/ diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 4d55730fe61..fb061b46175 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -66,7 +66,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -99,7 +99,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5df695605d8..c48ba8dca22 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -82,11 +82,6 @@ var/next_mob_id = 0 M.show_message( message, 1, blind_message, 2) -//This is awful, still. -/mob/attackby(obj/item/I, mob/user) - if(I && istype(I)) //The istype is necessary for things like bodybags which are structures that do not have an attack() proc. - I.attack(src, user) - /mob/proc/movement_delay() return 0 @@ -246,7 +241,7 @@ var/list/slot_equipment_priority = list( \ /mob/verb/mode() set name = "Activate Held Object" - set category = "IC" + set category = "Object" set src = usr if(hand) @@ -259,6 +254,8 @@ var/list/slot_equipment_priority = list( \ if (W) W.attack_self(src) update_inv_r_hand(0) + if(next_move < world.time) + next_move = world.time + 2 return /* @@ -477,7 +474,7 @@ var/list/slot_equipment_priority = list( \ if(machine && in_range(src, usr)) show_inv(machine) - if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) + if(!usr.stat && usr.canmove && !usr.restrained() && Adjacent(usr)) if(href_list["item"]) var/slot = text2num(href_list["item"]) var/obj/item/what = get_item_by_slot(slot) @@ -487,28 +484,30 @@ var/list/slot_equipment_priority = list( \ "[usr] tries to remove [src]'s [what.name].") what.add_fingerprint(usr) if(do_mob(usr, src, STRIP_DELAY)) - if(what) + if(what && Adjacent(usr)) u_equip(what) else what = usr.get_active_hand() if(what && what.mob_can_equip(src, slot, 1)) visible_message("[usr] tries to put [what] on [src].") if(do_mob(usr, src, STRIP_DELAY * 0.5)) - if(what) + if(what && Adjacent(usr)) usr.u_equip(what) equip_to_slot_if_possible(what, slot, 0, 1) - if(usr.machine == src && in_range(src, usr)) - show_inv(usr) + if(usr.machine == src) + if(Adjacent(usr)) + show_inv(usr) + else + usr << browse(null,"window=mob\ref[src]") /mob/MouseDrop(mob/M) ..() if(M != usr) return if(usr == src) return - if(!in_range(usr, src)) return + if(!Adjacent(usr)) return if(istype(M, /mob/living/silicon/ai)) return - if(LinkBlocked(usr.loc, loc)) return show_inv(usr) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 10bec1b2123..5f0bcf31668 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -23,7 +23,6 @@ var/obj/screen/nutrition_icon = null var/obj/screen/pressure = null var/obj/screen/damageoverlay = null - /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. The current method unnecessarily clusters up the variable list, especially for humans (although rearranging won't really clean it up a lot but the difference will be noticable for other mobs). @@ -45,7 +44,6 @@ var/disabilities = 0 //Carbon var/atom/movable/pulling = null var/next_move = null - var/prev_move = null var/monkeyizing = null //Carbon var/hand = null var/eye_blind = null //Carbon @@ -95,7 +93,6 @@ var/a_intent = "help"//Living var/m_int = null//Living var/m_intent = "run"//Living - var/lastDblClick = 0 var/lastKnownIP = null var/obj/structure/stool/bed/buckled = null//Living var/obj/item/l_hand = null//Living diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 1d51a302f34..d95fa724b0f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -3,6 +3,7 @@ /obj/item/weapon/grab name = "grab" + flags = NOBLUDGEON var/obj/screen/grab/hud = null var/mob/affecting = null var/mob/assailant = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ed698b4e20d..19d492c55aa 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -291,58 +291,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return 1 return 0 - -//Triggered when F12 is pressed (Unless someone changed something in the DMF) -/mob/verb/button_pressed_F12() - set name = "F12" - set hidden = 1 - - if(hud_used) - if(ishuman(src)) - if(!src.client) return - - if(hud_used.hud_shown) - hud_used.hud_shown = 0 - if(src.hud_used.adding) - src.client.screen -= src.hud_used.adding - if(src.hud_used.other) - src.client.screen -= src.hud_used.other - if(src.hud_used.hotkeybuttons) - src.client.screen -= src.hud_used.hotkeybuttons - if(src.hud_used.item_action_list) - src.client.screen -= src.hud_used.item_action_list - - //Due to some poor coding some things need special treatment: - //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay - src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible - src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible - src.client.screen += src.hud_used.action_intent //we want the intent swticher visible - src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. - - //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. - src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. - - else - hud_used.hud_shown = 1 - if(src.hud_used.adding) - src.client.screen += src.hud_used.adding - if(src.hud_used.other && src.hud_used.inventory_shown) - src.client.screen += src.hud_used.other - if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden) - src.client.screen += src.hud_used.hotkeybuttons - - - src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position - src.client.screen += src.zone_sel //This one is a special snowflake - - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() - update_action_buttons() - else - usr << "\red Inventory hiding is currently only supported for human mobs, sorry." - else - usr << "\red This mob type does not use a HUD." - //converts intent-strings into numbers and back /proc/intent_numeric(argument) if(istext(argument)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 7ed169f0088..6997ab151cd 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -158,7 +158,7 @@ /atom/movable/Move(NewLoc, direct) - if (direct & direct - 1) + if (direct & (direct - 1)) if (direct & 1) if (direct & 4) if (step(src, NORTH)) @@ -251,9 +251,12 @@ if(mob.restrained()) //Why being pulled while cuffed prevents you from moving for(var/mob/M in range(mob, 1)) - if(M.pulling == mob && !M.restrained() && M.stat == 0 && M.canmove) - src << "\blue You're restrained! You can't move!" - return 0 + if(M.pulling == mob) + if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) + src << "\blue You're restrained! You can't move!" + return 0 + else + M.stop_pulling() move_delay = world.time//set move delay @@ -492,7 +495,7 @@ return if (pulling.anchored) return - if ((pulling.loc != loc && get_dist(src, pulling) > 1) || !isturf(pulling.loc)) + if (pulling.Adjacent(src)) return if (ismob(pulling)) var/mob/M = pulling diff --git a/code/modules/mob/new_player/hud.dm b/code/modules/mob/new_player/hud.dm deleted file mode 100644 index 67af01d6453..00000000000 --- a/code/modules/mob/new_player/hud.dm +++ /dev/null @@ -1,3 +0,0 @@ - -/datum/hud/proc/unplayer_hud() - return \ No newline at end of file diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm deleted file mode 100644 index 3f6218a2089..00000000000 --- a/code/modules/mob/screen.dm +++ /dev/null @@ -1,505 +0,0 @@ -/obj/screen - name = "" - icon = 'icons/mob/screen_gen.dmi' - layer = 20.0 - unacidable = 1 - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - - -/obj/screen/text - icon = null - icon_state = null - mouse_opacity = 0 - screen_loc = "CENTER-7,CENTER-7" - maptext_height = 480 - maptext_width = 480 - - -/obj/screen/inventory - var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. - - -/obj/screen/close - name = "close" - -/obj/screen/close/Click() - if(master) - if(istype(master, /obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = master - S.close(usr) - - -/obj/screen/item_action - var/obj/item/owner - -/obj/screen/item_action/Click() - if(!usr || !owner) - return - - if(usr.stat || usr.restrained() || usr.stunned || usr.lying) - return - - if(!(owner in usr)) - return - - owner.ui_action_click() - -//This is the proc used to update all the action buttons. It just returns for all mob types except humans. -/mob/proc/update_action_buttons() - return - - -/obj/screen/grab - name = "grab" - -/obj/screen/grab/Click() - var/obj/item/weapon/grab/G = master - G.s_click(src) - -/obj/screen/grab/attack_hand() - return - -/obj/screen/grab/attackby() - return - - -/obj/screen/storage - name = "storage" - -/obj/screen/storage/attack_hand(mob/user) - if(master) - var/obj/item/I = user.get_active_hand() - if(I) - master.attackby(I, user) - - -/obj/screen/zone_sel - name = "damage zone" - icon_state = "zone_sel" - screen_loc = ui_zonesel - var/selecting = "chest" - -/obj/screen/zone_sel/Click(location, control,params) - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/old_selecting = selecting //We're only going to update_icon() if there's been a change - - switch(icon_y) - if(1 to 9) //Legs - switch(icon_x) - if(10 to 15) - selecting = "r_leg" - if(17 to 22) - selecting = "l_leg" - else - return - if(10 to 13) //Hands and groin - switch(icon_x) - if(8 to 11) - selecting = "r_arm" - if(12 to 20) - selecting = "groin" - if(21 to 24) - selecting = "l_arm" - else - return - if(14 to 22) //Chest and arms to shoulders - switch(icon_x) - if(8 to 11) - selecting = "r_arm" - if(12 to 20) - selecting = "chest" - if(21 to 24) - selecting = "l_arm" - else - return - if(23 to 30) //Head, but we need to check for eye or mouth - if(icon_x in 12 to 20) - selecting = "head" - switch(icon_y) - if(23 to 24) - if(icon_x in 15 to 17) - selecting = "mouth" - if(26) //Eyeline, eyes are on 15 and 17 - if(icon_x in 14 to 18) - selecting = "eyes" - if(25 to 27) - if(icon_x in 15 to 17) - selecting = "eyes" - - if(old_selecting != selecting) - update_icon() - -/obj/screen/zone_sel/update_icon() - overlays.Cut() - overlays += image('icons/mob/screen_gen.dmi', "[selecting]") - - -/obj/screen/Click(location, control, params) - if(!usr) return - - switch(name) - if("toggle") - if(usr.hud_used.inventory_shown) - usr.hud_used.inventory_shown = 0 - usr.client.screen -= usr.hud_used.other - else - usr.hud_used.inventory_shown = 1 - usr.client.screen += usr.hud_used.other - - usr.hud_used.hidden_inventory_update() - - if("equip") - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.quick_equip() - - if("resist") - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - - if("mov_intent") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(C.legcuffed) - C << "You are legcuffed! You cannot run until you get [C.legcuffed] removed!" - C.m_intent = "walk" //Just incase - C.hud_used.move_intent.icon_state = "walking" - return - switch(usr.m_intent) - if("run") - usr.m_intent = "walk" - usr.hud_used.move_intent.icon_state = "walking" - if("walk") - usr.m_intent = "run" - usr.hud_used.move_intent.icon_state = "running" - if(istype(usr,/mob/living/carbon/alien/humanoid)) - usr.update_icons() - if("m_intent") - if(!usr.m_int) - switch(usr.m_intent) - if("run") - usr.m_int = "13,14" - if("walk") - usr.m_int = "14,14" - if("face") - usr.m_int = "15,14" - else - usr.m_int = null - if("walk") - usr.m_intent = "walk" - usr.m_int = "14,14" - if("face") - usr.m_intent = "face" - usr.m_int = "15,14" - if("run") - usr.m_intent = "run" - usr.m_int = "13,14" - if("Reset Machine") - usr.unset_machine() - if("internal") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) - if(C.internal) - C.internal = null - C << "No longer running on internals." - if(C.internals) - C.internals.icon_state = "internal0" - else - if(!istype(C.wear_mask, /obj/item/clothing/mask)) - C << "You are not wearing a mask." - return - else - if(istype(C.l_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.l_hand] on your left hand." - C.internal = C.l_hand - else if(istype(C.r_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.r_hand] on your right hand." - C.internal = C.r_hand - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." - H.internal = H.s_store - else if(istype(H.belt, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.belt] on your belt." - H.internal = H.belt - else if(istype(H.l_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.l_store] in your left pocket." - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.r_store] in your right pocket." - H.internal = H.r_store - - //Seperate so CO2 jetpacks are a little less cumbersome. - if(!C.internal && istype(C.back, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.back] on your back." - C.internal = C.back - - if(C.internal) - if(C.internals) - C.internals.icon_state = "internal1" - else - C << "You don't have an oxygen tank." - if("act_intent") - usr.a_intent_change("right") - if("pull") - usr.stop_pulling() - if("throw/catch") - if(!usr.stat && isturf(usr.loc) && !usr.restrained()) - usr:toggle_throw_mode() - if("drop") - usr.drop_item_v() - if("swap") - usr:swap_hand() - if("hand") - usr:swap_hand() - if("r_hand") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.activate_hand("r") - if("l_hand") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.activate_hand("l") - if("module") - if(issilicon(usr)) - if(usr:module) - return - usr:pick_module() - - if("radio") - if(issilicon(usr)) - usr:radio_menu() - if("panel") - if(issilicon(usr)) - usr:installed_modules() - - if("store") - if(issilicon(usr)) - usr:uneq_active() - - if("module1") - if(usr:module_state_1) - if(usr:module_active != usr:module_state_1) - usr:inv1.icon_state = "inv1 +a" - usr:inv2.icon_state = "inv2" - usr:inv3.icon_state = "inv3" - usr:module_active = usr:module_state_1 - else - usr:inv1.icon_state = "inv1" - usr:module_active = null - - if("module2") - if(usr:module_state_2) - if(usr:module_active != usr:module_state_2) - usr:inv1.icon_state = "inv1" - usr:inv2.icon_state = "inv2 +a" - usr:inv3.icon_state = "inv3" - usr:module_active = usr:module_state_2 - else - usr:inv2.icon_state = "inv2" - usr:module_active = null - - if("module3") - if(usr:module_state_3) - if(usr:module_active != usr:module_state_3) - usr:inv1.icon_state = "inv1" - usr:inv2.icon_state = "inv2" - usr:inv3.icon_state = "inv3 +a" - usr:module_active = usr:module_state_3 - else - usr:inv3.icon_state = "inv3" - usr:module_active = null - - else - DblClick() - - -/obj/screen/inventory/attack_hand(mob/user) - if(user.attack_ui(slot_id)) - user.update_inv_l_hand(0) - user.update_inv_r_hand(0) - -/obj/screen/inventory/attack_paw(mob/user) - return attack_hand(user) - -/mob/living/carbon/human/verb/quick_equip() - set name = "quick-equip" - set hidden = 1 - - if(ishuman(src)) - var/mob/living/carbon/human/H = src - var/obj/item/I = H.get_active_hand() - if(!I) - H << "You are not holding anything to equip." - return - if(H.equip_to_appropriate_slot(I)) - if(hand) - update_inv_l_hand(0) - else - update_inv_r_hand(0) - else - H << "\red You are unable to equip that." - -/mob/living/verb/resist() - set name = "Resist" - set category = "IC" - - if(!isliving(usr) || usr.next_move > world.time) - return - usr.next_move = world.time + 20 - - var/mob/living/L = usr - - //resisting grabs (as if it helps anyone...) - if(!L.stat && L.canmove && !L.restrained()) - var/resisting = 0 - for(var/obj/O in L.requests) - del(O) - resisting++ - for(var/obj/item/weapon/grab/G in usr.grabbed_by) - resisting++ - if(G.state == GRAB_PASSIVE) - del(G) - else - if(G.state == GRAB_AGGRESSIVE) - if(prob(25)) - L.visible_message("[L] has broken free of [G.assailant]'s grip!") - del(G) - else - if(G.state == GRAB_NECK) - if(prob(5)) - L.visible_message("[L] has broken free of [G.assailant]'s headlock!") - del(G) - if(resisting) - L.visible_message("[L] resists!") - - - //unbuckling yourself - if(L.buckled && L.last_special <= world.time) - if(iscarbon(L)) - var/mob/living/carbon/C = L - if(C.handcuffed) - C.next_move = world.time + 100 - C.last_special = world.time + 100 - C.visible_message("[usr] attempts to unbuckle themself!", \ - "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still.)") - spawn(0) - if(do_after(usr, 1200)) - if(!C.buckled) - return - C.visible_message("[usr] manages to unbuckle themself!", \ - "You successfully unbuckle yourself.") - C.buckled.manual_unbuckle(C) - else - L.buckled.manual_unbuckle(L) - else - L.buckled.manual_unbuckle(L) - - //Breaking out of a locker? - else if(loc && istype(loc, /obj/structure/closet)) - var/obj/structure/closet/C = L.loc - var/breakout_time = 2 //2 minutes by default - if(istype(L.loc, /obj/structure/closet/critter) && !C.welded) - breakout_time = 0.75 //45 seconds if it's an unwelded critter crate - - if(C.opened || (!C.welded && !C.locked)) - return //Door's open, not locked or welded, no point in resisting. - - //okay, so the closet is either welded or locked... resist!!! - usr.next_move = world.time + 100 - L.last_special = world.time + 100 - L << "You lean on the back of [C] and start pushing the door open. (this will take about [breakout_time] minutes.)" - for(var/mob/O in viewers(C)) - O << "[C] begins to shake violently!" - - if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds - if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened || (!C.locked && !C.welded)) - return - //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting - - C.welded = 0 //applies to all lockers lockers - C.locked = 0 //applies to critter crates and secure lockers only - C.broken = 1 //applies to secure lockers only - L.visible_message("[L] successfully broke out of [C]!", \ - "You successfully break out of [C]!") - if(istype(C.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) - var/obj/structure/bigDelivery/BD = C.loc - BD.attack_hand(usr) - C.open() - - //breaking out of handcuffs - else if(iscarbon(L)) - var/mob/living/carbon/CM = L - if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here. - CM.visible_message("[CM] is trying to break [CM.handcuffed]!", \ - "You attempt to break [CM.handcuffed]. (This will take around 5 seconds and you need to stand still.)") - spawn(0) - if(do_after(CM, 50)) - if(!CM.handcuffed || CM.buckled) - return - CM.visible_message("[CM] manages to break [CM.handcuffed]!" , \ - "You successfully break [CM.handcuffed]!") - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.handcuffed) - CM.handcuffed = null - CM.update_inv_handcuffed(0) - else - var/obj/item/weapon/handcuffs/HC = CM.handcuffed - var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM.visible_message("[usr] attempts to remove [HC]!", \ - "You attempt to remove [HC]. (This will take around [displaytime] minutes and you need to stand still.)") - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.handcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - CM.visible_message("[CM] manages to remove [CM.handcuffed]!", \ - "You successfully remove [CM.handcuffed].") - CM.handcuffed.loc = usr.loc - CM.handcuffed = null - CM.update_inv_handcuffed(0) - else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here. - CM.visible_message("[CM] is trying to break [CM.legcuffed]!", \ - "You attempt to break [CM.legcuffed]. (This will take around 5 seconds and you need to stand still.)") - spawn(0) - if(do_after(CM, 50)) - if(!CM.legcuffed || CM.buckled) - return - CM.visible_message("[CM] manages to break [CM.legcuffed]!", \ - "You successfully break [CM.legcuffed].") - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed(0) - else - var/obj/item/weapon/legcuffs/HC = CM.legcuffed - var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM.visible_message("[CM] attempts to remove [HC]!", \ - "You attempt to remove [HC]. (This will take around [displaytime] minutes and you need to stand still.)") - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.legcuffed || CM.buckled) - return //time leniency for lag which also might make this whole thing pointless but the server - CM.visible_message("[CM] manages to remove [CM.legcuffed]!", \ - "You successfully remove [CM.legcuffed].") - CM.legcuffed.loc = usr.loc - CM.legcuffed = null - CM.update_inv_legcuffed(0) \ No newline at end of file diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 4d662aea876..90f55715009 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -67,6 +67,22 @@ dat += "" user << browse("[name][dat]", "window=filingcabinet;size=350x300") +/obj/structure/filingcabinet/attack_tk(mob/user) + if(anchored) + attack_self_tk(user) + else + ..() + +/obj/structure/filingcabinet/attack_self_tk(mob/user) + if(contents.len) + if(prob(40 + contents.len * 5)) + var/obj/item/I = pick(contents) + I.loc = loc + if(prob(25)) + step_rand(I) + user << "You pull \a [I] out of [src] at random." + return + user << "You find nothing in [src]." /obj/structure/filingcabinet/Topic(href, href_list) if(href_list["retrieve"]) @@ -88,7 +104,7 @@ /obj/structure/filingcabinet/security var/virgin = 1 -/obj/structure/filingcabinet/security/attack_hand(mob/user) +/obj/structure/filingcabinet/security/proc/populate() if(virgin) for(var/datum/data/record/G in data_core.general) var/datum/data/record/S = find_record("name", G.fields["name"], data_core.security) @@ -105,8 +121,12 @@ P.name = "paper - '[G.fields["name"]]'" virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. +/obj/structure/filingcabinet/security/attack_hand() + populate() + ..() +/obj/structure/filingcabinet/security/attack_tk() + populate() ..() - /* * Medical Record Cabinets @@ -114,7 +134,7 @@ /obj/structure/filingcabinet/medical var/virgin = 1 -/obj/structure/filingcabinet/medical/attack_hand(mob/user) +/obj/structure/filingcabinet/medical/proc/populate() if(virgin) for(var/datum/data/record/G in data_core.general) var/datum/data/record/M = find_record("name", G.fields["name"], data_core.medical) @@ -131,4 +151,9 @@ P.name = "paper - '[G.fields["name"]]'" virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. - ..() \ No newline at end of file +/obj/structure/filingcabinet/medical/attack_hand() + populate() + ..() +/obj/structure/filingcabinet/medical/attack_tk() + populate() + ..() diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 5381dfc30d6..99abdf8f1c7 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -8,7 +8,8 @@ var/mode = 0 -/obj/item/weapon/hand_labeler/afterattack(atom/A, mob/user) +/obj/item/weapon/hand_labeler/afterattack(atom/A, mob/user,proximity) + if(!proximity) return if(!mode) //if it's off, give up. return if(A == loc) // if placing the labeller into something (e.g. backpack) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index d9aa009b1e3..3d90cd11dd0 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -20,8 +20,9 @@ var/obj/item/weapon/paper/copy = null //what's in the copier! var/obj/item/weapon/photo/photocopy = null var/copies = 1 //how many copies to print! - var/toner = 30 //how much toner is left! woooooo~ + var/toner = 40 //how much toner is left! woooooo~ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! + var/greytoggle = "Greyscale" /obj/machinery/photocopier/attack_ai(mob/user) @@ -43,8 +44,12 @@ dat += "Printing: [copies] copies." dat += "- " dat += "+

" + if(photocopy) + dat += "Printing in [greytoggle]

" else if(toner) dat += "Please insert paper to copy.

" + if(istype(user,/mob/living/silicon/ai)) + dat += "Print photo from database

" dat += "Current toner level: [toner]" if(!toner) dat +="
Please insert a new toner cartridge!" @@ -78,36 +83,52 @@ updateUsrDialog() else if(photocopy) for(var/i = 0, i < copies, i++) - if(toner > 0) + if(toner >= 5) //Was set to = 0, but if there was say 3 toner left and this ran, you would get -2 which would be weird for ink var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc) var/icon/I = icon(photocopy.icon, photocopy.icon_state) var/icon/img = icon(photocopy.img) - if(toner > 10) //plenty of toner, go straight greyscale - I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) //I'm not sure how expensive this is, but given the many limitations of photocopying, it shouldn't be an issue. - img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - else //not much toner left, lighten the photo - I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) - img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) + if(greytoggle == "Greyscale") + if(toner > 10) //plenty of toner, go straight greyscale + I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) //I'm not sure how expensive this is, but given the many limitations of photocopying, it shouldn't be an issue. + img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + else //not much toner left, lighten the photo + I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) + img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) + toner -= 5 //photos use a lot of ink! + else if(greytoggle == "Color") + if(toner >= 10) + toner -= 10 //Color photos use even more ink! + else + continue p.icon = I p.img = img p.name = photocopy.name p.desc = photocopy.desc p.scribble = photocopy.scribble - toner -= 5 //photos use a lot of ink! + p.pixel_x = rand(-10, 10) + p.pixel_y = rand(-10, 10) + p.blueprints = photocopy.blueprints //a copy of a picture is still good enough for the syndicate + sleep(15) else break updateUsrDialog() else if(href_list["remove"]) if(copy) - copy.loc = usr.loc - usr.put_in_hands(copy) + if(!istype(usr,/mob/living/silicon/ai)) //surprised this check didn't exist before, putting stuff in AI's hand is bad + copy.loc = usr.loc + usr.put_in_hands(copy) + else + copy.loc = src.loc usr << "You take [copy] out of [src]." copy = null updateUsrDialog() else if(photocopy) - photocopy.loc = usr.loc - usr.put_in_hands(photocopy) + if(!istype(usr,/mob/living/silicon/ai)) //same with this one, wtf + photocopy.loc = usr.loc + usr.put_in_hands(photocopy) + else + photocopy.loc = src.loc usr << "You take [photocopy] out of [src]." photocopy = null updateUsrDialog() @@ -119,6 +140,38 @@ if(copies < maxcopies) copies++ updateUsrDialog() + else if(href_list["aipic"]) + if(!istype(usr,/mob/living/silicon/ai)) return + if(toner >= 5) + var/list/nametemp = list() + var/find + var/datum/picture/selection + var/mob/living/silicon/ai/tempAI = usr + for(var/datum/picture/t in tempAI.aicamera.aipictures) + nametemp += t.fields["name"] + find = input("Select picture (numbered in order taken)") in nametemp + var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc) + for(var/datum/picture/q in tempAI.aicamera.aipictures) + if(q.fields["name"] == find) + selection = q + break + var/icon/I = selection.fields["icon"] + var/icon/img = selection.fields["img"] + p.icon = I + p.img = img + p.desc = selection.fields["desc"] + p.blueprints = selection.fields["blueprints"] + p.pixel_x = rand(-10, 10) + p.pixel_y = rand(-10, 10) + toner -= 5 //AI prints color pictures only, thus they can do it more efficiently + sleep(15) + updateUsrDialog() + else if(href_list["colortoggle"]) + if(greytoggle == "Greyscale") + greytoggle = "Color" + else + greytoggle ="Greyscale" + updateUsrDialog() /obj/machinery/photocopier/attackby(obj/item/O, mob/user) if(istype(O, /obj/item/weapon/paper)) @@ -145,7 +198,7 @@ if(toner == 0) user.drop_item() del(O) - toner = 30 + toner = 40 user << "You insert [O] into [src]." updateUsrDialog() else diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index c989ebddf2f..e0250840d55 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -99,13 +99,34 @@ icon_state = "camera" item_state = "electropack" w_class = 2.0 - flags = FPRINT | CONDUCT | USEDELAY | TABLEPASS + flags = FPRINT | CONDUCT | TABLEPASS slot_flags = SLOT_BELT m_amt = 2000 var/pictures_max = 10 var/pictures_left = 10 var/on = 1 var/blueprints = 0 //are blueprints visible in the current photo being created? + var/aipictures[] = list() //Allows for storage of pictures taken by AI, in a similar manner the datacore stores info + + +/obj/item/device/camera/ai_camera //camera AI can take pictures with + name = "AI photo camera" + + verb/picture() + set category ="AI Commands" + set name = "Take Picture" + set src in usr + var/mob/living/silicon/ai/my_ai = usr + var/target = get_turf(my_ai.eyeobj) + + captureimage(target, usr) + + verb/viewpicture() + set category ="AI Commands" + set name = "View Pictures" + set src in usr + + viewpictures() /obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user) @@ -125,7 +146,7 @@ ..() -/obj/item/device/camera/proc/get_icon(turf/the_turf) +/obj/item/device/camera/proc/camera_get_icon(turf/the_turf, blueprints) //Bigger icon base to capture those icons that were shifted to the next tile //i.e. pretty much all wall-mounted machinery var/icon/res = icon('icons/effects/96x96.dmi', "") @@ -165,7 +186,7 @@ return res -/obj/item/device/camera/proc/get_mobs(turf/the_turf) +/obj/item/device/camera/proc/camera_get_mobs(turf/the_turf) var/mob_detail for(var/mob/living/carbon/A in the_turf) if(A.invisibility) continue @@ -185,9 +206,7 @@ return mob_detail -/obj/item/device/camera/afterattack(atom/target, mob/user, flag) - if(!on || !pictures_left || ismob(target.loc)) return - +/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag) //Proc for both regular and AI-based camera to take the image var/x_c = target.x - 1 var/y_c = target.y + 1 var/z_c = target.z @@ -203,12 +222,23 @@ for(var/j = 1; j <= 3; j++) var/turf/T = locate(x_c, y_c, z_c) if(T in seen) - temp.Blend(get_icon(T), ICON_OVERLAY, 32 * (j-1-1), 32 - 32 * (i-1)) - mobs += get_mobs(T) + if(istype(user,/mob/living/silicon/ai)) + if(0 == cameranet.checkTurfVis(T)) //Checks to see if this turf is visible to the AI's cameras + x_c++ //because continue would skip the x_c++ further down, and it is rather important to this proc to work right + continue + temp.Blend(camera_get_icon(T), ICON_OVERLAY, 32 * (j-1-1), 32 - 32 * (i-1)) + mobs += camera_get_mobs(T) x_c++ y_c-- x_c -= 3 + if(!istype(usr,/mob/living/silicon/ai)) + printpicture(user, temp, mobs, blueprints, flag) + else + aipicture(user, temp, mobs, blueprints) + + +/obj/item/device/camera/proc/printpicture(mob/user, icon/temp, mobs, blueprints, flag) //Normal camera proc for creating photos var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() user.put_in_hands(P) var/icon/small_img = icon(temp) @@ -225,6 +255,72 @@ P.blueprints = 1 blueprints = 0 + +/obj/item/device/camera/proc/aipicture(mob/user, icon/temp, mobs, blueprints) //instead of printing a picture like a regular camera would, we do this instead for the AI + + var/icon/small_img = icon(temp) + var/icon/ic = icon('icons/obj/items.dmi',"photo") + small_img.Scale(8, 8) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + var/icon = ic + var/img = temp + var/desc = mobs + var/pixel_x = rand(-10, 10) + var/pixel_y = rand(-10, 10) + + if(blueprints) + blueprints = 1 + + injectaialbum(icon, img, desc, pixel_x, pixel_y, blueprints) + + +/datum/picture + var/name = "picture" + var/list/fields = list() + + +/obj/item/device/camera/proc/injectaialbum(var/icon, var/img, var/desc, var/pixel_x, var/pixel_y, var/blueprints) //stores image information to a list similar to that of the datacore + var/numberer = 1 + for(var/datum/picture in src.aipictures) + numberer++ + var/datum/picture/P = new() + P.fields["name"] = "Photo [numberer]" + P.fields["icon"] = icon + P.fields["img"] = img + P.fields["desc"] = desc + P.fields["pixel_x"] = pixel_x + P.fields["pixel_y"] = pixel_y + P.fields["blueprints"] = blueprints + + aipictures += P + + +/obj/item/device/camera/ai_camera/proc/viewpictures() //AI proc for viewing pictures they have taken + var/list/nametemp = list() + var/find + var/datum/picture/selection + for(var/datum/picture/t in src.aipictures) + nametemp += t.fields["name"] + find = input("Select picture (numbered in order taken)") in nametemp + var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() + for(var/datum/picture/q in src.aipictures) + if(q.fields["name"] == find) + selection = q + break // just in case some AI decides to take 10 thousand pictures in a round + P.icon = selection.fields["icon"] + P.img = selection.fields["img"] + P.desc = selection.fields["desc"] + P.pixel_x = selection.fields["pixel_x"] + P.pixel_y = selection.fields["pixel_y"] + + P.show(usr) + usr << P.desc + del P //so 10 thousdand pictures items are not left in memory should an AI take them and then view them all. + +/obj/item/device/camera/afterattack(atom/target, mob/user, flag) + if(!on || !pictures_left || ismob(target.loc)) return + captureimage(target, user, flag) + playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) pictures_left-- diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 09ce2053a17..5f91e9df885 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -452,11 +452,6 @@ return if(stat & (BROKEN|MAINT)) return - - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("APC",src,user:wear_suit) - return // do APC interaction user.set_machine(src) src.interact(user) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ac06014fa1b..36a11675bab 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -109,10 +109,7 @@ /obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete return powernet -/obj/structure/cable/attack_hand(mob/user) - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("WIRE",src,user:wear_suit) +/obj/structure/cable/attack_tk(mob/user) return /obj/structure/cable/attackby(obj/item/W, mob/user) @@ -211,7 +208,7 @@ throw_range = 5 m_amt = 50 g_amt = 20 - flags = TABLEPASS | USEDELAY | FPRINT | CONDUCT + flags = TABLEPASS | FPRINT | CONDUCT slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined", "flogged") diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 055e62d9ca0..0d64b68dc9c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -63,8 +63,11 @@ /obj/item/weapon/cell/attack_self(mob/user as mob) src.add_fingerprint(user) if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("CELL",src,user:wear_suit) + var/mob/living/carbon/human/H = user + var/obj/item/clothing/gloves/space_ninja/SNG = H.gloves + if(!istype(SNG) || !SNG.candrain || !SNG.draining) return + + SNG.drain("CELL",src,H.wear_suit) return /obj/item/weapon/cell/attackby(obj/item/W, mob/user) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index d6e56d4ea47..1ad24c77dc5 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -491,6 +491,8 @@ if(prot > 0 || (COLD_RESISTANCE in user.mutations)) user << "You remove the light [fitting]" + else if(TK in user.mutations) + user << "You telekinetically remove the light [fitting]." else user << "You try to remove the light [fitting], but you burn your hand on it!" @@ -500,7 +502,8 @@ H.update_damage_overlays(0) H.updatehealth() return // if burned, don't remove the light - + else + user << "You remove the light [fitting]." // create a light tube/bulb item and put it in the user's hand var/obj/item/weapon/light/L = new light_type() L.status = status @@ -520,6 +523,29 @@ status = LIGHT_EMPTY update() +/obj/machinery/light/attack_tk(mob/user) + if(status == LIGHT_EMPTY) + user << "There is no [fitting] in this light." + return + + user << "You telekinetically remove the light [fitting]." + // create a light tube/bulb item and put it in the user's hand + var/obj/item/weapon/light/L = new light_type() + L.status = status + L.rigged = rigged + L.brightness = brightness + + // light item inherits the switchcount, then zero it + L.switchcount = switchcount + switchcount = 0 + + L.update() + L.add_fingerprint(user) + L.loc = loc + + status = LIGHT_EMPTY + update() + // break the light and make sparks if was on /obj/machinery/light/proc/broken(var/skip_sound_and_sparks = 0) @@ -700,7 +726,8 @@ // shatter light, unless it was an attempt to put it in a light socket // now only shatter if the intent was harm -/obj/item/weapon/light/afterattack(atom/target, mob/user) +/obj/item/weapon/light/afterattack(atom/target, mob/user,proximity) + if(!proximity) return if(istype(target, /obj/machinery/light)) return if(user.a_intent != "harm") diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index cbb9ccb90d1..e5f08b47f1e 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -168,11 +168,6 @@ /obj/machinery/power/smes/attack_hand(mob/user) add_fingerprint(user) if(stat & BROKEN) return - - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("SMES",src,user:wear_suit) - return interact(user) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6884fbde620..88e12b1affd 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/gun.dmi' icon_state = "detective" item_state = "gun" - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BELT m_amt = 2000 w_class = 3.0 @@ -41,7 +41,7 @@ afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)//TODO: go over this - if(flag) //we're placing gun on a table or in backpack + if(flag) //It's adjacent, is the user, or is on the user's person return //Exclude lasertag guns from the CLUMSY check. diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 20508c797be..89d5a02f585 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -5,7 +5,7 @@ fire_sound = 'sound/weapons/Laser.ogg' origin_tech = "combat=2;magnets=4" w_class = 5 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK charge_cost = 100 projectile_type = "/obj/item/projectile/ion" @@ -33,7 +33,7 @@ obj/item/weapon/gun/energy/staff icon_state = "staffofchange" item_state = "staffofchange" fire_sound = 'sound/weapons/emitter.ogg' - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK w_class = 5 charge_cost = 200 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 30c22961209..9435130db2f 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -6,7 +6,7 @@ max_shells = 4 w_class = 4.0 force = 10 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK caliber = "shotgun" origin_tech = "combat=4;materials=2" @@ -68,7 +68,7 @@ max_shells = 2 w_class = 4.0 force = 10 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY + flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK caliber = "shotgun" origin_tech = "combat=3;materials=1" diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 7a159a76505..465b51d966a 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -8,7 +8,8 @@ volume = 5 var/filled = 0 - afterattack(obj/target, mob/user , flag) + afterattack(obj/target, mob/user , proximity) + if(!proximity) return if(!target.reagents) return if(filled) diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index d9f196375fb..06fd2b45319 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -62,7 +62,8 @@ return - afterattack(obj/target, mob/user , flag) + afterattack(obj/target, mob/user , proximity) + if(!proximity) return if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 4accb30f147..f0e54d4a086 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -67,8 +67,8 @@ return 0 - afterattack(obj/target, mob/user , flag) - + afterattack(obj/target, mob/user , proximity) + if(!proximity) return if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) @@ -380,4 +380,4 @@ ..() reagents.add_reagent("dr_gibb", 30) src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) \ No newline at end of file + src.pixel_y = rand(-10.0, 10) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 86bd4060083..725407813b7 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -100,7 +100,7 @@ return 0 -/obj/item/weapon/reagent_containers/food/snacks/afterattack(obj/target, mob/user , flag) +/obj/item/weapon/reagent_containers/food/snacks/afterattack(obj/target, mob/user , proximity) return @@ -1323,7 +1323,8 @@ ..() reagents.add_reagent("nutriment",10) - afterattack(obj/O, mob/user) + afterattack(obj/O, mob/user,proximity) + if(!proximity) return if(istype(O,/obj/structure/sink) && !wrapped) user << "You place [src] under a stream of water..." user.drop_item() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index faeb79687dd..e43e45f3a85 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -40,7 +40,8 @@ for(var/datum/reagent/R in reagents.reagent_list) usr << "[R.volume] units of [R.name]" - afterattack(obj/target, mob/user , flag) + afterattack(obj/target, mob/user, proximity) + if(!proximity) return // not adjacent for(var/type in can_be_placed_into) if(istype(target, type)) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 1dcd171b764..79d1e40fbbf 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -60,7 +60,8 @@ return 0 - afterattack(obj/target, mob/user , flag) + afterattack(obj/target, mob/user , proximity) + if(!proximity) return if(target.is_open_container() != 0 && target.reagents) if(!target.reagents.total_volume) user << "[target] is empty. There's nothing to dissolve [src] in." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 63c07bd8970..c6eef991394 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/janitor.dmi' icon_state = "cleaner" item_state = "cleaner" - flags = TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY + flags = TABLEPASS|OPENCONTAINER|FPRINT|NOBLUDGEON slot_flags = SLOT_BELT throwforce = 3 w_class = 2.0 @@ -236,11 +236,12 @@ reagents.add_reagent("plantbgone", 100) -/obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob) - if (istype(A, /obj/machinery/hydroponics)) // We are targeting hydrotray - return +/obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob, proximity) + if(proximity) + if (istype(A, /obj/machinery/hydroponics)) // We are targeting hydrotray + return - if (istype(A, /obj/effect/blob)) // blob damage in blob code - return + if (istype(A, /obj/effect/blob)) // blob damage in blob code + return ..() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 8d75e1aa21e..763d3c9b7b2 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -40,7 +40,8 @@ attackby(obj/item/I, mob/user) return - afterattack(obj/target, mob/user , flag) + afterattack(obj/target, mob/user , proximity) + if(!proximity) return if(!target.reagents) return switch(mode) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index e6f2d05b811..82c6ea1d023 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -446,7 +446,7 @@ /obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if (istype(mover,/obj/item) && mover.throwing) var/obj/item/I = mover - if(istype(I, /obj/item/weapon/dummy) || istype(I, /obj/item/projectile)) + if(istype(I, /obj/item/projectile)) return if(prob(75)) I.loc = src diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 357d4032e90..c199516f103 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -93,15 +93,16 @@ name = "package wrapper" icon = 'icons/obj/items.dmi' icon_state = "deliveryPaper" + flags = FPRINT | NOBLUDGEON w_class = 3.0 var/amount = 25.0 - afterattack(var/obj/target as obj, mob/user as mob) + afterattack(var/obj/target as obj, mob/user as mob, proximity) + if(!proximity) return if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete return - if(istype(target, /obj/structure/table) || istype(target, /obj/structure/rack) \ - || istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ + if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ || istype(target, /obj/item/weapon/evidencebag) || istype(target, /obj/structure/closet/body_bag)) return if(target.anchored) @@ -229,7 +230,7 @@ return Bumped(var/atom/movable/AM) //Go straight into the chute - if(istype(AM, /obj/item/projectile) || istype(AM, /obj/item/weapon/dummy)) return + if(istype(AM, /obj/item/projectile)) return switch(dir) if(NORTH) if(AM.loc.y != loc.y+1) return diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 4da8960b080..1fd7235f7bb 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -545,11 +545,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(stat & (BROKEN|NOPOWER)) return - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("RESEARCH",src,user:wear_suit) - return - user.set_machine(src) var/dat = "" files.RefreshResearch() diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 3e458226f1a..b56dcf8022d 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -154,19 +154,13 @@ del(src) return 1 -/obj/machinery/r_n_d/server/attack_hand(mob/user as mob) +/obj/machinery/r_n_d/server/attack_hand(mob/user as mob) // I guess only exists to stop ninjas or hell does it even work I dunno. See also ninja gloves. if (disabled) return if (shocked) shock(user,50) - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("RESEARCH",src,user:wear_suit) return - - - /obj/machinery/r_n_d/server/centcom name = "Centcom Central R&D Database" server_id = -1 diff --git a/html/changelog.html b/html/changelog.html index a9a06e9cbac..e146fa3497f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,7 +51,23 @@ should be listed in the changelog upon commit tho. Thanks. --> - + +
+ + +

17 September 2013

+

SuperSayu updated:

+
    +
  • You can no longer strip people through windows and windoors
  • +
  • You can open doors by hand even if there is a firedoor in the way, making firedoor+airlock no longer an unbeatable combination
  • +
  • Ghosts can now click on anything to examine it, or double click to jump to a turf. Double clicking a mob, bot, or (heaven forbid) singularity/Nar-Sie will let you follow it. Double clicking your own corpse re-enters it.
  • +
  • AI can double click a mob to follow it, as well as double clicking turfs to jump.
  • +
  • Ventcrawling mobs can alt-click a vent to start ventcrawling.
  • +
  • Telekinesis is now part of the click system. You can click on buttons, items, etc, without having a telekinetic throw in hand; the throw will appear when you click on something you can move (with your mind).
  • +
+
+ +

13 September 2013

JJRcop updated:

@@ -88,6 +104,15 @@ should be listed in the changelog upon commit tho. Thanks. -->
+
+

12 September 2013

+

AndroidSFV updated:

+
    +
  • AI Photography: AIs now have two new verbs, Take Picture and View Picture. The pictures the AI takes are centered on the AI's eyeobj. You can use these pictures on a newscaster, and print them at a photocopier. +
+
+ +

31 August 2013

Cael_Aislinn updated:

diff --git a/maps/MetaStation.v36B.dmm b/maps/MetaStation.v36C.dmm similarity index 99% rename from maps/MetaStation.v36B.dmm rename to maps/MetaStation.v36C.dmm index 07d91315853..43aa0f65387 100644 --- a/maps/MetaStation.v36B.dmm +++ b/maps/MetaStation.v36C.dmm @@ -1089,11 +1089,11 @@ "auW" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/northright{name = "Secure Atrium"; pixel_y = 1; req_access_txt = "1"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/main) "auX" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door/window/northleft{name = "Secure Atrium"; pixel_y = 1; req_access_txt = "1"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) "auY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/main) -"auZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 20},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = -4},/obj/machinery/door/window{dir = 4; name = "Tertiary AI Core Access"; pixel_x = 2; req_access_txt = "16"},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Tertiary AI Base"},/area/turret_protected/ai) +"auZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 20},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = -4},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Tertiary AI Base"},/area/turret_protected/ai) "ava" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "avb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters) "avc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"avd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"avd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/door/window{dir = 8; icon_state = "left"; name = "Tertiary AI Core Access"; pixel_x = 0; req_access_txt = "16"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "ave" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area) "avf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/fore) "avg" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=0-SecurityHall"; location = "16-Court"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) @@ -1102,7 +1102,7 @@ "avj" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "avk" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/brig) "avl" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) -"avm" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 19},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = -3},/obj/machinery/door/window{dir = 8; name = "Secondary AI Core Access"; pixel_x = -2; req_access_txt = "16"},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Secondary AI Base"},/area/turret_protected/ai) +"avm" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 19},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = -3},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Secondary AI Base"},/area/turret_protected/ai) "avn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "avo" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "avp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) @@ -1147,10 +1147,10 @@ "awc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) "awd" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "Primary Tool Storage APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/storage/primary) "awe" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"awf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"awf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/door/window{dir = 4; name = "Secondary AI Core Access"; pixel_x = 0; req_access_txt = "16"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "awg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "awh" = (/obj/structure/table,/obj/machinery/camera/autoname{c_tag = "Engineering SMES Room"; dir = 8; network = list("SS13")},/obj/item/toy/prize/seraph{pixel_y = 10},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) -"awi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/flasher{id = "AI"; pixel_x = -24; pixel_y = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"awi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/flasher{id = "AI"; pixel_x = -24; pixel_y = 8},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "awj" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/turret_protected/ai) "awk" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "awl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/wall/r_wall,/area/turret_protected/ai) @@ -1158,7 +1158,7 @@ "awn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) "awo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/fore) "awp" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters) -"awq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"awq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "awr" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom) "aws" = (/obj/machinery/door/airlock/maintenance{name = "Brig Maintenance"; req_access_txt = "63"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) "awt" = (/obj/structure/closet/secure_closet/warden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) @@ -1485,7 +1485,7 @@ "aCC" = (/obj/machinery/door/airlock/maintenance{name = "Supply Maintenance"; req_access_txt = "50"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aCD" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aCE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/handcuffs,/turf/simulated/floor{dir = 4; icon_state = "redcorner"},/area/bridge) -"aCF" = (/obj/structure/rack,/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/item/clothing/gloves/orange,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aCF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/starboard) "aCG" = (/obj/machinery/light/small{dir = 4},/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/fore) "aCH" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fore) "aCI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -1511,7 +1511,7 @@ "aDc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters) "aDd" = (/obj/machinery/computer/crew,/turf/simulated/floor{dir = 1; icon_state = "green"},/area/bridge) "aDe" = (/obj/structure/table,/obj/machinery/recharger,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 22},/obj/machinery/newscaster/security_unit{pixel_x = 30; pixel_y = 0},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) -"aDf" = (/obj/machinery/power/apc{dir = 4; name = "Custodial Closet APC"; pixel_x = 24},/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/structure/table,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aDf" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/hallway/primary/starboard) "aDg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters) "aDh" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters) "aDi" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fore) @@ -1561,7 +1561,7 @@ "aEa" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Armory APC"; pixel_x = 24; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/warden) "aEb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/warden) "aEc" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) -"aEd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aEd" = (/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aEe" = (/obj/machinery/vending/cola,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/fore) "aEf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/primary/fore) "aEg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai) @@ -1569,8 +1569,8 @@ "aEi" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "aEj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "aEk" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"aEl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/flasher{id = "AI"; pixel_x = 24; pixel_y = -8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"aEm" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = -27; pixel_y = 4},/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 24; pixel_y = -7},/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/window{name = "Primary AI Core Access"; pixel_y = -2; req_access_txt = "16"},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Primary AI Base"},/area/turret_protected/ai) +"aEl" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aEm" = (/obj/machinery/power/apc{dir = 4; name = "Custodial Closet APC"; pixel_x = 24},/obj/structure/table,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/clothing/gloves/orange,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aEn" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/fore) "aEo" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "aEp" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/pestkiller{pixel_x = 3; pixel_y = 4},/obj/item/nutrient/ez,/obj/item/nutrient/rh{pixel_x = 2; pixel_y = 1},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -1591,7 +1591,7 @@ "aEE" = (/obj/machinery/computer/med_data,/turf/simulated/floor{dir = 1; icon_state = "green"},/area/bridge) "aEF" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/hallway/primary/central) "aEG" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) -"aEH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aEH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Janitor"},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aEI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/janitor) "aEJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aEK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{dir = 5; icon_state = "yellow"},/area/hallway/primary/starboard) @@ -1622,12 +1622,12 @@ "aFj" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Cargo Technician"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/quartermaster/office{name = "\improper Supply Offices"}) "aFk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Supply Offices"}) "aFl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) -"aFm" = (/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/legcuffs/beartrap,/obj/structure/table,/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_x = 29; pixel_y = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aFm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aFn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/quartermaster/office{name = "\improper Supply Offices"}) "aFo" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "floorgrime"},/area/prison/solitary{name = "Auxiliary Bathrooms"}) "aFp" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = 2},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/quartermaster/office{name = "\improper Supply Offices"}) "aFq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) -"aFr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/power/apc{aidisabled = 0; dir = 1; name = "AI Chamber APC"; pixel_y = 24},/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{tag = "icon-vault (SOUTHEAST)"; icon_state = "vault"; dir = 6},/area/turret_protected/ai) +"aFr" = (/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/legcuffs/beartrap,/obj/structure/table,/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_x = 29; pixel_y = 0},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aFs" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) "aFt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/fore) "aFu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/hallway/secondary/construction{name = "\improper Garden"}) @@ -1707,7 +1707,7 @@ "aGQ" = (/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/office{name = "\improper Supply Offices"}) "aGR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/quartermaster/office{name = "\improper Supply Offices"}) "aGS" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/hallway/primary/central) -"aGT" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/window{name = "Primary AI Core Access"; pixel_y = -2; req_access_txt = "16"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/turret_protected/ai) +"aGT" = (/turf/simulated/floor/plating,/area/hallway/primary/central) "aGU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) "aGV" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/checkpoint2{name = "Customs"}) "aGW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) @@ -1721,9 +1721,9 @@ "aHe" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/construction{name = "\improper Garden"}) "aHf" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Supply Offices"}) "aHg" = (/turf/simulated/wall,/area/quartermaster/office{name = "\improper Supply Offices"}) -"aHh" = (/obj/machinery/door/window/westleft{dir = 1; name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) -"aHi" = (/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor,/area/janitor) -"aHj" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/janitorialcart,/obj/machinery/light/small,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aHh" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aHi" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/hallway/primary/central) +"aHj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "aHk" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aHl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "aHm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/central) @@ -1773,7 +1773,7 @@ "aIe" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/storage) "aIf" = (/obj/machinery/autolathe,/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 6; icon_state = "brown"},/area/quartermaster/office{name = "\improper Supply Offices"}) "aIg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/quartermaster/storage) -"aIh" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central) +"aIh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/hallway/primary/central) "aIi" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aIj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge) "aIk" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/machinery/door/window/southleft{dir = 1; name = "Engineering Desk"; req_access_txt = "32"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "yellowfull"; tag = "icon-whitehall (WEST)"},/area/engine/break_room) @@ -1849,7 +1849,7 @@ "aJC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 3},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/port) "aJD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "aJE" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/aiModule/asimov,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"aJF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/turret_protected/ai) +"aJF" = (/obj/machinery/door/airlock{name = "Central Emergency Storage"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/central) "aJG" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "aJH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "aJI" = (/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -1981,7 +1981,7 @@ "aMe" = (/obj/structure/closet/jcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aMf" = (/obj/structure/closet/l3closet/janitor,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aMg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engine/break_room) -"aMh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central) +"aMh" = (/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = -8; req_access_txt = "28"},/obj/machinery/pdapainter,/turf/simulated/floor/wood,/area/crew_quarters/heads) "aMi" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor,/area/crew_quarters/locker) "aMj" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aMk" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/hallway/primary/central) @@ -2019,7 +2019,7 @@ "aMQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 5; icon_state = "neutral"},/area/hallway/secondary/entry{name = "Arrivals"}) "aMR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access_txt = "41"},/turf/simulated/floor,/area/quartermaster/qm) "aMS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/turf/simulated/floor,/area/hallway/primary/central) -"aMT" = (/obj/machinery/door/airlock{name = "Central Emergency Storage"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/hallway/primary/central) +"aMT" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/heads) "aMU" = (/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/prison/solitary{name = "Auxiliary Bathrooms"}) "aMV" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Head of Personnel"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/heads) "aMW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -2118,8 +2118,8 @@ "aOL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/quartermaster/office{name = "\improper Supply Offices"}) "aOM" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/structure/plasticflaps{opacity = 0},/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Supply Offices"}) "aON" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/heads) -"aOO" = (/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "28"},/obj/machinery/pdapainter,/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/heads) -"aOP" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 30; pixel_y = 0},/obj/structure/filingcabinet/chestdrawer,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/heads) +"aOO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"aOP" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads) "aOQ" = (/obj/structure/closet/wardrobe/white,/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/locker) "aOR" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore) "aOS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window{dir = 1; name = "HoP's Desk"; pixel_y = 0; req_access_txt = "57"},/turf/simulated/floor/wood,/area/crew_quarters/heads) @@ -2176,7 +2176,7 @@ "aPR" = (/obj/machinery/computer/communications,/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Captain)"; pixel_x = 28},/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "aPS" = (/obj/machinery/power/apc{cell_type = 10000; dir = 1; name = "Central Hall APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) "aPT" = (/obj/structure/table,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/bridge) -"aPU" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"aPU" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Mix"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) "aPV" = (/obj/machinery/power/apc{dir = 1; name = "AI Upload Access APC"; pixel_x = 0; pixel_y = 27},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "aPW" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/turretid{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 8; pixel_y = 24},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -8; pixel_y = 22},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "aPX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) @@ -2196,7 +2196,7 @@ "aQl" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/hallway/primary/central) "aQm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor,/area/hallway/primary/starboard) "aQn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/security{name = "Customs Desk"; req_access = null; req_access_txt = "1"},/turf/simulated/floor,/area/security/checkpoint2{name = "Customs"}) -"aQo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"aQo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "delivery"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) "aQp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "aQq" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Supply Offices"}) "aQr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/crew_quarters/fitness) @@ -2316,7 +2316,7 @@ "aSB" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech) "aSC" = (/obj/structure/table,/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/bridge) "aSD" = (/turf/simulated/wall,/area/turret_protected/ai_upload_foyer) -"aSE" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/turret_protected/ai_upload_foyer) +"aSE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "bot"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) "aSF" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Upload"; req_access_txt = "16"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "aSG" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/obj/structure/closet/secure_closet/security,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint2{name = "Customs"}) "aSH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) @@ -2365,7 +2365,7 @@ "aTy" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "aTz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{icon_state = "arrival"; dir = 5},/area/hallway/secondary/entry{name = "Arrivals"}) "aTA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/storage) -"aTB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"aTB" = (/obj/machinery/door_control{id = "council blast"; name = "Council Chamber Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "19"},/turf/simulated/floor/carpet,/area/bridge) "aTC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "aTD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor,/area/security/checkpoint/supply) "aTE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/supply) @@ -2422,7 +2422,7 @@ "aUD" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aUE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/wall/r_wall,/area/engine/engineering) "aUF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) -"aUG" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "delivery"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) +"aUG" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 2; icon_state = "left"; name = "Reception Window"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; layer = 2.9; name = "Privacy Door"; opacity = 0},/turf/simulated/floor,/area/crew_quarters/heads) "aUH" = (/turf/simulated/floor{icon_state = "bot"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) "aUI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "aUJ" = (/obj/machinery/door/window/westleft{dir = 2; name = "Research Division Deliveries"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "delivery"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -2476,7 +2476,7 @@ "aVF" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "aVG" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "aVH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) -"aVI" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 2; icon_state = "left"; name = "Reception Window"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; layer = 3.12; name = "Privacy Door"; opacity = 0},/turf/simulated/floor,/area/crew_quarters/heads) +"aVI" = (/turf/simulated/wall/r_wall,/area/janitor) "aVJ" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "28"},/turf/simulated/floor/wood,/area/crew_quarters/heads) "aVK" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "aVL" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -2528,8 +2528,8 @@ "aWF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) "aWG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) "aWH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor,/area/hallway/primary/central) -"aWI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/crew_quarters/heads) -"aWJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) +"aWI" = (/obj/structure/janitorialcart,/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) +"aWJ" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aWK" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central) "aWL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/central) "aWM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "L2"},/area/hallway/primary/central) @@ -2591,7 +2591,7 @@ "aXQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aXR" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aXS" = (/obj/structure/table/woodentable,/obj/item/weapon/hand_labeler,/obj/item/weapon/packageWrap,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/heads) -"aXT" = (/obj/structure/closet/secure_closet/hop,/turf/simulated/floor/wood,/area/crew_quarters/heads) +"aXT" = (/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/light/small,/turf/simulated/floor,/area/janitor) "aXU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/firealarm{pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/port) "aXV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "aXW" = (/obj/machinery/computer/ordercomp,/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = "Prison"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/wood,/area/crew_quarters/heads) @@ -2764,17 +2764,17 @@ "bbh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "brown"},/area/construction/Storage{name = "Storage Wing"}) "bbi" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/construction/Storage{name = "Storage Wing"}) "bbj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/construction/Storage{name = "Storage Wing"}) -"bbk" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) -"bbl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/mob/living/simple_animal/corgi/Ian,/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"bbk" = (/obj/machinery/door/window/westleft{dir = 8; name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) +"bbl" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/hallway/primary/central) "bbm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"}) "bbn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"}) "bbo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 15},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/central) -"bbp" = (/obj/machinery/light_switch{pixel_x = -25; pixel_y = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = -24; pixel_y = -6; req_access_txt = "28"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"bbp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bbq" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/hallway/primary/central) "bbr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"}) "bbs" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central) "bbt" = (/obj/item/weapon/cigbutt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bbu" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"bbu" = (/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = -24; pixel_y = -6; req_access_txt = "28"},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 5},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bbv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bbw" = (/obj/structure/table/woodentable,/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/jade{pixel_x = 2; pixel_y = 2},/obj/item/weapon/lipstick/purple{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bbx" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/space,/area) @@ -2833,7 +2833,7 @@ "bcy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/checkpoint2{name = "Customs"}) "bcz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint2{name = "Customs"}) "bcA" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/checkpoint2{name = "Customs"}) -"bcB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{desc = "\"This is a plaque in honour of our comrades on the G-4407 and TG-212 Stations. Hopefully the MS-36B model can live up to your fame and fortune.\" Scratched beneath is a crude image of postcards yelling at each other in a corrupted world."; icon_state = "plaque"; name = "Commemorative Plaque"},/area/hallway/primary/port) +"bcB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{desc = "\"This is a plaque in honour of our comrades on the G-4407 and TG-212 Stations. Hopefully the MS-36C model can live up to your fame and fortune.\" Scratched beneath is a crude image of postcards yelling at each other in a world of darkness."; icon_state = "plaque"; name = "Commemorative Plaque"},/area/hallway/primary/port) "bcC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "neutral"; dir = 9},/area/hallway/primary/port) "bcD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "bcE" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -2860,7 +2860,7 @@ "bcZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/port) "bda" = (/obj/structure/closet/firecloset,/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor{dir = 9; icon_state = "neutral"},/area/hallway/primary/central) "bdb" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Head of Personnel APC"; pixel_y = 24},/obj/machinery/camera/autoname{dir = 2; network = list("SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/heads) -"bdc" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) +"bdc" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bdd" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/hallway/primary/fore) "bde" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge) "bdf" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/bridge) @@ -2895,7 +2895,7 @@ "bdI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "bdJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 1; icon_state = "browncorner"},/area/hallway/primary/fore) "bdK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Foyer"; req_access_txt = "32"},/turf/simulated/floor,/area/engine/break_room) -"bdL" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"bdL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/central) "bdM" = (/turf/simulated/wall,/area/construction/Storage{name = "Storage Wing"}) "bdN" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/item/weapon/folder/yellow,/turf/simulated/floor,/area/engine/break_room) "bdO" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Research Division"},/turf/simulated/floor{icon_state = "bot"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -2918,7 +2918,7 @@ "bef" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "beg" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/arrival/station) "beh" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/arrival/station) -"bei" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/obj/machinery/atmospherics/pipe/simple{color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/storage) +"bei" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/heads) "bej" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bek" = (/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2{name = "Customs"}) "bel" = (/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2{name = "Customs"}) @@ -2956,7 +2956,7 @@ "beR" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/rack,/obj/item/weapon/storage/lockbox,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/bridge) "beS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -24; pixel_y = -6; req_access_txt = "10"},/obj/item/device/radio/off,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 6},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/engineering) "beT" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/courtroom) -"beU" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/carpet,/area/crew_quarters/heads) +"beU" = (/obj/structure/grille,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads) "beV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge) "beW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads) "beX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads) @@ -3515,7 +3515,7 @@ "bpE" = (/obj/machinery/atmospherics/pipe/manifold{color = "green"; dir = 1; icon_state = "manifold-g"; level = 2; tag = "icon-manifold-g (NORTH)"},/turf/simulated/floor,/area/maintenance/storage) "bpF" = (/obj/machinery/atmospherics/pipe/manifold{tag = "icon-manifold-g (EAST)"; icon_state = "manifold-g"; dir = 4; level = 2; color = "green"},/turf/simulated/floor,/area/maintenance/storage) "bpG" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "waste_in"; name = "Gas Mix Tank Control"; output_tag = "waste_out"; sensors = list("waste_sensor" = "Tank")},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/maintenance/storage) -"bpH" = (/obj/structure/grille,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads) +"bpH" = (/obj/structure/closet/secure_closet/hop,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/heads) "bpI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/storage) "bpJ" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) "bpK" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) @@ -3549,7 +3549,7 @@ "bqm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/quartermaster/storage) "bqn" = (/obj/machinery/camera/autoname{dir = 2; network = list("SS13")},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/power/apc{dir = 1; name = "Quartermaster's Office APC"; pixel_x = 0; pixel_y = 30},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 1; icon_state = "brown"},/area/quartermaster/qm) "bqo" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/storage) -"bqp" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/storage) +"bqp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/flasher{id = "AI"; pixel_x = 24; pixel_y = -8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bqq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/security/checkpoint/supply) "bqr" = (/obj/structure/closet/secure_closet/quartermaster,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/quartermaster/qm) "bqs" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/bridge) @@ -3805,7 +3805,7 @@ "bvi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/bridge) "bvj" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/bridge) "bvk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/wood,/area/bridge) -"bvl" = (/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "19"},/turf/simulated/floor/carpet,/area/bridge) +"bvl" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = -27; pixel_y = 4},/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 24; pixel_y = -7},/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Primary AI Base"},/area/turret_protected/ai) "bvm" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/bridge) "bvn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Arrivals Expansion Area"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) "bvo" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/turf/simulated/floor/carpet,/area/bridge) @@ -3952,7 +3952,7 @@ "bxZ" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/turf/simulated/floor/wood,/area/library) "bya" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/wood,/area/library) "byb" = (/obj/structure/table/woodentable,/obj/machinery/librarycomp{pixel_y = 0},/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/wood,/area/library) -"byc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) +"byc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "byd" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/qm) "bye" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/qm) "byf" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor{dir = 10; icon_state = "brown"},/area/quartermaster/qm) @@ -4111,8 +4111,8 @@ "bBc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bBd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/chiefs_office) "bBe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/central) -"bBf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central) -"bBg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;17"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"bBf" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/power/apc{aidisabled = 0; dir = 1; name = "AI Chamber APC"; pixel_y = 24},/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{tag = "icon-vault (SOUTHEAST)"; icon_state = "vault"; dir = 6},/area/turret_protected/ai) +"bBg" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/window{name = "Primary AI Core Access"; pixel_y = -2; req_access_txt = "16"},/obj/machinery/door/window{dir = 1; name = "Primary AI Core Access"; pixel_y = 0; req_access_txt = "16"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/turret_protected/ai) "bBh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "bBi" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room{name = "\improper Command Corridors"}) "bBj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge/meeting_room{name = "\improper Command Corridors"}) @@ -4121,13 +4121,13 @@ "bBm" = (/turf/simulated/floor,/area/bridge/meeting_room{name = "\improper Command Corridors"}) "bBn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge/meeting_room{name = "\improper Command Corridors"}) "bBo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor,/area/bridge/meeting_room{name = "\improper Command Corridors"}) -"bBp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bBp" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/turret_protected/ai) "bBq" = (/turf/simulated/wall/r_wall,/area/teleporter{name = "\improper Teleporter Room"}) "bBr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) "bBs" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/cmo) -"bBt" = (/obj/machinery/vending/cola,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) +"bBt" = (/obj/machinery/recharge_station,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/turret_protected/ai_upload_foyer) "bBu" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) -"bBv" = (/obj/machinery/vending/coffee,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) +"bBv" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bBw" = (/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/hydroponics) "bBx" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central) "bBy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) @@ -4141,12 +4141,12 @@ "bBG" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "bBH" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "bBI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/storage) -"bBJ" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"bBJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/toxins/lab) "bBK" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/monkey{name = "Pun Pun"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "bBL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/storage/tech) "bBM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "bBN" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) -"bBO" = (/obj/item/weapon/storage/belt/utility,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 27; pixel_y = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"bBO" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/hydroponics) "bBP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech) "bBQ" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"; level = 2},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/maintenance/storage) "bBR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/computer) @@ -4168,7 +4168,7 @@ "bCh" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/carpet,/area/security/vacantoffice) "bCi" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/obj/machinery/newscaster/security_unit{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/wood,/area/security/vacantoffice) "bCj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bCk" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"bCk" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - O2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) "bCl" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "bCm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bCn" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/toxins/lab) @@ -4188,16 +4188,16 @@ "bCB" = (/obj/machinery/computer/med_data,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/surgery) "bCC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "bCD" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "dark"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) -"bCE" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"bCE" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) "bCF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge/meeting_room{name = "\improper Command Corridors"}) -"bCG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/teleporter{name = "\improper Teleporter Room"}) +"bCG" = (/turf/simulated/wall/r_wall,/area/gateway) "bCH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) "bCI" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance"; req_access_txt = "24"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) "bCJ" = (/obj/machinery/teleport/station,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) "bCK" = (/obj/item/weapon/cartridge/medical{pixel_x = -2; pixel_y = 6},/obj/item/weapon/cartridge/medical{pixel_x = 6; pixel_y = 3},/obj/item/weapon/cartridge/medical,/obj/item/weapon/cartridge/chemistry{pixel_y = 2},/obj/structure/table/reinforced,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bCL" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) "bCM" = (/obj/item/device/radio/off,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/box/lights/mixed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bCN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"bCN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;17"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/gateway) "bCO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/central) "bCP" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Maltese Falcon APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "bCQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) @@ -4253,21 +4253,21 @@ "bDO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard) "bDP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "dark"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) "bDQ" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) -"bDR" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bDR" = (/obj/machinery/vending/cola,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "bDS" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bDT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) -"bDU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bDU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/cigarette,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "bDV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) "bDW" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/locker) "bDX" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 30; pixel_y = 0},/obj/structure/bedsheetbin{pixel_x = 2},/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/weapon/gun/syringe,/turf/simulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/surgery) -"bDY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) -"bDZ" = (/obj/machinery/door/airlock/maintenance{name = "Gateway Maintenance"; req_access_txt = "17"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) -"bEa" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"bDY" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) +"bDZ" = (/obj/item/weapon/storage/belt/utility,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 27; pixel_y = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) +"bEa" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "bEb" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/maintenance/starboard) -"bEc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) -"bEd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) -"bEe" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) -"bEf" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"bEc" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) +"bEd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/gateway) +"bEe" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bEf" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bEg" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) "bEh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor,/area/hallway/primary/central) "bEi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -4293,7 +4293,7 @@ "bEC" = (/obj/machinery/atmospherics/binary/pump{dir = 0; icon_state = "intact_off"; name = "Port to Filter"; on = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor,/area/maintenance/storage) "bED" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/stool,/turf/simulated/floor,/area/maintenance/storage) "bEE" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor,/area/maintenance/storage) -"bEF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"bEF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/gateway) "bEG" = (/obj/machinery/camera/autoname{dir = 8; network = list("SS13","Medbay")},/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/structure/rack{layer = 2.8},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bEH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/security/vacantoffice) "bEI" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/machinery/newscaster{pixel_x = -30},/obj/item/weapon/storage/fancy/candle_box,/obj/item/weapon/storage/fancy/candle_box{pixel_x = -2; pixel_y = 2},/turf/simulated/floor/carpet,/area/chapel/main) @@ -4329,10 +4329,10 @@ "bFm" = (/turf/simulated/wall/r_wall,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bFn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bFo" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "purplefull"},/area/hallway/primary/aft) -"bFp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Gateway Access"; req_access_txt = "62"},/turf/simulated/floor,/area/teleporter{name = "\improper Teleporter Room"}) -"bFq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) -"bFr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) -"bFs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"bFp" = (/obj/machinery/door/airlock/maintenance{name = "Gateway Maintenance"; req_access_txt = "17"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/gateway) +"bFq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) +"bFr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) +"bFs" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "bFt" = (/obj/machinery/shieldwallgen,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/teleporter{name = "\improper Teleporter Room"}) "bFu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) "bFv" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) @@ -4400,12 +4400,12 @@ "bGF" = (/obj/structure/showcase{desc = "A stand with a model of the perfect Nanotrasen Employee bolted to it. Signs indicate it is robustly genetically engineered, as well as being ruthlessly loyal."; name = "'Perfect Man' Exhibit"},/obj/structure/sign/atmosplaque{desc = "A guide to the exhibit, explaining how recent developments in genetic modification and cloning technologies by the Nanotrasen Corporation have led to development and the effective immortality of the 'perfect man', the loyal Nanotrasen Employee."; icon_state = "kiddieplaque"; name = "\improper 'Perfect Man' Exhibit"; pixel_x = 0; pixel_y = 32},/obj/structure/window/reinforced,/turf/simulated/floor/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bGG" = (/obj/structure/stool/bed/roller,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) "bGH" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/sleeper{name = "Sleepers"}) -"bGI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) -"bGJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/reagent_containers/syringe/antitoxin,/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = -1; pixel_y = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) -"bGK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) -"bGL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) +"bGI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/gateway) +"bGJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Gateway Access"; req_access_txt = "62"},/turf/simulated/floor,/area/gateway) +"bGK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) +"bGL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/gateway) "bGM" = (/turf/simulated/floor{icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) -"bGN" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"bGN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/gateway) "bGO" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bGP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bGQ" = (/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab) @@ -4441,14 +4441,14 @@ "bHu" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) "bHv" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/sleeper{name = "Sleepers"}) "bHw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) -"bHx" = (/obj/machinery/shieldwallgen,/turf/simulated/floor{icon_state = "dark"},/area/teleporter{name = "\improper Teleporter Room"}) +"bHx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bHy" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/wood,/area/security/vacantoffice) "bHz" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/white,/turf/simulated/floor/wood,/area/security/vacantoffice) "bHA" = (/obj/machinery/power/apc{dir = 2; name = "Vacant Office APC"; pixel_y = -25},/obj/structure/cable/yellow,/turf/simulated/floor/wood,/area/security/vacantoffice) "bHB" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/security/vacantoffice) "bHC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) "bHD" = (/obj/machinery/chem_dispenser,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) -"bHE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/teleporter{name = "\improper Teleporter Room"}) +"bHE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/reagent_containers/syringe/antitoxin,/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = -1; pixel_y = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "bHF" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "bHG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "bHH" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/chapel/main) @@ -4563,7 +4563,7 @@ "bJM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) "bJN" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/camera/autoname{dir = 1; network = list("SS13","Medbay")},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/cryo) "bJO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) -"bJP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bJP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/gateway) "bJQ" = (/obj/machinery/door/window/northleft{dir = 8; name = "Jetpack Storage"; pixel_x = -1; pixel_y = 0; req_access_txt = "19"},/obj/structure/window/reinforced,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = -2; pixel_y = 3},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bJR" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) "bJS" = (/obj/structure/table,/obj/item/seeds/lemonseed,/obj/item/seeds/cherryseed,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/nutrient/ez,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) @@ -4646,7 +4646,7 @@ "bLr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bLs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bLt" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) -"bLu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/hydroponics) +"bLu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/gateway) "bLv" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{name = "Chemistry Desk"; req_access_txt = "5; 33"},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bLw" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) "bLx" = (/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -4655,7 +4655,7 @@ "bLA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bLB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) "bLC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bLD" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/hydroponics) +"bLD" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/gateway) "bLE" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 8; icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/kitchen) "bLF" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Kitchen"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/starboard) "bLG" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) @@ -4785,7 +4785,7 @@ "bOa" = (/obj/machinery/vending/hydronutrients,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) "bOb" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bOc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/o2{pixel_x = -2; pixel_y = 4},/turf/simulated/floor{dir = 10; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"bOd" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/hydroponics) +"bOd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/gateway) "bOe" = (/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/starboard) "bOf" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) "bOg" = (/obj/effect/landmark/start{name = "Chef"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) @@ -4830,7 +4830,7 @@ "bOT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "bOU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/central) "bOV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/hallway/primary/central) -"bOW" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/hydroponics) +"bOW" = (/obj/machinery/shieldwallgen,/turf/simulated/floor{icon_state = "dark"},/area/gateway) "bOX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/hallway/primary/central) "bOY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "L1"},/area/hallway/primary/central) "bOZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "L3"},/area/hallway/primary/central) @@ -4842,7 +4842,7 @@ "bPf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "L15"},/area/hallway/primary/central) "bPg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/primary/central) "bPh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/central) -"bPi" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/hydroponics) +"bPi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/gateway) "bPj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor,/area/hallway/primary/central) "bPk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "bPl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -4934,7 +4934,7 @@ "bQT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/storage) "bQU" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/maintenance/storage) "bQV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/maintenance/storage) -"bQW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/hydroponics) +"bQW" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/gateway) "bQX" = (/obj/structure/stool,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/maintenance/storage) "bQY" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor{icon_state = "redfull"},/area/maintenance/storage) "bQZ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Burn Chamber Outlet"},/obj/machinery/ignition_switch{id = "atmosmixspark"; pixel_x = -5; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/maintenance/storage) @@ -5138,7 +5138,7 @@ "bUP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "bUQ" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/door_control{id = "misclab"; name = "Test Chamber Blast Doors"; pixel_x = 6; pixel_y = 30; req_access_txt = "47"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/toxins/misc_lab) "bUR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bUS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bUS" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - CO2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) "bUT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bUU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) "bUV" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) @@ -5161,12 +5161,12 @@ "bVm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/woodentable,/obj/item/candle,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "bVn" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bVo" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/obj/machinery/requests_console{announcementConsole = 1; department = "Telecoms Admin"; departmentType = 5; name = "Telecoms RC"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{dir = 2; icon_state = "yellow"},/area/tcommsat/computer) -"bVp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"bVp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bVq" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/storage) -"bVr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Gateway Atrium"; req_access_txt = "62"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor,/area/teleporter{name = "\improper Teleporter Room"}) +"bVr" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/hydroponics) "bVs" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bVt" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) -"bVu" = (/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/hydroponics) +"bVu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/hydroponics) "bVv" = (/turf/simulated/floor{icon_state = "bar"},/area/hallway/primary/central) "bVw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bVx" = (/obj/machinery/seed_extractor,/obj/machinery/light,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) @@ -5402,7 +5402,7 @@ "bZT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) "bZU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/hydroponics) "bZV" = (/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"; tag = "icon-warnwhitecorner (EAST)"},/area/hydroponics) -"bZW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/bridge/meeting_room{name = "\improper Command Corridors"}) +"bZW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/hydroponics) "bZX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/maintenance/aft{name = "Aft Maintenance"}) "bZY" = (/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/hydroponics) "bZZ" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area) @@ -5503,7 +5503,7 @@ "cbQ" = (/obj/machinery/vending/snack,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central) "cbR" = (/obj/structure/closet/crate/rcd{pixel_y = 4},/obj/machinery/door/window/northleft{dir = 4; name = "RCD Storage"; pixel_x = 1; pixel_y = 0; req_access_txt = "19"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cbS" = (/obj/structure/dispenser/oxygen{pixel_x = -1; pixel_y = 2},/turf/simulated/floor,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) -"cbT" = (/obj/machinery/camera/motion{c_tag = "E.V.A. Storage #2"; dir = 8},/obj/machinery/requests_console{department = "EVA"; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"cbT" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Air"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) "cbU" = (/obj/machinery/power/apc{dir = 8; name = "Teleporter APC"; pixel_x = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) "cbV" = (/obj/machinery/sparker{id = "Misc"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/misc_lab) "cbW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "libsht"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/wood,/area/library) @@ -5533,7 +5533,7 @@ "ccu" = (/obj/machinery/light,/obj/machinery/camera/autoname{dir = 1; network = list("SS13","Medbay")},/obj/structure/stool/bed/roller,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) "ccv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) "ccw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) -"ccx" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/teleporter{name = "\improper Teleporter Room"}) +"ccx" = (/turf/simulated/floor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/hydroponics) "ccy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/science) "ccz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/security/checkpoint/science) "ccA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/checkpoint/science) @@ -5564,7 +5564,7 @@ "ccZ" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/camera/autoname{dir = 2; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "cda" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) "cdb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"cdc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"cdc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/hydroponics) "cdd" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor{icon_state = "bluefull"},/area/maintenance/storage) "cde" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "cdf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -5572,21 +5572,21 @@ "cdh" = (/obj/machinery/door/poddoor{density = 1; icon_state = "closed"; id = "QMLoaddoor"; name = "Supply Dock Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage) "cdi" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "O2 to Airmix"},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{icon_state = "bluefull"},/area/maintenance/storage) "cdj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"cdk" = (/obj/structure/dispenser/oxygen{pixel_x = -1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) -"cdl" = (/obj/structure/stool/bed/roller,/obj/machinery/vending/wallmed1{pixel_x = -28; pixel_y = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cdk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Gateway Atrium"; req_access_txt = "62"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor,/area/gateway) +"cdl" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;17"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/gateway) "cdm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cdn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cdo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "cdp" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "kitchen shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "cdq" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 4; icon_state = "intact-c"; level = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/maintenance/storage) -"cdr" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cdr" = (/obj/machinery/vending/coffee,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "cds" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) "cdt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "cdu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "cdv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area) "cdw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cdx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"cdy" = (/obj/machinery/gateway,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) +"cdy" = (/obj/machinery/vending/cigarette,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -29},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "cdz" = (/obj/machinery/requests_console{department = "Kitchen"; departmentType = 2; pixel_x = 30; pixel_y = 0},/obj/machinery/processor,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "cdA" = (/obj/machinery/light/small{dir = 4},/obj/effect/landmark/start{name = "Chaplain"},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "cdB" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) @@ -5598,7 +5598,7 @@ "cdH" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/chemistry) "cdI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{layer = 2.7; name = "Private Function Room"; opacity = 1},/turf/simulated/floor/wood,/area/library) "cdJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;37"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"cdK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"cdK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) "cdL" = (/obj/structure/filingcabinet,/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/science) "cdM" = (/obj/machinery/power/apc{dir = 8; name = "Research Wing Security APC"; pixel_x = -24},/obj/structure/cable/yellow,/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/checkpoint/science) "cdN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "kitchen"; name = "kitchen shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) @@ -5624,7 +5624,7 @@ "ceh" = (/turf/simulated/wall,/area/medical/cryo) "cei" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Toxin Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor{icon_state = "purplefull"},/area/maintenance/storage) "cej" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/maintenance/storage) -"cek" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/cigarette,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) +"cek" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) "cel" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_off"; name = "Plasma to Pure"; on = 0},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor{icon_state = "purplefull"},/area/maintenance/storage) "cem" = (/turf/simulated/wall,/area/medical/cmo) "cen" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/medical/cmo) @@ -5654,7 +5654,7 @@ "ceL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "ceM" = (/obj/machinery/shieldwallgen{req_access = list(47)},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/engine,/area/toxins/misc_lab) "ceN" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/window/northleft{dir = 8; name = "Disposals Chute"; pixel_x = -1; pixel_y = 0; req_access_txt = "0"},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposals chute"; pixel_x = 5},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) -"ceO" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) +"ceO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "council blast"; name = "Council Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) "ceP" = (/obj/machinery/door/window/southleft{dir = 1; name = "Test Chamber"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "misclab"; name = "test chamber blast door"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/engine,/area/toxins/misc_lab) "ceQ" = (/obj/machinery/door/airlock/external{name = "Auxiliary Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) "ceR" = (/obj/machinery/telecomms/server/presets/engineering,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5683,10 +5683,10 @@ "cfo" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/maintenance/storage) "cfp" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "cfq" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/blue,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"cfr" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor{icon_state = "dark"},/area/teleporter{name = "\improper Teleporter Room"}) +"cfr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "council blast"; name = "Council Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) "cfs" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "cft" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorcomglass.dmi'},/turf/simulated/floor,/area/bridge/meeting_room{name = "\improper Command Corridors"}) -"cfu" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"cfu" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "council blast"; name = "Council Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) "cfv" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "cfw" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/tcommsat/computer) "cfx" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westleft{dir = 4; name = "Hydroponics Desk"; req_access_txt = "0"; req_one_access_txt = "30;35"},/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "greenfull"; tag = "icon-whitehall (WEST)"},/area/hydroponics) @@ -5713,10 +5713,10 @@ "cfS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "cfT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor,/area/hydroponics) "cfU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) -"cfV" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;17"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"cfV" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2O"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine/n20,/area/maintenance/storage) "cfW" = (/obj/machinery/door/window/southleft{name = "Test Chamber"; req_access_txt = "47"},/turf/simulated/floor/engine,/area/toxins/misc_lab) "cfX" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/toxins/misc_lab) -"cfY" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cfY" = (/obj/machinery/camera/motion{c_tag = "E.V.A. Storage #2"; dir = 8},/obj/machinery/requests_console{department = "EVA"; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cfZ" = (/obj/machinery/vending/coffee,/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "cga" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboard) "cgb" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) @@ -5729,10 +5729,10 @@ "cgi" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera,/obj/item/device/radio/intercom{pixel_y = -25},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) "cgj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cgk" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/bedsheet/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cgl" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"cgl" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/gateway) "cgm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) -"cgn" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) -"cgo" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cgn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/gateway) +"cgo" = (/obj/structure/dispenser/oxygen{pixel_x = -1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "cgp" = (/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold"; level = 2},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor,/area/medical/cryo) "cgq" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/medical/cryo) "cgr" = (/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "delivery"},/area/medical/cryo) @@ -5752,7 +5752,7 @@ "cgF" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "bot"},/area/teleporter{name = "\improper Teleporter Room"}) "cgG" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor{icon_state = "bot"},/area/teleporter{name = "\improper Teleporter Room"}) "cgH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"}) -"cgI" = (/obj/structure/closet/l3closet/scientist,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cgI" = (/obj/structure/stool/bed/roller,/obj/machinery/vending/wallmed1{pixel_x = -28; pixel_y = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "cgJ" = (/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cgK" = (/obj/structure/closet,/obj/item/weapon/extinguisher,/obj/effect/decal/cleanable/cobweb,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cgL" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) @@ -5765,9 +5765,9 @@ "cgS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "20;12"},/turf/simulated/floor/plating,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "cgT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cgU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/bar) -"cgV" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) -"cgW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) -"cgX" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) +"cgV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/gateway) +"cgW" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/gateway) +"cgX" = (/obj/machinery/gateway,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway) "cgY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/wood,/area/library) "cgZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) "cha" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -5776,7 +5776,7 @@ "chd" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "che" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "kitchen shutters"},/obj/machinery/door/firedoor,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "chf" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) -"chg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"chg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "chh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "greencorner"},/area/hallway/primary/central) "chi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "chj" = (/obj/structure/closet/emcloset,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5796,7 +5796,7 @@ "chx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/security/vacantoffice) "chy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "chz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Surgery Observation"; req_access_txt = "0"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"chA" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"chA" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway) "chB" = (/obj/machinery/atmospherics/trinary/filter{dir = 1; icon_state = "intact_on"; name = "Gas filter (Toxins tank)"; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "purplefull"},/area/maintenance/storage) "chC" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/medical/cryo) "chD" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/medical/cryo) @@ -5809,14 +5809,14 @@ "chK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "chL" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/mob/living/simple_animal/cat/Runtime,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "chM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"chN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"chN" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor{icon_state = "dark"},/area/gateway) "chO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{name = "CMO Maintenance"; req_access_txt = "40"},/turf/simulated/floor/plating,/area/medical/cmo) "chP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central) "chQ" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) -"chR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) +"chR" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/gateway) "chS" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/item/nutrient/ez,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) -"chT" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) -"chU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) +"chT" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) +"chU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/gateway) "chV" = (/obj/structure/sign/chemistry,/turf/simulated/wall,/area/medical/chemistry) "chW" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "kitchen shutters"},/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "chX" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) @@ -5824,7 +5824,7 @@ "chZ" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window/eastleft{dir = 1; name = "Research and Development Deliveries"; req_access_txt = "7"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "delivery"},/area/toxins/lab) "cia" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "yellow"},/area/tcommsat/computer) "cib" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #5"; req_access_txt = "55"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cic" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cic" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway) "cid" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/tcommsat/computer) "cie" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hallway/primary/central) "cif" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plating,/area/maintenance/portsolar) @@ -5888,7 +5888,7 @@ "cjl" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced,/obj/structure/showcase{desc = "A flimsy model of NanoTrasen's revolutionary genetic modifier. Novel features include a locking system to protect scientists from test subjects, and a built-in suction system to remove vomit."; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "scanner"; name = "DNA Modifier Exhibit"; pixel_y = 3},/turf/simulated/floor/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "cjm" = (/obj/machinery/newscaster{pixel_x = -30},/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cjn" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cjo" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) +"cjo" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "cjp" = (/obj/machinery/bookbinder{pixel_y = 0},/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/library) "cjq" = (/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "kitchen shutters"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "cjr" = (/obj/machinery/door/airlock/external{name = "Transport Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) @@ -5922,8 +5922,8 @@ "cjT" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Telecoms)"; pixel_x = 28},/turf/simulated/floor{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/tcommsat/computer) "cjU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit) "cjV" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor,/area/maintenance/storage) -"cjW" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/teleporter{name = "\improper Teleporter Room"}) -"cjX" = (/obj/machinery/gateway{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) +"cjW" = (/obj/structure/closet/l3closet/scientist,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) +"cjX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/gateway) "cjY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cjZ" = (/obj/machinery/light{dir = 4},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/exit) "cka" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/door_control{id = "kitchen"; name = "Kitchen Shutters Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "28"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) @@ -5955,7 +5955,7 @@ "ckA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "ckB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ckC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"ckD" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/toxins/mixing) +"ckD" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/gateway) "ckE" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/exit) "ckF" = (/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 1; name = "Medical Security Checkpoint APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/medical) "ckG" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/medical) @@ -6020,7 +6020,7 @@ "clN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "clO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/morgue) "clP" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/aft) -"clQ" = (/obj/machinery/vending/cigarette,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -29},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/teleporter{name = "\improper Teleporter Room"}) +"clQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/gateway) "clR" = (/obj/machinery/door/poddoor/shutters{id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/chargebay) "clS" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/assembly/chargebay) "clT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6521,7 +6521,7 @@ "cvu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cvv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cvw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) -"cvx" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics) +"cvx" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/gateway) "cvy" = (/obj/structure/table/woodentable,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/folder/blue,/obj/item/weapon/disk/data,/obj/item/weapon/disk/tech_disk{pixel_x = 3; pixel_y = -1},/obj/item/weapon/disk/design_disk{pixel_x = 1; pixel_y = -2},/turf/simulated/floor/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "cvz" = (/obj/structure/table,/obj/machinery/power/apc{dir = 1; name = "Robotics Lab APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 23},/obj/item/weapon/crowbar,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) "cvA" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6916,7 +6916,7 @@ "cCZ" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "cDa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) "cDb" = (/obj/structure/table,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) -"cDc" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/assembly/chargebay) +"cDc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/gateway) "cDd" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/toxins/xenobiology) "cDe" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cDf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -7274,7 +7274,7 @@ "cJT" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor,/area/assembly/chargebay) "cJU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cJV" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/aft) -"cJW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/hydroponics) +"cJW" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "cJX" = (/obj/machinery/door/airlock/external{name = "Salvage Shuttle Dock"},/turf/simulated/shuttle/plating,/area/centcom/evac) "cJY" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay3{name = "Medbay Aft"}) "cJZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) @@ -7522,7 +7522,7 @@ "cOH" = (/turf/simulated/floor/plating,/area/toxins/xenobiology) "cOI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology) "cOJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cOK" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cOK" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/gateway) "cOL" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cOM" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Aft APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cON" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) @@ -7566,9 +7566,9 @@ "cPz" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) "cPA" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape/transit) "cPB" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"cPC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) -"cPD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) -"cPE" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight,/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Gateway APC"; pixel_x = 28; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) +"cPC" = (/obj/machinery/gateway{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway) +"cPD" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Toxins"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) +"cPE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/gateway) "cPF" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge/meeting_room{name = "\improper Command Corridors"}) "cPG" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "cPH" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) @@ -9240,10 +9240,14 @@ "dvJ" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/mine/production) "dvK" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/production) "dvL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) +"dvM" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) +"dvN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/gateway) +"dvO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/gateway) "dvP" = (/obj/machinery/door/airlock/external{name = "Mining Shuttle Airlock"; req_access_txt = "48"},/turf/simulated/floor,/area/mine/production) "dvQ" = (/obj/machinery/door/window/westright{name = "Production Area"; req_access_txt = "48"},/turf/simulated/floor,/area/mine/production) "dvR" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/camera{c_tag = "Production Room"; dir = 8; network = list("MINE")},/turf/simulated/floor,/area/mine/production) "dvS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) +"dvT" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight,/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Gateway APC"; pixel_x = 28; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "dvU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/production) "dvV" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/mine/production) "dvW" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8},/turf/simulated/floor,/area/mine/production) @@ -9269,16 +9273,19 @@ "dwq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/mine/production) "dwr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) "dws" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/mine/production) +"dwt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/assembly/robotics) "dwu" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dwv" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dww" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dwx" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) +"dwy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics) "dwz" = (/obj/structure/holowindow,/obj/item/weapon/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/source_boxingcourt) "dwA" = (/obj/structure/holowindow,/obj/item/weapon/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 9; icon_state = "green"},/area/holodeck/source_boxingcourt) "dwB" = (/obj/structure/holowindow,/obj/item/weapon/beach_ball/holoball/dodgeball,/turf/simulated/floor/holofloor{dir = 5; icon_state = "green"},/area/holodeck/source_boxingcourt) "dwC" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/shuttle/floor,/area/centcom/evac) "dwD" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "dwE" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/floor/airless,/area/tcommsat/chamber) +"dwF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/assembly/chargebay) "dwG" = (/obj/structure/window/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 24; pixel_y = 24; req_access_txt = "55"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) "dwH" = (/obj/machinery/light{dir = 1},/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = -24; pixel_y = 24; req_access_txt = "55"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "dwI" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area) @@ -9461,6 +9468,8 @@ "dAd" = (/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/storage) "dAe" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "dAf" = (/obj/machinery/power/apc{cell_type = 10000; dir = 8; name = "Atmospherics APC"; pixel_x = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/maintenance/storage) +"dAg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/assembly/chargebay) +"dAh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/assembly/chargebay) "dAi" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "dAj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "dAk" = (/obj/structure/table,/obj/item/weapon/book/manual/medical_cloning{pixel_y = 6},/obj/item/weapon/paper,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning) @@ -9483,7 +9492,6 @@ "dAB" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/genetics) "dAC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "dAD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor,/area/assembly/chargebay) -"dAE" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/assembly/chargebay) "dAG" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "dAH" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dAI" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -9685,8 +9693,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaeaaeawmaaeaaeaaeaaeaadaaaaadaKBbtwaqhbrTaKBaadaaaauKawQawRawQauKawSawTawUawVawWazFawYanharuawVaxaaxbaxcaxdaxeadrakKadraadavUaxfaxgaxhaxiaxjavUaadaYhawdanfayEaZFartaYhancaxoaxwatXaweaxqaCRaxtaxraxuaCRaxvaweatXaxwavfawnawoaoaaoaaoaaoaaoaawraxAaxBaxCaxDaxEanyafcayWayYazmaygaxJaryazeazfanyaqoazeazganyazdazeazhanyaovazXanyanyaxHanyanyaxTameaxIapoaxSarNanAaxZanZayaaxYauHaycaycaydayeayfayeaooayhayiayjaykaaaaaaaadaaaaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeaadaaeaadaadaaeaaeaadaadaKBaKBbMeaqhaKBaKBaaaaaaavLawQawQawQaylaymaynaynayoaypayqayramgaqyaqEaqzaywayxayyayzadrakKadraaaavUayAayBasfaxiayDavUaaaaYhasSamwaxQaybatkaYhayIaxXatXatXawGawqatXawlawkawjatXawiawhatXatXaytatZayPatxayRaySayRayRayRayTapeayUayVatGaubauuauOavbavravsaxJanyavuaxJanyanyawwaxJanyanyawxaxJanyayCayvazjauvazlauzaxFawEawyaxGavAavAarNaDvazrazsaztanraqPazwazxazyazzamOaDxamTazCayiayjazDaaaaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeaaeaaeaaEaaaaadaadaadaKBaKBbHMbHMaqhafUaaaaaaaaaauKawRawRawRauKazGazHazIazJaypaynaroakyarfawVazNazOazPazQazRadrakKadraadazSazTazUazVazWauwavUaadaYhaqsaqtaxQaqnanRaYhaAdatWatXatXawgawfavmatXatXatXauZavdavaatXatXaAlawnaAmarsaAoaApaAoaAqaAoaAraAraAsaAtaAraqBarhasCaBKasTatrarpbfuaBOaBNaBKafbaBOaBNaBKaBLaBOaBNaBKbfZatBatzatEatCaknaukaulameaumawpaAHarNauDaAJaoGawMaqiazDaAMaANaAOaAPaLfasRaASaATayiayjaAUaAVaadaAWaaaaaaaaaaaaaAWaaaaaaaAWaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaEbmNaAZbmNaakaaaaadaaaaadaKBafVarnbGxaqhaKBaKBaadaaaavLaBaaBbaBcavLaBdavQavRawVaBfaynaBgakyaBhawVaBiaBjaBkaBlbtbadrakKadraaaaBnavUaBoaBpaBoavUavUaaaaYhbggbgHbgjbgcbgfaYhayIaEhaEgaEgaEjaElatXatXaEmatXatXawqaFqavcavcaCTaEfaCSaoaaoaaBDaBEaoaaBFaBGaBGbeTaBGaBHanybFibEBamebDMbDLameamebDKameamebngazbameameamebDKameameaAFaxTavGbGwbGsbGsavvavGameaumbFjbfjarNaBZaAJaAKawMaCabtabnhaCdaAObfvasPasPaCfasPasPaCgbeQaCiaadaaaaaaaaaaaaaaaaCjaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXbmNbJAbmNaadaadaadaadaadaKBbrTbrTbrTarVbaQaKBaaaaaaaCmauJaCnauJaCoaaaaadaadaCpaCqaCraCsbgGaCuawVbglbgmaCxaCyaCzadrbIUadraaabbxaaabgobgnbgoaaaaadaaaaYhbhCbgqbgpbhsbhFaYhayIatWaEeatXaweaJBaCRaFraGTaJFaCRaxsaweatXaCUavfawnawobgTaCWaCWaCWaCWaCWaCWaCWaCZaCZaCZanybhybhzaDcbqhbpRaDcbntbghaDgaDcbnlaDhaDcbhoaDcbgdaDjaDjaDkaDlaDmbIjbIybIebIibHWbIdbHVbgiaBYarNbgFaDwbgDbgkbgeasPaDAaDBaAOaDCasPaDDaDEaDFbqvaycaDHazDaadaaaaaaaadaadaadaadaadaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaEbmNaAZbmNaakaaaaadaaaaadaKBafVarnbGxaqhaKBaKBaadaaaavLaBaaBbaBcavLaBdavQavRawVaBfaynaBgakyaBhawVaBiaBjaBkaBlbtbadrakKadraaaaBnavUaBoaBpaBoavUavUaaaaYhbggbgHbgjbgcbgfaYhayIaEhaEgaEgaEjbqpatXatXbvlatXatXbycaFqavcavcaCTaEfaCSaoaaoaaBDaBEaoaaBFaBGaBGbeTaBGaBHanybFibEBamebDMbDLameamebDKameamebngazbameameamebDKameameaAFaxTavGbGwbGsbGsavvavGameaumbFjbfjarNaBZaAJaAKawMaCabtabnhaCdaAObfvasPasPaCfasPasPaCgbeQaCiaadaaaaaaaaaaaaaaaaCjaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXbmNbJAbmNaadaadaadaadaadaKBbrTbrTbrTarVbaQaKBaaaaaaaCmauJaCnauJaCoaaaaadaadaCpaCqaCraCsbgGaCuawVbglbgmaCxaCyaCzadrbIUadraaabbxaaabgobgnbgoaaaaadaaaaYhbhCbgqbgpbhsbhFaYhayIatWaEeatXaweaJBaCRbBfbBgbBpaCRaxsaweatXaCUavfawnawobgTaCWaCWaCWaCWaCWaCWaCWaCZaCZaCZanybhybhzaDcbqhbpRaDcbntbghaDgaDcbnlaDhaDcbhoaDcbgdaDjaDjaDkaDlaDmbIjbIybIebIibHWbIdbHVbgiaBYarNbgFaDwbgDbgkbgeasPaDAaDBaAOaDCasPaDDaDEaDFbqvaycaDHazDaadaaaaaaaadaadaadaadaadaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXbmNaAZbmNbmNaDIaDJaDKbmNaKBaKBaKBaKBbrTaqhaKBaadaaaaaaaaaaaaaaaaaaaaaaadaadaDLaDMaDNbjoaDPbjpawVbihaFeaFfaFfaFfadrbfWadrbdMbhJbhIbhLbhKbhTbhSbjnbjmaYhblabhPbhObhGbkUaYhayIatWaEnatXatXayKaEiaweaJMaJIaEkaJLatXatXaEnavfawnawobgTaCWbkTaEpbtxaEraEsbkvaCZaEubnvaCZanyanyanyaCZbtraCZaCZbaabaabaabnubaabaabhEbaabaaaEDaEDbtqbiobjwaEDaEDaEDaEDbhAasPasPasPasPasPasPbtmbgUbtpasPasPbgWaDBaAOaENaEOaEPaEQaoGaERaESawMazDaadaAWaadaadaaeaaeaaeaadaETaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbmNbmNaEUbJJaEWaCkaCkaCkaEXbJFaEYaEZaKBaKBaqhaKBaadaFaaFaaFaaFaaFaaFaaFaaaaaadawVawVawVblgbmIawVawVbmLblmblHblVbpfbkKbhhbkfbpebjBbjAbbcbjzbaXbkRbkPbkNaYhaYhbkMbkLaYhaYhaYhaLTatWatXatXatXatXatXatXaLVatXatXatXatXatXaFsayOatZaFtaFuaFuaFvaFwaFwaFxaFyaFzaCZbnwbnxboHboCbpcbpbbpdbtDbubaCZbjsbjrbjubnEbaabjvbjxaZCbaaaEDbJCaFSaFTaFUaFVbjqaEDaEDbJBasPaFYaFZaGaasPaGbaGcbhgaGeaGfasPaGgaGhaAOaGiasPbhfaGkaGlaGmaGnaGoazDaadaaaaaaaadaGpaGqaaeaadaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbmNaEUaEUaGraCkaCkaCkaCkaCkaCkaGsaEUaGtaKBaqhafUaadaFaaFaaFaaFaaFaaFaaFaaaaaadaGubaWbsebaVbaybrGbbUbaxbaTbaUbaRbjHbbjbbibskbkWbbnbbmbslbbrbbbbbabbdbbcbbcbdtbbhbdvbsjbcPbcVbddatWaFsaadaGWaGXaGYaGZaGYaHaaGYaHbaGWaadaFsavfawnawoaCWaHdaHeaHeaHeaHeaHeaZXaCZbjFbjGaICbjybjtbjtbjdbjbaIHaCZbaabaabcEbjEaZHaZGbjDaZCbaaaHvaHwaHxaHyaHzaHAaHBaHCaEDatJasPaHDaHEaHFaHGaHHaDBbbQbbPbbLaHJaHKaHLaHMaATaHNaHOaHPaHQaHRaHSawMazDaadaaaaHTaadaaeaaeaaeaadaadaAWaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9695,58 +9703,58 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaKqaCkaCkaKraCkaCkaCkaCkaCkaCkaCkaCkaKBaKBaqhaKBaadaFaaFaaFaaFaaFaaFaaFaaKsaKtaKsaKuaJnaKvaKvaKwaKvaIebeKbeLbftaKAadradradradradraQWaKBaaaaaaaadaaaaJzaKCbfsaKEbInaKGaKHaJzaKIaxXaFsaadaKJaKKaGYaJGaJHaJGaGYaKLaFsaadaFsbezawnawobswaIxaIyaIybsGaIyaIyaKMaCZaNuaIFaIFbmWaNxbnabnbaIGbneaCZbctbeCbeEbeDbeGbeFbeHbcEbexaLaaLbaKaaKbaKcaKdaKeaLcaEDatJasPaKgaKgaKhasPbfebfobbPbeMbfpaKlaHRaAKaAObsvaLfbfqaLhaATayiayjaAUaLiaadaAWaaaaaaaAWaaaaaaaaaaaaaAWaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLjaLkaLlaadaLmaCkaCkaCkaCkaCkaCkaLnaCkaCkaCkaEXaKBaUDaqhaKBaadaFaaFaaFaaFaaFaaFaaFaaLoaHWaLpaLqaJnaLraKuaLsaLtaLubBAbBIbBkbBrbqrbqnbqJbqHadraQWaLCaadbBLbpQbCdbBPaLHbfsaLIaLJaLKbukaLMaLNaLOaFsaadaFsaFsaLPaLQaLRaGYaLSaFsaFsaadaFsavfawnaAmbqKaNrbmQaJOaJOaJOaJOaLZbANaMbaMdaMdbrCbrAbrbbqYaMibDWaCZbaabaabqLbdwbaabdxbDdbCCbaaaINaIOaMqaMraMsaMtaKeaMuaEDatJasPaKgaKhaKhasPbsgbsdbsibshbuuaMzaMAbALaMCaMDaMDaMDaMEaMFayiaMGazDaaaaadaadaadaadaadaadaadaadaadaadaadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiZaMIaMJaMIajcbmNaCkaCkaCkaCkaCkaCkaCkaCkaCkaCkaMMaKBbwqbwraKBaadaFaaFaaFaaFaaFaaFaaFaaKsaMOaKsaKuaJnaKvaKvaKwaKvaIebcHbEobEsaMRbtKbsUbsobsnadraQWaMWaaabFZbFYbFKbFFaNbbfsaNcaNdaNebEzaJzbsmatWaNnbDoaNnaFsaFsaNkaNlaNkaFsaFsaNnbDoaNnavfawnaRnbswbuPaIyaIyaIyaIyaIyaNsaCZbtMaJSaNvbtLaNxaNxbnbaJVaNyaCZbHhbGDbqLbsCbDBbGDbaabHbbaaaNDaNEaNFaNGaNHaNIaNJaNKaEDatJarNaNLaNLaNLaNLbBdbuTauHbuFbtHaNQaNRbuUaNTaNUaNVaNWaNXayhayiayjaNYaaaaaaaadaaaaaaaaaaaaaadaaaaaaaNZaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajCaMIaObaMIajCbmNaJiaEUaCkaCkaCkaCkaCkaCkaCkaEUaOcaKBaqhbrTaKBaadaFaaFaaFaaFaaFaaFaaFacdhaOecdhaOfaJnaKvaSpaSqaSraSsbKgaIebJraKAbvPbvzaOnbwuadraQWaMWaadbFZbIRbITbISaOtbveaLIbIGaLIbYhaJzbJoaOyaSDaadaNnaSEaFsaFsaSFaFsaFsaRoaNnaadaSDbqDawnawoaCWbvNaOHaOIaOIbwIaOKbvLaCZbwJaIFbwNbwLaKRbtLbwOaJVaOQaCZbaabaabwKbKjbaabKmbaabKlbaaaEDaOVaOWaOXaOYaOZaPaaEDaEDatJarNaPbaPcaPdaPebBhbuVasPasPasPaPhaPibwvaPkbwtasPaPmaPnawMawNaPoasPbtCaadaadaaaaaaaaaaaaaadaaaaaaaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaQNaPqaPraPsbmNbmNaCkaEUaEUaEUaEUaCkaCkaCkaCkaEUaEUaKBarVagvafUaadaFaaFaaFaaFaaFaaFaaFaaPtaHWaPuaPvaJnaKvaKvaKwaKvaIebKgaIebygaKAbyfbyebydbxcaKBbtGaMWaaabFZbKwbKvbKuaPKbfsaPMaPNaPOaLIaJzaTPatWbDoaadbqEaPUaPVaPWaPXaTUaPZaTTbqEaadbDoavfawnaQcaCWaQdaQeaQfaQfaQgaNsaQhaCZbzFbztbztbzsbzwbzvbzBbzzbzDbzCbyibyhbyjbHmbaabaabaabaabaaaEDaEDaQraEDaEDaEDaEDaEDaQsatJarNaNLaQtaQubzxbzfbBaasPbxRbzuaQBbwabzjaQEbxQasPbxPaQHavEasPasPasPaadaadauBaQIauBauBauBauBauBauBauBauBbtJaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajCaMIaObaMIajCbmNaJiaEUaCkaCkaCkaCkaCkaCkaCkaEUaOcaKBaqhbrTaKBaadaFaaFaaFaaFaaFaaFaaFacdhaOecdhaOfaJnaKvaSpaSqaSraSsbKgaIebJraKAbvPbvzaOnbwuadraQWaMWaadbFZbIRbITbISaOtbveaLIbIGaLIbYhaJzbJoaOyaSDaadaNnbBtaFsaFsaSFaFsaFsaRoaNnaadaSDbqDawnawoaCWbvNaOHaOIaOIbwIaOKbvLaCZbwJaIFbwNbwLaKRbtLbwOaJVaOQaCZbaabaabwKbKjbaabKmbaabKlbaaaEDaOVaOWaOXaOYaOZaPaaEDaEDatJarNaPbaPcaPdaPebBhbuVasPasPasPaPhaPibwvaPkbwtasPaPmaPnawMawNaPoasPbtCaadaadaaaaaaaaaaaaaadaaaaaaaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaQNaPqaPraPsbmNbmNaCkaEUaEUaEUaEUaCkaCkaCkaCkaEUaEUaKBarVagvafUaadaFaaFaaFaaFaaFaaFaaFaaPtaHWaPuaPvaJnaKvaKvaKwaKvaIebKgaIebygaKAbyfbyebydbxcaKBbtGaMWaaabFZbKwbKvbKuaPKbfsaPMaPNaPOaLIaJzaTPatWbDoaadbqEbBvaPVaPWaPXaTUaPZaTTbqEaadbDoavfawnaQcaCWaQdaQeaQfaQfaQgaNsaQhaCZbzFbztbztbzsbzwbzvbzBbzzbzDbzCbyibyhbyjbHmbaabaabaabaabaaaEDaEDaQraEDaEDaEDaEDaEDaQsatJarNaNLaQtaQubzxbzfbBaasPbxRbzuaQBbwabzjaQEbxQasPbxPaQHavEasPasPasPaadaadauBaQIauBauBauBauBauBauBauBauBbtJaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaQNaQKbzWaQMbmNaEUbueaEUaQPaEXaEXaEUaEUaEUbuwaQRbueaKBasdbKdaKBaadaFaaFaaFaaFaaFaaFaaFaaaaaaabpMaPvaQTaJoaJpbnIaSrbmXbopbozbKKaQVaQVaQVaQVaQVaKBaQWaQXaadbpTbpQbpVbpUaRbbhjbhMbhxbikaLIaJzaJAatWaSDaadaSDaRiaRjaRgaLWaNgaNiaNjaSDaadaSDavfawnawoaCWaRpaRqaRrbliaIxaNsaQhaCZblhbpWaRwaRxbphbuHaRybuGaRAaCZbqkblJbplbqcbqbbKLaRHasMasMasMasMbLbasMaRJasMbLaasMasMbimaRLaNLaRMaRNaROaRPaRQasPbvcaRTaRUblRbinbipaRYasPbiqbqRbqNauybLcauyaScauBbirauBatLatMaSfatMatOauBbiratPauHaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaSgaQNaQNaShaSiaQNaQNaQNbvfaQNblSblSblSblSaQNaQNbvnaQNaQNaQNaSoaQNaadaFaaFaaFaaFaaFaaFaaFaaaaaadaZpbsfaJnaKvaKvaKwaKvaIeaJuaIebvgaQVbmObmfaWcaSyaKBaQWaKBaaaaaaaadaaaaJzaSzbisaSBaJzaJzaJzaJzaJAatWaSDbDoaSDaSDaSDaNmaNpaOAaSDaSDaSDbDoaSDbwMbwRbvsaCWaCWaCWaCWaCWaSJaSKaSLaCZaRubitaRwaSNbsRbvraCZaCZaCZaCZbaabaabaabaabaaaQsaSQaQsaSRaUobwTaQsaQsbiBarNbivarNarNbnBaSZaNLaTaaTbaTcaTdaTeasPaTfaTgbwSaPiaTibiuaTkaTlaTlaTlaTlaTmaDQasPaTnatMaToatMauGasPasPasPaTnatMauGatPasPaadaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaTpbtybtfbthbtibtjaTsaTtaTsaTsaTsaTsaTuaTsaTvaTwaTxaTyaTzaQNaadaaaaFaaFaaFaaFaaFaaaaaaaaadaZpbuKaJnaKvaKvaKwaKvaIeaTAbumbujaTDaTEaTFaTGaTHaKBaQWaKBaKBaKBaKBaKBaKBaKBaKBaKBaJzbuhbuiaJzaTJaTKaZLaTMaTNbugaZLaOCaTQaOBaZLbdabidbltaPSaTVaTWaTXbxBbuMbLGbxSaCWbswbuObswaCZaCZaCZaCZbAybzZaCZaCZbwybvQbmyaUhbLIaUiaUibNBaUkaUlaUmaUnaUobOoaUqbOebiCbiEbjCbjRbjXbkeaUwaNLbwVbwYbwZbxuaUBasPblkbmHbmHaUEasPaPkbkqaTlaODaPGaPpaTmasPasPasPasPasPasPasPasPaDUasPasPasPasPasPasQaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaULbwBbPDaUNaUMaUMaUMaUMaUOaQOaQOaUPaUMaUMaUMaUOaQOaUQaURaQNaadaadaadaaaaaaaaaaaaaaaaadaadaZpbxlaJnaKvbVqbxaaGDbxgaGDaUWbqmbqqbqlbqjbqdaVcaKBbPBbqeboZboZboZbpzboZbpsbNHboYboeaVjbwXbmAaVmaVnaVoaVkaVkaVkbppaQbaVsaPYaVtaVkaVuaVvaRhaVxaVyaVzaVAaVBaVCaVDaVEaVDaVFaVDaVGaVDaVHbzqbpXbzrbtcbzYbzYbATaVLaVMaVMaVMaVMaVNaVMaVMavAavAavAavAaVOavAarNbtdbtsbufarNbttarNaNLbqTbAzbqMbAzaNLasPasPasPasPasPbqibsbbqIblFbeSaWdaWeaTmbcebcebcebcebcebcebcebcebcebcebcebPRaszbPRaszaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSgaAXaQNaWgaQNaQNaQNaTpaWhaTpaWiaQOaQOaWjaTpaWhaTpaWkaWlaWmaWnaKBaKBaKBaKBaWpaWqaWraKBaKBaKBaKBaZpaMmaOiaKvaKvaIgaKvaOkaOpaOmaOlaQVaQVaQVaQVaWzaKBaOhaKBaKBayHayHaKSayHayHayHayHaWCaWDaOgaWEaWFaWGaWHaWEaWEaWEaKQaWWaWLaWKaWKaWKaWMaWNaAiaWPaWQaWRaWSaWTaWKaWKaWKaWKaWUaWKaWKaWKaWVaWKaWWaWKaWXaWKaWKaWYaVZaVMaXaaXbaSnaXdaOaaVMaXfaXgavAaXhbjcavAarNarNarNarNarNbhvaXjaXkaXlaXmaMgaSjaYZaSmaNMaRlaVPaRmaXvaVlaXxaXyaXzaXAaXBaTmbceaTmaTmaTmaTmaTmaTmaTmaNCaTmaTmaTmaTmbhuaTmaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaNBaPBaXEbeNaXFbhtaXHaVgaXIaXFbeNaXJaXKaQNaXLaXMaBqanFaXOaXOaXOaXOaXOaXOaXPbffaXRaZpaJWaKzaJXaLdaKPaSeaNqaHgaLeaLFaHgaJyaJNaHgaMnaMNaMPaMHaMKayHaJvaIUaJtaJRaJTayHaYoaMSaUCaUsaUsaUgaKiaJUaUFaUsaKOaAhaUgaUsaUsaUsaUsaUsaUsaUgaYyaSYaSYaSYaSYaSYaSYaSYaSYaSYaSXaTOaTjaSYaUtaSXaUuaSYaTOaYGaRkaVMaYJaYKaUraYJaYLaVMaXfaYMaYNaYOaXiavAaSaaRSaRFavAaYSaSdaTmaSbaRZaRXaRWaYXaYYaSWaSWaSWaSWaSWaSWaSUaSVaSxaSAaSkaZfaTmaMlaTmaadaadaadaadaadaaaaadaadaadaaaaTmaszaTmaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaadaaaaaaaaaaaaaULaWhaZhaSlaSlaSlaSlaZiaWhaULaaaaQNaZjaZkaZlaZlaZlaZlaZlaZlaZlaZlaZmaNaaKBaHgaHgaHIaHIaHIaHgaHgaPQaHgaNfaPJaMNaOxaQqaQyaQCaGRaOUaFhaOjayHayHaMUaFBayHayHayHaQSaYpbRAaZNaZNaZNaZNaZNaZLaZLaMTaZLaYgaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXpaZTaZTaZUaZTaZTaZTaZTaZTaZTaEMaYpaRkaVMaYJaSOaSSbbJaXeaVMaXfaXiavAbacbadavAbbMaThaUnavAbkYbkZaXuaXCbaiaXXbakaMZbambaobaobapbaqbarbarbasaZbbatbaubavbawaTmaPCaTmaTmajCajcaaaaaaaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaAbaBbaCbaBbaDbaBbaBbaDbaBbaCbaEbaFaQNaZjaSHbaHaSIbaJbaKaSwbaMaSGaZlaZmbaObaPbktaOvaOwaOvaOvaOMaOvbkxaHgaMxaOLaOzaPyaPzaMXaPxaOTaOUaKWaKYaLyaLzaLvaLwaKZaLgayHaWCaYpaXoaZNaMfaMeaMcaLBaZLaMkaMhaTLaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaZTaDzbbybbzbbAbiebbCaDTaZTaWabbFbbGaVMaOqaYJaStaOrbbKaVMavAaWZavAavAavAavAaUqaQsbbNavAbbOavAaTmaTmaTmaWwbbRaMvbbTaMpbbVaYZbbWbbXbbYbbZbcabcbbbYbccbcdaTmbjjbcfbcgbchbchbciaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaAbaEbaBbcjbckbckbclbcmbcnbcobcpbckbckbcqbcraTpaZjbcsaGVaInbcvbcwbcxbcybczbcAbaeaZxaCCaIbaIbaIaaHuaHqaHgaHgaHgaHgaGPaHsaHraGNaGOaGHaGQaFCaFDaHraHfayHaFoaFAaFBayHayHayHbcUbbFaEGaEIaEHaFlaEJaFmaZLbbqaEvaEFaadaadbdeaIjbdfbdjaZPbdhbdibdjaZPbdhbdkbdkbdlaadaadaZTaCBbdnbdobdpbdqbdrbdsaZTaIpaYpaHmaVMaVMaJQaHUaHnaVMaVMbkbaGxaGAbdBbdCavAavAaYEavAavAbdEaImaGEaGyaTmaIkaGBaFIbdKaGwaTmaGCbdNaAgbdPbdQbdRbdSbdTbdUbdVbdWaYDaZobdYbdZbeabebaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbecbedbeebckbefbckbefbckbefbckbefbckbegbehaXFaZjaFcaZlaFGbekbelbembenaFHaZlaXQaYBberaFQaFPaFXaFWaGdaFOaFKaFEaFMaGjaGzaGvaFjaFkaVYaFgaFnaFpaFhaFiayHayZaxmayFazZaAcayHaWCaYpaCIaZNaCFaEdaEcaDfaZLaAEaAjaTLaadaadbeVaKxaEEaDdaBebfaaxlbfcaAYaBmaECaJxbfhaadaadaZTbfiaClbfkbflbdqbbCaDVaZTaEMbfnaFbaDYbfAbfxbfybfwbfAbfAbfAbfybfAbfAbfAaDGbfAbfAaxkayubfwbfxbfAbfxaxpaDRbfAbfBbfCaEKbfEaTmaTmbfFaTmaTmbfGbfHbfIaELbfKbfLbcebcebfNbchbchbfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfPbckbckbaCbckbefbckbefbfQbefbckbefbckbegbehaXFaQQaQpaZlbfSaQnbfUbfVbfUbaHbaHarMbfXbfYaHgaKVaKUaKTaReaKNaKFaKDaHgaJgaKyaRcaGNaJwaHgaLGaLxaRKaRzaLEayHayHaIMayHayHayHayHaWCaYpbRAaIDaIBaIlaIiaIAaIzaIhaHpaTLaZPbgyaZPaOEbgsbgwbgubgvbgtbgsbgubgwbgvaNAaZPbgyaZPaZTaYtaYtaYtaNobgAbgBbgCaZTaPlbgEaPjaPPbgJbgIbgJbgKbgJbgJbgLbgMbgMbgNbgMbgMbgMbgMaHoaQmbgObgPbgQbgRbgSaQFaQDaQvbgVaQwbgXbgYbgZbhabhbbgXaTmbhcbhdaQxbfFaQzaQAaQGbhiajCaDZaaaaadaaaaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbhkbedbeebckbefbckbefbckbefbckbefbckbegbehaXFbhlbhmbhnaPfbhpbhqbhqbhraMQaPwbcCbepbhwaHgaIJaILaIKaNPaIoaIIaIwaHgaHcaHtaNNaPgaIfaHgaZqaJPaNSaZqaHgayHaGKaGFaGIaFJaFLayHaWCaYpaHlaZNaHkaHjaHiaHhaGSaGMaGLaKobhUbqxaPHaNhbgubgubgubgubhZbgubgubgubguaCEaBCaMBaZPaLAaJYaMabifbigaKjbiibijaZTaKmbilaKnaLDbiwbiwbiAbixbiAaMYaKXaNtbiwbixbiwbiAbiwaLLaFFaOGaOFbiyaNObiwbiybiAaMoaMybiDaMwbgXbiFbiGbiHbiIbiJbgXbgXbiKbiLbiMbiNbiObiPbiQbiRbiSbgXbgXbgXaadaaaaaaaadaaaaaaaadaadaadaaaaaEaaaaaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbiUbaBbcjbckbckbiVbckbiWbiXbckbiYbckbcqbiZaULaZjbjabmsblLbmmbjebjfbjgbmMbmRbmPbjkbjlaHgaZraZqaZgbabaHgaHgaHgaHgaHgaHgaHgblxaHgaHgaYjaYkaZRaZSaYqayHayHayHayHaZJayHayHblBaYpaZVbleblebleblebleblebleblebleaZPaZOaZMbhBbjMbmSbjIbhVbjKbjIbjIbjLbjMbjNbjObjPaZPaZTaYtaYtaYtbjQaYtaYtaYtaZTbmTaYpbahbjSaWxbjTbjUbjVaVWbjSbagbjSbjSaVibjSbaSaVbbjSbbebjSbjSbkcaVabkbaUZbkgbkgbkhbkibkjbkkbklbkmbknbkobkpaUvbkrbksbmdbkuaVRbkwbtubkybkzbkAbkBbkCbgXaadaadaadaadaadaadaadaaaaaEaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbaBbaCbaBbaDbaBbaBbaDbaBbaCbiUbkDaQNbkEbkFbkGaQNbkHbkHbkIbkHbkJaQNaZcaXYaZdbjZbkVaXZaYbaZebkObkXaYcaYdaXUaYebkXaYWbjJbkObkQaXraZabkVaWAaZsbkXaXUaYIaZybkXbjYblbblcaWJbleaWIaXSaXGbleaXwaXWaXTbtIaPLblnbloblpblqbeoblsaUYblublvblwblrblqblyblzblAaPTaZTblCblDblEbigaPRaYtbljaZTaZQaYpblIbjSbjSbjSbjSbjSbjWbjSaUAbjSbnzblKblfaZIblNaUzaZDblObjSaWBbkdbkdbafbkgbkgblTbkiblUaUvblWblXblYblZbmabmbbmcbksbmdbmeaUdbmgbmhblXbmibmjbmkbmlbkabmnbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTpaWhbmpaSlaSlaSlaSlbmqaWhaTpaaaaQNaZjbmrbkGaQNbmtbtzbmvbmwbmxaQNbooaZvboIboGboFaBwbcBbbEbmEbmCbmFbmGbmCbmCbmCaJCboMbmCbmBbmDaZwbmJbmKbmKbmKbmKbcZbcWbmKboXbBebBfbdcbpHbdLbbfbbfbdbbbfbbfbeUbtIaQYblqbmYbmZbeRbfbbncbndblGbndbnfboPboybnibnjbnkaSCaZTaBxbnnbnobnpbnqaZTaZTaZTaEMbnrbnsbjSbfTbfrbfzbgabgbbjSbnybjSbrnbhDbgxbhRbnAbnAaTCaZAbjSahrbkdbalaZEbgrbkgbnFbnGbnHaZBbnJblXbnKbnLbnMbbSbnObnPbnQbnRaUdbnSbnTbnUbnVbnWbnXbnYbqpboabobbocbodbodbmoaadaaaaRDaaaaRCaaaaaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaSgaPBaQNaXFbzWaXFbajbofbogbohaXFbzWboibojaQNaZjbkFbkGaQNbolbombmwbmwbonaQNbpPaZtboqbmVbmUbvhbotbosbvGbzbbySbosbosbosboxaIqbnCbosbosbvGbvhbySbosbosbosbnNboubosbosbnDboAboBbbsblebbpbblbbfbbkbbfbbvbbubtIbtIboJboKboLboLboLbjhboNbndboObjiboLboLboLboQboRaZPaZTaQaboTboUboVboWaZTbnZaXNbaYbpabnsbjSbbwaRvbnAbbBbbIbpgaWybpibpjbnAbnAbnAbpkbnAaTCblObjSbpmbkdbpnbpobcubkgbpqbprbnHaUvaYmbptbpubpvbpwbgXaQibksbmdbpyaYfbpAbpBbpCbpDbpEbpFbpGbfJbmnbpIbpJbodbpKbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaadaadaQNaULaWhaULaWiaQOaQOaWjaULaWhaULbpLbrsbpNbkFbkGaQNbpObpObkIbpObkJaQNaSvaSubduaKBaKBbovaKBbdgbcXbcSbcJbdgbcXbpYaKBaMjbqabaIbazbaGbaLbaNbaIbazbaGbqabaIbazbaGbqabqgbboaQlaRfaQoaTqaSTaTBaSTaPEaPDaQjaPFaQkbqsbqtbbgbqtbqtbquaTrbqwboLboLbdyboLbqxbqyaZTbqzaRBbqAbdqbqBbqCaZTbdXaYtaEMbqFbqGbjSaUybnAaUxaTYaUabjSaREbjSaSMbnAbnAbqObqPbqQaTCaRabjSbnBbkdbkdaSPbkdbkgbqUbqVbqWbgXaRdaRsbqZbraaRtbgXbrcbrdbrebrfbrgbrhbnUbribrjbrkbrlbrmbeibrobrpbrqbodbodbmoaadaacaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTpaQUbrsbrsbrtaQOaQObrubrsbrsbrvbrwbrxbrybrzaXVaYaaYlbrDbrEbrFaYnaXqaXnbrJbrKaKBbrLbrMaKBaBraAkbrPbrQaUVaUUbpYbrSapvbqabrUbrVbrWbrXbrYbrZbrVbsaaYibscbrVbwFaXcbqgaYpbCxbleaONaOSaOPbleaOOaOoaNwaMVbtIaOJbspboLbsqaZubssbssbssaYRaYQaZnaYUboLbsxbsyaZTbszbsAbsBaZzbsDbsEbsFaYxaYtaEMbqFbsHbjSbjSbjSbjSbjSbjSbjSaDWbjSbjSaPIaRvbnAbnAbnAaPAbsKbjSbsLbsMbkdbkdbkdbkgbsNbsObsPbsQbsQbsQbsSbsQbsQbsTbmcbsVbmjbsWaYraYsaZYaZWaZYaZWaZZaZWbanbmnbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaULaUbaUMaUcaUfaUeaUeaUTaUeaUSbtkbtgbtlbfMaUIbtnaPfbtobqfbqSbpxbpSbfRbrIbrHbtvaKBbtwbrBaKBbrObrNbtAbrQbtBbmubpYaYCaGGbqaaYFbrXbrXbrXbrYbrXbrXbrXbrXbrXbrXaUXbaLbqgaYpbRAaWvaVTaVSaVQbleblebeXbeWaVIblebtNbtObtPbssbndbndbtQbtRbtSbtTbtTbtUbtVbtWbtXbtYbdqbtZbuabgzbucbudaZTbhHaYtaYPbqFbqGbsIaVKaYTaVqaVXbhNaVUaVVaWfbjSbhXbhWbhWbhWbhWbhWbhYbjSavAbnBaQsaQsbrRbuobupbuqburbupbupbusbutaYVbuvbiabuxbuybuzbuAbuAbuBbuCbuDbnVbuEbizbicbibboabobbuIbuJbuJbmoaadaadaWsaadaWuaadaWtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQNaQNaWgaQNaQNbuNbojaQNbuNbojaQNaQNaQQbejbuQbuQbuQbuQbuQbuQbuQbuRbuQaNzaKBaKBaYuaYvaWoaWoaKBaKBaKBbtBbtBbrPbrQbuWbtBbpYbpYaZmbqabuXbrXbrXbuYbuZbvabvabvabvabvabvabvbbeYboAbvdaYwbleaVJaVpaVebleaUHaUHaUHaUGblebvibvjbqtbvkbvlbvmbfdbvobvpbvqbfmbfgboLbvtbvuaZTbvvbvwbdqbvxbdqbvyaZTbeZaYtaEMbqFbqGbsIbulbulbulbulbulbulbvAaTSbvCbvBbvBbvBbvBbvBbvBbvDbvEbvFbowbvHbvHbvIarNbvJbvKaTIbvMaRRbvOaYzaYAbvRbiNbvSbvTbvUblXbvVbvWbvXbvYblXbvZaRVbwbbfJbmnbpIbwcbwdbwebmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWbwgbwhaZjbwibuQbwjbwkbwlbwmbwnbwobwpbuQdzVbrTbwsaWocfMbNCaWobwwbwxbKEbwzbwAbrPbrQbwzbwAbMmbpYaZmbqabwCbwCbwCbrYbtEbwDbwDbwDbwEbwFbwGbwHaXcbqgaYpaZKblebleblebleblecbOcbJcbNcbFblebwPbwQaZPaZPaZPcgVcgWcgWcgWcgXaZPaZPaZPbwUbwPaZTaZTbtYaZTaZTaZTaZUaZTcgSaYtbwWbqFbGOcgUcjRbxbbxbbxbcbPbxbbxdbxebxebxebxebxebxebxebxebxfckoavAaUoaQsaQsbxharNbvJbxibxjbxkcfebxmbxncjTbxpbxqbxrbxsbxtcjVbxvbxwbxxbxyblXbvZcfibxAcegbrobrpbxCbuJbuJbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbxDbxEbxFaZjbxGbuQbxHbxIbxHbxJbxKbxHbxLbuQbxMbxNbxOaWobKYbKWaWocepaKBbMlbxUbxVbrPbrQbxUbxVbMjbpYaZmbqabxWbxXbxXbxYbtEbrVbrVbrVbxZbyadCzbybbqacjocbhcbkcbAcaPcaOcbacbgcaPcaOcaPcaTcaZbykbylcjIbynbyobypbypbypbyqbypbymbyrbysbytbyubyvbyobyocjJbywbyxbyybyobyAcfLbyCbyDbnsbyEbyFbulbyGbulbyHbulbyIbulbyJbyKbyLbyLbyLbyLbyLbyKbyMavAdCyaQsaQsbxharNbxpbxpbyPbxpbxpbxpbyQbxpbxpbxqbyRdzUbiJbiJbiJbyTblXbvXblXbvZbyUbwbbfJbmnbmobmobmobmobmoaadaaaaaEaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfcjrdzTcjraZjbyVbuQbyWbxHbxHbyXbyYbyYbyZbzadzSbzcbzdaWocfhbRyaWobzgbzhbKEbzibwAbrPbrQbwzbwAbKDbpYaZmbqacffbwCbwEbzkbzlbzmbznbzobzpbrVbrVcjpbqabycbYobZfbXCbzPbZzbZJbZrbZybWbbWcbVXbVYbWkbWHbzHbzGbZObzIbzIbzJbzKbzIbZObzMbzNbzObzPcaDbZWbzPbzSbzTbzUbzEbzPbzVcftbzXcjwcjtcjHcjxbAabAbbAcbyHbAabAdbAcbAebMibAgbAhbAibKFbAjbAfbAkavAavAavAaQsbxhbZjbxpbAlbAmbAnbxpbAobApccQbxpbArbAsbAtbAubiJbAvbxyblXbxwbAwbAxcelcgRbibboabobbAAbABbACbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbADbAEbxFbAFbAGbAHbAIbAJbxHbAKbxHbxHdCxbuQcerarXagvaWocesaWoaWoaKBaKBbKzbAPbxVbrPbrQbxUbxVbKybpYaZmbqabARbrVbrVbASbtEbrVbrVbrVcjbbAUbrVcjdbqabAWaYpbCxbSAbSAbUNbUSbUXbSAbSAbBqbBqbTDbUhbBqbBjbBibVjbBlbBmbBnbBobBlbVibBibBjbBibBqbVrbVpbBqbBqbBtclQbBvbBqcfVbBqbBxbBybBzcgMbBBbBCbBDbBCbBEbyKbBFbyKbBGbBHcjhbvBbBKbvBbUybBMbBNavAbKCavAaQsbxhaQsbxpbUAbBRbBSccobBUbBVbUzbxpbArbAsbAtbAubBXbAvbBYblXbxwbAwbvZceibwbbfJbmnbpIbCabCbbCcbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWaULbwhaZjbyVbuQcmJbCebCfbCgbChbxHbCibuQbAMbCjarVarXdAeaKBcjPcljaQZcOZduNduHduRduUduHbKEduMbpYaZmbqabwCbwCbwCbASbtEbCtbCtbCtbqabqabCubqabqabCvbCwcaVbSAcllckrckIcjYbDQcbicNecvGcvOclmbBqaadbCDcPFbBlbBlbCFbBlbBlcPRbCHaadbBicOKcPCcPDcPEbBqbBqbBqbBqbBqchNbBqclnbCObqGbsIbCPbCQbCRbAebulbCSbyFcnhbVtduXbCVbulbulbCWbsIbsIbCXavAavAavAavAbxhaQsbxpbCYcigcidcimbDccmVcmUbupbiPdAfbDgbAubiJbAvbDhblXbDibAwbvZchBbxAcegbrobrpbDkbABbABbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQNaMLaWgaPBaQNckJaSlbxFaQNaQNaMLdAbaZjckbbuQbxHbxHbCfbDpbDqbxHbDrbuQbAMaKBaKBaKBaKBaKBbDsbDtckcbONchXciAccncgLbVmccgbOObpYdAccoxbrVbrVbrVbASbtEbrVbsacmnbqabDCbDDbDEbqabqgaYpcaVbSAbDQcgscgxcgCbDQcbicgFcgGcgHcgDcgEaadbDPcjiciJciJbDTciJciJcjKbDVaadchAcgIchgchUcicchRchTcjXcjWbBqbCNbBqckKbEhbEibsIbEjbEjbEjcjqchWbEjbEmbEjbEjbAfbEncmGcmHbEpbsIbEqbErcmFbEtbEuavAbxhbEvbxpchYchYchYciabEybVocfwbxpclibmcdAdbiJbiJbiJbECblXbEDbEEbvZbyUbwbbfJbmnbmobmobmobmobmoaadaadaWtaadaWuaadaaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTpaQUbrsbrsbrsbrsbrsbrsbrsbrsbrrbrsbpNchrbuQchxbxHbxHbAKbxHbEHaKBaKBbAMaKBbEIcmhbEKbELbEMbENcfObNkbNnbNobNpbNqbNpbNrbNsbpYaZmbqabETbrUbrVbASbtEbEYbEYbEZbqabFacgibFcbqabqgaYpcaVbSAcdGcefceqcdKceecbiceAcetceuceNbBqcfsbFmcfsbFmbFmbFnbFmbFmcfsbFmcfsbBqcgobGKcfucfYcglcgncfrceObBqbCNbBqcmubqFbqGbVvbEjckabFAbFBbFCbFDbFEclYbEjbEjbEjbEjbEjbEjbsIbFGbFHbFIbFJcfZavAbxharNbxpbFLbFMbFLbxpbxpbxpbxpbxpcejdCAbsVbFPbFQbFRbpAbFSbFTbFUbAxchHchIbibboabobbFWbFXbFXbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaULbwBaUMaUcciMcihbtgcilbtgbtgbtgcgPckqchkbuQbxHbGabxHbAKbGabGbaKBbGcbGdaKBbGebxTbxTbGfbGgbpYbGhchlcfkbGhbGhbGhbGhaKBckRaKBaZmbqabETcgYbwEbASbtEbqabqabqabqabqabqabqabqabGobbFcfNbSAcbRbFvcbScbTcbicbicbUcbXcckccqbBqdzXdzYbGybGzbGAbGBdAaclGcjlbGFdzZbBqcdlbGKcdccdkbBqccxcdycdrbBqbCNbBqcjGbqFbGOcluchebGRbGSbGTbGUbGVbFEchdbEjbMobGYciTbMnbIzbsIbHcbHdbHebHfbHgavAbxhbMUclFbHibHjbHicfpbHlclEbMUbHocejbmcbHpbHqbHqbHqbrhblXblXblXbvZcfobwbbfJbmnbpIbHsbHtbHubmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQNaTpceQaTpaQNbuNbojaQNbuNbojaQNbXfaQNaQNbuQbxIbHybHzbHAbHzbHBaKBbAMaKBaKBbxTccsccPcdbbpYbpYbHFbHGbESbGXbGhbHJbHKaKBcMVbHMaZmbqacfPbrXbrXbASbXybqabHPbHPbXnbXibHRbHSbqabHTaYpcaVbSAbKsbFvbKkbJPbJQcbibJObGMbJjbIpbBqcNNcNObIfcLFbIgbIfcLLbIfbIhcMqcMUbBqbGJbGKbGLbEabGNbHxbHEbHxbBqbEfbBqbXkbqFbqGbVvcdNbFCcwybXlcdQbFBcceccfbEjbEQbIAbERbHacchavAavAavAbIDbIEbIFavAbxhbMUcdVccabIJccacdOccbcdVbMUbINcejcbjbsVblXblXblXblXblXblXbnTbvZccjbxAcegbrobrpbIPbFXbFXbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXFbeNaXFaadaaaaaaaaaaaaaadaKBcKlcfnajnaKBaKBaKBaKBaKBaKBaKBaKBcJUbWTbEPbENbDAbIZbJabpYbpYbJbbDzbJdbDybGhcdEcdAaKBbJhbJibUrbqabWobrXbrXbASbtEcdIbrVbrVbJmbJnbwFbJpcdFbqgaYpbWgbSAbDQbFvbGCbGIbDQcbibFtbIobFubFtbBqcKqcLEcxwbJDbJEcbnbJGcyvbJHbJIcyWbBqbEebEFbFrbFsbFpbFqbEdbEcbDZbDYbBqbSzbqFbqGbVvcdpbFCcdecdxcducdtbVwcdzbEjbWybIAbKabKbbKbbKcczXavAbKeavAbKfavAbxhbMUcdOcdOcdOcdOcdOcdOcfmbMUbINcejbKnbsVblXblXbKobKpbKoblXblXbvZbyUbKqbfJbmnbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaULceQaULaadaaaaaaaaaaadaadaKBbrTcwPbKtbKtbKtbKtbKtbKtbKtbKtbKtbKxaKBbCrbxTbxTbxTbxTbDvbKBbDwbDxbCsbCUbVcbKHbKIbQHcwQbHMcwHbOSbKNbKObKPbKQbtEccObrVbKRbJmbwFbrZbJpccNbqgaYpbUjbSAbDQbDSbDUbDRbDQcbibDlbCJbCLbBqbBqcwKcwLbLdbLecvFbLgbLhbLicuhcvycwlbBqbCkbCEbBJbBObBqbBqbBqbBqbBqbCGbBqbSJbqFbqGbOibEjccKccDbKMbKJbOgbLCbLybLzbLAceGbJYceFbLEbLFcubbLHctYbSIctXbLLbLMbMUccdcdOcdOcbZcdOcdOcbYbMUbINcejbLQbsVblXbnTbKobLRbKoblXblXbAxcblccLccMbLVbLWbLXbLYbLYbmoaadaadaWsaadaWuaadaWtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaacnwcnwceEcnycnwbMbbMbaKBcaYaKBbMebxObCMaKBbMgbMhbxTbMkbxTbKAbKBbCpbCqbClbCobGhbMpbMqaKBbMrbrTaQWbqabSFbrXbrXbrXbMtcbWctqbMvbMwceCctWbqabqabAWaYpbSDbSAbSAbSAbBpbSAbSAbSAbBqbBqbBqbBqbBqbMEbMFbMGbMEbMHbMHbMHbMFbMIbMEbMFbBqbBqbBqbBqbBqbBqbBqcekbBtbBqbBgbBqbSzbqFbNWbJUbMNbMNbMNbMNbMNcbzbMPbMNbMNbMNbMNbMNbMNbMNbMNavAbMQbMRbLJbMTbLMaQsbMUcbxcdOcdOcbycdOcdOcbwbMUbMYcejbMZbNablXblXblXblXblXblXblXbvZcaQbwbbUibmnbpIbNdbNebNfbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaaaaaacnwcixdzQcoBcnwaKBaKBaKBbNgaKBaKBaKBaKBaKBciybNjbIXbIYbJcbKAbKBbHIbIWbJebJZbGhbNtbMpaKBbMrdCwaQWbqabNubTnbNvbNwbNxbqabNybUabNAciNdzRbqacbQbqgaYpccCccrbTCccrccrccrccrcdoccrccrccrccYccZccrbNDbNJbNKbNKbNKbNLbNKbNMbNNccccfHcfJcfKcfScfUcgzccicccccccclbTzcccccmbqFciechbbMNbNZbOachSchQbOdcJWcipbOfcgBbNZckxbMNbOjbOkbOldzPaQsaUobOmbOnbOobMUbMUcitcdOcisciwcivbMUciubiNcirbOubsVbOvbOwbOxbOyblXbOzbOAbOBcdqbLTcfGbLVbOEbOFbOGbLYbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaadaaaaaaaaaaaaaULaWhaZhaSlaSlaSlaSlaZiaWhaULaaaaQNaZjaZkaZlaZlaZlaZlaZlaZlaZlaZlaZmaNaaKBaHgaHgaHIaHIaHIaHgaHgaPQaHgaNfaPJaMNaOxaQqaQyaQCaGRaOUaFhaOjayHayHaMUaFBayHayHayHaQSaYpbRAaZNaZNaZNaZNaZNaZLaZLaJFaZLaYgaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXtaXpaZTaZTaZUaZTaZTaZTaZTaZTaZTaEMaYpaRkaVMaYJaSOaSSbbJaXeaVMaXfaXiavAbacbadavAbbMaThaUnavAbkYbkZaXuaXCbaiaXXbakaMZbambaobaobapbaqbarbarbasaZbbatbaubavbawaTmaPCaTmaTmajCajcaaaaaaaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaAbaBbaCbaBbaDbaBbaBbaDbaBbaCbaEbaFaQNaZjaSHbaHaSIbaJbaKaSwbaMaSGaZlaZmbaObaPbktaOvaOwaOvaOvaOMaOvbkxaHgaMxaOLaOzaPyaPzaMXaPxaOTaOUaKWaKYaLyaLzaLvaLwaKZaLgayHaWCaYpaXoaZNaMfaMeaMcaLBaZLaMkaIhaTLaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaZTaDzbbybbzbbAbiebbCaDTaZTaWabbFbbGaVMaOqaYJaStaOrbbKaVMavAaWZavAavAavAavAaUqaQsbbNavAbbOavAaTmaTmaTmaWwbbRaMvbbTaMpbbVaYZbbWbbXbbYbbZbcabcbbbYbccbcdaTmbjjbcfbcgbchbchbciaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaAbaEbaBbcjbckbckbclbcmbcnbcobcpbckbckbcqbcraTpaZjbcsaGVaInbcvbcwbcxbcybczbcAbaeaZxaCCaIbaIbaIaaHuaHqaHgaHgaHgaHgaGPaHsaHraGNaGOaGHaGQaFCaFDaHraHfayHaFoaFAaFBayHayHayHbcUbbFaEGaEIaFmaFlaEJaFraZLbbqaEvaEFaadaadbdeaIjbdfbdjaZPbdhbdibdjaZPbdhbdkbdkbdlaadaadaZTaCBbdnbdobdpbdqbdrbdsaZTaIpaYpaHmaVMaVMaJQaHUaHnaVMaVMbkbaGxaGAbdBbdCavAavAaYEavAavAbdEaImaGEaGyaTmaIkaGBaFIbdKaGwaTmaGCbdNaAgbdPbdQbdRbdSbdTbdUbdVbdWaYDaZobdYbdZbeabebaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbecbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFaZjaFcaZlaFGbekbelbembenaFHaZlaXQaYBberaFQaFPaFXaFWaGdaFOaFKaFEaFMaGjaGzaGvaFjaFkaVYaFgaFnaFpaFhaFiayHayZaxmayFazZaAcayHaWCaYpaCIaZNaElaEHaEcaEmaZLaAEaAjaTLaadaadbeVaKxaEEaDdaBebfaaxlbfcaAYaBmaECaJxbfhaadaadaZTbfiaClbfkbflbdqbbCaDVaZTaEMbfnaFbaDYaCFaDfbfybfwbfAbfAbfAbfybfAbfAbfAaDGbfAbfAaxkayubfwbfxbfAbfxaxpaDRbfAbfBbfCaEKbfEaTmaTmbfFaTmaTmbfGbfHbfIaELbfKbfLbcebcebfNbchbchbfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfPbckbckbaCbckbefaEdbefbfQbefaEdbefbckbegbehaXFaQQaQpaZlbfSaQnbfUbfVbfUbaHbaHarMbfXbfYaHgaKVaKUaKTaReaKNaKFaKDaHgaJgaKyaRcaGNaJwaHgaLGaLxaRKaRzaLEayHayHaIMayHayHayHayHaHjaYpbRAaIDaIBaIlaIiaIAaIzaHiaHpaTLaZPbgyaZPaOEbgsbgwbgubgvbgtbgsbgubgwbgvaNAaZPbgyaZPaZTaYtaYtaYtaNobgAbgBbgCaZTaPlbgEaPjaPPbgJbgIbgJbgKbgJbgJbgLbgMbgMbgNbgMbgMbgMbgMaHoaQmbgObgPbgQbgRbgSaQFaQDaQvbgVaQwbgXbgYbgZbhabhbbgXaTmbhcbhdaQxbfFaQzaQAaQGbhiajCaDZaaaaadaaaaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbhkbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFbhlbhmbhnaPfbhpbhqbhqbhraMQaPwbcCbepbhwaHgaIJaILaIKaNPaIoaIIaIwaHgaHcaHtaNNaPgaIfaHgaZqaJPaNSaZqaHgayHaGKaGFaGIaFJaFLayHaWCaYpaHlaZNaHhaIBaIBaHkaZLaGTaGLaKobhUbqxaPHaNhbgubgubgubgubhZbgubgubgubguaCEaBCaMBaZPaLAaJYaMabifbigaKjbiibijaZTaKmbilaKnaLDbiwbiwbiAbixbiAaMYaKXaNtbiwbixbiwbiAbiwaLLaFFaOGaOFbiyaNObiwbiybiAaMoaMybiDaMwbgXbiFbiGbiHbiIbiJbgXbgXbiKbiLbiMbiNbiObiPbiQbiRbiSbgXbgXbgXaadaaaaaaaadaaaaaaaadaadaadaaaaaEaaaaaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbiUbaBbcjbckbckbiVbckbiWbiXbckbiYbckbcqbiZaULaZjbjabmsblLbmmbjebjfbjgbmMbmRbmPbjkbjlaHgaZraZqaZgbabaHgaHgaHgaHgaHgaHgaHgblxaHgaHgaYjaYkaZRaZSaYqayHayHayHayHaZJayHayHblBaYpaZVaVIaWIaXTaWJbbkaGSaGMbblaTLaZPaZOaZMbhBbjMbmSbjIbhVbjKbjIbjIbjLbjMbjNbjObjPaZPaZTaYtaYtaYtbjQaYtaYtaYtaZTbmTaYpbahbjSaWxbjTbjUbjVaVWbjSbagbjSbjSaVibjSbaSaVbbjSbbebjSbjSbkcaVabkbaUZbkgbkgbkhbkibkjbkkbklbkmbknbkobkpaUvbkrbksbmdbkuaVRbkwbtubkybkzbkAbkBbkCbgXaadaadaadaadaadaadaadaaaaaEaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbaBbaCbaBbaDbaBbaBbaDbaBbaCbiUbkDaQNbkEbkFbkGaQNbkHbkHbkIbkHbkJaQNaZcaXYaZdbjZbkVaXZaYbaZebkObkXaYcaYdaXUaYebkXaYWbjJbkObkQaXraZabkVaWAaZsbkXaXUaYIaZybkXbjYblbblcbRAaVIaVIaVIaVIaVIaTLaTLaTLaZLaPLblnbloblpblqbeoblsaUYblublvblwblrblqblyblzblAaPTaZTblCblDblEbigaPRaYtbljaZTaZQaYpblIbjSbjSbjSbjSbjSbjWbjSaUAbjSbnzblKblfaZIblNaUzaZDblObjSaWBbkdbkdbafbkgbkgblTbkiblUaUvblWblXblYblZbmabmbbmcbksbmdbmeaUdbmgbmhblXbmibmjbmkbmlbkabmnbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTpaWhbmpaSlaSlaSlaSlbmqaWhaTpaaaaQNaZjbmrbkGaQNbmtbtzbmvbmwbmxaQNbooaZvboIboGboFaBwbcBbbEbmEbmCbmFbmGbmCbmCbmCaJCboMbmCbmBbmDaZwbmJbmKbmKbmKbmKbcZbcWbmKboXbBebdLbdcbeUbeiaXSaXGbleaXwaXWbpHbtIaQYblqbmYbmZbeRbfbbncbndblGbndbnfboPboybnibnjbnkaSCaZTaBxbnnbnobnpbnqaZTaZTaZTaEMbnrbnsbjSbfTbfrbfzbgabgbbjSbnybjSbrnbhDbgxbhRbnAbnAaTCaZAbjSahrbkdbalaZEbgrbkgbnFbnGbnHaZBbnJblXbnKbnLbnMbbSbnObnPbnQbnRaUdbnSbnTbnUbnVbnWbnXbnYbibboabobbocbodbodbmoaadaaaaRDaaaaRCaaaaaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaSgaPBaQNaXFbzWaXFbajbofbogbohaXFbzWboibojaQNaZjbkFbkGaQNbolbombmwbmwbonaQNbpPaZtboqbmVbmUbvhbotbosbvGbzbbySbosbosbosboxaIqbnCbosbosbvGbvhbySbosbosbosbnNboubosbosbnDboAboBbbsblebbubbpbbfbdbbbfbbvbbfbtIbtIboJboKboLboLboLbjhboNbndboObjiboLboLboLboQboRaZPaZTaQaboTboUboVboWaZTbnZaXNbaYbpabnsbjSbbwaRvbnAbbBbbIbpgaWybpibpjbnAbnAbnAbpkbnAaTCblObjSbpmbkdbpnbpobcubkgbpqbprbnHaUvaYmbptbpubpvbpwbgXaQibksbmdbpyaYfbpAbpBbpCbpDbpEbpFbpGbfJbmnbpIbpJbodbpKbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaadaadaQNaULaWhaULaWiaQOaQOaWjaULaWhaULbpLbrsbpNbkFbkGaQNbpObpObkIbpObkJaQNaSvaSubduaKBaKBbovaKBbdgbcXbcSbcJbdgbcXbpYaKBaMjbqabaIbazbaGbaLbaNbaIbazbaGbqabaIbazbaGbqabqgbboaQlaRfaOOaTqaSTaOPaSTaPEaPDaQjaPFaQkbqsbqtbbgbqtbqtbquaTrbqwboLboLbdyboLbqxbqyaZTbqzaRBbqAbdqbqBbqCaZTbdXaYtaEMbqFbqGbjSaUybnAaUxaTYaUabjSaREbjSaSMbnAbnAbqObqPbqQaTCaRabjSbnBbkdbkdaSPbkdbkgbqUbqVbqWbgXaRdaRsbqZbraaRtbgXbrcbrdbrebrfbrgbrhbnUbribrjbrkbrlbrmcegbrobrpbrqbodaPUbmoaadaacaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTpaQUbrsbrsbrtaQOaQObrubrsbrsbrvbrwbrxbrybrzaXVaYaaYlbrDbrEbrFaYnaXqaXnbrJbrKaKBbrLbrMaKBaBraAkbrPbrQaUVaUUbpYbrSapvbqabrUbrVbrWbrXbrYbrZbrVbsaaYibscbrVbwFaXcbqgaYpbCxbleaONaOSaMTbleaMhaOoaNwaMVbtIaOJbspboLbsqaZubssbssbssaYRaYQaZnaYUboLbsxbsyaZTbszbsAbsBaZzbsDbsEbsFaYxaYtaEMbqFbsHbjSbjSbjSbjSbjSbjSbjSaDWbjSbjSaPIaRvbnAbnAbnAaPAbsKbjSbsLbsMbkdbkdbkdbkgbsNbsObsPbsQbsQbsQbsSbsQbsQbsTbmcbsVbmjbsWaYraYsaZYaZWaZYaZWaZZaZWbanbmnbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaULaUbaUMaUcaUfaUeaUeaUTaUeaUSbtkbtgbtlbfMaUIbtnaPfbtobqfbqSbpxbpSbfRbrIbrHbtvaKBbtwbrBaKBbrObrNbtAbrQbtBbmubpYaYCaGGbqaaYFbrXbrXbrXbrYbrXbrXbrXbrXbrXbrXaUXbaLbqgaYpbRAaWvaVTaVSaVQbleblebeXbeWaUGblebtNbtObtPbssbndbndbtQbtRbtSbtTbtTbtUbtVbtWbtXbtYbdqbtZbuabgzbucbudaZTbhHaYtaYPbqFbqGbsIaVKaYTaVqaVXbhNaVUaVVaWfbjSbhXbhWbhWbhWbhWbhWbhYbjSavAbnBaQsaQsbrRbuobupbuqburbupbupbusbutaYVbuvbiabuxbuybuzbuAbuAbuBbuCbuDbnVbuEbizbicbibboabobbuIbuJbuJbmoaadaadaWsaadaWuaadaWtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQNaQNaWgaQNaQNbuNbojaQNbuNbojaQNaQNaQQbejbuQbuQbuQbuQbuQbuQbuQbuRbuQaNzaKBaKBaYuaYvaWoaWoaKBaKBaKBbtBbtBbrPbrQbuWbtBbpYbpYaZmbqabuXbrXbrXbuYbuZbvabvabvabvabvabvabvbbeYboAbvdaYwbleaVJaVpaVebleaSEaUHaUHaQoblebvibvjbqtbvkaTBbvmbfdbvobvpbvqbfmbfgboLbvtbvuaZTbvvbvwbdqbvxbdqbvyaZTbeZaYtaEMbqFbqGbsIbulbulbulbulbulbulbvAaTSbvCbvBbvBbvBbvBbvBbvBbvDbvEbvFbowbvHbvHbvIarNbvJbvKaTIbvMaRRbvOaYzaYAbvRbiNbvSbvTbvUblXbvVbvWbvXbvYblXbvZaRVbwbbfJbmnbpIbwcbwdbwebmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWbwgbwhaZjbwibuQbwjbwkbwlbwmbwnbwobwpbuQdzVbrTbwsaWocfMbNCaWobwwbwxbKEbwzbwAbrPbrQbwzbwAbMmbpYaZmbqabwCbwCbwCbrYbtEbwDbwDbwDbwEbwFbwGbwHaXcbqgaYpaZKblebleblebleblecbOcbJcbNcbFblebwPbwQaZPaZPaZPceOcfrcfrcfrcfuaZPaZPaZPbwUbwPaZTaZTbtYaZTaZTaZTaZUaZTcgSaYtbwWbqFbGOcgUcjRbxbbxbbxbcbPbxbbxdbxebxebxebxebxebxebxebxebxfckoavAaUoaQsaQsbxharNbvJbxibxjbxkcfebxmbxncjTbxpbxqbxrbxsbxtcjVbxvbxwbxxbxyblXbvZcfibxAcegbrobrpbxCbuJcfVbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbxDbxEbxFaZjbxGbuQbxHbxIbxHbxJbxKbxHbxLbuQbxMbxNbxOaWobKYbKWaWocepaKBbMlbxUbxVbrPbrQbxUbxVbMjbpYaZmbqabxWbxXbxXbxYbtEbrVbrVbrVbxZbyadCzbybbqacekcbhcbkcbAcaPcaOcbacbgcaPcaOcaPcaTcaZbykbylcjIbynbyobypbypbypbyqbypbymbyrbysbytbyubyvbyobyocjJbywbyxbyybyobyAcfLbyCbyDbnsbyEbyFbulbyGbulbyHbulbyIbulbyJbyKbyLbyLbyLbyLbyLbyKbyMavAdCyaQsaQsbxharNbxpbxpbyPbxpbxpbxpbyQbxpbxpbxqbyRdzUbiJbiJbiJbyTblXbvXblXbvZbyUbwbbfJbmnbmobmobmobmobmoaadaaaaaEaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfcjrdzTcjraZjbyVbuQbyWbxHbxHbyXbyYbyYbyZbzadzSbzcbzdaWocfhbRyaWobzgbzhbKEbzibwAbrPbrQbwzbwAbKDbpYaZmbqacffbwCbwEbzkbzlbzmbznbzobzpbrVbrVcjpbqacdKbYobZfbXCbzPbZzbZJbZrbZybWbbWcbVXbVYbWkbWHbzHbzGbZObzIbzIbzJbzKbzIbZObzMbzNbzObzPcaDbWkbzPbzSbzTbzUbzEbzPbzVcftbzXcjwcjtcjHcjxbAabAbbAcbyHbAabAdbAcbAebMibAgbAhbAibKFbAjbAfbAkavAavAavAaQsbxhbZjbxpbAlbAmbAnbxpbAobApccQbxpbArbAsbAtbAubiJbAvbxyblXbxwbAwbAxcelcgRbibboabobbAAbABbACbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbADbAEbxFbAFbAGbAHbAIbAJbxHbAKbxHbxHdCxbuQcerarXagvaWocesaWoaWoaKBaKBbKzbAPbxVbrPbrQbxUbxVbKybpYaZmbqabARbrVbrVbASbtEbrVbrVbrVcjbbAUbrVcjdbqabAWaYpbCxbSAbSAbUNbSAbUXbSAbSAbBqbBqbTDbUhbBqbBjbBibVjbBlbBmbBnbBobBlbVibBibBjbCGbCGcdkbCGbCGbCGbDRcdycdrbCGcdlbCGbBxbBybBzcgMbBBbBCbBDbBCbBEbyKbBFbyKbBGbBHcjhbvBbBKbvBbUybBMbBNavAbKCavAaQsbxhaQsbxpbUAbBRbBSccobBUbBVbUzbxpbArbAsbAtbAubBXbAvbBYblXbxwbAwbvZceibwbbfJbmnbpIbCabCbbCcbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWaULbwhaZjbyVbuQcmJbCebCfbCgbChbxHbCibuQbAMbCjarVarXdAeaKBcjPcljaQZcOZduNduHduRduUduHbKEduMbpYaZmbqabwCbwCbwCbASbtEbCtbCtbCtbqabqabCubqabqabCvbCwcaVbSAcllckrckIcjYbDQcbicNecvGcvOclmbBqaadbCDcPFbBlbBlbCFbBlbBlcPRbCHaadbCGdvMdvNdvOdvTbCGbCGbCGbCGbCGcPEbCGclnbCObqGbsIbCPbCQbCRbAebulbCSbyFcnhbVtduXbCVbulbulbCWbsIbsIbCXavAavAavAavAbxhaQsbxpbCYcigcidcimbDccmVcmUbupbiPdAfbDgbAubiJbAvbDhblXbDibAwbvZchBbxAcegbrobrpbDkbABcPDbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQNaMLaWgaPBaQNckJaSlbxFaQNaQNaMLdAbaZjckbbuQbxHbxHbCfbDpbDqbxHbDrbuQbAMaKBaKBaKBaKBaKBbDsbDtckcbONchXciAccncgLbVmccgbOObpYdAccoxbrVbrVbrVbASbtEbrVbsacmnbqabDCbDDbDEbqabqgaYpcaVbSAbDQcgscgxcgCbDQcbicgFcgGcgHcgDcgEaadbDPcjiciJciJbDTciJciJcjKbDVaadckDcjWcjXcDccJWclQcvxcPCcOKbCGcgVbCGckKbEhbEibsIbEjbEjbEjcjqchWbEjbEmbEjbEjbAfbEncmGcmHbEpbsIbEqbErcmFbEtbEuavAbxhbEvbxpchYchYchYciabEybVocfwbxpclibmcdAdbiJbiJbiJbECblXbEDbEEbvZbyUbwbbfJbmnbmobmobmobmobmoaadaadaWtaadaWuaadaaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTpaQUbrsbrsbrsbrsbrsbrsbrsbrsbrrbrsbpNchrbuQchxbxHbxHbAKbxHbEHaKBaKBbAMaKBbEIcmhbEKbELbEMbENcfObNkbNnbNobNpbNqbNpbNrbNsbpYaZmbqabETbrUbrVbASbtEbEYbEYbEZbqabFacgibFcbqabqgaYpcaVbSAcdGcefceqchgceecbiceAcetceuceNbBqcfsbFmcfsbFmbFmbFnbFmbFmcfsbFmcfsbCGcjobJPchRchTchUcicchNchAbCGcgVbCGcmubqFbqGbVvbEjckabFAbFBbFCbFDbFEclYbEjbEjbEjbEjbEjbEjbsIbFGbFHbFIbFJcfZavAbxharNbxpbFLbFMbFLbxpbxpbxpbxpbxpcejdCAbsVbFPbFQbFRbpAbFSbFTbFUbAxchHchIbibboabobbFWbFXbFXbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaULbwBaUMaUcciMcihbtgcilbtgbtgbtgcgPckqchkbuQbxHbGabxHbAKbGabGbaKBbGcbGdaKBbGebxTbxTbGfbGgbpYbGhchlcfkbGhbGhbGhbGhaKBckRaKBaZmbqabETcgYbwEbASbtEbqabqabqabqabqabqabqabqabGobbFcfNbSAcbRbFvcbScfYcbicbicbUcbXcckccqbBqdzXdzYbGybGzbGAbGBdAaclGcjlbGFdzZbCGcgIbJPcgncgobCGcglcgXcgWbCGcgVbCGcjGbqFbGOcluchebGRbGSbGTbGUbGVbFEchdbEjbMobGYciTbMnbIzbsIbHcbHdbHebHfbHgavAbxhbMUclFbHibHjbHicfpbHlclEbMUbHocejbmcbHpbHqbHqbHqbrhblXblXblXbvZcfobwbbfJbmnbpIbHsbHtbHubmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQNaTpceQaTpaQNbuNbojaQNbuNbojaQNbXfaQNaQNbuQbxIbHybHzbHAbHzbHBaKBbAMaKBaKBbxTccsccPcdbbpYbpYbHFbHGbESbGXbGhbHJbHKaKBcMVbHMaZmbqacfPbrXbrXbASbXybqabHPbHPbXnbXibHRbHSbqabHTaYpcaVbSAbKsbFvbKkbVpbJQcbibJObGMbJjbIpbBqcNNcNObIfcLFbIgbIfcLLbIfbIhcMqcMUbCGbHEbJPbLubLDbOdbOWbPibOWbCGbQWbCGbXkbqFbqGbVvcdNbFCcwybXlcdQbFBcceccfbEjbEQbIAbERbHacchavAavAavAbIDbIEbIFavAbxhbMUcdVccabIJccacdOccbcdVbMUbINcejcbjbsVblXblXblXblXblXblXbnTbvZccjbxAcegbrobrpbIPbFXbUSbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXFbeNaXFaadaaaaaaaaaaaaaadaKBcKlcfnajnaKBaKBaKBaKBaKBaKBaKBaKBcJUbWTbEPbENbDAbIZbJabpYbpYbJbbDzbJdbDybGhcdEcdAaKBbJhbJibUrbqabWobrXbrXbASbtEcdIbrVbrVbJmbJnbwFbJpcdFbqgaYpbWgbSAbDQbFvbGCbHxbDQcbibFtbIobFubFtbBqcKqcLEcxwbJDbJEcbnbJGcyvbJHbJIcyWbCGbFsbGIbGLbGNbGJbGKbFrbFqbFpbEFbCGbSzbqFbqGbVvcdpbFCcdecdxcducdtbVwcdzbEjbWybIAbKabKbbKbbKcczXavAbKeavAbKfavAbxhbMUcdOcdOcdOcdOcdOcdOcfmbMUbINcejbKnbsVblXblXbKobKpbKoblXblXbvZbyUbKqbfJbmnbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaULceQaULaadaaaaaaaaaaadaadaKBbrTcwPbKtbKtbKtbKtbKtbKtbKtbKtbKtbKxaKBbCrbxTbxTbxTbxTbDvbKBbDwbDxbCsbCUbVcbKHbKIbQHcwQbHMcwHbOSbKNbKObKPbKQbtEccObrVbKRbJmbwFbrZbJpccNbqgaYpbUjbSAbDQbDSbEfbEebDQcbibDlbCJbCLbBqbBqcwKcwLbLdbLecvFbLgbLhbLicuhcvycwlbCGbEabEcbDYbDZbCGbCGbCGbCGbCGbEdbCGbSJbqFbqGbOibEjccKccDbKMbKJbOgbLCbLybLzbLAceGbJYceFbLEbLFcubbLHctYbSIctXbLLbLMbMUccdcdOcdOcbZcdOcdOcbYbMUbINcejbLQbsVblXbnTbKobLRbKoblXblXbAxcblccLccMbLVbLWbLXbLYbLYbmoaadaadaWsaadaWuaadaWtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaacnwcnwceEcnycnwbMbbMbaKBcaYaKBbMebxObCMaKBbMgbMhbxTbMkbxTbKAbKBbCpbCqbClbCobGhbMpbMqaKBbMrbrTaQWbqabSFbrXbrXbrXbMtcbWctqbMvbMwceCctWbqabqabAWaYpbSDbSAbSAbSAbSAbSAbSAbSAbBqbBqbBqbBqbBqbMEbMFbMGbMEbMHbMHbMHbMFbMIbMEbMFbCGbCGbCGbCGbCGbCGbCGbDUbDRbCGbCNbCGbSzbqFbNWbJUbMNbMNbMNbMNbMNcbzbMPbMNbMNbMNbMNbMNbMNbMNbMNavAbMQbMRbLJbMTbLMaQsbMUcbxcdOcdOcbycdOcdOcbwbMUbMYcejbMZbNablXblXblXblXblXblXblXbvZcaQbwbbUibmnbpIbNdbNebNfbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaaaaaacnwcixdzQcoBcnwaKBaKBaKBbNgaKBaKBaKBaKBaKBciybNjbIXbIYbJcbKAbKBbHIbIWbJebJZbGhbNtbMpaKBbMrdCwaQWbqabNubTnbNvbNwbNxbqabNybUabNAciNdzRbqacbQbqgaYpccCccrbTCccrccrccrccrcdoccrccrccrccYccZccrbNDbNJbNKbNKbNKbNLbNKbNMbNNccccfHcfJcfKcfScfUcgzccicccccccclbTzcccccmbqFciechbbMNbNZbOachSchQcdcccxcipbOfcgBbNZckxbMNbOjbOkbOldzPaQsaUobOmbOnbOobMUbMUcitcdOcisciwcivbMUciubiNcirbOubsVbOvbOwbOxbOyblXbOzbOAbOBcdqbLTcfGbLVbOEbOFbOGcbTbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaacnwcfFcptcifcnwaadaadaadaaaaadaadaaaaaabpYbOLbpYbOMbHHbOMbpYbpYbGhbOQbORbGhbGhbGhbGhaKBbMrbHMaQWbqabqabqabqabqabqabqabqabqacgcbqabqabqacijbqgbOUbOVaWKaWKaWKaWKaWKaWKaWVaWKbPjbOXaWXaWWaWKaWKbOYbOZbPabPbbPcbPdbPebPfaWKaWKbPgbPhaWKaWKaWKaWVaWKaWKaWKbSRaWKbPjchPcfzcfycfxbPmbPobPnbPnbPpbPqbPrbPnbPnbPscgbbMNbPvbPwavAatJaQsaUoaUoaUoaUobMUbMUcfAcfCbYzcfEcfDbMUbIMbPCcxTbPEbPFbOvbPGbxwbAwblXbPHbPIbAxbPJceHbTPbPLbmobmobmobmobmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaaaaacnwcqedzMceBcnwaadaaaaadaaaaaaaaaaaaaaaaadaaaaadaadaadaadaadaadaadaadaadaadaadaadaqXaKBcdmcdnbPTaVfaVfaVfcdjaVfaVfbPUbPVbPWcPtaVfcQFcdJcQabPZbQabQdbQcbQebQdbQdbQdbQdchGbQdbQgaVCbQhbQiaVCaVCbQjbQkbQlbQmbQnbQobQpbQqaVCaVCchccgZcgZcgZchacdUchachibQtbRhchfceXchhcfjceVceUceWbQEbQDbQDbQEbQDbQFbQDbQDbQGcdPbMNbQIbQJbMNatJaQsaQsaQsbOobQMbMUceTceSceRbYzceKceJceIcgQbQTbQUbQVbTmbQXcgObQZbRabTmbRbbRcbOBcdiceHbTPbRebobbRfbRgbRgbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaadaaaaaaaaaaaaaaacnwcqZcracrbcnwaadaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaadaaaaaaaadaadcgNaadaadaadaKBaKBaKBbSraKBaKBaKBaKBcdfbMbbHMbRjcxncdgbHMbMeaKBaKBaKBaZLaZLaZLaZLaZLaZLaZLaZLbhQaZLceybRwbRwcezceDbRwbRwbRwcbKcbDbqFcbBcbCbRDbRDbRDbRDcexbRDbRDbRDcewaZLcbocbdcbbaZLcaebMNcevcfTcevbMNbQWbPibQDbQDbOWbQDbLubQDbQDbLDbRObMNbRPbRQbMNatJaQsaQsaQsaQsaQsbMUcdOcdOcdOcfRcfQcdOcfmbMUbPCbRXbRYbiJbgXbRZbRZbgXboSbSabSbbvZcddbwbbUibmnbpIbSdbSebSfbmoaadaadaWtaadaWuaadaWtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaacsccoMcscaadaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYtbYsbYrbYqbYrbSkbSlbRKbVdbREbSpbSqbTsbRCbTsbTsbTybHMaKBaKBaKBaKBaKBaKBbRzbXVbRxbRpbRnbRmbRlbRkbRibYIbUIbXObUIbXRbXQbUIbXObUIbYIbMzbSKbMSbRLbRRbSNbRRbNibYKbRRbSNbRRbRLbSgbSgbSgbSgbSgcpcbMNbYFbYGbPnbPnbYHbQEbQDbQDbQEbQDbSZbQDbQDbTabTbbMNbQIbTcbMNatJaQsaUoaQsbTdaQsbMUbVsbsYbsXbYzbVEbWebVsbMUbTjbRXbRYboDborbtebsZboDboSbtFbsWbvZbScbxAbWnbrobrpbTqbRgbRgbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaadaaaaaaaaaaaaaaacnwcqZcracrbcnwaadaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaadaaaaaaaadaadcgNaadaadaadaKBaKBaKBbSraKBaKBaKBaKBcdfbMbbHMbRjcxncdgbHMbMeaKBaKBaKBaZLaZLaZLaZLaZLaZLaZLaZLbhQaZLceybRwbRwcezceDbRwbRwbRwcbKcbDbqFcbBcbCbRDbRDbRDbRDcexbRDbRDbRDcewaZLcbocbdcbbaZLcaebMNcevcfTcevbMNbZWbQEbQDbQDbVubQDbQFbQDbQDbVrbRObMNbRPbRQbMNatJaQsaQsaQsaQsaQsbMUcdOcdOcdOcfRcfQcdOcfmbMUbPCbRXbRYbiJbgXbRZbRZbgXboSbSabSbbvZcddbwbbUibmnbpIbSdbSebSfbmoaadaadaWtaadaWuaadaWtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaacsccoMcscaadaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYtbYsbYrbYqbYrbSkbSlbRKbVdbREbSpbSqbTsbRCbTsbTsbTybHMaKBaKBaKBaKBaKBaKBbRzbXVbRxbRpbRnbRmbRlbRkbRibYIbUIbXObUIbXRbXQbUIbXObUIbYIbMzbSKbMSbRLbRRbSNbRRbNibYKbRRbSNbRRbRLbSgbSgbSgbSgbSgcpcbMNbYFbYGbPnbPnbYHbQEbQDbQDbQEbQDbSZbQDbQDbTabTbbMNbQIbTcbMNatJaQsaUoaQsbTdaQsbMUbVsbsYbsXbYzbVEbWebVsbMUbTjbRXbRYboDborbtebsZboDboSbtFbsWbvZbScbxAbWnbrobrpbTqbRgbCkbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaadaadaadctacractaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcZYbTsbTsbTsbTsbTsbTtbTubTvbTwbTwbTxbTsbSsbSubTsbTybrTaKBbMbbSobWqbShbSmbSnbXxbXxbXxbXxbSCbSBaZLbePbYIbWsbSxbYWbNYbPQbYWbYTbSGbXObTLbTSbTTbSNbPSbTVbTWbVfbZIbTWbTVbTZbSMbSgbZLcpubZKbSgbWwbMNbZSbZUbZYbUlbZVbQEbUkbUlbUlbUlbUmbUlbUlbUlbUnbUobUpbUpbNccpjaQsaUobUsbyOcrCbMUbZsbMUbZtbZubZFbMUbZGbMUbTjbRXbRYbiJbuLbyNboDbzebgXbBQbUBbUCbyUbwbbUibmnbmobmobmobmobmoaadaaaaaEaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEaaaaaaaadaaaaaaaadaadcvTaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcZYbUEbUFbUGbUHbUGbLZbUJbUKbULbULbUMbTsbNEbNFbNmbNzbMDbuSbMybMCbNbbNlaKBbMXcqRbXxbSObXxbMxbMcbYIbYIbYIbTIbMabWdbWjbWibWhbKGbXsbXEbTLbTSbTTbVebVfbVgbVhbKZbWSbVkbVkbVlbWGccAcmMbWAbWCbSgbWwbMNbWxbEJbWDbWEbTJbUlbVubFxbIBbVxbVybJSbIVbVBbWUbMNbVDbICbMNatJaQsaUoaUoaUoaUobMUbMUbMUbMUbMUbMUbMUbMUbMUbgXbRXbRYboSboDboEborboDbiJbVGbVHbVIbNIbTObTPboabobbVKbVLbVLbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEaaaaaaaadaaaaaaaadaadcvTaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcZYbUEbUFbUGbUHbUGbLZbUJbUKbULbULbUMbTsbNEbNFbNmbNzbMDbuSbMybMCbNbbNlaKBbMXcqRbXxbSObXxbMxbMcbYIbYIbYIbTIbMabWdbWjbWibWhbKGbXsbXEbTLbTSbTTbVebVfbVgbVhbKZbWSbVkbVkbVlbWGccAcmMbWAbWCbSgbWwbMNbWxbEJbWDbWEbTJbUlbBObFxbIBbVxbVybJSbIVbVBbWUbMNbVDbICbMNatJaQsaUoaUoaUoaUobMUbMUbMUbMUbMUbMUbMUbMUbMUbgXbRXbRYboSboDboEborboDbiJbVGbVHbVIbNIbTObTPboabobbVKbVLbVLbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXaAXaAXaSgaadaadaadaadcvTaadaadaadaadaadaaEaAXaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcZYbUEbVObVPbVQbVRbTvbVSbNRbOqbOCbTQbTsbQfbQsbTsbTybrTaKBbMebtwbNSbObaKBbOcbQNbQubXxbXxbQRbYIbYIbQSbYIbTRbVCbXobXobXqbXsbXrbXsbXEbTLbWrbTUbVebVfbVfbVfbWtbUfbTYbWvcgTbXJbXIbXMbXNbXLbSgbWwbMNbMNbMNbMNbMNbMNbBwbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNatJaQsaUobEvaQsbWIaUoaQsaQsaQsaQsaQsaQsaUobOoarNbRXbWJbiRbpZbqobqXbsJbsJbWLbWMblXbQYbwbbUibmnbpIbWObWPbWQbmoaadaadaWsaadaWuaadaWtaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXaaaaadaaaaadaaaaaaaaactSaaaaaaaadaaaaaaaaaaaaaSgaaaaaaaaaaaaaaaaaaaacaaaaadaadaadcZYbUEbWVbWWbWXbWWbWYbWZbZCbXbbXcbXdbTsbZdbZebTscsrbZwaKBbxzbxzbxzbxzbxzbxzbZbbZabYYbYXbYSbYIbYRbYQbZcccwccvbSEccubSEcctcctcctbUIbTLbTSbTTbRRbZBbUYbTGbTpcbcccHbXGbXHccIbSgccycczccBbSgbRBbXXbXXbXXbXXbXXctrctubXXbXXbXXbXXbXXbXXbXXbXXbXXbXZctpbDOctcbDubYbbYbbYbbYbbYbcaXbYbbYbbYbbYbbYcbYbbYbcsLbCIbYebYfbRUbTkbTlbZEbYkbRSbYmblXblXbZDbxAcaWbrobrpbYpbVLbVLbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXaaaaadaaaaadaaaaaaaaactSaaaaaaaadaaaaaaaaaaaaaSgaaaaaaaaaaaaaaaaaaaacaaaaadaadaadcZYbUEbWVbWWbWXbWWbWYbWZbZCbXbbXcbXdbTsbZdbZebTscsrbZwaKBbxzbxzbxzbxzbxzbxzbZbbZabYYbYXbYSbYIbYRbYQbZcccwccvbSEccubSEcctcctcctbUIbTLbTSbTTbRRbZBbUYbTGbTpcbcccHbXGbXHccIbSgccycczccBbSgbRBbXXbXXbXXbXXbXXctrctubXXbXXbXXbXXbXXbXXbXXbXXbXXbXZctpbDOctcbDubYbbYbbYbbYbbYbcaXbYbbYbbYbbYbbYcbYbbYbcsLbCIbYebYfbRUbTkbTlbZEbYkbRSbYmblXblXbZDbxAcaWbrobrpbYpbVLbCEbmoaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaaabSjbSjbSjbSjbSjaadcuLaadbSjbSjbSjbSjbSjaaaaAXaaaaaaaaaaaaaaaaaaaaaaaaaadbYtcWRcdvbTsbTsbTsbTsbTsbYwbYwcaMbYwbYwbYwbYvbZXcaccacbPucaibYwcazcaBcafcagcbmbxzcaHcaGcaJcaIcaCbYIcaFcaEcaLbStcdsbZNbZNchVbGicbqbGicdHcbvbTSbYNbYObYPbCnbCnbYPbCncdCbYPbYUbYVbSgcdMcaNcdLbSgctVcizbWBbWBbWBbWBbUqbWBbWBbYvbYvbYvbYvbYvbYvbYvbYvbZgbZhavAbWIbZiavAavAavAavAavAcaravAbWIbZjaUoaUnaQsaQsaQsarNbZkbZlbZmbZlcdDbZnbZobZobZlbZpbZnbZqbwbbgXbmnbmobmobmobmobmoaadaaaaRDaaaaaEaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaadcuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVaadaAXaadaaaaaaaaaaaaaaaaaaaaaaadbZZaaeckwbPlbTobPlbTockBckBbTibThbZxbZxbZxbZxbZxbZxcpHcpTbVzbVJbUObUUbVUbVVbVTbxzbWfbCTbBZbBWbWfbYIbXebXabYIbXzbXgbZNbXAbZPbZQbZRbYjbZNbYMbTSbZTbYPbXUcdBcdBbXFbXPbXKbYPbWmbQrcadbWlcadbSgbSgbNPbYwbWBbJfbDNbElccGbFdbWBcakcalcalcqBcancbecaocajbZgbZhavAavAavAavAbYubAObzRavAcsgavAavAavAavAcasbTdcrCavAarNbgXbgXbgXbgXbgXcatcaucavbgXbgXbgXbgXbgXbgXaadaadaadaadaadaadaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaadbPNbPNbPNbPNbPNaaacuLaaabPNbPNbPNbPNbPNaadaAXaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaebYwbYwbYwbYwbYwbYwbYwbQKbYwbYwbXhbXjbXjbXjbXjbXmbXjbXjbXjbXpbXtbXubXvbXwbXBbNObKrbXTbNQbOsbYBbXYbXSbNUbNTbYabNVbPybPxbYDbYCcapbZNbYMbTScdwbYPcahcaabZHbIubDFbSPbYPbYJbOJbOtcsdbWBcuScmzcrTcjvbWBccEccEbunbYybQwbWBcbVcalcbrcbsbBbcalcbtcajbZgcbuavAbAXbAVbAZbEbcdScaKavAbWIcaUavAaadavAavAcgaavAavAaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaadaaaaaaaadaaaaRDaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEaaaaadaaaaadaadaadaaacabaaaaadaaaaadaaaaadaaaaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbYwbYvcawcaxbAQbYwcgKbQKbYwbzQcbGcbHcbIbzLcaAbEgcbLcbMbYwbHrbHvbHkbHnbGGbGHbHCbRHbHwbRqbRobRrbRobRqbRobFhbJxbGibJucfvbJqbJkbIrbGibYMbTSbYNbCnbItbIsbIvbIubIxbIwbIQbIHbJgaXDaYHbWBcaqbaZbbtckTbWBbGuccGbUdccGbQPbWBcakcalbQQcalcalcalccJcajbZgcizavAbHXcdSaQsaQsbTdaQsavAavAaVOavAaadaadaadaadaadaadaadaaaaadaaaaaaaadaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaadaaaaRCaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaAXaaabSjbSjbSjbSjbSjaadcuLaadbSjbSjbSjbSjbSjaadaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwcbEbZhbZhbZhbYwbIObQKbYwccTccUccVccWccXbGqbGrcdabIIbYwbIKbILbIkbIlbImbLBbLwbIcbYLbLxbGpbSEbSEbSEbLtbFzbGjbLvbLocfvbLqbJkbJKbZNciWbTSbYNbYPbKSbKhbKhbLfbDFbJXbYPbZAbZvbWzbVNbWBbdObYvctVbfDbWBcpGbJVbJWbkSceLbWBcajbRMbQQcalcdRbRMcajcajbZgbQLavAbJTaQsbJTaQsbEbcdTaYNaQsbJRcgaaadaaaaaaaadaadaaaaaaaaaaadaaaaaaaadaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaRCaRCaRCaaEaRCaWuaRCaWuaadaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaadcuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVaadaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbBTcbuccRdAIccSbZMbQKbYwcdZceacebceccedcaAbyzbAYbyzbYwbxzbExbyBbEAbxzbxzbEXcyUbEWcemcemcenceobBscemcemcshbZNbEVcfvbEUbEGbZNbZNbDbbTSbCZbYPbYPbDacdBcfIbBubAqbYPbPXbQrbRLbRLbWBaUJbYvbzAbWBbWBbRLbDGbxobRLbRLbRLceMbMAbMBcePbMLbMKceMcajbZgcgJavAbEwaVdbEkaUKbDIbDHavAaUoavAavAaadaaaaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaRCaRCaaaaaaaaaaaaaadaaaaadaaaaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXaadbPNbPNbPNbPNbPNaaacuLaadbPNbPNbPNbPNbPNaaaaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdWbQLcdXbZhcdYbYwbQLbQKbYwcfacfbcfccfdbFNcaAbCBbDnbDXbYwbHQbEObFlcflbGmbHUbPPbNYbPQcembDebCKcfqbDjbCAcemctGbZNbGWcfvbHLbHDbGibFVbFycfBbFwbFobFkbFgbGPbGnbDFbFbbCnbGlbQAbQyaWbaWObVfaVwbBcbOraVrbOpbFebFfbVkbPkbRLaXsbOHbOIcfWcfXbGQbCzbCybRIbZhavAavAavAavAcgaavAavAavAavAavAaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadaaaaaaaadaadaadaRCaRCaRCaWuaadaadaRDaRDaRDaaEaRDaWtaRDaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXaadbPNbPNbPNbPNbPNaaacuLaadbPNbPNbPNbPNbPNaaaaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdWbQLcdXbZhcdYbYwbQLbQKbYwcfacfbcfccfdbFNcaAbCBbDnbDXbYwbHQbEObFlcflbGmbHUbPPbNYbPQcembDebCKcfqbDjbCAcemctGbZNbGWcfvbHLbHDbGibFVbFycfBbFwbFobFkbFgbGPbGnbDFbFbbBJbGlbQAbQyaWbaWObVfaVwbBcbOraVrbOpbFebFfbVkbPkbRLaXsbOHbOIcfWcfXbGQbCzbCybRIbZhavAavAavAavAcgaavAavAavAavAavAaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadaaaaaaaadaadaadaRCaRCaRCaWuaadaadaRDaRDaRDaaEaRDaWtaRDaRDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSgaaaaadaaaaadaaaaadaaabUWaaaaadaaaaadaadaadaadaSgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwceYbQLbZhbZhbYwbQLceZbYwcgdcgecgfcggcghcaAcjEcgjcgkbRTcgmbLnbLmcgpcgqcgrbUVbNYbPQcgtcgucgvcgwbLpcgycembQLbZNbMJcgAbRWbRVbRtbRsbRubTSbRFbRvbRNbRGbQvbQbbQzbQxbQObQCbRdbUgbLlbJsbURcgTbJtbUTbUTbUTbJlbUtbUubUvbUwbUxbUPbUQbUecjybUcbUbcajbZgbQLchmbYwaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadaaaaaaaadaaaaadaaaaadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaaabSjbSjbSjbSjbSjaadbVZaadbSjbSjbSjbSjbSjaadaAXaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbBTbQLbQLcdYbYwbQLclTbLSchscgechtcggchuchvchwbTFchychzbLObLPchCchDchEchFbVAbLNbVCchJchKchLchMbLschMchObTBbZNbOPbOKbTAbTrbGibRsbRubTSbRFbRvbCnbSLbSwbSvchZbQBbCnbSyclkbzybLrbJzciicikbVnbVkbVkbVkbSibVbciobVabWBbnmcjsbJybJwbJvbUZbUZcajbZgcotcizbYwaadchnaaaaadaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaaabSjbSjbSjbSjbSjaadbVZaadbSjbSjbSjbSjbSjaadaAXaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbBTbQLbQLcdYbYwbQLclTbLSchscgechtcggchuchvchwbTFchychzbLObLPchCchDchEchFbVAbLNbVCchJchKchLchMbLschMchObTBbZNbOPbOKbTAbTrbGibRsbRubTSbRFbRvbCnbSLbSwbSvchZbQBbBJbSyclkbzybLrbJzciicikbVnbVkbVkbVkbSibVbciobVabWBbnmcjsbJybJwbJvbUZbUZcajbZgcotcizbYwaadchnaaaaadaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaaaaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaadcuHcuIcuIcuIcuIbTebTfbTebMMbMMbMMbMMbMVaadaAXaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwbYwchochpchqbYwbQLbQKbYwciBciCciDciEciFcaAciGcfgciHbYwbJMbJNbKiciLbTgbHUbSHbNYbKTcemciOciPbKUciRciScembMubZNbZNbZNbMObZNbZNbZNbMfciXbMdbYPbYPbYPbYPbYPciZbLUbYPbWBbWBbSQbSTbSUcjgbSVbSSbLkbLkbJLbLjbGvbGEbGZbGvcktcktbGtbSYbSXbSWbSWcajbZgbQLcjubYwaadaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAXaadbPNbPNbPNbPNbPNaaacvTaaabPNbPNbPNbPNbPNaaaaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaKBaKBbYwbYwbYwbQLbQKbYwcjzcjAcjBcjCcjDcaAbKXcjFbIqbYwbPYcehcehcehcehcehbPtbTKbTMbIbbKVcjMbMscjObTNcembPAbPzbPKbPzbPObPMbNhbokbIabHZbHYblQbOTbNGbNGbODbOhbNXbNGbNhbhebHOckfckgckhckickjckkcklckmckncjkbTHckpcaScbfbTEbHNcktckvcajcajcajbZgbYwbYwbYwcxdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAXaaaaaaaadaadaadaaaaaacvTaadaaaaaaaadaadaaaaaaaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaebYvchjbYwcLZbQKbYwbYwbYwbYwbYwbYwbYwbYwcshbYwbYwbYAbYwcxZcxYcyfcyebVAcukcuDcemcuAcyGcxPcoCcoCcoCcoCcoCcoCcoCcxJcwDcxJcxJcyncrncyqbRLbRLbRLbRLcyrbRLbYwbRLbRLbWBcysckYckZckhclaclbclccldclecylcjkclgclhcxBcxzcvEbYvcuVcuXbYvbYlcpXdBpcwsdBqcxKaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9754,17 +9762,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaadaaaaaaaaaaAXaadcBBaadaAXaaaaaaaadaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeaaebYwdBhbYwbQLcltcAnbXXbXXbXXbXXbXXbXXbXXcwtbQLbQLczwbYwczYczRcAiczRczEczIcyYctjczJczKczLcoCclBcztcqxcpxcpxbYnczuczycAMcPScALbTSbYNcAKcPTcAJcCCcCMcBOcBQcANcxjcxHcmWcmXcmYcmZcnacnbcnccnccndcxycjkcnfcmlcngcnicJRbYvcwEcwNcMLbZMbZgbYwcABcjvaKBaaeaadaadaadaadaaaaadaadaadaadaadaaaaadaadaaaaadcnncnocnocnpcnqcnqcnrcnrcnrcnrcnsaadaadaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaAXaaaaadaaaaAXaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbYwbYwbYwbYwbYwcdYbYwcnvbYwbYwbYwcizbQLcpZbZhbQKbQLbQLclwbYwcyDcMDcyzcytcyZczjcyXctjczmczoczlcoCckecpxckdcpBcyRcoCcxJcwDcxJcxJcbvbTSbYNcjccjccjccjccjccjcckVcjccjcckUcpecjeczqbLkczrcnZcoacobcoccodcjkcoecofcogcxXcoibYvcvacwkbYvbQLbZgbYwbQLbQLcAIaaeaaaaaaaadaaaaaaaaaaaaaadaaaaaaaaaaaaaadaadaadcomconcoocopcnqcnrcnrcoqcorcoqcnrcnraadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaAXaAXaAXaAXaAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbYwcLMcLucLAbYwbYwbYwcLtcNRcNLbYwbYwbYwbYwbYwcnzbZhcuScmzbYwcOecNScOycOucMIcMJcMKcNjcLNcMmcMpcMGcNmcNDcNJcNKcqucoCcNkcpccssbYwcOzbWrcOGclRclSdBlclUdBmclWclXdBndBKckUcpJcjecpfbLkbLkbLkbLkbLkbLkbLkcjkcjkcjkcpkcjkcrSbYvbYvcAybYvbQLdBCcnvbZMcpZbYwaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaecpmbYEconcopcnrcnrcoqcoqcpocoqcoqcnrcnraadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwbQLcotbQLbQLcprcDBbYwbYwbYwcozbYwcDLcDIcDGbYwcpWbYwbYwbYwbYwcDTcDScDMcDMcJZcKccJQcJScJOcJPcDYcEbcKTcKUcKOcKSckWcoCcKjbWwcLicLlbYMbTScLmcmPcmQcmRcmScmScmSclXcmTcJTcDcbTXcKNcKJckDcpMcpNdCqcKfcKddCNcpSdBwcpUcpVcNncrSbQLdBxcyEclpclpcpYbYwbYwbYwbYwaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacqacnrcpmcnrcnrcoqcoqcoqcoqcoqcoqcoqcnrcnraadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbQLdBrduYdBodBDctgbYwdBsdBabQLbYwbYwbYwbYwbYwcpWcizcjvbYwdzOckFdAvdBjcxLdALdAPdARctjdASdATdAUcoCdAVcuJcsjdAWcNhcoCcvRdAZcmzbYwcqAbTSdBMcjcdBLcnQcnRcxScnScwwdCsdCtcDcdBJcqGcqHdBIcqJcqKcqKcqKcqKcqKcqLcqMcqNcqOdCrcrSctKcqQcsactKctKctKctKdCudCvaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadcnqcnrcqScqTcqTcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdWbQLcpqcpqcpqcpqcpqbQLbQLbQLbQLbYwaadaadaadbYwcpWbQLdAIcrgcLwclAcLxclCdBicLzcONcOMctjdAkdAmdzNcoCcqzcqIdApcMTdABcoCdAudAxdAHbYwcrtbTSbYNcpbcmTcmScmScmSdBydBzcmTdADdAEdAGcrEcrFdAKcrHcrIcrJcrKcrLcrMcrNcNCcqocNBdCpcrSdBFcrUcrVcrWcNbcrYcMYcKycMXaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacnrcnrcsbcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaadbYwbQLbQLcoybQLbQLbQLbQLbQLcpqcrubYwaadaadaadbYwcpWbZhbQLbYwcrqcmBckGckLcxLcrAcrBcrOctjctjcryctjctbctbctecsEcsEcsEcsEcrvckQckSbYwcrmcrncrocjccKwclUcKpclWdBtdBudBvcKvckUcrpcjecqlckDcsFcsFcsGcsHdCFcqncsKcqmcsMcsNcqocsPcsQcsRcsScsTcsUcsVdCGcrZcsWaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadcnrcoqcoqcoqcoqcoqcoqcsYcoqcsZcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwbQLcotbQLbQLcprcDBbYwbYwbYwcozbYwcDLcDIcDGbYwcpWbYwbYwbYwbYwcDTcDScDMcDMcJZcKccJQcJScJOcJPcDYcEbcKTcKUcKOcKSckWcoCcKjbWwcLicLlbYMbTScLmcmPcmQcmRcmScmScmSclXcmTcJTdwFbTXcKNcKJcrfcpMcpNdCqcKfcKddCNcpSdBwcpUcpVcNncrSbQLdBxcyEclpclpcpYbYwbYwbYwbYwaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacqacnrcpmcnrcnrcoqcoqcoqcoqcoqcoqcoqcnrcnraadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbQLdBrduYdBodBDctgbYwdBsdBabQLbYwbYwbYwbYwbYwcpWcizcjvbYwdzOckFdAvdBjcxLdALdAPdARctjdASdATdAUcoCdAVcuJcsjdAWcNhcoCcvRdAZcmzbYwcqAbTSdBMcjcdBLcnQcnRcxScnScwwdCsdCtdAhdBJcqGcqHdBIcqJcqKcqKcqKcqKcqKcqLcqMcqNcqOdCrcrSctKcqQcsactKctKctKctKdCudCvaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadcnqcnrcqScqTcqTcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdWbQLcpqcpqcpqcpqcpqbQLbQLbQLbQLbYwaadaadaadbYwcpWbQLdAIcrgcLwclAcLxclCdBicLzcONcOMctjdAkdAmdzNcoCcqzcqIdApcMTdABcoCdAudAxdAHbYwcrtbTSbYNcpbcmTcmScmScmSdBydBzcmTdADdAgdAGcrEcrFdAKcrHcrIcrJcrKcrLcrMcrNcNCcqocNBdCpcrSdBFcrUcrVcrWcNbcrYcMYcKycMXaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacnrcnrcsbcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaadbYwbQLbQLcoybQLbQLbQLbQLbQLcpqcrubYwaadaadaadbYwcpWbZhbQLbYwcrqcmBckGckLcxLcrAcrBcrOctjctjcryctjctbctbctecsEcsEcsEcsEcrvckQckSbYwcrmcrncrocjccKwclUcKpclWdBtdBudBvcKvckUcrpcjecqlcrfcsFcsFcsGcsHdCFcqncsKcqmcsMcsNcqocsPcsQcsRcsScsTcsUcsVdCGcrZcsWaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadcnrcoqcoqcoqcoqcoqcoqcsYcoqcsZcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwcqVbQLbQLbQLcizcqccpqcpqbQLcrkbYwaadaaaaadbYwcpWbYwbYwbYwcxLcxLcxLcxLcxLcricrjcrectvcqYcrdcqXckOclIcwCclIclKclIcwBclMcwAclOclPbYMbTSbTTcjcckUckUckUcOAdBGckUckUckUckUcqUbSTcqDctBcrScrScrScrScrSctCcrScpicphcpncqPcrSctHctIctJctKctLctMctNctKaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacnrctOctOctOctOctOctOctPcoqctQctOcsZcoqcoqcoqcoqcnraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwbYwcpqctgcpqbQLcthcqWcvAcpqbYwbYwaadaadaadbYwcpWcpEbYwbWFcpKcLscLrbWKctvcqicsDcsOczvcsXctdctfckOcDPcwCclIcmLclIclKctxcDRclOcszbYMbTSbRFbRvcjScstcsCcvbdBEcvzcttcuncvJbTXcjecswcrScuqcurcuscutcuucuvcuucuwcuxcuycrScrSctKcqQcsactKcuzcskcuBcuCaaeaaeaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuEconconconconconconconcuFcorcoqcoqcoqcoqcuGcorcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbYwbYwbYwcdWbYwbYwbYwbYwbYwaadaadaaaaadbYwcpWdAIcshcLPcJYcpDcpCcpzcpycnFcoAcsmcLkcspctncsncsocoScybcoScxNcyOcyTcwGcyIcnKcsBcnMcnNczGbRvcsfcsicrzcrzdAycrxdAzctocvJcpJcjecrQcrfcuqcurcvfcvfcvgcvhcvicvjcvkcvlcrScvmbQLdACcvpctKctKctKctKctKaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacnrcqTcqTcqTcqTcqTcqTcvqcoqcqScqTcvrcoqcoqcoqcoqcnraadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaaaaaaaadaadaadaadaadaadbYwcpWcizbYwcuecqqdCIcOccrGcrDcrPcrRcrXctvcufcugcujckOcnGcmKclIclKclIcumcLjcLocLvcLCctUcfBctZcsecsecvCcuicuidAwcwOcqEcvBcvJdBJcuacudcrScuqcurcvfcvMcuucvNcuudCHcvPcvQcrScuScdXcvocvRcvSbYwaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadcnrcoqcoqcoqcoqcoqcoqcsYcoqcvrcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadaadbYwbYwbYwcpWbQLbYwbYgbXWcqqbXDbWNctvcqrcojcqpbYwbYwbYwbYwckOclIclKclIcKnclIctDctAcKkckOcJVbYMbTSctscsectzcpAcsucsvctyctFctRcupcjScuRcjectibYZbYZbYZbYZbYZbYZctkbYZctldAMctmcrSbZhbZhcwncwocvSbYwaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacnrcnrcsbcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaadaadbYwbYwbYwcpWbQLbYwbYgbXWcqqbXDbWNctvcqrcojcqpbYwbYwbYwbYwckOclIclKclIcKnclIctDctAcKkckOcJVbYMbTSctscsectzcpAcsucsvctyctFctRcupdwtcuRcjectibYZbYZbYZbYZbYZbYZctkbYZctldAMctmcrSbZhbZhcwncwocvSbYwaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaacnrcnrcsbcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcwscxRcwscAmbYwbYwbYwbYwbYwbYwbYwctTctwcnlctvbYwdCLbQLcvUbYwbYwbYwbYwbYwbYwbYwcvWbYwbYwbYwciWbTSbYNcsecvHcpAcuicuicLQcxrcGhcLOcxFcyCcMhcvIcwgcwdcwccwacvZcvYcvXbRJbYidBeckBckBckBckBcwIcwJbYwbYwbYwaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadcnqcnrctQctOctOcoqcoqcoqcoqcoqcoqcoqcoqcnrcnraadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbYwbYwcvubZxbZxbZxbZxbZxbZxdBfcvVcwjcolcwmcvvdBgbZxbZxbZxcvebZxbZxbZxbZxcvscvnclpdBdcoTcuZcwebYNcsecuYcrhcsycsycsycxmcvLcwRcvxcxkcuTdCJcmjcuUcuOcuNcuQcuPcuMbRJclwcmxbZhcxabQLbQLcwbcxbcxccwpbYwbYwbYwaaeaaaaadaaaaaaaaacxdcxdcxdaadaaaaaaaadaaaaaaaadaaaaaacqacnrcpmcnrcnrcoqcoqcoqcoqcoqcoqcoqcnrcnraadaadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbYwbYwcvubZxbZxbZxbZxbZxbZxdBfcvVcwjcolcwmcvvdBgbZxbZxbZxcvebZxbZxbZxbZxcvscvnclpdBdcoTcuZcwebYNcsecuYcrhcsycsycsycxmcvLcwRdwycxkcuTdCJcmjcuUcuOcuNcuQcuPcuMbRJclwcmxbZhcxabQLbQLcwbcxbcxccwpbYwbYwbYwaaeaaaaadaaaaaaaaacxdcxdcxdaadaaaaaaaadaaaaaaaadaaaaaacqacnrcpmcnrcnrcoqcoqcoqcoqcoqcoqcoqcnrcnraadaadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbYwclfckXbZhcuScizbZhbQLdCCbYwcvtcvwcqhbYwbYwbYwcnCbQLckNcwTcwTcwTcwTbYwcwTcwTcwTcwTclscohclHcsecnmdBccsJcplcuictEcslcnLcvJbWacvdclqcmjcnIcnTcnUcnOcnPcnVbRJbQLcmxbYwbYwbYwbYvbYwbZhcxsdAibPldAjbPlcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcnEcxxbVFbVWcnHcnrcnrcoqcoqcxAcoqcoqcnrcnraadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbYwbYwbYwbZhcdYcnCbZhbYwbYwbYwcwvclJcwxbYwaadbYwclrbYwckNcwTcmrcmrcwTcmpclZcoFcmscwTcwUcwVcwWcsecokcvccsqcsAcuicsxcsedAYcsecvKcmvbWBbRJbRJbRJbRJbRJbRJbRJbRJbQLcmxbYwcmIcmwcaybYwbZhdAldCDbYwbYwbYwaaeaaaaadaaaaaaaaacxdcxdcxdaadaaaaaaaadaaaaaaaadaadaadcxUcxVcoocopcnqcnrcnrcoqcorcoqcnrcnraadaadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadbYwbYwbYwclrbYwbYwaaaaadcwMclLcwMaaaaadaadaaabYwckNcwTcmycmycmCcmAcmDcmDcmDcnecmOcmNcmEcsecsecsecsecsecnkcsecsecnjckzcoQcoKcoLckzbWpckBckBckBckBckBckBckBdAocnvdAncbucuScygcygcyhcyicygaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcyjcnocnocnpcnqcnqcnrcnrcnrcnrcnsaadaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaacCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIcCIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/tgstation.dme b/tgstation.dme index 1db918ed388..117d42bdf40 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -34,6 +34,24 @@ #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\unsorted.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\alien.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" #include "code\ATMOSPHERICS\atmospherics.dm" #include "code\ATMOSPHERICS\datum_pipe_network.dm" #include "code\ATMOSPHERICS\datum_pipeline.dm" @@ -73,7 +91,6 @@ #include "code\datums\datacore.dm" #include "code\datums\datumvars.dm" #include "code\datums\disease.dm" -#include "code\datums\hud.dm" #include "code\datums\limbs.dm" #include "code\datums\mind.dm" #include "code\datums\mixed.dm" @@ -194,7 +211,6 @@ #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\blob_finish.dm" #include "code\game\gamemodes\blob\blob_report.dm" -#include "code\game\gamemodes\blob\hud.dm" #include "code\game\gamemodes\blob\overmind.dm" #include "code\game\gamemodes\blob\powers.dm" #include "code\game\gamemodes\blob\theblob.dm" @@ -429,7 +445,6 @@ #include "code\game\objects\items\crayons.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\tk_grab.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\devices\aicard.dm" @@ -699,6 +714,7 @@ #include "code\modules\clothing\gloves\boxing.dm" #include "code\modules\clothing\gloves\color.dm" #include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\ninja.dm" #include "code\modules\clothing\head\collectable.dm" #include "code\modules\clothing\head\hardhat.dm" #include "code\modules\clothing\head\helmet.dm" @@ -803,12 +819,10 @@ #include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\say.dm" -#include "code\modules\mob\screen.dm" #include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\camera\camera.dm" #include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\hud.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\observer.dm" @@ -837,7 +851,6 @@ #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" #include "code\modules\mob\living\carbon\alien\humanoid\death.dm" #include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\hud.dm" #include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" #include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" #include "code\modules\mob\living\carbon\alien\humanoid\life.dm" @@ -849,7 +862,6 @@ #include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" #include "code\modules\mob\living\carbon\alien\larva\death.dm" #include "code\modules\mob\living\carbon\alien\larva\emote.dm" -#include "code\modules\mob\living\carbon\alien\larva\hud.dm" #include "code\modules\mob\living\carbon\alien\larva\inventory.dm" #include "code\modules\mob\living\carbon\alien\larva\larva.dm" #include "code\modules\mob\living\carbon\alien\larva\life.dm" @@ -861,14 +873,12 @@ #include "code\modules\mob\living\carbon\brain\brain_item.dm" #include "code\modules\mob\living\carbon\brain\death.dm" #include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\hud.dm" #include "code\modules\mob\living\carbon\brain\life.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" #include "code\modules\mob\living\carbon\brain\say.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\hud.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackalien.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" @@ -898,7 +908,6 @@ #include "code\modules\mob\living\carbon\monkey\death.dm" #include "code\modules\mob\living\carbon\monkey\emote.dm" #include "code\modules\mob\living\carbon\monkey\examine.dm" -#include "code\modules\mob\living\carbon\monkey\hud.dm" #include "code\modules\mob\living\carbon\monkey\inventory.dm" #include "code\modules\mob\living\carbon\monkey\life.dm" #include "code\modules\mob\living\carbon\monkey\login.dm" @@ -914,7 +923,6 @@ #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\hud.dm" #include "code\modules\mob\living\silicon\ai\laws.dm" #include "code\modules\mob\living\silicon\ai\life.dm" #include "code\modules\mob\living\silicon\ai\login.dm" @@ -940,7 +948,6 @@ #include "code\modules\mob\living\silicon\robot\death.dm" #include "code\modules\mob\living\silicon\robot\emote.dm" #include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\hud.dm" #include "code\modules\mob\living\silicon\robot\inventory.dm" #include "code\modules\mob\living\silicon\robot\laws.dm" #include "code\modules\mob\living\silicon\robot\life.dm" @@ -980,7 +987,6 @@ #include "code\modules\mob\living\simple_animal\hostile\tree.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\new_player\hud.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm"