diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index f5f3c6554f..3edaaf900f 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -380,7 +380,7 @@ to_chat(user, "Now welding the vent.") if(do_after(user, 20 * WT.toolspeed)) if(!src || !WT.isOn()) return - playsound(src.loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) if(!welded) user.visible_message("\The [user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") welded = 1 diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index 215f3498b7..e0f6f7d951 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -78,7 +78,7 @@ /obj/machinery/atmospherics/pipe/simple/proc/burst() src.visible_message("\The [src] bursts!"); - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + playsound(src, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 59837bbe5f..4d92a42c35 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -97,7 +97,7 @@ atom/movable/proc/airflow_hit(atom/A) mob/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("\The [src] slams into \a [A]!",1,"You hear a loud slam!",2) - playsound(src.loc, "smash.ogg", 25, 1, -1) + playsound(src, "smash.ogg", 25, 1, -1) var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh Weaken(weak_amt) . = ..() @@ -105,7 +105,7 @@ mob/airflow_hit(atom/A) obj/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("\The [src] slams into \a [A]!",1,"You hear a loud slam!",2) - playsound(src.loc, "smash.ogg", 25, 1, -1) + playsound(src, "smash.ogg", 25, 1, -1) . = ..() obj/item/airflow_hit(atom/A) @@ -115,7 +115,7 @@ obj/item/airflow_hit(atom/A) mob/living/carbon/human/airflow_hit(atom/A) // for(var/mob/M in hearers(src)) // M.show_message("[src] slams into [A]!",1,"You hear a loud slam!",2) - playsound(src.loc, "punch", 25, 1, -1) + playsound(src, "punch", 25, 1, -1) if (prob(33)) loc:add_blood(src) bloody_body(src) diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index a8e3951a3e..c2d33e0726 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -67,6 +67,7 @@ What is the naming convention for planes or layers? #define UNDERWATER_LAYER 2.5 // Anything on this layer will render under the water layer. #define WATER_LAYER 3.0 // Layer for water overlays. #define ABOVE_TURF_LAYER 3.1 // Snow and wallmounted/floormounted equipment + #define TURF_DECAL_LAYER 3.2 // Mapped in floor decals, not automatic edges/corners #define DECAL_PLANE -44 // Permanent decals #define DIRTY_PLANE -43 // Nonpermanent decals #define BLOOD_PLANE -42 // Blood is really dirty, but we can do special stuff if we separate it diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index e59dac70c5..2ff8f44dba 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -29,8 +29,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define OPENCONTAINER (1<<4) // Is an open container for chemistry purposes. #define PHORONGUARD (1<<5) // Does not get contaminated by phoron. #define NOREACT (1<<6) // Reagents don't react inside this container. -#define PROXMOVE (1<<7)// Does this object require proximity checking in Enter()? -#define OVERLAY_QUEUED (1<<8)// Atom queued to SSoverlay for COMPILE_OVERLAYS +#define OVERLAY_QUEUED (1<<7)// Atom queued to SSoverlay for COMPILE_OVERLAYS //Flags for items (equipment) - Used in /obj/item/var/item_flags #define THICKMATERIAL (1<<0) // Prevents syringes, parapens and hyposprays if equipped to slot_suit or slot_head. diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm index d7bab37345..d7aaed2ce8 100644 --- a/code/__defines/is_helpers.dm +++ b/code/__defines/is_helpers.dm @@ -19,6 +19,8 @@ #define isorgan(A) istype(A, /obj/item/organ/external) +#define isstorage(A) istype(A, /obj/item/weapon/storage) + //--------------- //#define isarea(D) istype(D, /area) //Built in @@ -54,4 +56,4 @@ //--------------- //#define isturf(D) istype(D, /turf) //Built in #define isopenspace(A) istype(A, /turf/simulated/open) -#define isspace(A) istype(A, /turf/space) +#define isspace(A) istype(A, /turf/space) diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index ffbda3e298..27250bc9a2 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -17,28 +17,28 @@ #define SLOT_BELT 0x200 #define SLOT_BACK 0x400 #define SLOT_POCKET 0x800 // This is to allow items with a w_class of 3 or 4 to fit in pockets. -#define SLOT_DENYPOCKET 0x1000 // This is to deny items with a w_class of 2 or 1 from fitting in pockets. +#define SLOT_DENYPOCKET 0x1000 // This is to deny items with a w_class of 2 or 1 from fitting in pockets. #define SLOT_TWOEARS 0x2000 #define SLOT_TIE 0x4000 -#define SLOT_HOLSTER 0x8000 //16th bit - higher than this will overflow +#define SLOT_HOLSTER 0x8000 //24 bit - higher than 0x80000 will overflow -#define ACCESSORY_SLOT_UTILITY 0x1 -#define ACCESSORY_SLOT_WEAPON 0x2 +#define ACCESSORY_SLOT_UTILITY 0x1 +#define ACCESSORY_SLOT_WEAPON 0x2 #define ACCESSORY_SLOT_ARMBAND 0x4 -#define ACCESSORY_SLOT_DECOR 0x8 -#define ACCESSORY_SLOT_MEDAL 0x20 -#define ACCESSORY_SLOT_TIE 0x40 -#define ACCESSORY_SLOT_INSIGNIA 0x80 -#define ACCESSORY_SLOT_OVER 0x100 +#define ACCESSORY_SLOT_RANK 0x8 +#define ACCESSORY_SLOT_DEPT 0x20 +#define ACCESSORY_SLOT_DECOR 0x40 +#define ACCESSORY_SLOT_MEDAL 0x80 +#define ACCESSORY_SLOT_TIE 0x100 +#define ACCESSORY_SLOT_INSIGNIA 0x200 +#define ACCESSORY_SLOT_OVER 0x400 //Should these really be 'accessory' accessories -#define ACCESSORY_SLOT_ARMOR_C 0x200 -#define ACCESSORY_SLOT_ARMOR_A 0x400 -#define ACCESSORY_SLOT_ARMOR_L 0x800 -#define ACCESSORY_SLOT_ARMOR_S 0x1000 -#define ACCESSORY_SLOT_ARMOR_M 0x2000 -#define ACCESSORY_SLOT_HELM_C 0x4000 - -#define ACCESSORY_SLOT_TORSO (ACCESSORY_SLOT_UTILITY|ACCESSORY_SLOT_WEAPON) +#define ACCESSORY_SLOT_ARMOR_C 0x800 +#define ACCESSORY_SLOT_ARMOR_A 0x1000 +#define ACCESSORY_SLOT_ARMOR_L 0x2000 +#define ACCESSORY_SLOT_ARMOR_S 0x4000 +#define ACCESSORY_SLOT_ARMOR_M 0x8000 +#define ACCESSORY_SLOT_HELM_C 0x10000 //24 bit - higher than 0x80000 will overflow // Bitmasks for the /obj/item/var/flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // WARNING: The following flags apply only to the external suit! diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index 8ad6fdfcf5..ca8eac889f 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -82,6 +82,7 @@ #define LIGHT_COLOR_INCANDESCENT_TUBE "#FFFEB8" #define LIGHT_COLOR_INCANDESCENT_BULB "#FFDDBB" #define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66" +#define LIGHT_COLOR_NIGHTSHIFT "#EFCC86" //Fake ambient occlusion filter #define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, offset=3, color="#04080F80") diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index 3737d92c3d..dbe66b1243 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -18,6 +18,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define USE_POWER_ACTIVE 2 // Machine is using power at its active power level // Channel numbers for power. +#define CURRENT_CHANNEL -1 // Passed as an argument this means "use whatever current channel is" #define EQUIP 1 #define LIGHT 2 #define ENVIRON 3 diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 84d0ac1307..20695d6534 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -372,3 +372,8 @@ var/global/list/##LIST_NAME = list();\ // Used by radios to indicate that they have sent a message via something other than subspace #define RADIO_CONNECTION_FAIL 0 #define RADIO_CONNECTION_NON_SUBSPACE 1 + +#define JOB_CARBON 0x1 +#define JOB_SILICON_ROBOT 0x2 +#define JOB_SILICON_AI 0x4 +#define JOB_SILICON 0x6 // 2|4, probably don't set jobs to this, but good for checking diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index fd55905300..0fa2532bf9 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -68,8 +68,9 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_ASSETS -3 #define INIT_ORDER_PLANETS -4 #define INIT_ORDER_HOLOMAPS -5 -#define INIT_ORDER_OVERLAY -6 -#define INIT_ORDER_ALARM -7 +#define INIT_ORDER_NIGHTSHIFT -6 +#define INIT_ORDER_OVERLAY -7 +#define INIT_ORDER_ALARM -8 #define INIT_ORDER_OPENSPACE -10 #define INIT_ORDER_XENOARCH -20 #define INIT_ORDER_CIRCUIT -21 @@ -84,6 +85,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) #define FIRE_PRIORITY_SHUTTLES 5 #define FIRE_PRIORITY_SUPPLY 5 +#define FIRE_PRIORITY_NIGHTSHIFT 5 #define FIRE_PRIORITY_ORBIT 8 #define FIRE_PRIORITY_VOTE 9 #define FIRE_PRIORITY_AI 10 diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm index bf4c3de6fe..64593f6e11 100644 --- a/code/__defines/turfs.dm +++ b/code/__defines/turfs.dm @@ -9,5 +9,12 @@ #define TURF_IS_FRAGILE 256 #define TURF_ACID_IMMUNE 512 +//Used for floor/wall smoothing +#define SMOOTH_NONE 0 //Smooth only with itself +#define SMOOTH_ALL 1 //Smooth with all of type +#define SMOOTH_WHITELIST 2 //Smooth with a whitelist of subtypes +#define SMOOTH_BLACKLIST 3 //Smooth with all but a blacklist of subtypes +#define SMOOTH_GREYLIST 4 // Use a whitelist and a blacklist at the same time. atom smoothing only + #define isCardinal(x) (x == NORTH || x == SOUTH || x == EAST || x == WEST) #define isDiagonal(x) (x == NORTHEAST || x == SOUTHEAST || x == NORTHWEST || x == SOUTHWEST) \ No newline at end of file diff --git a/code/_helpers/_lists.dm b/code/_helpers/_lists.dm index d844d61b5c..124f69f45e 100644 --- a/code/_helpers/_lists.dm +++ b/code/_helpers/_lists.dm @@ -16,7 +16,7 @@ */ //Returns a list in plain english as a string -/proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "") +/proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = ",") // this proc cannot be merged with counting_english_list to maintain compatibility // with shoddy use of this proc for code logic and for cases that require original order switch(input.len) @@ -26,7 +26,7 @@ else return "[jointext(input, comma_text, 1, -1)][final_comma_text][and_text][input[input.len]]" //Returns a newline-separated list that counts equal-ish items, outputting count and item names, optionally with icons and specific determiners -/proc/counting_english_list(var/list/input, output_icons = TRUE, determiners = DET_NONE, nothing_text = "nothing", line_prefix = "\t", first_item_prefix = "\n", last_item_suffix = "\n", and_text = "\n", comma_text = "\n", final_comma_text = "") +/proc/counting_english_list(var/list/input, output_icons = TRUE, determiners = DET_NONE, nothing_text = "nothing", line_prefix = "\t", first_item_prefix = "\n", last_item_suffix = "\n", and_text = "\n", comma_text = "\n", final_comma_text = ",") var/list/counts = list() // counted input items var/list/items = list() // actual objects for later reference (for icons and formatting) diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 7be9093596..16fdec7bd0 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -231,35 +231,43 @@ . = list() // Returns a list of mobs who can hear any of the radios given in @radios var/list/speaker_coverage = list() - for(var/obj/item/device/radio/R in radios) - if(R) - //Cyborg checks. Receiving message uses a bit of cyborg's charge. - var/obj/item/device/radio/borg/BR = R - if(istype(BR) && BR.myborg) - var/mob/living/silicon/robot/borg = BR.myborg - var/datum/robot_component/CO = borg.get_component("radio") - if(!CO) - continue //No radio component (Shouldn't happen) - if(!borg.is_component_functioning("radio") || !borg.cell_use_power(CO.active_usage)) - continue //No power. - - var/turf/speaker = get_turf(R) - if(speaker) - for(var/turf/T in hear(R.canhear_range,speaker)) - speaker_coverage[T] = R + for(var/r in radios) + var/obj/item/device/radio/R = r // You better fucking be a radio. + var/turf/speaker = get_turf(R) + if(speaker) + for(var/turf/T in hear(R.canhear_range,speaker)) + speaker_coverage[T] = R // Try to find all the players who can hear the message for(var/i = 1; i <= player_list.len; i++) var/mob/M = player_list[i] - if(M) - var/turf/ear = get_turf(M) - if(ear) - // Ghostship is magic: Ghosts can hear radio chatter from anywhere - if(speaker_coverage[ear] || (istype(M, /mob/observer/dead) && M.is_preference_enabled(/datum/client_preference/ghost_radio))) - . |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down. + if(M.can_hear_radio(speaker_coverage)) + . += M return . +/mob/proc/can_hear_radio(var/list/hearturfs) + return FALSE + +/mob/living/can_hear_radio(var/list/hearturfs) + return get_turf(src) in hearturfs + +/mob/living/silicon/robot/can_hear_radio(var/list/hearturfs) + var/turf/T = get_turf(src) + var/obj/item/device/radio/borg/R = hearturfs[T] // this should be an assoc list of turf-to-radio + + // We heard it on our own radio? We use power for that. + if(istype(R) && R.myborg == src) + var/datum/robot_component/CO = get_component("radio") + if(!CO || !is_component_functioning("radio") || !cell_use_power(CO.active_usage)) + return FALSE // Sorry, couldn't hear + + return R // radio, true, false, what's the difference + +/mob/observer/dead/can_hear_radio(var/list/hearturfs) + return is_preference_enabled(/datum/client_preference/ghost_radio) + + //Uses dview to quickly return mobs and objects in view, // then adds additional mobs or objects if they are in range 'smartly', // based on their presence in lists of players or registered objects @@ -272,17 +280,17 @@ var/list/hearturfs = list() for(var/thing in hear) - if(istype(thing,/obj)) + if(istype(thing, /obj)) //Can't use isobj() because /atom/movable returns true in that, and so lighting overlays would be included objs += thing hearturfs |= get_turf(thing) - else if(istype(thing,/mob)) + if(ismob(thing)) mobs += thing hearturfs |= get_turf(thing) //A list of every mob with a client for(var/mob in player_list) - if(!istype(mob, /mob)) - crash_with("There is a null or non-mob reference inside player_list.") + if(!ismob(mob)) + player_list -= mob continue if(get_turf(mob) in hearturfs) mobs |= mob diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index c075925fdd..8648225d3a 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -18,6 +18,7 @@ #define DS2TICKS(DS) ((DS)/world.tick_lag) // Convert deciseconds to ticks #define TICKS2DS(T) ((T) TICKS) // Convert ticks to deciseconds +#define DS2NEARESTTICK(DS) TICKS2DS(-round(-(DS2TICKS(DS)))) /proc/get_game_time() var/global/time_offset = 0 @@ -35,25 +36,25 @@ return wtime + (time_offset + wusage) * world.tick_lag -var/roundstart_hour +GLOBAL_VAR_INIT(roundstart_hour, pick(2,7,12,17)) var/station_date = "" var/next_station_date_change = 1 DAY -#define duration2stationtime(time) time2text(station_time_in_ticks + time, "hh:mm") -#define worldtime2stationtime(time) time2text(roundstart_hour HOURS + time, "hh:mm") -#define round_duration_in_ticks (round_start_time ? world.time - round_start_time : 0) -#define station_time_in_ticks (roundstart_hour HOURS + round_duration_in_ticks) +#define duration2stationtime(time) time2text(station_time_in_ds + time, "hh:mm") +#define worldtime2stationtime(time) time2text(GLOB.roundstart_hour HOURS + time, "hh:mm") +#define round_duration_in_ds (GLOB.round_start_time ? world.time - GLOB.round_start_time : 0) +#define station_time_in_ds (GLOB.roundstart_hour HOURS + round_duration_in_ds) /proc/stationtime2text() - return time2text(station_time_in_ticks, "hh:mm") + return time2text(station_time_in_ds + GLOB.timezoneOffset, "hh:mm") /proc/stationdate2text() var/update_time = FALSE - if(station_time_in_ticks > next_station_date_change) + if(station_time_in_ds > next_station_date_change) next_station_date_change += 1 DAY update_time = TRUE if(!station_date || update_time) - var/extra_days = round(station_time_in_ticks / (1 DAY)) DAYS + var/extra_days = round(station_time_in_ds / (1 DAY)) DAYS var/timeofday = world.timeofday + extra_days station_date = num2text((text2num(time2text(timeofday, "YYYY"))+544)) + "-" + time2text(timeofday, "MM-DD") return station_date @@ -64,6 +65,13 @@ var/next_station_date_change = 1 DAY var/time_portion = time2text(world.timeofday, "hh:mm:ss") return "[date_portion]T[time_portion]" +/proc/get_timezone_offset() + var/midnight_gmt_here = text2num(time2text(0,"hh")) * 36000 + if(midnight_gmt_here > 12 HOURS) + return 24 HOURS - midnight_gmt_here + else + return midnight_gmt_here + /proc/gameTimestamp(format = "hh:mm:ss", wtime=null) if(!wtime) wtime = world.time @@ -83,19 +91,19 @@ proc/isDay(var/month, var/day) var/next_duration_update = 0 var/last_round_duration = 0 -var/round_start_time = 0 +GLOBAL_VAR_INIT(round_start_time, 0) /hook/roundstart/proc/start_timer() - round_start_time = world.time + GLOB.round_start_time = world.time return 1 /proc/roundduration2text() - if(!round_start_time) + if(!GLOB.round_start_time) return "00:00" if(last_round_duration && world.time < next_duration_update) return last_round_duration - var/mills = round_duration_in_ticks // 1/10 of a second, not real milliseconds but whatever + var/mills = round_duration_in_ds // 1/10 of a second, not real milliseconds but whatever //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something var/mins = round((mills % 36000) / 600) var/hours = round(mills / 36000) @@ -112,10 +120,6 @@ var/round_start_time = 0 var/datum/controller/process/process = processScheduler.getProcess(process_name) return process.schedule_interval -/hook/startup/proc/set_roundstart_hour() - roundstart_hour = pick(2,7,12,17) - return 1 - /var/midnight_rollovers = 0 /var/rollovercheck_last_timeofday = 0 /proc/update_midnight_rollover() diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index a9cede52de..5a0a519743 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -169,3 +169,11 @@ T.ChangeTurf(get_base_turf_by_area(T)) return TRUE + +//Used for border objects. This returns true if this atom is on the border between the two specified turfs +//This assumes that the atom is located inside the target turf +/atom/proc/is_between_turfs(var/turf/origin, var/turf/target) + if (flags & ON_BORDER) + var/testdir = get_dir(target, origin) + return (dir & testdir) + return TRUE diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 15b65755c7..b431ac1298 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -23,9 +23,10 @@ /mob/living/silicon/ai/ClickOn(var/atom/A, params) - if(world.time <= next_click) + if(!checkClickCooldown()) return - next_click = world.time + 1 + + setClickCooldown(1) if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked build_click(src, client.buildmode, params, A) @@ -42,6 +43,9 @@ if(stat) return + if(control_disabled) + return + var/list/modifiers = params2list(params) if(modifiers["shift"] && modifiers["ctrl"]) CtrlShiftClickOn(A) @@ -52,27 +56,18 @@ if(modifiers["shift"]) ShiftClickOn(A) return - if(modifiers["alt"]) // alt and alt-gr (rightalt) + if(modifiers["alt"]) AltClickOn(A) return if(modifiers["ctrl"]) CtrlClickOn(A) return - if(control_disabled || !canClick()) - return - if(aiCamera.in_camera_mode) aiCamera.camera_mode_off() aiCamera.captureimage(A, usr) return - /* - AI restrained() currently does nothing - if(restrained()) - RestrainedClickOn(A) - else - */ A.add_hiddenprint(src) A.attack_ai(src) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 8184c122e2..5b7a043569 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -38,10 +38,10 @@ * 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) // Hard check, before anything else, to avoid crashing + if(!checkClickCooldown()) // Hard check, before anything else, to avoid crashing return - next_click = world.time + 1 + setClickCooldown(1) if(client && client.buildmode) build_click(src, client.buildmode, params, A) @@ -69,9 +69,6 @@ face_atom(A) // change direction to face what you clicked on - if(!canClick()) // in the year 2000... - return - if(istype(loc, /obj/mecha)) if(!locate(/turf) in list(A, A.loc)) // Prevents inventory from being drilled return @@ -143,12 +140,12 @@ return 1 /mob/proc/setClickCooldown(var/timeout) - next_move = max(world.time + timeout, next_move) + next_click = max(world.time + timeout, next_click) -/mob/proc/canClick() - if(config.no_click_cooldown || next_move <= world.time) - return 1 - return 0 +/mob/proc/checkClickCooldown() + if(next_click > world.time && !config.no_click_cooldown) + return FALSE + return TRUE // Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click /mob/proc/DblClickOn(var/atom/A, var/params) @@ -295,7 +292,7 @@ var/obj/item/projectile/beam/LE = new (T) LE.icon = 'icons/effects/genetics.dmi' LE.icon_state = "eyelasers" - playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + playsound(src, 'sound/weapons/taser2.ogg', 75, 1) LE.firer = src LE.preparePixelProjectile(A, src, params) LE.fire() diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index f8bce398a6..0c99425147 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -7,9 +7,10 @@ */ /mob/living/silicon/robot/ClickOn(var/atom/A, var/params) - if(world.time <= next_click) + if(!checkClickCooldown()) return - next_click = world.time + 1 + + setClickCooldown(1) if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked build_click(src, client.buildmode, params, A) @@ -35,9 +36,6 @@ if(stat || lockdown || weakened || stunned || paralysis) return - if(!canClick()) - return - face_atom(A) // change direction to face what you clicked on if(aiCamera && aiCamera.in_camera_mode) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 4736d5d074..828a86fe2b 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -78,6 +78,13 @@ #define ui_ai_multicam "SOUTH+1:6,WEST+13" #define ui_ai_add_multicam "SOUTH+1:6,WEST+14" +//Upper-middle right (alerts) +#define ui_alert1 "EAST-1:28,CENTER+5:27" +#define ui_alert2 "EAST-1:28,CENTER+4:25" +#define ui_alert3 "EAST-1:28,CENTER+3:23" +#define ui_alert4 "EAST-1:28,CENTER+2:21" +#define ui_alert5 "EAST-1:28,CENTER+1:19" + //Gun buttons #define ui_gun1 "EAST-2:26,SOUTH+2:7" #define ui_gun2 "EAST-1:28, SOUTH+3:7" @@ -96,13 +103,12 @@ #define ui_alien_oxygen "EAST-1:28,NORTH-4:25" //Middle right (status indicators) -#define ui_nutrition "EAST-1:28,CENTER-2:11" -#define ui_temp "EAST-1:28,CENTER-1:13" -#define ui_health "EAST-1:28,CENTER:15" -#define ui_internal "EAST-1:28,CENTER+1:17" +#define ui_temp "EAST-1:28,CENTER-2:13" +#define ui_health "EAST-1:28,CENTER-1:15" +#define ui_internal "EAST-1:28,CENTER:17" //borgs -#define ui_borg_health "EAST-1:28,CENTER-1:13" //borgs have the health display where humans have the pressure damage indicator. -#define ui_alien_health "EAST-1:28,CENTER-1:13" //aliens have the health display where humans have the pressure damage indicator. +#define ui_borg_health "EAST-1:28,CENTER-2:13" //borgs have the health display where humans have the pressure damage indicator. +#define ui_alien_health "EAST-1:28,CENTER-2:13" //aliens have the health display where humans have the pressure damage indicator. #define ui_ling_chemical_display "EAST-1:28,CENTER-3:15" #define ui_wiz_energy_display "EAST-1:28,CENTER-3:15" diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index b5299cd77b..c123790b51 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -123,7 +123,7 @@ if(modifiers["shift"]) moved = 0 return 1 - if(usr.next_move >= world.time) // Is this needed ? + if(!usr.checkClickCooldown()) return owner.Trigger() return 1 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm new file mode 100644 index 0000000000..f45f8f3d3a --- /dev/null +++ b/code/_onclick/hud/alert.dm @@ -0,0 +1,445 @@ +//A system to manage and display alerts on screen without needing you to do it yourself + +//PUBLIC - call these wherever you want + + +/mob/proc/throw_alert(category, type, severity, obj/new_master) + +/* Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already + category is a text string. Each mob may only have one alert per category; the previous one will be replaced + path is a type path of the actual alert type to throw + severity is an optional number that will be placed at the end of the icon_state for this alert + For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2" + new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay. + Clicks are forwarded to master */ + + if(!category) + return + + var/obj/screen/alert/alert + if(alerts[category]) + alert = alerts[category] + if(new_master && new_master != alert.master) + WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [alert.master]") + clear_alert(category) + return .() + else if(alert.type != type) + clear_alert(category) + return .() + else if(!severity || severity == alert.severity) + if(alert.timeout) + clear_alert(category) + return .() + else //no need to update + return 0 + else + alert = new type + + if(new_master) + var/old_layer = new_master.layer + var/old_plane = new_master.plane + new_master.layer = LAYER_HUD_ABOVE + new_master.plane = PLANE_PLAYER_HUD_ABOVE + alert.overlays += new_master + new_master.layer = old_layer + new_master.plane = old_plane + alert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts() + alert.master = new_master + else + alert.icon_state = "[initial(alert.icon_state)][severity]" + alert.severity = severity + + alerts[category] = alert + if(client && hud_used) + hud_used.reorganize_alerts() + alert.transform = matrix(32, 6, MATRIX_TRANSLATE) + animate(alert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + + if(alert.timeout) + addtimer(CALLBACK(src, .proc/alert_timeout, alert, category), alert.timeout) + alert.timeout = world.time + alert.timeout - world.tick_lag + return alert + +/mob/proc/alert_timeout(obj/screen/alert/alert, category) + if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout) + clear_alert(category) + +// Proc to clear an existing alert. +/mob/proc/clear_alert(category) + var/obj/screen/alert/alert = alerts[category] + if(!alert) + return 0 + + alerts -= category + if(client && hud_used) + hud_used.reorganize_alerts() + client.screen -= alert + qdel(alert) + +/obj/screen/alert + icon = 'icons/mob/screen_alert.dmi' + icon_state = "default" + name = "Alert" + desc = "Something seems to have gone wrong with this alert, so report this bug please" + mouse_opacity = 1 + var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds + var/severity = 0 + var/alerttooltipstyle = "" + + +/obj/screen/alert/MouseEntered(location,control,params) + openToolTip(usr, src, params, title = name, content = desc, theme = alerttooltipstyle) + + +/obj/screen/alert/MouseExited() + closeToolTip(usr) + + +//Gas alerts +/obj/screen/alert/not_enough_oxy + name = "Choking (No O2)" + desc = "You're not getting enough oxygen. Find some good air before you pass out! \ +The box in your backpack has an oxygen tank and breath mask in it." + icon_state = "not_enough_oxy" + +/obj/screen/alert/too_much_oxy + name = "Choking (O2)" + desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_oxy" + +/obj/screen/alert/not_enough_nitro + name = "Choking (No N)" + desc = "You're not getting enough nitrogen. Find some good air before you pass out!" + icon_state = "not_enough_nitro" + +/obj/screen/alert/too_much_nitro + name = "Choking (N)" + desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_nitro" + +/obj/screen/alert/not_enough_co2 + name = "Choking (No CO2)" + desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!" + icon_state = "not_enough_co2" + +/obj/screen/alert/too_much_co2 + name = "Choking (CO2)" + desc = "There's too much carbon dioxide in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_co2" + +/obj/screen/alert/too_much_co2/plant + name = "Livin' the good life" + desc = "There's so much carbon dioxide in the air, you're in fucking heaven. Watch out for passed out fleshies, though." + icon_state = "too_much_co2" + +/obj/screen/alert/not_enough_tox + name = "Choking (No Phoron)" + desc = "You're not getting enough phoron. Find some good air before you pass out!" + icon_state = "not_enough_tox" + +/obj/screen/alert/tox_in_air + name = "Choking (Phoron)" + desc = "There's highly flammable, toxic phoron in the air and you're breathing it in. Find some fresh air. \ +The box in your backpack has an oxygen tank and gas mask in it." + icon_state = "too_much_tox" + +/obj/screen/alert/not_enough_fuel + name = "Choking (No Volatile fuel)" + desc = "You're not getting enough volatile fuel. Find some good air before you pass out!" + icon_state = "not_enough_tox" + +/obj/screen/alert/not_enough_n2o + name = "Choking (No Sleeping Gas)" + desc = "You're not getting enough sleeping gas. Find some good air before you pass out!" + icon_state = "not_enough_tox" +//End gas alerts + + +/obj/screen/alert/fat + name = "Fat" + desc = "You ate too much food, lardass. Run around the station and lose some weight." + icon_state = "fat" + +/obj/screen/alert/fat/vampire + desc = "You drank too much blood, lardass. Run around the station and lose some weight." + icon_state = "v_fat" + +/obj/screen/alert/fat/synth + desc = "Your battery is full! Don't overvolt it." + icon_state = "c_fat" + +/obj/screen/alert/hungry + name = "Hungry" + desc = "Some food would be good right about now." + icon_state = "hungry" + +/obj/screen/alert/hungry/vampire + desc = "You could use a bloodsnack or two." + icon_state = "v_hungry" + +/obj/screen/alert/hungry/synth + desc = "Battery's running a bit low, could use a topoff." + icon_state = "c_hungry" + +/obj/screen/alert/starving + name = "Starving" + desc = "You're severely malnourished. The hunger pains make moving around a chore." + icon_state = "starving" + +/obj/screen/alert/starving/vampire + desc = "You *need* blood; go rip out someone's throat already!" + icon_state = "v_starving" + +/obj/screen/alert/starving/synth + desc = "Your battery is about to die! Charge it ASAP!" + icon_state = "c_starving" + +/obj/screen/alert/hot + name = "Too Hot" + desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit." + icon_state = "hot" + +/obj/screen/alert/hot/robot + desc = "The air around you is too hot for a humanoid. Be careful to avoid exposing them to this enviroment." + +/obj/screen/alert/cold + name = "Too Cold" + desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit." + icon_state = "cold" + +/obj/screen/alert/cold/robot + desc = "The air around you is too cold for a humanoid. Be careful to avoid exposing them to this enviroment." + +/obj/screen/alert/lowpressure + name = "Low Pressure" + desc = "The air around you is hazardously thin. A space suit would protect you." + icon_state = "lowpressure" + +/obj/screen/alert/highpressure + name = "High Pressure" + desc = "The air around you is hazardously thick. A fire suit would protect you." + icon_state = "highpressure" + +/obj/screen/alert/blind + name = "Blind" + desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \ +or something covering your eyes." + icon_state = "blind" + +/obj/screen/alert/high + name = "High" + desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." + icon_state = "high" + +/obj/screen/alert/embeddedobject + name = "Embedded Object" + desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ +If you're feeling frisky, right click on yourself and select \"Remove embedded object\" to pull the object out." + icon_state = "embeddedobject" + +/obj/screen/alert/embeddedobject/Click() + if(isliving(usr)) + var/mob/living/carbon/human/M = usr + return M.help_shake_act(M) + +/obj/screen/alert/asleep + name = "Asleep" + desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." + icon_state = "asleep" + +/obj/screen/alert/weightless + name = "Weightless" + desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ +wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ +magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extinguisher, \ +or shoot a gun to move around via Newton's 3rd Law of Motion." + icon_state = "weightless" + +/obj/screen/alert/fire + name = "On Fire" + desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area." + icon_state = "fire" + +/obj/screen/alert/fire/Click() + if(isliving(usr)) + var/mob/living/L = usr + return L.resist() + + +//ALIENS + +/obj/screen/alert/alien_tox + name = "Plasma" + desc = "There's flammable plasma in the air. If it lights up, you'll be toast." + icon_state = "alien_tox" + alerttooltipstyle = "alien" + +/obj/screen/alert/alien_fire +// This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire + name = "Too Hot" + desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you." + icon_state = "alien_fire" + alerttooltipstyle = "alien" + +/obj/screen/alert/alien_vulnerable + name = "Severed Matriarchy" + desc = "Your queen has been killed, you will suffer movement penalties and loss of hivemind. A new queen cannot be made until you recover." + icon_state = "alien_noqueen" + alerttooltipstyle = "alien" + +//BLOBS + +/obj/screen/alert/nofactory + name = "No Factory" + desc = "You have no factory, and are slowly dying!" + icon_state = "blobbernaut_nofactory" + alerttooltipstyle = "blob" + +//SILICONS + +/obj/screen/alert/nocell + name = "Missing Power Cell" + desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance." + icon_state = "nocell" + +/obj/screen/alert/emptycell + name = "Out of Power" + desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged. \ +Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." + icon_state = "emptycell" + +/obj/screen/alert/lowcell + name = "Low Charge" + desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." + icon_state = "lowcell" + +//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg +/obj/screen/alert/hacked + name = "Hacked" + desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any." + icon_state = "hacked" + +/obj/screen/alert/locked + name = "Locked Down" + desc = "Unit has been remotely locked down. Usage of a Robotics Control Console like the one in the Research Director's \ +office by your AI master or any qualified human may resolve this matter. Robotics may provide further assistance if necessary." + icon_state = "locked" + +/obj/screen/alert/newlaw + name = "Law Update" + desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \ +so as to remain in compliance with the most up-to-date laws." + icon_state = "newlaw" + timeout = 300 + +//MECHS + +/obj/screen/alert/low_mech_integrity + name = "Mech Damaged" + desc = "Mech integrity is low." + icon_state = "low_mech_integrity" + + +//GHOSTS +//TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages +/obj/screen/alert/notify_cloning + name = "Revival" + desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!" + icon_state = "template" + timeout = 300 + +/obj/screen/alert/notify_cloning/Click() + if(!usr || !usr.client) return + var/mob/observer/dead/G = usr + G.reenter_corpse() + +// /obj/screen/alert/notify_jump +// name = "Body created" +// desc = "A body was created. You can enter it." +// icon_state = "template" +// timeout = 300 +// var/atom/jump_target = null +// var/attack_not_jump = null + +// /obj/screen/alert/notify_jump/Click() +// if(!usr || !usr.client) return +// if(!jump_target) return +// var/mob/dead/observer/G = usr +// if(!istype(G)) return +// if(attack_not_jump) +// jump_target.attack_ghost(G) +// else +// var/turf/T = get_turf(jump_target) +// if(T && isturf(T)) +// G.loc = T + +//OBJECT-BASED + +/obj/screen/alert/restrained/buckled + name = "Buckled" + desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed." + +/obj/screen/alert/restrained/handcuffed + name = "Handcuffed" + desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself." + +/obj/screen/alert/restrained/legcuffed + name = "Legcuffed" + desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself." + +/obj/screen/alert/restrained/Click() + if(isliving(usr)) + var/mob/living/L = usr + return L.resist() +// PRIVATE = only edit, use, or override these if you're editing the system as a whole + +// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there +/datum/hud/proc/reorganize_alerts() + var/list/alerts = mymob.alerts + var/icon_pref + if(!hud_shown) + for(var/i = 1, i <= alerts.len, i++) + mymob.client.screen -= alerts[alerts[i]] + return 1 + for(var/i = 1, i <= alerts.len, i++) + var/obj/screen/alert/alert = alerts[alerts[i]] + if(alert.icon_state == "template") + if(!icon_pref) + icon_pref = ui_style2icon(mymob.client.prefs.UI_style) + alert.icon = icon_pref + switch(i) + if(1) + . = ui_alert1 + if(2) + . = ui_alert2 + if(3) + . = ui_alert3 + if(4) + . = ui_alert4 + if(5) + . = ui_alert5 // Right now there's 5 slots + else + . = "" + alert.screen_loc = . + mymob.client.screen |= alert + return 1 + +/mob + var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + +/obj/screen/alert/Click(location, control, params) + if(!usr || !usr.client) + return + var/paramslist = params2list(params) + if(paramslist["shift"]) // screen objects don't do the normal Click() stuff so we'll cheat + to_chat(usr,"[name] - [desc]") + return + if(master) + return usr.client.Click(master, location, control, params) + +/obj/screen/alert/Destroy() + ..() + severity = 0 + master = null + screen_loc = "" + return QDEL_HINT_QUEUE diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 2ec9da3b27..960582b4b1 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -21,13 +21,7 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_alien_health - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - mymob.client.screen = list() - mymob.client.screen += list( mymob.healths, mymob.fire) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.healths) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 6bd7490411..0afb8acdfa 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -318,6 +318,11 @@ datum/hud/New(mob/owner) else mymob.instantiate_hud(src) + persistant_inventory_update() + mymob.reload_fullscreen() // Reload any fullscreen overlays this mob has. + mymob.update_action_buttons() + reorganize_alerts() + /mob/proc/instantiate_hud(var/datum/hud/HUD) return @@ -382,6 +387,7 @@ datum/hud/New(mob/owner) hud_used.hidden_inventory_update() hud_used.persistant_inventory_update() update_action_buttons() + hud_used.reorganize_alerts() //Similar to button_pressed_F12() but keeps zone_sel, gun_setting_icon, and healths. /mob/proc/toggle_zoom_hud() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index b372ec6882..fe32925cb9 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -28,6 +28,7 @@ inv_box.icon = ui_style inv_box.color = ui_color inv_box.alpha = ui_alpha + inv_box.hud = src var/list/slot_data = hud_data.gear[gear_slot] inv_box.name = gear_slot @@ -192,6 +193,7 @@ using.screen_loc = ui_swaphand1 using.color = ui_color using.alpha = ui_alpha + using.hud = src src.adding += using using = new /obj/screen/inventory() @@ -201,6 +203,7 @@ using.screen_loc = ui_swaphand2 using.color = ui_color using.alpha = ui_alpha + using.hud = src src.adding += using if(hud_data.has_resist) @@ -243,27 +246,6 @@ hud_elements |= mymob.internals if(hud_data.has_warnings) - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - hud_elements |= mymob.oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - hud_elements |= mymob.toxin - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - hud_elements |= mymob.fire - mymob.healths = new /obj/screen() mymob.healths.icon = ui_style mymob.healths.icon_state = "health0" @@ -271,30 +253,6 @@ mymob.healths.screen_loc = ui_health hud_elements |= mymob.healths - if(hud_data.has_pressure) - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - hud_elements |= mymob.pressure - - if(hud_data.has_bodytemp) - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - hud_elements |= mymob.bodytemp - - if(hud_data.has_nutrition) - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon = ui_style - mymob.nutrition_icon.icon_state = "nutrition0" - mymob.nutrition_icon.name = "nutrition" - mymob.nutrition_icon.screen_loc = ui_nutrition - hud_elements |= mymob.nutrition_icon - mymob.ling_chem_display = new /obj/screen/ling/chems() mymob.ling_chem_display.screen_loc = ui_ling_chemical_display mymob.ling_chem_display.icon_state = "ling_chems" diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 392854742a..c71e0004c8 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -85,15 +85,6 @@ var/obj/screen/robot_inventory src.adding += using action_intent = using -//Cell - mymob:cells = new /obj/screen() - mymob:cells.icon = ui_style - mymob:cells.icon_state = "charge-empty" - mymob:cells.alpha = ui_alpha - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin - src.other += mymob:cells - //Health mymob.healths = new /obj/screen() mymob.healths.icon = ui_style @@ -142,28 +133,6 @@ var/obj/screen/robot_inventory robot_inventory.screen_loc = ui_borg_inventory src.other += robot_inventory -//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 = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.alpha = ui_alpha - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - src.other += mymob.oxygen - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.alpha = ui_alpha - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - src.other += mymob.fire - mymob.pullin = new /obj/screen() mymob.pullin.icon = ui_style mymob.pullin.icon_state = "pull0" @@ -195,7 +164,7 @@ var/obj/screen/robot_inventory mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, robot_inventory, mymob.gun_setting_icon) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.hands, mymob.healths, mymob.pullin, robot_inventory, mymob.gun_setting_icon) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4e0024e322..f930f4f462 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -34,7 +34,36 @@ /obj/screen/inventory var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. + var/list/object_overlays = list() // Required for inventory/screen overlays. +/obj/screen/inventory/MouseEntered() + ..() + add_overlays() + +/obj/screen/inventory/MouseExited() + ..() + cut_overlay(object_overlays) + object_overlays.Cut() + +/obj/screen/inventory/proc/add_overlays() + var/mob/user = hud.mymob + + if(hud && user && slot_id) + var/obj/item/holding = user.get_active_hand() + + if(!holding || user.get_equipped_item(slot_id)) + return + + var/image/item_overlay = image(holding) + item_overlay.alpha = 92 + + if(!holding.mob_can_equip(user, slot_id, disable_warning = TRUE)) + item_overlay.color = "#ff0000" + else + item_overlay.color = "#00ff00" + + object_overlays += item_overlay + add_overlay(object_overlays) /obj/screen/close name = "close" @@ -57,7 +86,7 @@ /obj/screen/item_action/Click() if(!usr || !owner) return 1 - if(!usr.canClick()) + if(!usr.checkClickCooldown()) return if(usr.stat || usr.restrained() || usr.stunned || usr.lying) @@ -88,7 +117,7 @@ name = "storage" /obj/screen/storage/Click() - if(!usr.canClick()) + if(!usr.checkClickCooldown()) return 1 if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) return 1 @@ -105,78 +134,116 @@ icon_state = "zone_sel" screen_loc = ui_zonesel var/selecting = BP_TORSO + var/static/list/hover_overlays_cache = list() + var/hovering_choice + var/mutable_appearance/selecting_appearance /obj/screen/zone_sel/Click(location, control,params) + if(isobserver(usr)) + return + 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 + var/choice = get_zone_at(icon_x, icon_y) + if(!choice) + return 1 + return set_selected_zone(choice, usr) + +/obj/screen/zone_sel/MouseEntered(location, control, params) + MouseMove(location, control, params) + +/obj/screen/zone_sel/MouseMove(location, control, params) + if(isobserver(usr)) + return + + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/choice = get_zone_at(icon_x, icon_y) + + if(hovering_choice == choice) + return + vis_contents -= hover_overlays_cache[hovering_choice] + hovering_choice = choice + + var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice] + if(!overlay_object) + overlay_object = new + overlay_object.icon_state = "[choice]" + hover_overlays_cache[choice] = overlay_object + vis_contents += overlay_object + + +/obj/effect/overlay/zone_sel + icon = 'icons/mob/zone_sel.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 128 + anchored = TRUE + layer = LAYER_HUD_ABOVE + plane = PLANE_PLAYER_HUD_ABOVE + +/obj/screen/zone_sel/MouseExited(location, control, params) + if(!isobserver(usr) && hovering_choice) + vis_contents -= hover_overlays_cache[hovering_choice] + hovering_choice = null + +/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) switch(icon_y) if(1 to 3) //Feet switch(icon_x) if(10 to 15) - selecting = BP_R_FOOT + return BP_R_FOOT if(17 to 22) - selecting = BP_L_FOOT - else - return 1 + return BP_L_FOOT if(4 to 9) //Legs switch(icon_x) if(10 to 15) - selecting = BP_R_LEG + return BP_R_LEG if(17 to 22) - selecting = BP_L_LEG - else - return 1 + return BP_L_LEG if(10 to 13) //Hands and groin switch(icon_x) if(8 to 11) - selecting = BP_R_HAND + return BP_R_HAND if(12 to 20) - selecting = BP_GROIN + return BP_GROIN if(21 to 24) - selecting = BP_L_HAND - else - return 1 + return BP_L_HAND if(14 to 22) //Chest and arms to shoulders switch(icon_x) if(8 to 11) - selecting = BP_R_ARM + return BP_R_ARM if(12 to 20) - selecting = BP_TORSO + return BP_TORSO if(21 to 24) - selecting = BP_L_ARM - else - return 1 + return BP_L_ARM if(23 to 30) //Head, but we need to check for eye or mouth if(icon_x in 12 to 20) - selecting = BP_HEAD switch(icon_y) if(23 to 24) if(icon_x in 15 to 17) - selecting = O_MOUTH + return O_MOUTH if(26) //Eyeline, eyes are on 15 and 17 if(icon_x in 14 to 18) - selecting = O_EYES + return O_EYES if(25 to 27) if(icon_x in 15 to 17) - selecting = O_EYES + return O_EYES + return BP_HEAD - if(old_selecting != selecting) - update_icon() - return 1 - -/obj/screen/zone_sel/proc/set_selected_zone(bodypart) - var/old_selecting = selecting - selecting = bodypart - if(old_selecting != selecting) +/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) + if(isobserver(user)) + return + if(choice != selecting) + selecting = choice update_icon() /obj/screen/zone_sel/update_icon() - overlays.Cut() - overlays += image('icons/mob/zone_sel.dmi', "[selecting]") - + cut_overlay(selecting_appearance) + selecting_appearance = mutable_appearance('icons/mob/zone_sel.dmi', "[selecting]") + add_overlay(selecting_appearance) /obj/screen/Click(location, control, params) if(!usr) return 1 @@ -495,7 +562,7 @@ /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(!usr.canClick()) + if(!usr.checkClickCooldown()) return 1 if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) return 1 diff --git a/code/_onclick/hud/skybox.dm b/code/_onclick/hud/skybox.dm index 492a11e588..8c1e3c10b5 100644 --- a/code/_onclick/hud/skybox.dm +++ b/code/_onclick/hud/skybox.dm @@ -50,11 +50,9 @@ if(. && client) client.update_skybox(old_z != get_z(src)) -/mob/forceMove() - var/old_z = get_z(src) +/mob/Moved() . = ..() - if(. && client) - client.update_skybox(old_z != get_z(src)) + client?.update_skybox() /mob/set_viewsize() . = ..() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index decc371475..54fc3239ac 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -97,7 +97,7 @@ avoid code duplication. This includes items that may sometimes act as a standard /obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone, var/attack_modifier) user.break_cloak() if(hitsound) - playsound(loc, hitsound, 50, 1, -1) + playsound(src, hitsound, 50, 1, -1) var/power = force for(var/datum/modifier/M in user.modifiers) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index a2d3f0c92b..485df1de41 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -31,7 +31,7 @@ if(client.buildmode) build_click(src, client.buildmode, params, A) return - if(!canClick()) return + if(!checkClickCooldown()) return setClickCooldown(4) // You are responsible for checking config.ghost_interaction when you override this function // Not all of them require checking, see below @@ -50,8 +50,8 @@ /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) + if(com?.teleport_control.locked) + user.loc = get_turf(com.teleport_control.locked) /obj/effect/portal/attack_ghost(mob/user as mob) if(target) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index ed7a1c7e2f..e281505dc2 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -63,7 +63,7 @@ return loc == card /mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0) - if(!can_use_rig() || !canClick()) + if(!can_use_rig()) return 0 var/obj/item/weapon/rig/rig = get_rig() if(istype(rig) && !rig.offline && rig.selected_module) diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm index fb8cc8286a..776e2698ba 100644 --- a/code/controllers/autotransfer.dm +++ b/code/controllers/autotransfer.dm @@ -12,6 +12,6 @@ datum/controller/transfer_controller/Destroy() datum/controller/transfer_controller/process() currenttick = currenttick + 1 - if (round_duration_in_ticks >= timerbuffer - 1 MINUTE) + if (round_duration_in_ds >= timerbuffer - 1 MINUTE) SSvote.autotransfer() timerbuffer = timerbuffer + config.vote_autotransfer_interval diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 450811a5fb..ec35af2752 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -232,6 +232,10 @@ var/list/gamemode_cache = list() var/dooc_allowed = 1 var/dsay_allowed = 1 + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + var/starlight = 0 // Whether space turfs have ambient light or not var/list/ert_species = list(SPECIES_HUMAN) @@ -270,6 +274,9 @@ var/list/gamemode_cache = list() // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. var/disable_cid_warn_popup = FALSE + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -420,6 +427,15 @@ var/list/gamemode_cache = list() if ("allow_admin_spawning") config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 if ("no_dead_vote") config.vote_no_dead = 1 @@ -888,6 +904,9 @@ var/list/gamemode_cache = list() if("disable_cid_warn_popup") config.disable_cid_warn_popup = TRUE + if("enable_night_shifts") + config.enable_night_shifts = TRUE + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/controllers/subsystems/game_master.dm b/code/controllers/subsystems/game_master.dm index d5326bfba6..ce7e8176c3 100644 --- a/code/controllers/subsystems/game_master.dm +++ b/code/controllers/subsystems/game_master.dm @@ -109,7 +109,7 @@ SUBSYSTEM_DEF(game_master) return FALSE // Last minute antagging is bad for humans to do, so the GM will respect the start and end of the round. - var/mills = round_duration_in_ticks + var/mills = round_duration_in_ds var/mins = round((mills % 36000) / 600) var/hours = round(mills / 36000) diff --git a/code/controllers/subsystems/machines.dm b/code/controllers/subsystems/machines.dm index 7f35bfd971..29d6ecce56 100644 --- a/code/controllers/subsystems/machines.dm +++ b/code/controllers/subsystems/machines.dm @@ -121,10 +121,8 @@ SUBSYSTEM_DEF(machines) while(current_run.len) var/obj/machinery/M = current_run[current_run.len] current_run.len-- - if(istype(M) && !QDELETED(M) && !(M.process(wait) == PROCESS_KILL)) - if(M.use_power) - M.auto_use_power() - else + + if(!istype(M) || QDELETED(M) || (M.process(wait) == PROCESS_KILL)) global.processing_machines.Remove(M) if(!QDELETED(M)) DISABLE_BITFIELD(M.datum_flags, DF_ISPROCESSING) diff --git a/code/controllers/subsystems/nightshift.dm b/code/controllers/subsystems/nightshift.dm new file mode 100644 index 0000000000..3657a472c8 --- /dev/null +++ b/code/controllers/subsystems/nightshift.dm @@ -0,0 +1,62 @@ +SUBSYSTEM_DEF(nightshift) + name = "Night Shift" + init_order = INIT_ORDER_NIGHTSHIFT + priority = FIRE_PRIORITY_NIGHTSHIFT + wait = 60 SECONDS + flags = SS_NO_TICK_CHECK + + var/nightshift_active = FALSE + var/nightshift_first_check = 30 SECONDS + + var/high_security_mode = FALSE + +/datum/controller/subsystem/nightshift/Initialize() + if(!config.enable_night_shifts) + can_fire = FALSE + /* + if(config.randomize_shift_time) + GLOB.gametime_offset = rand(0, 23) HOURS + */ + return ..() + +/datum/controller/subsystem/nightshift/fire(resumed = FALSE) + if(round_duration_in_ds < nightshift_first_check) + return + check_nightshift() + +/datum/controller/subsystem/nightshift/proc/announce(message) + var/announce_z + if(using_map.station_levels.len) + announce_z = pick(using_map.station_levels) + priority_announcement.Announce(message, new_title = "Automated Lighting System Announcement", new_sound = 'sound/misc/notice2.ogg', zlevel = announce_z) + +/datum/controller/subsystem/nightshift/proc/check_nightshift(check_canfire=FALSE) //This is called from elsewhere, like setting the alert levels + if(check_canfire && !can_fire) + return + var/emergency = security_level > SEC_LEVEL_GREEN + var/announcing = TRUE + var/night_time = using_map.get_nightshift() + if(high_security_mode != emergency) + high_security_mode = emergency + if(night_time) + announcing = FALSE + if(!emergency) + announce("Restoring night lighting configuration to normal operation.") + else + announce("Disabling night lighting: Station is in a state of emergency.") + if(emergency) + night_time = FALSE + if(nightshift_active != night_time) + update_nightshift(night_time, announcing) + +/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE) + nightshift_active = active + if(announce) + if(active) + announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.") + else + announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.") + for(var/obj/machinery/power/apc/apc in machines) + if(apc.z in using_map.station_levels) + apc.set_nightshift(active, TRUE) + CHECK_TICK diff --git a/code/controllers/subsystems/open_space.dm b/code/controllers/subsystems/open_space.dm index dfc1319009..4e96dbfda4 100644 --- a/code/controllers/subsystems/open_space.dm +++ b/code/controllers/subsystems/open_space.dm @@ -79,22 +79,6 @@ SUBSYSTEM_DEF(open_space) /datum/controller/subsystem/open_space/stat_entry(msg_prefix) return ..("T [turfs_to_process.len]") -/turf/Entered(atom/movable/AM) - . = ..() - if(GLOB.open_space_initialised && !AM.invisibility && isobj(AM)) - var/turf/T = GetAbove(src) - if(isopenspace(T)) - // log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src].Entered([AM])") - SSopen_space.add_turf(T, 1) - -/turf/Exited(atom/movable/AM) - . = ..() - if(GLOB.open_space_initialised && !AM.invisibility && isobj(AM)) - var/turf/T = GetAbove(src) - if(isopenspace(T)) - // log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src].Exited([AM])") - SSopen_space.add_turf(T, 1) - /obj/update_icon() . = ..() if(GLOB.open_space_initialised && !invisibility && isturf(loc)) diff --git a/code/controllers/subsystems/planets.dm b/code/controllers/subsystems/planets.dm index 9e823fc0db..5d1325bba5 100644 --- a/code/controllers/subsystems/planets.dm +++ b/code/controllers/subsystems/planets.dm @@ -6,16 +6,16 @@ SUBSYSTEM_DEF(planets) flags = SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/new_outdoor_turfs = list() - var/list/new_outdoor_walls = list() + var/static/list/new_outdoor_turfs = list() + var/static/list/new_outdoor_walls = list() - var/list/planets = list() - var/list/z_to_planet = list() + var/static/list/planets = list() + var/static/list/z_to_planet = list() - var/list/currentrun = list() + var/static/list/currentrun = list() - var/list/needs_sun_update = list() - var/list/needs_temp_update = list() + var/static/list/needs_sun_update = list() + var/static/list/needs_temp_update = list() /datum/controller/subsystem/planets/Initialize(timeofday) admin_notice("Initializing planetary weather.", R_DEBUG) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index b17640430b..62c8b79932 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -176,7 +176,7 @@ var/global/datum/controller/subsystem/ticker/ticker create_characters() //Create player characters and transfer them. collect_minds() equip_characters() - data_core.manifest() +// data_core.manifest() callHook("roundstart") @@ -404,16 +404,25 @@ var/global/datum/controller/subsystem/ticker/ticker /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/new_player/player in player_list) - if(player && player.ready && player.mind) - if(player.mind.assigned_role=="AI") + if(player && player.ready && player.mind?.assigned_role) + var/datum/job/J = SSjob.get_job(player.mind.assigned_role) + + // Snowflakey AI treatment + if(J?.mob_type & JOB_SILICON_AI) player.close_spawn_windows() - player.AIize() - else if(!player.mind.assigned_role) + player.AIize(move = TRUE) continue - else - player.create_character() + + // Ask their new_player mob to spawn them + var/mob/living/carbon/human/new_char = player.create_character() + + // Created their playable character, delete their /mob/new_player + if(new_char) qdel(player) + // If they're a carbon, they can get manifested + if(J?.mob_type & JOB_CARBON) + data_core.manifest_inject(new_char) /datum/controller/subsystem/ticker/proc/collect_minds() for(var/mob/living/player in player_list) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 3a22a1e86f..fc47258a82 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -96,7 +96,6 @@ var/turf/destturf var/turf/curturf = get_turf(teleatom) - var/area/destarea = get_area(destination) if(precision) var/list/posturfs = circlerangeturfs(destination,precision) destturf = safepick(posturfs) @@ -122,8 +121,6 @@ if(C) C.forceMove(destturf) - destarea.Entered(teleatom) - return 1 /datum/teleport/proc/teleport() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d5bd1058d1..a830efb9d2 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -480,6 +480,19 @@ else return 0 +/datum/mind/proc/get_ghost(even_if_they_cant_reenter) + for(var/mob/observer/dead/G in player_list) + if(G.mind == src) + if(G.can_reenter_corpse || even_if_they_cant_reenter) + return G + break + +/datum/mind/proc/grab_ghost(force) + var/mob/observer/dead/G = get_ghost(even_if_they_cant_reenter = force) + . = G + if(G) + G.reenter_corpse() + //Initialisation procs /mob/living/proc/mind_initialize() if(mind) diff --git a/code/datums/observation/power_change.dm b/code/datums/observation/power_change.dm new file mode 100644 index 0000000000..4581dab84a --- /dev/null +++ b/code/datums/observation/power_change.dm @@ -0,0 +1,21 @@ +// Observer Pattern Implementation: Area Power Change +// Registration type: /area +// +// Raised when: An /area has a power change (the APC powers up/down or some channels are enabled/disabled) +// +// Arguments that the called proc should expect: +// /area: The area experiencing the power change + +GLOBAL_DATUM_INIT(apc_event, /decl/observ/area_power_change, new) + +/decl/observ/area_power_change + name = "Area Power Change" + expected_type = /area + +/******************** +* Movement Handling * +********************/ + +/area/power_change() + . = ..() + GLOB.apc_event.raise_event(src) diff --git a/code/datums/observation/turf_enterexit.dm b/code/datums/observation/turf_enterexit.dm new file mode 100644 index 0000000000..30cec0c39d --- /dev/null +++ b/code/datums/observation/turf_enterexit.dm @@ -0,0 +1,33 @@ +// Observer Pattern Implementation: Turf Entered/Exited +// Registration type: /turf +// +// Raised when: A /turf has a new item in contents, or an item has left it's contents +// +// Arguments that the called proc should expect: +// /turf: The turf that was entered/exited +// /atom/movable/moving_instance: The instance that entered/exited +// /atom/old_loc / /atom/new_loc: The previous/new loc of the mover + + +GLOBAL_DATUM_INIT(turf_entered_event, /decl/observ/turf_entered, new) +GLOBAL_DATUM_INIT(turf_exited_event, /decl/observ/turf_exited, new) + +/decl/observ/turf_entered + name = "Turf Entered" + expected_type = /turf + +/decl/observ/turf_exited + name = "Turf Exited" + expected_type = /turf + +/******************** +* Movement Handling * +********************/ + +/turf/Entered(var/atom/movable/am, var/atom/old_loc) + . = ..() + GLOB.turf_entered_event.raise_event(src, am, old_loc) + +/turf/Exited(var/atom/movable/am, var/atom/new_loc) + . = ..() + GLOB.turf_exited_event.raise_event(src, am, new_loc) \ No newline at end of file diff --git a/code/datums/orbit.dm b/code/datums/orbit.dm index 5d457ff4ac..0176d7f23d 100644 --- a/code/datums/orbit.dm +++ b/code/datums/orbit.dm @@ -4,10 +4,12 @@ var/lock = TRUE var/turf/lastloc var/lastprocess + var/matrix/init_transform -/datum/orbit/New(_orbiter, _orbiting, _lock) +/datum/orbit/New(var/atom/movable/_orbiter, var/atom/_orbiting, _lock) orbiter = _orbiter orbiting = _orbiting + init_transform = _orbiter.transform SSorbit.processing += src if (!orbiting.orbiters) orbiting.orbiters = list() @@ -24,6 +26,7 @@ SSorbit.processing -= src if (orbiter) orbiter.orbiting = null + orbiter.transform = init_transform orbiter = null if (orbiting) if (orbiting.orbiters) @@ -84,7 +87,6 @@ new/datum/orbit(src, A, lockinorbit) if (!orbiting) //something failed, and our orbit datum deleted itself return - var/matrix/initial_transform = matrix(transform) //Head first! if (pre_rotation) @@ -101,9 +103,6 @@ SpinAnimation(rotation_speed, -1, clockwise, rotation_segments) - //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit - transform = initial_transform - /atom/movable/proc/stop_orbit() SpinAnimation(0,0) qdel(orbiting) diff --git a/code/datums/outfits/military/marines.dm b/code/datums/outfits/military/marines.dm index 719b36c690..a5a81b973d 100644 --- a/code/datums/outfits/military/marines.dm +++ b/code/datums/outfits/military/marines.dm @@ -1,23 +1,23 @@ /decl/hierarchy/outfit/military/marine/pt name = OUTFIT_MILITARY("Marine PT") - uniform = /obj/item/clothing/under/solgov/pt/marine + uniform = /obj/item/clothing/under/solgov/pt/army shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/marine/utility name = OUTFIT_MILITARY("Marine Utility") - uniform = /obj/item/clothing/under/solgov/utility/marine + uniform = /obj/item/clothing/under/solgov/utility/army shoes = /obj/item/clothing/shoes/boots/jungle /decl/hierarchy/outfit/military/marine/service name = OUTFIT_MILITARY("Marine Service") - uniform = /obj/item/clothing/under/solgov/service/marine + uniform = /obj/item/clothing/under/solgov/service/army shoes = /obj/item/clothing/shoes/dress - suit = /obj/item/clothing/suit/storage/service/marine + suit = /obj/item/clothing/suit/storage/solgov/service/army /decl/hierarchy/outfit/military/marine/dress name = OUTFIT_MILITARY("Marine Dress") - uniform = /obj/item/clothing/under/solgov/mildress/marine + uniform = /obj/item/clothing/under/solgov/mildress/army shoes = /obj/item/clothing/shoes/dress/white - suit = /obj/item/clothing/suit/dress/marine + suit = /obj/item/clothing/suit/dress/solgov/army gloves = /obj/item/clothing/gloves/white - head = /obj/item/clothing/head/dress/marine \ No newline at end of file + head = /obj/item/clothing/head/dress/army \ No newline at end of file diff --git a/code/datums/outfits/military/sifguard.dm b/code/datums/outfits/military/sifguard.dm index 9348224a9e..fa44675b67 100644 --- a/code/datums/outfits/military/sifguard.dm +++ b/code/datums/outfits/military/sifguard.dm @@ -12,12 +12,12 @@ name = OUTFIT_MILITARY("SifGuard Service") uniform = /obj/item/clothing/under/solgov/utility/sifguard shoes = /obj/item/clothing/shoes/boots/tactical - suit = /obj/item/clothing/suit/storage/service/sifguard + suit = /obj/item/clothing/suit/storage/solgov/service/sifguard /decl/hierarchy/outfit/military/sifguard/dress name = OUTFIT_MILITARY("SifGuard Dress") - uniform = /obj/item/clothing/under/solgov/mildress/sifguard + uniform = /obj/item/clothing/under/solgov/service/sifguard shoes = /obj/item/clothing/shoes/dress - suit = /obj/item/clothing/suit/dress/expedition + suit = /obj/item/clothing/suit/storage/solgov/dress/sifguard gloves = /obj/item/clothing/gloves/white - head = /obj/item/clothing/head/dress/expedition \ No newline at end of file + head = /obj/item/clothing/head/service/sifguard \ No newline at end of file diff --git a/code/datums/riding.dm b/code/datums/riding.dm index 4f9513397a..ba96dbc405 100644 --- a/code/datums/riding.dm +++ b/code/datums/riding.dm @@ -2,7 +2,7 @@ /datum/riding var/next_vehicle_move = 0 // Used for move delays - var/vehicle_move_delay = 2 // Tick delay between movements, lower = faster, higher = slower + var/vehicle_move_delay = 2 // Decisecond delay between movements, lower = faster, higher = slower var/keytype = null // Can give this a type to require the rider to hold the item type inhand to move the ridden atom. var/nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. var/key_name = "the keys" // What the 'keys' for the thing being rided on would be called. @@ -97,11 +97,13 @@ if(world.time < next_vehicle_move) return + next_vehicle_move = world.time + vehicle_move_delay + if(keycheck(user)) if(!Process_Spacemove(direction) || !isturf(ridden.loc)) return - ridden.Move(get_step(ridden, direction)) + ridden.Move(get_step(ridden, direction), direction, vehicle_move_delay) handle_vehicle_layer() handle_vehicle_offsets() diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 187b69e021..de7800acfb 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -29,7 +29,6 @@ density = 0 unacidable = 1//Just to be sure. var/def_zone - flags = PROXMOVE pass_flags = PASSTABLE @@ -59,22 +58,11 @@ var/damage = 0.0 var/range = 10.0 - -/obj/effect/list_container - name = "list container" - -/obj/effect/list_container/mobl - name = "mobl" - var/master = null - - var/list/container = list( ) - /obj/effect/projection name = "Projection" desc = "This looks like a projection of something." anchored = 1.0 - /obj/effect/shut_controller name = "shut controller" var/moving = null @@ -114,12 +102,5 @@ user.drop_item() src.throw_at(target, throw_range, throw_speed, user) -/obj/effect/stop - var/victim = null - icon_state = "empty" - name = "Geas" - desc = "You can't resist." - // name = "" - /obj/effect/spawner name = "object spawner" diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 962c91a621..e00a4a99df 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -4,6 +4,7 @@ var/list/restricted_jobs = list() // Jobs that cannot be this antagonist (depending on config) var/list/protected_jobs = list() // As above. var/list/roundstart_restricted = list() //Jobs that can be this antag, but not at roundstart + var/avoid_silicons = FALSE // If we won't hand this antag role to silicons (AI, borg, etc) // Strings. var/welcome_text = "Cry havoc and let slip the dogs of war!" diff --git a/code/game/antagonist/antagonist_helpers.dm b/code/game/antagonist/antagonist_helpers.dm index c8f2928ced..ebf212f065 100644 --- a/code/game/antagonist/antagonist_helpers.dm +++ b/code/game/antagonist/antagonist_helpers.dm @@ -10,6 +10,14 @@ return FALSE if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs)) return FALSE + if(avoid_silicons) + var/datum/job/J = SSjob.get_job(player.assigned_role) + if(J) + if(J.mob_type & JOB_SILICON) + return FALSE + else // If SSjob couldn't find a job, they don't have one yet, so the next best thing we can switch on are job preferences + if((player.current.client.prefs.job_engsec_high | player.current.client.prefs.job_engsec_med | player.current.client.prefs.job_engsec_low) & (AI | CYBORG)) // If they have ANY chance of being silicon + return FALSE return TRUE /datum/antagonist/proc/antags_are_dead() diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index 860e73a052..694c4a3634 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -5,7 +5,7 @@ role_text_plural = "Changelings" bantype = "changeling" feedback_tag = "changeling_objective" - restricted_jobs = list("AI", "Cyborg") + avoid_silicons = TRUE protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Colony Director") welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." antag_sound = 'sound/effects/antag_notice/ling_alert.ogg' diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index dc98622ba7..06aab654b4 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -11,7 +11,8 @@ var/datum/antagonist/cultist/cult role_text = "Cultist" role_text_plural = "Cultists" bantype = "cultist" - restricted_jobs = list("Chaplain","AI", "Cyborg") + restricted_jobs = list("Chaplain") + avoid_silicons = TRUE protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") roundstart_restricted = list("Internal Affairs Agent", "Head of Security", "Colony Director") role_type = BE_CULTIST diff --git a/code/game/antagonist/station/loyalist.dm b/code/game/antagonist/station/loyalist.dm index 9b2333b491..ec27584426 100644 --- a/code/game/antagonist/station/loyalist.dm +++ b/code/game/antagonist/station/loyalist.dm @@ -29,7 +29,7 @@ var/datum/antagonist/loyalists/loyalists faction_welcome = "Preserve NanoTrasen's interests against the traitorous recidivists amongst the crew. Protect the heads of staff with your life." faction_indicator = "loyal" faction_invisible = 1 - restricted_jobs = list("AI", "Cyborg") + avoid_silicons = TRUE /datum/antagonist/loyalists/New() ..() diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm index ed3c804506..cdd4efb8f3 100644 --- a/code/game/antagonist/station/renegade.dm +++ b/code/game/antagonist/station/renegade.dm @@ -6,7 +6,7 @@ var/datum/antagonist/renegade/renegades role_text = "Renegade" role_text_plural = "Renegades" bantype = "renegade" - restricted_jobs = list("AI", "Cyborg") + avoid_silicons = TRUE welcome_text = "Something's going to go wrong today, you can just feel it. You're paranoid, you've got a gun, and you're going to survive." antag_sound = 'sound/effects/antag_notice/general_goodie_alert.ogg' antag_text = "You are a minor antagonist! Within the rules, \ diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 17c519b7a0..1db40f396a 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -29,7 +29,7 @@ var/datum/antagonist/revolutionary/revs faction_indicator = "rev" faction_invisible = 1 - restricted_jobs = list("AI", "Cyborg") + avoid_silicons = TRUE protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") roundstart_restricted = list("Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") diff --git a/code/game/antagonist/station/stowaway.dm b/code/game/antagonist/station/stowaway.dm index dc3814b3b1..574fda0bca 100644 --- a/code/game/antagonist/station/stowaway.dm +++ b/code/game/antagonist/station/stowaway.dm @@ -6,7 +6,7 @@ var/datum/antagonist/stowaway/stowaways role_text = "Stowaway" role_text_plural = "Stowaways" bantype = "renegade" - restricted_jobs = list("AI") + avoid_silicons = TRUE // This was previously allowing cyborgs to be stowaways, but given that they would just connect to the AI, it didn't make much sense welcome_text = "People are known to run from many things, or to many things, for many different reasons. You happen to be one of those people." antag_text = "You are a minor antagonist! Within the server rules, do whatever it is \ that you came to the station to do. Espionage, thievery, or just running from the law are all examples. \ diff --git a/code/game/antagonist/station/thug.dm b/code/game/antagonist/station/thug.dm index 61d92e1646..f26d6441a8 100644 --- a/code/game/antagonist/station/thug.dm +++ b/code/game/antagonist/station/thug.dm @@ -6,7 +6,7 @@ var/datum/antagonist/thug/thugs role_text = "Thug" role_text_plural = "Thugs" bantype = "renegade" - restricted_jobs = list("AI", "Cyborg") + avoid_silicons = TRUE welcome_text = "Sometimes, people just need to get messed up. Luckily, that's what you're here to do." antag_text = "You are a minor antagonist! Within the server rules, do whatever it is \ that you came to the station to do, be it violence, theft, or just extreme self-defense. \ diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 963530d671..b7d2c3f323 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -25,6 +25,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station requires_power = 1 always_unpowered = 1 dynamic_lighting = 0 + has_gravity = 0 power_light = 0 power_equip = 0 power_environ = 0 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index c93b6d78dc..80b7ec5b4f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -21,14 +21,22 @@ var/requires_power = 1 var/always_unpowered = 0 //this gets overriden to 1 for space in area/New() - var/power_equip = 1 - var/power_light = 1 - var/power_environ = 1 - var/music = null - var/used_equip = 0 - var/used_light = 0 - var/used_environ = 0 + // Power channel status - Is it currently energized? + var/power_equip = TRUE + var/power_light = TRUE + var/power_environ = TRUE + // Oneoff power usage - Used once and cleared each power cycle + var/oneoff_equip = 0 + var/oneoff_light = 0 + var/oneoff_environ = 0 + + // Continuous "static" power usage - Do not update these directly! + var/static_equip = 0 + var/static_light = 0 + var/static_environ = 0 + + var/music = null var/has_gravity = 1 var/secret_name = FALSE // This tells certain things that display areas' names that they shouldn't display this area's name. var/obj/machinery/power/apc/apc = null @@ -81,7 +89,7 @@ for(var/atom/movable/AM in T) A.Entered(AM, old_area) for(var/obj/machinery/M in T) - M.power_change() + M.area_changed(old_area, A) /area/proc/get_contents() return contents @@ -239,33 +247,96 @@ if (fire || eject || party) updateicon() -/area/proc/usage(var/chan) +/area/proc/usage(var/chan, var/include_static = TRUE) var/used = 0 switch(chan) if(LIGHT) - used += used_light + used += oneoff_light + (include_static * static_light) if(EQUIP) - used += used_equip + used += oneoff_equip + (include_static * static_equip) if(ENVIRON) - used += used_environ + used += oneoff_environ + (include_static * static_environ) if(TOTAL) - used += used_light + used_equip + used_environ + used += oneoff_light + (include_static * static_light) + used += oneoff_equip + (include_static * static_equip) + used += oneoff_environ + (include_static * static_environ) return used +// Helper for APCs; will generally be called every tick. /area/proc/clear_usage() - used_equip = 0 - used_light = 0 - used_environ = 0 + oneoff_equip = 0 + oneoff_light = 0 + oneoff_environ = 0 -/area/proc/use_power(var/amount, var/chan) +// Use this for a one-time power draw from the area, typically for non-machines. +/area/proc/use_power_oneoff(var/amount, var/chan) switch(chan) if(EQUIP) - used_equip += amount + oneoff_equip += amount if(LIGHT) - used_light += amount + oneoff_light += amount if(ENVIRON) - used_environ += amount + oneoff_environ += amount + return amount +// This is used by machines to properly update the area of power changes. +/area/proc/power_use_change(old_amount, new_amount, chan) + use_power_static(new_amount - old_amount, chan) // Simultaneously subtract old_amount and add new_amount. + +// Not a proc you want to use directly unless you know what you are doing; see use_power_oneoff above instead. +/area/proc/use_power_static(var/amount, var/chan) + switch(chan) + if(EQUIP) + static_equip += amount + if(LIGHT) + static_light += amount + if(ENVIRON) + static_environ += amount + +// This recomputes the continued power usage; can be used for testing or error recovery, but is not called every tick. +/area/proc/retally_power() + static_equip = 0 + static_light = 0 + static_environ = 0 + for(var/obj/machinery/M in src) + switch(M.power_channel) + if(EQUIP) + static_equip += M.get_power_usage() + if(LIGHT) + static_light += M.get_power_usage() + if(ENVIRON) + static_environ += M.get_power_usage() + +////////////////////////////////////////////////////////////////// + +/area/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("check_static_power", "Check Static Power") + +/area/vv_do_topic(list/href_list) + . = ..() + IF_VV_OPTION("check_static_power") + if(!check_rights(R_DEBUG)) + return + src.check_static_power(usr) + href_list["datumrefresh"] = "\ref[src]" + +// Debugging proc to report if static power is correct or not. +/area/proc/check_static_power(var/user) + set name = "Check Static Power" + var/actual_static_equip = static_equip + var/actual_static_light = static_light + var/actual_static_environ = static_environ + retally_power() + if(user) + var/list/report = list("[src] ([type]) static power tally:") + report += "EQUIP: Actual: [actual_static_equip] Correct: [static_equip] Difference: [actual_static_equip - static_equip]" + report += "LIGHT: Actual: [actual_static_light] Correct: [static_light] Difference: [actual_static_light - static_light]" + report += "ENVIRON: Actual: [actual_static_environ] Correct: [static_environ] Difference: [actual_static_environ - static_environ]" + to_chat(user, report.Join("\n")) + return (actual_static_equip == static_equip && actual_static_light == static_light && actual_static_environ == static_environ) + +////////////////////////////////////////////////////////////////// var/list/mob/living/forced_ambiance_list = new @@ -317,6 +388,7 @@ var/list/mob/living/forced_ambiance_list = new if(has_gravity) thunk(M) M.update_floating( M.Check_Dense_Object() ) + M.update_gravity(has_gravity) /area/proc/thunk(mob) if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing. @@ -336,7 +408,7 @@ var/list/mob/living/forced_ambiance_list = new H.AdjustStunned(3) H.AdjustWeakened(3) to_chat(mob, "The sudden appearance of gravity makes you fall to the floor!") - playsound(get_turf(src), "bodyfall", 50, 1) + playsound(mob, "bodyfall", 50, 1) /area/proc/prison_break(break_lights = TRUE, open_doors = TRUE, open_blast_doors = TRUE) var/obj/machinery/power/apc/theAPC = get_apc() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 0bc5c14cf8..671bdf0b10 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -118,15 +118,33 @@ /atom/proc/CheckExit() return 1 -// If you want to use this, the atom must have the PROXMOVE flag, and the moving -// atom must also have the PROXMOVE flag currently to help with lag. ~ ComicIronic -/atom/proc/HasProximity(atom/movable/AM as mob|obj) +// Used to be for the PROXMOVE flag, but that was terrible, so instead it's just here as a stub for +// all the atoms that still have the proc, but get events other ways. +/atom/proc/HasProximity(turf/T, atom/movable/AM, old_loc) return +//Register listeners on turfs in a certain range +/atom/proc/sense_proximity(var/range = 1, var/callback) + ASSERT(callback) + ASSERT(isturf(loc)) + var/list/turfs = trange(range, src) + for(var/t in turfs) + var/turf/T = t + GLOB.turf_entered_event.register(T, src, callback) + +//Unregister from prox listening in a certain range. You should do this BEFORE you move, but if you +// really can't, then you can set the center where you moved from. +/atom/proc/unsense_proximity(var/range = 1, var/callback, var/center) + ASSERT(isturf(center) || isturf(loc)) + var/list/turfs = trange(range, center ? center : src) + for(var/t in turfs) + var/turf/T = t + GLOB.turf_entered_event.unregister(T, src, callback) + + /atom/proc/emp_act(var/severity) return - /atom/proc/bullet_act(obj/item/projectile/P, def_zone) P.on_hit(src, 0, def_zone) . = 0 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 87445a4b38..ed8137d8a9 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,13 +1,13 @@ /atom/movable layer = OBJ_LAYER appearance_flags = TILE_BOUND|PIXEL_SCALE - var/last_move = null + glide_size = 8 + var/last_move = null //The direction the atom last moved var/anchored = 0 // var/elevation = 2 - not used anywhere var/moving_diagonally var/move_speed = 10 var/l_move_time = 1 - var/m_flag = 1 var/throwing = 0 var/thrower var/turf/throw_source = null @@ -21,6 +21,7 @@ var/icon_rotation = 0 // Used to rotate icons in update_transform() var/old_x = 0 var/old_y = 0 + var/datum/riding/riding_datum = null var/does_spin = TRUE // Does the atom spin when thrown (of course it does :P) var/movement_type = NONE @@ -52,77 +53,88 @@ return ..() //////////////////////////////////////// -// Here's where we rewrite how byond handles movement except slightly different -// To be removed on step_ conversion -// All this work to prevent a second bump -/atom/movable/Move(atom/newloc, direct=0) - . = FALSE - if(!newloc || newloc == loc) - return - - if(!direct) - direct = get_dir(src, newloc) - set_dir(direct) - - if(!loc.Exit(src, newloc)) - return - - if(!newloc.Enter(src, src.loc)) - return - - if(!check_multi_tile_move_density_dir(direct, locs)) // We're big, and we can't move that way. - return - - // Past this is the point of no return - if(!locs || locs.len <= 1) // We're not a multi-tile object. - var/atom/oldloc = loc - var/area/oldarea = get_area(oldloc) - var/area/newarea = get_area(newloc) - loc = newloc - . = TRUE - oldloc.Exited(src, newloc) - if(oldarea != newarea) - oldarea.Exited(src, newloc) - - for(var/i in oldloc) - if(i == src) // Multi tile objects - continue - var/atom/movable/thing = i - thing.Uncrossed(src) - - newloc.Entered(src, oldloc) - if(oldarea != newarea) - newarea.Entered(src, oldloc) - - for(var/i in loc) - if(i == src) // Multi tile objects - continue - var/atom/movable/thing = i - thing.Crossed(src) - - else if(newloc) // We're a multi-tile object. - . = doMove(newloc) - -// -//////////////////////////////////////// - -/atom/movable/Move(atom/newloc, direct = 0) +/atom/movable/Move(atom/newloc, direct = 0, movetime) + // Didn't pass enough info if(!loc || !newloc) return FALSE + + // Store this early before we might move, it's used several places var/atom/oldloc = loc + // If we're not moving to the same spot (why? does that even happen?) if(loc != newloc) if(!direct) direct = get_dir(oldloc, newloc) - if (!(direct & (direct - 1))) //Cardinal move - . = ..() - else //Diagonal move, split it into cardinal moves + if (IS_CARDINAL(direct)) //Cardinal move + // Track our failure if any in this value + . = TRUE + + // Face the direction of movement + set_dir(direct) + + // Check to make sure we can leave + if(!loc.Exit(src, newloc)) + . = FALSE + + // Check to make sure we can enter, if we haven't already failed + if(. && !newloc.Enter(src, src.loc)) + . = FALSE + + // Check to make sure if we're multi-tile we can move, if we haven't already failed + if(. && !check_multi_tile_move_density_dir(direct, locs)) + . = FALSE + + // Definitely moving if you enter this, no failures so far + if(. && locs.len <= 1) // We're not a multi-tile object. + var/area/oldarea = get_area(oldloc) + var/area/newarea = get_area(newloc) + var/old_z = get_z(oldloc) + var/dest_z = get_z(newloc) + + // Do The Move + glide_for(movetime) + loc = newloc + . = TRUE + + // So objects can be informed of z-level changes + if (old_z != dest_z) + onTransitZ(old_z, dest_z) + + // We don't call parent so we are calling this for byond + oldloc.Exited(src, newloc) + if(oldarea != newarea) + oldarea.Exited(src, newloc) + + // Multi-tile objects can't reach here, otherwise you'd need to avoid uncrossing yourself + for(var/i in oldloc) + var/atom/movable/thing = i + // We don't call parent so we are calling this for byond + thing.Uncrossed(src) + + // We don't call parent so we are calling this for byond + newloc.Entered(src, oldloc) + if(oldarea != newarea) + newarea.Entered(src, oldloc) + + // Multi-tile objects can't reach here, otherwise you'd need to avoid uncrossing yourself + for(var/i in loc) + var/atom/movable/thing = i + // We don't call parent so we are calling this for byond + thing.Crossed(src) + + // We're a multi-tile object (multiple locs) + else if(. && newloc) + . = doMove(newloc) + + //Diagonal move, split it into cardinal moves + else moving_diagonally = FIRST_DIAG_STEP var/first_step_dir // The `&& moving_diagonally` checks are so that a forceMove taking // place due to a Crossed, Bumped, etc. call will interrupt // the second half of the diagonal movement, or the second attempt // at a first half if step() fails because we hit something. + glide_for(movetime) if (direct & NORTH) if (direct & EAST) if (step(src, NORTH) && moving_diagonally) @@ -161,47 +173,51 @@ first_step_dir = WEST moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) - if(moving_diagonally == SECOND_DIAG_STEP) - if(!.) - set_dir(first_step_dir) - //else if (!inertia_moving) - // inertia_next_move = world.time + inertia_move_delay - // newtonian_move(direct) + // If we failed, turn to face the direction of the first step at least + if(!. && moving_diagonally == SECOND_DIAG_STEP) + set_dir(first_step_dir) + // Done, regardless! moving_diagonally = 0 + // We return because step above will call Move() and we don't want to do shenanigans back in here again return - if(!loc || (loc == oldloc && oldloc != newloc)) + else if(!loc || (loc == oldloc)) last_move = 0 return + // If we moved, call Moved() on ourselves if(.) - Moved(oldloc, direct) + Moved(oldloc, direct, FALSE, movetime) - //Polaris stuff + // Update timers/cooldown stuff move_speed = world.time - l_move_time l_move_time = world.time - m_flag = 1 - //End - - last_move = direct - set_dir(direct) - if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s) - return FALSE + last_move = direct // The direction you last moved + // set_dir(direct) //Don't think this is necessary //Called after a successful Move(). By this point, we've already moved -/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) - //if (!inertia_moving) - // inertia_next_move = world.time + inertia_move_delay - // newtonian_move(Dir) - //if (length(client_mobs_in_contents)) - // update_parallax_contents() - +/atom/movable/proc/Moved(atom/old_loc, direction, forced = FALSE, movetime) + // Handle any buckled mobs on this movable + if(has_buckled_mobs()) + handle_buckled_mob_movement(old_loc, direction, movetime) + if(riding_datum) + riding_datum.handle_vehicle_layer() + riding_datum.handle_vehicle_offsets() return TRUE +/atom/movable/set_dir(newdir) + . = ..(newdir) + if(riding_datum) + riding_datum.handle_vehicle_offsets() + +/atom/movable/relaymove(mob/user, direction) + . = ..() + if(riding_datum) + riding_datum.handle_ride(user, direction) + // Make sure you know what you're doing if you call this, this is intended to only be called by byond directly. // You probably want CanPass() /atom/movable/Cross(atom/movable/AM) - . = TRUE return CanPass(AM, loc) /atom/movable/CanPass(atom/movable/mover, turf/target) @@ -232,72 +248,113 @@ A.Bumped(src) A.last_bumped = world.time -/atom/movable/proc/forceMove(atom/destination) +/atom/movable/proc/forceMove(atom/destination, direction, movetime) . = FALSE if(destination) - . = doMove(destination) + . = doMove(destination, direction, movetime) else CRASH("No valid destination passed into forceMove") /atom/movable/proc/moveToNullspace() return doMove(null) -/atom/movable/proc/doMove(atom/destination) - . = FALSE +/atom/movable/proc/doMove(atom/destination, direction, movetime) + var/atom/oldloc = loc + var/area/old_area = get_area(oldloc) + var/same_loc = oldloc == destination + if(destination) - var/atom/oldloc = loc - var/same_loc = oldloc == destination - var/area/old_area = get_area(oldloc) var/area/destarea = get_area(destination) + // Do The Move + glide_for(movetime) + last_move = isnull(direction) ? 0 : direction loc = destination + + // Unset this in case it was set in some other proc. We're no longer moving diagonally for sure. moving_diagonally = 0 + // We are moving to a different loc if(!same_loc) + // Not moving out of nullspace if(oldloc) oldloc.Exited(src, destination) + // If it's not the same area, Exited() it if(old_area && old_area != destarea) old_area.Exited(src, destination) - for(var/atom/movable/AM in oldloc) + + // Uncross everything where we left + for(var/i in oldloc) + var/atom/movable/AM = i + if(AM == src) + continue AM.Uncrossed(src) + + // Information about turf and z-levels for source and dest collected var/turf/oldturf = get_turf(oldloc) var/turf/destturf = get_turf(destination) var/old_z = (oldturf ? oldturf.z : null) var/dest_z = (destturf ? destturf.z : null) + + // So objects can be informed of z-level changes if (old_z != dest_z) onTransitZ(old_z, dest_z) + + // Destination atom Entered destination.Entered(src, oldloc) + + // Entered() the new area if it's not the same area if(destarea && old_area != destarea) destarea.Entered(src, oldloc) - for(var/atom/movable/AM in destination) + // We ignore ourselves because if we're multi-tile we might be in both old and new locs + for(var/i in destination) + var/atom/movable/AM = i if(AM == src) continue AM.Crossed(src, oldloc) + // Call our thingy to inform everyone we moved + Moved(oldloc, NONE, TRUE) + // Break pulling if we are too far to pull now. if(pulledby && (pulledby.z != src.z || get_dist(pulledby, src) > 1)) pulledby.stop_pulling() - Moved(oldloc, NONE, TRUE) - . = TRUE + // We moved + return TRUE //If no destination, move the atom into nullspace (don't do this unless you know what you're doing) - else - . = TRUE - if (loc) - var/atom/oldloc = loc - var/area/old_area = get_area(oldloc) - oldloc.Exited(src, null) - if(old_area) - old_area.Exited(src, null) + else if(oldloc) loc = null + // Uncross everything where we left (no multitile safety like above because we are definitely not still there) + for(var/i in oldloc) + var/atom/movable/AM = i + AM.Uncrossed(src) + + // Exited() our loc and area + oldloc.Exited(src, null) + if(old_area) + old_area.Exited(src, null) + + // We moved + return TRUE + /atom/movable/proc/onTransitZ(old_z,new_z) GLOB.z_moved_event.raise_event(src, old_z, new_z) for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. var/atom/movable/AM = item AM.onTransitZ(old_z,new_z) + +/atom/movable/proc/glide_for(movetime) + if(movetime) + glide_size = WORLD_ICON_SIZE/max(DS2TICKS(movetime), 1) + spawn(movetime) + glide_size = initial(glide_size) + else + glide_size = initial(glide_size) + ///////////////////////////////////////////////////////////////// //called when src is thrown into hit_atom diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm index 664e6191ae..4a84fde371 100644 --- a/code/game/gamemodes/changeling/powers/armblade.dm +++ b/code/game/gamemodes/changeling/powers/armblade.dm @@ -113,11 +113,11 @@ /obj/item/weapon/melee/changeling/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(default_parry_check(user, attacker, damage_source) && prob(defend_chance)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") - playsound(user.loc, 'sound/weapons/slash.ogg', 50, 1) + playsound(src, 'sound/weapons/slash.ogg', 50, 1) return 1 if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance)) user.visible_message("\The [user] deflects [attack_text] with \the [src]!") - playsound(user.loc, 'sound/weapons/slash.ogg', 50, 1) + playsound(src, 'sound/weapons/slash.ogg', 50, 1) return 1 return 0 diff --git a/code/game/gamemodes/changeling/powers/escape_restraints.dm b/code/game/gamemodes/changeling/powers/escape_restraints.dm index 08700b1e04..ced80d35bf 100644 --- a/code/game/gamemodes/changeling/powers/escape_restraints.dm +++ b/code/game/gamemodes/changeling/powers/escape_restraints.dm @@ -34,7 +34,7 @@ C.handcuffed = null if(C.buckled && C.buckled.buckle_require_restraints) C.buckled.unbuckle_mob() - C.update_inv_handcuffed() + C.update_handcuffed() if (C.client) C.client.screen -= W W.forceMove(C.loc) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 420b1173c8..e483498155 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -50,7 +50,7 @@ H.handcuffed = null if(H.buckled && H.buckled.buckle_require_restraints) H.buckled.unbuckle_mob() - H.update_inv_handcuffed() + H.update_handcuffed() if (H.client) H.client.screen -= W W.forceMove(H.loc) diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm index 64c97a30f4..954361fb9f 100644 --- a/code/game/gamemodes/cult/construct_spells.dm +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -537,7 +537,7 @@ proc/findNullRod(var/atom/target) new_projectile.fire() log_and_message_admins("has casted [src] at \the [hit_atom].") if(fire_sound) - playsound(get_turf(src), fire_sound, 75, 1) + playsound(src, fire_sound, 75, 1) return 1 return 0 diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 8560582ee8..827e9730da 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -35,7 +35,7 @@ throw_at(get_edge_target_turf(src, pick(alldirs)), rand(1,3), throw_speed) var/spooky = pick('sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg', 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/wail.ogg') - playsound(loc, spooky, 50, 1) + playsound(src, spooky, 50, 1) return 1 diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index b9d434902e..bbf4bfb343 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -57,7 +57,7 @@ if(prob(1+ damage * 5)) visible_message("[shatter_message]") STOP_PROCESSING(SSobj, src) - playsound(get_turf(src),shatter_sound, 75, 1) + playsound(src,shatter_sound, 75, 1) isbroken = 1 density = 0 icon_state = "[initial(icon_state)]-broken" @@ -73,21 +73,21 @@ ) STOP_PROCESSING(SSobj, src) user.do_attack_animation(src) - playsound(get_turf(src),shatter_sound, 75, 1) + playsound(src,shatter_sound, 75, 1) isbroken = 1 density = 0 icon_state = "[initial(icon_state)]-broken" set_light(0) else to_chat(user, "You hit \the [src]!") - playsound(get_turf(src),impact_sound, 75, 1) + playsound(src,impact_sound, 75, 1) else if(prob(damage * 2)) to_chat(user, "You pulverize what was left of \the [src]!") qdel(src) else to_chat(user, "You hit \the [src]!") - playsound(get_turf(src),impact_sound, 75, 1) + playsound(src,impact_sound, 75, 1) /obj/structure/cult/pylon/proc/repair(mob/user as mob) if(isbroken) diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 400ae1058d..526164cd58 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -95,7 +95,7 @@ The "dust" will damage the hull of the station causin minor hull breaches. if(!M.stat && !istype(M, /mob/living/silicon/ai)) shake_camera(M, 3, 1) if (A) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) if(ismob(A)) A.ex_act(strength)//This should work for now I guess diff --git a/code/game/gamemodes/events/holidays/Christmas.dm b/code/game/gamemodes/events/holidays/Christmas.dm index 66e329ac1a..c34f370a33 100644 --- a/code/game/gamemodes/events/holidays/Christmas.dm +++ b/code/game/gamemodes/events/holidays/Christmas.dm @@ -40,7 +40,7 @@ "What do you get from eating tree decorations?\n\nTinsilitis!", "What do snowmen wear on their heads?\n\nIce caps!", "Why is Christmas just like life on ss13?\n\nYou do all the work and the fat guy gets all the credit.", - "Why doesn’t Santa have any children?\n\nBecause he only comes down the chimney.") + "Why doesn't Santa have any children?\n\nBecause he only comes down the chimney.") new /obj/item/clothing/head/festive(target.loc) user.update_icons() cracked = 1 @@ -49,7 +49,7 @@ other_half.cracked = 1 other_half.icon_state = "cracker2" target.put_in_active_hand(other_half) - playsound(user, 'sound/effects/snap.ogg', 50, 1) + playsound(src, 'sound/effects/snap.ogg', 50, 1) return 1 return ..() diff --git a/code/game/gamemodes/game_mode_latespawn.dm b/code/game/gamemodes/game_mode_latespawn.dm index 578c1a0d8c..9fcb4bd0ea 100644 --- a/code/game/gamemodes/game_mode_latespawn.dm +++ b/code/game/gamemodes/game_mode_latespawn.dm @@ -34,7 +34,7 @@ if(emergency_shuttle.shuttle && (emergency_shuttle.shuttle.moving_status == SHUTTLE_WARMUP || emergency_shuttle.shuttle.moving_status == SHUTTLE_INTRANSIT)) return // Don't do anything if the shuttle's coming. - var/mills = round_duration_in_ticks + var/mills = round_duration_in_ds var/mins = round((mills % 36000) / 600) var/hours = round(mills / 36000) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 81b8a4e6b9..a07c42d69d 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -138,14 +138,13 @@ . = ..() //process movement... - if(.)//.. if did move, ram the turf we get in - var/turf/T = get_turf(loc) - ram_turf(T) +/obj/effect/meteor/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + var/turf/T = get_turf(loc) + ram_turf(T) - if(prob(10) && !istype(T, /turf/space))//randomly takes a 'hit' from ramming - get_hit() - - return . + if(prob(10) && !istype(T, /turf/space)) //randomly takes a 'hit' from ramming + get_hit() /obj/effect/meteor/Destroy() walk(src,0) //this cancels the walk_towards() proc diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 5447431279..62406c3877 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -211,7 +211,7 @@ /obj/item/weapon/pinpointer/nukeop/proc/workdisk() if(bomb_set) //If the bomb is set, lead to the shuttle mode = 1 //Ensures worklocation() continues to work - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed return //Get outta here @@ -236,7 +236,7 @@ /obj/item/weapon/pinpointer/nukeop/proc/worklocation() if(!bomb_set) mode = 0 - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) visible_message("Authentication Disk Locator active.") return diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index c8e8130adc..7618708aad 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -70,7 +70,7 @@ to_chat(user, "Your shield has absorbed most of \the [damage_source].") spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return 0 // This shield does not block all damage, so returning 0 is needed to tell the game to apply the new damage. /obj/item/clothing/suit/armor/shield/attack_self(mob/user) diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index 86d6f82b08..124e1ed1f3 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -81,4 +81,4 @@ lightning.old_style_target(target) lightning.fire() visible_message("\The [src] strikes \the [target] with lightning!") - playsound(get_turf(src), 'sound/weapons/gauss_shoot.ogg', 75, 1) \ No newline at end of file + playsound(src, 'sound/weapons/gauss_shoot.ogg', 75, 1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index c8a66fac3c..1914b72f14 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -75,7 +75,7 @@ /obj/item/weapon/spell/audible_deception/on_ranged_cast(atom/hit_atom, mob/living/user) var/turf/T = get_turf(hit_atom) if(selected_sound && pay_energy(200)) - playsound(T, selected_sound, 80, 1, -1) + playsound(src, selected_sound, 80, 1, -1) adjust_instability(1) // Air Horn time. if(selected_sound == 'sound/items/AirHorn.ogg' && pay_energy(3800)) diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm index 13a2b5e318..ad2c72518b 100644 --- a/code/game/gamemodes/technomancer/spells/instability_tap.dm +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -26,5 +26,5 @@ else core.give_energy(amount) adjust_instability(50) - playsound(get_turf(src), 'sound/effects/supermatter.ogg', 75, 1) + playsound(src, 'sound/effects/supermatter.ogg', 75, 1) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm index 61c6367260..b36f17c726 100644 --- a/code/game/gamemodes/technomancer/spells/oxygenate.dm +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -29,5 +29,5 @@ if(pay_energy(1500)) T.assume_gas("oxygen", 200) T.assume_gas("nitrogen", 800) - playsound(src.loc, 'sound/effects/spray.ogg', 50, 1, -3) + playsound(src, 'sound/effects/spray.ogg', 50, 1, -3) adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index a52bb2e584..62ae49b0f0 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -16,7 +16,7 @@ new_projectile.fire() log_and_message_admins("has casted [src] at \the [hit_atom].") if(fire_sound) - playsound(get_turf(src), fire_sound, 75, 1) + playsound(src, fire_sound, 75, 1) adjust_instability(instability_per_shot) return 1 return 0 diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index 47ed0663f2..756e9e27fc 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -60,7 +60,7 @@ P.damage = P.damage * 1.5 spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) // now send a log so that admins don't think they're shooting themselves on purpose. log_and_message_admins("[user] reflected [attacker]'s attack back at them.") @@ -80,7 +80,7 @@ on the same side, and hits you!") spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) log_and_message_admins("[user] reflected [attacker]'s attack back at them.") diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm index 02c072b90d..41dc9ce34f 100644 --- a/code/game/gamemodes/technomancer/spells/resurrect.dm +++ b/code/game/gamemodes/technomancer/spells/resurrect.dm @@ -44,7 +44,7 @@ for(var/mob/observer/dead/ghost in player_list) if(ghost.mind == H.mind) ghost.notify_revive("The Technomancer [user.real_name] is trying to revive you. \ - Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg') + Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg', source = user) break H.adjustBruteLoss(-40) diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm index 6bcbda5ec4..b11d5590b0 100644 --- a/code/game/gamemodes/technomancer/spells/shield.dm +++ b/code/game/gamemodes/technomancer/spells/shield.dm @@ -55,7 +55,7 @@ if(check_shield_arc(user, bad_arc, damage_source, attacker)) user.visible_message("\The [user]'s [src] blocks [attack_text]!") spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) adjust_instability(2) return 1 return 0 diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 2ded8a4cbe..b78fc5f74a 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -31,6 +31,7 @@ var/outfit_type // What outfit datum does this job use in its default title? var/offmap_spawn = FALSE // Do we require weird and special spawning and datacore handling? + var/mob_type = JOB_CARBON // Bitflags representing mob type this job spawns // Description of the job's role and minimum responsibilities. var/job_description = "This Job doesn't have a description! Please report it!" diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 6f89adcd07..1619569c9d 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -18,6 +18,7 @@ economic_modifier = 0 has_headset = FALSE assignable = FALSE + mob_type = JOB_SILICON_AI outfit_type = /decl/hierarchy/outfit/job/silicon/ai job_description = "The AI oversees the operation of the station and its crew, but has no real authority over them. \ The AI is required to follow its Laws, and Lawbound Synthetics that are linked to it are expected to follow \ @@ -54,6 +55,7 @@ economic_modifier = 0 has_headset = FALSE assignable = FALSE + mob_type = JOB_SILICON_ROBOT outfit_type = /decl/hierarchy/outfit/job/silicon/cyborg job_description = "A Cyborg is a mobile station synthetic, piloted by a cybernetically preserved brain. It is considered a person, but is still required \ to follow its Laws." diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 806d0fe794..182382578a 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -360,54 +360,64 @@ var/global/datum/controller/occupations/job_master //Equip custom gear loadout. var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage. var/list/custom_equip_leftovers = list() - if(H.client.prefs.gear && H.client.prefs.gear.len && job.title != "Cyborg" && job.title != "AI") + if(H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON)) for(var/thing in H.client.prefs.gear) var/datum/gear/G = gear_datums[thing] - if(G) - var/permitted - if(G.allowed_roles) - for(var/job_name in G.allowed_roles) - if(job.title == job_name) - permitted = 1 + if(!G) //Not a real gear datum (maybe removed, as this is loaded from their savefile) + continue + + var/permitted + // Check if it is restricted to certain roles + if(G.allowed_roles) + for(var/job_name in G.allowed_roles) + if(job.title == job_name) + permitted = 1 + else + permitted = 1 + + // Check if they're whitelisted for this gear (in alien whitelist? seriously?) + if(G.whitelisted && !is_alien_whitelisted(H, GLOB.all_species[G.whitelisted])) + permitted = 0 + + // If they aren't, tell them + if(!permitted) + to_chat(H, "Your current species, job or whitelist status does not permit you to spawn with [thing]!") + continue + + // Implants get special treatment + if(G.slot == "implant") + var/obj/item/weapon/implant/I = G.spawn_item(H) + I.invisibility = 100 + I.implant_loadout(H) + continue + + // Try desperately (and sorta poorly) to equip the item + if(G.slot && !(G.slot in custom_equip_slots)) + var/metadata = H.client.prefs.gear[G.display_name] + if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) + custom_equip_leftovers += thing + else if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot)) + to_chat(H, "Equipping you with \the [thing]!") + custom_equip_slots.Add(G.slot) else - permitted = 1 + custom_equip_leftovers.Add(thing) + else + spawn_in_storage += thing - if(G.whitelisted && !is_alien_whitelisted(H, GLOB.all_species[G.whitelisted])) - - //if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted))) - permitted = 0 - - if(!permitted) - to_chat(H, "Your current species, job or whitelist status does not permit you to spawn with [thing]!") - continue - - if(G.slot == "implant") - var/obj/item/weapon/implant/I = G.spawn_item(H) - I.invisibility = 100 - I.implant_loadout(H) - continue - - if(G.slot && !(G.slot in custom_equip_slots)) - // This is a miserable way to fix the loadout overwrite bug, but the alternative requires - // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z - var/metadata = H.client.prefs.gear[G.display_name] - if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) - custom_equip_leftovers += thing - else if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot)) - to_chat(H, "Equipping you with \the [thing]!") - custom_equip_slots.Add(G.slot) - else - custom_equip_leftovers.Add(thing) - else - spawn_in_storage += thing - //Equip job items. + // Set up their account job.setup_account(H) + + // Equip job items. job.equip(H, H.mind ? H.mind.role_alt_title : "") + + // Stick their fingerprints on literally everything job.apply_fingerprints(H) - if(job.title != "Cyborg" && job.title != "AI") + + // Only non-silicons get post-job-equip equipment + if(!(job.mob_type & JOB_SILICON)) H.equip_post_job() - //If some custom items could not be equipped before, try again now. + // If some custom items could not be equipped before, try again now. for(var/thing in custom_equip_leftovers) var/datum/gear/G = gear_datums[thing] if(G.slot in custom_equip_slots) @@ -442,14 +452,16 @@ var/global/datum/controller/occupations/job_master H.mind.assigned_role = rank alt_title = H.mind.role_alt_title - switch(rank) - if("Cyborg") - return H.Robotize() - if("AI") - return H - if("Colony Director") - var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP) ? null : sound('sound/misc/boatswain.ogg', volume=20) - captain_announcement.Announce("All hands, [alt_title ? alt_title : "Colony Director"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z) + // If we're a silicon, we may be done at this point + if(job.mob_type & JOB_SILICON_ROBOT) + return H.Robotize() + if(job.mob_type & JOB_SILICON_AI) + return H + + // TWEET PEEP + if(rank == "Colony Director") + var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP) ? null : sound('sound/misc/boatswain.ogg', volume=20) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Colony Director"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z) //Deferred item spawning. if(spawn_in_storage && spawn_in_storage.len) @@ -559,7 +571,7 @@ var/global/datum/controller/occupations/job_master if(!J) continue J.total_positions = text2num(value) J.spawn_positions = text2num(value) - if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now + if(J.mob_type & JOB_SILICON) J.total_positions = 0 return 1 diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 7bac2c4599..8edc131ac8 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -13,9 +13,9 @@ cable.amount = 100 ..() -/obj/machinery/cablelayer/Move(new_turf,M_Dir) - ..() - layCable(new_turf,M_Dir) +/obj/machinery/cablelayer/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + layCable(loc,direction) /obj/machinery/cablelayer/attack_hand(mob/user as mob) if(!cable&&!on) @@ -41,7 +41,7 @@ m = min(m, cable.amount) m = min(m, 30) if(m) - playsound(src.loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) use_cable(m) var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.amount = m diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 5de1543426..0d67a00651 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -53,15 +53,6 @@ return TRUE return FALSE -/obj/machinery/optable/MouseDrop_T(obj/O as obj, mob/user as mob) - - if((!(istype(O, /obj/item/weapon)) || user.get_active_hand() != O)) - return - user.drop_item() - if(O.loc != src.loc) - step(O, get_dir(O, src)) - return - /obj/machinery/optable/proc/check_victim() if(locate(/mob/living/carbon/human, src.loc)) var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, src.loc) @@ -96,40 +87,43 @@ else icon_state = "table2-idle" -/obj/machinery/optable/MouseDrop_T(mob/target, mob/user) - - var/mob/living/M = user - if(user.stat || user.restrained() || !check_table(user) || !iscarbon(target)) - return - if(istype(M)) - take_victim(target,user) - else +/obj/machinery/optable/MouseDrop_T(mob/living/carbon/target, mob/living/user) + if(!istype(target) || !istype(user)) return ..() + if(!Adjacent(target) || !Adjacent(user)) + return ..() + + if(user.incapacitated() || !check_table(target, user)) + return ..() + + take_victim(target, user) + /obj/machinery/optable/verb/climb_on() set name = "Climb On Table" set category = "Object" set src in oview(1) - if(usr.stat || !ishuman(usr) || usr.restrained() || !check_table(usr)) + var/mob/living/user = usr + if(!istype(user) || user.incapacitated() || !check_table(user, user)) return - take_victim(usr,usr) + take_victim(user, user) -/obj/machinery/optable/attackby(obj/item/weapon/W as obj, mob/living/carbon/user as mob) +/obj/machinery/optable/attackby(obj/item/weapon/W, mob/living/carbon/user) if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W - if(iscarbon(G.affecting) && check_table(G.affecting)) - take_victim(G.affecting,usr) + if(iscarbon(G.affecting) && check_table(G.affecting, user)) + take_victim(G.affecting, user) qdel(W) return -/obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) +/obj/machinery/optable/proc/check_table(mob/living/carbon/patient, mob/living/user) check_victim() if(victim && get_turf(victim) == get_turf(src) && victim.lying) - to_chat(usr, "\The [src] is already occupied!") + to_chat(user, "\The [src] is already occupied!") return 0 if(patient.buckled) - to_chat(usr, "Unbuckle \the [patient] first!") + to_chat(user, "Unbuckle \the [patient] first!") return 0 return 1 \ No newline at end of file diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 3d76b02e0f..b45d00c3f7 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -116,7 +116,7 @@ /obj/machinery/alarm/proc/first_run() alarm_area = get_area(src) - area_uid = "\ref[alarm_area]" + area_uid = "\ref[alarm_area]" if(name == "alarm") name = "[alarm_area.name] Air Alarm" @@ -188,7 +188,7 @@ regulating_temperature = 1 audible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click and a faint electronic hum.") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) else //check for when we should stop adjusting temperature if(get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5) @@ -196,7 +196,7 @@ regulating_temperature = 0 audible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click as a faint electronic humming stops.") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) if(regulating_temperature) if(target_temperature > T0C + MAX_TEMPERATURE) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3833c72ee4..3a012a1ccd 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -171,7 +171,7 @@ update_flag location.assume_air(air_contents) src.destroyed = 1 - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) + playsound(src, 'sound/effects/spray.ogg', 10, 1, -3) src.density = 0 update_icon() diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 3b6df894b5..879551493d 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -213,7 +213,7 @@ return anchored = !anchored - playsound(src.loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") return diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 136c459cf7..0f468953a8 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -26,6 +26,8 @@ var/datum/wires/autolathe/wires = null + var/filtertext + /obj/machinery/autolathe/Initialize() . = ..() wires = new(src) @@ -66,11 +68,14 @@ material_bottom += "[stored_material[material]]/[storage_capacity[material]]" dat += "[material_top.Join()][material_bottom.Join()]
" + dat += "Filter: [filtertext ? filtertext : "None Set"]
" dat += "

Printable Designs

Showing: [current_category].

" for(var/datum/category_item/autolathe/R in current_category.items) if(R.hidden && !hacked) continue + if(filtertext && findtext(R.name, filtertext) == 0) + continue var/can_make = 1 var/list/material_string = list() var/list/multiplier_string = list() @@ -102,12 +107,14 @@ multiplier_string += "\[x[i]\]" multiplier_string += "\[x[max_sheets]\]" - dat += "" + dat += "" dat += "
[R.hidden ? "*" : ""][can_make ? "" : ""][R.name][can_make ? "" : ""][R.hidden ? "*" : ""][multiplier_string.Join()][material_string.Join()]
[R.hidden ? "*" : ""][can_make ? "" : ""][R.name][can_make ? "" : ""][R.hidden ? "*" : ""][multiplier_string.Join()][material_string.Join()]

" - user << browse(dat.Join(), "window=autolathe") - onclose(user, "autolathe") + dat = jointext(dat, null) + var/datum/browser/popup = new(user, "autolathe", "Autolathe Production Menu", 550, 700) + popup.set_content(dat) + popup.open() /obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) if(busy) @@ -196,7 +203,7 @@ else to_chat(user, "You fill \the [src] with \the [eating].") - flick("autolathe_o", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z + flick("autolathe_loading", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z if(istype(eating,/obj/item/stack)) var/obj/item/stack/stack = eating @@ -223,6 +230,16 @@ to_chat(usr, "The autolathe is busy. Please wait for completion of previous operation.") return + else if(href_list["setfilter"]) + var/filterstring = input(usr, "Input a filter string, or blank to not filter:", "Design Filter", filtertext) as null|text + if(!Adjacent(usr)) + return + if(isnull(filterstring)) //Clicked Cancel + return + if(filterstring == "") //Cleared value + filtertext = null + filtertext = sanitize(filterstring, 25) + if(href_list["change_category"]) var/choice = input("Which category do you wish to display?") as null|anything in machine_recipes.categories @@ -268,6 +285,7 @@ //Create the desired item. var/obj/item/I = new making.path(src.loc) + flick("[initial(icon_state)]_finish", src) if(multiplier > 1) if(istype(I, /obj/item/stack)) var/obj/item/stack/S = I @@ -279,14 +297,16 @@ updateUsrDialog() /obj/machinery/autolathe/update_icon() + overlays.Cut() + + icon_state = initial(icon_state) + if(panel_open) - icon_state = "autolathe_t" - else if(busy) - icon_state = "autolathe_n" - else - if(icon_state == "autolathe_n") - flick("autolathe_u", src) // If lid WAS closed, show opening animation - icon_state = "autolathe" + overlays.Add(image(icon, "[icon_state]_panel")) + if(stat & NOPOWER) + return + if(busy) + icon_state = "[icon_state]_work" //Updates overall lathe storage size. /obj/machinery/autolathe/RefreshParts() diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 0865a3ec55..d8bd9ba1d1 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -163,11 +163,11 @@ processing = 1 update_icon() updateUsrDialog() - playsound(src.loc, 'sound/machines/blender.ogg', 40, 1) + playsound(src, 'sound/machines/blender.ogg', 40, 1) use_power(S * 30) sleep((S + 15) / eat_eff) processing = 0 - playsound(src.loc, 'sound/machines/biogenerator_end.ogg', 40, 1) + playsound(src, 'sound/machines/biogenerator_end.ogg', 40, 1) update_icon() else menustat = "void" diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 853029b217..034a7fe243 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -283,7 +283,7 @@ /obj/machinery/organ_printer/flesh/print_organ(var/choice) var/obj/item/organ/O = ..() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) visible_message("\The [src] dings, then spits out \a [O].") return O @@ -348,7 +348,7 @@ var/obj/item/organ/O = ..() O.robotize() O.status |= ORGAN_CUT_AWAY // robotize() resets status to 0 - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) audible_message("\The [src] dings, then spits out \a [O].") return O diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 8be097fa2f..8fd7c44c7c 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -82,6 +82,8 @@ ..() /obj/machinery/camera/Destroy() + if(isMotion()) + unsense_proximity(callback = .HasProximity) deactivate(null, 0) //kick anyone viewing out if(assembly) qdel(assembly) @@ -151,7 +153,7 @@ user.do_attack_animation(src) user.setClickCooldown(user.get_attack_speed()) visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + playsound(src, 'sound/weapons/slash.ogg', 100, 1) add_hiddenprint(user) destroy() @@ -162,7 +164,7 @@ S.do_attack_animation(src) S.setClickCooldown(user.get_attack_speed()) visible_message("\The [user] [pick(S.attacktext)] \the [src]!") - playsound(src.loc, S.attack_sound, 100, 1) + playsound(src, S.attack_sound, 100, 1) add_hiddenprint(user) destroy() ..() @@ -176,7 +178,7 @@ panel_open = !panel_open user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", "You screw the camera's panel [panel_open ? "open" : "closed"].") - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open) interact(user) @@ -251,7 +253,7 @@ if (istype(W, /obj/item)) //is it even possible to get into attackby() with non-items? var/obj/item/I = W if (I.hitsound) - playsound(loc, I.hitsound, 50, 1, -1) + playsound(src, I.hitsound, 50, 1, -1) take_damage(W.force) else @@ -271,7 +273,7 @@ visible_message(" [user] has deactivated [src]!") else visible_message(" [src] clicks and shuts down. ") - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) icon_state = "[initial(icon_state)]1" add_hiddenprint(user) else @@ -279,7 +281,7 @@ visible_message(" [user] has reactivated [src]!") else visible_message(" [src] clicks and reactivates itself. ") - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) icon_state = initial(icon_state) add_hiddenprint(user) @@ -301,7 +303,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, loc) spark_system.start() - playsound(loc, "sparks", 50, 1) + playsound(src, "sparks", 50, 1) /obj/machinery/camera/proc/set_status(var/newstatus) if (status != newstatus) @@ -397,7 +399,7 @@ // Do after stuff here to_chat(user, "You start to weld [src]..") - playsound(src.loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) WT.eyecheck(user) busy = 1 if(do_after(user, 100 * WT.toolspeed)) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 31877f868e..69fb773c6d 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -78,7 +78,7 @@ if(3) // State 3 if(W.is_screwdriver()) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT)) if(!input) @@ -118,7 +118,7 @@ else if(W.is_wirecutter()) new/obj/item/stack/cable_coil(get_turf(src), 2) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You cut the wires from the circuits.") state = 2 return @@ -161,7 +161,7 @@ return 0 to_chat(user, "You start to weld the [src]..") - playsound(src.loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) WT.eyecheck(user) busy = 1 if(do_after(user, 20 * WT.toolspeed)) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index eac1f89386..ad183a7be8 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -3,15 +3,13 @@ var/detectTime = 0 var/area/ai_monitored/area_motion = null var/alarm_delay = 100 // Don't forget, there's another 10 seconds in queueAlarm() - flags = PROXMOVE /obj/machinery/camera/internal_process() // motion camera event loop if (stat & (EMPED|NOPOWER)) return if(!isMotion()) - . = PROCESS_KILL - return + return PROCESS_KILL if (detectTime > 0) var/elapsed = world.time - detectTime if (elapsed > alarm_delay) @@ -56,7 +54,7 @@ detectTime = -1 return 1 -/obj/machinery/camera/HasProximity(atom/movable/AM as mob|obj) +/obj/machinery/camera/HasProximity(turf/T, atom/movable/AM, old_loc) // Motion cameras outside of an "ai monitored" area will use this to detect stuff. if (!area_motion) if(isliving(AM)) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 15b5f7abca..f625fb9546 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -212,9 +212,12 @@ var/global/list/engineering_networks = list( update_coverage() /obj/machinery/camera/proc/upgradeMotion() + if(!isturf(loc)) + return //nooooo assembly.upgrades.Add(new /obj/item/device/assembly/prox_sensor(assembly)) setPowerUsage() START_MACHINE_PROCESSING(src) + sense_proximity(callback = .HasProximity) update_coverage() /obj/machinery/camera/proc/setPowerUsage() diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index f7fd84eca7..60541e0fe3 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -152,11 +152,11 @@ cameraFollow = null /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob) - if(!istype(target)) return + if(!istype(target)) return FALSE var/mob/living/silicon/ai/U = usr if(target == U.cameraFollow) - return + return TRUE if(U.cameraFollow) U.ai_cancel_tracking() @@ -185,6 +185,8 @@ return sleep(10) + return TRUE + /obj/machinery/camera/attack_ai(var/mob/living/silicon/ai/user as mob) if (!istype(user)) return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 0e184bfc90..019ed86bea 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -201,7 +201,7 @@ return else if((occupant.health >= heal_level || occupant.health == occupant.getMaxHealth()) && (!eject_wait)) - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) audible_message("\The [src] signals that the cloning process is complete.") connected_message("Cloning Process Complete.") locked = 0 diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 8a88948ee0..397366c6c2 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -15,7 +15,7 @@ switch(state) if(0) if(P.is_wrench()) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You wrench the frame into place.") anchored = 1 @@ -25,7 +25,7 @@ if(!WT.isOn()) to_chat(user, "The welder must be on for this task.") return - playsound(loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) if(do_after(user, 20 * WT.toolspeed)) if(!src || !WT.remove_fuel(0, user)) return to_chat(user, "You deconstruct the frame.") @@ -33,25 +33,25 @@ qdel(src) if(1) if(P.is_wrench()) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You unfasten the frame.") anchored = 0 state = 0 if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit) - playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You place the circuit board inside the frame.") icon_state = "1" circuit = P user.drop_item() P.loc = src if(P.is_screwdriver() && circuit) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You screw the circuit board into place.") state = 2 icon_state = "2" if(P.is_crowbar() && circuit) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the circuit board.") state = 1 icon_state = "0" @@ -59,7 +59,7 @@ circuit = null if(2) if(P.is_screwdriver() && circuit) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You unfasten the circuit board.") state = 1 icon_state = "1" @@ -69,7 +69,7 @@ to_chat(user, "You need five coils of wire to add them to the frame.") return to_chat(user, "You start to add cables to the frame.") - playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if (do_after(user, 20) && state == 2) if (C.use(5)) state = 3 @@ -81,7 +81,7 @@ if (brain) to_chat(user, "Get that brain out of there first") else - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the cables.") state = 2 icon_state = "2" @@ -94,7 +94,7 @@ to_chat(user, "You need two sheets of glass to put in the glass panel.") return to_chat(user, "You start to put in the glass panel.") - playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if (do_after(user, 20) && state == 3) if(RG.use(2)) to_chat(user, "You put in the glass panel.") @@ -146,7 +146,7 @@ icon_state = "3b" if(P.is_crowbar() && brain) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the brain.") brain.loc = loc brain = null @@ -154,7 +154,7 @@ if(4) if(P.is_crowbar()) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the glass panel.") state = 3 if (brain) @@ -165,7 +165,7 @@ return if(P.is_screwdriver()) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You connect the monitor.") if(!brain) var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 86f3fe93da..0ce27d99bb 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -672,10 +672,10 @@ src.visible_message("The machine states, 'YOU ARE UNDER ARREST, RAIDER!' and shoots handcuffs onto [usr]!", "You hear something say 'YOU ARE UNDER ARREST, RAIDER!' and a clinking sound") var/obj/item/weapon/handcuffs/C = new(src.loc) var/mob/living/carbon/human/H = usr - if(istype(usr)) + if(istype(H)) C.forceMove(H) H.handcuffed = C - H.update_inv_handcuffed() + H.update_handcuffed() else C.throw_at(usr,16,3,src) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index c69cca31b5..48f899ed0d 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -21,7 +21,7 @@ /obj/machinery/computer/atmoscontrol/laptop name = "Atmospherics Laptop" desc = "A cheap laptop." - icon_screen = "atmoslaptop" + icon_screen = "medlaptop" icon_state = "laptop" icon_keyboard = "laptop_key" density = 0 diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 960ce3dc35..054c9c2cc3 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -14,7 +14,7 @@ switch(state) if(0) if(P.is_wrench()) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You wrench the frame into place.") src.anchored = 1 @@ -24,7 +24,7 @@ if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") return - playsound(src.loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) if(do_after(user, 20 * WT.toolspeed)) if(!src || !WT.isOn()) return to_chat(user, "You deconstruct the frame.") @@ -32,7 +32,7 @@ qdel(src) if(1) if(P.is_wrench()) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You unfasten the frame.") src.anchored = 0 @@ -40,7 +40,7 @@ if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "computer") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You place the circuit board inside the frame.") src.icon_state = "1" src.circuit = P @@ -49,12 +49,12 @@ else to_chat(user, "This frame does not accept circuit boards of this type!") if(P.is_screwdriver() && circuit) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You screw the circuit board into place.") src.state = 2 src.icon_state = "2" if(P.is_crowbar()) && circuit) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the circuit board.") src.state = 1 src.icon_state = "0" @@ -62,7 +62,7 @@ src.circuit = null if(2) if(P.is_screwdriver() && circuit) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You unfasten the circuit board.") src.state = 1 src.icon_state = "1" @@ -72,7 +72,7 @@ to_chat(user, "You need five coils of wire to add them to the frame.") return to_chat(user, "You start to add cables to the frame.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20) && state == 2) if (C.use(5)) to_chat(user, "You add cables to the frame.") @@ -80,7 +80,7 @@ icon_state = "3" if(3) if(P.is_wirecutter()) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the cables.") src.state = 2 src.icon_state = "2" @@ -92,7 +92,7 @@ if (G.get_amount() < 2) to_chat(user, "You need two sheets of glass to put in the glass panel.") return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You start to put in the glass panel.") if(do_after(user, 20) && state == 3) if (G.use(2)) @@ -101,13 +101,13 @@ src.icon_state = "4" if(4) if(P.is_crowbar()) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the glass panel.") src.state = 3 src.icon_state = "3" new /obj/item/stack/material/glass( src.loc, 2 ) if(P.is_screwdriver()) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You connect the monitor.") var/B = new src.circuit.build_path ( src.loc ) src.circuit.construct(B) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 11d1660746..6b8006836c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -119,6 +119,12 @@ check_eye(user) return 1 +/obj/machinery/computer/security/relaymove(mob/user,direct) + var/turf/T = get_turf(current_camera) + for(var/i; i < 10; i++) + T = get_step(T, direct) + jump_on_click(user, T) + //Camera control: moving. /obj/machinery/computer/security/proc/jump_on_click(var/mob/user,var/A) if(user.machine != src) @@ -185,22 +191,15 @@ update_use_power(USE_POWER_IDLE) //Camera control: mouse. +/* Oh my god /atom/DblClick() ..() if(istype(usr.machine,/obj/machinery/computer/security)) var/obj/machinery/computer/security/console = usr.machine console.jump_on_click(usr,src) -//Camera control: arrow keys. -/mob/Move(n,direct) - if(istype(machine,/obj/machinery/computer/security)) - var/obj/machinery/computer/security/console = machine - var/turf/T = get_turf(console.current_camera) - for(var/i;i<10;i++) - T = get_step(T,direct) - console.jump_on_click(src,T) - return - return ..(n,direct) +*/ +//Camera control: arrow keys. /obj/machinery/computer/security/telescreen name = "Telescreen" desc = "Used for watching an empty arena." diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 90c09acb44..30c15f6d04 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -323,10 +323,9 @@ if ((!subject.ckey) || (!subject.client)) scantemp = "Error: Mental interface failure." if(subject.stat == DEAD && subject.mind && subject.mind.key) // If they're dead and not in their body, tell them to get in it. - for(var/mob/observer/dead/ghost in player_list) - if(ghost.ckey == ckey(subject.mind.key)) - ghost.notify_revive("Someone is trying to scan your body in the cloner. Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg') - break + var/mob/observer/dead/ghost = subject.get_ghost() + if(ghost) + ghost.notify_revive("Someone is trying to scan your body in the cloner. Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg', source = src) return if (!isnull(find_record(subject.ckey))) scantemp = "Subject already in database." diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 441970a8cb..dbd5ba8383 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -51,7 +51,7 @@ /* /obj/machinery/computer/pod/attackby(I as obj, user as mob) if(I.is_screwdriver()) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) if(do_after(user, 20)) if(stat & BROKEN) to_chat(user, "The broken glass falls out.") diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index aa9c230e22..3717da58c5 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -33,7 +33,7 @@ if (C.get_amount() < 5) to_chat(user, "You need five lengths of cable to add them to the frame.") return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You start to add cables to the frame.") if(do_after(user, 20) && state == 1) if(C.use(5)) @@ -50,7 +50,7 @@ if(istype(P, /obj/item/weapon/circuitboard)) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "machine") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You add the circuit board to the frame.") circuit = P user.drop_item() @@ -72,7 +72,7 @@ to_chat(user, "This frame does not accept circuit boards of this type!") else if(P.is_wirecutter()) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the cables.") state = 1 icon_state = "box_0" @@ -103,7 +103,7 @@ component_check = 0 break if(component_check) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir) if(new_machine.component_parts) @@ -131,7 +131,7 @@ if(istype(P, /obj/item)) for(var/I in req_components) if(istype(P, text2path(I)) && (req_components[I] > 0)) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(P.is_cable_coil)) var/obj/item/stack/cable_coil/CP = P if(CP.get_amount() > 1) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 42725bbe28..05eb9c322c 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -57,7 +57,7 @@ Barricades if("brute") health -= W.force * 0.75 if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) - playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) else playsound(src, 'sound/weapons/smash.ogg', 50, 1) CheckHealth() @@ -76,9 +76,9 @@ Barricades /obj/structure/barricade/attack_generic(var/mob/user, var/damage, var/attack_verb) visible_message("[user] [attack_verb] the [src]!") if(material == get_material_by_name("resin")) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) - playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) else playsound(src, 'sound/weapons/smash.ogg', 50, 1) user.do_attack_animation(src) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index e4a81d675c..b8f7acd5bf 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -31,7 +31,7 @@ if(req_access.len || req_one_access.len) req_access = list() req_one_access = list() - playsound(src.loc, "sparks", 100, 1) + playsound(src, "sparks", 100, 1) return 1 /obj/machinery/button/remote/attack_hand(mob/user as mob) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 172f51e908..f5c42b8bb6 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -73,7 +73,7 @@ if(do_after(user,5 SECONDS,src)) visible_message("\The [user] forces \the [src] open, sparks flying from its electronics!") src.do_animate("spark") - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) src.locked = 0 src.welded = 0 update_icon() @@ -82,7 +82,7 @@ else if(src.density) visible_message("\The [user] begins forcing \the [src] open!") if(do_after(user, 5 SECONDS,src)) - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) visible_message("\The [user] forces \the [src] open!") open(1) else @@ -637,13 +637,10 @@ About the new airlock wires panel: return 0 if(hasShocked) return 0 //Already shocked someone recently? - if(..()) - hasShocked = 1 - sleep(10) + . = ..() + hasShocked = 1 + spawn(10) hasShocked = 0 - return 1 - else - return 0 /obj/machinery/door/airlock/update_icon() @@ -903,7 +900,7 @@ About the new airlock wires panel: src.welded = 1 else src.welded = null - playsound(src.loc, C.usesound, 75, 1) + playsound(src, C.usesound, 75, 1) src.update_icon() return else @@ -1023,9 +1020,9 @@ About the new airlock wires panel: //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator if(arePowerSystemsOn()) - playsound(src.loc, open_sound_powered, 50, 1) + playsound(src, open_sound_powered, 50, 1) else - playsound(src.loc, open_sound_unpowered, 75, 1) + playsound(src, open_sound_unpowered, 75, 1) if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) src.closeOther.close() @@ -1107,7 +1104,7 @@ About the new airlock wires panel: for(var/atom/movable/AM in turf) if(AM.blocks_airlock()) if(!has_beeped) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) has_beeped = 1 close_door_at = world.time + 6 return @@ -1120,9 +1117,9 @@ About the new airlock wires panel: use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people has_beeped = 0 if(arePowerSystemsOn()) - playsound(src.loc, close_sound_powered, 50, 1) + playsound(src, close_sound_powered, 50, 1) else - playsound(src.loc, open_sound_unpowered, 75, 1) + playsound(src, open_sound_unpowered, 75, 1) for(var/turf/turf in locs) var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) if(killthis) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 5ff587a7d9..136b793f10 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -100,7 +100,7 @@ // Description: Opens or closes the door, depending on current state. No checks are done inside this proc. /obj/machinery/door/blast/proc/force_toggle(var/forced = 0, mob/user as mob) if (forced) - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) if(src.density) src.force_open() @@ -150,7 +150,7 @@ user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") else user.visible_message("\The [user] forcefully strikes \the [src] with \the [W]!") - playsound(src.loc, hitsound, 100, 1) + playsound(src, hitsound, 100, 1) take_damage(W.force*0.35) //it's a blast door, it should take a while. -Luke return @@ -180,7 +180,7 @@ user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") else user.visible_message("\The [user] forcefully strikes \the [src] with \the [W]!") - playsound(src.loc, hitsound, 100, 1) + playsound(src, hitsound, 100, 1) take_damage(W.force*0.15) //If the item isn't a weapon, let's make this take longer than usual to break it down. return @@ -194,13 +194,13 @@ if(src.density) visible_message("\The [user] begins forcing \the [src] open!") if(do_after(user, 15 SECONDS,src)) - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) visible_message("\The [user] forces \the [src] open!") force_open(1) else visible_message("\The [user] begins forcing \the [src] closed!") if(do_after(user, 5 SECONDS,src)) - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) visible_message("\The [user] forces \the [src] closed!") force_close(1) else diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 271dd6f829..8b8fa2da51 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -112,6 +112,11 @@ else bumpopen(M) + if(istype(AM, /obj/item/device/uav)) + if(check_access(null)) + open() + else + do_animate("deny") if(istype(AM, /mob/living/bot)) var/mob/living/bot/bot = AM @@ -189,7 +194,7 @@ tforce = 15 * (speed/5) else tforce = AM:throwforce * (speed/5) - playsound(src.loc, hitsound, 100, 1) + playsound(src, hitsound, 100, 1) take_damage(tforce) return @@ -275,7 +280,7 @@ user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") else user.visible_message("\The [user] forcefully strikes \the [src] with \the [W]!") - playsound(src.loc, hitsound, 100, 1) + playsound(src, hitsound, 100, 1) take_damage(W.force) return @@ -400,7 +405,7 @@ if("deny") if(density && !(stat & (NOPOWER|BROKEN))) flick("door_deny", src) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) return @@ -479,8 +484,7 @@ else source.thermal_conductivity = initial(source.thermal_conductivity) -/obj/machinery/door/Move(new_loc, new_dir) - //update_nearby_tiles() +/obj/machinery/door/Moved(atom/old_loc, direction, forced = FALSE) . = ..() if(width > 1) if(dir in list(EAST, WEST)) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index e4c83ef1bf..52ea077669 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -200,14 +200,14 @@ if(src.blocked) visible_message("\The [user] begins digging into \the [src] internals!") if(do_after(user,5 SECONDS,src)) - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) src.blocked = 0 update_icon() open(1) else if(src.density) visible_message("\The [user] begins forcing \the [src] open!") if(do_after(user, 2 SECONDS,src)) - playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(src, 'sound/machines/airlock_creaking.ogg', 100, 1) visible_message("\The [user] forces \the [src] open!") open(1) else diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm index 4eeec7c5ff..aa857d5065 100644 --- a/code/game/machinery/doors/firedoor_assembly.dm +++ b/code/game/machinery/doors/firedoor_assembly.dm @@ -32,7 +32,7 @@ obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob) to_chat(user, "You wire \the [src].") else if(C.is_wirecutter() && wired ) - playsound(src.loc, C.usesound, 100, 1) + playsound(src, C.usesound, 100, 1) user.visible_message("[user] cuts the wires from \the [src].", "You start to cut the wires from \the [src].") if(do_after(user, 40)) @@ -43,7 +43,7 @@ obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob) else if(istype(C, /obj/item/weapon/circuitboard/airalarm) && wired) if(anchored) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] has inserted a circuit into \the [src]!", "You have inserted the circuit into \the [src]!") if(glass) @@ -56,7 +56,7 @@ obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob) to_chat(user, "You must secure \the [src] first!") else if(C.is_wrench()) anchored = !anchored - playsound(src.loc, C.usesound, 50, 1) + playsound(src, C.usesound, 50, 1) user.visible_message("[user] has [anchored ? "" : "un" ]secured \the [src]!", "You have [anchored ? "" : "un" ]secured \the [src]!") update_icon() @@ -86,7 +86,7 @@ obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob) else if(istype(C, /obj/item/stack/material) && C.get_material_name() == "rglass" && !glass) var/obj/item/stack/S = C if (S.get_amount() >= 1) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + playsound(src, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to \the [src].", "You start to install [S.name] into \the [src].") if(do_after(user, 40, src) && !glass && S.use(1)) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 5ead377f0c..ec561032a1 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -16,7 +16,7 @@ QDEL_NULL(filler2) return ..() -/obj/machinery/door/airlock/multi_tile/Move() +/obj/machinery/door/airlock/multi_tile/Moved(atom/old_loc, direction, forced = FALSE) . = ..() SetBounds() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index f7b8a1222d..98fb1c75d8 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -115,7 +115,7 @@ if (!operating) //in case of emag operating = 1 flick(text("[src.base_state]opening"), src) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) + playsound(src, 'sound/machines/windowdoor.ogg', 100, 1) sleep(10) explosion_resistance = 0 @@ -132,7 +132,7 @@ return FALSE operating = TRUE flick(text("[]closing", src.base_state), src) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) + playsound(src, 'sound/machines/windowdoor.ogg', 100, 1) density = TRUE update_icon() @@ -158,7 +158,7 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.species.can_shred(H)) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("[user] smashes against the [src.name].", 1) user.do_attack_animation(src) user.setClickCooldown(user.get_attack_speed()) @@ -212,8 +212,8 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() - playsound(src.loc, "sparks", 50, 1) - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) visible_message("The glass door was sliced open by [user]!") return 1 @@ -259,7 +259,7 @@ if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card)) user.setClickCooldown(user.get_attack_speed(I)) var/aforce = I.force - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("[src] was hit by [I].") if(I.damtype == BRUTE || I.damtype == BURN) take_damage(aforce) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index a1ca480d26..cb54a0c857 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -173,7 +173,7 @@ // Description: This writes to the logs list, so that people can see what people are doing on the Exonet ingame. Note that this is not an admin logging function. // Communicators are already logged seperately. /obj/machinery/exonet_node/proc/write_log(var/origin_address, var/target_address, var/data_type, var/content) - //var/timestamp = time2text(station_time_in_ticks, "hh:mm:ss") + //var/timestamp = time2text(station_time_in_ds, "hh:mm:ss") var/timestamp = "[stationdate2text()] [stationtime2text()]" var/msg = "[timestamp] | FROM [origin_address] TO [target_address] | TYPE: [data_type] | CONTENT: [content]" logs.Add(msg) diff --git a/code/game/machinery/fire_alarm.dm b/code/game/machinery/fire_alarm.dm index a9b4a0705e..fa95fed959 100644 --- a/code/game/machinery/fire_alarm.dm +++ b/code/game/machinery/fire_alarm.dm @@ -208,7 +208,7 @@ FIRE ALARM for(var/obj/machinery/firealarm/FA in area) fire_alarm.triggerAlarm(loc, FA, duration, hidden = alarms_hidden) update_icon() - playsound(src.loc, 'sound/machines/airalarm.ogg', 25, 0, 4) + playsound(src, 'sound/machines/airalarm.ogg', 25, 0, 4) return /obj/machinery/firealarm/proc/set_security_level(var/newlevel) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 572977ceb4..ad82ffd656 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -13,7 +13,6 @@ anchored = 1 use_power = USE_POWER_IDLE idle_power_usage = 2 - flags = PROXMOVE /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" @@ -57,7 +56,7 @@ if((disable) || (last_flash && world.time < last_flash + 150)) return - playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + playsound(src, 'sound/weapons/flash.ogg', 100, 1) flick("[base_state]_flash", src) last_flash = world.time use_power(1500) @@ -92,13 +91,13 @@ flash() ..(severity) -/obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj) - if((disable) || (last_flash && world.time < last_flash + 150)) +/obj/machinery/flasher/portable/HasProximity(turf/T, atom/movable/AM, oldloc) + if(disable || !anchored || (last_flash && world.time < last_flash + 150)) return - if(istype(AM, /mob/living/carbon)) + if(iscarbon(AM)) var/mob/living/carbon/M = AM - if((M.m_intent != "walk") && (anchored)) + if(M.m_intent != "walk") flash() /obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -108,11 +107,13 @@ if(!anchored) user.show_message(text("[src] can now be moved.")) - overlays.Cut() - + cut_overlays() + unsense_proximity(callback = .HasProximity) + else if(anchored) user.show_message(text("[src] is now secured.")) - overlays += "[base_state]-s" + add_overlay("[base_state]-s") + sense_proximity(callback = .HasProximity) /obj/machinery/button/flasher name = "flasher button" diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index de51359855..09296ac302 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -31,7 +31,7 @@ var/list/floor_light_cache = list() if(!WT.remove_fuel(0, user)) to_chat(user, "\The [src] must be on to complete this task.") return - playsound(src.loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) if(!do_after(user, 20 * WT.toolspeed)) return if(!src || !WT.isOn()) @@ -53,7 +53,7 @@ var/list/floor_light_cache = list() stat |= BROKEN else visible_message("\The [user] attacks \the [src]!") - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) if(isnull(damaged)) damaged = 0 update_brightness() return diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index c4af8fb3a8..d8a2b463e2 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -12,8 +12,8 @@ T = new/obj/item/stack/tile/floor(src) ..() -/obj/machinery/floorlayer/Move(new_turf,M_Dir) - ..() +/obj/machinery/floorlayer/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() if(on) if(mode["dismantle"]) @@ -26,7 +26,7 @@ CollectTiles(old_turf) - old_turf = new_turf + old_turf = loc /obj/machinery/floorlayer/attack_hand(mob/user as mob) on=!on diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 789773e8c3..209a06edab 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -274,7 +274,7 @@ if(P.is_wrench()) if(state == FRAME_PLACED && !anchored) to_chat(user, "You start to wrench the frame into place.") - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) anchored = TRUE if(!need_circuit && circuit) @@ -295,7 +295,7 @@ if(state == FRAME_PLACED) var/obj/item/weapon/weldingtool/WT = P if(WT.remove_fuel(0, user)) - playsound(src.loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) if(src && WT.isOn()) to_chat(user, "You deconstruct the frame.") @@ -311,7 +311,7 @@ var/obj/item/weapon/circuitboard/B = P var/datum/frame/frame_types/board_type = B.board_type if(board_type.name == frame_type.name) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You place the circuit board inside the frame.") circuit = P user.drop_item() @@ -464,7 +464,7 @@ to_chat(user, "You need five coils of wire to add them to the frame.") return to_chat(user, "You start to add cables to the frame.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20) && state == FRAME_FASTENED) if(C.use(5)) to_chat(user, "You add cables to the frame.") @@ -475,7 +475,7 @@ if(frame_type.frame_class == FRAME_CLASS_MACHINE) for(var/I in req_components) if(istype(P, I) && (req_components[I] > 0)) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(istype(P, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CP = P if(CP.get_amount() > 1) @@ -524,7 +524,7 @@ if(G.get_amount() < 2) to_chat(user, "You need two sheets of glass to put in the glass panel.") return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You start to put in the glass panel.") if(do_after(user, 20) && state == FRAME_WIRED) if(G.use(2)) @@ -536,7 +536,7 @@ if(G.get_amount() < 2) to_chat(user, "You need two sheets of glass to put in the glass panel.") return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You start to put in the glass panel.") if(do_after(user, 20) && state == FRAME_WIRED) if(G.use(2)) @@ -548,7 +548,7 @@ if(frame_type.frame_class == FRAME_CLASS_MACHINE) for(var/I in req_components) if(istype(P, I) && (req_components[I] > 0)) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(istype(P, /obj/item/stack)) var/obj/item/stack/ST = P if(ST.get_amount() > 1) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 344a800acf..b2bacc13d9 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -142,7 +142,7 @@ datum/track/New(var/title_name, var/audio) StopPlaying() else if(href_list["play"]) if(emagged) - playsound(src.loc, 'sound/items/AirHorn.ogg', 100, 1) + playsound(src, 'sound/items/AirHorn.ogg', 100, 1) for(var/mob/living/carbon/M in ohearers(6, src)) if(M.get_ear_protection() >= 2) continue diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index b72cab14f0..e61076587b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -5,12 +5,16 @@ Overview: of 'Del' removes reference to src machine in global 'machines list'. Class Variables: + + power_init_complete (boolean) + Indicates that we have have registered our static power usage with the area. + use_power (num) current state of auto power use. Possible Values: - 0 -- no auto power use - 1 -- machine is using power at its idle power level - 2 -- machine is using power at its active power level + USE_POWER_OFF:0 -- no auto power use + USE_POWER_IDLE:1 -- machine is using power at its idle power level + USE_POWER_ACTIVE:2 -- machine is using power at its active power level active_power_usage (num) Value for the amount of power to use when in active power mode @@ -51,28 +55,18 @@ Class Procs: Destroy() 'game/machinery/machine.dm' - auto_use_power() 'game/machinery/machine.dm' - This proc determines how power mode power is deducted by the machine. - 'auto_use_power()' is called by the 'master_controller' game_controller every - tick. + get_power_usage() 'game/machinery/machinery_power.dm' + Returns the amount of power this machine uses every SSmachines cycle. + Default definition uses 'use_power', 'active_power_usage', 'idle_power_usage' - Return Value: - return:1 -- if object is powered - return:0 -- if object is not powered. - - Default definition uses 'use_power', 'power_channel', 'active_power_usage', - 'idle_power_usage', 'powered()', and 'use_power()' implement behavior. - - powered(chan = EQUIP) 'modules/power/power.dm' + powered(chan = CURRENT_CHANNEL) 'game/machinery/machinery_power.dm' Checks to see if area that contains the object has power available for power channel given in 'chan'. - use_power(amount, chan=EQUIP, autocalled) 'modules/power/power.dm' + use_power_oneoff(amount, chan=CURRENT_CHANNEL) 'game/machinery/machinery_power.dm' Deducts 'amount' from the power channel 'chan' of the area that contains the object. - If it's autocalled then everything is normal, if something else calls use_power we are going to - need to recalculate the power two ticks in a row. - power_change() 'modules/power/power.dm' + power_change() 'game/machinery/machinery_power.dm' Called by the area that contains the object when ever that area under goes a power state change (area runs out of power, or area channel is turned off). @@ -108,6 +102,7 @@ Class Procs: var/idle_power_usage = 0 var/active_power_usage = 0 var/power_channel = EQUIP //EQUIP, ENVIRON or LIGHT + var/power_init_complete = FALSE var/list/component_parts = null //list of all the parts used to build it, if made from certain kinds of frames. var/uid var/panel_open = 0 @@ -126,7 +121,7 @@ Class Procs: if(ispath(circuit)) circuit = new circuit(src) -/obj/machinery/Initialize() +/obj/machinery/Initialize(var/mapload) . = ..() global.machines += src if(ispath(circuit)) @@ -135,6 +130,8 @@ Class Procs: START_MACHINE_PROCESSING(src) else START_PROCESSING(SSfastprocess, src) + if(!mapload) + power_change() /obj/machinery/Destroy() if(!speed_process) @@ -147,7 +144,9 @@ Class Procs: if(A.loc == src) // If the components are inside the machine, delete them. qdel(A) else // Otherwise we assume they were dropped to the ground during deconstruction, and were not removed from the component_parts list by deconstruction code. - component_parts -= A + warning("[A] was still in [src]'s component_parts when it was Destroy()'d") + component_parts.Cut() + component_parts = null if(contents) // The same for contents. for(var/atom/A in contents) if(ishuman(A)) @@ -159,9 +158,8 @@ Class Procs: qdel(A) return ..() -/obj/machinery/process()//If you dont use process or power why are you here - if(!(use_power || idle_power_usage || active_power_usage)) - return PROCESS_KILL +/obj/machinery/process() // Steady power usage is handled separately. If you dont use process why are you here? + return PROCESS_KILL /obj/machinery/emp_act(severity) if(use_power && stat == 0) @@ -194,31 +192,6 @@ Class Procs: else return -//sets the use_power var and then forces an area power update -/obj/machinery/proc/update_use_power(var/new_use_power) - use_power = new_use_power - -// Sets the power_channel var -/obj/machinery/proc/update_power_channel(var/new_channel) - power_channel = new_channel - -// Sets the idle_power_usage var -/obj/machinery/proc/update_idle_power_usage(var/new_power_usage) - idle_power_usage = new_power_usage - -// Sets the active_power_usage var -/obj/machinery/proc/update_active_power_usage(var/new_power_usage) - active_power_usage = new_power_usage - -/obj/machinery/proc/auto_use_power() - if(!powered(power_channel)) - return 0 - if(use_power == USE_POWER_IDLE) - use_power(idle_power_usage, power_channel, 1) - else if(use_power >= USE_POWER_ACTIVE) - use_power(active_power_usage, power_channel, 1) - return 1 - /obj/machinery/vv_edit_var(var/var_name, var/new_value) if(var_name == NAMEOF(src, use_power)) update_use_power(new_value) @@ -304,7 +277,7 @@ Class Procs: text = "\The [src] pings." state(text, "blue") - playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + playsound(src, 'sound/machines/ping.ogg', 50, 0) /obj/machinery/proc/shock(mob/user, prb) if(inoperable()) @@ -369,7 +342,7 @@ Class Procs: return FALSE if(panel_open) return FALSE // Close panel first! - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) var/actual_time = W.toolspeed * time if(actual_time != 0) user.visible_message( \ @@ -430,12 +403,12 @@ Class Procs: if(!panel_open) return 0 user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) new/obj/item/stack/cable_coil(get_turf(src), 5) . = dismantle() /obj/machinery/proc/dismantle() - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) //TFF 3/6/19 - port Cit RP fix of infinite frames. If it doesn't have a circuit board, don't create a frame. Return a smack instead. BONK! if(!circuit) return 0 @@ -483,6 +456,7 @@ Class Procs: return 1 /datum/proc/apply_visual(mob/M) + M.sight = 0 //Just reset their mesons and stuff so they can't use them, by default. return /datum/proc/remove_visual(mob/M) diff --git a/code/game/machinery/machinery_power.dm b/code/game/machinery/machinery_power.dm new file mode 100644 index 0000000000..be648d0f80 --- /dev/null +++ b/code/game/machinery/machinery_power.dm @@ -0,0 +1,167 @@ +// +// /obj/machinery POWER USAGE CODE HERE! GO GO GADGET STATIC POWER! +// Note: You can find /obj/machinery/power power usage code in power.dm +// +// The following four machinery variables determine the "static" amount of power used every power cycle: +// - use_power, idle_power_usage, active_power_usage, power_channel +// +// Please never change any of these variables! Use the procs that update them instead! +// + +// Note that we update the area even if the area is unpowered. +#define REPORT_POWER_CONSUMPTION_CHANGE(old_power, new_power)\ + if(old_power != new_power){\ + var/area/A = get_area(src);\ + if(A) A.power_use_change(old_power, new_power, power_channel)} + +// Current power consumption right now. +#define POWER_CONSUMPTION (use_power == USE_POWER_IDLE ? idle_power_usage : (use_power >= USE_POWER_ACTIVE ? active_power_usage : 0)) + +// returns true if the area has power on given channel (or doesn't require power). +// defaults to power_channel +/obj/machinery/proc/powered(var/chan = CURRENT_CHANNEL) // defaults to power_channel + //Don't do this. It allows machines that set use_power to 0 when off (many machines) to + //be turned on again and used after a power failure because they never gain the NOPOWER flag. + //if(!use_power) + // return 1 + + var/area/A = get_area(src) // make sure it's in an area + if(!A) + return 0 // if not, then not powered + if(chan == CURRENT_CHANNEL) + chan = power_channel + return A.powered(chan) // return power status of the area + +// called whenever the power settings of the containing area change +// by default, check equipment channel & set/clear NOPOWER flag +// Returns TRUE if NOPOWER stat flag changed. +// can override if needed +/obj/machinery/proc/power_change() + var/oldstat = stat + if(powered(power_channel)) + stat &= ~NOPOWER + else + stat |= NOPOWER + return (stat != oldstat) + +// Get the amount of power this machine will consume each cycle. Override by experts only! +/obj/machinery/proc/get_power_usage() + return POWER_CONSUMPTION + +// DEPRECATED! - USE use_power_oneoff() instead! +/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel + return src.use_power_oneoff(amount, chan); + +// This will have this machine have its area eat this much power next tick, and not afterwards. Do not use for continued power draw. +// Returns actual amount drawn (In theory this could be less than the amount asked for. In pratice it won't be FOR NOW) +/obj/machinery/proc/use_power_oneoff(var/amount, var/chan = CURRENT_CHANNEL) + var/area/A = get_area(src) // make sure it's in an area + if(!A) + return + if(chan == CURRENT_CHANNEL) + chan = power_channel + return A.use_power_oneoff(amount, chan) + +// Check if we CAN use a given amount of extra power as a one off. Returns amount we could use without actually using it. +// For backwards compatibilty this returns true if the channel is powered. This is consistant with pre-static-power +// behavior of APC powerd machines, but at some point we might want to make this a bit cooler. +/obj/machinery/proc/can_use_power_oneoff(var/amount, var/chan = CURRENT_CHANNEL) + if(powered(chan)) + return amount // If channel is powered then you can do it. + return 0 + +// Do not do power stuff in New/Initialize until after ..() +/obj/machinery/Initialize() + . = ..() + var/power = POWER_CONSUMPTION + REPORT_POWER_CONSUMPTION_CHANGE(0, power) + power_init_complete = TRUE + +// Or in Destroy at all, but especially after the ..(). +/obj/machinery/Destroy() + if(ismovable(loc)) + GLOB.moved_event.unregister(loc, src, .proc/update_power_on_move) // Unregister just in case + var/power = POWER_CONSUMPTION + REPORT_POWER_CONSUMPTION_CHANGE(power, 0) + . = ..() + +// Registering moved_event observers for all machines is too expensive. Instead we do it ourselves. +// 99% of machines are always on a turf anyway, very few need recursive move handling. +/obj/machinery/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_power_on_move(src, old_loc, loc) + if(ismovable(loc)) // Register for recursive movement (if the thing we're inside moves) + GLOB.moved_event.register(loc, src, .proc/update_power_on_move) + if(ismovable(old_loc)) // Unregister recursive movement. + GLOB.moved_event.unregister(old_loc, src, .proc/update_power_on_move) + +/obj/machinery/proc/update_power_on_move(atom/movable/mover, atom/old_loc, atom/new_loc) + var/area/old_area = get_area(old_loc) + var/area/new_area = get_area(new_loc) + if(old_area != new_area) + area_changed(old_area, new_area) + +/obj/machinery/proc/area_changed(area/old_area, area/new_area) + if(old_area == new_area || !power_init_complete) + return + var/power = POWER_CONSUMPTION + if(!power) + return // This is the most likely case anyway. + + if(old_area) + old_area.power_use_change(power, 0, power_channel) // Remove our usage from old area + if(new_area) + new_area.power_use_change(0, power, power_channel) // Add our usage to new area + power_change() // Force check in case the old area was powered and the new one isn't or vice versa. + +// +// Usage Update Procs - These procs are the only allowed way to modify these four variables: +// - use_power, idle_power_usage, active_power_usage, power_channel +// + +// Sets the use_power var and then forces an area power update +/obj/machinery/proc/update_use_power(var/new_use_power) + if(use_power == new_use_power) + return + if(!power_init_complete) + use_power = new_use_power + return TRUE // We'll be retallying anyway. + var/old_power = POWER_CONSUMPTION + use_power = new_use_power + var/new_power = POWER_CONSUMPTION + REPORT_POWER_CONSUMPTION_CHANGE(old_power, new_power) + return TRUE + +// Sets the power_channel var and then forces an area power update. +/obj/machinery/proc/update_power_channel(var/new_channel) + if(power_channel == new_channel) + return + if(!power_init_complete) + power_channel = new_channel + return TRUE // We'll be retallying anyway. + var/power = POWER_CONSUMPTION + REPORT_POWER_CONSUMPTION_CHANGE(power, 0) // Subtract from old channel + power_channel = new_channel + REPORT_POWER_CONSUMPTION_CHANGE(0, power) // Add to new channel + return TRUE + +// Sets the idle_power_usage var and then forces an area power update if use_power was USE_POWER_IDLE +/obj/machinery/proc/update_idle_power_usage(var/new_power_usage) + if(idle_power_usage == new_power_usage) + return + var/old_power = idle_power_usage + idle_power_usage = new_power_usage + if(power_init_complete && use_power == USE_POWER_IDLE) // If this is the channel in use + REPORT_POWER_CONSUMPTION_CHANGE(old_power, new_power_usage) + +// Sets the active_power_usage var and then forces an area power update if use_power was USE_POWER_ACTIVE +/obj/machinery/proc/update_active_power_usage(var/new_power_usage) + if(active_power_usage == new_power_usage) + return + var/old_power = active_power_usage + active_power_usage = new_power_usage + if(power_init_complete && use_power == USE_POWER_ACTIVE) // If this is the channel in use + REPORT_POWER_CONSUMPTION_CHANGE(old_power, new_power_usage) + +#undef REPORT_POWER_CONSUMPTION_CHANGE +#undef POWER_CONSUMPTION diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 6d7b24e5cf..ff16c8d044 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -79,7 +79,7 @@ newMsg.body = msg newMsg.time_stamp = "[stationtime2text()]" newMsg.is_admin_message = adminMessage - newMsg.post_time = round_duration_in_ticks // Should be almost universally unique + newMsg.post_time = round_duration_in_ds // Should be almost universally unique if(message_type) newMsg.message_type = message_type if(photo) @@ -904,7 +904,7 @@ obj/item/weapon/newspaper/Topic(href, href_list) if(curr_page == 0) //We're at the start, get to the middle screen = 1 curr_page++ - playsound(loc, "pageturn", 50, 1) + playsound(src, "pageturn", 50, 1) else if(href_list["prev_page"]) if(curr_page == 0) @@ -916,7 +916,7 @@ obj/item/weapon/newspaper/Topic(href, href_list) if(curr_page == pages+1) //we're at the end, let's go back to the middle. screen = 1 curr_page-- - playsound(src.loc, "pageturn", 50, 1) + playsound(src, "pageturn", 50, 1) if(istype(src.loc, /mob)) attack_self(src.loc) @@ -974,9 +974,9 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) spawn(300) alert = 0 update_icon() - playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1) + playsound(src, 'sound/machines/twobeep.ogg', 75, 1) else for(var/mob/O in hearers(world.view-1, T)) O.show_message("[name] beeps, \"Attention! Wanted issue distributed!\"",2) - playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1) + playsound(src, 'sound/machines/warning-buzzer.ogg', 75, 1) return diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index b40314d2c2..37c75957be 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -41,8 +41,11 @@ return ..() /obj/machinery/oxygen_pump/MouseDrop(var/mob/living/carbon/human/target, src_location, over_location) - ..() - if(istype(target) && CanMouseDrop(target)) + var/mob/living/user = usr + if(!istype(user) || !istype(target)) + return ..() + + if(CanMouseDrop(target, user)) if(!can_apply_to_target(target, usr)) // There is no point in attempting to apply a mask if it's impossible. return usr.visible_message("\The [usr] begins placing \the [contained] onto [target].") diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index 94d46058ce..b82760ac21 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -2,7 +2,7 @@ name = "\improper PDA multicaster" desc = "This machine mirrors messages sent to it to specific departments." icon = 'icons/obj/stationobjs.dmi' - icon_state = "controller" + icon_state = "pdamulti" density = 1 anchored = 1 circuit = /obj/item/weapon/circuitboard/telecomms/pda_multicaster @@ -35,7 +35,7 @@ if(on) icon_state = initial(icon_state) else - icon_state = "[initial(icon_state)]-p" + icon_state = "[initial(icon_state)]_off" /obj/machinery/pda_multicaster/attackby(obj/item/I, mob/user) if(I.is_screwdriver()) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 13b1dc1bb7..f5f2532080 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -132,12 +132,6 @@ Buildable meters src.set_dir(turn(src.dir, 270)) fixdir() -// If you want to disable pipe dir changing when pulled, uncomment this -// /obj/item/pipe/Move() -// var/old_dir = dir -// . = ..() -// set_dir(old_dir) //pipes changing direction when moved is just annoying and buggy - // Don't let pulling a pipe straighten it out. /obj/item/pipe/binary/bendable/Move() var/old_bent = !IS_CARDINAL(dir) diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index f0219a8a2c..8b49989e61 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -42,15 +42,15 @@ ..() // Whenever we move, if enabled try and lay pipe -/obj/machinery/pipelayer/Move(new_turf,M_Dir) - ..() +/obj/machinery/pipelayer/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() if(on && a_dis) dismantleFloor(old_turf) - layPipe(old_turf, M_Dir, old_dir) + layPipe(old_turf, direction, old_dir) - old_turf = new_turf - old_dir = turn(M_Dir, 180) + old_turf = loc + old_dir = turn(direction, 180) /obj/machinery/pipelayer/attack_hand(mob/user as mob) if(..()) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index b67f3738bd..436f738efc 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -549,12 +549,12 @@ if(do_after(user, 50 * I.toolspeed)) //This code handles moving the turret around. After all, it's a portable turret! if(!anchored) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) anchored = TRUE update_icon() to_chat(user, "You secure the exterior bolts on the turret.") else if(anchored) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) anchored = FALSE to_chat(user, "You unsecure the exterior bolts on the turret.") update_icon() @@ -890,10 +890,10 @@ var/obj/item/projectile/A if(emagged || lethal) A = new lethal_projectile(loc) - playsound(loc, lethal_shot_sound, 75, 1) + playsound(src, lethal_shot_sound, 75, 1) else A = new projectile(loc) - playsound(loc, shot_sound, 75, 1) + playsound(src, shot_sound, 75, 1) // Lethal/emagged turrets use twice the power due to higher energy beams // Emagged turrets again use twice as much power due to higher firing rates @@ -966,14 +966,14 @@ switch(build_step) if(0) //first step if(I.is_wrench() && !anchored) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) to_chat(user, "You secure the external bolts.") anchored = TRUE build_step = 1 return else if(I.is_crowbar() && !anchored) - playsound(loc, I.usesound, 75, 1) + playsound(src, I.usesound, 75, 1) to_chat(user, "You dismantle the turret construction.") new /obj/item/stack/material/steel(loc, 5) qdel(src) @@ -991,7 +991,7 @@ return else if(I.is_wrench()) - playsound(loc, I.usesound, 75, 1) + playsound(src, I.usesound, 75, 1) to_chat(user, "You unfasten the external bolts.") anchored = FALSE build_step = 0 @@ -999,7 +999,7 @@ if(2) if(I.is_wrench()) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) to_chat(user, "You bolt the metal armor into place.") build_step = 3 return @@ -1012,7 +1012,7 @@ to_chat(user, "You need more fuel to complete this task.") return - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) if(do_after(user, 20 * I.toolspeed)) if(!src || !WT.remove_fuel(5, user)) return build_step = 1 @@ -1039,7 +1039,7 @@ return else if(I.is_wrench()) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) to_chat(user, "You remove the turret's metal armor bolts.") build_step = 2 return @@ -1058,7 +1058,7 @@ if(5) if(I.is_screwdriver()) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) build_step = 6 to_chat(user, "You close the internal access hatch.") return @@ -1076,7 +1076,7 @@ return else if(I.is_screwdriver()) - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) build_step = 5 to_chat(user, "You open the internal access hatch.") return @@ -1088,7 +1088,7 @@ if(WT.get_fuel() < 5) to_chat(user, "You need more fuel to complete this task.") - playsound(loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) if(do_after(user, 30 * WT.toolspeed)) if(!src || !WT.remove_fuel(5, user)) return @@ -1106,7 +1106,7 @@ qdel(src) // qdel else if(I.is_crowbar()) - playsound(loc, I.usesound, 75, 1) + playsound(src, I.usesound, 75, 1) to_chat(user, "You pry off the turret's exterior armor.") new /obj/item/stack/material/steel(loc, 2) build_step = 6 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 9a50c34aad..ab78094832 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -84,7 +84,7 @@ return anchored = !anchored to_chat(user, "You [anchored ? "attached" : "detached"] [src].") - playsound(loc, G.usesound, 75, 1) + playsound(src, G.usesound, 75, 1) else if(default_deconstruction_screwdriver(user, G)) return else if(default_deconstruction_crowbar(user, G)) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 7f659920d3..cdc3d4621a 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -54,6 +54,9 @@ recharge_amount = cell.give(recharge_amount) use_power(recharge_amount / CELLRATE) + else + // Since external power is offline, draw operating current from the internal cell + cell.use(get_power_usage() * CELLRATE) if(icon_update_tick >= 10) icon_update_tick = 0 @@ -63,19 +66,6 @@ if(occupant || recharge_amount) update_icon() -//since the recharge station can still be on even with NOPOWER. Instead it draws from the internal cell. -/obj/machinery/recharge_station/auto_use_power() - if(!(stat & NOPOWER)) - return ..() - - if(!has_cell_power()) - return 0 - if(use_power == USE_POWER_IDLE) - cell.use(idle_power_usage * CELLRATE) - else if(use_power >= USE_POWER_ACTIVE) - cell.use(active_power_usage * CELLRATE) - return 1 - //Processes the occupant, drawing from the internal power cell if needed. /obj/machinery/recharge_station/proc/process_occupant() if(isrobot(occupant)) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index ec3ab2f692..664d1c686f 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -206,7 +206,7 @@ protected = 1 if(!protected) - playsound(src.loc, "sparks", 75, 1, -1) + playsound(src, "sparks", 75, 1, -1) to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") return*/ else //welp, the guy is protected, we can continue @@ -232,7 +232,7 @@ protected = 1 if(!protected) - playsound(src.loc, "sparks", 75, 1, -1) + playsound(src, "sparks", 75, 1, -1) to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") return*/ else @@ -657,6 +657,15 @@ model_text = "Pilot" departments = list("Pilot Blue","Pilot") +/obj/machinery/suit_cycler/vintage + name = "Vintage suit cycler" + model_text = "Vintage" + departments = list("Vintage Crew","Vintage Engineering","Vintage Marine","Vintage Medical","Vintage Officer") + +/obj/machinery/suit_cycler/vintage/Initialize() + species -= SPECIES_TESHARI + return ..() + /obj/machinery/suit_cycler/attack_ai(mob/user as mob) return attack_hand(user) @@ -766,7 +775,7 @@ //Clear the access reqs, disable the safeties, and open up all paintjobs. to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.") - departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Crowd Control","Security EVA","Emergency Medical Response","^%###^%$", "Charring") + departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Crowd Control","Security EVA","Emergency Medical Response","^%###^%$", "Charring","Vintage Crew","Vintage Engineering","Vintage Marine","Vintage Medical","Vintage Officer") species = list(SPECIES_HUMAN,SPECIES_TAJ,SPECIES_SKRELL,SPECIES_UNATHI, SPECIES_TESHARI) emagged = 1 @@ -1068,6 +1077,22 @@ if("Gem-Encrusted" || "Wizard") parent_helmet = /obj/item/clothing/head/helmet/space/void/wizard parent_suit = /obj/item/clothing/suit/space/void/wizard + //Special or Event suits + if("Vintage Crew") + parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb + parent_suit = /obj/item/clothing/suit/space/void/refurb + if("Vintage Engineering") + parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/engineering + parent_suit = /obj/item/clothing/suit/space/void/refurb/engineering + if("Vintage Medical") + parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/medical + parent_suit = /obj/item/clothing/suit/space/void/refurb/medical + if("Vintage Marine") + parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/marine + parent_suit = /obj/item/clothing/suit/space/void/refurb/marine + if("Vintage Officer") + parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/officer + parent_suit = /obj/item/clothing/suit/space/void/refurb/officer //BEGIN: Space for additional downstream variants //END: downstream variant space diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index a5e7a40f8e..3a6f4e589b 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -133,7 +133,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /obj/machinery/telecomms/allinone name = "Telecommunications Mainframe" icon = 'icons/obj/stationobjs.dmi' - icon_state = "comm_server" + icon_state = "allinone" desc = "A compact machine used for portable subspace telecommuniations processing." density = 1 use_power = USE_POWER_IDLE diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index f04cf7076a..8cd1d8811e 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -192,7 +192,7 @@ /obj/machinery/computer/telecomms/server/emag_act(var/remaining_charges, var/mob/user) if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "You you disable the security protocols") src.updateUsrDialog() diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 819108b2ce..51a6ebf991 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -127,7 +127,7 @@ /obj/machinery/computer/telecomms/monitor/emag_act(var/remaining_charges, var/mob/user) if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "You you disable the security protocols") src.updateUsrDialog() diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 686a764ada..51c09d95e3 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -210,7 +210,7 @@ /obj/machinery/computer/telecomms/traffic/emag_act(var/remaining_charges, var/mob/user) if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "You you disable the security protocols") src.updateUsrDialog() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index c792639f1b..7b95e738d4 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -1,3 +1,6 @@ +////// +////// Teleporter computer +////// /obj/machinery/computer/teleporter name = "teleporter control console" desc = "Used to control a linked teleportation Hub and Station." @@ -5,23 +8,23 @@ icon_screen = "teleport" circuit = /obj/item/weapon/circuitboard/teleporter dir = 4 - var/obj/item/locked = null var/id = null var/one_time_use = 0 //Used for one-time-use teleport cards (such as clown planet coordinates.) //Setting this to 1 will set locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. + var/datum/nano_module/program/teleport_control/teleport_control /obj/machinery/computer/teleporter/New() id = "[rand(1000, 9999)]" ..() underlays.Cut() underlays += image('icons/obj/stationobjs.dmi', icon_state = "telecomp-wires") - return + teleport_control = new(src) /obj/machinery/computer/teleporter/Initialize() . = ..() - var/obj/machinery/teleport/station/station - var/obj/machinery/teleport/hub/hub - + var/obj/machinery/teleport/station/station = null + var/obj/machinery/teleport/hub/hub = null + // Search surrounding turfs for the station, and then search the station's surrounding turfs for the hub. for(var/direction in cardinal) station = locate(/obj/machinery/teleport/station, get_step(src, direction)) @@ -34,9 +37,15 @@ if(istype(station)) station.com = hub + teleport_control.hub = hub if(istype(hub)) hub.com = src + teleport_control.station = station + +/obj/machinery/computer/teleporter/Destroy() + qdel_null(teleport_control) + return ..() /obj/machinery/computer/teleporter/attackby(I as obj, mob/living/user as mob) if(istype(I, /obj/item/weapon/card/data/)) @@ -74,7 +83,7 @@ else for(var/mob/O in hearers(src, null)) O.show_message("Locked In", 2) - locked = L + teleport_control.locked = L one_time_use = 1 add_fingerprint(usr) @@ -86,57 +95,109 @@ /obj/machinery/teleport/station/attack_ai() attack_hand() -/obj/machinery/computer/teleporter/attack_hand(user as mob) - if(..()) return +/obj/machinery/computer/teleporter/attack_ai(mob/user) + ui_interact(user) - /* Ghosts can't use this one because it's a direct selection */ - if(istype(user, /mob/observer/dead)) return +/obj/machinery/computer/teleporter/attack_hand(mob/user) + add_fingerprint(user) + if(stat & (BROKEN|NOPOWER)) + return + ui_interact(user) - var/list/L = list() - var/list/areaindex = list() +/obj/machinery/computer/teleporter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + teleport_control.ui_interact(user, ui_key, ui, force_open) - for(var/obj/item/device/radio/beacon/R in all_beacons) - var/turf/T = get_turf(R) - if(!T) - continue - if(!(T.z in using_map.player_levels)) - continue - var/tmpname = T.loc.name - if(areaindex[tmpname]) - tmpname = "[tmpname] ([++areaindex[tmpname]])" - else - areaindex[tmpname] = 1 - L[tmpname] = R +/obj/machinery/computer/teleporter/interact(mob/user) + teleport_control.ui_interact(user) - for (var/obj/item/weapon/implant/tracking/I in all_tracking_implants) - if(!I.implanted || !ismob(I.loc)) - continue - else - var/mob/M = I.loc - if(M.stat == 2) - if(M.timeofdeath + 6000 < world.time) - continue - var/turf/T = get_turf(M) - if(T) continue - if(T.z == 2) continue - var/tmpname = M.real_name +////// +////// Nano-module for teleporter +////// +/datum/nano_module/program/teleport_control + name = "Teleporter Control" + var/locked_name = "Not Locked" + var/obj/item/locked = null + var/obj/machinery/teleport/station/station = null + var/obj/machinery/teleport/hub/hub = null + +/datum/nano_module/program/teleport_control/Topic(href, href_list) + if(..()) return 1 + + if(href_list["select_target"]) + var/list/L = list() + var/list/areaindex = list() + + for(var/obj/item/device/radio/beacon/R in all_beacons) + var/turf/T = get_turf(R) + if(!T) + continue + if(!(T.z in using_map.player_levels)) + continue + var/tmpname = T.loc.name if(areaindex[tmpname]) tmpname = "[tmpname] ([++areaindex[tmpname]])" else areaindex[tmpname] = 1 - L[tmpname] = I + L[tmpname] = R - var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null - if(!desc) - return - if(get_dist(src, usr) > 1 && !issilicon(usr)) - return + for (var/obj/item/weapon/implant/tracking/I in all_tracking_implants) + if(!I.implanted || !ismob(I.loc)) + continue + else + var/mob/M = I.loc + if(M.stat == 2) + if(M.timeofdeath + 6000 < world.time) + continue + var/turf/T = get_turf(M) + if(T) continue + if(T.z == 2) continue + var/tmpname = M.real_name + if(areaindex[tmpname]) + tmpname = "[tmpname] ([++areaindex[tmpname]])" + else + areaindex[tmpname] = 1 + L[tmpname] = I - locked = L[desc] - for(var/mob/O in hearers(src, null)) - O.show_message("Locked In", 2) - add_fingerprint(usr) - return + var/desc = input("Please select a location to lock in.", "Locking Menu") in L|null + if(!desc) + return 0 + if(get_dist(host, usr) > 1 && !issilicon(usr)) + return 0 + + locked = L[desc] + locked_name = desc + return 1 + + if(href_list["test_fire"]) + station?.testfire() + return 1 + + if(href_list["toggle_on"]) + if(!station) + return 0 + + if(station.engaged) + station.disengage() + else + station.engage() + + return 1 + +/datum/nano_module/program/teleport_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = host.initial_data() + + data["locked_name"] = locked_name ? locked_name : "No Target" + data["station_connected"] = station ? 1 : 0 + data["hub_connected"] = hub ? 1 : 0 + data["calibrated"] = hub ? hub.accurate : 0 + data["teleporter_on"] = station ? station.engaged : 0 + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "teleport_control.tmpl", "Teleport Control Console", 400, 500, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /obj/machinery/computer/teleporter/verb/set_id(t as text) set category = "Object" @@ -158,6 +219,9 @@ if(!T || istype(T, /area)) return null return T +////// +////// Root of all the machinery +////// /obj/machinery/teleport name = "teleport" icon = 'icons/obj/stationobjs.dmi' @@ -165,6 +229,9 @@ anchored = 1.0 var/lockeddown = 0 +////// +////// The part you step into +////// /obj/machinery/teleport/hub name = "teleporter hub" desc = "It's the hub of a teleporting machine." @@ -182,6 +249,11 @@ underlays += image('icons/obj/stationobjs.dmi', icon_state = "tele-wires") default_apply_parts() +/obj/machinery/teleport/hub/Destroy() + com?.teleport_control.hub = null + com = null + return ..() + /obj/machinery/teleport/hub/Bumped(M as mob|obj) spawn() if(icon_state == "tele1") @@ -192,7 +264,7 @@ /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj) if(!com) return - if(!com.locked) + if(!com.teleport_control.locked) for(var/mob/O in hearers(src, null)) O.show_message("Failure: Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return @@ -200,11 +272,11 @@ if(prob(5) && !accurate) //oh dear a problem, put em in deep space do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2) else - do_teleport(M, com.locked) //dead-on precision + do_teleport(M, com.teleport_control.locked) //dead-on precision if(com.one_time_use) //Make one-time-use cards only usable one time! com.one_time_use = 0 - com.locked = null + com.teleport_control.locked = null else var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) @@ -214,92 +286,10 @@ for(var/mob/B in hearers(src, null)) B.show_message("Test fire completed.") return -/* -/proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision) - if(istype(M, /obj/effect)) - qdel(M) - return - if(istype(M, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite - for(var/mob/O in viewers(M, null)) - O.show_message(text("The [] bounces off of the portal!", M.name), 1) - return - if(istype(M, /mob/living)) - var/mob/living/MM = M - if(MM.check_contents_for(/obj/item/weapon/disk/nuclear)) - to_chat(MM, "Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.") - return - var/disky = 0 - for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite - if(istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift)) - for (var/obj/OO in O.contents) - if(istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift)) - for (var/obj/OOO in OO.contents) - if(istype(OOO, /obj/item/weapon/disk/nuclear)) - disky = 1 - if(istype(OO, /obj/item/weapon/disk/nuclear)) - disky = 1 - if(istype(O, /obj/item/weapon/disk/nuclear)) - disky = 1 - if(istype(O, /mob/living)) - var/mob/living/MM = O - if(MM.check_contents_for(/obj/item/weapon/disk/nuclear)) - disky = 1 - if(disky) - for(var/mob/P in viewers(M, null)) - P.show_message(text("The [] bounces off of the portal!", M.name), 1) - return - -//Bags of Holding cause bluespace teleportation to go funky. --NeoFite - if(istype(M, /mob/living)) - var/mob/living/MM = M - if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding)) - to_chat(MM, "The Bluespace interface on your Bag of Holding interferes with the teleport!") - precision = rand(1,100) - if(istype(M, /obj/item/weapon/storage/backpack/holding)) - precision = rand(1,100) - for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite - if(istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift)) - for (var/obj/OO in O.contents) - if(istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift)) - for (var/obj/OOO in OO.contents) - if(istype(OOO, /obj/item/weapon/storage/backpack/holding)) - precision = rand(1,100) - if(istype(OO, /obj/item/weapon/storage/backpack/holding)) - precision = rand(1,100) - if(istype(O, /obj/item/weapon/storage/backpack/holding)) - precision = rand(1,100) - if(istype(O, /mob/living)) - var/mob/living/MM = O - if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding)) - precision = rand(1,100) - - var/turf/destturf = get_turf(destination) - - var/tx = destturf.x + rand(precision * -1, precision) - var/ty = destturf.y + rand(precision * -1, precision) - - var/tmploc - - if(ismob(destination.loc)) //If this is an implant. - tmploc = locate(tx, ty, destturf.z) - else - tmploc = locate(tx, ty, destination.z) - - if(tx == destturf.x && ty == destturf.y && (istype(destination.loc, /obj/structure/closet) || istype(destination.loc, /obj/structure/closet/secure_closet))) - tmploc = destination.loc - - if(tmploc==null) - return - - M.loc = tmploc - sleep(2) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, M) - s.start() - return -*/ +////// +////// The middle part +////// /obj/machinery/teleport/station name = "station" desc = "It's the station thingy of a teleport thingy." //seriously, wtf. @@ -317,18 +307,11 @@ . = ..() add_overlay("controller-wires") default_apply_parts() - -/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W) - attack_hand() -/obj/machinery/teleport/station/attack_ai() - attack_hand() - -/obj/machinery/teleport/station/attack_hand() - if(engaged) - disengage() - else - engage() +/obj/machinery/teleport/station/Destroy() + com?.com?.teleport_control.station = null + com = null + return ..() /obj/machinery/teleport/station/proc/engage() if(stat & (BROKEN|NOPOWER)) @@ -360,26 +343,16 @@ engaged = 0 return -/obj/machinery/teleport/station/verb/testfire() - set name = "Test Fire Teleporter" - set category = "Object" - set src in oview(1) - - if(stat & (BROKEN|NOPOWER) || !istype(usr,/mob/living)) +/obj/machinery/teleport/station/proc/testfire() + if(!com || active) return - if(com && !active) - active = 1 - for(var/mob/O in hearers(src, null)) - O.show_message("Test firing!", 2) - com.teleport() - use_power(5000) + active = TRUE + visible_message("Test firing!") + com.teleport() + use_power(5000) - spawn(30) - active=0 - - add_fingerprint(usr) - return + VARSET_IN(src, active, FALSE, 3 SECONDS) /obj/machinery/teleport/station/power_change() ..() diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index c9c8ba20ae..621feae713 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -28,14 +28,14 @@ if(stat & (BROKEN|NOPOWER)) return if(!transform_dead && H.stat == DEAD) - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + playsound(src, 'sound/items/Welder.ogg', 50, 1) use_power(5000) // Use a lot of power. var/mob/living/silicon/robot = H.Robotize() robot.SetLockDown() spawn(50) // So he can't jump out the gate right away. - playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + playsound(src, 'sound/machines/ping.ogg', 50, 0) if(robot) robot.SetLockDown(0) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 2730c2dd86..868313258b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -65,6 +65,7 @@ var/list/log = list() var/req_log_access = access_cargo //default access for checking logs is cargo var/has_logs = 0 //defaults to 0, set to anything else for vendor to have logs + var/can_rotate = 1 //Defaults to yes, can be set to 0 for vendors without or with unwanted directionals. /obj/machinery/vending/Initialize() @@ -252,7 +253,7 @@ */ /obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet) visible_message("\The [usr] swipes \the [wallet] through \the [src].") - playsound(src.loc, 'sound/machines/id_swipe.ogg', 50, 1) + playsound(src, 'sound/machines/id_swipe.ogg', 50, 1) if(currently_vending.price > wallet.worth) status_message = "Insufficient funds on chargecard." status_error = 1 @@ -273,7 +274,7 @@ visible_message("\The [usr] swipes \the [I] through \the [src].") else visible_message("\The [usr] swipes \the [ID_container] through \the [src].") - playsound(src.loc, 'sound/machines/id_swipe.ogg', 50, 1) + playsound(src, 'sound/machines/id_swipe.ogg', 50, 1) var/datum/money_account/customer_account = get_account(I.associated_account_number) if(!customer_account) status_message = "Error: Unable to access account. Please contact technical support if problem persists." @@ -429,7 +430,7 @@ if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.") //Unless emagged of course flick("[icon_state]-deny",src) - playsound(src.loc, 'sound/machines/deniedbeep.ogg', 50, 0) + playsound(src, 'sound/machines/deniedbeep.ogg', 50, 0) return var/key = text2num(href_list["vend"]) @@ -466,7 +467,7 @@ if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.") //Unless emagged of course flick("[icon_state]-deny",src) - playsound(src.loc, 'sound/machines/deniedbeep.ogg', 50, 0) + playsound(src, 'sound/machines/deniedbeep.ogg', 50, 0) return vend_ready = 0 //One thing at a time!! status_message = "Vending..." @@ -505,7 +506,7 @@ sleep(3) if(R.get_product(get_turf(src))) visible_message("\The [src] clunks as it vends an additional item.") - playsound(src.loc, "sound/[vending_sound]", 100, 1, 1) + playsound(src, "sound/[vending_sound]", 100, 1, 1) status_message = "" status_error = 0 @@ -545,6 +546,22 @@ else to_chat(user,"You do not have the required access to view the vending logs for this machine.") + +/obj/machinery/vending/verb/rotate_clockwise() + set name = "Rotate Vending Machine Clockwise" + set category = "Object" + set src in oview(1) + + if (src.can_rotate == 0) + to_chat(usr, "\The [src] cannot be rotated.") + return 0 + + if (src.anchored || usr:stat) + to_chat(usr, "It is bolted down!") + return 0 + src.set_dir(turn(src.dir, 270)) + return 1 + /obj/machinery/vending/verb/check_logs() set name = "Check Vending Logs" set category = "Object" @@ -761,10 +778,10 @@ product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" icon_state = "snack" - products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6, - /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6, - /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 6, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 3) - contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6,/obj/item/weapon/reagent_containers/food/snacks/unajerky = 6,) + products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 12,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 12,/obj/item/weapon/reagent_containers/food/snacks/chips =12, + /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 12,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 12,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 12, + /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 12, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 12, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 6) + contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6,/obj/item/weapon/reagent_containers/food/snacks/unajerky = 12,) prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 1,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 5,/obj/item/weapon/reagent_containers/food/snacks/chips = 1, /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 2,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 1, /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 1, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 2, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 4) @@ -793,11 +810,11 @@ name = "SweatMAX" desc = "Fueled by your inner inadequacy!" icon_state = "fitness" - products = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 8, - /obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 8, + products = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 16, + /obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 16, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 8, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 8, - /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 8, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 16, /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 8, /obj/item/weapon/reagent_containers/pill/diet = 8, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5, @@ -834,13 +851,13 @@ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs.;Feeling temperamental? Try a Temperamento!;Carcinoma Angels - go fuck yerself!;Don't be so hard on yourself, kid. Smoke a Lucky Star!" vend_delay = 34 icon_state = "cigs" - products = list(/obj/item/weapon/storage/fancy/cigarettes = 5, - /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 5, - /obj/item/weapon/storage/fancy/cigarettes/killthroat = 5, - /obj/item/weapon/storage/fancy/cigarettes/luckystars = 5, - /obj/item/weapon/storage/fancy/cigarettes/jerichos = 5, - /obj/item/weapon/storage/fancy/cigarettes/menthols = 5, - /obj/item/weapon/storage/rollingpapers = 5, + products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 10, + /obj/item/weapon/storage/fancy/cigarettes/killthroat = 10, + /obj/item/weapon/storage/fancy/cigarettes/luckystars = 10, + /obj/item/weapon/storage/fancy/cigarettes/jerichos = 10, + /obj/item/weapon/storage/fancy/cigarettes/menthols = 10, + /obj/item/weapon/storage/rollingpapers = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/random = 4, /obj/item/clothing/mask/smokable/ecig/util = 2, @@ -918,6 +935,7 @@ contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1) req_log_access = access_cmo has_logs = 1 + can_rotate = 0 /obj/machinery/vending/wallmed2 name = "NanoMed" @@ -929,6 +947,7 @@ contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3) req_log_access = access_cmo has_logs = 1 + can_rotate = 0 /obj/machinery/vending/security name = "SecTech" @@ -953,6 +972,7 @@ premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. + /obj/machinery/vending/hydroseeds name = "MegaSeed Servitor" desc = "When you need seeds fast!" @@ -1174,6 +1194,7 @@ /obj/item/toy/plushie/tabby_cat = 50, /obj/item/device/threadneedle = 2) + /obj/machinery/vending/fishing name = "Loot Trawler" desc = "A special vendor for fishing equipment." diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 2026c1dc2b..b975d00d8b 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -59,8 +59,8 @@ I.decontaminate() //Tanning! - for(var/obj/item/stack/material/hairlesshide/HH in washing) - var/obj/item/stack/material/wetleather/WL = new(src) + for(var/obj/item/stack/hairlesshide/HH in washing) + var/obj/item/stack/wetleather/WL = new(src) WL.amount = HH.amount qdel(HH) diff --git a/code/game/mecha/combat/fighter.dm b/code/game/mecha/combat/fighter.dm index 171c96395e..c87af14617 100644 --- a/code/game/mecha/combat/fighter.dm +++ b/code/game/mecha/combat/fighter.dm @@ -164,7 +164,7 @@ else if(moved && gravity && !ground_capable) occupant_message("Collision alert! Vehicle not rated for use in gravity!") take_damage(NOGRAV_FIGHTER_DAMAGE, "brute") - playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) + playsound(src, 'sound/effects/grillehit.ogg', 50, 1) /obj/mecha/combat/fighter/handle_equipment_movement() . = ..() diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index e413fc892a..2f75de4a15 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -179,7 +179,7 @@ src.occupant_message("Zoom mode [zoom?"en":"dis"]abled.") if(zoom) src.occupant.set_viewsize(12) - playsound(src.occupant, 'sound/mecha/imag_enh.ogg',50) + playsound(src, 'sound/mecha/imag_enh.ogg',50) else src.occupant.set_viewsize() // Reset to default return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 30ea5ea738..87a107f2c0 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -28,7 +28,7 @@ sleep(equip_cooldown) set_ready_state(1) if(ready_sound) //Kind of like the kinetic accelerator. - playsound(loc, ready_sound, 50, 1, -1) + playsound(src, ready_sound, 50, 1, -1) if(target && chassis) return 1 return 0 diff --git a/code/game/mecha/equipment/tools/clamp.dm b/code/game/mecha/equipment/tools/clamp.dm index a587d89568..6091764c2b 100644 --- a/code/game/mecha/equipment/tools/clamp.dm +++ b/code/game/mecha/equipment/tools/clamp.dm @@ -33,7 +33,7 @@ if(FD.blocked) FD.visible_message("\The [chassis] begins prying on \the [FD]!") if(do_after(chassis.occupant,10 SECONDS,FD)) - playsound(FD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(FD, 'sound/machines/airlock_creaking.ogg', 100, 1) FD.blocked = 0 FD.update_icon() FD.open(1) @@ -41,7 +41,7 @@ else if(FD.density) FD.visible_message("\The [chassis] begins forcing \the [FD] open!") if(do_after(chassis.occupant, 5 SECONDS,FD)) - playsound(FD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(FD, 'sound/machines/airlock_creaking.ogg', 100, 1) FD.visible_message("\The [chassis] forces \the [FD] open!") FD.open(1) else @@ -57,7 +57,7 @@ if(do_after(chassis.occupant, 15 SECONDS,AD) && chassis.Adjacent(AD)) AD.welded = FALSE AD.update_icon() - playsound(AD.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + playsound(AD, 'sound/machines/airlock_creaking.ogg', 100, 1) AD.visible_message("\The [chassis] tears \the [AD] open!") if(!AD.welded) if(density) @@ -100,15 +100,15 @@ M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() occupant_message("You squeeze [target] with [src.name]. Something cracks.") - playsound(src.loc, "fracture", 5, 1, -2) //CRACK + playsound(src, "fracture", 5, 1, -2) //CRACK chassis.visible_message("[chassis] squeezes [target].") else if(chassis.occupant.a_intent == I_DISARM && enable_special) - playsound(src.loc, 'sound/mecha/hydraulic.ogg', 10, 1, -2) + playsound(src, 'sound/mecha/hydraulic.ogg', 10, 1, -2) M.take_overall_damage(dam_force/2) M.adjustOxyLoss(round(dam_force/3)) M.updatehealth() occupant_message("You slam [target] with [src.name]. Something cracks.") - playsound(src.loc, "fracture", 3, 1, -2) //CRACK 2 + playsound(src, "fracture", 3, 1, -2) //CRACK 2 chassis.visible_message("[chassis] slams [target].") M.throw_at(get_step(M,get_dir(src, M)), 14, 1.5, chassis) else diff --git a/code/game/mecha/equipment/tools/cloak.dm b/code/game/mecha/equipment/tools/cloak.dm index 6f6ddd1c8f..e78a4f7395 100644 --- a/code/game/mecha/equipment/tools/cloak.dm +++ b/code/game/mecha/equipment/tools/cloak.dm @@ -46,7 +46,7 @@ log_message("Activated.") cloak_iterator.start() set_ready_state(0) - playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 100, 1) + playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) /obj/item/mecha_parts/mecha_equipment/cloak/proc/stop_cloak() if(chassis) @@ -54,7 +54,7 @@ log_message("Deactivated.") cloak_iterator.stop() set_ready_state(1) - playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 100, 1) + playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) // These things are so silly /datum/global_iterator/mecha_cloak/process(var/obj/item/mecha_parts/mecha_equipment/cloak/cloak) diff --git a/code/game/mecha/equipment/tools/energy_relay.dm b/code/game/mecha/equipment/tools/energy_relay.dm index d6917a0de1..0e02f927e4 100644 --- a/code/game/mecha/equipment/tools/energy_relay.dm +++ b/code/game/mecha/equipment/tools/energy_relay.dm @@ -111,5 +111,5 @@ if(pow_chan) var/delta = min(12, ER.chassis.cell.maxcharge-cur_charge) ER.chassis.give_power(delta) - A.use_power(delta*ER.coeff, pow_chan) + A.use_power_oneoff(delta*ER.coeff, pow_chan) return \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/extinguisher.dm b/code/game/mecha/equipment/tools/extinguisher.dm index d383573017..5bb6cd147c 100644 --- a/code/game/mecha/equipment/tools/extinguisher.dm +++ b/code/game/mecha/equipment/tools/extinguisher.dm @@ -25,14 +25,14 @@ var/obj/o = target var/amount = o.reagents.trans_to_obj(src, 200) occupant_message("[amount] units transferred into internal tank.") - playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) + playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) return if (src.reagents.total_volume < 1) occupant_message("\The [src] is empty.") return - playsound(chassis, 'sound/effects/extinguish.ogg', 75, 1, -3) + playsound(src, 'sound/effects/extinguish.ogg', 75, 1, -3) var/direction = get_dir(chassis,target) diff --git a/code/game/mecha/equipment/tools/syringe_gun.dm b/code/game/mecha/equipment/tools/syringe_gun.dm index 36763c7f12..95c87b6253 100644 --- a/code/game/mecha/equipment/tools/syringe_gun.dm +++ b/code/game/mecha/equipment/tools/syringe_gun.dm @@ -67,7 +67,7 @@ syringes -= S S.icon = 'icons/obj/chemical.dmi' S.icon_state = "syringeproj" - playsound(chassis, 'sound/items/syringeproj.ogg', 50, 1) + playsound(src, 'sound/items/syringeproj.ogg', 50, 1) log_message("Launched [S] from [src], targeting [target].") spawn(-1) src = null //if src is deleted, still process the syringe diff --git a/code/game/mecha/equipment/weapons/honk.dm b/code/game/mecha/equipment/weapons/honk.dm index 921111a6cd..427d53295c 100644 --- a/code/game/mecha/equipment/weapons/honk.dm +++ b/code/game/mecha/equipment/weapons/honk.dm @@ -16,7 +16,7 @@ if(!equip_ready) return 0 - playsound(chassis, 'sound/effects/bang.ogg', 30, 1, 30) + playsound(src, 'sound/effects/bang.ogg', 30, 1, 30) chassis.occupant_message("You emit a high-pitched noise from the mech.") for(var/mob/living/carbon/M in ohearers(6, chassis)) if(istype(M, /mob/living/carbon/human)) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 5d01416785..355ce629ac 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -36,7 +36,7 @@ aimloc = locate(targloc.x+GaussRandRound(deviation,1),targloc.y+GaussRandRound(deviation,1),targloc.z) if(!aimloc || aimloc == curloc || (locs && aimloc in locs)) break - playsound(chassis, fire_sound, fire_volume, 1) + playsound(src, fire_sound, fire_volume, 1) projectiles-- var/turf/projectile_turf if(chassis.locs && chassis.locs.len) // Multi tile. diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index 17c715e9a4..1615be1ff4 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -1,6 +1,6 @@ /obj/machinery/pros_fabricator icon = 'icons/obj/robotics.dmi' - icon_state = "fab-idle" + icon_state = "prosfab" name = "Prosthetics Fabricator" desc = "A machine used for construction of prosthetics." density = 1 @@ -32,7 +32,7 @@ /obj/machinery/pros_fabricator/Initialize() . = ..() default_apply_parts() - + files = new /datum/research(src) //Setup the research data holder. /obj/machinery/pros_fabricator/Initialize() @@ -54,12 +54,14 @@ /obj/machinery/pros_fabricator/update_icon() overlays.Cut() + icon_state = initial(icon_state) + if(panel_open) - icon_state = "fab-o" - else - icon_state = "fab-idle" + overlays.Add(image(icon, "[icon_state]_panel")) + if(stat & NOPOWER) + return if(busy) - overlays += "fab-active" + icon_state = "[icon_state]_work" /obj/machinery/pros_fabricator/dismantle() for(var/f in materials) @@ -198,9 +200,7 @@ if(materials[S.material.name] + amnt <= res_max_amount) if(S && S.get_amount() >= 1) var/count = 0 - overlays += "fab-load-metal" - spawn(10) - overlays -= "fab-load-metal" + flick("[initial(icon_state)]_loading", src) while(materials[S.material.name] + amnt <= res_max_amount && S.get_amount() >= 1) materials[S.material.name] += amnt S.use(1) @@ -273,6 +273,7 @@ materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) if(D.build_path) var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src) // Sometimes returns a mob. Beware! + flick("[initial(icon_state)]_finish", src) visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.") if(mat_efficiency != 1) if(istype(new_item, /obj/) && new_item.matter && new_item.matter.len > 0) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index bcf9459be2..4aa82bad7a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -95,9 +95,9 @@ var/list/cargo = list() var/cargo_capacity = 3 - var/static/image/radial_image_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject"), - var/static/image/radial_image_airtoggle = image(icon= 'icons/mob/radial.dmi', icon_state = "radial_airtank"), - var/static/image/radial_image_lighttoggle = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_light"), + var/static/image/radial_image_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject") + var/static/image/radial_image_airtoggle = image(icon= 'icons/mob/radial.dmi', icon_state = "radial_airtank") + var/static/image/radial_image_lighttoggle = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_light") var/static/image/radial_image_statpanel = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine2") @@ -433,11 +433,9 @@ //////// Movement procs //////// ////////////////////////////////// -/obj/mecha/Move() +/obj/mecha/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - MoveAction() - return + MoveAction() /obj/mecha/proc/MoveAction() //Allows mech equipment to do an action once the mech moves if(!equipment.len) @@ -631,6 +629,7 @@ //////////////////////////////////////// /obj/mecha/take_damage(amount, type="brute") + update_damage_alerts() if(amount) var/damage = absorbDamage(amount,type) health -= damage @@ -671,12 +670,12 @@ if(!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)) - playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1) to_chat(user, "You slash at the armored suit!") visible_message("\The [user] slashes at [src.name]'s armor!") else src.log_append_to_last("Armor saved.") - playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1) to_chat(user, "Your claws had no effect!") src.occupant_message("\The [user]'s claws are stopped by the armor.") visible_message("\The [user] rebounds off [src.name]'s armor!") @@ -805,14 +804,14 @@ if(!prob(src.deflect_chance)) src.take_damage(6) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) + playsound(src, 'sound/effects/blobattack.ogg', 50, 1, -1) to_chat(user, "You smash at the armored suit!") for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) V.show_message("\The [user] smashes against [src.name]'s armor!", 1) else src.log_append_to_last("Armor saved.") - playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) + playsound(src, 'sound/effects/blobattack.ogg', 50, 1, -1) to_chat(user, "Your attack had no effect!") src.occupant_message("\The [user]'s attack is stopped by the armor.") for (var/mob/V in viewers(src)) @@ -971,6 +970,7 @@ if(src.healthYou repair some damage to [src.name].") src.health += min(10, initial(src.health)-src.health) + update_damage_alerts() else to_chat(user, "The [src.name] is at full integrity") return @@ -1321,6 +1321,8 @@ src.verbs += /obj/mecha/verb/eject src.log_append_to_last("[H] moved in as pilot.") src.icon_state = src.reset_icon() + update_cell_alerts() + update_damage_alerts() set_dir(dir_in) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(occupant.client && cloaked_selfimage) @@ -1403,6 +1405,8 @@ occupant.loc = mmi mmi.mecha = null occupant.canmove = 0 + occupant.clear_alert("charge") + occupant.clear_alert("mech damage") occupant = null icon_state = src.reset_icon()+"-open" set_dir(dir_in) @@ -1971,12 +1975,14 @@ return call((proc_res["dynusepower"]||src), "dynusepower")(amount) /obj/mecha/proc/dynusepower(amount) + update_cell_alerts() if(get_charge()) cell.use(amount) return 1 return 0 /obj/mecha/proc/give_power(amount) + update_cell_alerts() if(!isnull(get_charge())) cell.give(amount) return 1 @@ -2005,7 +2011,7 @@ user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") else src.log_append_to_last("Armor saved.") - playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1) src.occupant_message("\The [user]'s attack is stopped by the armor.") visible_message("\The [user] rebounds off [src.name]'s armor!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") @@ -2154,3 +2160,31 @@ //src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return */ + +/obj/mecha/proc/update_cell_alerts() + if(occupant && cell) + var/cellcharge = cell.charge/cell.maxcharge + switch(cellcharge) + if(0.75 to INFINITY) + occupant.clear_alert("charge") + if(0.5 to 0.75) + occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1) + if(0.25 to 0.5) + occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2) + if(0.01 to 0.25) + occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3) + else + occupant.throw_alert("charge", /obj/screen/alert/emptycell) + +/obj/mecha/proc/update_damage_alerts() + if(occupant) + var/integrity = health/initial(health)*100 + switch(integrity) + if(30 to 45) + occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1) + if(15 to 35) + occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 2) + if(-INFINITY to 15) + occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) + else + occupant.clear_alert("mech damage") \ No newline at end of file diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index b4723a4be3..890a27b100 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -66,6 +66,7 @@ buckled_mobs |= M post_buckle_mob(M) + M.throw_alert("buckled", /obj/screen/alert/restrained/buckled, new_master = src) return TRUE /atom/movable/proc/unbuckle_mob(mob/living/buckled_mob, force = FALSE) @@ -81,6 +82,7 @@ buckled_mob.anchored = initial(buckled_mob.anchored) buckled_mob.update_canmove() buckled_mob.update_floating( buckled_mob.Check_Dense_Object() ) + buckled_mob.clear_alert("buckled") // buckled_mob = null buckled_mobs -= buckled_mob @@ -120,7 +122,7 @@ // step_towards(M, src) . = buckle_mob(M, forced) - playsound(src.loc, 'sound/effects/seatbelt.ogg', 50, 1) + playsound(src, 'sound/effects/seatbelt.ogg', 50, 1) if(.) if(!silent) if(M == user) @@ -136,7 +138,7 @@ /atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user) var/mob/living/M = unbuckle_mob(buckled_mob) - playsound(src.loc, 'sound/effects/seatbelt.ogg', 50, 1) + playsound(src, 'sound/effects/seatbelt.ogg', 50, 1) if(M) if(M != user) M.visible_message(\ @@ -151,19 +153,18 @@ add_fingerprint(user) return M -/atom/movable/proc/handle_buckled_mob_movement(newloc,direct) - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A -// if(!L.Move(newloc, direct)) - if(!L.forceMove(newloc, direct)) - loc = L.loc - last_move = L.last_move - L.inertia_dir = last_move - return FALSE - else - L.set_dir(dir) - return TRUE +/atom/movable/proc/handle_buckled_mob_movement(atom/old_loc, direct, movetime) + for(var/A in buckled_mobs) + var/mob/living/L = A + if(!L.Move(loc, direct, movetime)) + L.forceMove(loc, direct, movetime) + L.last_move = last_move + L.inertia_dir = last_move + + if(!buckle_dir) + L.set_dir(dir) + else + L.set_dir(buckle_dir) /atom/movable/proc/can_buckle_check(mob/living/M, forced = FALSE) if(!buckled_mobs) diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 203b768d75..836e277872 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -66,7 +66,7 @@ /obj/effect/alien/resin/attack_generic(var/mob/user, var/damage, var/attack_verb) visible_message("[user] [attack_verb] the [src]!") - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) user.do_attack_animation(src) health -= damage healthcheck() @@ -100,7 +100,7 @@ tforce = 10 else tforce = AM:throwforce - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) health = max(0, health - tforce) healthcheck() ..() @@ -137,7 +137,7 @@ user.setClickCooldown(user.get_attack_speed(W)) var/aforce = W.force health = max(0, health - aforce) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) healthcheck() ..() return @@ -176,11 +176,11 @@ . = ..() if(isspace(loc)) return INITIALIZE_HINT_QDEL - + linked_node = node if(newcolor) color = newcolor - + if(icon_state == "weeds") icon_state = pick("weeds", "weeds1", "weeds2") @@ -203,7 +203,7 @@ desc = "Weird glowing organic growth." layer = ABOVE_TURF_LAYER+0.01 light_range = NODERANGE - + var/node_range = NODERANGE var/set_color = "#321D37" @@ -216,6 +216,8 @@ else qdel(existing) + linked_node = src + if(newcolor) set_color = newcolor if(set_color) @@ -299,7 +301,7 @@ W.color = W.linked_node.set_color - if(prob(max(10, 40 - (5 * nearby_weeds.len)))) + if(prob(max(10, 60 - (5 * nearby_weeds.len)))) W.process() /obj/effect/alien/weeds/ex_act(severity) @@ -328,7 +330,7 @@ if(WT.remove_fuel(0, user)) damage = 15 - playsound(loc, 'sound/items/Welder.ogg', 100, 1) + playsound(src, 'sound/items/Welder.ogg', 100, 1) health -= damage healthcheck() @@ -441,7 +443,6 @@ var/health = 100 var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive - flags = PROXMOVE /obj/effect/alien/egg/New() /* @@ -532,7 +533,7 @@ if(WT.remove_fuel(0, user)) damage = 15 - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + playsound(src, 'sound/items/Welder.ogg', 100, 1) src.health -= damage src.healthcheck() @@ -545,16 +546,4 @@ /obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 500 + T0C) health -= 5 - healthcheck() -/* -/obj/effect/alien/egg/HasProximity(atom/movable/AM as mob|obj) - if(status == GROWN) - if(!CanHug(AM)) - return - - var/mob/living/carbon/C = AM - if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST) - return - - Burst(0) -*/ \ No newline at end of file + healthcheck() \ No newline at end of file diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 6ac967fc00..f533a2da60 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -146,7 +146,7 @@ /obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob) if(W.is_wirecutter()) - playsound(src.loc, W.usesound, 100, 1) + playsound(src, W.usesound, 100, 1) if(ruined) to_chat(user, "You remove the remnants of the poster.") qdel(src) @@ -166,7 +166,7 @@ return visible_message("[user] rips [src] in a single, decisive motion!" ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) + playsound(src, 'sound/items/poster_ripped.ogg', 100, 1) ruined = 1 icon_state = "poster_ripped" name = "ripped poster" diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 00896e7107..15931b5868 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -98,7 +98,7 @@ steam.start() -- spawns the effect /obj/effect/effect/sparks/New() ..() - playsound(src.loc, "sparks", 100, 1) + playsound(src, "sparks", 100, 1) var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(1000,100) @@ -113,12 +113,11 @@ steam.start() -- spawns the effect T.hotspot_expose(1000,100) return ..() -/obj/effect/effect/sparks/Move() - ..() - var/turf/T = src.loc - if (istype(T, /turf)) +/obj/effect/effect/sparks/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(isturf(loc)) + var/turf/T = loc T.hotspot_expose(1000,100) - return /datum/effect/effect/system/spark_spread var/total_sparks = 0 // To stop it being spammed and lagging! @@ -225,8 +224,8 @@ steam.start() -- spawns the effect time_to_live = 600 //var/list/projectiles -/obj/effect/effect/smoke/bad/Move() - ..() +/obj/effect/effect/smoke/bad/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() for(var/mob/living/L in get_turf(src)) affect(L) @@ -281,8 +280,8 @@ steam.start() -- spawns the effect STOP_PROCESSING(SSobj, src) return ..() -/obj/effect/effect/smoke/elemental/Move() - ..() +/obj/effect/effect/smoke/elemental/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() for(var/mob/living/L in range(1, src)) affect(L) diff --git a/code/game/objects/effects/explosion_particles.dm b/code/game/objects/effects/explosion_particles.dm index 63b2a09c24..12a1e92020 100644 --- a/code/game/objects/effects/explosion_particles.dm +++ b/code/game/objects/effects/explosion_particles.dm @@ -12,10 +12,6 @@ qdel(src) return -/obj/effect/expl_particles/Move() - ..() - return - /datum/effect/system/expl_particles var/number = 10 var/turf/location diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index f2a15be551..1497e4e7a0 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -61,7 +61,7 @@ panel_open = !panel_open user.visible_message("[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].", "You very carefully screw the mine's panel [panel_open ? "open" : "closed"].") - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open) interact(user) @@ -224,7 +224,7 @@ msg_admin_attack("[key_name_admin(user)] primed \a [src]") user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!") if(do_after(user, 10 SECONDS)) - playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3) prime(user) else visible_message("[user] triggers \the [src.name]!", "You accidentally trigger \the [src.name]!") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2254696e4a..dc3a151686 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -94,6 +94,8 @@ var/drop_sound = 'sound/items/drop/device.ogg' // drop sound - this is the default + var/tip_timer // reference to timer id for a tooltip we might open soon + /obj/item/New() ..() if(embed_chance < 0) @@ -339,7 +341,7 @@ var/list/global/slot_flags_enumeration = list( //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. //Set disable_warning to 1 if you wish it to not give you outputs. //Should probably move the bulk of this into mob code some time, as most of it is related to the definition of slots and not item-specific -/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = 0) +/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = FALSE) if(!slot) return 0 if(!M) return 0 @@ -506,7 +508,7 @@ var/list/global/slot_flags_enumeration = list( var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U)) if(!hit_zone) U.do_attack_animation(M) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) //visible_message("[U] attempts to stab [M] in the eyes, but misses!") for(var/mob/V in viewers(M)) V.show_message("[U] attempts to stab [M] in the eyes, but misses!") @@ -602,19 +604,24 @@ var/list/global/slot_flags_enumeration = list( blood_DNA[M.dna.unique_enzymes] = M.dna.b_type return 1 //we applied blood to the item - +GLOBAL_LIST_EMPTY(blood_overlays_by_type) /obj/item/proc/generate_blood_overlay() + // Already got one if(blood_overlay) return + + // Already cached + if(GLOB.blood_overlays_by_type[type]) + blood_overlay = GLOB.blood_overlays_by_type[type] + return - var/icon/I = new /icon(icon, icon_state) - I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent) - I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - - //not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made. - for(var/obj/item/A in world) - if(A.type == type && !A.blood_overlay) - A.blood_overlay = image(I) + // Firsties! + var/image/blood = image(icon = 'icons/effects/blood.dmi', icon_state = "itemblood") // Needs to be a new one each time since we're slicing it up with filters. + blood.filters += filter(type = "alpha", icon = icon(icon, icon_state)) // Same, this filter is unique for each blood overlay per type + GLOB.blood_overlays_by_type[type] = blood + + // And finally + blood_overlay = blood /obj/item/proc/showoff(mob/user) for (var/mob/M in view(user)) @@ -665,6 +672,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. H.toggle_zoom_hud() // If the user has already limited their HUD this avoids them having a HUD when they zoom in H.set_viewsize(viewsize) zoom = 1 + GLOB.moved_event.register(H, src, .proc/zoom) var/tilesize = 32 var/viewoffset = tilesize * tileoffset @@ -693,6 +701,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!H.hud_used.hud_shown) H.toggle_zoom_hud() zoom = 0 + GLOB.moved_event.unregister(H, src, .proc/zoom) H.client.pixel_x = 0 H.client.pixel_y = 0 @@ -875,4 +884,18 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. return FALSE /obj/item/proc/is_welder() - return FALSE \ No newline at end of file + return FALSE + +/obj/item/MouseEntered(location,control,params) + . = ..() + if(usr.is_preference_enabled(/datum/client_preference/inv_tooltips) && ((src in usr) || isstorage(loc))) // If in inventory or in storage we're looking at + var/user = usr + tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), 5, TIMER_STOPPABLE) + +/obj/item/MouseExited() + . = ..() + deltimer(tip_timer) + closeToolTip(usr) + +/obj/item/proc/openTip(location, control, params, user) + openToolTip(user, src, params, title = name, content = desc) diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index af9d7ce0f8..c05c7d2686 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -19,7 +19,7 @@ /obj/item/weapon/deskbell/attack(mob/target as mob, mob/living/user as mob) if(!broken) - playsound(user.loc, 'sound/effects/deskbell.ogg', 50, 1) + playsound(src, 'sound/effects/deskbell.ogg', 50, 1) ..() /obj/item/weapon/deskbell/attack_hand(mob/user) @@ -61,12 +61,12 @@ /obj/item/weapon/deskbell/proc/ring(mob/user) if(user.a_intent == "harm") - playsound(user.loc, 'sound/effects/deskbell_rude.ogg', 50, 1) + playsound(src, 'sound/effects/deskbell_rude.ogg', 50, 1) to_chat(user,"You hammer [src] rudely!") if (prob(2)) break_bell(user) else - playsound(user.loc, 'sound/effects/deskbell.ogg', 50, 1) + playsound(src, 'sound/effects/deskbell.ogg', 50, 1) to_chat(user,"You gracefully ring [src].") /obj/item/weapon/deskbell/proc/check_ability(mob/user) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 8f89c2c074..cf32e30c90 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -330,7 +330,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/ai/attack_self(mob/user as mob) if ((honkamt > 0) && (prob(60)))//For clown virus. honkamt-- - playsound(loc, 'sound/items/bikehorn.ogg', 30, 1) + playsound(src, 'sound/items/bikehorn.ogg', 30, 1) return @@ -774,7 +774,7 @@ var/global/list/obj/item/device/pda/PDAs = list() scanmode = 4 if("Honk") if ( !(last_honk && world.time < last_honk + 20) ) - playsound(loc, 'sound/items/bikehorn.ogg', 50, 1) + playsound(src, 'sound/items/bikehorn.ogg', 50, 1) last_honk = world.time if("Gas Scan") if(scanmode == 5) @@ -983,7 +983,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if ((honkamt > 0) && (prob(60)))//For clown virus. honkamt-- - playsound(loc, 'sound/items/bikehorn.ogg', 30, 1) + playsound(src, 'sound/items/bikehorn.ogg', 30, 1) return 1 // return 1 tells it to refresh the UI in NanoUI @@ -1020,14 +1020,14 @@ var/global/list/obj/item/device/pda/PDAs = list() var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem S.attach(P.loc) S.set_up(P, 10, 0, P.loc) - playsound(P.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + playsound(P, 'sound/effects/smoke.ogg', 50, 1, -3) S.start() message += "Large clouds of smoke billow forth from your [P]!" if(i>=40 && i<=45) //Bad smoke var/datum/effect/effect/system/smoke_spread/bad/B = new /datum/effect/effect/system/smoke_spread/bad B.attach(P.loc) B.set_up(P, 10, 0, P.loc) - playsound(P.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + playsound(P, 'sound/effects/smoke.ogg', 50, 1, -3) B.start() message += "Large clouds of noxious smoke billow forth from your [P]!" if(i>=65 && i<=75) //Weaken @@ -1064,7 +1064,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/mob/M = loc M.put_in_hands(id) to_chat(usr, "You remove the ID from the [name].") - playsound(loc, 'sound/machines/id_swipe.ogg', 100, 1) + playsound(src, 'sound/machines/id_swipe.ogg', 100, 1) else id.loc = get_turf(src) id = null @@ -1133,7 +1133,7 @@ var/global/list/obj/item/device/pda/PDAs = list() conversations.Add("\ref[P]") if(!P.conversations.Find("\ref[src]")) P.conversations.Add("\ref[src]") - + to_chat(U, "[bicon(src)] Sent message to [P.owner] ([P.ownjob]), \"[t]\"") if (prob(15)) //Give the AI a chance of intercepting the message var/who = src.owner @@ -1151,7 +1151,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/new_info(var/beep_silent, var/message_tone, var/reception_message) if (!beep_silent) - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) O.show_message(text("[bicon(src)] *[message_tone]*")) //Search for holder of the PDA. @@ -1280,7 +1280,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (cartridge.radio) cartridge.radio.hostpda = null to_chat(usr, "You remove \the [cartridge] from the [name].") - playsound(loc, 'sound/machines/id_swipe.ogg', 100, 1) + playsound(src, 'sound/machines/id_swipe.ogg', 100, 1) cartridge = null /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 627145a38f..d6f42bee8f 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -31,7 +31,7 @@ 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) + playsound(src, 'sound/weapons/flash.ogg', 100, 1, -6) to_chat(user, "Scanned [target].") saved_item = target.type saved_icon = target.icon @@ -42,7 +42,7 @@ if(!can_use || !saved_item) return if(active_dummy) eject_all() - playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) + playsound(src, 'sound/effects/pop.ogg', 100, 1, -6) qdel(active_dummy) active_dummy = null to_chat(usr, "You deactivate the [src].") @@ -51,7 +51,7 @@ flick("emppulse",T) spawn(8) qdel(T) else - playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) + playsound(src, 'sound/effects/pop.ogg', 100, 1, -6) var/obj/O = new saved_item(src) if(!O) return var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc) diff --git a/code/game/objects/items/devices/communicator/messaging.dm b/code/game/objects/items/devices/communicator/messaging.dm index c6191ab21e..2b4e0bcdd4 100644 --- a/code/game/objects/items/devices/communicator/messaging.dm +++ b/code/game/objects/items/devices/communicator/messaging.dm @@ -76,7 +76,7 @@ return if(ringer) - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) O.show_message(text("[bicon(src)] *beep*")) diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index 492cd84179..3f13df8825 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -161,7 +161,7 @@ voice_requests |= candidate if(ringer) - playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) O.show_message(text("[bicon(src)] *beep*")) diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index dbb1410ef9..a53a6e00c7 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -380,23 +380,21 @@ // This proc is used so that we can return out of the revive process while ensuring that busy and update_icon() are handled /obj/item/weapon/shockpaddles/proc/do_revive(mob/living/carbon/human/H, mob/user) - if(!H.client && !H.teleop) - for(var/mob/observer/dead/ghost in player_list) - if(ghost.mind == H.mind) - ghost.notify_revive("Someone is trying to resuscitate you. Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg') - break + var/mob/observer/dead/ghost = H.get_ghost() + if(ghost) + ghost.notify_revive("Someone is trying to resuscitate you. Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg', source = src) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message("\The [user] begins to place [src] on [H]'s chest.", "You begin to place [src] on [H]'s chest...") if(!do_after(user, 30, H)) return user.visible_message("\The [user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + playsound(src, 'sound/machines/defib_charge.ogg', 50, 0) var/error = can_defib(H) if(error) make_announcement(error, "warning") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) return if(check_blood_level(H)) @@ -409,18 +407,18 @@ //deduct charge here, in case the base unit was EMPed or something during the delay time if(!checked_use(chargecost)) make_announcement("buzzes, \"Insufficient charge.\"", "warning") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) return H.visible_message("\The [H]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + playsound(src, "bodyfall", 50, 1) + playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1) set_cooldown(cooldowntime) error = can_revive(H) if(error) make_announcement(error, "warning") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) return H.apply_damage(burn_damage_amt, BURN, BP_TORSO) @@ -434,7 +432,7 @@ H.adjustToxLoss(-H.getToxLoss()) make_announcement("pings, \"Resuscitation successful.\"", "notice") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + playsound(src, 'sound/machines/defib_success.ogg', 50, 0) make_alive(H) @@ -455,7 +453,7 @@ to_chat(user, "You can't do that while the safety is enabled.") return - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + playsound(src, 'sound/machines/defib_charge.ogg', 50, 0) audible_message("\The [src] lets out a steadily rising hum...") if(!do_after(user, chargetime, H)) @@ -464,12 +462,12 @@ //deduct charge here, in case the base unit was EMPed or something during the delay time if(!checked_use(chargecost)) make_announcement("buzzes, \"Insufficient charge.\"", "warning") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + playsound(src, 'sound/machines/defib_failed.ogg', 50, 0) return user.visible_message("\The [user] shocks [H] with \the [src]!", "You shock [H] with \the [src]!") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) - playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1) + playsound(src, 'sound/machines/defib_zap.ogg', 100, 1, -1) + playsound(src, 'sound/weapons/Egloves.ogg', 100, 1, -1) set_cooldown(cooldowntime) H.stun_effect_act(2, 120, target_zone) @@ -543,10 +541,10 @@ safety = new_safety if(safety) make_announcement("beeps, \"Safety protocols enabled!\"", "notice") - playsound(get_turf(src), 'sound/machines/defib_safetyon.ogg', 50, 0) + playsound(src, 'sound/machines/defib_safetyon.ogg', 50, 0) else make_announcement("beeps, \"Safety protocols disabled!\"", "warning") - playsound(get_turf(src), 'sound/machines/defib_safetyoff.ogg', 50, 0) + playsound(src, 'sound/machines/defib_safetyoff.ogg', 50, 0) update_icon() ..() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 6c512650b6..91915c8c07 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -48,7 +48,7 @@ user.visible_message("\The [user] successfully repairs \the [src]!") broken = FALSE update_icon() - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) else user.visible_message("\The [user] fails to repair \the [src].") repairing = FALSE @@ -138,7 +138,7 @@ if(user) update_icon() to_chat(user, "click") - playsound(src.loc, 'sound/weapons/empty.ogg', 80, 1) + playsound(src, 'sound/weapons/empty.ogg', 80, 1) return FALSE else if(battery && battery.checked_use(charge_cost + (round(charge_cost / 4) * max(0, times_used - max_flashes)))) // Using over your maximum flashes starts taking more charge per added flash. times_used++ @@ -164,7 +164,7 @@ if(!check_capacitor(user)) return - playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + playsound(src, 'sound/weapons/flash.ogg', 100, 1) var/flashfail = 0 if(iscarbon(M)) @@ -245,7 +245,7 @@ if(!check_capacitor(user)) return - playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + playsound(src, 'sound/weapons/flash.ogg', 100, 1) flick("flash2", src) if(user && isrobot(user)) spawn(0) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 5246e6f3c3..c908f30e17 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -20,24 +20,19 @@ /obj/item/device/flashlight/Initialize() . = ..() - update_icon() - -/obj/item/device/flashlight/New() - if(power_use) - START_PROCESSING(SSobj, src) - - if(cell_type) - cell = new cell_type(src) - brightness_levels = list("low" = 0.25, "medium" = 0.5, "high" = 1) - power_usage = brightness_levels[brightness_level] + if(power_use && cell_type) + cell = new cell_type(src) + brightness_levels = list("low" = 0.25, "medium" = 0.5, "high" = 1) + power_usage = brightness_levels[brightness_level] else verbs -= /obj/item/device/flashlight/verb/toggle - ..() + + update_icon() /obj/item/device/flashlight/Destroy() - if(power_use) - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSobj, src) + qdel_null(cell) return ..() /obj/item/device/flashlight/get_cell() @@ -58,18 +53,17 @@ update_icon() /obj/item/device/flashlight/process() - if(on) - if(cell) - if(brightness_level && power_usage) - if(power_usage < cell.charge) - cell.charge -= power_usage - else - cell.charge = 0 - visible_message("\The [src] flickers before going dull.") - set_light(0) - playsound(src.loc, 'sound/effects/sparks3.ogg', 10, 1, -3) //Small cue that your light went dull in your pocket. - on = 0 - update_icon() + if(!on || !cell) + return PROCESS_KILL + + if(brightness_level && power_usage) + if(cell.use(power_usage) != power_usage) // we weren't able to use our full power_usage amount! + visible_message("\The [src] flickers before going dull.") + set_light(0) + playsound(src.loc, 'sound/effects/sparks3.ogg', 10, 1, -3) //Small cue that your light went dull in your pocket. + on = 0 + update_icon() + return PROCESS_KILL /obj/item/device/flashlight/update_icon() if(on) @@ -111,6 +105,10 @@ to_chat(user, "You flick the switch on [src], but nothing happens.") return 0 on = !on + if(on && power_use) + START_PROCESSING(SSobj, src) + else if(power_use) + STOP_PROCESSING(SSobj, src) playsound(src.loc, 'sound/weapons/empty.ogg', 15, 1, -3) update_icon() user.update_action_buttons() diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index b9b177e683..62c1f7d1ed 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -13,7 +13,6 @@ var/datum/looping_sound/geiger/soundloop /obj/item/device/geiger/Initialize() - START_PROCESSING(SSobj, src) soundloop = new(list(src), FALSE) return ..() @@ -60,6 +59,10 @@ /obj/item/device/geiger/attack_self(var/mob/user) scanning = !scanning + if(scanning) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) update_icon() update_sound() to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] \the [src].") diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 562ed56990..095f565bd4 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -59,11 +59,11 @@ var/list/GPS_list = list() visible_message("\The [src] appears to be functional again.") /obj/item/device/gps/update_icon() - overlays.Cut() + cut_overlays() if(emped) - overlays += image(icon, src, "emp") + add_overlay("emp") else if(tracking) - overlays += image(icon, src, "working") + add_overlay("working") /obj/item/device/gps/attack_self(mob/user) display(user) @@ -89,6 +89,8 @@ var/list/GPS_list = list() continue var/turf/T = get_turf(G) + if(!T) + continue if(local_mode && curr.z != T.z) continue if(!(T.z in dat["z_level_detection"])) @@ -183,6 +185,13 @@ var/list/GPS_list = list() /obj/item/device/gps/security/on tracking = TRUE +/obj/item/device/gps/security/hos + icon_state = "gps-sec-hos" + gps_tag = "HOS0" + +/obj/item/device/gps/security/hos/on + tracking = TRUE + /obj/item/device/gps/medical icon_state = "gps-med" gps_tag = "MED0" @@ -190,6 +199,13 @@ var/list/GPS_list = list() /obj/item/device/gps/medical/on tracking = TRUE +/obj/item/device/gps/medical/cmo + icon_state = "gps-med-cmo" + gps_tag = "CMO0" + +/obj/item/device/gps/medical/cmo/on + tracking = TRUE + /obj/item/device/gps/science icon_state = "gps-sci" gps_tag = "SCI0" @@ -197,6 +213,13 @@ var/list/GPS_list = list() /obj/item/device/gps/science/on tracking = TRUE +/obj/item/device/gps/science/rd + icon_state = "gps-sci-rd" + gps_tag = "RD0" + +/obj/item/device/gps/science/rd/on + tracking = TRUE + /obj/item/device/gps/engineering icon_state = "gps-eng" gps_tag = "ENG0" @@ -204,6 +227,20 @@ var/list/GPS_list = list() /obj/item/device/gps/engineering/on tracking = TRUE +/obj/item/device/gps/engineering/atmos + icon_state = "gps-eng-atm" + gps_tag = "ATM0" + +/obj/item/device/gps/engineering/atmos/on + tracking = TRUE + +/obj/item/device/gps/engineering/ce + icon_state = "gps-eng-ce" + gps_tag = "CE0" + +/obj/item/device/gps/engineering/ce/on + tracking = TRUE + /obj/item/device/gps/mining icon_state = "gps-mine" gps_tag = "MINE0" diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index 0b6d25f0c9..a48a3da024 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -26,7 +26,7 @@ /obj/item/device/multitool/hacktool/attackby(var/obj/item/W, var/mob/user) if(W.is_screwdriver()) in_hack_mode = !in_hack_mode - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) else ..() diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 3ce7a0b236..6ae95bcf8a 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -96,7 +96,7 @@ new_bulbs += AddShards(1) qdel(L) if(new_bulbs != 0) - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) to_chat(user, "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining.") return @@ -148,7 +148,7 @@ /obj/item/device/lightreplacer/proc/Use(var/mob/user) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) add_uses(-1) return 1 @@ -182,7 +182,7 @@ var/new_bulbs = AddShards(1) if(new_bulbs != 0) to_chat(U, "\The [src] has fabricated a new bulb from the broken bulbs it has stored. It now has [uses] uses.") - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) target.status = LIGHT_EMPTY target.update() @@ -211,7 +211,7 @@ /obj/item/device/lightreplacer/emag_act(var/remaining_charges, var/mob/user) emagged = !emagged - playsound(src.loc, "sparks", 100, 1) + playsound(src, "sparks", 100, 1) update_icon() return 1 diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 7e7bbdb629..5516ccb099 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -134,7 +134,7 @@ user.audible_message("[user.GetVoice()][user.GetAltName()] broadcasts, \"[pick(insultmsg)]\"") if(broadcast_size >= 11) var/turf/T = get_turf(user) - playsound(T, 'sound/items/AirHorn.ogg', 100, 1) + playsound(src, 'sound/items/AirHorn.ogg', 100, 1) for(var/mob/living/carbon/M in oviewers(4, T)) if(M.get_ear_protection() >= 2) continue diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 6847bb6fb0..820229fd83 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -47,7 +47,7 @@ to_chat(user, "[O] must be safely placed on the ground for modification.") return - playsound(src.loc, O.usesound, 100, 1) + playsound(src, O.usesound, 100, 1) user.visible_message("\The [user] opens \the [src] and modifies \the [O].","You open \the [src] and modify \the [O].") diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 06a7314f32..5303113441 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -10,9 +10,20 @@ flags = NOBLOODY var/circuit = /obj/item/weapon/circuitboard/intercom var/number = 0 - var/last_tick //used to delay the powercheck var/wiresexposed = 0 +/obj/item/device/radio/intercom/Initialize() + . = ..() + var/area/A = get_area(src) + if(A) + GLOB.apc_event.register(A, src, /obj/update_icon) + +/obj/item/device/radio/intercom/Destroy() + var/area/A = get_area(src) + if(A) + GLOB.apc_event.unregister(A, src, /obj/update_icon) + return ..() + /obj/item/device/radio/intercom/custom name = "station intercom (Custom)" broadcasting = 0 @@ -59,7 +70,6 @@ /obj/item/device/radio/intercom/New() ..() - START_PROCESSING(SSobj, src) circuit = new circuit(src) /obj/item/device/radio/intercom/department/medbay/New() @@ -102,10 +112,6 @@ ..() internal_channels[num2text(RAID_FREQ)] = list(access_syndicate) -/obj/item/device/radio/intercom/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - /obj/item/device/radio/intercom/attack_ai(mob/user as mob) src.add_fingerprint(user) spawn (0) @@ -122,15 +128,8 @@ wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") playsound(src, W.usesound, 50, 1) - if(wiresexposed) - if(!on) - icon_state = "intercom-p_open" - else - icon_state = "intercom_open" - else - icon_state = "intercom" - return - if(wiresexposed && W.is_wirecutter()) + update_icon() + else if(wiresexposed && W.is_wirecutter()) user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") playsound(src, W.usesound, 50, 1) new/obj/item/stack/cable_coil(get_turf(src), 5) @@ -148,7 +147,6 @@ qdel(src) else src.attack_hand(user) - return /obj/item/device/radio/intercom/receive_range(freq, level) if (!on) @@ -165,29 +163,20 @@ return canhear_range -/obj/item/device/radio/intercom/process() - if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0)) - last_tick = world.timeofday +/obj/item/device/radio/intercom/update_icon() + var/area/A = get_area(src) + on = A?.powered(EQUIP) - if(!src.loc) - on = 0 + if(!on) + if(wiresexposed) + icon_state = "intercom-p_open" else - var/area/A = get_area(src) - if(!A) - on = 0 - else - on = A.powered(EQUIP) // set "on" to the power status - - if(!on) - if(wiresexposed) - icon_state = "intercom-p_open" - else - icon_state = "intercom-p" + icon_state = "intercom-p" + else + if(wiresexposed) + icon_state = "intercom_open" else - if(wiresexposed) - icon_state = "intercom_open" - else - icon_state = initial(icon_state) + icon_state = initial(icon_state) /obj/item/device/radio/intercom/locked var/locked_frequency diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 8c8a208db8..0c097295bb 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -28,14 +28,17 @@ /obj/item/device/suit_cooling_unit/ui_action_click() toggle(usr) -/obj/item/device/suit_cooling_unit/New() - START_PROCESSING(SSobj, src) - cell = new/obj/item/weapon/cell/high() //comes not with the crappy default power cell - because this is dedicated EVA equipment - cell.loc = src +/obj/item/device/suit_cooling_unit/Initialize() + . = ..() + cell = new/obj/item/weapon/cell/high(src) //comes not with the crappy default power cell - because this is dedicated EVA equipment + +/obj/item/device/suit_cooling_unit/Destroy() + qdel_null(cell) + return ..() /obj/item/device/suit_cooling_unit/process() if (!on || !cell) - return + return PROCESS_KILL if (!ismob(loc)) return @@ -106,11 +109,13 @@ return on = 1 + START_PROCESSING(SSobj, src) updateicon() /obj/item/device/suit_cooling_unit/proc/turn_off(var/failed) if(failed) visible_message("\The [src] clicks and whines as it powers down.") on = 0 + STOP_PROCESSING(SSobj, src) updateicon() /obj/item/device/suit_cooling_unit/attack_self(var/mob/user) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 7a9b07b999..3ddc35a209 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -50,7 +50,7 @@ effective or pretty fucking useless. add_attack_logs(user,affected,"Used a [name]") - playsound(src.loc, 'sound/misc/interference.ogg', 50, 1) + playsound(src, 'sound/misc/interference.ogg', 50, 1) to_chat(user, "You trigger [src].") times_used += 1 if(times_used >= max_uses) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 4169dfc947..406919f96a 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -9,7 +9,6 @@ var/mob/attacher = null var/valve_open = 0 var/toggle = 1 - flags = PROXMOVE /obj/item/device/transfer_valve/attackby(obj/item/item, mob/user) var/turf/location = get_turf(src) // For admin logs @@ -57,11 +56,15 @@ return -/obj/item/device/transfer_valve/HasProximity(atom/movable/AM as mob|obj) - if(!attached_device) return - attached_device.HasProximity(AM) - return +/obj/item/device/transfer_valve/HasProximity(turf/T, atom/movable/AM, old_loc) + attached_device?.HasProximity(T, AM, old_loc) +/obj/item/device/transfer_valve/Moved(old_loc, direction, forced) + . = ..() + if(isturf(old_loc)) + unsense_proximity(callback = .HasProximity, center = old_loc) + if(isturf(loc)) + sense_proximity(callback = .HasProximity) /obj/item/device/transfer_valve/attack_self(mob/user as mob) ui_interact(user) diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index c26d3f80aa..cf8cebeec1 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -32,11 +32,11 @@ return if(isnull(insults)) - playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0) + playsound(src, 'sound/voice/halt.ogg', 100, 1, vary = 0) user.audible_message("[user]'s [name] rasps, \"[use_message]\"", "\The [user] holds up \the [name].") else if(insults > 0) - playsound(get_turf(src), 'sound/voice/binsult.ogg', 100, 1, vary = 0) + playsound(src, 'sound/voice/binsult.ogg', 100, 1, vary = 0) // Yes, it used to show the transcription of the sound clip. That was a) inaccurate b) immature as shit. user.audible_message("[user]'s [name] gurgles something indecipherable and deeply offensive.", "\The [user] holds up \the [name].") insults-- diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index a0bebc699f..223c9a2018 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -16,7 +16,7 @@ /obj/item/device/kit/proc/use(var/amt, var/mob/user) uses -= amt - playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) if(uses<1) user.drop_item() qdel(src) @@ -157,6 +157,7 @@ /obj/item/device/kit/suit/rig/customize(var/obj/item/I, var/mob/user) var/obj/item/weapon/rig/RIG = I RIG.suit_state = new_icon + RIG.item_state = new_icon RIG.suit_type = "customized [initial(RIG.suit_type)]" RIG.name = "[new_name]" RIG.desc = new_desc @@ -170,17 +171,17 @@ piece.desc = "It seems to be part of a [RIG.name]." piece.icon_state = "[RIG.suit_state]" if(istype(piece, /obj/item/clothing/shoes)) - icon = 'icons/mob/custom_items_rig_boots.dmi' - icon_override = 'icons/mob/custom_items_rig_boots.dmi' + piece.icon = 'icons/mob/custom_items_rig_boots.dmi' + piece.icon_override = 'icons/mob/custom_items_rig_boots.dmi' if(istype(piece, /obj/item/clothing/suit)) - icon = 'icons/mob/custom_items_rig_suit.dmi' - icon_override = 'icons/mob/custom_items_rig_suit.dmi' + piece.icon = 'icons/mob/custom_items_rig_suit.dmi' + piece.icon_override = 'icons/mob/custom_items_rig_suit.dmi' if(istype(piece, /obj/item/clothing/head)) - icon = 'icons/mob/custom_items_rig_helmet.dmi' - icon_override = 'icons/mob/custom_items_rig_helmet.dmi' + piece.icon = 'icons/mob/custom_items_rig_helmet.dmi' + piece.icon_override = 'icons/mob/custom_items_rig_helmet.dmi' if(istype(piece, /obj/item/clothing/gloves)) - icon = 'icons/mob/custom_items_rig_gloves.dmi' - icon_override = 'icons/mob/custom_items_rig_gloves.dmi' + piece.icon = 'icons/mob/custom_items_rig_gloves.dmi' + piece.icon_override = 'icons/mob/custom_items_rig_gloves.dmi' if(RIG.helmet && istype(RIG.helmet, /obj/item/clothing/head/helmet) && new_light_overlay) var/obj/item/clothing/head/helmet/H = RIG.helmet H.light_overlay = new_light_overlay @@ -196,6 +197,9 @@ return return ..() +/obj/item/device/kit/suit/rig/debug/Initialize() + set_info("debug suit", "This is a test", "debug", CUSTOM_ITEM_OBJ, CUSTOM_ITEM_MOB) + /obj/item/device/kit/paint name = "mecha customisation kit" desc = "A kit containing all the needed tools and parts to repaint a mech." diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index c3bc83d3b9..982236f43c 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -18,12 +18,12 @@ break ..() // delete target - Move() - ..() + Moved(atom/old_loc, direction, forced = FALSE) + . = ..() // After target moves, check for nearby stakes. If associated, move to target for(var/obj/structure/target_stake/M in view(3,src)) if(M.density == 0 && M.pinned_target == src) - M.loc = loc + M.forceMove(loc) // This may seem a little counter-intuitive but I assure you that's for a purpose. // Stakes are the ones that carry targets, yes, but in the stake code we set diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index 88eb8e6271..5c7ed3aa04 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -58,7 +58,7 @@ var/list/marker_beacon_colors = list( return if(use(1)) to_chat(user, "You activate and anchor [amount ? "a":"the"] [singular_name] in place.") - playsound(user, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) var/obj/structure/marker_beacon/M = new(user.loc, picked_color) transfer_fingerprints_to(M) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 80f7f5ba41..2cb4e1863b 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -24,6 +24,11 @@ to_chat(user, "You don't have the dexterity to do this!") return 1 + var/available = get_amount() + if(!available) + to_chat(user, "There's not enough [uses_charge ? "charge" : "items"] left to use that!") + return 1 + if (istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) @@ -101,11 +106,12 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") return 1 else + var/available = get_amount() user.visible_message("\The [user] starts bandaging [M]'s [affecting.name].", \ "You start bandaging [M]'s [affecting.name]." ) var/used = 0 for (var/datum/wound/W in affecting.wounds) - if (W.internal) + if(W.internal) continue if(W.bandaged) continue @@ -119,6 +125,10 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") return 1 + if(used >= available) + to_chat(user, "You run out of [src]!") + break + if (W.current_stage <= W.max_bleeding_stage) user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ "You bandage \a [W.desc] on [M]'s [affecting.name]." ) @@ -164,6 +174,7 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") return 1 else + var/available = get_amount() user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ "You start treating [M]'s [affecting.name]." ) var/used = 0 @@ -182,6 +193,10 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") return 1 + if(used >= available) + to_chat(user, "You run out of [src]!") + break + if (W.current_stage <= W.max_bleeding_stage) user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ "You bandage \a [W.desc] on [M]'s [affecting.name]." ) @@ -271,6 +286,7 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been treated.") return 1 else + var/available = get_amount() user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ "You start treating [M]'s [affecting.name]." ) var/used = 0 @@ -287,6 +303,11 @@ if(affecting.is_bandaged() && affecting.is_disinfected()) // We do a second check after the delay, in case it was bandaged after the first check. to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") return 1 + + if(used >= available) + to_chat(user, "You run out of [src]!") + break + if (W.current_stage <= W.max_bleeding_stage) user.visible_message("\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \ "You clean and seal \a [W.desc] on [M]'s [affecting.name]." ) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 255a739d84..ad3e349ba7 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -1,4 +1,4 @@ -/obj/item/stack/material/animalhide/human +/obj/item/stack/animalhide/human name = "human skin" desc = "The by-product of human farming." singular_name = "human skin piece" @@ -6,63 +6,63 @@ no_variants = FALSE drop_sound = 'sound/items/drop/clothing.ogg' -/obj/item/stack/material/animalhide/human +/obj/item/stack/animalhide/human amount = 50 -/obj/item/stack/material/animalhide/corgi +/obj/item/stack/animalhide/corgi name = "corgi hide" desc = "The by-product of corgi farming." singular_name = "corgi hide piece" icon_state = "sheet-corgi" -/obj/item/stack/material/animalhide/corgi +/obj/item/stack/animalhide/corgi amount = 50 -/obj/item/stack/material/animalhide/cat +/obj/item/stack/animalhide/cat name = "cat hide" desc = "The by-product of cat farming." singular_name = "cat hide piece" icon_state = "sheet-cat" -/obj/item/stack/material/animalhide/cat +/obj/item/stack/animalhide/cat amount = 50 -/obj/item/stack/material/animalhide/monkey +/obj/item/stack/animalhide/monkey name = "monkey hide" desc = "The by-product of monkey farming." singular_name = "monkey hide piece" icon_state = "sheet-monkey" -/obj/item/stack/material/animalhide/monkey +/obj/item/stack/animalhide/monkey amount = 50 -/obj/item/stack/material/animalhide/lizard +/obj/item/stack/animalhide/lizard name = "lizard skin" desc = "Sssssss..." singular_name = "lizard skin piece" icon_state = "sheet-lizard" -/obj/item/stack/material/animalhide/lizard +/obj/item/stack/animalhide/lizard amount = 50 -/obj/item/stack/material/animalhide/xeno +/obj/item/stack/animalhide/xeno name = "alien hide" desc = "The skin of a terrible creature." singular_name = "alien hide piece" icon_state = "sheet-xeno" -/obj/item/stack/material/animalhide/xeno +/obj/item/stack/animalhide/xeno amount = 50 //don't see anywhere else to put these, maybe together they could be used to make the xenos suit? -/obj/item/stack/material/xenochitin +/obj/item/stack/xenochitin name = "alien chitin" desc = "A piece of the hide of a terrible creature." singular_name = "alien hide piece" icon = 'icons/mob/alien.dmi' icon_state = "chitin" -/obj/item/stack/material/xenochitin +/obj/item/stack/xenochitin amount = 50 /obj/item/xenos_claw @@ -77,17 +77,17 @@ icon = 'icons/mob/alien.dmi' icon_state = "weed_extract" -/obj/item/stack/material/hairlesshide +/obj/item/stack/hairlesshide name = "hairless hide" desc = "This hide was stripped of it's hair, but still needs tanning." singular_name = "hairless hide piece" icon_state = "sheet-hairlesshide" no_variants = FALSE -/obj/item/stack/material/hairlesshide +/obj/item/stack/hairlesshide amount = 50 -/obj/item/stack/material/wetleather +/obj/item/stack/wetleather name = "wet leather" desc = "This leather has been cleaned but still needs to be dried." singular_name = "wet leather piece" @@ -96,11 +96,11 @@ var/drying_threshold_temperature = 500 //Kelvin to start drying no_variants = FALSE -/obj/item/stack/material/wetleather +/obj/item/stack/wetleather amount = 50 //Step one - dehairing. -/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/stack/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob) if( istype(W, /obj/item/weapon/material/knife) || \ istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \ istype(W, /obj/item/weapon/material/knife/machete/hatchet) ) @@ -110,13 +110,13 @@ if(do_after(user,50)) to_chat(usr, "You cut the hair from this [src.singular_name]") //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/material/hairlesshide/HS in usr.loc) + for(var/obj/item/stack/hairlesshide/HS in usr.loc) if(HS.amount < 50) HS.amount++ src.use(1) break //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/material/hairlesshide/HS = new(usr.loc) + var/obj/item/stack/hairlesshide/HS = new(usr.loc) HS.amount = 1 src.use(1) else @@ -126,7 +126,7 @@ //Step two - washing..... it's actually in washing machine code. //Step three - drying -/obj/item/stack/material/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/item/stack/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() if(exposed_temperature >= drying_threshold_temperature) wetness-- diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 7e89f96807..eb432d63c1 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -181,7 +181,7 @@ bullets-- D.icon_state = "foamdart" D.name = "foam dart" - playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) + playsound(src, 'sound/items/syringeproj.ogg', 50, 1) for(var/i=0, i<6, i++) if (D) @@ -229,7 +229,7 @@ O.show_message(text("\The [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull", 2) O.show_message(text("\The [] was hit in the head by the foam dart!", M), 1) - playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) + playsound(src, 'sound/items/syringeproj.ogg', 50, 1) new /obj/item/toy/ammo/crossbow(M.loc) src.bullets-- else if (M.lying && src.bullets == 0) @@ -278,12 +278,12 @@ src.active = !( src.active ) if (src.active) to_chat(user, "You extend the plastic blade with a quick flick of your wrist.") - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + playsound(src, 'sound/weapons/saberon.ogg', 50, 1) src.item_state = "[icon_state]_blade" src.w_class = ITEMSIZE_LARGE else to_chat(user, "You push the plastic blade back down into the handle.") - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) src.item_state = "[icon_state]" src.w_class = ITEMSIZE_SMALL update_icon() @@ -397,7 +397,7 @@ /obj/item/toy/bosunwhistle/attack_self(mob/user as mob) if(cooldown < world.time - 35) to_chat(user, "You blow on [src], creating an ear-splitting noise!") - playsound(user, 'sound/misc/boatswain.ogg', 20, 1) + playsound(src, 'sound/misc/boatswain.ogg', 20, 1) cooldown = world.time /* @@ -413,14 +413,14 @@ /obj/item/toy/prize/attack_self(mob/user as mob) if(cooldown < world.time - 8) to_chat(user, "You play with [src].") - playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) + playsound(src, 'sound/mecha/mechstep.ogg', 20, 1) cooldown = world.time /obj/item/toy/prize/attack_hand(mob/user as mob) if(loc == user) if(cooldown < world.time - 8) to_chat(user, "You play with [src].") - playsound(user, 'sound/mecha/mechturn.ogg', 20, 1) + playsound(src, 'sound/mecha/mechturn.ogg', 20, 1) cooldown = world.time return ..() @@ -499,7 +499,7 @@ if(cooldown < world.time) cooldown = (world.time + 30) //3 second cooldown user.visible_message("The [src] says \"[toysay]\".") - playsound(user, 'sound/machines/click.ogg', 20, 1) + playsound(src, 'sound/machines/click.ogg', 20, 1) /obj/item/toy/figure/cmo name = "Chief Medical Officer action figure" @@ -753,12 +753,12 @@ // Attack mob /obj/item/toy/plushie/carp/attack(mob/M as mob, mob/user as mob) - playsound(loc, bitesound, 20, 1) // Play bite sound in local area + playsound(src, bitesound, 20, 1) // Play bite sound in local area return ..() // Attack self /obj/item/toy/plushie/carp/attack_self(mob/user as mob) - playsound(src.loc, bitesound, 20, 1) + playsound(src, bitesound, 20, 1) return ..() @@ -1371,7 +1371,7 @@ if(!cooldown) //for the sanity of everyone var/message = generate_ion_law() to_chat(user, "You press the button on [src].") - playsound(user, 'sound/machines/click.ogg', 20, 1) + playsound(src, 'sound/machines/click.ogg', 20, 1) visible_message("[message]") cooldown = 1 spawn(30) cooldown = 0 @@ -1390,7 +1390,7 @@ if(!cooldown) //for the sanity of everyone var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") to_chat(user, "You pull the string on the [src].") - //playsound(user, 'sound/misc/hoot.ogg', 25, 1) + //playsound(src, 'sound/misc/hoot.ogg', 25, 1) visible_message("[message]") cooldown = 1 spawn(30) cooldown = 0 @@ -1409,7 +1409,7 @@ if(!cooldown) //for the sanity of everyone var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") to_chat(user, "You pull the string on the [src].") - //playsound(user, 'sound/misc/caw.ogg', 25, 1) + //playsound(src, 'sound/misc/caw.ogg', 25, 1) visible_message("[message]") cooldown = 1 spawn(30) cooldown = 0 diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm new file mode 100644 index 0000000000..2b323e4898 --- /dev/null +++ b/code/game/objects/items/uav.dm @@ -0,0 +1,348 @@ +#define UAV_OFF 0 +#define UAV_ON 1 +#define UAV_PAIRING 2 +#define UAV_PACKED 3 + +/obj/item/device/uav + name = "recon skimmer" + desc = "A semi-portable reconnaissance drone that folds into a backpack-sized carrying case." + icon = 'icons/obj/uav.dmi' + icon_state = "uav" + + var/obj/item/weapon/cell/cell + var/cell_type = null //Can put a starting cell here + + density = 1 //Is dense, but not anchored, so you can swap with it + slowdown = 3 //Heevvee. + + health = 100 + var/power_per_process = 50 // About 6.5 minutes of use on a high-cell (10,000) + var/state = UAV_OFF + + var/datum/effect/effect/system/ion_trail_follow/ion_trail + + var/list/mob/living/masters + + // So you know which is which + var/nickname = "Generic Droan" + + // Radial menu + var/static/image/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup") + var/static/image/radial_wrench = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_wrench") + var/static/image/radial_power = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_power") + var/static/image/radial_pair = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pair") + + // Movement cooldown + var/next_move = 0 + + // Idle shutdown time + var/no_masters_time = 0 + +/obj/item/device/uav/loaded + cell_type = /obj/item/weapon/cell/high + +/obj/item/device/uav/Initialize() + . = ..() + + if(!cell && cell_type) + cell = new cell_type + + ion_trail = new /datum/effect/effect/system/ion_trail_follow() + ion_trail.set_up(src) + ion_trail.stop() + +/obj/item/device/uav/Destroy() + qdel_null(cell) + qdel_null(ion_trail) + LAZYCLEARLIST(masters) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/device/uav/attack_hand(var/mob/user) + //Has to be on the ground to work with it properly + if(!isturf(loc)) + return ..() + + var/list/options = list( + "Pick Up" = radial_pickup, + "(Dis)Assemble" = radial_wrench, + "Toggle Power" = radial_power, + "Pairing Mode" = radial_pair) + var/choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + + switch(choice) + // Can pick up when off or packed + if("Pick Up") + if(state == UAV_OFF || state == UAV_PACKED) + return ..() + else + to_chat(user,"Turn [nickname] off or pack it first!") + return + // Can disasemble or reassemble from packed or off (and this one takes time) + if("(Dis)Assemble") + if(can_transition_to(state == UAV_PACKED ? UAV_OFF : UAV_PACKED, user) && do_after(user, 10 SECONDS, src)) + return toggle_packed(user) + // Can toggle power from on and off + if("Toggle Power") + if(can_transition_to(state == UAV_ON ? UAV_OFF : UAV_ON, user)) + return toggle_power(user) + // Can pair when off + if("Pairing Mode") + if(can_transition_to(state == UAV_PAIRING ? UAV_OFF : UAV_PAIRING, user)) + return toggle_pairing(user) + +/obj/item/device/uav/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/modular_computer) && state == UAV_PAIRING) + var/obj/item/modular_computer/MC = I + LAZYDISTINCTADD(MC.paired_uavs, weakref(src)) + playsound(src, 'sound/machines/buttonbeep.ogg', 50, 1) + visible_message("[user] pairs [I] to [nickname]") + toggle_pairing() + + else if(I.is_screwdriver() && cell) + if(do_after(user, 3 SECONDS, src)) + to_chat(user, "You remove [cell] into [nickname].") + playsound(src, I.usesound, 50, 1) + power_down() + cell.forceMove(get_turf(src)) + cell = null + + else if(istype(I, /obj/item/weapon/cell) && !cell) + if(do_after(user, 3 SECONDS, src)) + to_chat(user, "You insert [I] into [nickname].") + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + power_down() + user.remove_from_mob(I) + I.forceMove(src) + cell = I + + else if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) + var/tmp_label = sanitizeSafe(input(user, "Enter a nickname for [src]", "Nickname", nickname), MAX_NAME_LEN) + if(length(tmp_label) > 50 || length(tmp_label) < 3) + to_chat(user, "The nickname must be between 3 and 50 characters.") + else + to_chat(user, "You scribble your new nickname on the side of [src].") + nickname = tmp_label + desc = initial(desc) + " This one has '[nickname]' scribbled on the side." + else + return ..() + +/obj/item/device/uav/proc/can_transition_to(var/new_state, var/mob/user) + switch(state) //Current one + if(UAV_ON) + if(new_state == UAV_OFF || new_state == UAV_PACKED) + . = TRUE + if(UAV_OFF) + if(new_state == UAV_ON || new_state == UAV_PACKED || new_state == UAV_PAIRING) + . = TRUE + if(UAV_PAIRING) + if(new_state == UAV_OFF) + . = TRUE + if(UAV_PACKED) + if(new_state == UAV_OFF) + . = TRUE + + if(!.) + if(user) + to_chat(user, "You can't do that while [nickname] is in this state.") + return FALSE + +/obj/item/device/uav/update_icon() + cut_overlays() + switch(state) + if(UAV_PAIRING) + add_overlay("[initial(icon_state)]_pairing") + icon_state = "[initial(icon_state)]" + if(UAV_ON) + icon_state = "[initial(icon_state)]_on" + if(UAV_OFF) + icon_state = "[initial(icon_state)]" + if(UAV_PACKED) + icon_state = "[initial(icon_state)]_packed" + +/obj/item/device/uav/process() + if(cell?.use(power_per_process) != power_per_process) + visible_message("[src] sputters and thuds to the ground, inert.") + playsound(src, 'sound/items/drop/metalboots.ogg', 75, 1) + power_down() + health -= initial(health)*0.25 //Lose 25% of your original health + + if(LAZYLEN(masters)) + no_masters_time = 0 + else if(no_masters_time++ > 50) + power_down() + +/obj/item/device/uav/proc/toggle_pairing() + switch(state) + if(UAV_PAIRING) + state = UAV_OFF + update_icon() + return TRUE + if(UAV_OFF) + state = UAV_PAIRING + update_icon() + return TRUE + return FALSE + +/obj/item/device/uav/proc/toggle_power() + switch(state) + if(UAV_OFF) + power_up() + return TRUE + if(UAV_ON) + power_down() + return TRUE + return FALSE + +/obj/item/device/uav/proc/toggle_packed() + if(UAV_ON) + power_down() + switch(state) + if(UAV_OFF) //Packing + state = UAV_PACKED + w_class = ITEMSIZE_LARGE + slowdown = 1 + density = FALSE + update_icon() + return TRUE + if(UAV_PACKED) //Unpacking + state = UAV_OFF + w_class = ITEMSIZE_HUGE + slowdown = 3 + density = TRUE + update_icon() + return TRUE + return FALSE + +/obj/item/device/uav/proc/power_up() + if(state != UAV_OFF || !isturf(loc)) + return + if(cell?.use(power_per_process) != power_per_process) + visible_message("[src] sputters and chugs as it tries, and fails, to power up.") + return + + state = UAV_ON + update_icon() + start_hover() + set_light(4, 4, "#FFFFFF") + START_PROCESSING(SSobj, src) + no_masters_time = 0 + visible_message("[nickname] buzzes and lifts into the air.") + +/obj/item/device/uav/proc/power_down() + if(state != UAV_ON) + return + + state = UAV_OFF + update_icon() + stop_hover() + set_light(0) + LAZYCLEARLIST(masters) + STOP_PROCESSING(SSobj, src) + visible_message("[nickname] gracefully settles onto the ground.") + +//////////////// Helpers +/obj/item/device/uav/get_cell() + return cell + +/obj/item/device/uav/relaymove(var/mob/user, direction, signal = 1) + if(signal && state == UAV_ON && (weakref(user) in masters)) + if(next_move <= world.time) + next_move = world.time + (1 SECOND/signal) + step(src, direction) + return TRUE // Even if we couldn't step, we're taking credit for absorbing the move + return FALSE + +/obj/item/device/uav/proc/get_status_string() + return "[nickname] - [get_x(src)],[get_y(src)],[get_z(src)] - I:[health]/[initial(health)] - C:[cell ? "[cell.charge]/[cell.maxcharge]" : "Not Installed"]" + +/obj/item/device/uav/proc/add_master(var/mob/living/M) + LAZYDISTINCTADD(masters, weakref(M)) + +/obj/item/device/uav/proc/remove_master(var/mob/living/M) + LAZYREMOVE(masters, weakref(M)) + +/obj/item/device/uav/check_eye() + if(state == UAV_ON) + return 0 + else + return -1 + +/obj/item/device/uav/proc/start_hover() + if(!ion_trail.on) //We'll just use this to store if we're floating or not + ion_trail.start() + var/amplitude = 2 //maximum displacement from original position + var/period = 36 //time taken for the mob to go up >> down >> original position, in deciseconds. Should be multiple of 4 + + var/top = old_y + amplitude + var/bottom = old_y - amplitude + var/half_period = period / 2 + var/quarter_period = period / 4 + + animate(src, pixel_y = top, time = quarter_period, easing = SINE_EASING | EASE_OUT, loop = -1) //up + animate(pixel_y = bottom, time = half_period, easing = SINE_EASING, loop = -1) //down + animate(pixel_y = old_y, time = quarter_period, easing = SINE_EASING | EASE_IN, loop = -1) //back + +/obj/item/device/uav/proc/stop_hover() + if(ion_trail.on) + ion_trail.stop() + animate(src, pixel_y = old_y, time = 5, easing = SINE_EASING | EASE_IN) //halt animation + +/obj/item/device/uav/hear_talk(var/mob/M, list/message_pieces, verb) + var/name_used = M.GetVoice() + for(var/wr_master in masters) + var/weakref/wr = wr_master + var/mob/master = wr.resolve() + var/message = master.combine_message(message_pieces, verb, M) + var/rendered = "UAV received: [name_used] [message]" + master.show_message(rendered, 2) + +/obj/item/device/uav/see_emote(var/mob/living/M, text) + for(var/wr_master in masters) + var/weakref/wr = wr_master + var/mob/master = wr.resolve() + var/rendered = "UAV received, [text]" + master.show_message(rendered, 2) + +/obj/item/device/uav/show_message(msg, type, alt, alt_type) + for(var/wr_master in masters) + var/weakref/wr = wr_master + var/mob/master = wr.resolve() + var/rendered = "UAV received, [msg]" + master.show_message(rendered, type) + +/obj/item/device/uav/take_damage(var/damage) + health -= damage + CheckHealth() + return + +/obj/item/device/uav/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + user.do_attack_animation(src) + health -= damage + CheckHealth() + return + +/obj/item/device/uav/ex_act(severity) + switch(severity) + if(1.0) + die() + if(2.0) + health -= 25 + CheckHealth() + +/obj/item/device/uav/proc/CheckHealth() + if(health <= 0) + die() + +/obj/item/device/uav/proc/die() + visible_message("[src] shorts out and explodes!") + power_down() + var/turf/T = get_turf(src) + qdel(src) + explosion(T, -1, 0, 1, 2) //Not very large + +#undef UAV_OFF +#undef UAV_ON +#undef UAV_PACKED \ No newline at end of file diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index bafe4878f9..2dbd4aa082 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -57,7 +57,7 @@ stored_matter += cartridge.remaining user.drop_from_inventory(W) qdel(W) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) to_chat(user, span("notice", "The RCD now holds [stored_matter]/[max_stored_matter] matter-units.")) return TRUE return ..() @@ -70,7 +70,7 @@ mode_index++ to_chat(user, span("notice", "Changed mode to '[modes[mode_index]]'.")) - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + playsound(src, 'sound/effects/pop.ogg', 50, 0) if(prob(20)) src.spark_system.start() @@ -106,7 +106,7 @@ to_chat(user, span("warning", "\The [src] lacks the required material to start.")) return FALSE - playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) var/true_delay = rcd_results[RCD_VALUE_DELAY] * toolspeed @@ -126,7 +126,7 @@ return FALSE if(A.rcd_act(user, src, rcd_results[RCD_VALUE_MODE])) consume_resources(rcd_results[RCD_VALUE_COST]) - playsound(get_turf(A), 'sound/items/deconstruct.ogg', 50, 1) + playsound(A, 'sound/items/deconstruct.ogg', 50, 1) return TRUE // If they moved, kill the beam immediately. diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 724e85e1f6..3059e5af7f 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -48,7 +48,7 @@ RSF qdel(W) stored_matter += 10 - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) to_chat(user,"The RSF now holds [stored_matter]/30 fabrication-units.") return @@ -64,7 +64,7 @@ RSF glasstype = /obj/item/weapon/reagent_containers/food/drinks/metaglass /obj/item/weapon/rsf/attack_self(mob/user as mob) - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + playsound(src, 'sound/effects/pop.ogg', 50, 0) if (mode == 1) mode = 2 to_chat(user,"Changed dispensing mode to 'Container'.") @@ -101,7 +101,7 @@ RSF if(!istype(A, /obj/structure/table) && !istype(A, /turf/simulated/floor)) return - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) var/used_energy = 0 var/obj/product diff --git a/code/game/objects/items/weapons/canes.dm b/code/game/objects/items/weapons/canes.dm index f7688fb2d1..5b7f346684 100644 --- a/code/game/objects/items/weapons/canes.dm +++ b/code/game/objects/items/weapons/canes.dm @@ -33,7 +33,7 @@ if(concealed_blade) user.visible_message("[user] has unsheathed \a [concealed_blade] from [T.his] [src]!", "You unsheathe \the [concealed_blade] from \the [src].") // Calling drop/put in hands to properly call item drop/pickup procs - playsound(user.loc, 'sound/weapons/holster/sheathout.ogg', 50, 1) + playsound(src, 'sound/weapons/holster/sheathout.ogg', 50, 1) user.drop_from_inventory(src) user.put_in_hands(concealed_blade) user.put_in_hands(src) @@ -47,7 +47,7 @@ if(!src.concealed_blade && istype(W)) var/datum/gender/T = gender_datums[user.get_visible_gender()] user.visible_message("[user] has sheathed \a [W] into [T.his] [src]!", "You sheathe \the [W] into \the [src].") - playsound(user.loc, 'sound/weapons/holster/sheathin.ogg', 50, 1) + playsound(src, 'sound/weapons/holster/sheathin.ogg', 50, 1) user.drop_from_inventory(W) W.loc = src src.concealed_blade = W @@ -119,6 +119,6 @@ H.update_inv_l_hand() H.update_inv_r_hand() - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) add_fingerprint(user) return TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index b6952198bd..46f9a34f4d 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -193,7 +193,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/proc/die(var/nomessage = 0) var/turf/T = get_turf(src) set_light(0) - playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) + playsound(src, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) STOP_PROCESSING(SSobj, src) if (type_butt) var/obj/item/butt = new type_butt(T) @@ -215,7 +215,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/mob/living/M = loc if (!nomessage) to_chat(M, "Your [name] goes out, and you empty the ash.") - playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) + playsound(src, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) lit = 0 icon_state = initial(icon_state) item_state = initial(item_state) @@ -333,7 +333,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(lit == 1) if(user.a_intent == I_HURT) user.visible_message("[user] drops and treads on the lit [src], putting it out instantly.") - playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) + playsound(src, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) die(1) else user.visible_message("[user] puts out \the [src].") @@ -427,7 +427,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(lit == 1) if(user.a_intent == I_HURT) user.visible_message("[user] empties the lit [src] on the floor!.") - playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) + playsound(src, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) die(1) else user.visible_message("[user] puts out \the [src].") @@ -552,7 +552,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM lit = 1 icon_state = "[base_state]on" item_state = "[base_state]on" - playsound(src.loc, activation_sound, 75, 1) + playsound(src, activation_sound, 75, 1) if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") else @@ -572,7 +572,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM lit = 0 icon_state = "[base_state]" item_state = "[base_state]" - playsound(src.loc, deactivation_sound, 75, 1) + playsound(src, deactivation_sound, 75, 1) if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.") else diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 1f53e64e77..73604b49f9 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -71,7 +71,7 @@ /obj/item/weapon/bikehorn/attack_self(mob/user as mob) if (spam_flag == 0) spam_flag = 1 - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) + playsound(src, 'sound/items/bikehorn.ogg', 50, 1) src.add_fingerprint(user) spawn(20) spam_flag = 0 diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 5e7b54c9eb..e9951c83d4 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -75,7 +75,7 @@ var/obj/o = target var/amount = o.reagents.trans_to_obj(src, 50) to_chat(user, "You fill [src] with [amount] units of the contents of [target].") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) return if (!safety) @@ -88,7 +88,7 @@ src.last_use = world.time - playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3) + playsound(src, 'sound/effects/extinguish.ogg', 75, 1, -3) var/direction = get_dir(src,target) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 94ca8b7cd2..88d9b0ff5d 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -27,7 +27,7 @@ /obj/item/weapon/gift/attack_self(mob/user as mob) user.drop_item() - playsound(src.loc, 'sound/items/package_unwrap.ogg', 50,1) + playsound(src, 'sound/items/package_unwrap.ogg', 50,1) if(src.gift) user.put_in_active_hand(gift) src.gift.add_fingerprint(user) diff --git a/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm index 6646e698f9..fe4d80418d 100644 --- a/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm +++ b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm @@ -7,7 +7,7 @@ origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4) /obj/item/weapon/grenade/anti_photon/detonate() - playsound(src.loc, 'sound/effects/phasein.ogg', 50, 1, 5) + playsound(src, 'sound/effects/phasein.ogg', 50, 1, 5) set_light(10, -10, "#FFFFFF") var/extra_delay = rand(0,90) @@ -18,5 +18,5 @@ set_light(10, 10, "#[num2hex(rand(64,255))][num2hex(rand(64,255))][num2hex(rand(64,255))]") spawn(210) ..() - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) + playsound(src, 'sound/effects/bang.ogg', 50, 1, 5) qdel(src) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 157c64f09f..cb3184a7f6 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -63,7 +63,7 @@ return path = 1 to_chat(user, "You add [W] to the metal casing.") - playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3) + playsound(src, 'sound/items/Screwdriver2.ogg', 25, -3) user.remove_from_mob(det) det.loc = src detonator = det @@ -96,7 +96,7 @@ return else to_chat(user, "You unlock the assembly.") - playsound(src.loc, W.usesound, 50, -3) + playsound(src, W.usesound, 50, -3) name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" icon_state = initial(icon_state) + (detonator?"_ass":"") stage = 1 @@ -154,7 +154,7 @@ active = 0 if(!has_reagents) icon_state = initial(icon_state) +"_locked" - playsound(src.loc, 'sound/items/Screwdriver2.ogg', 50, 1) + playsound(src, 'sound/items/Screwdriver2.ogg', 50, 1) spawn(0) //Otherwise det_time is erroneously set to 0 after this if(istimer(detonator.a_left)) //Make sure description reflects that the timer has been reset var/obj/item/device/assembly/timer/T = detonator.a_left @@ -164,7 +164,7 @@ det_time = 10*T.time return - playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1) + playsound(src, 'sound/effects/bamf.ogg', 50, 1) for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.reagents.trans_to_obj(src, G.reagents.total_volume) diff --git a/code/game/objects/items/weapons/grenades/concussion.dm b/code/game/objects/items/weapons/grenades/concussion.dm index 073b5ed9d1..fb821ab6f8 100644 --- a/code/game/objects/items/weapons/grenades/concussion.dm +++ b/code/game/objects/items/weapons/grenades/concussion.dm @@ -19,7 +19,7 @@ if(is_below_sound_pressure(T)) visible_message("Whump.") return - playsound(src.loc, 'sound/effects/bang.ogg', 75, 1, -3) + playsound(src, 'sound/effects/bang.ogg', 75, 1, -3) if(istype(T)) for(var/mob/living/L in orange(T, radius)) if(ishuman(L)) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 087265ca5b..e2d095e0e1 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -29,7 +29,7 @@ /obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. to_chat(M, "BANG") // Called during the loop that bangs people in lockers/containers and when banging - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 30) // people in normal view. Could theroetically be called during other explosions. + playsound(src, 'sound/effects/bang.ogg', 50, 1, 30) // people in normal view. Could theroetically be called during other explosions. // -- Polymorph //Checking for protections @@ -119,11 +119,11 @@ for(var/do_spawn = numspawned, do_spawn > 0, do_spawn--) new /obj/item/weapon/grenade/flashbang/cluster(src.loc)//Launches flashbangs - playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3) for(var/do_again = again, do_again > 0, do_again--) new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs - playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3) qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index fdab7aaf39..7ac049a774 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -33,7 +33,7 @@ to_chat(user, "You prime the [name]! [det_time/10] seconds!") active = 1 icon_state = initial(icon_state) + "_active" - playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3) spawn(det_time) detonate() return @@ -75,7 +75,7 @@ icon_state = initial(icon_state) + "_active" active = 1 - playsound(loc, arm_sound, 75, 1, -3) + playsound(src, arm_sound, 75, 1, -3) spawn(det_time) detonate() @@ -83,7 +83,7 @@ /obj/item/weapon/grenade/proc/detonate() -// playsound(loc, 'sound/items/Welder2.ogg', 25, 1) +// playsound(src, 'sound/items/Welder2.ogg', 25, 1) var/turf/T = get_turf(src) if(T) T.hotspot_expose(700,125) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 28540b981f..75c0e6a299 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -21,7 +21,7 @@ return ..() /obj/item/weapon/grenade/smokebomb/detonate() - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3) src.smoke.set_up(10, 0, usr.loc) spawn(0) for(var/i = 1 to smoke_strength) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 5cab658098..5f1bd4503b 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -15,7 +15,7 @@ if(spawner_type && deliveryamt) // Make a quick flash var/turf/T = get_turf(src) - playsound(T, 'sound/effects/phasein.ogg', 100, 1) + playsound(src, 'sound/effects/phasein.ogg', 100, 1) for(var/mob/living/carbon/human/M in viewers(T, null)) if(M:eyecheck() <= 0) M.flash_eyes() diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 753f72a809..d50e42981e 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -60,7 +60,7 @@ return 0 /obj/item/weapon/handcuffs/proc/place_handcuffs(var/mob/living/carbon/target, var/mob/user) - playsound(src.loc, cuff_sound, 30, 1, -2) + playsound(src, cuff_sound, 30, 1, -2) var/mob/living/carbon/human/H = target if(!istype(H)) @@ -98,7 +98,7 @@ user.drop_from_inventory(cuffs) cuffs.loc = target target.handcuffed = cuffs - target.update_inv_handcuffed() + target.update_handcuffed() target.drop_r_hand() target.drop_l_hand() target.stop_pulling() @@ -244,7 +244,7 @@ var/last_chew = 0 to_chat(user, "You need to have a firm grip on [C] before you can put \the [src] on!") /obj/item/weapon/handcuffs/legcuffs/proc/place_legcuffs(var/mob/living/carbon/target, var/mob/user) - playsound(src.loc, cuff_sound, 30, 1, -2) + playsound(src, cuff_sound, 30, 1, -2) var/mob/living/carbon/human/H = target if(!istype(H)) @@ -315,7 +315,7 @@ var/last_chew = 0 qdel(src) /obj/item/weapon/handcuffs/legcuffs/bola/place_legcuffs(var/mob/living/carbon/target, var/mob/user) - playsound(src.loc, cuff_sound, 30, 1, -2) + playsound(src, cuff_sound, 30, 1, -2) var/mob/living/carbon/human/H = target if(!istype(H)) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 34f44ffc8d..81d5bb8f04 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -252,7 +252,7 @@ Implant Specifics:
"} if (elevel == "Localized Limb") if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste. imp_in.visible_message("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") - playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) + playsound(src, 'sound/items/countdown.ogg', 75, 1, -3) sleep(25) if (istype(part,/obj/item/organ/external/chest) || \ istype(part,/obj/item/organ/external/groin) || \ @@ -325,7 +325,7 @@ Implant Specifics:
"} /obj/item/weapon/implant/explosive/proc/small_boom() if (ishuman(imp_in) && part) imp_in.visible_message("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") - playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) + playsound(src, 'sound/items/countdown.ogg', 75, 1, -3) spawn(25) if (ishuman(imp_in) && part) //No tearing off these parts since it's pretty much killing diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index b55274cc92..6e4f5f7a16 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -27,7 +27,7 @@ source.handcuffed = null if(source.buckled && source.buckled.buckle_require_restraints) source.buckled.unbuckle_mob() - source.update_inv_handcuffed() + source.update_handcuffed() if (source.client) source.client.screen -= W if (W) diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index fe99fad674..8ba5f20695 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -53,7 +53,7 @@ obj/item/weapon/chainsaw/proc/turnOff(mob/user as mob) if(!on) return to_chat(user, "You switch the gas nozzle on the chainsaw, turning it off.") attack_verb = list("bluntly hit", "beat", "knocked") - playsound(user, 'sound/weapons/chainsaw_turnoff.ogg',40,1) + playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',40,1) force = inactive_force edge = 0 sharp = 0 @@ -93,7 +93,7 @@ obj/item/weapon/chainsaw/afterattack(atom/A as mob|obj|turf|area, mob/user as mo to_chat(user, "You begin filling the tank on the chainsaw.") if(do_after(usr, 15)) A.reagents.trans_to_obj(src, max_fuel) - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) to_chat(user, "Chainsaw succesfully refueled.") else to_chat(user, "Don't move while you're refilling the chainsaw.") diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index b2369f995d..4464084f85 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -46,7 +46,7 @@ if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) return M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].") - playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) + playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1) overlays.Cut() return else diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 099edd65c4..c06e80becf 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -46,7 +46,7 @@ active = !active if(active) to_chat(user, "You flip out \the [src].") - playsound(user, 'sound/weapons/flipblade.ogg', 15, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 15, 1) else to_chat(user, "\The [src] can now be concealed.") update_force() diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm index d981cafc07..91aca12dc1 100644 --- a/code/game/objects/items/weapons/material/material_armor.dm +++ b/code/game/objects/items/weapons/material/material_armor.dm @@ -125,7 +125,7 @@ Protectiveness | Armor % var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/effects/teleport.ogg', 50, 1) + playsound(src, 'sound/effects/teleport.ogg', 50, 1) user.loc = picked return PROJECTILE_FORCE_MISS diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index e2394537f3..19eaf7f776 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -102,7 +102,7 @@ if(will_break && src.loc == user) // If it's not in our hand anymore user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!") - playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) + playsound(src, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) qdel(src) return @@ -116,7 +116,7 @@ if(M.buckled) //wheelchairs, office chairs, rollerbeds return - playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds + playsound(src, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index 3affd40887..ba0fe4ddfe 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -14,7 +14,7 @@ /obj/item/weapon/material/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(unique_parry_check(user, attacker, damage_source) && prob(50)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") - playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) + playsound(src, 'sound/weapons/punchmiss.ogg', 50, 1) return 1 return 0 diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 244b2c6001..e2d5e94118 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -61,7 +61,7 @@ /obj/item/weapon/material/twohanded/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(wielded && default_parry_check(user, attacker, damage_source) && prob(15)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") - playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) + playsound(src, 'sound/weapons/punchmiss.ogg', 50, 1) return 1 return 0 diff --git a/code/game/objects/items/weapons/material/twohanded.dm.orig b/code/game/objects/items/weapons/material/twohanded.dm.orig index 01f4ee7e55..47d4f230c6 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm.orig +++ b/code/game/objects/items/weapons/material/twohanded.dm.orig @@ -159,18 +159,8 @@ if(istype(A,/obj/structure/window)) var/obj/structure/window/W = A W.shatter() -<<<<<<< HEAD:code/game/objects/items/weapons/material/twohanded.dm /* -======= - else if(istype(A,/obj/structure/grille)) - qdel(A) - else if(istype(A,/obj/effect/plant)) - var/obj/effect/plant/P = A - P.die_off() - - qdel(A) ->>>>>>> 284d1cc1f5c67503fe0da89ce01985d73bb02038:code/game/objects/items/weapons/twohanded.dm /* * Double-Bladed Energy Swords - Cheridan */ diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 21d4d53a5c..7153ebfa60 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -57,14 +57,14 @@ sharp = 1 edge = 1 w_class = active_w_class - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + playsound(src, 'sound/weapons/saberon.ogg', 50, 1) update_icon() set_light(lrange, lpower, lcolor) /obj/item/weapon/melee/energy/proc/deactivate(mob/living/user) if(!active) return - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) item_state = "[icon_state]" active = 0 embed_chance = initial(embed_chance) @@ -310,7 +310,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return 1 if(active && unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance)) user.visible_message("\The [user] deflects [attack_text] with \the [src]!") @@ -318,7 +318,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return 1 return 0 @@ -370,7 +370,7 @@ // EMP stuff. var/obj/O = AM O.emp_act(3) // A weaker severity is used because this has infinite uses. - playsound(get_turf(O), 'sound/effects/EMPulse.ogg', 100, 1) + playsound(O, 'sound/effects/EMPulse.ogg', 100, 1) user.setClickCooldown(user.get_attack_speed(src)) // A lot of objects don't set click delay. return ..() @@ -379,9 +379,9 @@ if(target.isSynthetic() && active) // Do some extra damage. Not a whole lot more since emp_act() is pretty nasty on FBPs already. target.emp_act(3) // A weaker severity is used because this has infinite uses. - playsound(get_turf(target), 'sound/effects/EMPulse.ogg', 100, 1) + playsound(target, 'sound/effects/EMPulse.ogg', 100, 1) target.adjustFireLoss(force * 3) // 15 Burn, for 20 total. - playsound(get_turf(target), 'sound/weapons/blade1.ogg', 100, 1) + playsound(target, 'sound/weapons/blade1.ogg', 100, 1) // Make lesser robots really mad at us. if(target.mob_class & MOB_CLASS_SYNTHETIC) @@ -481,7 +481,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return 1 if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance)) user.visible_message("\The [user] deflects [attack_text] with \the [src]!") @@ -489,7 +489,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return 1 return 0 @@ -547,6 +547,6 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return 1 return 0 diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 7d390d613f..4185cf92c2 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -69,7 +69,7 @@ /obj/item/weapon/melee/cursedblade/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(default_parry_check(user, attacker, damage_source) && prob(50)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") - playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) + playsound(src, 'sound/weapons/punchmiss.ogg', 50, 1) return 1 return 0 diff --git a/code/game/objects/items/weapons/paiwire.dm b/code/game/objects/items/weapons/paiwire.dm index 638d8f51cb..b654c24e67 100644 --- a/code/game/objects/items/weapons/paiwire.dm +++ b/code/game/objects/items/weapons/paiwire.dm @@ -1,7 +1,7 @@ /obj/item/weapon/pai_cable/proc/plugin(obj/machinery/M as obj, mob/user as mob) if(istype(M, /obj/machinery/door) || istype(M, /obj/machinery/camera)) user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") - playsound(user, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) user.drop_item() src.loc = M src.machine = M diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 4d78a09bc5..e4a518e8db 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -94,7 +94,7 @@ return 0 //Otherwise, if we're here, we're gonna stop the attack entirely. user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) return 1 return 0 @@ -102,7 +102,7 @@ if(istype(W, /obj/item/weapon/melee/baton)) if(cooldown < world.time - 25) user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + playsound(src, 'sound/effects/shieldbash.ogg', 50, 1) cooldown = world.time else ..() @@ -144,7 +144,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) /obj/item/weapon/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) if(istype(damage_source, /obj/item/projectile)) @@ -163,7 +163,7 @@ update_icon() w_class = ITEMSIZE_LARGE slot_flags = null - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + playsound(src, 'sound/weapons/saberon.ogg', 50, 1) to_chat(user, "\The [src] is now active.") else @@ -171,7 +171,7 @@ update_icon() w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) to_chat(user, "\The [src] can now be concealed.") if(istype(user,/mob/living/carbon/human)) @@ -240,7 +240,7 @@ /obj/item/weapon/shield/riot/tele/attack_self(mob/living/user) active = !active icon_state = "teleriot[active]" - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) if(active) force = 8 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 88f6caeb74..2cdc341523 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -21,13 +21,13 @@ /obj/item/weapon/storage/backpack/equipped(var/mob/user, var/slot) if (slot == slot_back && src.use_sound) - playsound(src.loc, src.use_sound, 50, 1, -5) + playsound(src, src.use_sound, 50, 1, -5) ..(user, slot) /* /obj/item/weapon/storage/backpack/dropped(mob/user as mob) if (loc == user && src.use_sound) - playsound(src.loc, src.use_sound, 50, 1, -5) + playsound(src, src.use_sound, 50, 1, -5) ..(user) */ diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 0d97b4f878..75cbc2297e 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -35,5 +35,5 @@ /obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob) if (src.use_sound) - playsound(src.loc, src.use_sound, 50, 1, -5) + playsound(src, src.use_sound, 50, 1, -5) ..() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index a1cad988d7..1655cb28a6 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -52,7 +52,7 @@ return // Now make the cardboard to_chat(user, "You fold [src] flat.") - playsound(src.loc, 'sound/items/storage/boxfold.ogg', 30, 1) + playsound(src, 'sound/items/storage/boxfold.ogg', 30, 1) new foldable(get_turf(src)) qdel(src) diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 6fbbedf069..63afc51b4e 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -18,7 +18,7 @@ /obj/item/weapon/storage/internal/attack_hand() return //make sure this is never picked up -/obj/item/weapon/storage/internal/mob_can_equip() +/obj/item/weapon/storage/internal/mob_can_equip(M as mob, slot, disable_warning = FALSE) return 0 //make sure this is never picked up //Helper procs to cleanly implement internal storages - storage items that provide inventory slots for other items. diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 2fa8e54e87..b10caa3610 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -40,8 +40,8 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) if(!locked) ..() else diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index c8bc129e3d..034e37ff8e 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -39,8 +39,8 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) return if (W.is_screwdriver()) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index d14a4ab29b..bfcbd695e5 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -142,7 +142,7 @@ /obj/item/weapon/storage/proc/open(mob/user as mob) if (use_sound) - playsound(src.loc, src.use_sound, 50, 0, -5) + playsound(src, src.use_sound, 50, 0, -5) orient2hud(user) if (user.s_active) @@ -729,3 +729,12 @@ /obj/item/weapon/storage/AllowDrop() return TRUE + +//Useful for spilling the contents of containers all over the floor +/obj/item/weapon/storage/proc/spill(var/dist = 2, var/turf/T = null) + if (!istype(T))//If its not on the floor this might cause issues + T = get_turf(src) + + for (var/obj/O in contents) + remove_from_storage(O, T) + O.tumble(2) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 183366a4c7..87ce75a233 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -148,7 +148,7 @@ if(bcell && bcell.charge > hitcost) status = !status to_chat(user, "[src] is now [status ? "on" : "off"].") - playsound(loc, "sparks", 75, 1, -1) + playsound(src, "sparks", 75, 1, -1) update_icon() else status = 0 @@ -193,7 +193,7 @@ target.visible_message("[target] has been prodded in the [affecting.name] with [src] by [user]!") else target.visible_message("[target] has been prodded with [src] by [user]!") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1) //stun effects if(status) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 204ebb6f89..a4a7992872 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -77,7 +77,7 @@ H.update_inv_l_hand() H.update_inv_r_hand() - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) add_fingerprint(user) if(blood_overlay && blood_DNA && (blood_DNA.len >= 1)) //updates blood overlay, if any @@ -104,7 +104,7 @@ user.take_organ_damage(2*force) return if(..()) - //playsound(src.loc, "swing_hit", 50, 1, -1) + //playsound(src, "swing_hit", 50, 1, -1) return else return ..() diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index c4e273deea..b97f5303df 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -48,7 +48,7 @@ /obj/item/weapon/syndie/c4explosive/proc/detonate() icon_state = "c-4[size]_1" - playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1) + playsound(src, 'sound/weapons/armbomb.ogg', 75, 1) for(var/mob/O in hearers(src, null)) O.show_message("[bicon(src)] The [src.name] beeps! ") sleep(50) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index eec15d1e94..32f6f99b27 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -31,7 +31,7 @@ . = ..() if(air_contents.total_moles < 5) . += "The meter on \the [src] indicates you are almost out of gas!" - playsound(user, 'sound/effects/alert.ogg', 50, 1) + playsound(src, 'sound/effects/alert.ogg', 50, 1) /obj/item/weapon/tank/jetpack/verb/toggle_rockets() set name = "Toggle Jetpack Stabilization" @@ -84,9 +84,8 @@ item_state_slots = list(slot_r_hand_str = "jetpack-void", slot_l_hand_str = "jetpack-void") /obj/item/weapon/tank/jetpack/void/Initialize() - ..() + . = ..() air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/jetpack/oxygen name = "jetpack (oxygen)" @@ -95,9 +94,8 @@ item_state_slots = list(slot_r_hand_str = "jetpack", slot_l_hand_str = "jetpack") /obj/item/weapon/tank/jetpack/oxygen/Initialize() - ..() + . = ..() air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/jetpack/carbondioxide name = "jetpack (carbon dioxide)" @@ -107,9 +105,8 @@ item_state_slots = list(slot_r_hand_str = "jetpack-black", slot_l_hand_str = "jetpack-black") /obj/item/weapon/tank/jetpack/carbondioxide/Initialize() - ..() + . = ..() air_contents.adjust_gas("carbon_dioxide", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/jetpack/rig name = "jetpack" diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index c2a342b618..a838bf6c03 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -17,9 +17,8 @@ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD /obj/item/weapon/tank/oxygen/Initialize() - ..() + . = ..() air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/oxygen/examine(mob/user) . = ..() @@ -43,14 +42,12 @@ icon_state = "anesthetic" /obj/item/weapon/tank/anesthetic/Initialize() - ..() + . = ..() air_contents.gas["oxygen"] = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD air_contents.gas["sleeping_agent"] = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD air_contents.update_values() - return - /* * Air */ @@ -66,12 +63,9 @@ user << sound('sound/effects/alert.ogg') /obj/item/weapon/tank/air/Initialize() - ..() - + . = ..() src.air_contents.adjust_multi("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD, "nitrogen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) - return - /* * Phoron */ @@ -83,10 +77,8 @@ slot_flags = null //they have no straps! /obj/item/weapon/tank/phoron/Initialize() - ..() - + . = ..() src.air_contents.adjust_gas("phoron", (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/phoron/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -109,10 +101,8 @@ slot_flags = SLOT_BACK //these ones have straps! /obj/item/weapon/tank/vox/Initialize() - ..() - + . = ..() air_contents.adjust_gas("phoron", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/phoron/pressurized name = "fuel can" @@ -120,12 +110,9 @@ w_class = ITEMSIZE_NORMAL /obj/item/weapon/tank/phoron/pressurized/Initialize() - ..() - + . = ..() adjust_scale(0.8) - air_contents.adjust_gas("phoron", (7*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /* * Emergency Oxygen @@ -149,9 +136,8 @@ gauge_icon = "indicator_emergency" /obj/item/weapon/tank/emergency/oxygen/Initialize() - ..() + . = ..() src.air_contents.adjust_gas("oxygen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/emergency/oxygen/examine(mob/user) . = ..() @@ -178,9 +164,8 @@ volume = 10 /obj/item/weapon/tank/stasis/oxygen/Initialize() - ..() + . = ..() src.air_contents.adjust_gas("oxygen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/emergency/nitrogen name = "emergency nitrogen tank" @@ -205,7 +190,7 @@ gauge_icon = "indicator_emergency" /obj/item/weapon/tank/emergency/phoron/Initialize() - ..() + . = ..() src.air_contents.adjust_gas("phoron", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/weapon/tank/emergency/phoron/double @@ -224,10 +209,8 @@ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD /obj/item/weapon/tank/nitrogen/Initialize() - ..() - + . = ..() src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)) - return /obj/item/weapon/tank/nitrogen/examine(mob/user) . = ..() @@ -243,6 +226,5 @@ volume = 10 /obj/item/weapon/tank/stasis/nitro_cryo/Initialize() - ..() + . = ..() src.air_contents.adjust_gas_temp("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*TN60C), TN60C) - return diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index b9eeef5629..9957e09f55 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -59,15 +59,13 @@ var/list/global/tank_gauge_cache = list() /obj/item/weapon/tank/Initialize() - ..() + . = ..() src.init_proxy() src.air_contents = new /datum/gas_mixture() src.air_contents.volume = volume //liters src.air_contents.temperature = T20C - START_PROCESSING(SSobj, src) update_gauge() - return /obj/item/weapon/tank/Destroy() QDEL_NULL(air_contents) @@ -81,6 +79,13 @@ var/list/global/tank_gauge_cache = list() . = ..() +/obj/item/weapon/tank/equipped() // Note that even grabbing into a hand calls this, so it should be fine as a 'has a player touched this' + . = ..() + // An attempt at optimization. There are MANY tanks during rounds that will never get touched. + // Don't see why any of those would explode spontaneously. So only tanks that players touch get processed. + // This could be optimized more, but it's a start! + START_PROCESSING(SSobj, src) // This has a built in safety to avoid multi-processing + /obj/item/weapon/tank/examine(mob/user) . = ..() if(loc == user) @@ -466,7 +471,7 @@ var/list/global/tank_gauge_cache = list() if(!T) return T.assume_air(air_contents) - playsound(get_turf(src), 'sound/weapons/Gunshot_shotgun.ogg', 20, 1) + playsound(src, 'sound/weapons/Gunshot_shotgun.ogg', 20, 1) visible_message("[bicon(src)] \The [src] flies apart!", "You hear a bang!") T.hotspot_expose(air_contents.temperature, 70, 1) @@ -513,7 +518,7 @@ var/list/global/tank_gauge_cache = list() T.assume_air(leaked_gas) if(!leaking) visible_message("[bicon(src)] \The [src] relief valve flips open with a hiss!", "You hear hissing.") - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) + playsound(src, 'sound/effects/spray.ogg', 10, 1, -3) leaking = 1 #ifdef FIREDBG log_debug("[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") @@ -673,6 +678,11 @@ var/list/global/tank_gauge_cache = list() tank.update_icon() tank.overlays -= "bomb_assembly" -/obj/item/device/tankassemblyproxy/HasProximity(atom/movable/AM as mob|obj) - if(src.assembly) - src.assembly.HasProximity(AM) +/obj/item/device/tankassemblyproxy/HasProximity(turf/T, atom/movable/AM, old_loc) + assembly?.HasProximity(T, AM, old_loc) + +/obj/item/device/tankassemblyproxy/Moved(old_loc, direction, forced) + if(isturf(old_loc)) + unsense_proximity(callback = .HasProximity, center = old_loc) + if(isturf(loc)) + sense_proximity(callback = .HasProximity) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 03436bafb5..c219c89eb7 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -147,11 +147,11 @@ Frequency: if(com) break break - if (istype(com, /obj/machinery/computer/teleporter) && com.locked && !com.one_time_use) + if (istype(com, /obj/machinery/computer/teleporter) && com.teleport_control.locked && !com.one_time_use) if(R.icon_state == "tele1") - L["[com.id] (Active)"] = com.locked + L["[com.id] (Active)"] = com.teleport_control.locked else - L["[com.id] (Inactive)"] = com.locked + L["[com.id] (Inactive)"] = com.teleport_control.locked var/list/turfs = list( ) for(var/turf/T in orange(10)) if(T.x>world.maxx-8 || T.x<8) continue //putting them at the edge is dumb diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 56afaf8219..a139efe9f6 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -102,7 +102,7 @@ return ..() /obj/item/weapon/tool/crowbar/power/attack_self(mob/user) - playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) + playsound(src, 'sound/items/change_jaws.ogg', 50, 1) user.drop_item(src) counterpart.forceMove(get_turf(src)) src.forceMove(counterpart) diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 8045445ca3..aea17ebf2b 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -107,14 +107,6 @@ random_color = FALSE reach = 2 -/obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver() - if(prob(10)) - var/turf/T = get_turf(src) - SSradiation.radiate(get_turf(src), 5) - T.visible_message("\The [src] shudders!") - return FALSE - return TRUE - /obj/item/weapon/tool/screwdriver/cyborg name = "powered screwdriver" desc = "An electrical screwdriver, designed to be both precise and quick." @@ -154,7 +146,7 @@ return ..() /obj/item/weapon/tool/screwdriver/power/attack_self(mob/user) - playsound(get_turf(user),'sound/items/change_drill.ogg',50,1) + playsound(src,'sound/items/change_drill.ogg',50,1) user.drop_item(src) counterpart.forceMove(get_turf(src)) src.forceMove(counterpart) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index a6e7646022..0c0add9e24 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -146,7 +146,7 @@ if(!welding && max_fuel) O.reagents.trans_to_obj(src, max_fuel) to_chat(user, "Welder refueled") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) return else if(!welding) to_chat(user, "[src] doesn't use fuel.") @@ -273,7 +273,7 @@ to_chat(M, "You switch the [src] on.") else if(T) T.visible_message("\The [src] turns on.") - playsound(loc, acti_sound, 50, 1) + playsound(src, acti_sound, 50, 1) src.force = 15 src.damtype = "fire" src.w_class = ITEMSIZE_LARGE @@ -295,7 +295,7 @@ to_chat(M, "You switch \the [src] off.") else if(T) T.visible_message("\The [src] turns off.") - playsound(loc, deac_sound, 50, 1) + playsound(src, deac_sound, 50, 1) src.force = 3 src.damtype = "brute" src.w_class = initial(src.w_class) @@ -449,11 +449,11 @@ name = "strange welding tool" desc = "An experimental welder capable of synthesizing its own fuel from spatial waveforms. It's like welding with a star!" icon_state = "hybwelder" - max_fuel = 20 + max_fuel = 80 //more max fuel is better! Even if it doesn't actually use fuel. eye_safety_modifier = -2 // Brighter than the sun. Literally, you can look at the sun with a welding mask of proper grade, this will burn through that. slowdown = 0.1 toolspeed = 0.25 - w_class = ITEMSIZE_LARGE + w_class = ITEMSIZE_NORMAL flame_intensity = 5 origin_tech = list(TECH_ENGINEERING = 5, TECH_PHORON = 4, TECH_PRECURSOR = 1) reach = 2 diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index 28e9e8f6cf..3b8c83c1f9 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -37,7 +37,7 @@ C.handcuffed = null if(C.buckled && C.buckled.buckle_require_restraints) C.buckled.unbuckle_mob() - C.update_inv_handcuffed() + C.update_handcuffed() return else ..() @@ -87,14 +87,6 @@ toolspeed = 0.4 reach = 2 -/obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter() - if(prob(10)) - var/turf/T = get_turf(src) - SSradiation.radiate(get_turf(src), 5) - T.visible_message("\The [src] shudders!") - return FALSE - return TRUE - /obj/item/weapon/tool/wirecutters/power name = "jaws of life" desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head." @@ -121,9 +113,9 @@ return ..() /obj/item/weapon/tool/wirecutters/power/attack_self(mob/user) - playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) + playsound(src, 'sound/items/change_jaws.ogg', 50, 1) user.drop_item(src) counterpart.forceMove(get_turf(src)) src.forceMove(counterpart) user.put_in_active_hand(counterpart) - to_chat(user, "You attach the pry jaws to [src].") \ No newline at end of file + to_chat(user, "You attach the pry jaws to [src].") diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 89a51cf217..d96a244282 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -26,7 +26,7 @@ usesound = 'sound/items/drill_use.ogg' toolspeed = 0.5 -/obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach. +/obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach. If reach even worked half the time. name = "strange wrench" desc = "A wrench with many common uses. Can be usually found in your hand." icon = 'icons/obj/tools.dmi' @@ -42,13 +42,6 @@ toolspeed = 0.5 reach = 2 -/obj/item/weapon/tool/wrench/hybrid/is_wrench() - if(prob(10)) - var/turf/T = get_turf(src) - SSradiation.radiate(get_turf(src), 5) - T.visible_message("\The [src] shudders!") - return FALSE - return TRUE /datum/category_item/catalogue/anomalous/precursor_a/alien_wrench name = "Precursor Alpha Object - Fastener Torque Tool" @@ -103,7 +96,7 @@ return ..() /obj/item/weapon/tool/wrench/power/attack_self(mob/user) - playsound(get_turf(user),'sound/items/change_drill.ogg',50,1) + playsound(src,'sound/items/change_drill.ogg',50,1) user.drop_item(src) counterpart.forceMove(get_turf(src)) src.forceMove(counterpart) diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index ba1b662ebb..b9566c399b 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -12,7 +12,7 @@ /obj/item/weapon/towel/attack_self(mob/living/user as mob) user.visible_message(text("[] uses [] to towel themselves off.", user, src)) - playsound(user, 'sound/weapons/towelwipe.ogg', 25, 1) + playsound(src, 'sound/weapons/towelwipe.ogg', 25, 1) if(user.fire_stacks > 0) user.fire_stacks = (max(0, user.fire_stacks - 1.5)) else if(user.fire_stacks < 0) diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 8e6667c759..0ec9bc7af3 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -39,7 +39,7 @@ "You have deployed \the [src]!", "You hear a latch click loudly." ) - playsound(src.loc, 'sound/machines/click.ogg',70, 1) + playsound(src, 'sound/machines/click.ogg',70, 1) deployed = 1 user.drop_from_inventory(src) @@ -64,7 +64,7 @@ "You begin disarming \the [src]!", "You hear a latch click followed by the slow creaking of a spring." ) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 60)) user.visible_message( @@ -98,6 +98,16 @@ if(!L.apply_damage(30, BRUTE, target_zone, blocked, soaked, used_weapon=src)) return 0 + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/obj/item/organ/external/affected = H.get_organ(check_zone(target_zone)) + if(!affected) // took it clean off! + to_chat(H, "The steel jaws of \the [src] take your limb clean off!") + L.Stun(stun_length*2) + deployed = 0 + anchored = FALSE + return + //trap the victim in place set_dir(L.dir) can_buckle = 1 diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm index 48d65ffb16..6809ae4547 100644 --- a/code/game/objects/items/weapons/trays.dm +++ b/code/game/objects/items/weapons/trays.dm @@ -36,10 +36,10 @@ M.Weaken(1) user.take_organ_damage(2) if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) + playsound(src, 'sound/items/trayhit1.ogg', 50, 1) return else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' + playsound(src, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3 var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later. @@ -60,12 +60,12 @@ else M.take_organ_damage(5) if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) + playsound(src, 'sound/items/trayhit1.ogg', 50, 1) for(var/mob/O in viewers(M, null)) O.show_message(text("[] slams [] with the tray!", user, M), 1) return else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc + playsound(src, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc for(var/mob/O in viewers(M, null)) O.show_message(text("[] slams [] with the tray!", user, M), 1) return @@ -93,11 +93,11 @@ location.add_blood(H) if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) + playsound(src, 'sound/items/trayhit1.ogg', 50, 1) for(var/mob/O in viewers(M, null)) O.show_message(text("[] slams [] with the tray!", user, M), 1) else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' + playsound(src, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' for(var/mob/O in viewers(M, null)) O.show_message(text("[] slams [] with the tray!", user, M), 1) if(prob(10)) @@ -117,11 +117,11 @@ location.add_blood(H) if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) + playsound(src, 'sound/items/trayhit1.ogg', 50, 1) for(var/mob/O in viewers(M, null)) O.show_message(text("[] slams [] in the face with the tray!", user, M), 1) else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again + playsound(src, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again for(var/mob/O in viewers(M, null)) O.show_message(text("[] slams [] in the face with the tray!", user, M), 1) if(prob(30)) @@ -141,7 +141,7 @@ if(istype(W, /obj/item/weapon/material/kitchen/rollingpin)) if(cooldown < world.time - 25) user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + playsound(src, 'sound/effects/shieldbash.ogg', 50, 1) cooldown = world.time else ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index ff982da257..82e6ff7699 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -99,7 +99,6 @@ anchored = 0 can_buckle = 1 - buckle_movable = 1 buckle_lying = 0 buckle_dir = SOUTH @@ -122,18 +121,6 @@ if(!has_buckled_mobs()) qdel(src) -/obj/effect/energy_net/Move() - ..() - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/occupant = A - occupant.buckled = null - occupant.forceMove(src.loc) - occupant.buckled = src - if (occupant && (src.loc != occupant.loc)) - unbuckle_mob(occupant) - qdel(src) - /obj/effect/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/user) user.setClickCooldown(user.get_attack_speed()) visible_message("[user] begins to tear at \the [src]!") diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index f603aa6498..e839bba3b3 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -68,7 +68,7 @@ to_chat(user, "That was close!") src.reagents.trans_to_obj(W, T.max_fuel) to_chat(user, "Welder refilled!") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) return else if(nozzle) if(nozzle == W) @@ -105,7 +105,7 @@ if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume < max_fuel) O.reagents.trans_to_obj(src, max_fuel) to_chat(user, "You crack the cap off the top of the pack and fill it back up again from the tank.") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) return else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume == max_fuel) to_chat(user, "The pack is already full!") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a14a62eaa8..02ee4265b3 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -142,6 +142,7 @@ return /mob/proc/unset_machine() + machine?.remove_visual(src) src.machine = null /mob/proc/set_machine(var/obj/O) @@ -198,4 +199,19 @@ // Test for if stepping on a tile containing this obj is safe to do, used for things like landmines and cliffs. /obj/proc/is_safe_to_step(mob/living/L) - return TRUE \ No newline at end of file + return TRUE + +/obj/proc/container_resist(var/mob/living) + return + + +//To be called from things that spill objects on the floor. +//Makes an object move around randomly for a couple of tiles +/obj/proc/tumble(var/dist = 2) + set waitfor = FALSE + if (dist >= 1) + dist += rand(0,1) + for(var/i = 1, i <= dist, i++) + if(src) + step(src, pick(NORTH,SOUTH,EAST,WEST)) + sleep(rand(2,4)) diff --git a/code/game/objects/random/_random.dm b/code/game/objects/random/_random.dm index b559495eb5..8b616c83f5 100644 --- a/code/game/objects/random/_random.dm +++ b/code/game/objects/random/_random.dm @@ -11,15 +11,7 @@ . = ..() if (!prob(spawn_nothing_percentage)) spawn_item() - Random_SafeDestroy(0) - -// This function should, theoretically, guarantee the deletion of the random object. Not all of them destroy themselves for some reason, especially if created through non-standard means. -/obj/random/proc/Random_SafeDestroy(var/recursion_level) - set waitfor = FALSE - sleep(30) - qdel(src) - if(src && recursion_level < 5) - Random_SafeDestroy(recursion_level + 1) + return INITIALIZE_HINT_QDEL // this function should return a specific item to spawn /obj/random/proc/item_to_spawn() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 3e571009d2..f81419be75 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -8,11 +8,21 @@ var/parts var/list/climbers = list() var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies. + + var/list/connections = list("0", "0", "0", "0") + var/list/other_connections = list("0", "0", "0", "0") + var/list/blend_objects = newlist() // Objects which to blend with + var/list/noblend_objects = newlist() //Objects to avoid blending with (such as children of listed blend objects. + +/obj/structure/Initialize() + . = ..() + if(climbable) + verbs += /obj/structure/proc/climb_on /obj/structure/Destroy() if(parts) new parts(loc) - . = ..() + return ..() /obj/structure/attack_hand(mob/user) if(breakable) @@ -46,13 +56,7 @@ if(3.0) return -/obj/structure/New() - ..() - if(climbable) - verbs += /obj/structure/proc/climb_on - /obj/structure/proc/climb_on() - set name = "Climb structure" set desc = "Climbs onto a structure." set category = "Object" @@ -61,7 +65,6 @@ do_climb(usr) /obj/structure/MouseDrop_T(mob/target, mob/user) - var/mob/living/H = user if(istype(H) && can_climb(H) && target == user) do_climb(target) @@ -185,3 +188,69 @@ user.do_attack_animation(src) spawn(1) qdel(src) return 1 + +/obj/structure/proc/can_visually_connect() + return anchored + +/obj/structure/proc/can_visually_connect_to(var/obj/structure/S) + return istype(S, src) + +/obj/structure/proc/update_connections(propagate = 0) + var/list/dirs = list() + var/list/other_dirs = list() + + for(var/obj/structure/S in orange(src, 1)) + if(can_visually_connect_to(S)) + if(S.can_visually_connect()) + if(propagate) + //S.update_connections() //Not here + S.update_icon() + dirs += get_dir(src, S) + + if(!can_visually_connect()) + connections = list("0", "0", "0", "0") + other_connections = list("0", "0", "0", "0") + return FALSE + + for(var/direction in cardinal) + var/turf/T = get_step(src, direction) + var/success = 0 + for(var/b_type in blend_objects) + if(istype(T, b_type)) + success = 1 + if(propagate) + var/turf/simulated/wall/W = T + if(istype(W)) + W.update_connections(1) + if(success) + break // breaks inner loop + if(!success) + blend_obj_loop: + for(var/obj/O in T) + for(var/b_type in blend_objects) + if(istype(O, b_type)) + success = 1 + for(var/obj/structure/S in T) + if(istype(S, src)) + success = 0 + for(var/nb_type in noblend_objects) + if(istype(O, nb_type)) + success = 0 + + if(success) + break blend_obj_loop // breaks outer loop + + if(success) + dirs += get_dir(src, T) + other_dirs += get_dir(src, T) + + refresh_neighbors() + + connections = dirs_to_corner_states(dirs) + other_connections = dirs_to_corner_states(other_dirs) + return TRUE + +/obj/structure/proc/refresh_neighbors() + for(var/thing in RANGE_TURFS(1, src)) + var/turf/T = thing + T.update_icon() diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 26e040c7e9..147a5dc38f 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -1,107 +1,183 @@ -// Based on catwalk.dm from https://github.com/Endless-Horizon/CEV-Eris /obj/structure/catwalk name = "catwalk" desc = "Cats really don't like these things." - plane = DECAL_PLANE - layer = ABOVE_UTILITY icon = 'icons/turf/catwalks.dmi' icon_state = "catwalk" + plane = DECAL_PLANE + layer = ABOVE_UTILITY density = 0 + anchored = 1.0 + var/hatch_open = FALSE + var/plating_color = null + var/obj/item/stack/tile/plated_tile = null + var/static/plating_colors = list( + /obj/item/stack/tile/floor = "#858a8f", + /obj/item/stack/tile/floor/dark = "#4f4f4f", + /obj/item/stack/tile/floor/white = "#e8e8e8") var/health = 100 var/maxhealth = 100 - anchored = 1.0 /obj/structure/catwalk/Initialize() . = ..() - for(var/obj/structure/catwalk/O in range(1)) - O.update_icon() for(var/obj/structure/catwalk/C in get_turf(src)) if(C != src) - warning("Duplicate [type] in [loc] ([x], [y], [z])") - return INITIALIZE_HINT_QDEL + qdel(C) + update_connections(1) update_icon() + /obj/structure/catwalk/Destroy() - var/turf/location = loc - . = ..() - location.alpha = initial(location.alpha) - for(var/obj/structure/catwalk/L in orange(location, 1)) - L.update_icon() + redraw_nearby_catwalks() + return ..() + +/obj/structure/catwalk/proc/redraw_nearby_catwalks() + for(var/direction in alldirs) + var/obj/structure/catwalk/L = locate() in get_step(src, direction) + if(L) + L.update_connections() + L.update_icon() //so siding get updated properly + /obj/structure/catwalk/update_icon() - var/connectdir = 0 - for(var/direction in cardinal) - if(locate(/obj/structure/catwalk, get_step(src, direction))) - connectdir |= direction - - //Check the diagonal connections for corners, where you have, for example, connections both north and east. In this case it checks for a north-east connection to determine whether to add a corner marker or not. - var/diagonalconnect = 0 //1 = NE; 2 = SE; 4 = NW; 8 = SW - //NORTHEAST - if(connectdir & NORTH && connectdir & EAST) - if(locate(/obj/structure/catwalk, get_step(src, NORTHEAST))) - diagonalconnect |= 1 - //SOUTHEAST - if(connectdir & SOUTH && connectdir & EAST) - if(locate(/obj/structure/catwalk, get_step(src, SOUTHEAST))) - diagonalconnect |= 2 - //NORTHWEST - if(connectdir & NORTH && connectdir & WEST) - if(locate(/obj/structure/catwalk, get_step(src, NORTHWEST))) - diagonalconnect |= 4 - //SOUTHWEST - if(connectdir & SOUTH && connectdir & WEST) - if(locate(/obj/structure/catwalk, get_step(src, SOUTHWEST))) - diagonalconnect |= 8 - - icon_state = "catwalk[connectdir]-[diagonalconnect]" - + update_connections() + cut_overlays() + icon_state = "" + var/image/I + if(!hatch_open) + for(var/i = 1 to 4) + I = image(icon, "catwalk[connections[i]]", dir = 1<<(i-1)) + add_overlay(I) + if(plating_color) + I = image(icon, "plated") + I.color = plating_color + add_overlay(I) /obj/structure/catwalk/ex_act(severity) switch(severity) - if(1.0) + if(1) + new /obj/item/stack/rods(src.loc) qdel(src) - if(2.0) + if(2) + new /obj/item/stack/rods(src.loc) qdel(src) - if(3.0) - qdel(src) - return + +/obj/structure/catwalk/attack_robot(var/mob/user) + if(Adjacent(user)) + attack_hand(user) + +/obj/structure/catwalk/proc/deconstruct(mob/user) + playsound(src, 'sound/items/Welder.ogg', 100, 1) + to_chat(user, "Slicing \the [src] joints ...") + new /obj/item/stack/rods(src.loc) + new /obj/item/stack/rods(src.loc) + //Lattice would delete itself, but let's save ourselves a new obj + if(isspace(loc) || isopenspace(loc)) + new /obj/structure/lattice/(src.loc) + if(plated_tile) + new plated_tile(src.loc) + qdel(src) /obj/structure/catwalk/attackby(obj/item/C as obj, mob/user as mob) if(istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = C - if(WT.isOn()) - if(WT.remove_fuel(0, user)) - to_chat(user, "Slicing lattice joints ...") - new /obj/item/stack/rods(src.loc) - new /obj/item/stack/rods(src.loc) - new /obj/structure/lattice(src.loc) - qdel(src) - if(C.is_screwdriver()) - if(health < maxhealth) - to_chat(user, "You begin repairing \the [src.name] with \the [C.name].") - if(do_after(user, 20, src)) - health = maxhealth - else - take_damage(C.force) - user.setClickCooldown(user.get_attack_speed(C)) - return ..() + if(WT.isOn() && WT.remove_fuel(0, user)) + deconstruct(user) + return + if(C.is_crowbar() && plated_tile) + hatch_open = !hatch_open + if(hatch_open) + playsound(src, 'sound/items/Crowbar.ogg', 100, 2) + to_chat(user, "You pry open \the [src]'s maintenance hatch.") + else + playsound(src, 'sound/items/Deconstruct.ogg', 100, 2) + to_chat(user, "You shut \the [src]'s maintenance hatch.") + update_icon() + return + if(istype(C, /obj/item/stack/tile/floor) && !plated_tile) + var/obj/item/stack/tile/floor/ST = C + to_chat(user, "Placing tile...") + if (!do_after(user, 10)) + return + if(!ST.use(1)) + return + to_chat(user, "You plate \the [src]") + name = "plated catwalk" + plated_tile = C.type + src.add_fingerprint(user) + for(var/tiletype in plating_colors) + if(istype(ST, tiletype)) + plating_color = plating_colors[tiletype] + update_icon() + +/obj/structure/catwalk/refresh_neighbors() + return + +/obj/structure/catwalk/take_damage(amount) + health -= amount + if(health <= 0) + visible_message("\The [src] breaks down!") + playsound(src, 'sound/effects/grillehit.ogg', 50, 1) + new /obj/item/stack/rods(get_turf(src)) + Destroy() /obj/structure/catwalk/Crossed() . = ..() if(isliving(usr) && !usr.is_incorporeal()) playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1) -/obj/structure/catwalk/CheckExit(atom/movable/O, turf/target) - if(O.checkpass(PASSGRILLE)) - return 1 - if(target && target.z < src.z) - return 0 - return 1 +/obj/effect/catwalk_plated + name = "plated catwalk spawner" + icon = 'icons/turf/catwalks.dmi' + icon_state = "catwalk_plated" + density = 1 + anchored = 1.0 + var/activated = FALSE + plane = DECAL_PLANE + layer = ABOVE_UTILITY + var/tile = /obj/item/stack/tile/floor + var/platecolor = "#858a8f" -/obj/structure/catwalk/take_damage(amount) - health -= amount - if(health <= 0) - visible_message("\The [src] breaks down!") - playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) - new /obj/item/stack/rods(get_turf(src)) - Destroy() \ No newline at end of file +/obj/effect/catwalk_plated/Initialize(mapload) + . = ..() + activate() + +/obj/effect/catwalk_plated/CanPass() + return 0 + +/obj/effect/catwalk_plated/attack_hand() + attack_generic() + +/obj/effect/catwalk_plated/attack_ghost() + attack_generic() + +/obj/effect/catwalk_plated/attack_generic() + activate() + +/obj/effect/catwalk_plated/proc/activate() + if(activated) return + + if(locate(/obj/structure/catwalk) in loc) + warning("Frame Spawner: A catwalk already exists at [loc.x]-[loc.y]-[loc.z]") + else + var/obj/structure/catwalk/C = new /obj/structure/catwalk(loc) + C.plated_tile = tile + C.plating_color = platecolor + C.name = "plated catwalk" + C.update_icon() + activated = 1 + /* We don't have wallframes - yet + for(var/turf/T in orange(src, 1)) + for(var/obj/effect/wallframe_spawn/other in T) + if(!other.activated) other.activate() + */ + qdel(src) + +/obj/effect/catwalk_plated/dark + icon_state = "catwalk_plateddark" + tile = /obj/item/stack/tile/floor/dark + platecolor = "#4f4f4f" + +/obj/effect/catwalk_plated/white + icon_state = "catwalk_platedwhite" + tile = /obj/item/stack/tile/floor/white + platecolor = "#e8e8e8" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 3ff2f5fdd7..7573057a94 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -1,474 +1,473 @@ -/obj/structure/closet - name = "closet" - desc = "It's a basic storage unit." - icon = 'icons/obj/closet.dmi' - icon_state = "closed" - density = 1 - w_class = ITEMSIZE_HUGE - layer = UNDER_JUNK_LAYER - var/icon_closed = "closed" - var/icon_opened = "open" - var/opened = 0 - var/sealed = 0 - var/seal_tool = /obj/item/weapon/weldingtool //Tool used to seal the closet, defaults to welder - var/wall_mounted = 0 //never solid (You can always pass over it) - var/health = 100 - - var/breakout = 0 //if someone is currently breaking out. mutex - var/breakout_time = 2 //2 minutes by default - var/breakout_sound = 'sound/effects/grillehit.ogg' //Sound that plays while breaking out - - var/storage_capacity = 2 * MOB_MEDIUM //This is so that someone can't pack hundreds of items in a locker/crate - //then open it in a populated area to crash clients. - var/storage_cost = 40 //How much space this closet takes up if it's stuffed in another closet - - var/open_sound = 'sound/machines/click.ogg' - var/close_sound = 'sound/machines/click.ogg' - - var/store_misc = 1 //Chameleon item check - var/store_items = 1 //Will the closet store items? - var/store_mobs = 1 //Will the closet store mobs? - var/max_closets = 0 //Number of other closets allowed on tile before it won't close. - - var/list/starts_with - -/obj/structure/closet/Initialize() - ..() - // Closets need to come later because of spawners potentially creating objects during init. - return INITIALIZE_HINT_LATELOAD - -/obj/structure/closet/LateInitialize() - . = ..() - if(starts_with) - create_objects_in_loc(src, starts_with) - starts_with = null - - if(!opened) // if closed, any item at the crate's loc is put in the contents - var/obj/item/I - for(I in src.loc) - if(I.density || I.anchored || I == src) continue - I.forceMove(src) - // adjust locker size to hold all items with 5 units of free store room - var/content_size = 0 - for(I in src.contents) - content_size += CEILING(I.w_class/2, 1) - if(content_size > storage_capacity-5) - storage_capacity = content_size + 5 - update_icon() - -/obj/structure/closet/examine(mob/user) - . = ..() - if(Adjacent(user) || isobserver(user)) - var/content_size = 0 - for(var/obj/item/I in src.contents) - if(!I.anchored) - content_size += CEILING(I.w_class/2, 1) - if(!content_size) - . += "It is empty." - else if(storage_capacity > content_size*4) - . += "It is barely filled." - else if(storage_capacity > content_size*2) - . += "It is less than half full." - else if(storage_capacity > content_size) - . += "There is still some free space." - else - . += "It is full." - - if(!src.opened && isobserver(user)) - . += "It contains: [counting_english_list(contents)]" - -/obj/structure/closet/CanPass(atom/movable/mover, turf/target) - if(wall_mounted) - return TRUE - return ..() - -/obj/structure/closet/proc/can_open() - if(src.sealed) - return 0 - return 1 - -/obj/structure/closet/proc/can_close() - var/closet_count = 0 - for(var/obj/structure/closet/closet in get_turf(src)) - if(closet != src) - if(!closet.anchored) - closet_count ++ - if(closet_count > max_closets) - return 0 - return 1 - -/obj/structure/closet/proc/dump_contents() - //Cham Projector Exception - for(var/obj/effect/dummy/chameleon/AD in src) - AD.forceMove(src.loc) - - for(var/obj/I in src) - I.forceMove(src.loc) - - for(var/mob/M in src) - M.forceMove(src.loc) - if(M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - -/obj/structure/closet/proc/open() - if(src.opened) - return 0 - - if(!src.can_open()) - return 0 - - src.dump_contents() - - src.icon_state = src.icon_opened - src.opened = 1 - playsound(src.loc, open_sound, 15, 1, -3) - if(initial(density)) - density = !density - return 1 - -/obj/structure/closet/proc/close() - if(!src.opened) - return 0 - if(!src.can_close()) - return 0 - - var/stored_units = 0 - - if(store_misc) - stored_units += store_misc(stored_units) - if(store_items) - stored_units += store_items(stored_units) - if(store_mobs) - stored_units += store_mobs(stored_units) - if(max_closets) - stored_units += store_closets(stored_units) - - src.icon_state = src.icon_closed - src.opened = 0 - - playsound(src.loc, close_sound, 15, 1, -3) - if(initial(density)) - density = !density - return 1 - -//Cham Projector Exception -/obj/structure/closet/proc/store_misc(var/stored_units) - var/added_units = 0 - for(var/obj/effect/dummy/chameleon/AD in src.loc) - if((stored_units + added_units) > storage_capacity) - break - AD.forceMove(src) - added_units++ - return added_units - -/obj/structure/closet/proc/store_items(var/stored_units) - var/added_units = 0 - for(var/obj/item/I in src.loc) - var/item_size = CEILING(I.w_class / 2, 1) - if(stored_units + added_units + item_size > storage_capacity) - continue - if(!I.anchored) - I.forceMove(src) - added_units += item_size - return added_units - -/obj/structure/closet/proc/store_mobs(var/stored_units) - var/added_units = 0 - for(var/mob/living/M in src.loc) - if(M.buckled || M.pinned.len) - continue - if(stored_units + added_units + M.mob_size > storage_capacity) - break - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.forceMove(src) - added_units += M.mob_size - return added_units - -/obj/structure/closet/proc/store_closets(var/stored_units) - var/added_units = 0 - for(var/obj/structure/closet/C in src.loc) - if(C == src) //Don't store ourself - continue - if(C.anchored) //Don't worry about anchored things on the same tile - continue - if(C.max_closets) //Prevents recursive storage - continue - if(stored_units + added_units + storage_cost > storage_capacity) - break - C.forceMove(src) - added_units += storage_cost - return added_units - - -/obj/structure/closet/proc/toggle(mob/user as mob) - if(!(src.opened ? src.close() : src.open())) - to_chat(user, "It won't budge!") - return - update_icon() - -// this should probably use dump_contents() -/obj/structure/closet/ex_act(severity) - switch(severity) - if(1) - for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion - A.forceMove(src.loc) - A.ex_act(severity + 1) - qdel(src) - if(2) - if(prob(50)) - for (var/atom/movable/A as mob|obj in src) - A.forceMove(src.loc) - A.ex_act(severity + 1) - qdel(src) - if(3) - if(prob(5)) - for(var/atom/movable/A as mob|obj in src) - A.forceMove(src.loc) - qdel(src) - -/obj/structure/closet/blob_act() - damage(100) - -/obj/structure/closet/proc/damage(var/damage) - health -= damage - if(health <= 0) - for(var/atom/movable/A in src) - A.forceMove(src.loc) - qdel(src) - -/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) - var/proj_damage = Proj.get_structure_damage() - if(!proj_damage) - return - - ..() - damage(proj_damage) - - return - -/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(src.opened) - if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet - return 0 - if(istype(W,/obj/item/tk_grab)) - return 0 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(!WT.remove_fuel(0,user)) - if(!WT.isOn()) - return - else - to_chat(user, "You need more welding fuel to complete this task.") - return - playsound(src, WT.usesound, 50) - new /obj/item/stack/material/steel(src.loc) - for(var/mob/M in viewers(src)) - M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) - qdel(src) - return - if(istype(W, /obj/item/weapon/storage/laundry_basket) && W.contents.len) - var/obj/item/weapon/storage/laundry_basket/LB = W - var/turf/T = get_turf(src) - for(var/obj/item/I in LB.contents) - LB.remove_from_storage(I, T) - user.visible_message("[user] empties \the [LB] into \the [src].", \ - "You empty \the [LB] into \the [src].", \ - "You hear rustling of clothes.") - return - if(isrobot(user)) - return - if(W.loc != user) // This should stop mounted modules ending up outside the module. - return - usr.drop_item() - if(W) - W.forceMove(src.loc) - else if(istype(W, /obj/item/weapon/packageWrap)) - return - else if(seal_tool) - if(istype(W, seal_tool)) - var/obj/item/weapon/S = W - if(istype(S, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = S - if(!WT.remove_fuel(0,user)) - if(!WT.isOn()) - return - else - to_chat(user, "You need more welding fuel to complete this task.") - return - if(do_after(user, 20 * S.toolspeed)) - playsound(src, S.usesound, 50) - src.sealed = !src.sealed - src.update_icon() - for(var/mob/M in viewers(src)) - M.show_message("[src] has been [sealed?"sealed":"unsealed"] by [user.name].", 3) - else if(W.is_wrench()) - if(sealed) - if(anchored) - user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") - else - user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") - playsound(src, W.usesound, 50) - if(do_after(user, 20 * W.toolspeed)) - if(!src) return - to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") - anchored = !anchored - else - src.attack_hand(user) - return - -/obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if(istype(O, /obj/screen)) //fix for HUD elements making their way into the world -Pete - return - if(O.loc == user) - return - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis) - return - if((!( istype(O, /atom/movable) ) || O.anchored || !Adjacent(user) || !Adjacent(O) || !user.Adjacent(O) || user.contents.Find(src))) - return - if(!isturf(user.loc)) // are you in a container/closet/pod/etc? - return - if(!src.opened) - return - if(istype(O, /obj/structure/closet)) - return - step_towards(O, src.loc) - if(user != O) - user.show_viewers("[user] stuffs [O] into [src]!") - src.add_fingerprint(user) - return - -/obj/structure/closet/attack_robot(mob/user) - if(Adjacent(user)) - attack_hand(user) - -/obj/structure/closet/relaymove(mob/user as mob) - if(user.stat || !isturf(src.loc)) - return - - if(!src.open()) - to_chat(user, "It won't budge!") - -/obj/structure/closet/attack_hand(mob/user as mob) - src.add_fingerprint(user) - src.toggle(user) - -// tk grab then use on self -/obj/structure/closet/attack_self_tk(mob/user as mob) - src.add_fingerprint(user) - if(!src.toggle()) - to_chat(usr, "It won't budge!") - -/obj/structure/closet/verb/verb_toggleopen() - set src in oview(1) - set category = "Object" - set name = "Toggle Open" - - if(!usr.canmove || usr.stat || usr.restrained()) - return - - if(ishuman(usr) || isrobot(usr)) - src.add_fingerprint(usr) - src.toggle(usr) - else - to_chat(usr, "This mob type can't use this verb.") - -/obj/structure/closet/update_icon()//Putting the sealed stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) - overlays.Cut() - if(!opened) - icon_state = icon_closed - if(sealed) - overlays += "welded" - else - icon_state = icon_opened - -/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys") - if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) - return - user.do_attack_animation(src) - visible_message("[user] [attack_message] the [src]!") - dump_contents() - spawn(1) qdel(src) - return 1 - -/obj/structure/closet/proc/req_breakout() - if(opened) - return 0 //Door's open... wait, why are you in it's contents then? - if(!sealed) - return 0 //closed but not sealed... - return 1 - -/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee) - - if(breakout || !req_breakout()) - return - - escapee.setClickCooldown(100) - - //okay, so the closet is either sealed or locked... resist!!! - to_chat(escapee, "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)") - - visible_message("\The [src] begins to shake violently!") - - breakout = 1 //can't think of a better way to do this right now. - for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 - if(!do_after(escapee, 50)) //5 seconds - breakout = 0 - return - if(!escapee || escapee.incapacitated() || escapee.loc != src) - breakout = 0 - return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened - //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... - if(!req_breakout()) - breakout = 0 - return - - playsound(src.loc, breakout_sound, 100, 1) - animate_shake() - add_fingerprint(escapee) - - //Well then break it! - breakout = 0 - to_chat(escapee, "You successfully break out!") - visible_message("\The [escapee] successfully broke out of \the [src]!") - playsound(src.loc, breakout_sound, 100, 1) - break_open() - animate_shake() - -/obj/structure/closet/proc/break_open() - sealed = 0 - update_icon() - //Do this to prevent contents from being opened into nullspace (read: bluespace) - if(istype(loc, /obj/structure/bigDelivery)) - var/obj/structure/bigDelivery/BD = loc - BD.unwrap() - open() - -/obj/structure/closet/proc/animate_shake() - var/init_px = pixel_x - var/shake_dir = pick(-1, 1) - animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) - animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) - -/obj/structure/closet/onDropInto(var/atom/movable/AM) - return - -/obj/structure/closet/AllowDrop() - return TRUE - -/obj/structure/closet/return_air_for_internal_lifeform(var/mob/living/L) - if(src.loc) - if(istype(src.loc, /obj/structure/closet)) - return (loc.return_air_for_internal_lifeform(L)) - return return_air() - -/obj/structure/closet/take_damage(var/damage) - if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) - return - dump_contents() - spawn(1) qdel(src) - return 1 +/obj/structure/closet + name = "closet" + desc = "It's a basic storage unit." + icon = 'icons/obj/closet.dmi' + icon_state = "closed" + density = 1 + w_class = ITEMSIZE_HUGE + layer = UNDER_JUNK_LAYER + var/icon_closed = "closed" + var/icon_opened = "open" + var/opened = 0 + var/sealed = 0 + var/seal_tool = /obj/item/weapon/weldingtool //Tool used to seal the closet, defaults to welder + var/wall_mounted = 0 //never solid (You can always pass over it) + var/health = 100 + + var/breakout = 0 //if someone is currently breaking out. mutex + var/breakout_time = 2 //2 minutes by default + var/breakout_sound = 'sound/effects/grillehit.ogg' //Sound that plays while breaking out + + var/storage_capacity = 2 * MOB_MEDIUM //This is so that someone can't pack hundreds of items in a locker/crate + //then open it in a populated area to crash clients. + var/storage_cost = 40 //How much space this closet takes up if it's stuffed in another closet + + var/open_sound = 'sound/machines/click.ogg' + var/close_sound = 'sound/machines/click.ogg' + + var/store_misc = 1 //Chameleon item check + var/store_items = 1 //Will the closet store items? + var/store_mobs = 1 //Will the closet store mobs? + var/max_closets = 0 //Number of other closets allowed on tile before it won't close. + + var/list/starts_with + +/obj/structure/closet/Initialize() + ..() + // Closets need to come later because of spawners potentially creating objects during init. + return INITIALIZE_HINT_LATELOAD + +/obj/structure/closet/LateInitialize() + . = ..() + if(starts_with) + create_objects_in_loc(src, starts_with) + starts_with = null + + if(!opened) // if closed, any item at the crate's loc is put in the contents + var/obj/item/I + for(I in src.loc) + if(I.density || I.anchored || I == src) continue + I.forceMove(src) + // adjust locker size to hold all items with 5 units of free store room + var/content_size = 0 + for(I in src.contents) + content_size += CEILING(I.w_class/2, 1) + if(content_size > storage_capacity-5) + storage_capacity = content_size + 5 + update_icon() + +/obj/structure/closet/examine(mob/user) + . = ..() + if(Adjacent(user) || isobserver(user)) + var/content_size = 0 + for(var/obj/item/I in src.contents) + if(!I.anchored) + content_size += CEILING(I.w_class/2, 1) + if(!content_size) + . += "It is empty." + else if(storage_capacity > content_size*4) + . += "It is barely filled." + else if(storage_capacity > content_size*2) + . += "It is less than half full." + else if(storage_capacity > content_size) + . += "There is still some free space." + else + . += "It is full." + + if(!src.opened && isobserver(user)) + . += "It contains: [counting_english_list(contents)]" + +/obj/structure/closet/CanPass(atom/movable/mover, turf/target) + if(wall_mounted) + return TRUE + return ..() + +/obj/structure/closet/proc/can_open() + if(src.sealed) + return 0 + return 1 + +/obj/structure/closet/proc/can_close() + var/closet_count = 0 + for(var/obj/structure/closet/closet in get_turf(src)) + if(closet != src) + if(!closet.anchored) + closet_count ++ + if(closet_count > max_closets) + return 0 + return 1 + +/obj/structure/closet/proc/dump_contents() + //Cham Projector Exception + for(var/obj/effect/dummy/chameleon/AD in src) + AD.forceMove(src.loc) + + for(var/obj/I in src) + I.forceMove(src.loc) + + for(var/mob/M in src) + M.forceMove(src.loc) + if(M.client) + M.client.eye = M.client.mob + M.client.perspective = MOB_PERSPECTIVE + +/obj/structure/closet/proc/open() + if(src.opened) + return 0 + + if(!src.can_open()) + return 0 + + src.dump_contents() + + src.icon_state = src.icon_opened + src.opened = 1 + playsound(src, open_sound, 15, 1, -3) + if(initial(density)) + density = !density + return 1 + +/obj/structure/closet/proc/close() + if(!src.opened) + return 0 + if(!src.can_close()) + return 0 + + var/stored_units = 0 + + if(store_misc) + stored_units += store_misc(stored_units) + if(store_items) + stored_units += store_items(stored_units) + if(store_mobs) + stored_units += store_mobs(stored_units) + if(max_closets) + stored_units += store_closets(stored_units) + + src.icon_state = src.icon_closed + src.opened = 0 + + playsound(src, close_sound, 15, 1, -3) + if(initial(density)) + density = !density + return 1 + +//Cham Projector Exception +/obj/structure/closet/proc/store_misc(var/stored_units) + var/added_units = 0 + for(var/obj/effect/dummy/chameleon/AD in src.loc) + if((stored_units + added_units) > storage_capacity) + break + AD.forceMove(src) + added_units++ + return added_units + +/obj/structure/closet/proc/store_items(var/stored_units) + var/added_units = 0 + for(var/obj/item/I in src.loc) + var/item_size = CEILING(I.w_class / 2, 1) + if(stored_units + added_units + item_size > storage_capacity) + continue + if(!I.anchored) + I.forceMove(src) + added_units += item_size + return added_units + +/obj/structure/closet/proc/store_mobs(var/stored_units) + var/added_units = 0 + for(var/mob/living/M in src.loc) + if(M.buckled || M.pinned.len) + continue + if(stored_units + added_units + M.mob_size > storage_capacity) + break + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.forceMove(src) + added_units += M.mob_size + return added_units + +/obj/structure/closet/proc/store_closets(var/stored_units) + var/added_units = 0 + for(var/obj/structure/closet/C in src.loc) + if(C == src) //Don't store ourself + continue + if(C.anchored) //Don't worry about anchored things on the same tile + continue + if(C.max_closets) //Prevents recursive storage + continue + if(stored_units + added_units + storage_cost > storage_capacity) + break + C.forceMove(src) + added_units += storage_cost + return added_units + + +/obj/structure/closet/proc/toggle(mob/user as mob) + if(!(src.opened ? src.close() : src.open())) + to_chat(user, "It won't budge!") + return + update_icon() + +// this should probably use dump_contents() +/obj/structure/closet/ex_act(severity) + switch(severity) + if(1) + for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion + A.forceMove(src.loc) + A.ex_act(severity + 1) + qdel(src) + if(2) + if(prob(50)) + for (var/atom/movable/A as mob|obj in src) + A.forceMove(src.loc) + A.ex_act(severity + 1) + qdel(src) + if(3) + if(prob(5)) + for(var/atom/movable/A as mob|obj in src) + A.forceMove(src.loc) + qdel(src) + +/obj/structure/closet/blob_act() + damage(100) + +/obj/structure/closet/proc/damage(var/damage) + health -= damage + if(health <= 0) + for(var/atom/movable/A in src) + A.forceMove(src.loc) + qdel(src) + +/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) + return + + ..() + damage(proj_damage) + + return + +/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(src.opened) + if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet + return 0 + if(istype(W,/obj/item/tk_grab)) + return 0 + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(!WT.remove_fuel(0,user)) + if(!WT.isOn()) + return + else + to_chat(user, "You need more welding fuel to complete this task.") + return + playsound(src, WT.usesound, 50) + new /obj/item/stack/material/steel(src.loc) + for(var/mob/M in viewers(src)) + M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) + qdel(src) + return + if(istype(W, /obj/item/weapon/storage/laundry_basket) && W.contents.len) + var/obj/item/weapon/storage/laundry_basket/LB = W + var/turf/T = get_turf(src) + for(var/obj/item/I in LB.contents) + LB.remove_from_storage(I, T) + user.visible_message("[user] empties \the [LB] into \the [src].", \ + "You empty \the [LB] into \the [src].", \ + "You hear rustling of clothes.") + return + if(isrobot(user)) + return + if(W.loc != user) // This should stop mounted modules ending up outside the module. + return + usr.drop_item() + if(W) + W.forceMove(src.loc) + else if(istype(W, /obj/item/weapon/packageWrap)) + return + else if(seal_tool) + if(istype(W, seal_tool)) + var/obj/item/weapon/S = W + if(istype(S, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = S + if(!WT.remove_fuel(0,user)) + if(!WT.isOn()) + return + else + to_chat(user, "You need more welding fuel to complete this task.") + return + if(do_after(user, 20 * S.toolspeed)) + playsound(src, S.usesound, 50) + src.sealed = !src.sealed + src.update_icon() + for(var/mob/M in viewers(src)) + M.show_message("[src] has been [sealed?"sealed":"unsealed"] by [user.name].", 3) + else if(W.is_wrench()) + if(sealed) + if(anchored) + user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + playsound(src, W.usesound, 50) + if(do_after(user, 20 * W.toolspeed)) + if(!src) return + to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") + anchored = !anchored + else + src.attack_hand(user) + return + +/obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + if(istype(O, /obj/screen)) //fix for HUD elements making their way into the world -Pete + return + if(O.loc == user) + return + if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis) + return + if((!( istype(O, /atom/movable) ) || O.anchored || !Adjacent(user) || !Adjacent(O) || !user.Adjacent(O) || user.contents.Find(src))) + return + if(!isturf(user.loc)) // are you in a container/closet/pod/etc? + return + if(!src.opened) + return + if(istype(O, /obj/structure/closet)) + return + step_towards(O, src.loc) + if(user != O) + user.show_viewers("[user] stuffs [O] into [src]!") + src.add_fingerprint(user) + return + +/obj/structure/closet/attack_robot(mob/user) + if(Adjacent(user)) + attack_hand(user) + +/obj/structure/closet/relaymove(mob/user as mob) + if(user.stat || !isturf(src.loc)) + return + + if(!src.open()) + to_chat(user, "It won't budge!") + +/obj/structure/closet/attack_hand(mob/user as mob) + src.add_fingerprint(user) + src.toggle(user) + +// tk grab then use on self +/obj/structure/closet/attack_self_tk(mob/user as mob) + src.add_fingerprint(user) + if(!src.toggle()) + to_chat(usr, "It won't budge!") + +/obj/structure/closet/verb/verb_toggleopen() + set src in oview(1) + set category = "Object" + set name = "Toggle Open" + + if(!usr.canmove || usr.stat || usr.restrained()) + return + + if(ishuman(usr) || isrobot(usr)) + src.add_fingerprint(usr) + src.toggle(usr) + else + to_chat(usr, "This mob type can't use this verb.") + +/obj/structure/closet/update_icon()//Putting the sealed stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) + overlays.Cut() + if(!opened) + icon_state = icon_closed + if(sealed) + overlays += "welded" + else + icon_state = icon_opened + +/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys") + if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) + return + user.do_attack_animation(src) + visible_message("[user] [attack_message] the [src]!") + dump_contents() + spawn(1) qdel(src) + return 1 + +/obj/structure/closet/proc/req_breakout() + if(opened) + return 0 //Door's open... wait, why are you in it's contents then? + if(!sealed) + return 0 //closed but not sealed... + return 1 + +/obj/structure/closet/container_resist(var/mob/living/escapee) + if(breakout || !req_breakout()) + return + + escapee.setClickCooldown(100) + + //okay, so the closet is either sealed or locked... resist!!! + to_chat(escapee, "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)") + + visible_message("\The [src] begins to shake violently!") + + breakout = 1 //can't think of a better way to do this right now. + for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 + if(!do_after(escapee, 50)) //5 seconds + breakout = 0 + return + if(!escapee || escapee.incapacitated() || escapee.loc != src) + breakout = 0 + return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened + //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... + if(!req_breakout()) + breakout = 0 + return + + playsound(src, breakout_sound, 100, 1) + animate_shake() + add_fingerprint(escapee) + + //Well then break it! + breakout = 0 + to_chat(escapee, "You successfully break out!") + visible_message("\The [escapee] successfully broke out of \the [src]!") + playsound(src, breakout_sound, 100, 1) + break_open() + animate_shake() + +/obj/structure/closet/proc/break_open() + sealed = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() + +/obj/structure/closet/proc/animate_shake() + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) + +/obj/structure/closet/onDropInto(var/atom/movable/AM) + return + +/obj/structure/closet/AllowDrop() + return TRUE + +/obj/structure/closet/return_air_for_internal_lifeform(var/mob/living/L) + if(src.loc) + if(istype(src.loc, /obj/structure/closet)) + return (loc.return_air_for_internal_lifeform(L)) + return return_air() + +/obj/structure/closet/take_damage(var/damage) + if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) + return + dump_contents() + spawn(1) qdel(src) + return 1 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 0a77e4cafc..3094814d16 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -78,8 +78,8 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) else to_chat(user, "Access Denied") return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index af07ceb9e5..c5732a337e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -56,7 +56,7 @@ return if(src.allowed(user)) src.locked = !src.locked - playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3) + playsound(src, 'sound/machines/click.ogg', 15, 1, -3) for(var/mob/O in viewers(user, 3)) if((O.client && !( O.blinded ))) to_chat(O, "The locker has been [locked ? null : "un"]locked by [user].") @@ -86,8 +86,8 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) else if(W.is_wrench()) if(sealed) if(anchored) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 55378be679..e6f37f64d0 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -34,7 +34,7 @@ if(usr.stunned) return 2 - playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3) + playsound(src, 'sound/machines/click.ogg', 15, 1, -3) for(var/obj/O in src) O.forceMove(get_turf(src)) icon_state = icon_opened @@ -50,7 +50,7 @@ if(!src.can_close()) return 0 - playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3) + playsound(src, 'sound/machines/click.ogg', 15, 1, -3) var/itemcount = 0 for(var/obj/O in get_turf(src)) if(itemcount >= storage_capacity) @@ -97,7 +97,7 @@ else if(W.is_wirecutter()) if(rigged) to_chat(user , "You cut away the wiring.") - playsound(src.loc, W.usesound, 100, 1) + playsound(src, W.usesound, 100, 1) rigged = 0 return else return attack_hand(user) @@ -206,7 +206,7 @@ overlays += emag overlays += sparks spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface* - playsound(src.loc, "sparks", 60, 1) + playsound(src, "sparks", 60, 1) src.locked = 0 src.broken = 1 to_chat(user, "You unlock \the [src].") @@ -225,7 +225,7 @@ overlays += emag overlays += sparks spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface* - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) src.locked = 0 if(!opened && prob(20/severity)) if(!locked) diff --git a/code/game/objects/structures/crates_lockers/vehiclecage.dm b/code/game/objects/structures/crates_lockers/vehiclecage.dm index b565124e78..b98636eb16 100644 --- a/code/game/objects/structures/crates_lockers/vehiclecage.dm +++ b/code/game/objects/structures/crates_lockers/vehiclecage.dm @@ -32,11 +32,11 @@ if(!T) to_chat(user, "You can't open this here!") if(W.is_wrench() && do_after(user, 60 * W.toolspeed, src)) - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) disassemble(W, user) user.visible_message("[user] begins loosening \the [src]'s bolts.") if(W.is_wirecutter() && do_after(user, 70 * W.toolspeed, src)) - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) disassemble(W, user) user.visible_message("[user] begins cutting \the [src]'s bolts.") else diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index c44f714cc5..9de63fd3d0 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -22,7 +22,7 @@ ..(P, def_zone) /obj/structure/curtain/attack_hand(mob/user) - playsound(get_turf(loc), "rustle", 15, 1, -5) + playsound(src, "rustle", 15, 1, -5) toggle() ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 088dbd33c6..0f18d967b3 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -43,7 +43,7 @@ playsound(src, "shatter", 70, 1) update_icon() else - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) return /obj/structure/displaycase/update_icon() @@ -57,7 +57,7 @@ /obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob) user.setClickCooldown(user.get_attack_speed(W)) user.do_attack_animation(src) - playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 50, 1) src.health -= W.force src.healthcheck() ..() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index f8ea5d2f77..5a786cacd8 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -14,8 +14,8 @@ var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. Text = mineral plating is installed instead. var/created_name = null - New() - update_state() +/obj/structure/door_assembly/New() + update_state() /obj/structure/door_assembly/door_assembly_com base_icon_state = "com" @@ -136,23 +136,23 @@ airlock_type = "/multi_tile/glass" glass = -1 //To prevent bugs in deconstruction process. - New() - if(dir in list(EAST, WEST)) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size - update_state() +/obj/structure/door_assembly/multi_tile/New() + if(dir in list(EAST, WEST)) + bound_width = width * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = width * world.icon_size + update_state() - Move() - . = ..() - if(dir in list(EAST, WEST)) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size +/obj/structure/door_assembly/multi_tile/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(dir in list(EAST, WEST)) + bound_width = width * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = width * world.icon_size /obj/structure/door_assembly/proc/rename_door(mob/living/user) var/t = sanitizeSafe(input(user, "Enter the name for the windoor.", src.name, src.created_name), MAX_NAME_LEN) @@ -268,7 +268,7 @@ if (S) if (S.get_amount() >= 1) if(material_name == "rglass") - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + playsound(src, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") if(do_after(user, 40) && !glass) if (S.use(1)) @@ -280,7 +280,7 @@ to_chat(user, "You cannot make an airlock out of that material.") return if(S.get_amount() >= 2) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + playsound(src, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") if(do_after(user, 40) && !glass) if (S.use(2)) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index ae5cba7cf0..b3f174e25a 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -56,7 +56,7 @@ return if(!A.powered(EQUIP)) return - A.use_power(EQUIP, 5000) + A.use_power_oneoff(5000, EQUIP) var/light = A.power_light A.updateicon() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 0879e196f2..ed3669247a 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -38,7 +38,7 @@ if(O.is_wrench()) if(!has_extinguisher) to_chat(user, "You start to unwrench the extinguisher cabinet.") - playsound(src.loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) if(do_after(user, 15 * O.toolspeed)) to_chat(user, "You unwrench the extinguisher cabinet.") new /obj/item/frame/extinguisher_cabinet( src.loc ) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index e5735d1255..2e2251fabe 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -31,7 +31,7 @@ if (isrobot(user) || locked) if(istype(O, /obj/item/device/multitool)) to_chat(user, "Resetting circuitry...") - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) + playsound(src, 'sound/machines/lockreset.ogg', 50, 1) if(do_after(user, 20 * O.toolspeed)) locked = 0 to_chat(user, " You disable the locking modules.") @@ -44,13 +44,13 @@ toggle_close_open() return else - playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time + playsound(src, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time if(W.force < 15) to_chat(user, "The cabinet's protective glass glances off the hit.") else hitstaken++ if(hitstaken == 4) - playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. + playsound(src, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. smashed = 1 locked = 0 open= 1 @@ -82,7 +82,7 @@ return else to_chat(user, "Resetting circuitry...") - playsound(user, 'sound/machines/lockenable.ogg', 50, 1) + playsound(src, 'sound/machines/lockenable.ogg', 50, 1) if(do_after(user,20 * O.toolspeed)) locked = 1 to_chat(user, " You re-enable the locking modules.") diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index 158bf5533b..729e578ba5 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -20,7 +20,7 @@ if(user.a_intent == I_HURT) user.setClickCooldown(user.get_attack_speed()) flick("[icon_state]_hit", src) - playsound(src.loc, 'sound/effects/woodhit.ogg', 25, 1, -1) + playsound(src, 'sound/effects/woodhit.ogg', 25, 1, -1) user.do_attack_animation(src) user.nutrition = user.nutrition - 5 to_chat(user, "You [pick(hit_message)] \the [src].") @@ -34,7 +34,7 @@ /obj/structure/fitness/weightlifter/attackby(obj/item/weapon/W as obj, mob/user as mob) if(W.is_wrench()) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 75, 1) weight = ((weight) % qualifiers.len) + 1 to_chat(user, "You set the machine's weight level to [weight].") @@ -52,12 +52,12 @@ return else being_used = 1 - playsound(src.loc, 'sound/effects/weightlifter.ogg', 50, 1) + playsound(src, 'sound/effects/weightlifter.ogg', 50, 1) user.set_dir(SOUTH) flick("[icon_state]_[weight]", src) if(do_after(user, 20 + (weight * 10))) - playsound(src.loc, 'sound/effects/weightdrop.ogg', 25, 1) - user.nutrition -= weight * 10 + playsound(src, 'sound/effects/weightdrop.ogg', 25, 1) + user.adjust_nutrition(weight * -10) to_chat(user, "You lift the weights [qualifiers[weight]].") being_used = 0 else diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index c4d8f58ebd..a9f3658ff6 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -58,9 +58,9 @@ damage_to_do = round(damage_to_do / 4) if(damage_to_do > 0) if(W.sharp && W.edge) - playsound(get_turf(src), 'sound/effects/woodcutting.ogg', 50, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 50, 1) else - playsound(get_turf(src), W.hitsound, 50, 1) + playsound(src, W.hitsound, 50, 1) if(damage_to_do > 5 && !indestructable) adjust_health(-damage_to_do) else diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index d959aaa1ee..2cc53ff821 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -27,7 +27,7 @@ /obj/structure/grille/attack_hand(mob/user as mob) user.setClickCooldown(user.get_attack_speed()) - playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) + playsound(src, 'sound/effects/grillehit.ogg', 80, 1) user.do_attack_animation(src) var/damage_dealt = 1 @@ -153,7 +153,7 @@ else if((W.flags & NOCONDUCT) || !shock(user, 70)) user.setClickCooldown(user.get_attack_speed(W)) user.do_attack_animation(src) - playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) + playsound(src, 'sound/effects/grillehit.ogg', 80, 1) switch(W.damtype) if("fire") health -= W.force diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 995bf4eece..3e58a93850 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -86,7 +86,7 @@ /obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = 1) health = max(0, health - damage) if(sound_effect) - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) if(health <= 0) puncture() @@ -102,7 +102,7 @@ qdel(src) /obj/structure/inflatable/proc/deflate() - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + playsound(src, 'sound/machines/hiss.ogg', 75, 1) //to_chat(user, "You slowly deflate the inflatable wall.") visible_message("[src] slowly deflates.") spawn(50) @@ -111,7 +111,7 @@ qdel(src) /obj/structure/inflatable/proc/puncture() - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + playsound(src, 'sound/machines/hiss.ogg', 75, 1) visible_message("[src] rapidly deflates!") var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) src.transfer_fingerprints_to(R) @@ -227,7 +227,7 @@ icon_state = "door_closed" /obj/structure/inflatable/door/deflate() - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + playsound(src, 'sound/machines/hiss.ogg', 75, 1) visible_message("[src] slowly deflates.") spawn(50) var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) @@ -235,7 +235,7 @@ qdel(src) /obj/structure/inflatable/door/puncture() - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + playsound(src, 'sound/machines/hiss.ogg', 75, 1) visible_message("[src] rapidly deflates!") var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) src.transfer_fingerprints_to(R) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 51b4270b25..f320c478b9 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -3,99 +3,152 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) /obj/structure/janitorialcart name = "janitorial cart" desc = "The ultimate in janitorial carts! Has space for water, mops, signs, trash bags, and more!" + description_info = "You can use alt-click while holding a mop to stow the mop. Alt-click holding a reagent container will empty the contents into the bucket without trying to put the container in any attached trash bag." icon = 'icons/obj/janitor.dmi' icon_state = "cart" anchored = 0 density = 1 - climbable = 1 flags = OPENCONTAINER + climbable = TRUE //copypaste sorry var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite var/obj/item/weapon/storage/bag/trash/mybag = null var/obj/item/weapon/mop/mymop = null var/obj/item/weapon/reagent_containers/spray/myspray = null var/obj/item/device/lightreplacer/myreplacer = null + var/obj/structure/mopbucket/mybucket = null + var/has_items = FALSE + var/dismantled = TRUE var/signs = 0 //maximum capacity hardcoded below -/obj/structure/janitorialcart/New() - create_reagents(300) - ..() +/obj/structure/janitorialcart/Destroy() + QDEL_NULL(mybag) + QDEL_NULL(mymop) + QDEL_NULL(myspray) + QDEL_NULL(myreplacer) + QDEL_NULL(mybucket) + return ..() /obj/structure/janitorialcart/examine(mob/user) - . = ..() - if(Adjacent(user)) - . += "It contains [reagents.total_volume] unit\s of liquid!" + if(..(user, 1)) + if (mybucket) + var/contains = mybucket.reagents.total_volume + to_chat(user, "\icon[src] The bucket contains [contains] unit\s of liquid!") + else + to_chat(user, "\icon[src] There is no bucket mounted on it!") + +/obj/structure/janitorialcart/MouseDrop_T(atom/movable/O as mob|obj, mob/living/user as mob) + if (istype(O, /obj/structure/mopbucket) && !mybucket) + O.forceMove(src) + mybucket = O + to_chat(user, "You mount the [O] on the janicart.") + update_icon() + else + ..() /obj/structure/janitorialcart/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/storage/bag/trash) && !mybag) - user.drop_item() - mybag = I - I.loc = src - update_icon() - updateUsrDialog() - to_chat(user, "You put [I] into [src].") - - else if(istype(I, /obj/item/weapon/mop)) - if(I.reagents.total_volume < I.reagents.maximum_volume) //if it's not completely soaked we assume they want to wet it, otherwise store it - if(reagents.total_volume < 1) - to_chat(user, "[src] is out of water!") + if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/reagent_containers/glass/rag) || istype(I, /obj/item/weapon/soap)) + if (mybucket) + if(I.reagents.total_volume < I.reagents.maximum_volume) + if(mybucket.reagents.total_volume < 1) + to_chat(user, "[mybucket] is empty!") + else + mybucket.reagents.trans_to_obj(I, 5) // + to_chat(user, "You wet [I] in [mybucket].") + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) else - reagents.trans_to_obj(I, 5) // - to_chat(user, "You wet [I] in [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - return - if(!mymop) - user.drop_item() - mymop = I - I.loc = src - update_icon() - updateUsrDialog() - to_chat(user, "You put [I] into [src].") + to_chat(user, "[I] can't absorb anymore liquid!") + else + to_chat(user, "There is no bucket mounted here to dip [I] into!") + return 1 + + else if (istype(I, /obj/item/weapon/reagent_containers/glass/bucket) && mybucket) + I.afterattack(mybucket, usr, 1) + update_icon() + return 1 else if(istype(I, /obj/item/weapon/reagent_containers/spray) && !myspray) - user.drop_item() + user.unEquip(I, 0, src) myspray = I - I.loc = src update_icon() updateUsrDialog() to_chat(user, "You put [I] into [src].") + return 1 else if(istype(I, /obj/item/device/lightreplacer) && !myreplacer) - user.drop_item() + user.unEquip(I, 0, src) myreplacer = I - I.loc = src update_icon() updateUsrDialog() to_chat(user, "You put [I] into [src].") + return 1 + + else if(istype(I, /obj/item/weapon/storage/bag/trash) && !mybag) + user.unEquip(I, 0, src) + mybag = I + update_icon() + updateUsrDialog() + to_chat(user, "You put [I] into [src].") + return 1 else if(istype(I, /obj/item/weapon/caution)) if(signs < 4) - user.drop_item() - I.loc = src + user.unEquip(I, 0, src) signs++ update_icon() updateUsrDialog() to_chat(user, "You put [I] into [src].") else to_chat(user, "[src] can't hold any more signs.") - - else if(istype(I, /obj/item/weapon/reagent_containers/glass)) - return // So we do not put them in the trash bag as we mean to fill the mop bucket + return 1 else if(mybag) - mybag.attackby(I, user) + return mybag.attackby(I, user) + //This return will prevent afterattack from executing if the object goes into the trashbag, + //This prevents dumb stuff like splashing the cart with the contents of a container, after putting said container into trash + + else if (!has_items) + if (I.is_wrench()) + if (do_after(user, 5 SECONDS, src)) + dismantle(user) + return + ..() + + +//New Altclick functionality! +//Altclick the cart with a mop to stow the mop away +//Altclick the cart with a reagent container to pour things into the bucket without putting the bottle in trash +/obj/structure/janitorialcart/AltClick(mob/living/user) + if(user.incapacitated() || !Adjacent(user)) return + var/obj/I = usr.get_active_hand() + if(istype(I, /obj/item/weapon/mop)) + if(!mymop) + usr.drop_from_inventory(I,src) + mymop = I + update_icon() + updateUsrDialog() + to_chat(usr, "You put [I] into [src].") + update_icon() + else + to_chat(usr, "The cart already has a mop attached") + return + else if(istype(I, /obj/item/weapon/reagent_containers) && mybucket) + var/obj/item/weapon/reagent_containers/C = I + C.afterattack(mybucket, usr, 1) + update_icon() /obj/structure/janitorialcart/attack_hand(mob/user) ui_interact(user) return -/obj/structure/janitorialcart/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/structure/janitorialcart/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = TRUE) var/data[0] data["name"] = capitalize(name) data["bag"] = mybag ? capitalize(mybag.name) : null + data["bucket"] = mybucket ? capitalize(mybucket.name) : null data["mop"] = mymop ? capitalize(mymop.name) : null data["spray"] = myspray ? capitalize(myspray.name) : null data["replacer"] = myreplacer ? capitalize(myreplacer.name) : null @@ -107,6 +160,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) ui.set_initial_data(data) ui.open() + /obj/structure/janitorialcart/Topic(href, href_list) if(!in_range(src, usr)) return @@ -146,13 +200,24 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) else warning("[src] signs ([signs]) didn't match contents") signs = 0 + if("bucket") + if(mybucket) + mybucket.forceMove(get_turf(user)) + to_chat(user, "You unmount [mybucket] from [src].") + mybucket = null update_icon() updateUsrDialog() + /obj/structure/janitorialcart/update_icon() - overlays = null + overlays.Cut() + + if(mybucket) + overlays += "cart_bucket" + if(mybucket.reagents.total_volume >= 1) + overlays += "water_cart" if(mybag) overlays += "cart_garbage" if(mymop) @@ -165,6 +230,73 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) overlays += "cart_sign[signs]" + + + + +//This is called if the cart is caught in an explosion, or destroyed by weapon fire +/obj/structure/janitorialcart/proc/spill(var/chance = 100) + var/turf/dropspot = get_turf(src) + if (mymop && prob(chance)) + mymop.forceMove(dropspot) + mymop.tumble(2) + mymop = null + + if (myspray && prob(chance)) + myspray.forceMove(dropspot) + myspray.tumble(3) + myspray = null + + if (myreplacer && prob(chance)) + myreplacer.forceMove(dropspot) + myreplacer.tumble(3) + myreplacer = null + + if (mybucket && prob(chance*0.5))//bucket is heavier, harder to knock off + mybucket.forceMove(dropspot) + mybucket.tumble(1) + mybucket = null + + if (signs) + for (var/obj/item/weapon/caution/Sign in src) + if (prob(min((chance*2),100))) + signs-- + Sign.forceMove(dropspot) + Sign.tumble(3) + if (signs < 0)//safety for something that shouldn't happen + signs = 0 + update_icon() + return + + if (mybag && prob(min((chance*2),100)))//Bag is flimsy + mybag.forceMove(dropspot) + mybag.tumble(1) + mybag.spill()//trashbag spills its contents too + mybag = null + + update_icon() + + + +/obj/structure/janitorialcart/proc/dismantle(var/mob/user = null) + if (!dismantled) + if (has_items) + spill() + + new /obj/item/stack/material/steel(src.loc, 10) + new /obj/item/stack/material/plastic(src.loc, 10) + new /obj/item/stack/rods(src.loc, 20) + dismantled = 1 + qdel(src) + + +/obj/structure/janitorialcart/ex_act(severity) + spill(100 / severity) + ..() + + + + //old style retardo-cart /obj/structure/bed/chair/janicart name = "janicart" @@ -197,7 +329,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) if(reagents.total_volume > 1) reagents.trans_to_obj(I, 2) to_chat(user, "You wet [I] in the [callme].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) else to_chat(user, "This [callme] is out of water!") else if(istype(I, /obj/item/key)) @@ -228,15 +360,6 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) to_chat(user, "You'll need the keys in one of your hands to drive this [callme].") -/obj/structure/bed/chair/janicart/Move() - ..() - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A - if(L.buckled == src) - L.loc = loc - - /obj/structure/bed/chair/janicart/post_buckle_mob(mob/living/M) update_mob() return ..() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 07cc774fb0..4705b39276 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -51,7 +51,7 @@ /obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob) if(I.is_wrench()) if(!glass) - playsound(src.loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) if(do_after(user, 20 * I.toolspeed)) to_chat(user, "You unfasten the frame.") new /obj/item/frame/mirror( src.loc ) @@ -65,7 +65,7 @@ new /obj/item/weapon/material/shard( src.loc ) return if(!shattered && glass) - playsound(src.loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) to_chat(user, "You remove the glass.") glass = !glass icon_state = "mirror_frame" @@ -88,7 +88,7 @@ return if(shattered && glass) - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return if(prob(I.force * 2)) @@ -97,13 +97,13 @@ shatter() else visible_message("[user] hits [src] with [I]!") - playsound(src.loc, 'sound/effects/Glasshit.ogg', 70, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 70, 1) /obj/structure/mirror/attack_generic(var/mob/user, var/damage) user.do_attack_animation(src) if(shattered && glass) - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return 0 if(damage) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 13e3ca4cdc..e7e80206f2 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -28,4 +28,4 @@ GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket) else reagents.trans_to_obj(I, 5) to_chat(user, "You wet \the [I] in \the [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index c1ccfb6c69..d22d903861 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -95,13 +95,13 @@ for(var/atom/movable/A as mob|obj in src.connected.loc) if (!( A.anchored )) A.forceMove(src) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) qdel(src.connected) src.connected = null /obj/structure/morgue/proc/open() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) src.connected = new /obj/structure/m_tray( src.loc ) step(src.connected, src.dir) src.connected.layer = OBJ_LAYER @@ -225,11 +225,11 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) for(var/atom/movable/A as mob|obj in src.connected.loc) if (!( A.anchored )) A.forceMove(src) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) //src.connected = null qdel(src.connected) else if (src.locked == 0) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) src.connected = new /obj/structure/m_tray/c_tray( src.loc ) step(src.connected, EAST) src.connected.layer = OBJ_LAYER @@ -319,7 +319,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) sleep(30) cremating = 0 locked = 0 - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) return diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 39eea11236..cfd036b9bb 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -345,7 +345,7 @@ /obj/structure/device/piano/attackby(obj/item/O as obj, mob/user as mob) if(O.is_wrench()) if(anchored) - playsound(src.loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) to_chat(user, "You begin to loosen \the [src]'s casters...") if (do_after(user, 40 * O.toolspeed)) user.visible_message( \ @@ -354,7 +354,7 @@ "You hear ratchet.") src.anchored = 0 else - playsound(src.loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) to_chat(user, "You begin to tighten \the [src] to the floor...") if (do_after(user, 20 * O.toolspeed)) user.visible_message( \ diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index c701ae9015..629bc1c41e 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -43,7 +43,7 @@ to_chat(user, "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached.") if(O.is_wrench()) to_chat(user, "You start to unwrench the noticeboard.") - playsound(src.loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) if(do_after(user, 15 * O.toolspeed)) to_chat(user, "You unwrench the noticeboard.") new /obj/item/frame/noticeboard( src.loc ) diff --git a/code/game/objects/structures/props/swarm.dm b/code/game/objects/structures/props/swarm.dm index 181001036a..128254a456 100644 --- a/code/game/objects/structures/props/swarm.dm +++ b/code/game/objects/structures/props/swarm.dm @@ -37,7 +37,7 @@ if(prob(1 + damage * 3)) visible_message("[shatter_message]") STOP_PROCESSING(SSobj, src) - playsound(get_turf(src),shatter_sound, 75, 1) + playsound(src,shatter_sound, 75, 1) isbroken = 1 density = 0 icon_state = "[initial(icon_state)]-broken" @@ -53,21 +53,21 @@ ) STOP_PROCESSING(SSobj, src) user.do_attack_animation(src) - playsound(get_turf(src),shatter_sound, 75, 1) + playsound(src,shatter_sound, 75, 1) isbroken = 1 density = 0 icon_state = "[initial(icon_state)]-broken" set_light(0) else to_chat(user, "You hit \the [src]!") - playsound(get_turf(src),impact_sound, 75, 1) + playsound(src,impact_sound, 75, 1) else if(prob(damage * 2)) to_chat(user, "You pulverize what was left of \the [src]!") qdel(src) else to_chat(user, "You hit \the [src]!") - playsound(get_turf(src),impact_sound, 75, 1) + playsound(src,impact_sound, 75, 1) /obj/structure/cult/pylon/swarm/pylon_unique() . = ..() @@ -114,10 +114,10 @@ /obj/structure/cult/pylon/swarm/defender/pylonhit(var/damage) if(!isbroken) - if(prob(1 + damage * 3) && round(damage * 0.8) >= 30) + if(prob(1 + damage * 3) && damage >= 25) visible_message("[shatter_message]") STOP_PROCESSING(SSobj, src) - playsound(get_turf(src),shatter_sound, 75, 1) + playsound(src,shatter_sound, 75, 1) isbroken = 1 density = 0 icon_state = "[initial(icon_state)]-broken" @@ -125,7 +125,7 @@ /obj/structure/cult/pylon/swarm/defender/attackpylon(mob/user as mob, var/damage) if(!isbroken) - if(prob(1 + damage * 3) && round(damage * 0.8) >= 25) + if(prob(1 + damage * 2) && damage >= 15) user.visible_message( "[user] smashed \the [src]!", "You hit \the [src], and its crystal breaks apart!", @@ -133,18 +133,18 @@ ) STOP_PROCESSING(SSobj, src) user.do_attack_animation(src) - playsound(get_turf(src),shatter_sound, 75, 1) + playsound(src,shatter_sound, 75, 1) isbroken = 1 density = 0 icon_state = "[initial(icon_state)]-broken" set_light(0) else to_chat(user, "You hit \the [src]!") - playsound(get_turf(src),impact_sound, 75, 1) + playsound(src,impact_sound, 75, 1) else - if(prob(damage * 2)) + if(prob(damage * 3)) to_chat(user, "You pulverize what was left of \the [src]!") qdel(src) else to_chat(user, "You hit \the [src]!") - playsound(get_turf(src),impact_sound, 75, 1) + playsound(src,impact_sound, 75, 1) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 17b457b49e..5a4ce00a8c 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -1,7 +1,7 @@ // Based on railing.dmi from https://github.com/Endless-Horizon/CEV-Eris /obj/structure/railing name = "railing" - desc = "A standard steel railing. Play stupid games, win stupid prizes." + desc = "A standard steel railing, painted orange. Play stupid games, win stupid prizes." icon = 'icons/obj/railing.dmi' density = 1 throwpass = 1 @@ -14,6 +14,13 @@ var/health = 70 var/maxhealth = 70 var/check = 0 + var/icon_modifier = "" + +/obj/structure/railing/grey + name = "grey railing" + desc = "A standard steel railing. Prevents stupid people from falling to their doom." + icon_modifier = "grey_" + icon_state = "grey_railing0" /obj/structure/railing/New(loc, constructed = 0) ..() @@ -56,7 +63,7 @@ health -= amount if(health <= 0) visible_message("\The [src] breaks down!") - playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) + playsound(src, 'sound/effects/grillehit.ogg', 50, 1) new /obj/item/stack/rods(get_turf(src)) qdel(src) @@ -103,25 +110,25 @@ //layer = (dir == SOUTH) ? FLY_LAYER : initial(layer) // wtf does this even do overlays.Cut() if (!check || !anchored)//|| !anchored - icon_state = "railing0" + icon_state = "[icon_modifier]railing0" else - icon_state = "railing1" + icon_state = "[icon_modifier]railing1" if (check & 32) - overlays += image ('icons/obj/railing.dmi', src, "corneroverlay") + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]corneroverlay") if ((check & 16) || !(check & 32) || (check & 64)) - overlays += image ('icons/obj/railing.dmi', src, "frontoverlay_l") + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]frontoverlay_l") if (!(check & 2) || (check & 1) || (check & 4)) - overlays += image ('icons/obj/railing.dmi', src, "frontoverlay_r") + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]frontoverlay_r") if(check & 4) switch (src.dir) if (NORTH) - overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_x = 32) + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32) if (SOUTH) - overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_x = -32) + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32) if (EAST) - overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_y = -32) + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32) if (WEST) - overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_y = 32) + overlays += image ('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32) /obj/structure/railing/verb/rotate_counterclockwise() set name = "Rotate Railing Counter-Clockwise" @@ -196,7 +203,7 @@ /obj/structure/railing/attackby(obj/item/W as obj, mob/user as mob) // Dismantle if(W.is_wrench() && !anchored) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) if(do_after(user, 20, src)) user.visible_message("\The [user] dismantles \the [src].", "You dismantle \the [src].") new /obj/item/stack/material/steel(get_turf(usr), 2) @@ -207,7 +214,7 @@ if(health < maxhealth && istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/F = W if(F.welding) - playsound(src.loc, F.usesound, 50, 1) + playsound(src, F.usesound, 50, 1) if(do_after(user, 20, src)) user.visible_message("\The [user] repairs some damage to \the [src].", "You repair some damage to \the [src].") health = min(health+(maxhealth/5), maxhealth) // 20% repair per application @@ -216,7 +223,7 @@ // Install if(W.is_screwdriver()) user.visible_message(anchored ? "\The [user] begins unscrewing \the [src]." : "\The [user] begins fasten \the [src]." ) - playsound(loc, W.usesound, 75, 1) + playsound(src, W.usesound, 75, 1) if(do_after(user, 10, src)) to_chat(user, (anchored ? "You have unfastened \the [src] from the floor." : "You have fastened \the [src] to the floor.")) anchored = !anchored @@ -238,7 +245,7 @@ M.apply_damage(8,def_zone = "head") take_damage(8) visible_message("[G.assailant] slams [G.affecting]'s face against \the [src]!") - playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) + playsound(src, 'sound/effects/grillehit.ogg', 50, 1) else to_chat(user, "You need a better grip to do that!") return @@ -253,7 +260,7 @@ return else - playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) + playsound(src, 'sound/effects/grillehit.ogg', 50, 1) take_damage(W.force) user.setClickCooldown(user.get_attack_speed(W)) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 9de9dc082b..e68fa43640 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -114,7 +114,7 @@ FLOOR SAFES tumbler_2_pos = decrement(tumbler_2_pos) if(canhear) to_chat(user, "You hear a [pick("click", "chink", "clink")] from \the [src].") - playsound(user, 'sound/machines/click.ogg', 20, 1) + playsound(src, 'sound/machines/click.ogg', 20, 1) check_unlocked(user, canhear) updateUsrDialog() @@ -130,7 +130,7 @@ FLOOR SAFES tumbler_2_pos = increment(tumbler_2_pos) if(canhear) to_chat(user, "You hear a [pick("click", "chink", "clink")] from \the [src].") - playsound(user, 'sound/machines/click.ogg', 20, 1) + playsound(src, 'sound/machines/click.ogg', 20, 1) check_unlocked(user, canhear) updateUsrDialog() return diff --git a/code/game/objects/structures/salvageable.dm b/code/game/objects/structures/salvageable.dm index 2703a7eed6..201b203acc 100644 --- a/code/game/objects/structures/salvageable.dm +++ b/code/game/objects/structures/salvageable.dm @@ -15,7 +15,7 @@ /obj/structure/salvageable/attackby(obj/item/I, mob/user) if(I.is_crowbar()) - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) var/actual_time = I.toolspeed * 170 user.visible_message( \ "\The [user] begins salvaging from \the [src].", \ @@ -240,7 +240,7 @@ obj/structure/salvageable/bliss/Initialize() /obj/structure/salvageable/bliss/attackby(obj/item/I, mob/user) if((. = ..())) - playsound(user, 'sound/machines/shutdown.ogg', 60, 1) + playsound(src, 'sound/machines/shutdown.ogg', 60, 1) ////////////////// //// ONE STAR //// diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index ff8dbe141e..95689683a5 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -95,7 +95,7 @@ /obj/structure/simple_door/proc/Open() isSwitchingStates = 1 - playsound(loc, material.dooropen_noise, 100, 1) + playsound(src, material.dooropen_noise, 100, 1) flick("[material.door_icon_base]opening",src) sleep(10) density = 0 @@ -107,7 +107,7 @@ /obj/structure/simple_door/proc/Close() isSwitchingStates = 1 - playsound(loc, material.dooropen_noise, 100, 1) + playsound(src, material.dooropen_noise, 100, 1) flick("[material.door_icon_base]closing",src) sleep(10) density = 1 @@ -135,9 +135,9 @@ hardness -= W.force/10 visible_message("[user] hits [src] with [W]!") if(material == get_material_by_name("resin")) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) - playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) else playsound(src, 'sound/weapons/smash.ogg', 50, 1) CheckHardness() @@ -160,9 +160,9 @@ /obj/structure/simple_door/attack_generic(var/mob/user, var/damage, var/attack_verb) visible_message("[user] [attack_verb] the [src]!") if(material == get_material_by_name("resin")) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) - playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) else playsound(src, 'sound/weapons/smash.ogg', 50, 1) user.do_attack_animation(src) diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 270583011d..ebba811fb9 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -73,7 +73,7 @@ /obj/structure/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob) var/aforce = W.force health = max(0, health - aforce) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) for(var/mob/M in viewers(src, 7)) M.show_message("[user] hits [src] with [W]!", 1) healthcheck() diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index ed18290861..3d6743d82b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -124,7 +124,7 @@ to_chat(user, "\The [src] has no padding to remove.") return to_chat(user, "You remove the padding from \the [src].") - playsound(src.loc, W.usesound, 100, 1) + playsound(src, W.usesound, 100, 1) remove_padding() else if(istype(W, /obj/item/weapon/grab)) @@ -286,15 +286,10 @@ held = null -/obj/structure/bed/roller/Move() - ..() +/obj/structure/bed/roller/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + playsound(src, 'sound/effects/roll.ogg', 100, 1) - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A - - if(L.buckled == src) - L.loc = src.loc /obj/structure/bed/roller/post_buckle_mob(mob/living/M as mob) if(M.buckled == src) 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 5f136bbe5d..593e1db1f2 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -21,7 +21,7 @@ return user.drop_item() var/obj/structure/bed/chair/e_chair/E = new (src.loc, material.name) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) E.set_dir(dir) E.part = SK SK.loc = E @@ -139,22 +139,38 @@ return ..() -/obj/structure/bed/chair/office/Move() - ..() +/obj/structure/bed/chair/office/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + playsound(src, 'sound/effects/roll.ogg', 100, 1) - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/occupant = A - occupant.buckled = null - occupant.Move(src.loc) - occupant.buckled = src - if (occupant && (src.loc != occupant.loc)) - if (propelled) - for (var/mob/O in src.loc) - if (O != occupant) - Bump(O) - else - unbuckle_mob() + +/obj/structure/bed/chair/office/handle_buckled_mob_movement(atom/new_loc, direction) + for(var/A in buckled_mobs) + var/mob/living/occupant = A + occupant.buckled = null + occupant.Move(src.loc) + occupant.buckled = src + if (occupant && (src.loc != occupant.loc)) + if (propelled) + for (var/mob/O in src.loc) + if (O != occupant) + Bump(O) + else + unbuckle_mob() + +/obj/structure/bed/chair/office/handle_buckled_mob_movement(atom/new_loc, direction, movetime) + for(var/A in buckled_mobs) + var/mob/living/occupant = A + occupant.buckled = null + occupant.Move(loc, direction, movetime) + occupant.buckled = src + if (occupant && (loc != occupant.loc)) + if (propelled) + for (var/mob/O in src.loc) + if (O != occupant) + Bump(O) + else + unbuckle_mob() /obj/structure/bed/chair/office/Bump(atom/A) ..() @@ -172,7 +188,7 @@ occupant.apply_effect(6, WEAKEN, blocked) occupant.apply_effect(6, STUTTER, blocked) occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked) - playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/punch1.ogg', 50, 1, -1) if(istype(A, /mob/living)) var/mob/living/victim = A def_zone = ran_zone() @@ -231,6 +247,14 @@ else name = "[sofa_material] [initial(name)]" +/obj/structure/bed/chair/update_layer() + // Corner east/west should be on top of mobs, any other state's north should be. + if((icon_state == "sofacorner" && ((dir & EAST) || (dir & WEST))) || (icon_state != "sofacorner" && (dir & NORTH))) + plane = MOB_PLANE + layer = MOB_LAYER + 0.1 + else + reset_plane_and_layer() + /obj/structure/bed/chair/sofa/left icon_state = "sofaend_left" base_icon = "sofaend_left" diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 88b07f3243..407591b285 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -145,7 +145,7 @@ var/global/list/stool_cache = list() //haha stool to_chat(user, "\The [src] has no padding to remove.") return to_chat(user, "You remove the padding from \the [src].") - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) remove_padding() else ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 8a3902fa1d..089e65fc04 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -91,8 +91,9 @@ create_track() driving = 0 -/obj/structure/bed/chair/wheelchair/Move() - ..() +/obj/structure/bed/chair/wheelchair/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + cut_overlays() playsound(src, 'sound/effects/roll.ogg', 75, 1) if(has_buckled_mobs()) @@ -165,7 +166,7 @@ occupant.apply_effect(6, WEAKEN, blocked) occupant.apply_effect(6, STUTTER, blocked) occupant.apply_damage(10, BRUTE, def_zone, soaked) - playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/punch1.ogg', 50, 1, -1) if(istype(A, /mob/living)) var/mob/living/victim = A def_zone = ran_zone() diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 55d8b37d0f..7802e258ea 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -8,45 +8,45 @@ w_class = ITEMSIZE_HUGE var/obj/item/target/pinned_target // the current pinned target - Move() - ..() - // Move the pinned target along with the stake - if(pinned_target in view(3, src)) - pinned_target.loc = loc +/obj/structure/target_stake/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + // Move the pinned target along with the stake + if(pinned_target in view(3, src)) + pinned_target.forceMove(loc) - else // Sanity check: if the pinned target can't be found in immediate view - pinned_target = null - density = 1 + else // Sanity check: if the pinned target can't be found in immediate view + pinned_target = null + density = 1 - attackby(obj/item/W as obj, mob/user as mob) - // Putting objects on the stake. Most importantly, targets - if(pinned_target) - return // get rid of that pinned target first! +/obj/structure/target_stake/attackby(obj/item/W as obj, mob/user as mob) + // Putting objects on the stake. Most importantly, targets + if(pinned_target) + return // get rid of that pinned target first! - if(istype(W, /obj/item/target)) - density = 0 - W.density = 1 - user.remove_from_mob(W) - W.loc = loc - W.layer = ABOVE_JUNK_LAYER - pinned_target = W - to_chat(user, "You slide the target into the stake.") - return + if(istype(W, /obj/item/target)) + density = 0 + W.density = 1 + user.remove_from_mob(W) + W.loc = loc + W.layer = ABOVE_JUNK_LAYER + pinned_target = W + to_chat(user, "You slide the target into the stake.") + return - attack_hand(mob/user as mob) - // taking pinned targets off! - if(pinned_target) - density = 1 - pinned_target.density = 0 - pinned_target.layer = OBJ_LAYER +/obj/structure/target_stake/attack_hand(mob/user as mob) + // taking pinned targets off! + if(pinned_target) + density = 1 + pinned_target.density = 0 + pinned_target.layer = OBJ_LAYER - pinned_target.loc = user.loc - if(ishuman(user)) - if(!user.get_active_hand()) - user.put_in_hands(pinned_target) - to_chat(user, "You take the target out of the stake.") - else - pinned_target.loc = get_turf(user) + pinned_target.loc = user.loc + if(ishuman(user)) + if(!user.get_active_hand()) + user.put_in_hands(pinned_target) to_chat(user, "You take the target out of the stake.") + else + pinned_target.loc = get_turf(user) + to_chat(user, "You take the target out of the stake.") - pinned_target = null + pinned_target = null diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 467579a225..27330786b1 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -46,7 +46,7 @@ /obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob) if(I.is_crowbar()) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].") - playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) + playsound(src, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30)) user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern @@ -172,7 +172,7 @@ if(I.is_wrench()) var/newtemp = input(user, "What setting would you like to set the temperature valve to?", "Water Temperature Valve") in temperature_settings to_chat(user, "You begin to adjust the temperature valve with \the [I].") - playsound(src.loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) if(do_after(user, 50 * I.toolspeed)) watertemp = newtemp user.visible_message("[user] adjusts the shower with \the [I].", "You adjust the shower with \the [I].") @@ -384,14 +384,15 @@ return to_chat(usr, "You start washing your hands.") - playsound(loc, 'sound/effects/sink_long.ogg', 75, 1) + playsound(src, 'sound/effects/sink_long.ogg', 75, 1) busy = 1 - sleep(40) + if(!do_after(user, 40, src)) + busy = 0 + to_chat(usr, "You stop washing your hands.") + return busy = 0 - if(!Adjacent(user)) return //Person has moved away from the sink - user.clean_blood() if(ishuman(user)) user:update_inv_gloves() @@ -407,7 +408,7 @@ if (istype(RG) && RG.is_open_container()) RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) user.visible_message("[user] fills \the [RG] using \the [src].","You fill \the [RG] using \the [src].") - playsound(loc, 'sound/effects/sink.ogg', 75, 1) + playsound(src, 'sound/effects/sink.ogg', 75, 1) return 1 else if (istype(O, /obj/item/weapon/melee/baton)) @@ -431,7 +432,7 @@ else if(istype(O, /obj/item/weapon/mop)) O.reagents.add_reagent("water", 5) to_chat(user, "You wet \the [O] in \the [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) return var/turf/location = user.loc @@ -443,13 +444,12 @@ to_chat(usr, "You start washing \the [I].") busy = 1 - sleep(40) + if(!do_after(user, 40, src)) + busy = 0 + to_chat(usr, "You stop washing \the [I].") + return busy = 0 - if(user.loc != location) return //User has moved - if(!I) return //Item's been destroyed while washing - if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands - O.clean_blood() user.visible_message( \ "[user] washes \a [I] using \the [src].", \ diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 353df5ecb8..400b997dc5 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -91,7 +91,7 @@ obj/structure/windoor_assembly/Destroy() var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly.") - playsound(src.loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) if(do_after(user, 40 * WT.toolspeed)) if(!src || !WT.isOn()) return @@ -157,7 +157,7 @@ obj/structure/windoor_assembly/Destroy() //Adding airlock electronics for access. Step 6 complete. else if(istype(W, /obj/item/weapon/airlock_electronics)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") if(do_after(user, 40)) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c3c3689bfc..762608d5c0 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -59,7 +59,7 @@ shatter() else if(sound_effect) - playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 100, 1) if(health < maxhealth / 4 && initialhealth >= maxhealth / 4) visible_message("[src] looks like it's about to shatter!" ) update_icon() @@ -172,7 +172,7 @@ /obj/structure/window/attack_tk(mob/user as mob) user.visible_message("Something knocks on [src].") - playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 50, 1) /obj/structure/window/attack_hand(mob/user as mob) user.setClickCooldown(user.get_attack_speed()) @@ -190,13 +190,13 @@ attack_generic(H,25) return - playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) + playsound(src, 'sound/effects/glassknock.ogg', 80, 1) user.do_attack_animation(src) usr.visible_message("\The [usr] bangs against \the [src]!", "You bang against \the [src]!", "You hear a banging sound.") else - playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) + playsound(src, 'sound/effects/glassknock.ogg', 80, 1) usr.visible_message("[usr.name] knocks on the [src.name].", "You knock on the [src.name].", "You hear a knocking sound.") @@ -297,13 +297,13 @@ else if(istype(W, /obj/item/stack/cable_coil) && reinf && state == 0 && !istype(src, /obj/structure/window/reinforced/polarized)) var/obj/item/stack/cable_coil/C = W if (C.use(1)) - playsound(src.loc, 'sound/effects/sparks1.ogg', 75, 1) + playsound(src, 'sound/effects/sparks1.ogg', 75, 1) user.visible_message( \ "\The [user] begins to wire \the [src] for electrochromic tinting.", \ "You begin to wire \the [src] for electrochromic tinting.", \ "You hear sparks.") if(do_after(user, 20 * C.toolspeed, src) && state == 0) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) var/obj/structure/window/reinforced/polarized/P = new(loc, dir) if(is_fulltile()) P.fulltile = TRUE @@ -326,7 +326,7 @@ update_nearby_icons() step(src, get_dir(user, src)) else - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) ..() return @@ -412,7 +412,7 @@ /obj/structure/window/Move() var/ini_dir = dir update_nearby_tiles(need_rebuild=1) - ..() + . = ..() set_dir(ini_dir) update_nearby_tiles(need_rebuild=1) @@ -420,6 +420,11 @@ /obj/structure/window/proc/is_fulltile() return fulltile +/obj/structure/window/is_between_turfs(var/turf/origin, var/turf/target) + if(fulltile) + return TRUE + return ..() + //This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc! /obj/structure/window/proc/update_nearby_icons() update_icon() diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index b6fcfdda3b..cc93478e86 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -26,9 +26,10 @@ var/list/flooring_types var/name = "floor" var/desc var/icon - var/icon_base + var/icon_base // initial base icon_state without edges or corners. - var/has_base_range + var/has_base_range // This will pick between a range of 0 - x. Number icon_states accordingly. + // Note that this will append a 0 - x number automatically to icon_base, but NOT the dmi. Do icon_base = "grass", but name grass0 inside the dmi. etc etc. var/has_damage_range var/has_burn_range var/damage_temperature @@ -42,25 +43,176 @@ var/list/flooring_types var/descriptor = "tiles" var/flags var/can_paint - var/list/footstep_sounds = list() // key=species name, value = list of soundss + var/list/footstep_sounds = list() // key=species name, value = list of sounds, + // For instance, footstep_sounds = list("key" = list(sound.ogg)) + var/is_plating = FALSE + var/list/flooring_cache = list() // Cached overlays for our edges and corners and junk + + //Plating types, can be overridden + var/plating_type = null + + //Resistance is subtracted from all incoming damage + //var/resistance = RESISTANCE_FRAGILE + + //Damage the floor can take before being destroyed + //var/health = 50 + + //var/removal_time = WORKTIME_FAST * 0.75 + + //Flooring Icon vars + var/smooth_nothing = FALSE //True/false only, optimisation + //If true, all smoothing logic is entirely skipped + + //The rest of these x_smooth vars use one of the following options + //SMOOTH_NONE: Ignore all of type + //SMOOTH_ALL: Smooth with all of type + //SMOOTH_WHITELIST: Ignore all except types on this list + //SMOOTH_BLACKLIST: Smooth with all except types on this list + //SMOOTH_GREYLIST: Objects only: Use both lists + + //How we smooth with other flooring + var/floor_smooth = SMOOTH_NONE + var/list/flooring_whitelist = list() //Smooth with nothing except the contents of this list + var/list/flooring_blacklist = list() //Smooth with everything except the contents of this list + + //How we smooth with walls + var/wall_smooth = SMOOTH_NONE + //There are no lists for walls at this time + + //How we smooth with space and openspace tiles + var/space_smooth = SMOOTH_NONE + //There are no lists for spaces + + /* + How we smooth with movable atoms + These are checked after the above turf based smoothing has been handled + SMOOTH_ALL or SMOOTH_NONE are treated the same here. Both of those will just ignore atoms + Using the white/blacklists will override what the turfs concluded, to force or deny smoothing + + Movable atom lists are much more complex, to account for many possibilities + Each entry in a list, is itself a list consisting of three items: + Type: The typepath to allow/deny. This will be checked against istype, so all subtypes are included + Priority: Used when items in two opposite lists conflict. The one with the highest priority wins out. + Vars: An associative list of variables (varnames in text) and desired values + Code will look for the desired vars on the target item and only call it a match if all desired values match + This can be used, for example, to check that objects are dense and anchored + there are no safety checks on this, it will probably throw runtimes if you make typos + + Common example: + Don't smooth with dense anchored objects except airlocks + + smooth_movable_atom = SMOOTH_GREYLIST + movable_atom_blacklist = list( + list(/obj, list("density" = TRUE, "anchored" = TRUE), 1) + ) + movable_atom_whitelist = list( + list(/obj/machinery/door/airlock, list(), 2) + ) + + */ + var/smooth_movable_atom = SMOOTH_NONE + var/list/movable_atom_whitelist = list() + var/list/movable_atom_blacklist = list() + +/decl/flooring/proc/get_plating_type(var/turf/T) + return plating_type + +/decl/flooring/proc/get_flooring_overlay(var/cache_key, var/icon_base, var/icon_dir = 0, var/layer = ABOVE_TURF_LAYER) + if(!flooring_cache[cache_key]) + var/image/I = image(icon = icon, icon_state = icon_base, dir = icon_dir) + I.layer = layer + flooring_cache[cache_key] = I + return flooring_cache[cache_key] /decl/flooring/grass name = "grass" desc = "Do they smoke grass out in space, Bowie? Or do they smoke AstroTurf?" icon = 'icons/turf/flooring/grass.dmi' icon_base = "grass" - has_base_range = 3 + has_base_range = 1 damage_temperature = T0C+80 - flags = TURF_HAS_EDGES | TURF_REMOVE_SHOVEL + flags = TURF_HAS_EDGES | TURF_HAS_CORNERS | TURF_REMOVE_SHOVEL build_type = /obj/item/stack/tile/grass + footstep_sounds = list("human" = list( + 'sound/effects/footstep/grass1.ogg', + 'sound/effects/footstep/grass2.ogg', + 'sound/effects/footstep/grass3.ogg', + 'sound/effects/footstep/grass4.ogg')) + +/decl/flooring/grass/sif // Subtype for Sif's grass. + name = "growth" + desc = "A natural moss that has adapted to the sheer cold climate." + flags = TURF_REMOVE_SHOVEL + icon = 'icons/turf/outdoors.dmi' + icon_base = "grass_sif" + has_base_range = 1 + +/decl/flooring/water + name = "water" + desc = "Water is wet, gosh, who knew!" + icon = 'icons/turf/outdoors.dmi' + icon_base = "seashallow" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/water1.ogg', + 'sound/effects/footstep/water2.ogg', + 'sound/effects/footstep/water3.ogg', + 'sound/effects/footstep/water4.ogg')) + +/decl/flooring/sand + name = "sand" + desc = "I don't like sand. It's coarse and rough and irritating and it gets everywhere." + icon = 'icons/misc/beach.dmi' + icon_base = "sand" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/HeavySand1.ogg', + 'sound/effects/footstep/HeavySand2.ogg', + 'sound/effects/footstep/HeavySand3.ogg', + 'sound/effects/footstep/HeavySand4.ogg')) + +/decl/flooring/sand/desert // Subtype of sand, desert. + name = "desert" + desc = "I don't like sand. It's coarse and rough and irritating and it gets everywhere." + icon = 'icons/turf/desert.dmi' + icon_base = "desert" + +/decl/flooring/mud + name = "mud" + desc = "STICKY AND WET!" + icon = 'icons/turf/outdoors.dmi' + icon_base = "mud_dark" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/mud1.ogg', + 'sound/effects/footstep/mud2.ogg', + 'sound/effects/footstep/mud3.ogg', + 'sound/effects/footstep/mud4.ogg')) /decl/flooring/asteroid name = "coarse sand" desc = "Gritty and unpleasant." icon = 'icons/turf/flooring/asteroid.dmi' icon_base = "asteroid" + flags = TURF_REMOVE_SHOVEL + build_type = null + footstep_sounds = list("human" = list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg')) + +/decl/flooring/dirt + name = "dirt" + desc = "Gritty and unpleasant, just like dirt." + icon = 'icons/turf/outdoors.dmi' + icon_base = "dirt-dark" flags = TURF_HAS_EDGES | TURF_REMOVE_SHOVEL build_type = null + footstep_sounds = list("human" = list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg')) /decl/flooring/snow name = "snow" @@ -312,6 +464,12 @@ var/list/flooring_types apply_thermal_conductivity = 0.025 apply_heat_capacity = 325000 can_paint = 1 + footstep_sounds = list("human" = list( + 'sound/effects/footstep/hull1.ogg', + 'sound/effects/footstep/hull2.ogg', + 'sound/effects/footstep/hull3.ogg', + 'sound/effects/footstep/hull4.ogg', + 'sound/effects/footstep/hull5.ogg')) /decl/flooring/reinforced/circuit name = "processing strata" @@ -333,4 +491,14 @@ var/list/flooring_types build_type = null has_damage_range = 6 flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK - can_paint = null \ No newline at end of file + can_paint = null + +/decl/flooring/lava // Defining this in case someone DOES step on lava and survive. Somehow. + name = "lava" + desc = "Lava. Y'know. Sets you on fire. AAAAAAAAAAA" + icon = 'icons/turf/outdoors.dmi' + icon_base = "lava" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/lava1.ogg', + 'sound/effects/footstep/lava2.ogg', + 'sound/effects/footstep/lava3.ogg')) \ No newline at end of file diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 81aa348891..1ddfa79f82 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -29,7 +29,7 @@ var/list/floor_decals = list() var/image/I = floor_decals[cache_key] if(!I) I = image(icon = icon, icon_state = icon_state, dir = dir) - I.layer = T.layer + I.layer = TURF_DECAL_LAYER I.color = color I.alpha = alpha floor_decals[cache_key] = I diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 440ca2a813..a6c26a7bb9 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -386,6 +386,7 @@ name = "snow" icon = 'icons/turf/snow_new.dmi' icon_state = "snow" + initial_flooring = /decl/flooring/snow var/list/crossed_dirs = list() /turf/simulated/floor/snow/snow2 diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 866103376a..e18cf118bd 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -33,7 +33,7 @@ var/lava = 0 /turf/simulated/floor/is_plating() - return !flooring + return (!flooring || flooring.is_plating) /turf/simulated/floor/Initialize(mapload, floortype) . = ..() @@ -41,6 +41,7 @@ floortype = initial_flooring if(floortype) set_flooring(get_flooring_data(floortype), TRUE) + . = INITIALIZE_HINT_LATELOAD // We'll update our icons after everyone is ready else footstep_sounds = base_footstep_sounds if(can_dirty && can_start_dirty) @@ -48,18 +49,23 @@ dirt += rand(50,100) update_dirt() //5% chance to start with dirt on a floor tile- give the janitor something to do +/turf/simulated/floor/LateInitialize() + . = ..() + update_icon(1) + /turf/simulated/floor/proc/swap_decals() var/current_decals = decals decals = old_decals old_decals = current_decals /turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring, var/initializing) - make_plating(defer_icon_update = 1) - if(!flooring && !initializing) // Plating -> Flooring + //make_plating(defer_icon_update = 1) + if(is_plating() && !initializing) // Plating -> Flooring swap_decals() flooring = newflooring footstep_sounds = newflooring.footstep_sounds - update_icon(1) + if(!initializing) + update_icon(1) levelupdate() //This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf @@ -73,11 +79,15 @@ icon_state = base_icon_state footstep_sounds = base_footstep_sounds - if(flooring) // Flooring -> Plating + if(!is_plating()) // Flooring -> Plating swap_decals() if(flooring.build_type && place_product) new flooring.build_type(src) - flooring = null + var/newtype = flooring.get_plating_type() + if(newtype) // Has a custom plating type to become + set_flooring(get_flooring_data(newtype)) + else + flooring = null set_light(0) broken = null @@ -89,8 +99,9 @@ update_icon(1) /turf/simulated/floor/levelupdate() + var/floored_over = !is_plating() for(var/obj/O in src) - O.hide(O.hides_under_flooring() && src.flooring) + O.hide(O.hides_under_flooring() && floored_over) /turf/simulated/floor/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) switch(passed_mode) diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 70bc2646a2..df13c2162c 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -53,7 +53,7 @@ break return - if(flooring) + if(!is_plating()) if(istype(C, /obj/item/weapon)) try_deconstruct_tile(C, user) return @@ -64,7 +64,6 @@ try_replace_tile(C, user) return else - if(istype(C, /obj/item/stack/cable_coil)) if(broken || burnt) to_chat(user, "This section is too damaged to support anything. Use a welder to fix the damage.") @@ -94,7 +93,7 @@ // Stay still and focus... if(use_flooring.build_time && !do_after(user, use_flooring.build_time)) return - if(flooring || !S || !user || !use_flooring) + if(!is_plating() || !S || !user || !use_flooring) return if(S.use(use_flooring.build_cost)) set_flooring(use_flooring) diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index e11ad7e998..e82edc294d 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -1,4 +1,4 @@ -GLOBAL_LIST_EMPTY(flooring_cache) +var/list/flooring_cache = list() var/image/no_ceiling_image = null @@ -36,40 +36,39 @@ var/image/no_ceiling_image = null if(flooring.flags & TURF_HAS_EDGES) for(var/step_dir in cardinal) var/turf/simulated/floor/T = get_step(src, step_dir) - if(!istype(T) || !T.flooring || T.flooring.name != flooring.name) + if(!flooring.test_link(src, T)) has_border |= step_dir - add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[step_dir]", "[flooring.icon_base]_edges", step_dir)) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-edge-[step_dir]", "[flooring.icon_base]_edges", step_dir)) - // There has to be a concise numerical way to do this but I am too noob. - if((has_border & NORTH) && (has_border & EAST)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[NORTHEAST]", "[flooring.icon_base]_edges", NORTHEAST)) - if((has_border & NORTH) && (has_border & WEST)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[NORTHWEST]", "[flooring.icon_base]_edges", NORTHWEST)) - if((has_border & SOUTH) && (has_border & EAST)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHEAST]", "[flooring.icon_base]_edges", SOUTHEAST)) - if((has_border & SOUTH) && (has_border & WEST)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHWEST]", "[flooring.icon_base]_edges", SOUTHWEST)) + //Note: Doesn't actually check northeast, this is bitmath to check if we're edge'd (aka not smoothed) to NORTH and EAST + //North = 0001, East = 0100, Northeast = 0101, so (North|East) == Northeast, therefore (North|East)&Northeast == Northeast + if((has_border & NORTHEAST) == NORTHEAST) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-edge-[NORTHEAST]", "[flooring.icon_base]_edges", NORTHEAST)) + if((has_border & NORTHWEST) == NORTHWEST) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-edge-[NORTHWEST]", "[flooring.icon_base]_edges", NORTHWEST)) + if((has_border & SOUTHEAST) == SOUTHEAST) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHEAST]", "[flooring.icon_base]_edges", SOUTHEAST)) + if((has_border & SOUTHWEST) == SOUTHWEST) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHWEST]", "[flooring.icon_base]_edges", SOUTHWEST)) if(flooring.flags & TURF_HAS_CORNERS) - // As above re: concise numerical way to do this. - if(!(has_border & NORTH)) - if(!(has_border & EAST)) - var/turf/simulated/floor/T = get_step(src, NORTHEAST) - if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[NORTHEAST]", "[flooring.icon_base]_corners", NORTHEAST)) - if(!(has_border & WEST)) - var/turf/simulated/floor/T = get_step(src, NORTHWEST) - if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[NORTHWEST]", "[flooring.icon_base]_corners", NORTHWEST)) - if(!(has_border & SOUTH)) - if(!(has_border & EAST)) - var/turf/simulated/floor/T = get_step(src, SOUTHEAST) - if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHEAST]", "[flooring.icon_base]_corners", SOUTHEAST)) - if(!(has_border & WEST)) - var/turf/simulated/floor/T = get_step(src, SOUTHWEST) - if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST)) + //Like above but checking for NO similar bits rather than both similar bits. + if((has_border & NORTHEAST) == 0) //Are connected NORTH and EAST + var/turf/simulated/floor/T = get_step(src, NORTHEAST) + if(!flooring.test_link(src, T)) //But not NORTHEAST + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-corner-[NORTHEAST]", "[flooring.icon_base]_corners", NORTHEAST)) + if((has_border & NORTHWEST) == 0) + var/turf/simulated/floor/T = get_step(src, NORTHWEST) + if(!flooring.test_link(src, T)) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-corner-[NORTHWEST]", "[flooring.icon_base]_corners", NORTHWEST)) + if((has_border & SOUTHEAST) == 0) + var/turf/simulated/floor/T = get_step(src, SOUTHEAST) + if(!flooring.test_link(src, T)) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHEAST]", "[flooring.icon_base]_corners", SOUTHEAST)) + if((has_border & SOUTHWEST) == 0) + var/turf/simulated/floor/T = get_step(src, SOUTHWEST) + if(!flooring.test_link(src, T)) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST)) // Re-apply floor decals if(LAZYLEN(decals)) @@ -79,11 +78,10 @@ var/image/no_ceiling_image = null icon = 'icons/turf/flooring/plating.dmi' icon_state = "dmg[rand(1,4)]" else if(flooring) - var/rand_key = rand(0,2) if(!isnull(broken) && (flooring.flags & TURF_CAN_BREAK)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-broken-[rand_key]","broken[rand_key]")) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]")) if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN)) - add_overlay(get_flooring_overlay("[flooring.icon_base]-burned-[rand_key]","burned[rand_key]")) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","burned[burnt]")) if(update_neighbors) for(var/turf/simulated/floor/F in range(src, 1)) @@ -96,9 +94,193 @@ var/image/no_ceiling_image = null if(above && isopenspace(above) && !istype(src, /turf/simulated/floor/outdoors)) // This won't apply to outdoor turfs since its assumed they don't have a ceiling anyways. add_overlay(no_ceiling_image) + // Update our 'them-to-us' edges, aka edges from external turfs we feel should spill onto us + if(edge_blending_priority && !forbid_turf_edge()) + update_icon_edge() + +// This updates an edge from an adjacent turf onto us, not our own 'internal' edges. +// For e.g. we might be outdoor metal plating, and we want to find sand next to us to have it 'spill onto' our turf with an overlay. +/turf/simulated/proc/update_icon_edge() + for(var/checkdir in cardinal) // Check every direction + var/turf/simulated/T = get_step(src, checkdir) // Get the turf in that direction + // Our conditions: + // Has to be a /turf/simulated + // Has to have it's own edge_blending_priority + // Has to have a higher priority than us + // Their icon_state is not our icon_state + // They don't forbid_turf_edge + if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state && !T.forbid_turf_edge()) + var/cache_key = "[T.get_edge_icon_state()]-[checkdir]" // Usually [icon_state]-[dirnum] + if(!turf_edge_cache[cache_key]) + var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER) // Icon should be abstracted out + I.plane = TURF_PLANE + turf_edge_cache[cache_key] = I + add_overlay(turf_edge_cache[cache_key]) + +// We will take this state and use it for a cache key, and append '-edge' to it to get the edge overlay (edges *from other turfs*, not our own internal edges) +/turf/simulated/proc/get_edge_icon_state() + return icon_state + +// Tests if we shouldn't apply a turf edge. +// Returns the blocker if one exists. +/turf/simulated/proc/forbid_turf_edge() + for(var/obj/structure/S in contents) + if(S.block_turf_edges) + return S + return null + +//Tests whether this flooring will smooth with the specified turf +//You can override this if you want a flooring to have super special snowflake smoothing behaviour +/decl/flooring/proc/test_link(var/turf/origin, var/turf/T, var/countercheck = FALSE) + + var/is_linked = FALSE + if (countercheck) + //If this is a countercheck, we skip all of the above, start off with true, and go straight to the atom lists + is_linked = TRUE + else if(T) + + //If it's a wall, use the wall_smooth setting + if(istype(T, /turf/simulated/wall)) + if(wall_smooth == SMOOTH_ALL) + is_linked = TRUE + + //If it's space or openspace, use the space_smooth setting + else if(isspace(T) || isopenspace(T)) + if(space_smooth == SMOOTH_ALL) + is_linked = TRUE + + //If we get here then its a normal floor + else if (istype(T, /turf/simulated/floor)) + var/turf/simulated/floor/t = T + //If the floor is the same as us,then we're linked, + if (t.flooring?.type == type) + is_linked = TRUE + /* + But there's a caveat. To make atom black/whitelists work correctly, we also need to check that + they smooth with us. Ill call this counterchecking for simplicity. + This is needed to make both turfs have the correct borders + + To prevent infinite loops we have a countercheck var, which we'll set true + */ + + if (smooth_movable_atom != SMOOTH_NONE) + //We do the countercheck, passing countercheck as true + is_linked = test_link(T, origin, countercheck = TRUE) + + else if (floor_smooth == SMOOTH_ALL) + is_linked = TRUE + + else if (floor_smooth != SMOOTH_NONE) + //If we get here it must be using a whitelist or blacklist + if (floor_smooth == SMOOTH_WHITELIST) + for (var/v in flooring_whitelist) + if (istype(t.flooring, v)) + //Found a match on the list + is_linked = TRUE + break + else if(floor_smooth == SMOOTH_BLACKLIST) + is_linked = TRUE //Default to true for the blacklist, then make it false if a match comes up + for (var/v in flooring_whitelist) + if (istype(t.flooring, v)) + //Found a match on the list + is_linked = FALSE + break + + //Alright now we have a preliminary answer about smoothing, however that answer may change with the following + //Atom lists! + var/best_priority = -1 + //A white or blacklist entry will only override smoothing if its priority is higher than this + //And then this value becomes its priority + if (smooth_movable_atom != SMOOTH_NONE) + if (smooth_movable_atom == SMOOTH_WHITELIST || smooth_movable_atom == SMOOTH_GREYLIST) + for (var/list/v in movable_atom_whitelist) + var/d_type = v[1] + var/list/d_vars = v[2] + var/d_priority = v[3] + //Priority is the quickest thing to check first + if (d_priority <= best_priority) + continue + + //Ok, now we start testing all the atoms in the target turf + for (var/a in T) //No implicit typecasting here, faster + + if (istype(a, d_type)) + //It's the right type, so we're sure it will have the vars we want. + + var/atom/movable/AM = a + //Typecast it to a movable atom + //Lets make sure its in the way before we consider it + if (!AM.is_between_turfs(origin, T)) + continue + + //From here on out, we do dangerous stuff that may runtime if the coder screwed up + + + var/match = TRUE + for (var/d_var in d_vars) + //For each variable we want to check + if (AM.vars[d_var] != d_vars[d_var]) + //We get a var of the same name from the atom's vars list. + //And check if it equals our desired value + match = FALSE + break //If any var doesn't match the desired value, then this atom is not a match, move on + + + if (match) + //If we've successfully found an atom which matches a list entry + best_priority = d_priority //This one is king until a higher priority overrides it + + //And this is a whitelist, so this match forces is_linked to true + is_linked = TRUE + + + if (smooth_movable_atom == SMOOTH_BLACKLIST || smooth_movable_atom == SMOOTH_GREYLIST) + //All of this blacklist code is copypasted from above, with only minor name changes + for (var/list/v in movable_atom_blacklist) + var/d_type = v[1] + var/list/d_vars = v[2] + var/d_priority = v[3] + //Priority is the quickest thing to check first + if (d_priority <= best_priority) + continue + + //Ok, now we start testing all the atoms in the target turf + for (var/a in T) //No implicit typecasting here, faster + + if (istype(a, d_type)) + //It's the right type, so we're sure it will have the vars we want. + + var/atom/movable/AM = a + //Typecast it to a movable atom + //Lets make sure its in the way before we consider it + if (!AM.is_between_turfs(origin, T)) + continue + + //From here on out, we do dangerous stuff that may runtime if the coder screwed up + + var/match = TRUE + for (var/d_var in d_vars) + //For each variable we want to check + if (AM.vars[d_var] != d_vars[d_var]) + //We get a var of the same name from the atom's vars list. + //And check if it equals our desired value + match = FALSE + break //If any var doesn't match the desired value, then this atom is not a match, move on + + + if (match) + //If we've successfully found an atom which matches a list entry + best_priority = d_priority //This one is king until a higher priority overrides it + + //And this is a blacklist, so this match forces is_linked to false + is_linked = FALSE + + return is_linked + /turf/simulated/floor/proc/get_flooring_overlay(var/cache_key, var/icon_base, var/icon_dir = 0) - if(!GLOB.flooring_cache[cache_key]) + if(!flooring_cache[cache_key]) var/image/I = image(icon = flooring.icon, icon_state = icon_base, dir = icon_dir) I.layer = layer - GLOB.flooring_cache[cache_key] = I - return GLOB.flooring_cache[cache_key] + flooring_cache[cache_key] = I + return flooring_cache[cache_key] + diff --git a/code/game/turfs/simulated/floor_types_eris.dm b/code/game/turfs/simulated/floor_types_eris.dm new file mode 100644 index 0000000000..00b66d0d8a --- /dev/null +++ b/code/game/turfs/simulated/floor_types_eris.dm @@ -0,0 +1,1010 @@ + +//////////////////////////// +/// ERIS FLOOR DECLS /////// +//////////////////////////// + +/decl/flooring/tiling/eris + name = "floor" + desc = "Scuffed from the passage of countless greyshirts." + icon = 'icons/turf/flooring/eris/tiles.dmi' + icon_base = "tiles" + has_damage_range = 2 + damage_temperature = T0C+1400 + flags = TURF_HAS_EDGES | TURF_HAS_CORNERS | TURF_REMOVE_CROWBAR | TURF_CAN_BREAK + build_type = /obj/item/stack/tile/floor/eris + can_paint = 1 + + plating_type = /decl/flooring/reinforced/plating/under + + floor_smooth = SMOOTH_WHITELIST + flooring_whitelist = list( + /decl/flooring/reinforced/plating/under + ) + + smooth_movable_atom = SMOOTH_GREYLIST + movable_atom_whitelist = list( + list(/obj/machinery/door/airlock, list(), 1) // Smooth Eris floors with airlocks + ) + movable_atom_blacklist = list( + list(/obj/machinery/door/airlock/maintenance, list(), 2), // But not maintenance airlocks + list(/obj/structure/window, list("anchored" = TRUE, "fulltile" = TRUE), 2) // Don't blend under full windows + ) + +/decl/flooring/tiling/eris/steel + name = "steel floor" + icon_base = "tiles" + icon = 'icons/turf/flooring/eris/tiles_steel.dmi' + build_type = /obj/item/stack/tile/floor/eris/steel + +/decl/flooring/tiling/eris/steel/panels + icon_base = "panels" + build_type = /obj/item/stack/tile/floor/eris/steel/panels + +/decl/flooring/tiling/eris/steel/techfloor + icon_base = "techfloor" + build_type = /obj/item/stack/tile/floor/eris/steel/techfloor + +/decl/flooring/tiling/eris/steel/techfloor_grid + icon_base = "techfloor_grid" + build_type = /obj/item/stack/tile/floor/eris/steel/techfloor_grid + +/decl/flooring/tiling/eris/steel/brown_perforated + icon_base = "brown_perforated" + build_type = /obj/item/stack/tile/floor/eris/steel/brown_perforated + +/decl/flooring/tiling/eris/steel/gray_perforated + icon_base = "gray_perforated" + build_type = /obj/item/stack/tile/floor/eris/steel/gray_perforated + +/decl/flooring/tiling/eris/steel/cargo + icon_base = "cargo" + build_type = /obj/item/stack/tile/floor/eris/steel/cargo + +/decl/flooring/tiling/eris/steel/brown_platform + icon_base = "brown_platform" + build_type = /obj/item/stack/tile/floor/eris/steel/brown_platform + +/decl/flooring/tiling/eris/steel/gray_platform + icon_base = "gray_platform" + build_type = /obj/item/stack/tile/floor/eris/steel/gray_platform + +/decl/flooring/tiling/eris/steel/danger + icon_base = "danger" + build_type = /obj/item/stack/tile/floor/eris/steel/danger + +/decl/flooring/tiling/eris/steel/golden + icon_base = "golden" + build_type = /obj/item/stack/tile/floor/eris/steel/golden + +/decl/flooring/tiling/eris/steel/bluecorner + icon_base = "bluecorner" + build_type = /obj/item/stack/tile/floor/eris/steel/bluecorner + +/decl/flooring/tiling/eris/steel/orangecorner + icon_base = "orangecorner" + build_type = /obj/item/stack/tile/floor/eris/steel/orangecorner + +/decl/flooring/tiling/eris/steel/cyancorner + icon_base = "cyancorner" + build_type = /obj/item/stack/tile/floor/eris/steel/cyancorner + +/decl/flooring/tiling/eris/steel/violetcorener + icon_base = "violetcorener" + build_type = /obj/item/stack/tile/floor/eris/steel/violetcorener + +/decl/flooring/tiling/eris/steel/monofloor + icon_base = "monofloor" + build_type = /obj/item/stack/tile/floor/eris/steel/monofloor + has_base_range = 15 + +/decl/flooring/tiling/eris/steel/bar_flat + name = "flat bar floor" + icon_base = "bar_flat" + build_type = /obj/item/stack/tile/floor/eris/steel/bar_flat + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/steel/bar_dance + name = "dancefloor" + icon_base = "bar_dance" + build_type = /obj/item/stack/tile/floor/eris/steel/bar_dance + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/steel/bar_light + name = "lit bar floor" + icon_base = "bar_light" + build_type = /obj/item/stack/tile/floor/eris/steel/bar_light + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/white + name = "white floor" + icon_base = "tiles" + icon = 'icons/turf/flooring/eris/tiles_white.dmi' + build_type = /obj/item/stack/tile/floor/eris/white + +/decl/flooring/tiling/eris/white/panels + icon_base = "panels" + build_type = /obj/item/stack/tile/floor/eris/white/panels + +/decl/flooring/tiling/eris/white/techfloor + icon_base = "techfloor" + build_type = /obj/item/stack/tile/floor/eris/white/techfloor + +/decl/flooring/tiling/eris/white/techfloor_grid + icon_base = "techfloor_grid" + build_type = /obj/item/stack/tile/floor/eris/white/techfloor_grid + +/decl/flooring/tiling/eris/white/brown_perforated + icon_base = "brown_perforated" + build_type = /obj/item/stack/tile/floor/eris/white/brown_perforated + +/decl/flooring/tiling/eris/white/gray_perforated + icon_base = "gray_perforated" + build_type = /obj/item/stack/tile/floor/eris/white/gray_perforated + +/decl/flooring/tiling/eris/white/cargo + icon_base = "cargo" + build_type = /obj/item/stack/tile/floor/eris/white/cargo + +/decl/flooring/tiling/eris/white/brown_platform + icon_base = "brown_platform" + build_type = /obj/item/stack/tile/floor/eris/white/brown_platform + +/decl/flooring/tiling/eris/white/gray_platform + icon_base = "gray_platform" + build_type = /obj/item/stack/tile/floor/eris/white/gray_platform + +/decl/flooring/tiling/eris/white/danger + icon_base = "danger" + build_type = /obj/item/stack/tile/floor/eris/white/danger + +/decl/flooring/tiling/eris/white/golden + icon_base = "golden" + build_type = /obj/item/stack/tile/floor/eris/white/golden + +/decl/flooring/tiling/eris/white/bluecorner + icon_base = "bluecorner" + build_type = /obj/item/stack/tile/floor/eris/white/bluecorner + +/decl/flooring/tiling/eris/white/orangecorner + icon_base = "orangecorner" + build_type = /obj/item/stack/tile/floor/eris/white/orangecorner + +/decl/flooring/tiling/eris/white/cyancorner + icon_base = "cyancorner" + build_type = /obj/item/stack/tile/floor/eris/white/cyancorner + +/decl/flooring/tiling/eris/white/violetcorener + icon_base = "violetcorener" + build_type = /obj/item/stack/tile/floor/eris/white/violetcorener + +/decl/flooring/tiling/eris/white/monofloor + icon_base = "monofloor" + build_type = /obj/item/stack/tile/floor/eris/white/monofloor + has_base_range = 15 + +/decl/flooring/tiling/eris/dark + name = "dark floor" + icon_base = "tiles" + icon = 'icons/turf/flooring/eris/tiles_dark.dmi' + build_type = /obj/item/stack/tile/floor/eris/dark + +/decl/flooring/tiling/eris/dark/panels + icon_base = "panels" + build_type = /obj/item/stack/tile/floor/eris/dark/panels + +/decl/flooring/tiling/eris/dark/techfloor + icon_base = "techfloor" + build_type = /obj/item/stack/tile/floor/eris/dark/techfloor + +/decl/flooring/tiling/eris/dark/techfloor_grid + icon_base = "techfloor_grid" + build_type = /obj/item/stack/tile/floor/eris/dark/techfloor_grid + +/decl/flooring/tiling/eris/dark/brown_perforated + icon_base = "brown_perforated" + build_type = /obj/item/stack/tile/floor/eris/dark/brown_perforated + +/decl/flooring/tiling/eris/dark/gray_perforated + icon_base = "gray_perforated" + build_type = /obj/item/stack/tile/floor/eris/dark/gray_perforated + +/decl/flooring/tiling/eris/dark/cargo + icon_base = "cargo" + build_type = /obj/item/stack/tile/floor/eris/dark/cargo + +/decl/flooring/tiling/eris/dark/brown_platform + icon_base = "brown_platform" + build_type = /obj/item/stack/tile/floor/eris/dark/brown_platform + +/decl/flooring/tiling/eris/dark/gray_platform + icon_base = "gray_platform" + build_type = /obj/item/stack/tile/floor/eris/dark/gray_platform + +/decl/flooring/tiling/eris/dark/danger + icon_base = "danger" + build_type = /obj/item/stack/tile/floor/eris/dark/danger + +/decl/flooring/tiling/eris/dark/golden + icon_base = "golden" + build_type = /obj/item/stack/tile/floor/eris/dark/golden + +/decl/flooring/tiling/eris/dark/bluecorner + icon_base = "bluecorner" + build_type = /obj/item/stack/tile/floor/eris/dark/bluecorner + +/decl/flooring/tiling/eris/dark/orangecorner + icon_base = "orangecorner" + build_type = /obj/item/stack/tile/floor/eris/dark/orangecorner + +/decl/flooring/tiling/eris/dark/cyancorner + icon_base = "cyancorner" + build_type = /obj/item/stack/tile/floor/eris/dark/cyancorner + +/decl/flooring/tiling/eris/dark/violetcorener + icon_base = "violetcorener" + build_type = /obj/item/stack/tile/floor/eris/dark/violetcorener + +/decl/flooring/tiling/eris/dark/monofloor + icon_base = "monofloor" + build_type = /obj/item/stack/tile/floor/eris/dark/monofloor + has_base_range = 15 + +/decl/flooring/tiling/eris/cafe + name = "linoleum floor" + icon_base = "cafe" + icon = 'icons/turf/flooring/eris/tiles.dmi' + build_type = /obj/item/stack/tile/floor/eris/cafe + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/techmaint + name = "techmaint floor" + icon_base = "techmaint" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + build_type = /obj/item/stack/tile/floor/eris/techmaint + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/techmaint_perforated + name = "techmaint floor" + icon_base = "techmaint_perforated" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + build_type = /obj/item/stack/tile/floor/eris/techmaint/perforated + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/techmaint_panels + name = "techmaint floor" + icon_base = "techmaint_panels" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + build_type = /obj/item/stack/tile/floor/eris/techmaint/panels + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/decl/flooring/tiling/eris/techmaint_cargo + name = "techmaint floor" + icon_base = "techmaint_cargo" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + build_type = /obj/item/stack/tile/floor/eris/techmaint/cargo + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + +/////////////////////// +/// TILE OBJS /////// +/////////////////////// +/obj/item/stack/tile/floor/eris + icon = 'icons/turf/flooring/eris/tilestack.dmi' + +// Cafe +/obj/item/stack/tile/floor/eris/cafe + name = "cafe floor tile" + singular_name = "cafe floor tile" + desc = "A chekered pattern, an ancient style for a familiar feeling." + icon_state = "tile_cafe" + matter = list(MAT_PLASTIC = 1) + +// Techmaint +/obj/item/stack/tile/floor/eris/techmaint + name = "maint floor tile" + singular_name = "maint floor tile" + icon_state = "tile_techmaint" + matter = list(MAT_STEEL = 1) + +/obj/item/stack/tile/floor/eris/techmaint/perforated + name = "perforated maint floor tile" + singular_name = "perforated maint floor tile" + icon_state = "tile_techmaint_perforated" + +/obj/item/stack/tile/floor/eris/techmaint/panels + name = "panel maint floor tile" + singular_name = "panel maint floor tile" + icon_state = "tile_techmaint_panels" + +/obj/item/stack/tile/floor/eris/techmaint/cargo + name = "cargo maint floor tile" + singular_name = "cargo maint floor tile" + icon_state = "tile_techmaint_cargo" + +/* + * Steel + */ +/obj/item/stack/tile/floor/eris/steel + name = "steel floor tile" + singular_name = "steel floor tile" + icon_state = "tile_steel" + matter = list(MAT_STEEL = 1) + +/obj/item/stack/tile/floor/eris/steel/panels + name = "steel panel tile" + singular_name = "steel panel tile" + icon_state = "tile_steel_panels" + +/obj/item/stack/tile/floor/eris/steel/techfloor + name = "steel techfloor tile" + singular_name = "steel techfloor tile" + icon_state = "tile_steel_techfloor" + +/obj/item/stack/tile/floor/eris/steel/techfloor_grid + name = "steel techfloor tile with vents" + singular_name = "steel techfloor tile with vents" + icon_state = "tile_steel_techfloor_grid" + +/obj/item/stack/tile/floor/eris/steel/brown_perforated + name = "steel brown perforated tile" + singular_name = "steel brown perforated tile" + icon_state = "tile_steel_brownperforated" + +/obj/item/stack/tile/floor/eris/steel/gray_perforated + name = "steel gray perforated tile" + singular_name = "steel gray perforated tile" + icon_state = "tile_steel_grayperforated" + +/obj/item/stack/tile/floor/eris/steel/cargo + name = "steel cargo tile" + singular_name = "steel cargo tile" + icon_state = "tile_steel_cargo" + +/obj/item/stack/tile/floor/eris/steel/brown_platform + name = "steel brown platform tile" + singular_name = "steel brown platform tile" + icon_state = "tile_steel_brownplatform" + +/obj/item/stack/tile/floor/eris/steel/gray_platform + name = "steel gray platform tile" + singular_name = "steel gray platform tile" + icon_state = "tile_steel_grayplatform" + +/obj/item/stack/tile/floor/eris/steel/danger + name = "steel danger tile" + singular_name = "steel danger tile" + icon_state = "tile_steel_danger" + +/obj/item/stack/tile/floor/eris/steel/golden + name = "steel golden tile" + singular_name = "steel golden tile" + icon_state = "tile_steel_golden" + +/obj/item/stack/tile/floor/eris/steel/bluecorner + name = "steel blue corner tile" + singular_name = "steel blue corner tile" + icon_state = "tile_steel_bluecorner" + +/obj/item/stack/tile/floor/eris/steel/orangecorner + name = "steel orange corner tile" + singular_name = "steel orange corner tilee" + icon_state = "tile_steel_orangecorner" + +/obj/item/stack/tile/floor/eris/steel/cyancorner + name = "steel cyan corner tile" + singular_name = "steel cyan corner tile" + icon_state = "tile_steel_cyancorner" + +/obj/item/stack/tile/floor/eris/steel/violetcorener + name = "steel violet corener tile" + singular_name = "steel violet corener tile" + icon_state = "tile_steel_violetcorener" + +/obj/item/stack/tile/floor/eris/steel/monofloor + name = "steel monofloor tile" + singular_name = "steel monofloor tile" + icon_state = "tile_steel_monofloor" + +/obj/item/stack/tile/floor/eris/steel/bar_flat + name = "steel bar flat tile" + singular_name = "steel bar flat tile" + icon_state = "tile_steel_bar_flat" + +/obj/item/stack/tile/floor/eris/steel/bar_dance + name = "steel bar dance tile" + singular_name = "steel bar dance tile" + icon_state = "tile_steel_bar_dance" + +/obj/item/stack/tile/floor/eris/steel/bar_light + name = "steel bar light tile" + singular_name = "steel bar light tile" + icon_state = "tile_steel_bar_light" + +/* + * Plastic + */ +/obj/item/stack/tile/floor/eris/white + name = "white floor tile" + singular_name = "white floor tile" + desc = "Appears to be made out of a lighter mat." + icon_state = "tile_white" + matter = list(MAT_PLASTIC = 1) + +/obj/item/stack/tile/floor/eris/white/panels + name = "white panel tile" + singular_name = "white panel tile" + icon_state = "tile_white_panels" + +/obj/item/stack/tile/floor/eris/white/techfloor + name = "white techfloor tile" + singular_name = "white techfloor tile" + icon_state = "tile_white_techfloor" + +/obj/item/stack/tile/floor/eris/white/techfloor_grid + name = "white techfloor tile with vents" + singular_name = "white techfloor tile with vents" + icon_state = "tile_white_techfloor_grid" + +/obj/item/stack/tile/floor/eris/white/brown_perforated + name = "white brown perforated tile" + singular_name = "white brown perforated tile" + icon_state = "tile_white_brownperforated" + +/obj/item/stack/tile/floor/eris/white/gray_perforated + name = "white gray perforated tile" + singular_name = "white gray perforated tile" + icon_state = "tile-white-grayperforated" + +/obj/item/stack/tile/floor/eris/white/cargo + name = "white cargo tile" + singular_name = "white cargo tile" + icon_state = "tile_white_cargo" + +/obj/item/stack/tile/floor/eris/white/brown_platform + name = "white brown platform tile" + singular_name = "white brown platform tile" + icon_state = "tile_white_brownplatform" + +/obj/item/stack/tile/floor/eris/white/gray_platform + name = "white gray platform tile" + singular_name = "white gray platform tile" + icon_state = "tile_white_grayplatform" + +/obj/item/stack/tile/floor/eris/white/danger + name = "white danger tile" + singular_name = "white danger tile" + icon_state = "tile_white_danger" + +/obj/item/stack/tile/floor/eris/white/golden + name = "white golden tile" + singular_name = "white golden tile" + icon_state = "tile_white_golden" + +/obj/item/stack/tile/floor/eris/white/bluecorner + name = "white blue corner tile" + singular_name = "white blue corner tile" + icon_state = "tile_white_bluecorner" + +/obj/item/stack/tile/floor/eris/white/orangecorner + name = "white orange corner tile" + singular_name = "white orange corner tilee" + icon_state = "tile_white_orangecorner" + +/obj/item/stack/tile/floor/eris/white/cyancorner + name = "white cyan corner tile" + singular_name = "white cyan corner tile" + icon_state = "tile_white_cyancorner" + +/obj/item/stack/tile/floor/eris/white/violetcorener + name = "white violet corener tile" + singular_name = "white violet corener tile" + icon_state = "tile_white_violetcorener" + +/obj/item/stack/tile/floor/eris/white/monofloor + name = "white monofloor tile" + singular_name = "white monofloor tile" + icon_state = "tile_white_monofloor" + +/* + * Steel + */ +/obj/item/stack/tile/floor/eris/dark + name = "dark floor tile" + singular_name = "dark floor tile" + icon_state = "tile_dark" + matter = list(MAT_STEEL = 1) + +/obj/item/stack/tile/floor/eris/dark/panels + name = "dark panel tile" + singular_name = "dark panel tile" + icon_state = "tile_dark_panels" + +/obj/item/stack/tile/floor/eris/dark/techfloor + name = "dark techfloor tile" + singular_name = "dark techfloor tile" + icon_state = "tile_dark_techfloor" + +/obj/item/stack/tile/floor/eris/dark/techfloor_grid + name = "dark techfloor tile with vents" + singular_name = "dark techfloor tile with vents" + icon_state = "tile_dark_techfloor_grid" + +/obj/item/stack/tile/floor/eris/dark/brown_perforated + name = "dark brown perforated tile" + singular_name = "dark brown perforated tile" + icon_state = "tile_dark_brownperforated" + +/obj/item/stack/tile/floor/eris/dark/gray_perforated + name = "dark gray perforated tile" + singular_name = "dark gray perforated tile" + icon_state = "tile_dark_grayperforated" + +/obj/item/stack/tile/floor/eris/dark/cargo + name = "dark cargo tile" + singular_name = "dark cargo tile" + icon_state = "tile_dark_cargo" + +/obj/item/stack/tile/floor/eris/dark/brown_platform + name = "dark brown platform tile" + singular_name = "dark brown platform tile" + icon_state = "tile_dark_brownplatform" + +/obj/item/stack/tile/floor/eris/dark/gray_platform + name = "dark gray platform tile" + singular_name = "dark gray platform tile" + icon_state = "tile_dark_grayplatform" + +/obj/item/stack/tile/floor/eris/dark/danger + name = "dark danger tile" + singular_name = "dark danger tile" + icon_state = "tile_dark_danger" + +/obj/item/stack/tile/floor/eris/dark/golden + name = "dark golden tile" + singular_name = "dark golden tile" + icon_state = "tile_dark_golden" + +/obj/item/stack/tile/floor/eris/dark/bluecorner + name = "dark blue corner tile" + singular_name = "dark blue corner tile" + icon_state = "tile_dark_bluecorner" + +/obj/item/stack/tile/floor/eris/dark/orangecorner + name = "dark orange corner tile" + singular_name = "dark orange corner tilee" + icon_state = "tile_dark_orangecorner" + +/obj/item/stack/tile/floor/eris/dark/cyancorner + name = "dark cyan corner tile" + singular_name = "dark cyan corner tile" + icon_state = "tile_dark_cyancorner" + +/obj/item/stack/tile/floor/eris/dark/violetcorener + name = "dark violet corener tile" + singular_name = "dark violet corener tile" + icon_state = "tile_dark_violetcorener" + +/obj/item/stack/tile/floor/eris/dark/monofloor + name = "dark monofloor tile" + singular_name = "dark monofloor tile" + icon_state = "tile_dark_monofloor" + + +/////////////////////// +/// PREMADE TURFS ///// +/////////////////////// +/turf/simulated/floor/tiled/eris + name = "floor" + icon = 'icons/turf/flooring/eris/tiles.dmi' + icon_state = "tiles" + initial_flooring = /decl/flooring/tiling/eris + + + +//Steel tiles +/turf/simulated/floor/tiled/eris/steel + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_steel.dmi' + icon_state = "tiles" + initial_flooring = /decl/flooring/tiling/eris/steel + +/turf/simulated/floor/tiled/eris/steel/panels + icon_state = "panels" + initial_flooring = /decl/flooring/tiling/eris/steel/panels + +/turf/simulated/floor/tiled/eris/steel/techfloor + icon_state = "techfloor" + initial_flooring = /decl/flooring/tiling/eris/steel/techfloor + +/turf/simulated/floor/tiled/eris/steel/techfloor_grid + icon_state = "techfloor_grid" + initial_flooring = /decl/flooring/tiling/eris/steel/techfloor_grid + +/turf/simulated/floor/tiled/eris/steel/brown_perforated + icon_state = "brown_perforated" + initial_flooring = /decl/flooring/tiling/eris/steel/brown_perforated + +/turf/simulated/floor/tiled/eris/steel/gray_perforated + icon_state = "gray_perforated" + initial_flooring = /decl/flooring/tiling/eris/steel/gray_perforated + +/turf/simulated/floor/tiled/eris/steel/cargo + icon_state = "cargo" + initial_flooring = /decl/flooring/tiling/eris/steel/cargo + +/turf/simulated/floor/tiled/eris/steel/brown_platform + icon_state = "brown_platform" + initial_flooring = /decl/flooring/tiling/eris/steel/brown_platform + +/turf/simulated/floor/tiled/eris/steel/gray_platform + icon_state = "gray_platform" + initial_flooring = /decl/flooring/tiling/eris/steel/gray_platform + +/turf/simulated/floor/tiled/eris/steel/danger + icon_state = "danger" + initial_flooring = /decl/flooring/tiling/eris/steel/danger + +/turf/simulated/floor/tiled/eris/steel/golden + icon_state = "golden" + initial_flooring = /decl/flooring/tiling/eris/steel/golden + +/turf/simulated/floor/tiled/eris/steel/bluecorner + icon_state = "bluecorner" + initial_flooring = /decl/flooring/tiling/eris/steel/bluecorner + +/turf/simulated/floor/tiled/eris/steel/orangecorner + icon_state = "orangecorner" + initial_flooring = /decl/flooring/tiling/eris/steel/orangecorner + +/turf/simulated/floor/tiled/eris/steel/cyancorner + icon_state = "cyancorner" + initial_flooring = /decl/flooring/tiling/eris/steel/cyancorner + +/turf/simulated/floor/tiled/eris/steel/violetcorener + icon_state = "violetcorener" + initial_flooring = /decl/flooring/tiling/eris/steel/violetcorener + +/turf/simulated/floor/tiled/eris/steel/monofloor + icon_state = "monofloor" + initial_flooring = /decl/flooring/tiling/eris/steel/monofloor + +/turf/simulated/floor/tiled/eris/steel/bar_flat + icon_state = "bar_flat" + initial_flooring = /decl/flooring/tiling/eris/steel/bar_flat + +/turf/simulated/floor/tiled/eris/steel/bar_dance + icon_state = "bar_dance" + initial_flooring = /decl/flooring/tiling/eris/steel/bar_dance + +/turf/simulated/floor/tiled/eris/steel/bar_light + icon_state = "bar_light" + initial_flooring = /decl/flooring/tiling/eris/steel/bar_light + +/turf/simulated/floor/tiled/eris/steel/bar_light/Initialize() + . = ..() + set_light(3,4,"#00AAFF") + + + +//White Tiles +/turf/simulated/floor/tiled/eris/white + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_white.dmi' + icon_state = "tiles" + initial_flooring = /decl/flooring/tiling/eris/white + +/turf/simulated/floor/tiled/eris/white/panels + icon_state = "panels" + initial_flooring = /decl/flooring/tiling/eris/white/panels + +/turf/simulated/floor/tiled/eris/white/techfloor + icon_state = "techfloor" + initial_flooring = /decl/flooring/tiling/eris/white/techfloor + +/turf/simulated/floor/tiled/eris/white/techfloor_grid + icon_state = "techfloor_grid" + initial_flooring = /decl/flooring/tiling/eris/white/techfloor_grid + +/turf/simulated/floor/tiled/eris/white/brown_perforated + icon_state = "brown_perforated" + initial_flooring = /decl/flooring/tiling/eris/white/brown_perforated + +/turf/simulated/floor/tiled/eris/white/gray_perforated + icon_state = "gray_perforated" + initial_flooring = /decl/flooring/tiling/eris/white/gray_perforated + +/turf/simulated/floor/tiled/eris/white/cargo + icon_state = "cargo" + initial_flooring = /decl/flooring/tiling/eris/white/cargo + +/turf/simulated/floor/tiled/eris/white/brown_platform + icon_state = "brown_platform" + initial_flooring = /decl/flooring/tiling/eris/white/brown_platform + +/turf/simulated/floor/tiled/eris/white/gray_platform + icon_state = "gray_platform" + initial_flooring = /decl/flooring/tiling/eris/white/gray_platform + +/turf/simulated/floor/tiled/eris/white/danger + icon_state = "danger" + initial_flooring = /decl/flooring/tiling/eris/white/danger + +/turf/simulated/floor/tiled/eris/white/golden + icon_state = "golden" + initial_flooring = /decl/flooring/tiling/eris/white/golden + +/turf/simulated/floor/tiled/eris/white/bluecorner + icon_state = "bluecorner" + initial_flooring = /decl/flooring/tiling/eris/white/bluecorner + +/turf/simulated/floor/tiled/eris/white/orangecorner + icon_state = "orangecorner" + initial_flooring = /decl/flooring/tiling/eris/white/orangecorner + +/turf/simulated/floor/tiled/eris/white/cyancorner + icon_state = "cyancorner" + initial_flooring = /decl/flooring/tiling/eris/white/cyancorner + +/turf/simulated/floor/tiled/eris/white/violetcorener + icon_state = "violetcorener" + initial_flooring = /decl/flooring/tiling/eris/white/violetcorener + +/turf/simulated/floor/tiled/eris/white/monofloor + icon_state = "monofloor" + initial_flooring = /decl/flooring/tiling/eris/white/monofloor + + + +// Dark Tiles +/turf/simulated/floor/tiled/eris/dark + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_dark.dmi' + icon_state = "tiles" + initial_flooring = /decl/flooring/tiling/eris/dark + +/turf/simulated/floor/tiled/eris/dark/panels + icon_state = "panels" + initial_flooring = /decl/flooring/tiling/eris/dark/panels + +/turf/simulated/floor/tiled/eris/dark/techfloor + icon_state = "techfloor" + initial_flooring = /decl/flooring/tiling/eris/dark/techfloor + +/turf/simulated/floor/tiled/eris/dark/techfloor_grid + icon_state = "techfloor_grid" + initial_flooring = /decl/flooring/tiling/eris/dark/techfloor_grid + +/turf/simulated/floor/tiled/eris/dark/brown_perforated + icon_state = "brown_perforated" + initial_flooring = /decl/flooring/tiling/eris/dark/brown_perforated + +/turf/simulated/floor/tiled/eris/dark/gray_perforated + icon_state = "gray_perforated" + initial_flooring = /decl/flooring/tiling/eris/dark/gray_perforated + +/turf/simulated/floor/tiled/eris/dark/cargo + icon_state = "cargo" + initial_flooring = /decl/flooring/tiling/eris/dark/cargo + +/turf/simulated/floor/tiled/eris/dark/brown_platform + icon_state = "brown_platform" + initial_flooring = /decl/flooring/tiling/eris/dark/brown_platform + +/turf/simulated/floor/tiled/eris/dark/gray_platform + icon_state = "gray_platform" + initial_flooring = /decl/flooring/tiling/eris/dark/gray_platform + +/turf/simulated/floor/tiled/eris/dark/danger + icon_state = "danger" + initial_flooring = /decl/flooring/tiling/eris/dark/danger + +/turf/simulated/floor/tiled/eris/dark/golden + icon_state = "golden" + initial_flooring = /decl/flooring/tiling/eris/dark/golden + +/turf/simulated/floor/tiled/eris/dark/bluecorner + icon_state = "bluecorner" + initial_flooring = /decl/flooring/tiling/eris/dark/bluecorner + +/turf/simulated/floor/tiled/eris/dark/orangecorner + icon_state = "orangecorner" + initial_flooring = /decl/flooring/tiling/eris/dark/orangecorner + +/turf/simulated/floor/tiled/eris/dark/cyancorner + icon_state = "cyancorner" + initial_flooring = /decl/flooring/tiling/eris/dark/cyancorner + +/turf/simulated/floor/tiled/eris/dark/violetcorener + icon_state = "violetcorener" + initial_flooring = /decl/flooring/tiling/eris/dark/violetcorener + +/turf/simulated/floor/tiled/eris/dark/monofloor + icon_state = "monofloor" + initial_flooring = /decl/flooring/tiling/eris/dark/monofloor + + + + +/turf/simulated/floor/tiled/eris/cafe + name = "floor" + icon = 'icons/turf/flooring/eris/tiles.dmi' + icon_state = "cafe" + initial_flooring = /decl/flooring/tiling/eris/cafe + +/turf/simulated/floor/tiled/eris/techmaint + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + icon_state = "techmaint" + initial_flooring = /decl/flooring/tiling/eris/techmaint + +/turf/simulated/floor/tiled/eris/techmaint_perforated + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + icon_state = "techmaint_perforated" + initial_flooring = /decl/flooring/tiling/eris/techmaint_perforated + +/turf/simulated/floor/tiled/eris/techmaint_panels + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + icon_state = "techmaint_panels" + initial_flooring = /decl/flooring/tiling/eris/techmaint_panels + +/turf/simulated/floor/tiled/eris/techmaint_cargo + name = "floor" + icon = 'icons/turf/flooring/eris/tiles_maint.dmi' + icon_state = "techmaint_cargo" + initial_flooring = /decl/flooring/tiling/eris/techmaint_cargo + +//=========ERIS GRASS==========\\ +/decl/flooring/grass/heavy + name = "heavy grass" + desc = "A dense ground coating of grass" + flags = TURF_REMOVE_SHOVEL + icon = 'icons/turf/outdoors.dmi' + icon_base = "grass-heavy" + has_base_range = 3 + +/turf/simulated/floor/outdoors/grass/heavy + name = "heavy grass" + icon_state = "grass-heavy0" + edge_blending_priority = 4 + initial_flooring = /decl/flooring/grass/heavy + turf_layers = list( + /turf/simulated/floor/outdoors/rocks, + /turf/simulated/floor/outdoors/dirt + ) + grass_chance = 40 + + grass_types = list( + /obj/structure/flora/ausbushes/sparsegrass, + /obj/structure/flora/ausbushes/fullgrass + ) + +//=========R. PLATING==========\\ +/decl/flooring/reinforced/plating + name = "reinforced plating" + descriptor = "reinforced plating" + icon = 'icons/turf/flooring/eris/plating.dmi' + icon_base = "plating" + flags = TURF_REMOVE_WRENCH | TURF_HAS_CORNERS | TURF_HAS_EDGES | TURF_CAN_BURN | TURF_CAN_BREAK + can_paint = 1 + has_base_range = 18 + is_plating = TRUE + //build_type = /obj/item/stack/material/steel + + plating_type = /decl/flooring/reinforced/plating/under + /* + footstep_sound = "plating" + space_smooth = FALSE + removal_time = 150 + health = 100 + + floor_smooth = SMOOTH_BLACKLIST + flooring_blacklist = list(/decl/flooring/reinforced/plating/under,/decl/flooring/reinforced/plating/hull) //Smooth with everything except the contents of this list + smooth_movable_atom = SMOOTH_GREYLIST + movable_atom_blacklist = list(list(/obj, list("density" = TRUE, "anchored" = TRUE), 1)) + movable_atom_whitelist = list(list(/obj/machinery/door/airlock, list(), 2)) + */ + +/obj/item/stack/tile/floor/rplating + name = "reinforced plating" + singular_name = "dark floor tile" + icon_state = "tile_dark" + matter = list(MAT_STEEL = 1) + +/turf/simulated/floor/plating/eris + name = "reinforced plating" + icon = 'icons/turf/flooring/eris/plating.dmi' + icon_state = "plating" + initial_flooring = /decl/flooring/reinforced/plating + +//==========UNDERPLATING==============\\ +/decl/flooring/reinforced/plating/under + name = "underplating" + icon = 'icons/turf/flooring/eris/plating.dmi' + descriptor = "support beams" + icon_base = "under" + flags = TURF_HAS_CORNERS | TURF_HAS_EDGES | TURF_CAN_BURN | TURF_CAN_BREAK + can_paint = 1 + has_base_range = 0 + is_plating = TRUE + + floor_smooth = SMOOTH_WHITELIST + flooring_whitelist = list( + /decl/flooring/tiling/eris + ) + + plating_type = null + + //build_type = /obj/item/stack/material/underplating + + /* Eris features we lack on flooring decls + removal_time = 250 + health = 200 + resistance = RESISTANCE_ARMOURED + footstep_sound = "catwalk" + space_smooth = SMOOTH_ALL + floor_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + */ + +/turf/simulated/floor/plating/eris/under + name = "underplating" + icon_state = "under" + icon = 'icons/turf/flooring/eris/plating.dmi' + initial_flooring = /decl/flooring/reinforced/plating/under + +//============HULL PLATING=========\\ +/decl/flooring/reinforced/plating/hull + name = "hull" + descriptor = "outer hull" + icon = 'icons/turf/flooring/eris/hull.dmi' + icon_base = "hullcenter" + flags = TURF_HAS_EDGES | TURF_HAS_CORNERS | TURF_REMOVE_WRENCH | TURF_CAN_BURN | TURF_CAN_BREAK + build_type = /obj/item/stack/material/plasteel + has_base_range = 35 + is_plating = FALSE + + /* Eris features we lack on flooring decls + try_update_icon = 0 + plating_type = null + health = 350 + resistance = RESISTANCE_HEAVILY_ARMOURED + removal_time = 1 MINUTES //Cutting through the hull is very slow work + footstep_sound = "hull" + wall_smooth = SMOOTH_ALL + space_smooth = SMOOTH_NONE + smooth_movable_atom = SMOOTH_NONE + */ + +/* Eris features we lack on flooring decls +//Hull can upgrade to underplating +/decl/flooring/reinforced/plating/hull/can_build_floor(var/decl/flooring/newfloor) + return FALSE //Not allowed to build directly on hull, you must first remove it and then build on the underplating + +/decl/flooring/reinforced/plating/hull/get_plating_type(var/turf/location) + if (turf_is_lower_hull(location)) //Hull plating is only on the lowest level of the ship + return null + else if (turf_is_upper_hull(location)) + return /decl/flooring/reinforced/plating/under + else + return null //This should never happen, hull plawell,ting should only be on the exterior +*/ +/turf/simulated/floor/hull + name = "hull" + icon = 'icons/turf/flooring/eris/hull.dmi' + icon_state = "hullcenter0" + initial_flooring = /decl/flooring/reinforced/plating/hull +/* +/turf/simulated/floor/hull/New() + if(icon_state != "hullcenter0") + overrided_icon_state = icon_state + ..() +*/ \ No newline at end of file diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 01ad912b70..237a28635c 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -13,6 +13,7 @@ movement_cost = 2 can_build_into_floor = TRUE can_dirty = FALSE + initial_flooring = /decl/flooring/lava // Defining this in case someone DOES step on lava and survive. Somehow. /turf/simulated/floor/lava/outdoors outdoors = TRUE @@ -32,11 +33,6 @@ ..() name = "magma" -/turf/simulated/floor/lava/update_icon() - cut_overlays() - ..() - update_icon_edge() - /turf/simulated/floor/lava/Entered(atom/movable/AM) if(burn_stuff(AM)) START_PROCESSING(SSturfs, src) diff --git a/code/game/turfs/simulated/outdoors/dirt.dm b/code/game/turfs/simulated/outdoors/dirt.dm index 4d14205072..02677760fa 100644 --- a/code/game/turfs/simulated/outdoors/dirt.dm +++ b/code/game/turfs/simulated/outdoors/dirt.dm @@ -3,4 +3,5 @@ desc = "Quite dirty!" icon_state = "dirt-dark" edge_blending_priority = 2 - turf_layers = list(/turf/simulated/floor/outdoors/rocks) \ No newline at end of file + turf_layers = list(/turf/simulated/floor/outdoors/rocks) + initial_flooring = /decl/flooring/asteroid \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm index 6ee01d5087..3752c3825c 100644 --- a/code/game/turfs/simulated/outdoors/grass.dm +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -4,8 +4,9 @@ var/list/grass_types = list( /turf/simulated/floor/outdoors/grass name = "grass" - icon_state = "grass" + icon_state = "grass0" edge_blending_priority = 4 + initial_flooring = /decl/flooring/grass turf_layers = list( /turf/simulated/floor/outdoors/rocks, /turf/simulated/floor/outdoors/dirt @@ -34,13 +35,14 @@ var/list/grass_types = list( /turf/simulated/floor/outdoors/grass/sif name = "growth" - icon_state = "grass_sif" + icon_state = "grass_sif0" + initial_flooring = /decl/flooring/grass/sif edge_blending_priority = 4 grass_chance = 5 var/tree_chance = 2 /* animal_chance = 0.5 - + animal_types = list( /mob/living/simple_mob/animal/sif/diyaab = 10, /mob/living/simple_mob/animal/sif/glitterfly = 2, @@ -63,10 +65,6 @@ var/list/grass_types = list( . = ..() /turf/simulated/floor/outdoors/grass/Initialize() - if(prob(50)) - icon_state = "[initial(icon_state)]2" - //edge_blending_priority++ - if(grass_chance && prob(grass_chance) && !check_density()) var/grass_type = pickweight(grass_types) new grass_type(src) @@ -79,14 +77,14 @@ var/list/grass_types = list( /turf/simulated/floor/outdoors/grass/forest name = "thick grass" - icon_state = "grass-dark" + icon_state = "grass-dark0" grass_chance = 80 //tree_chance = 20 edge_blending_priority = 5 /turf/simulated/floor/outdoors/grass/sif/forest name = "thick growth" - icon_state = "grass_sif_dark" + icon_state = "grass_sif_dark0" edge_blending_priority = 5 tree_chance = 10 grass_chance = 0 diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 42016e8081..cc5f256c5a 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -20,10 +20,6 @@ var/list/turf_edge_cache = list() // When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works. var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks) -/turf/simulated/floor/outdoors/Initialize() - update_icon() - . = ..() - /turf/simulated/floor/Initialize(mapload) if(outdoors) SSplanets.addTurf(src) @@ -50,37 +46,11 @@ var/list/turf_edge_cache = list() else make_indoors() -/turf/simulated/proc/update_icon_edge() - if(edge_blending_priority && !forbid_turf_edge()) - for(var/checkdir in cardinal) - var/turf/simulated/T = get_step(src, checkdir) - if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state && !T.forbid_turf_edge()) - var/cache_key = "[T.get_edge_icon_state()]-[checkdir]" - if(!turf_edge_cache[cache_key]) - var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER) - I.plane = TURF_PLANE - turf_edge_cache[cache_key] = I - add_overlay(turf_edge_cache[cache_key]) - -/turf/simulated/proc/get_edge_icon_state() - return icon_state - -// Tests if we shouldn't apply a turf edge. -// Returns the blocker if one exists. -/turf/simulated/proc/forbid_turf_edge() - for(var/obj/structure/S in contents) - if(S.block_turf_edges) - return S - return null - -/turf/simulated/floor/outdoors/update_icon() - ..() - update_icon_edge() - /turf/simulated/floor/outdoors/mud name = "mud" icon_state = "mud_dark" edge_blending_priority = 3 + initial_flooring = /decl/flooring/mud /turf/simulated/floor/outdoors/rocks name = "rocks" diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 3a5d8e46a8..9a5c0c4b48 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -20,6 +20,8 @@ /turf/simulated/floor/water/Initialize() . = ..() + var/decl/flooring/F = get_flooring_data(/decl/flooring/water) + footstep_sounds = F?.footstep_sounds update_icon() handle_fish() @@ -30,8 +32,6 @@ var/image/water_sprite = image(icon = 'icons/turf/outdoors.dmi', icon_state = water_state, layer = WATER_LAYER) add_overlay(water_sprite) - update_icon_edge() - /turf/simulated/floor/water/get_edge_icon_state() return "water_shallow" @@ -45,7 +45,7 @@ else if(istype(O, /obj/item/weapon/mop)) O.reagents.add_reagent(reagent_type, 5) to_chat(user, "You wet \the [O] in \the [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) return 1 else return ..() @@ -146,6 +146,18 @@ var/list/shoreline_icon_cache = list() +/turf/simulated/floor/water/beach + name = "beach shoreline" + desc = "The waves look calm and inviting." + icon_state = "beach" + depth = 0 + +/turf/simulated/floor/water/beach/update_icon() + return + +/turf/simulated/floor/water/beach/corner + icon_state = "beachcorner" + /turf/simulated/floor/water/shoreline name = "shoreline" desc = "The waves look calm and inviting." diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 29bad72682..8b6e71aeda 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -136,15 +136,10 @@ return /turf/space/Entered(var/atom/movable/A) - ..() - - if (!A || src != A.loc) - return - - inertial_drift(A) + . = ..() if(edge && ticker?.mode) - A.touch_map_edge() + A?.touch_map_edge() /turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) var/cur_x diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 78c764f789..e93380d791 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -142,42 +142,6 @@ turf/attackby(obj/item/weapon/W as obj, mob/user as mob) sleep(2) O.update_transform() -var/const/enterloopsanity = 100 -/turf/Entered(atom/atom as mob|obj) - - if(movement_disabled) - to_chat(usr, "Movement is admin-disabled.") //This is to identify lag problems - return - ..() - - if(!istype(atom, /atom/movable)) - return - - var/atom/movable/A = atom - - if(ismob(A)) - var/mob/M = A - if(!M.lastarea) - M.lastarea = get_area(M.loc) - if(M.lastarea.has_gravity == 0) - inertial_drift(M) - else if(!is_space()) - M.inertia_dir = 0 - M.make_floating(0) - if(isliving(M)) - var/mob/living/L = M - L.handle_footstep(src) - ..() - var/objects = 0 - if(A && (A.flags & PROXMOVE)) - for(var/atom/movable/thing in range(1)) - if(objects++ > enterloopsanity) break - spawn(0) - if(A) //Runtime prevention - A.HasProximity(thing, 1) - if ((thing && A) && (thing.flags & PROXMOVE)) - thing.HasProximity(A, 1) - /turf/CanPass(atom/movable/mover, turf/target) if(!target) return FALSE @@ -246,22 +210,6 @@ var/const/enterloopsanity = 100 /turf/proc/is_plating() return 0 -/turf/proc/inertial_drift(atom/movable/A as mob|obj) - if(!(A.last_move)) return - if((istype(A, /mob/) && src.x > 1 && src.x < (world.maxx) && src.y > 1 && src.y < (world.maxy))) - var/mob/M = A - if(M.Process_Spacemove(1)) - M.inertia_dir = 0 - return - spawn(5) - if((M && !(M.anchored) && !(M.pulledby) && (M.loc == src))) - if(M.inertia_dir) - step(M, M.inertia_dir) - return - M.inertia_dir = M.last_move - step(M, M.inertia_dir) - return - /turf/proc/levelupdate() for(var/obj/O in src) O.hide(O.hides_under_flooring() && !is_plating()) diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index 52c2618a79..c5338b3db9 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -15,6 +15,7 @@ name = "Water" icon_state = "water" initialized = FALSE + movement_cost = 4 // Water should slow you down, just like simulated turf. /turf/unsimulated/beach/water/Initialize() . = ..() @@ -23,13 +24,22 @@ /turf/simulated/floor/beach name = "Beach" icon = 'icons/misc/beach.dmi' + initial_flooring = /decl/flooring/sand /turf/simulated/floor/beach/sand name = "Sand" icon_state = "sand" + initial_flooring = /decl/flooring/sand /turf/simulated/floor/beach/sand/desert + icon = 'icons/turf/desert.dmi' icon_state = "desert" + initial_flooring = /decl/flooring/sand/desert + +/turf/simulated/floor/beach/sand/desert/Initialize() + . = ..() + if(prob(5)) + icon_state = "desert[rand(0,4)]" /turf/simulated/floor/beach/coastline name = "Coastline" @@ -39,10 +49,24 @@ /turf/simulated/floor/beach/water name = "Water" icon_state = "water" + movement_cost = 4 // Water should slow you down, just like the original simulated turf. + initial_flooring = /decl/flooring/water /turf/simulated/floor/beach/water/ocean icon_state = "seadeep" + movement_cost = 8 // Deep water should be difficult to wade through. + initial_flooring = /decl/flooring/water/beach/deep /turf/simulated/floor/beach/water/Initialize() . = ..() add_overlay(image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1)) + +/decl/flooring/water/beach/deep // We're custom-defining a 'deep' water turf for the beach. + name = "deep water" + desc = "Deep Ocean Water" + icon = 'icons/misc/beach.dmi' + icon_base = "seadeep" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/bubbles3.ogg', // No I don't get why it's named 3/4/5 either. Whatever. + 'sound/effects/footstep/bubbles4.ogg', + 'sound/effects/footstep/bubbles5.ogg')) diff --git a/code/game/verbs/advanced_who.dm b/code/game/verbs/advanced_who.dm index 9f067054f2..4498136b2b 100644 --- a/code/game/verbs/advanced_who.dm +++ b/code/game/verbs/advanced_who.dm @@ -7,24 +7,36 @@ var/list/Lines = list() - if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights)) + if(holder) for(var/client/C in GLOB.clients) - var/entry = "\t[C.key]" + var/entry = "[C.key]" if(C.holder && C.holder.fakekey) entry += " (as [C.holder.fakekey])" - entry += " - Playing as [C.mob.real_name]" - switch(C.mob.stat) - if(UNCONSCIOUS) - entry += " - Unconscious" - if(DEAD) - if(isobserver(C.mob)) - var/mob/observer/dead/O = C.mob - if(O.started_as_observer) - entry += " - Observing" - else - entry += " - DEAD" + + entry += "" + + if(C.mob.real_name) + switch(C.mob.stat) + if(UNCONSCIOUS) + entry += "Unconscious" // these are literally all spans so I can apply .inverted to them because black on dark grey isn't legible + + if(DEAD) + if(isobserver(C.mob)) + var/mob/observer/dead/O = C.mob + if(O.started_as_observer) + entry += "Observing" + else + entry += "Died" + else - entry += " - DEAD" + entry += "Playing" + + entry += " as [C.mob.real_name]" + + else if(isnewplayer(C.mob)) + entry += "In lobby" + + entry += "" var/age if(isnum(C.player_age)) @@ -33,14 +45,20 @@ age = 0 if(age <= 1) - age = "[age]" + age = "[age]" else if(age < 10) - age = "[age]" + age = "[age]" - entry += " - [age]" + entry += "Age: [age]" + entry += "" if(is_special_character(C.mob)) - entry += " - Antagonist" + if(C.mob?.mind?.special_role) + entry += "[C.mob.mind.special_role]" + else + entry += "Antagonist" + + entry += "" if(C.is_afk()) var/seconds = C.last_activity_seconds() @@ -48,7 +66,9 @@ entry += "[round(seconds / 60)] minutes, " entry += "[seconds % 60] seconds)" + entry += "" entry += " (?)" + entry += "" Lines += entry else @@ -60,16 +80,17 @@ entry += "[C.key]" var/mob/observer/dead/O = C.mob if(isobserver(O)) - entry += " - Observing" + entry += " - Observing
" else if(istype(O,/mob/new_player)) - entry += " - In Lobby" + entry += " - In Lobby
" else - entry += " - Playing" + entry += " - Playing
" Lines += entry + msg += "" for(var/line in sortList(Lines)) - msg += "[line]\n" - + msg += "[line]" + msg += "
" msg += "Total Players: [length(Lines)]" - msg = "" + msg + "" + msg = "" + msg + "" to_chat(src, msg) \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 5df51c1dd0..d7b649505d 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -29,11 +29,21 @@ if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") return - if(findtext(msg, "byond://")) + if(findtext(msg, "byond://") && !config.allow_byond_links) to_chat(src, "Advertising other servers is not allowed.") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return + if(findtext(msg, "discord.gg") && !config.allow_discord_links) + to_chat(src, "Advertising discords is not allowed.") + log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]") + message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]") + return + if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links) + to_chat(src, "Posting external links is not allowed.") + log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]") + message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]") + return log_ooc(msg, src) @@ -43,14 +53,15 @@ var/ooc_style = "everyone" if(holder && !holder.fakekey) ooc_style = "elevated" - if(holder.rights & R_EVENT) - ooc_style = "event_manager" - if(holder.rights & R_MOD) - ooc_style = "moderator" - if(holder.rights & R_DEBUG) - ooc_style = "developer" if(holder.rights & R_ADMIN) ooc_style = "admin" + else if(holder.rights & R_EVENT) + ooc_style = "event_manager" + else if(holder.rights & R_DEBUG) + ooc_style = "developer" + else if(holder.rights & R_MOD) + ooc_style = "moderator" + for(var/client/target in GLOB.clients) if(target.is_preference_enabled(/datum/client_preference/show_ooc)) @@ -102,11 +113,21 @@ if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") return - if(findtext(msg, "byond://")) + if(findtext(msg, "byond://") && !config.allow_byond_links) to_chat(src, "Advertising other servers is not allowed.") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return + if(findtext(msg, "discord.gg") && !config.allow_discord_links) + to_chat(src, "Advertising discords is not allowed.") + log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]") + message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]") + return + if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links) + to_chat(src, "Posting external links is not allowed.") + log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]") + message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]") + return log_looc(msg,src) diff --git a/code/game/world.dm b/code/game/world.dm index 6715efe9b9..e7d0a8bd31 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -16,7 +16,7 @@ if(config && config.log_runtime) log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log") - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 + GLOB.timezoneOffset = get_timezone_offset() callHook("startup") init_vchat() diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index c1f5c67464..4c5b1b481e 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -1,4 +1,4 @@ -/mob/var/lastattacker = null +/atom/var/lastattacker = null /mob/var/lastattacked = null /mob/var/attack_log = list( ) /mob/var/dialogue_log = list( ) diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm index 376aa2da44..8b4e1ae44c 100644 --- a/code/modules/admin/admin_tools.dm +++ b/code/modules/admin/admin_tools.dm @@ -9,18 +9,18 @@ if(M.mind) dat += "Current Antag?: [(M.mind.special_role)?"Yes":"No"]
" dat += "
Note: This is arranged from earliest to latest.

" - + if(!isemptylist(M.attack_log)) - dat += "
" + dat += "
" for(var/l in M.attack_log) dat += "[l]
" - + dat += "
" - + else dat += "No attack logs found for [M]." - + var/datum/browser/popup = new(usr, "admin_attack_log", "[src]", 650, 650, src) popup.set_content(jointext(dat,null)) popup.open() @@ -43,13 +43,13 @@ if(!isemptylist(M.dialogue_log)) dat += "
" - + for(var/d in M.dialogue_log) dat += "[d]
" - + dat += "
" else - dat += "No dialogue logs found for [M]." + dat += "No dialogue logs found for [M]." var/datum/browser/popup = new(usr, "admin_dialogue_log", "[src]", 650, 650, src) popup.set_content(jointext(dat,null)) popup.open() @@ -58,5 +58,8 @@ feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + +// Used to get `atom/O as obj|mob|turf in view()` to match against strings containing apostrophes immediately after substrings that match to other objects. Somehow. - Ater +/proc/admin_atom_validate(atom/A) + return view() \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a04459a6ff..5e2231d663 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -425,43 +425,6 @@ log_and_message_admins("has opened [S]'s law manager.") feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/change_human_appearance_admin() - set name = "Change Mob Appearance - Admin" - set desc = "Allows you to change the mob appearance" - set category = "Admin" - - if(!check_rights(R_FUN)) return - - var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in human_mob_list - if(!H) return - - log_and_message_admins("is altering the appearance of [H].") - H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0, state = admin_state) - feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/change_human_appearance_self() - set name = "Change Mob Appearance - Self" - set desc = "Allows the mob to change its appearance" - set category = "Admin" - - if(!check_rights(R_FUN)) return - - var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in human_mob_list - if(!H) return - - if(!H.client) - to_chat(usr, " Only mobs with clients can alter their own appearance.") - return - var/datum/gender/T = gender_datums[H.get_visible_gender()] - switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) - if("Yes") - log_and_message_admins("has allowed [H] to change [T.his] appearance, without whitelisting of races.") - H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0) - if("No") - log_and_message_admins("has allowed [H] to change [T.his] appearance, with whitelisting of races.") - H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) - feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/change_security_level() set name = "Set security level" set desc = "Sets the station security level" @@ -484,74 +447,6 @@ // feedback_add_details("admin_verb","MP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return -/client/proc/editappear() - set name = "Edit Appearance" - set category = "Fun" - - if(!check_rights(R_FUN)) return - - var/mob/living/carbon/human/M = input("Select mob.", "Edit Appearance") as null|anything in human_mob_list - - if(!istype(M, /mob/living/carbon/human)) - to_chat(usr, "You can only do this to humans!") - return - switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Tajaran can result in unintended consequences.",,"Yes","No")) - if("No") - return - var/new_facial = input("Please select facial hair color.", "Character Generation") as color - if(new_facial) - M.r_facial = hex2num(copytext(new_facial, 2, 4)) - M.g_facial = hex2num(copytext(new_facial, 4, 6)) - M.b_facial = hex2num(copytext(new_facial, 6, 8)) - - var/new_hair = input("Please select hair color.", "Character Generation") as color - if(new_facial) - M.r_hair = hex2num(copytext(new_hair, 2, 4)) - M.g_hair = hex2num(copytext(new_hair, 4, 6)) - M.b_hair = hex2num(copytext(new_hair, 6, 8)) - - var/new_eyes = input("Please select eye color.", "Character Generation") as color - if(new_eyes) - M.r_eyes = hex2num(copytext(new_eyes, 2, 4)) - M.g_eyes = hex2num(copytext(new_eyes, 4, 6)) - M.b_eyes = hex2num(copytext(new_eyes, 6, 8)) - M.update_eyes() - - var/new_skin = input("Please select body color. This is for Tajaran, Unathi, and Skrell only!", "Character Generation") as color - if(new_skin) - M.r_skin = hex2num(copytext(new_skin, 2, 4)) - M.g_skin = hex2num(copytext(new_skin, 4, 6)) - M.b_skin = hex2num(copytext(new_skin, 6, 8)) - - var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text - - if (new_tone) - M.s_tone = max(min(round(text2num(new_tone)), 220), 1) - M.s_tone = -M.s_tone + 35 - - // hair - var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list - if(new_hstyle) - M.h_style = new_hstyle - - // facial hair - var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list - if(new_fstyle) - M.f_style = new_fstyle - - var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter") - if (new_gender) - if(new_gender == "Male") - M.gender = MALE - else if (new_gender == "Female") - M.gender = FEMALE - else - M.gender = NEUTER - - M.update_hair(FALSE) - M.update_icons_body() - M.check_dna(M) - /client/proc/playernotes() set name = "Show Player Info" set category = "Admin" diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 6a0d8ba266..7f9e02b769 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -161,6 +161,7 @@ Right Mouse Button on enemy mob = Command selected mobs to attack mob
\ Right Mouse Button on allied mob = Command selected mobs to follow mob
\ Right Mouse Button + shift on any mob = Command selected mobs to follow mob regardless of faction
\ + Note: The following also reset the mob's home position:
\ Right Mouse Button on tile = Command selected mobs to move to tile (will cancel if enemies are seen)
\ Right Mouse Button + shift on tile = Command selected mobs to reposition to tile (will not be inturrupted by enemies)
\ Right Mouse Button + alt on obj/turfs = Command selected mobs to attack obj/turf
\ @@ -569,6 +570,7 @@ var/told = 0 for(var/mob/living/unit in holder.selected_mobs) var/datum/ai_holder/AI = unit.ai_holder + AI.home_turf = T if(unit.get_AI_stance() == STANCE_SLEEP) unit.forceMove(T) forced++ diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm new file mode 100644 index 0000000000..e547d03f84 --- /dev/null +++ b/code/modules/admin/verbs/change_appearance.dm @@ -0,0 +1,107 @@ +/client/proc/change_human_appearance_admin() + set name = "Change Mob Appearance - Admin" + set desc = "Allows you to change the mob appearance" + set category = "Admin" + + if(!check_rights(R_FUN)) return + + var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in human_mob_list + if(!H) return + + log_and_message_admins("is altering the appearance of [H].") + H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0, state = admin_state) + feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/change_human_appearance_self() + set name = "Change Mob Appearance - Self" + set desc = "Allows the mob to change its appearance" + set category = "Admin" + + if(!check_rights(R_FUN)) return + + var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in human_mob_list + if(!H) return + + if(!H.client) + to_chat(usr, " Only mobs with clients can alter their own appearance.") + return + var/datum/gender/T = gender_datums[H.get_visible_gender()] + switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) + if("Yes") + log_and_message_admins("has allowed [H] to change [T.his] appearance, without whitelisting of races.") + H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0) + if("No") + log_and_message_admins("has allowed [H] to change [T.his] appearance, with whitelisting of races.") + H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) + feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/editappear() + set name = "Edit Appearance" + set category = "Fun" + + if(!check_rights(R_FUN)) return + + var/mob/living/carbon/human/M = input("Select mob.", "Edit Appearance") as null|anything in human_mob_list + + if(!istype(M, /mob/living/carbon/human)) + to_chat(usr, "You can only do this to humans!") + return + switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Tajaran can result in unintended consequences.",,"Yes","No")) + if("No") + return + var/new_facial = input("Please select facial hair color.", "Character Generation") as color + if(new_facial) + M.r_facial = hex2num(copytext(new_facial, 2, 4)) + M.g_facial = hex2num(copytext(new_facial, 4, 6)) + M.b_facial = hex2num(copytext(new_facial, 6, 8)) + + var/new_hair = input("Please select hair color.", "Character Generation") as color + if(new_facial) + M.r_hair = hex2num(copytext(new_hair, 2, 4)) + M.g_hair = hex2num(copytext(new_hair, 4, 6)) + M.b_hair = hex2num(copytext(new_hair, 6, 8)) + + var/new_eyes = input("Please select eye color.", "Character Generation") as color + if(new_eyes) + M.r_eyes = hex2num(copytext(new_eyes, 2, 4)) + M.g_eyes = hex2num(copytext(new_eyes, 4, 6)) + M.b_eyes = hex2num(copytext(new_eyes, 6, 8)) + M.update_eyes() + + var/new_skin = input("Please select body color. This is for Tajaran, Unathi, and Skrell only!", "Character Generation") as color + if(new_skin) + M.r_skin = hex2num(copytext(new_skin, 2, 4)) + M.g_skin = hex2num(copytext(new_skin, 4, 6)) + M.b_skin = hex2num(copytext(new_skin, 6, 8)) + + var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text + + if (new_tone) + M.s_tone = max(min(round(text2num(new_tone)), 220), 1) + M.s_tone = -M.s_tone + 35 + + // hair + var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list + if(new_hstyle) + M.h_style = new_hstyle + + // facial hair + var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list + if(new_fstyle) + M.f_style = new_fstyle + + var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter") + if (new_gender) + if(new_gender == "Male") + M.gender = MALE + M.dna.SetUIState(DNA_UI_GENDER, FALSE) + else if (new_gender == "Female") + M.gender = FEMALE + M.dna.SetUIState(DNA_UI_GENDER, TRUE) + else + M.gender = NEUTER + M.dna.SetUIState(DNA_UI_GENDER, FALSE) + + M.update_dna(M) + M.update_hair(FALSE) + M.update_icons_body() \ No newline at end of file diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 2a946b492a..60f1640cdd 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -28,7 +28,7 @@ var/list/sounds_cache = list() log_admin("[key_name(src)] played a local sound [S]") message_admins("[key_name_admin(src)] played a local sound [S]", 1) - playsound(get_turf(src.mob), S, 50, 0, 0) + playsound(src.mob, S, 50, 0, 0) feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9b7b676d0e..e49b852147 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -596,7 +596,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) +/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in admin_atom_validate(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater set category = "Admin" set name = "Delete" diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm index e8183e3665..1fd5120f55 100644 --- a/code/modules/admin/verbs/smite.dm +++ b/code/modules/admin/verbs/smite.dm @@ -56,18 +56,12 @@ return BSACooldown = 1 - spawn(50) - BSACooldown = 0 + VARSET_IN(global, BSACooldown, FALSE, 5 SECONDS) to_chat(target,"You've been hit by bluespace artillery!") log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]") - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = target - S.loc = target.loc - spawn(20) - qdel(S) + target.setMoveCooldown(2 SECONDS) var/turf/simulated/floor/T = get_turf(target) if(istype(T)) diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm index d4686e1537..13aff81e37 100644 --- a/code/modules/ai/ai_holder.dm +++ b/code/modules/ai/ai_holder.dm @@ -27,6 +27,16 @@ QDEL_NULL(ai_holder) return ..() +/mob/living/Login() + if(!stat && ai_holder) + ai_holder.manage_processing(AI_NO_PROCESS) + return ..() + +/mob/living/Logout() + if(!stat && !key && ai_holder) + ai_holder.manage_processing(AI_PROCESSING) + return ..() + /datum/ai_holder var/mob/living/holder = null // The mob this datum is going to control. var/stance = STANCE_IDLE // Determines if the mob should be doing a specific thing, e.g. attacking, following, standing around, etc. @@ -145,11 +155,15 @@ // 'Tactical' processes such as moving a step, meleeing an enemy, firing a projectile, and other fairly cheap actions that need to happen quickly. /datum/ai_holder/proc/handle_tactics() + if(holder.key && !autopilot) + return handle_special_tactic() handle_stance_tactical() // 'Strategical' processes that are more expensive on the CPU and so don't get run as often as the above proc, such as A* pathfinding or robust targeting. /datum/ai_holder/proc/handle_strategicals() + if(holder.key && !autopilot) + return handle_special_strategical() handle_stance_strategical() @@ -160,6 +174,8 @@ // For setting the stance WITHOUT processing it /datum/ai_holder/proc/set_stance(var/new_stance) + if(holder.key && !autopilot) + return if(stance == new_stance) ai_log("set_stance() : Ignoring change stance to same stance request.", AI_LOG_INFO) return @@ -344,4 +360,4 @@ ai_holder.receive_taunt(taunter, force_target_switch) #undef AI_PROCESSING -#undef AI_FASTPROCESSING \ No newline at end of file +#undef AI_FASTPROCESSING diff --git a/code/modules/ai/ai_holder_communication.dm b/code/modules/ai/ai_holder_communication.dm index ef8fcf253d..beddb68924 100644 --- a/code/modules/ai/ai_holder_communication.dm +++ b/code/modules/ai/ai_holder_communication.dm @@ -34,8 +34,8 @@ if(holder.say_list) holder.ISay(safepick(holder.say_list.say_threaten)) - playsound(holder.loc, holder.say_list.threaten_sound, 50, 1) // We do this twice to make the sound -very- noticable to the target. - playsound(target.loc, holder.say_list.threaten_sound, 50, 1) // Actual aim-mode also does that so at least it's consistant. + playsound(holder, holder.say_list.threaten_sound, 50, 1) // We do this twice to make the sound -very- noticable to the target. + playsound(target, holder.say_list.threaten_sound, 50, 1) // Actual aim-mode also does that so at least it's consistant. else // Otherwise we are waiting for them to go away or to wait long enough for escalate. if(target in list_targets()) // Are they still visible? var/should_escalate = FALSE @@ -57,8 +57,8 @@ set_stance(STANCE_IDLE) if(holder.say_list) holder.ISay(safepick(holder.say_list.say_stand_down)) - playsound(holder.loc, holder.say_list.stand_down_sound, 50, 1) // We do this twice to make the sound -very- noticable to the target. - playsound(target.loc, holder.say_list.stand_down_sound, 50, 1) // Actual aim-mode also does that so at least it's consistant. + playsound(holder, holder.say_list.stand_down_sound, 50, 1) // We do this twice to make the sound -very- noticable to the target. + playsound(target, holder.say_list.stand_down_sound, 50, 1) // Actual aim-mode also does that so at least it's consistant. // Determines what is deserving of a warning when STANCE_ALERT is active. /datum/ai_holder/proc/will_threaten(mob/living/the_target) diff --git a/code/modules/ai/interfaces.dm b/code/modules/ai/interfaces.dm index 6cf085c52e..2755875df0 100644 --- a/code/modules/ai/interfaces.dm +++ b/code/modules/ai/interfaces.dm @@ -7,12 +7,12 @@ return FALSE /mob/living/simple_mob/IAttack(atom/A) - if(!canClick()) // Still on cooldown from a "click". + if(!checkClickCooldown()) // Still on cooldown from a "click". return ATTACK_ON_COOLDOWN return attack_target(A) // This will set click cooldown. /mob/living/carbon/human/IAttack(atom/A) - if(!canClick()) // Still on cooldown from a "click". + if(!checkClickCooldown()) // Still on cooldown from a "click". return FALSE return ClickOn(A) // Except this is an actual fake "click". @@ -20,7 +20,7 @@ return FALSE /mob/living/simple_mob/IRangedAttack(atom/A) - if(!canClick()) // Still on cooldown from a "click". + if(!checkClickCooldown()) // Still on cooldown from a "click". return ATTACK_ON_COOLDOWN return shoot_target(A) @@ -74,30 +74,27 @@ // Respects move cooldowns as if it had a client. // Also tries to avoid being superdumb with moving into certain tiles (unless that's desired). /mob/living/proc/IMove(turf/newloc, safety = TRUE) - if(check_move_cooldown()) -// if(!newdir) -// newdir = get_dir(get_turf(src), newloc) + if(!checkMoveCooldown()) + return MOVEMENT_ON_COOLDOWN - // Check to make sure moving to newloc won't actually kill us. e.g. we're a slime and trying to walk onto water. - if(istype(newloc)) - if(safety && !newloc.is_safe_to_enter(src)) - return MOVEMENT_FAILED - - // Move()ing to another tile successfully returns 32 because BYOND. Would rather deal with TRUE/FALSE-esque terms. - // Note that moving to the same tile will be 'successful'. - var/turf/old_T = get_turf(src) - - // An adjacency check to avoid mobs phasing diagonally past windows. - // This might be better in general movement code but I'm too scared to add it, and most things don't move diagonally anyways. - if(!old_T.Adjacent(newloc)) + // Check to make sure moving to newloc won't actually kill us. e.g. we're a slime and trying to walk onto water. + if(istype(newloc)) + if(safety && !newloc.is_safe_to_enter(src)) return MOVEMENT_FAILED - . = SelfMove(newloc) ? MOVEMENT_SUCCESSFUL : MOVEMENT_FAILED - if(. == MOVEMENT_SUCCESSFUL) - set_dir(get_dir(old_T, newloc)) - // Apply movement delay. - // Player movement has more factors but its all in the client and fixing that would be its own project. - setMoveCooldown(movement_delay()) - return + // Move()ing to another tile successfully returns 32 because BYOND. Would rather deal with TRUE/FALSE-esque terms. + // Note that moving to the same tile will be 'successful'. + var/turf/old_T = get_turf(src) - . = MOVEMENT_ON_COOLDOWN // To avoid superfast mobs that aren't meant to be superfast. Is actually -1. + // An adjacency check to avoid mobs phasing diagonally past windows. + // This might be better in general movement code but I'm too scared to add it, and most things don't move diagonally anyways. + if(!old_T.Adjacent(newloc)) + return MOVEMENT_FAILED + + . = SelfMove(newloc) ? MOVEMENT_SUCCESSFUL : MOVEMENT_FAILED + if(. == MOVEMENT_SUCCESSFUL) + set_dir(get_dir(old_T, newloc)) + // Apply movement delay. + // Player movement has more factors but its all in the client and fixing that would be its own project. + setMoveCooldown(movement_delay()) + return \ No newline at end of file diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index 0906eda63e..b5edd57784 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -89,7 +89,7 @@ /obj/item/weapon/deadringer/proc/reveal() if(watchowner) watchowner.alpha = 255 - playsound(get_turf(src), 'sound/effects/uncloak.ogg', 35, 1, -1) + playsound(src, 'sound/effects/uncloak.ogg', 35, 1, -1) return /obj/item/weapon/deadringer/proc/makeacorpse(var/mob/living/carbon/human/H) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 3b0c38c82d..824eb85b0a 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -3,7 +3,6 @@ icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "holder" item_state = "assembly" - flags = PROXMOVE throwforce = 5 w_class = ITEMSIZE_SMALL throw_speed = 3 @@ -64,11 +63,18 @@ else . += "\The [src] can be attached!" -/obj/item/device/assembly_holder/HasProximity(atom/movable/AM as mob|obj) +/obj/item/device/assembly_holder/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(isturf(old_loc)) + unsense_proximity(callback = .HasProximity, center = old_loc) + if(isturf(loc)) + sense_proximity(callback = .HasProximity) + +/obj/item/device/assembly_holder/HasProximity(turf/T, atom/movable/AM, old_loc) if(a_left) - a_left.HasProximity(AM) + a_left.HasProximity(T, AM, old_loc) if(a_right) - a_right.HasProximity(AM) + a_right.HasProximity(T, AM, old_loc) /obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj) if(AM.is_incorporeal()) @@ -84,8 +90,8 @@ if(a_right) a_right.on_found(finder) -/obj/item/device/assembly_holder/Move() - ..() +/obj/item/device/assembly_holder/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 2f10a91fda..b34b2c0c11 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -79,8 +79,11 @@ /obj/item/device/assembly/infra/Move() var/t = dir - ..() + . = ..() set_dir(t) + +/obj/item/device/assembly/infra/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() QDEL_LIST_NULL(i_beams) /obj/item/device/assembly/infra/holder_movement() diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index b294fc90c8..6ea9dfdff7 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -43,7 +43,7 @@ var/mob/living/simple_mob/animal/passive/mouse/M = target visible_message("SPLAT!") M.splat() - playsound(target.loc, 'sound/effects/snap.ogg', 50, 1) + playsound(target, 'sound/effects/snap.ogg', 50, 1) layer = MOB_LAYER - 0.2 armed = 0 update_icon() @@ -65,7 +65,7 @@ to_chat(user, "You disarm [src].") armed = !armed update_icon() - playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + playsound(user, 'sound/weapons/handcuffs.ogg', 30, 1, -3) /obj/item/device/assembly/mousetrap/attack_hand(var/mob/living/user) if(armed) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index a93bda4809..f7d8e3e59e 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -4,7 +4,6 @@ icon_state = "prox" origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50) - flags = PROXMOVE wires = WIRE_PULSE secured = 0 @@ -33,7 +32,7 @@ update_icon() return secured -/obj/item/device/assembly/prox_sensor/HasProximity(atom/movable/AM as mob|obj) +/obj/item/device/assembly/prox_sensor/HasProximity(turf/T, atom/movable/AM, old_loc) if(!istype(AM)) log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).") return @@ -88,8 +87,12 @@ var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc grenade.primed(scanning) -/obj/item/device/assembly/prox_sensor/Move() - ..() +/obj/item/device/assembly/prox_sensor/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(isturf(old_loc)) + unsense_proximity(range = range, callback = .HasProximity, center = old_loc) + if(isturf(loc)) + sense_proximity(range = range, callback = .HasProximity) sense() /obj/item/device/assembly/prox_sensor/interact(mob/user as mob)//TODO: Change this to the wires thingy diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index c9ab387753..e450e85ed4 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -43,7 +43,7 @@ /obj/effect/blob/proc/take_damage(var/damage) health -= damage if(health < 0) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) qdel(src) else update_icon() @@ -103,7 +103,7 @@ if(L.stat == DEAD) continue L.visible_message("The blob attacks \the [L]!", "The blob attacks you!") - playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) + playsound(src, 'sound/effects/attackblob.ogg', 50, 1) L.take_organ_damage(rand(30, 40)) return new expandType(T, min(health, 30)) @@ -135,7 +135,7 @@ /obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) + playsound(src, 'sound/effects/attackblob.ogg', 50, 1) visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = 0 switch(W.damtype) diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 1bcf7c35bd..71d4ad7254 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob/Destroy() - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Expand() is no longer broken, no check necessary. + playsound(src, 'sound/effects/splat.ogg', 50, 1) //Expand() is no longer broken, no check necessary. GLOB.all_blobs -= src overmind = null return ..() @@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(all_blobs) if(istype(T, /turf/space) && !(locate(/obj/structure/lattice) in T) && prob(80)) make_blob = FALSE - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Let's give some feedback that we DID try to spawn in space, since players are used to it + playsound(src, 'sound/effects/splat.ogg', 50, 1) //Let's give some feedback that we DID try to spawn in space, since players are used to it consume_tile() //hit the tile we're in, making sure there are no border objects blocking us @@ -223,7 +223,7 @@ GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob/attack_generic(var/mob/user, var/damage, var/attack_verb) visible_message("[user] [attack_verb] the [src]!") - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) user.do_attack_animation(src) if(overmind) damage *= overmind.blob_type.brute_multiplier @@ -307,7 +307,7 @@ GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob/attackby(var/obj/item/weapon/W, var/mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) + playsound(src, 'sound/effects/attackblob.ogg', 50, 1) visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = W.force switch(W.damtype) @@ -318,7 +318,7 @@ GLOBAL_LIST_EMPTY(all_blobs) damage *= 2 if(damage > 0) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + playsound(src, 'sound/items/welder.ogg', 100, 1) else playsound(src, 'sound/weapons/tap.ogg', 50, 1) if(BRUTE, SEARING, TOX, CLONE) @@ -328,7 +328,7 @@ GLOBAL_LIST_EMPTY(all_blobs) damage *= 2 if(damage > 0) - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + playsound(src, 'sound/effects/attackblob.ogg', 50, 1) else playsound(src, 'sound/weapons/tap.ogg', 50, 1) if(overmind) @@ -369,7 +369,7 @@ GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob/proc/adjust_integrity(amount) integrity = between(0, integrity + amount, max_integrity) if(integrity == 0) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) if(overmind) overmind.blob_type.on_death(src) qdel(src) diff --git a/code/modules/blob2/core_chunk.dm b/code/modules/blob2/core_chunk.dm index 8a5795aae9..7d8f588568 100644 --- a/code/modules/blob2/core_chunk.dm +++ b/code/modules/blob2/core_chunk.dm @@ -61,12 +61,13 @@ /obj/item/weapon/blobcore_chunk/proc/get_carrier(var/atom/target) var/atom/A = target ? target.loc : src - if(!istype(A, /mob/living)) - A = get_carrier(A) if(isturf(A) || isarea(A)) // Something has gone horribly wrong if the second is true. return FALSE // No mob is carrying us. + if(!istype(A, /mob/living)) + A = get_carrier(A) + return A /obj/item/weapon/blobcore_chunk/blob_act(obj/structure/blob/B) diff --git a/code/modules/blob2/overmind/types/ravenous_macrophage.dm b/code/modules/blob2/overmind/types/ravenous_macrophage.dm index 0a73501c34..b6b3b65a4f 100644 --- a/code/modules/blob2/overmind/types/ravenous_macrophage.dm +++ b/code/modules/blob2/overmind/types/ravenous_macrophage.dm @@ -23,7 +23,7 @@ /datum/blob_type/ravenous_macrophage/on_pulse(var/obj/structure/blob/B) var/mob/living/L = locate() in range(world.view, B) - if(prob(1) && L.mind && !L.stat) // There's some active living thing nearby, produce offgas. + if(L && prob(1) && L.mind && !L.stat) // There's some active living thing nearby, produce offgas. var/turf/T = get_turf(B) var/datum/effect/effect/system/smoke_spread/noxious/BS = new /datum/effect/effect/system/smoke_spread/noxious BS.attach(T) diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index e4e148c230..8f7f3152f3 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -111,25 +111,25 @@ GLOBAL_LIST_EMPTY(all_cataloguers) box_segments = draw_box(target, scan_range, user.client) color_box(box_segments, "#00FF00", scan_delay) - playsound(src.loc, 'sound/machines/beep.ogg', 50) + playsound(src, 'sound/machines/beep.ogg', 50) // The delay, and test for if the scan succeeds or not. var/scan_start_time = world.time if(do_after(user, scan_delay, target, ignore_movement = TRUE, max_distance = scan_range)) if(target.can_catalogue(user)) to_chat(user, span("notice", "You successfully scan \the [target] with \the [src].")) - playsound(src.loc, 'sound/machines/ping.ogg', 50) + playsound(src, 'sound/machines/ping.ogg', 50) catalogue_object(target, user) else // In case someone else scans it first, or it died, etc. to_chat(user, span("warning", "\The [target] is no longer valid to scan with \the [src].")) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50) + playsound(src, 'sound/machines/buzz-two.ogg', 50) partial_scanned = null partial_scan_time = 0 else to_chat(user, span("warning", "You failed to finish scanning \the [target] with \the [src].")) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50) + playsound(src, 'sound/machines/buzz-two.ogg', 50) color_box(box_segments, "#FF0000", 3) partial_scanned = weakref(target) partial_scan_time += world.time - scan_start_time // This is added to the existing value so two partial scans will add up correctly. @@ -204,7 +204,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) busy = TRUE update_icon() - playsound(src.loc, 'sound/machines/beep.ogg', 50) + playsound(src, 'sound/machines/beep.ogg', 50) // First, get everything able to be scanned. var/list/scannable_atoms = list() @@ -232,9 +232,9 @@ GLOBAL_LIST_EMPTY(all_cataloguers) busy = FALSE update_icon() if(scannable_atoms.len) - playsound(src.loc, 'sound/machines/ping.ogg', 50) + playsound(src, 'sound/machines/ping.ogg', 50) else - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50) + playsound(src, 'sound/machines/buzz-two.ogg', 50) to_chat(user, span("notice", "\The [src] found [scannable_atoms.len] object\s that can be scanned.")) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index ef942b1992..163096ecda 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -18,7 +18,6 @@ //OTHER// ///////// var/datum/preferences/prefs = null - //var/move_delay = 1 var/moving = null var/adminobs = null var/area = null diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 933729fa13..edb8fc2329 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -277,12 +277,14 @@ var/sql_computerid = sql_sanitize_text(src.computer_id) var/sql_admin_rank = sql_sanitize_text(admin_rank) + // If you're about to disconnect the player, you have to use to_chat_immediate otherwise they won't get the message (SSchat will queue it) + //Panic bunker code if (isnum(player_age) && player_age == 0) //first connection if (config.panic_bunker && !holder && !deadmin_holder) log_adminwarn("Failed Login: [key] - New account attempting to connect during panic bunker") message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") - to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.") + to_chat_immediate(src, "Sorry but the server is currently not accepting connections from never before seen players.") qdel(src) return 0 @@ -301,11 +303,11 @@ //Take action if required if(config.ipr_block_bad_ips && config.ipr_allow_existing) //We allow players of an age, but you don't meet it - to_chat(src, "Sorry, we only allow VPN/Proxy/Tor usage for players who have spent at least [config.ipr_minimum_age] days on the server. If you are unable to use the internet without your VPN/Proxy/Tor, please contact an admin out-of-game to let them know so we can accommodate this.") + to_chat_immediate(src, "Sorry, we only allow VPN/Proxy/Tor usage for players who have spent at least [config.ipr_minimum_age] days on the server. If you are unable to use the internet without your VPN/Proxy/Tor, please contact an admin out-of-game to let them know so we can accommodate this.") qdel(src) return 0 else if(config.ipr_block_bad_ips) //We don't allow players of any particular age - to_chat(src, "Sorry, we do not accept connections from users via VPN/Proxy/Tor connections.") + to_chat_immediate(src, "Sorry, we do not accept connections from users via VPN/Proxy/Tor connections. If you believe this is in error, contact an admin out-of-game.") qdel(src) return 0 else @@ -342,18 +344,6 @@ else . = ..() - -// Byond seemingly calls stat, each tick. -// Calling things each tick can get expensive real quick. -// So we slow this down a little. -// See: http://www.byond.com/docs/ref/info.html#/client/proc/Stat -/client/Stat() - . = ..() - if (holder) - sleep(1) - else - stoplag(5) - /client/proc/last_activity_seconds() return inactivity / 10 @@ -405,18 +395,20 @@ client/verb/character_setup() if(src.chatOutputLoadedAt > (world.time - 10 SECONDS)) alert(src, "You can only try to reload VChat every 10 seconds at most.") return - + + verbs -= /client/proc/vchat_export_log + //Log, disable log_debug("[key_name(src)] reloaded VChat.") winset(src, null, "outputwindow.htmloutput.is-visible=false;outputwindow.oldoutput.is-visible=false;outputwindow.chatloadlabel.is-visible=true") - + //The hard way qdel_null(src.chatOutput) chatOutput = new /datum/chatOutput(src) //veechat chatOutput.send_resources() spawn() chatOutput.start() - + //This is for getipintel.net. //You're welcome to replace this proc with your own that does your own cool stuff. diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 92beaa5d9a..d5edede6ce 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -321,33 +321,33 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "Hair
" if(has_flag(mob_species, HAS_HAIR_COLOR)) - . += "Change Color
__
" - . += " Style: [pref.h_style]
" + . += "Change Color [color_square(pref.r_hair, pref.g_hair, pref.b_hair)] " + . += " Style: < > [pref.h_style]
" //The < & > in this line is correct-- those extra characters are the arrows you click to switch between styles. . += "
Facial
" if(has_flag(mob_species, HAS_HAIR_COLOR)) - . += "Change Color
__
" - . += " Style: [pref.f_style]
" + . += "Change Color [color_square(pref.r_facial, pref.g_facial, pref.b_facial)] " + . += " Style: < > [pref.f_style]
" //Same as above with the extra > & < characters if(has_flag(mob_species, HAS_EYE_COLOR)) . += "
Eyes
" - . += "Change Color
__

" + . += "Change Color [color_square(pref.r_eyes, pref.g_eyes, pref.b_eyes)]
" if(has_flag(mob_species, HAS_SKIN_COLOR)) . += "
Body Color
" - . += "Change Color
__

" + . += "Change Color [color_square(pref.r_skin, pref.g_skin, pref.b_skin)]
" . += "
Body Markings +
" + . += "" for(var/M in pref.body_markings) - . += "[M] [pref.body_markings.len > 1 ? "˄˅ " : ""]-Color" - . += "
__
" - . += "
" + . += "[M][pref.body_markings.len > 1 ? "˄ ˅ mv " : ""]- Color[color_square(hex = pref.body_markings[M])]" + . += "" . += "
" . += "Allow Synth markings: [pref.synth_markings ? "Yes" : "No"]
" . += "Allow Synth color: [pref.synth_color ? "Yes" : "No"]
" if(pref.synth_color) - . += "Change Color
__
" + . += "Change Color [color_square(pref.r_synth, pref.g_synth, pref.b_synth)]" . = jointext(.,null) @@ -408,16 +408,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.set_biological_gender(mob_species.genders[1]) //grab one of the valid hair styles for the newly chosen species - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(pref.biological_gender == MALE && S.gender == FEMALE) - continue - if(pref.biological_gender == FEMALE && S.gender == MALE) - continue - if(!(pref.species in S.species_allowed)) - continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + var/list/valid_hairstyles = pref.get_valid_hairstyles() if(valid_hairstyles.len) pref.h_style = pick(valid_hairstyles) @@ -426,17 +417,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.h_style = hair_styles_list["Bald"] //grab one of the valid facial hair styles for the newly chosen species - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(pref.biological_gender == MALE && S.gender == FEMALE) - continue - if(pref.biological_gender == FEMALE && S.gender == MALE) - continue - if(!(pref.species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles() if(valid_facialhairstyles.len) pref.f_style = pick(valid_facialhairstyles) @@ -470,19 +451,35 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["hair_style"]) - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(!(pref.species in S.species_allowed)) - continue - - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + var/list/valid_hairstyles = pref.get_valid_hairstyles() var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", pref.h_style) as null|anything in valid_hairstyles if(new_h_style && CanUseTopic(user)) pref.h_style = new_h_style return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["hair_style_left"]) + var/H = href_list["hair_style_left"] + var/list/valid_hairstyles = pref.get_valid_hairstyles() + var/start = valid_hairstyles.Find(H) + + if(start != 1) //If we're not the beginning of the list, become the previous element. + pref.h_style = valid_hairstyles[start-1] + else //But if we ARE, become the final element. + pref.h_style = valid_hairstyles[valid_hairstyles.len] + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["hair_style_right"]) + var/H = href_list["hair_style_right"] + var/list/valid_hairstyles = pref.get_valid_hairstyles() + var/start = valid_hairstyles.Find(H) + + if(start != valid_hairstyles.len) //If we're not the end of the list, become the next element. + pref.h_style = valid_hairstyles[start+1] + else //But if we ARE, become the first element. + pref.h_style = valid_hairstyles[1] + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["facial_color"]) if(!has_flag(mob_species, HAS_HAIR_COLOR)) return TOPIC_NOACTION @@ -522,23 +519,35 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["facial_style"]) - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(pref.biological_gender == MALE && S.gender == FEMALE) - continue - if(pref.biological_gender == FEMALE && S.gender == MALE) - continue - if(!(pref.species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles() var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", pref.f_style) as null|anything in valid_facialhairstyles if(new_f_style && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) pref.f_style = new_f_style return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["facial_style_left"]) + var/F = href_list["facial_style_left"] + var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles() + var/start = valid_facialhairstyles.Find(F) + + if(start != 1) //If we're not the beginning of the list, become the previous element. + pref.f_style = valid_facialhairstyles[start-1] + else //But if we ARE, become the final element. + pref.f_style = valid_facialhairstyles[valid_facialhairstyles.len] + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["facial_style_right"]) + var/F = href_list["facial_style_right"] + var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles() + var/start = valid_facialhairstyles.Find(F) + + if(start != valid_facialhairstyles.len) //If we're not the end of the list, become the next element. + pref.f_style = valid_facialhairstyles[start+1] + else //But if we ARE, become the first element. + pref.f_style = valid_facialhairstyles[1] + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_style"]) var/list/usable_markings = pref.body_markings.Copy() ^ body_marking_styles_list.Copy() for(var/M in usable_markings) @@ -571,6 +580,19 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O moveElement(pref.body_markings, start, 1) return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_move"]) + var/M = href_list["marking_move"] + var/start = pref.body_markings.Find(M) + var/list/move_locs = pref.body_markings - M + if(start != 1) + move_locs -= pref.body_markings[start-1] + + var/inject_after = input(user, "Move [M] ahead of...", "Character Preference") as null|anything in move_locs //Move ahead of any marking that isn't the current or previous one. + var/newpos = pref.body_markings.Find(inject_after) + if(newpos) + moveElement(pref.body_markings, start, newpos+1) + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_remove"]) var/M = href_list["marking_remove"] pref.body_markings -= M diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm index ed66138da5..a40155d2d5 100644 --- a/code/modules/client/preference_setup/global/01_ui.dm +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -29,7 +29,7 @@ /datum/category_item/player_setup_item/player_global/ui/content(var/mob/user) . = "UI Style: [pref.UI_style]
" . += "Custom UI (recommended for White UI):
" - . += "-Color: [pref.UI_style_color] 
__
 reset
" + . += "-Color: [pref.UI_style_color] [color_square(hex = pref.UI_style_color)] reset
" . += "-Alpha(transparency): [pref.UI_style_alpha] reset
" . += "Tooltip Style: [pref.tooltipstyle]
" . += "Client FPS: [pref.client_fps]
" @@ -38,7 +38,7 @@ if(pref.ooccolor == initial(pref.ooccolor)) . += "Using Default
" else - . += "[pref.ooccolor]
__
 reset
" + . += "[pref.ooccolor] [color_square(hex = pref.ooccolor)] reset
" /datum/category_item/player_setup_item/player_global/ui/OnTopic(var/href,var/list/href_list, var/mob/user) if(href_list["select_style"]) diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index 10478b7158..970c8dd8e6 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -128,6 +128,12 @@ var/list/_client_preferences_by_type enabled_description = "Show" disabled_description = "Hide" +/datum/client_preference/inv_tooltips + description ="Inventory tooltips" + key = "INV_TOOLTIPS" + enabled_description = "Show" + disabled_description = "Hide" + /datum/client_preference/attack_icons description ="Attack icons" key = "ATTACK_ICONS" diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 9748c9eae5..55ab91685c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -127,15 +127,7 @@ /datum/gear/head/cap/sol display_name = "cap, sol" - path = /obj/item/clothing/head/soft/sol - -/datum/gear/head/cap/expdition - display_name = "cap, expedition" - path = /obj/item/clothing/head/soft/sol/expedition - -/datum/gear/head/cap/fleet - display_name = "cap, fleet" - path = /obj/item/clothing/head/soft/sol/fleet + path = /obj/item/clothing/head/soft/solgov /datum/gear/head/cowboy display_name = "cowboy, rodeo" @@ -337,15 +329,15 @@ display_name = "welding, engie (engineering/robotics)" path = /obj/item/clothing/head/welding/engie -/datum/gear/head/beret/sol +/datum/gear/head/beret/solgov display_name = "beret sol, selection" - path = /obj/item/clothing/head/beret/sol + path = /obj/item/clothing/head/beret/solgov -/datum/gear/head/beret/sol/New() +/datum/gear/head/beret/solgov/New() ..() var/list/sols = list() - for(var/sol_style in typesof(/obj/item/clothing/head/beret/sol)) - var/obj/item/clothing/head/beret/sol/sol = sol_style + for(var/sol_style in typesof(/obj/item/clothing/head/beret/solgov)) + var/obj/item/clothing/head/beret/solgov/sol = sol_style sols[initial(sol.name)] = sol gear_tweaks += new/datum/gear_tweak/path(sortAssoc(sols)) diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index a2fe252586..5a2e4fa3bc 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -75,16 +75,16 @@ path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless /datum/gear/suit/mil - display_name = "military jacket" + display_name = "military jacket selection" path = /obj/item/clothing/suit/storage/miljacket - -/datum/gear/suit/mil/alt - display_name = "military jacket, alt" - path = /obj/item/clothing/suit/storage/miljacket/alt - -/datum/gear/suit/mil/green - display_name = "military jacket, green" - path = /obj/item/clothing/suit/storage/miljacket/green + +/datum/gear/suit/mil/New() + ..() + var/list/mil_jackets = list() + for(var/military_style in typesof(/obj/item/clothing/suit/storage/miljacket)) + var/obj/item/clothing/suit/storage/miljacket/miljacket = military_style + mil_jackets[initial(miljacket.name)] = miljacket + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(mil_jackets)) /datum/gear/suit/greyjacket display_name = "grey jacket" diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index 0a64ec0137..a2c2322286 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -393,3 +393,23 @@ /datum/gear/suit/labcoat_tesh/New() ..() gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/suit/teshcoat + display_name = "small black coat, recolorable stripes (Teshari)" + path = /obj/item/clothing/suit/storage/toggle/tesharicoat + whitelisted = SPECIES_TESHARI + sort_category = "Xenowear" + +/datum/gear/suit/teshcoat/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/suit/teshcoatwhite + display_name = "smallcoat, recolorable (Teshari)" + path = /obj/item/clothing/suit/storage/toggle/tesharicoatwhite + whitelisted = SPECIES_TESHARI + sort_category = "Xenowear" + +/datum/gear/suit/teshcoatwhite/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index f53bf82cb8..4d6b15d685 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -304,4 +304,8 @@ return 220 if(PREF_FBP_SOFTWARE) return 150 - return S.max_age // welp \ No newline at end of file + return S.max_age // welp + +/datum/category_item/player_setup_item/proc/color_square(red, green, blue, hex) + var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" + return "___" \ No newline at end of file diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 652f2ac082..593d592187 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -81,6 +81,8 @@ else player_setup.load_character(S) S.cd = "/character[default_slot]" + player_setup.save_character(S) + sanitize_preferences() player_setup.load_character(S) return 1 diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 6df4334835..1736c9ca7d 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -13,6 +13,7 @@ var/list/spawntypes = list() var/list/restrict_job = null var/list/disallow_job = null var/announce_channel = "Common" + var/allowed_mob_types = JOB_SILICON|JOB_CARBON proc/check_job_spawning(job) if(restrict_job && !(job in restrict_job)) @@ -22,9 +23,15 @@ var/list/spawntypes = list() return 0 var/datum/job/J = SSjob.get_job(job) - if(J?.offmap_spawn && !(job in restrict_job)) + if(!J) // Couldn't find, admin shenanigans? Allow it + return 1 + + if(J.offmap_spawn && !(job in restrict_job)) return 0 + if(!(J.mob_type & allowed_mob_types)) + return 0 + return 1 /datum/spawnpoint/proc/get_spawn_position() @@ -57,7 +64,7 @@ var/list/spawntypes = list() /datum/spawnpoint/cryo display_name = "Cryogenic Storage" msg = "has completed cryogenic revival" - disallow_job = list("Cyborg") + allowed_mob_types = JOB_CARBON /datum/spawnpoint/cryo/New() ..() @@ -66,7 +73,7 @@ var/list/spawntypes = list() /datum/spawnpoint/cyborg display_name = "Cyborg Storage" msg = "has been activated from storage" - restrict_job = list("Cyborg") + allowed_mob_types = JOB_SILICON /datum/spawnpoint/cyborg/New() ..() diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index 7e813103a2..f1884dea82 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -280,6 +280,19 @@ feedback_add_details("admin_verb","TMobTooltips") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/toggle_inv_tooltips() + set name = "Toggle Item Tooltips" + set category = "Preferences" + set desc = "Toggles displaying name/desc over items when moused over (only applies in inventory)." + + var/pref_path = /datum/client_preference/inv_tooltips + toggle_preference(pref_path) + SScharacter_setup.queue_preferences_save(prefs) + + to_chat(src,"You will now [(is_preference_enabled(/datum/client_preference/inv_tooltips)) ? "see" : "not see"] inventory tooltips.") + + feedback_add_details("admin_verb","TInvTooltips") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/verb/toggle_hear_instruments() set name = "Toggle Hear/Ignore Instruments" set category = "Preferences" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 628547ab45..b33a4d7178 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -59,7 +59,7 @@ user.recalculate_vis() //BS12: Species-restricted clothing check. -/obj/item/clothing/mob_can_equip(M as mob, slot) +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) if (!..()) @@ -311,7 +311,7 @@ update_icon() return - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") clipped = 1 @@ -323,7 +323,7 @@ return */ -/obj/item/clothing/gloves/mob_can_equip(mob/user, slot) +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) var/mob/living/carbon/human/H = user if(slot && slot == slot_gloves) @@ -588,7 +588,7 @@ if(usr.put_in_hands(holding)) usr.visible_message("\The [usr] pulls a knife out of their boot!") - playsound(get_turf(src), 'sound/weapons/holster/sheathout.ogg', 25) + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) holding = null overlays -= image(icon, "[icon_state]_knife") else @@ -752,12 +752,16 @@ |ACCESSORY_SLOT_MEDAL\ |ACCESSORY_SLOT_INSIGNIA\ |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ |ACCESSORY_SLOT_OVER) restricted_accessory_slots = (\ ACCESSORY_SLOT_UTILITY\ |ACCESSORY_SLOT_WEAPON\ |ACCESSORY_SLOT_ARMBAND\ |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ |ACCESSORY_SLOT_OVER) var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi' diff --git a/code/modules/clothing/gloves/arm_guards.dm b/code/modules/clothing/gloves/arm_guards.dm index 558f855545..6b0517642a 100644 --- a/code/modules/clothing/gloves/arm_guards.dm +++ b/code/modules/clothing/gloves/arm_guards.dm @@ -7,7 +7,7 @@ w_class = ITEMSIZE_NORMAL drop_sound = 'sound/items/drop/metalshield.ogg' -/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot) +/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE) if(..()) //This will only run if no other problems occured when equiping. if(H.wear_suit) if(H.wear_suit.body_parts_covered & ARMS) diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm index 8807fb93ad..efb25587a9 100644 --- a/code/modules/clothing/gloves/gauntlets.dm +++ b/code/modules/clothing/gloves/gauntlets.dm @@ -14,7 +14,7 @@ punch_force = 5 var/obj/item/clothing/gloves/gloves = null //Undergloves -/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user) +/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user, slot, disable_warning = FALSE) var/mob/living/carbon/human/H = user if(H.gloves) gloves = H.gloves diff --git a/code/modules/clothing/head/solgov.dm b/code/modules/clothing/head/solgov.dm index bd9ef27f4b..6a3c585aaa 100644 --- a/code/modules/clothing/head/solgov.dm +++ b/code/modules/clothing/head/solgov.dm @@ -1,7 +1,7 @@ //SolGov uniform hats //Utility -/obj/item/clothing/head/soft/sol +/obj/item/clothing/head/soft/solgov name = "\improper SolGov cap" desc = "It's a blue ballcap in Solar Confederate Government colors." icon_state = "solsoft" @@ -10,7 +10,12 @@ slot_r_hand_str = "lightbluesoft", ) -/obj/item/clothing/head/soft/sol/expedition +/obj/item/clothing/head/soft/solgov/veteranhat + name = "veteran hat" + desc = "It's a tacky black ballcap bearing the yellow service ribbon of the Gaia Conflict." + icon_state = "cap_veteran" + +/obj/item/clothing/head/soft/solgov/sifguard name = "\improper SifGuard cap" desc = "It's a black ballcap bearing a Sif Defense Force crest." icon_state = "expeditionsoft" @@ -19,7 +24,12 @@ slot_r_hand_str = "blacksoft", ) -/obj/item/clothing/head/soft/sol/fleet +/obj/item/clothing/head/soft/solgov/sifguard/co + name = "\improper SifGuard captain's cap" + desc = "It's a black ballcap bearing the Sif Defense Force crest. The brim has gold trim." + icon_state = "expeditioncomsoft" + +/obj/item/clothing/head/soft/solgov/fleet name = "fleet cap" desc = "It's a navy blue ballcap with a SCG Fleet crest." icon_state = "fleetsoft" @@ -46,21 +56,21 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 10, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.7 -/obj/item/clothing/head/utility/marine +/obj/item/clothing/head/utility/army name = "marine utility cover" - desc = "A grey utility cover bearing the crest of the SCG Marine Corps." - icon_state = "greyutility" + desc = "A green utility cover bearing the crest of the SCG Marines." + icon_state = "greenutility" armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0) -/obj/item/clothing/head/utility/marine/tan +/obj/item/clothing/head/utility/army/tan name = "tan utility cover" - desc = "A tan utility cover bearing the crest of the SCG Marine Corps." + desc = "A tan utility cover bearing the crest of the SCG Marines." icon_state = "tanutility" -/obj/item/clothing/head/utility/marine/green - name = "green utility cover" - desc = "A green utility cover bearing the crest of the SCG Marine Corps." - icon_state = "greenutility" +/obj/item/clothing/head/utility/army/urban + name = "urban utility cover" + desc = "A grey utility cover bearing the crest of the SCG Marines." + icon_state = "greyutility" //Service @@ -75,29 +85,49 @@ siemens_coefficient = 0.9 body_parts_covered = 0 -/obj/item/clothing/head/service/marine +/obj/item/clothing/head/service/sifguard + name = "\improper SifGuard peaked cap" + desc = "A peaked black uniform cap belonging to the Sif Defense Force Corps." + icon_state = "ecdresscap" + +/obj/item/clothing/head/service/sifguard/command + name = "\improper SifGuard officer's peaked cap" + desc = "A peaked black uniform cap belonging to the Sif Defense Force. This one is trimmed in gold." + icon_state = "ecdresscap_ofcr" + +/obj/item/clothing/head/service/sifguard/captain + name = "\improper SifGuard captain's peaked cap" + desc = "A gold-trimmed peaked black uniform cap belonging to a Captain of the Sif Defense Force." + icon_state = "ecdresscap_capt" + +/obj/item/clothing/head/service/sifguard/senior_command + name = "senior SifGuard officer's peaked cap" + desc = "A peaked grey uniform cap belonging to the Sif Defense Force. This one is trimmed in gold and blue." + icon_state = "greydresscap_senior" + +/obj/item/clothing/head/service/army name = "marine wheel cover" - desc = "A green service uniform cover with an SCG Marine Corps crest." + desc = "A green service uniform cover with an SCG Marine crest." icon_state = "greenwheelcap" -/obj/item/clothing/head/service/marine/command +/obj/item/clothing/head/service/army/command name = "marine officer's wheel cover" - desc = "A green service uniform cover with an SCG Marine Corps crest and gold stripe." + desc = "A green service uniform cover with an SCG Marine crest and gold stripe." icon_state = "greenwheelcap_com" -/obj/item/clothing/head/service/marine/garrison +/obj/item/clothing/head/service/army/garrison name = "marine garrison cap" - desc = "A green garrison cap belonging to the SCG Marine Corps." + desc = "A green garrison cap belonging to the SCG Marine." icon_state = "greengarrisoncap" -/obj/item/clothing/head/service/marine/garrison/command +/obj/item/clothing/head/service/army/garrison/command name = "marine officer's garrison cap" - desc = "A green garrison cap belonging to the SCG Marine Corps. This one has a gold pin." + desc = "A green garrison cap belonging to the SCG Marine. This one has a gold pin." icon_state = "greengarrisoncap_com" -/obj/item/clothing/head/service/marine/campaign +/obj/item/clothing/head/service/army/campaign name = "campaign cover" - desc = "A green campaign cover with an SCG Marine Corps crest. Only found on the heads of Drill Instructors." + desc = "A green campaign cover with an SCG Marine crest. Only found on the heads of Drill Sergeants." icon_state = "greendrill" //Dress @@ -113,15 +143,10 @@ siemens_coefficient = 0.9 body_parts_covered = 0 -/obj/item/clothing/head/dress/expedition - name = "\improper SifGuard dress cap" - desc = "A peaked grey dress uniform cap belonging to the Sif Defense Force." - icon_state = "greydresscap" - -/obj/item/clothing/head/dress/expedition/command - name = "\improper SifGuard command dress cap" - desc = "A peaked grey dress uniform cap belonging to the Sif Defense Force. This one is trimmed in gold." - icon_state = "greydresscap_com" +/obj/item/clothing/head/dress/fleet/garrison + name = "fleet garrison cap" + desc = "A white dress uniform cap. The classic sailor's choice." + icon_state = "whitegarrisoncap" /obj/item/clothing/head/dress/fleet name = "fleet dress wheel cover" @@ -129,108 +154,237 @@ icon_state = "whitepeakcap" /obj/item/clothing/head/dress/fleet/command - name = "fleet command dress wheel cover" + name = "fleet officer's dress wheel cover" desc = "A white dress uniform cover. This one has a gold stripe and an SCG Fleet crest." icon_state = "whitepeakcap_com" -/obj/item/clothing/head/dress/marine +/obj/item/clothing/head/dress/army name = "marine dress wheel cover" - desc = "A white dress uniform cover with an SCG Marine Corps crest." + desc = "A white dress uniform cover with an SCG Marine crest." icon_state = "whitewheelcap" -/obj/item/clothing/head/dress/marine/command +/obj/item/clothing/head/dress/army/command name = "marine officer's dress wheel cover" - desc = "A white dress uniform cover with an SCG Marine Corps crest and gold stripe." + desc = "A white dress uniform cover with an SCG Marine crest and gold stripe." icon_state = "whitewheelcap_com" //Berets -/obj/item/clothing/head/beret/sol +/obj/item/clothing/head/beret/solgov name = "peacekeeper beret" desc = "A beret in Solar Confederate Government colors. For peacekeepers that are more inclined towards style than safety." icon_state = "beret_lightblue" -/obj/item/clothing/head/beret/sol/gateway +/obj/item/clothing/head/beret/solgov/homeguard + name = "home guard beret" + desc = "A red beret denoting service in the Sol Home Guard. For personnel that are more inclined towards style than safety." + icon_state = "beret_red" + +/obj/item/clothing/head/beret/solgov/gateway name = "gateway administration beret" desc = "An orange beret denoting service in the Gateway Administration. For personnel that are more inclined towards style than safety." icon_state = "beret_orange" -/obj/item/clothing/head/beret/sol/customs +/obj/item/clothing/head/beret/solgov/customs name = "customs and trade beret" desc = "A purple beret denoting service in the Customs and Trade Bureau. For personnel that are more inclined towards style than safety." icon_state = "beret_purpleyellow" -/obj/item/clothing/head/beret/sol/orbital +/obj/item/clothing/head/beret/solgov/orbital name = "orbital assault beret" desc = "A blue beret denoting orbital assault training. For helljumpers that are more inclined towards style than safety." icon_state = "beret_blue" -/obj/item/clothing/head/beret/sol/research +/obj/item/clothing/head/beret/solgov/research name = "government research beret" desc = "A green beret denoting service in the Bureau of Research. For explorers that are more inclined towards style than safety." icon_state = "beret_green" -/obj/item/clothing/head/beret/sol/health +/obj/item/clothing/head/beret/solgov/health name = "health service beret" desc = "A white beret denoting service in the Interstellar Health Service. For medics that are more inclined towards style than safety." icon_state = "beret_white" -/obj/item/clothing/head/beret/sol/expedition +/obj/item/clothing/head/beret/solgov/marcom + name = "\improper MARSCOM beret" + desc = "A red beret with a gold insignia, denoting service in the SCGDF Mars Central Command. For brass who are more inclined towards style than safety." + icon_state = "beret_redgold" + +/obj/item/clothing/head/beret/solgov/stratcom + name = "\improper STRATCOM beret" + desc = "A grey beret with a silver insignia, denoting service in the SCGDF Strategic Command. For intelligence personnel who are more inclined towards style than safety." + icon_state = "beret_graysilver" + +/obj/item/clothing/head/beret/solgov/diplomatic + name = "diplomatic security beret" + desc = "A tan beret denoting service in the SCG Marines Diplomatic Security Group. For security personnel who are more inclined towards style than safety." + icon_state = "beret_tan" + +/obj/item/clothing/head/beret/solgov/borderguard + name = "border security beret" + desc = "A green beret with a silver emblem, denoting service in the Bureau of Border Security. For border guards who are more inclined towards style than safety." + icon_state = "beret_greensilver" + +/obj/item/clothing/head/beret/solgov/sifguard name = "\improper SifGuard beret" desc = "A black beret belonging to the Sif Defense Force. For personnel that are more inclined towards style than safety." icon_state = "beret_black" -/obj/item/clothing/head/beret/sol/expedition/security +/obj/item/clothing/head/beret/solgov/sifguard/security name = "\improper SifGuard security beret" desc = "A Sif Defense Force beret with a security crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_security" -/obj/item/clothing/head/beret/sol/expedition/medical +/obj/item/clothing/head/beret/solgov/sifguard/medical name = "\improper SifGuard medical beret" desc = "A Sif Defense Force beret with a medical crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_medical" -/obj/item/clothing/head/beret/sol/expedition/engineering +/obj/item/clothing/head/beret/solgov/sifguard/engineering name = "\improper SifGuard engineering beret" desc = "A Sif Defense Force beret with an engineering crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_engineering" -/obj/item/clothing/head/beret/sol/expedition/supply +/obj/item/clothing/head/beret/solgov/sifguard/supply name = "\improper SifGuard supply beret" desc = "A Sif Defense Force beret with a supply crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_supply" -/obj/item/clothing/head/beret/sol/expedition/command +/obj/item/clothing/head/beret/solgov/sifguard/service + name = "\improper SifGuard service beret" + desc = "An Sif Defense Force beret with a service crest. For personnel that are more inclined towards style than safety." + icon_state = "beret_black_service" + +/obj/item/clothing/head/beret/solgov/sifguard/command name = "\improper SifGuard command beret" desc = "A Sif Defense Force beret with a command crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_command" -/obj/item/clothing/head/beret/sol/fleet +/obj/item/clothing/head/beret/solgov/sifguard/branch + name = "\improper Field Operations beret" + desc = "An Sif Defense Force beret carrying insignia of the Field Operations section of the Sif Defense Force. For personnel that are more inclined towards style than safety." + icon_state = "beret_black_fieldOps" + +/obj/item/clothing/head/beret/solgov/sifguard/branch/observatory + name = "\improper Observatory beret" + desc = "An Sif Defense Force beret carrying insignia of the Observatory section of the Sif Defense Force. For personnel that are more inclined towards style than safety." + icon_state = "beret_black_observatory" + +/obj/item/clothing/head/beret/solgov/fleet name = "fleet beret" desc = "A navy blue beret belonging to the SCG Fleet. For personnel that are more inclined towards style than safety." icon_state = "beret_navy" -/obj/item/clothing/head/beret/sol/fleet/security +/obj/item/clothing/head/beret/solgov/fleet/security name = "fleet security beret" desc = "An SCG Fleet beret with a security crest. For personnel that are more inclined towards style than safety." icon_state = "beret_navy_security" -/obj/item/clothing/head/beret/sol/fleet/medical +/obj/item/clothing/head/beret/solgov/fleet/medical name = "fleet medical beret" desc = "An SCG Fleet beret with a medical crest. For personnel that are more inclined towards style than safety." icon_state = "beret_navy_medical" -/obj/item/clothing/head/beret/sol/fleet/engineering +/obj/item/clothing/head/beret/solgov/fleet/engineering name = "fleet engineering beret" desc = "An SCG Fleet with an engineering crest. For personnel that are more inclined towards style than safety." icon_state = "beret_navy_engineering" -/obj/item/clothing/head/beret/sol/fleet/supply +/obj/item/clothing/head/beret/solgov/fleet/supply name = "fleet supply beret" desc = "An SCG Fleet beret with a supply crest. For personnel that are more inclined towards style than safety." icon_state = "beret_navy_supply" -/obj/item/clothing/head/beret/sol/fleet/command +/obj/item/clothing/head/beret/solgov/fleet/service + name = "fleet service beret" + desc = "An SCG Fleet beret with a service crest. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_service" + +/obj/item/clothing/head/beret/solgov/fleet/exploration + name = "fleet exploration beret" + desc = "An SCG Fleet beret with an exploration crest. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_exploration" + +/obj/item/clothing/head/beret/solgov/fleet/command name = "fleet command beret" desc = "An SCG Fleet beret with a command crest. For personnel that are more inclined towards style than safety." icon_state = "beret_navy_command" + +/obj/item/clothing/head/beret/solgov/fleet/dress + name = "fleet dress beret" + desc = "A white SCG Fleet beret. For personnel that are more inclined towards style than safety." + icon_state = "beret_whiterim" + +/obj/item/clothing/head/beret/solgov/fleet/dress/command + name = "fleet officer's dress beret" + desc = "A white SCG Fleet beret with a golden crest. For personnel that are more inclined towards style than safety." + icon_state = "beret_whiterim_com" + +/obj/item/clothing/head/beret/solgov/fleet/branch + name = "first fleet beret" + desc = "An SCG Fleet beret carrying insignia of First Fleet, the Sol Guard, stationed in Sol. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_first" + +/obj/item/clothing/head/beret/solgov/fleet/branch/second + name = "second fleet beret" + desc = "An SCG Fleet beret carrying insignia of Second Fleet, the Home Guard, tasked with defense of Sol territories. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_second" + +/obj/item/clothing/head/beret/solgov/fleet/branch/third + name = "third fleet beret" + desc = "An SCG Fleet beret carrying insignia of Third Fleet, the Border Guard, guarding borders of Sol territory against Vox and pirates. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_third" + +/obj/item/clothing/head/beret/solgov/fleet/branch/fourth + name = "fourth fleet beret" + desc = "An SCG Fleet beret carrying insignia of Fourth Fleet, stationed on Skrell border. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_fourth" + +/obj/item/clothing/head/beret/solgov/fleet/branch/fifth + name = "fifth fleet beret" + desc = "An SCG Fleet beret carrying insignia of Fifth Fleet, the Quick Reaction Force, recently formed and outfited with last tech. For personnel that are more inclined towards style than safety." + icon_state = "beret_navy_fifth" + +//ushanka + +/obj/item/clothing/head/ushanka/solgov + name = "\improper SifGuard fur hat" + desc = "An Sif Defense Force synthfur-lined hat for operating in cold environments." + icon_state = "ecushankadown" + //icon_state_up = "ecushankaup" + +/obj/item/clothing/head/ushanka/solgov/fleet + name = "fleet fur hat" + desc = "An SCG Fleet synthfur-lined hat for operating in cold environments." + icon_state = "flushankadown" + //icon_state_up = "flushankaup" + +/obj/item/clothing/head/ushanka/solgov/army + name = "marine fur hat" + desc = "An SCG Marine synthfur-lined hat for operating in cold environments." + icon_state = "barushankadown" + //icon_state_up = "barushankaup" + +/obj/item/clothing/head/ushanka/solgov/army/green + name = "green marine fur hat" + desc = "An SCG Marine synthfur-lined hat for operating in cold environments." + icon_state = "arushankadown" + //icon_state_up = "mcushankaup" + +//Terran + +/obj/item/clothing/head/terran/navy/service + name = "ICCGN service cover" + desc = "A service uniform cover, worn by low-ranking crew within the Independent Navy." + icon_state = "terranservice" + item_state = "terranservice" + item_state_slots = list( + slot_l_hand_str = "helmet", + slot_r_hand_str = "helmet") + body_parts_covered = 0 + +/obj/item/clothing/head/terran/navy/service/command + name = "ICCGN command service cover" + desc = "A service uniform cover, worn by high-ranking crew within the Independent Navy." + icon_state = "terranservice_comm" + item_state = "terranservice_comm" diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 230f224d09..be337c9067 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -33,7 +33,7 @@ canremove = 1 return ..() -/obj/item/clothing/mask/monitor/mob_can_equip(var/mob/living/carbon/human/user, var/slot) +/obj/item/clothing/mask/monitor/mob_can_equip(var/mob/living/carbon/human/user, var/slot, disable_warning = FALSE) if (!..()) return 0 if(istype(user)) diff --git a/code/modules/clothing/shoes/leg_guards.dm b/code/modules/clothing/shoes/leg_guards.dm index a6eefc1247..a4079087ab 100644 --- a/code/modules/clothing/shoes/leg_guards.dm +++ b/code/modules/clothing/shoes/leg_guards.dm @@ -9,7 +9,7 @@ can_hold_knife = TRUE drop_sound = 'sound/items/drop/boots.ogg' -/obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) +/obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE) if(..()) //This will only run if no other problems occured when equiping. if(H.wear_suit) if(H.wear_suit.body_parts_covered & LEGS) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 57b8a0911a..7590817a37 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -37,12 +37,12 @@ set_slowdown() force = 5 if(icon_base) icon_state = "[icon_base]1" - playsound(get_turf(src), 'sound/effects/magnetclamp.ogg', 20) + playsound(src, 'sound/effects/magnetclamp.ogg', 20) to_chat(user, "You enable the mag-pulse traction system.") user.update_inv_shoes() //so our mob-overlays update user.update_action_buttons() -/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user, slot) +/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user, slot, disable_warning = FALSE) var/mob/living/carbon/human/H = user if(H.shoes) diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index f2e9e689b4..cf055ae9c0 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -405,7 +405,7 @@ drain_loc = interfaced_with.loc holder.spark_system.start() - playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) + playsound(H, 'sound/effects/sparks2.ogg', 50, 1) return 1 @@ -429,7 +429,7 @@ return 0 holder.spark_system.start() - playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) + playsound(H, 'sound/effects/sparks2.ogg', 50, 1) H.break_cloak() diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 6381e6b1b0..f81a48c2ac 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -59,7 +59,7 @@ for(var/mob/O in oviewers(H)) O.show_message("[H.name] appears from thin air!",1) - playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 75, 1) + playsound(src, 'sound/effects/stealthoff.ogg', 75, 1) /obj/item/rig_module/teleporter @@ -83,8 +83,8 @@ return holder.spark_system.start() - playsound(T, 'sound/effects/phasein.ogg', 25, 1) - playsound(T, 'sound/effects/sparks2.ogg', 50, 1) + playsound(src, 'sound/effects/phasein.ogg', 25, 1) + playsound(src, 'sound/effects/sparks2.ogg', 50, 1) anim(T,M,'icons/mob/mob.dmi',,"phasein",,M.dir) /obj/item/rig_module/teleporter/proc/phase_out(var/mob/M,var/turf/T) diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm b/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm index a1dfb05812..c63f1c2fbd 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm @@ -50,4 +50,4 @@ H.alpha = initial(H.alpha) H.visible_message("[H.name] appears from thin air!") - playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 75, 1) \ No newline at end of file + playsound(H, 'sound/effects/stealthoff.ogg', 75, 1) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm b/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm index ec8fba92d6..bfea5ccf1c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm @@ -57,7 +57,7 @@ drain_loc = interfaced_with.loc holder.spark_system.start() - playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) + playsound(H, 'sound/effects/sparks2.ogg', 50, 1) return 1 @@ -81,7 +81,7 @@ return 0 holder.spark_system.start() - playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) + playsound(H, 'sound/effects/sparks2.ogg', 50, 1) H.break_cloak() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 918cedf4ea..422e9234af 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -124,8 +124,6 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) - START_PROCESSING(SSobj, src) - if(initial_modules && initial_modules.len) for(var/path in initial_modules) var/obj/item/rig_module/module = new path(src) @@ -183,6 +181,22 @@ spark_system = null return ..() +// We only care about processing when we're on a mob +/obj/item/weapon/rig/Moved(old_loc, direction, forced) + if(ismob(loc)) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + + // If we've lost any parts, grab them back. + var/mob/living/M + for(var/obj/item/piece in list(gloves,boots,helmet,chest)) + if(piece.loc != src && !(wearer && piece.loc == wearer)) + if(istype(piece.loc, /mob/living)) + M = piece.loc + M.unEquip(piece) + piece.forceMove(src) + /obj/item/weapon/rig/get_worn_icon_file(var/body_type,var/slot_name,var/default_icon,var/inhands) if(!inhands && (slot_name == slot_back_str || slot_name == slot_belt_str)) if(icon_override) @@ -465,14 +479,13 @@ turn_cooling_off(H, 1) /obj/item/weapon/rig/process() - // If we've lost any parts, grab them back. - var/mob/living/M - for(var/obj/item/piece in list(gloves,boots,helmet,chest)) - if(piece.loc != src && !(wearer && piece.loc == wearer)) - if(istype(piece.loc, /mob/living)) - M = piece.loc - M.unEquip(piece) - piece.forceMove(src) + // Not on a mob...? + if(!ismob(loc)) + if(wearer?.wearing_rig == src) + wearer.wearing_rig = null + wearer = null + return PROCESS_KILL + // Run through cooling coolingProcess() @@ -995,14 +1008,6 @@ if(wearer.transforming || !wearer.canmove) return - if(locate(/obj/effect/stop/, wearer.loc)) - for(var/obj/effect/stop/S in wearer.loc) - if(S.victim == wearer) - return - - if(!wearer.lastarea) - wearer.lastarea = get_area(wearer.loc) - if((istype(wearer.loc, /turf/space)) || (wearer.lastarea.has_gravity == 0)) if(!wearer.Process_Spacemove(0)) return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 04df18d1e8..82caf79deb 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -69,7 +69,7 @@ tacknife.loc = get_turf(src) if(M.put_in_active_hand(tacknife)) to_chat(M, "You slide \the [tacknife] out of [src].") - playsound(M, 'sound/weapons/flipblade.ogg', 40, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 40, 1) tacknife = null update_icon() return @@ -83,7 +83,7 @@ tacknife = I I.loc = src to_chat(M, "You slide the [I] into [src].") - playsound(M, 'sound/weapons/flipblade.ogg', 40, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 40, 1) update_icon() ..() diff --git a/code/modules/clothing/spacesuits/void/event.dm b/code/modules/clothing/spacesuits/void/event.dm new file mode 100644 index 0000000000..9fe7ae3ac0 --- /dev/null +++ b/code/modules/clothing/spacesuits/void/event.dm @@ -0,0 +1,159 @@ +//Refurbished Set +//Voidsuits from old Terran exploration vessels and naval ships. + +//Standard Crewsuit (GRAY) +//Nothing really special here. Some light resists for mostly-non-combat purposes. The rad protection ain't bad? +//The reduced slowdown is an added bonus - something to make it worth considering using if you do find it. +/obj/item/clothing/head/helmet/space/void/refurb + name = "vintage crewman's voidsuit helmet" + desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. The visor has a bad habit of fogging up and collecting condensation, but it beats sucking hard vacuum. This one is devoid of any identifying markings or rank indicators." + icon_state = "rig0-vintagecrew" + item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black") + armor = list(melee = 30, bullet = 15, laser = 15,energy = 5, bomb = 20, bio = 100, rad = 50) + light_overlay = "helmet_light" + +/obj/item/clothing/suit/space/void/refurb + name = "vintage crewman's voidsuit" + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer spacers swear by these old things, even if new powered hardsuits have more features and better armor. This one is devoid of any identifying markings or rank indicators." + icon_state = "rig-vintagecrew" + item_state_slots = list(slot_r_hand_str = "sec_voidsuitTG", slot_l_hand_str = "sec_voidsuitTG") + slowdown = 0.5 + armor = list(melee = 30, bullet = 15, laser = 15,energy = 5, bomb = 20, bio = 100, rad = 50) + allowed = list(/obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/storage/briefcase/inflatable, + /obj/item/device/gps, + /obj/item/device/radio/beacon, + /obj/item/weapon/pickaxe, + /obj/item/weapon/shovel + ) + +//Engineering Crewsuit (ORANGE, RING) +//This is probably the most appealing to get your hands on for basic protection and the specialist stuff +//Don't expect it to stand up to modern assault/laser rifles, but it'll make you a fair bit tougher against most low-end pistols and SMGs +/obj/item/clothing/head/helmet/space/void/refurb/engineering + name = "vintage engineering voidsuit helmet" + desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. This one in particular seems to be an ode to the Ship of Theseus, but the insulation and radiation proofing are top-notch, and it has several oily stains that seem to be impossible to scrub off." + icon_state = "rig0-vintageengi" + item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black") + armor = list(melee = 40, bullet = 20, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 100) + min_pressure_protection = 0 * ONE_ATMOSPHERE + max_pressure_protection = 15 * ONE_ATMOSPHERE + max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE + +/obj/item/clothing/suit/space/void/refurb/engineering + name = "vintage engineering voidsuit" + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. This one in particular seems to be an ode to the Ship of Theseus, but the insulation and radiation proofing are top-notch. The chestplate bears the logo of an old shipyard - though you don't recognize the name." + icon_state = "rig-vintageengi" + item_state_slots = list(slot_r_hand_str = "sec_voidsuitTG", slot_l_hand_str = "sec_voidsuitTG") + slowdown = 1 + armor = list(melee = 40, bullet = 20, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 100) + min_pressure_protection = 0 * ONE_ATMOSPHERE + max_pressure_protection = 15 * ONE_ATMOSPHERE + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE + allowed = list(/obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/device/t_scanner, + /obj/item/weapon/rcd, + /obj/item/weapon/rcd_ammo, + /obj/item/weapon/storage/toolbox, + /obj/item/weapon/storage/briefcase/inflatable, + /obj/item/device/gps, + /obj/item/device/radio/beacon, + /obj/item/weapon/tool, + /obj/item/weapon/weldingtool, + /obj/item/weapon/cell, + /obj/item/weapon/pickaxe, + /obj/item/weapon/shovel + ) + +//Medical Crewsuit (GREEN, CROSS) +//This thing is basically tissuepaper, but it has very solid rad protection for its age +//It also has the bonus of not slowing you down quite as much as other suits, same as the crew suit +/obj/item/clothing/head/helmet/space/void/refurb/medical + name = "vintage medical voidsuit helmet" + desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. The visor has a bad habit of fogging up and collecting condensation, but it beats sucking hard vacuum. The green and white markings indicate this as a medic's suit." + icon_state = "rig0-vintagemedic" + item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black") + armor = list(melee = 30, bullet = 15, laser = 15, energy = 5, bomb = 25, bio = 100, rad = 75) + +/obj/item/clothing/suit/space/void/refurb/medical + name = "vintage medical voidsuit" + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer spacers swear by these old things, even if new powered hardsuits have more features and better armor. The green and white markings indicate this as a medic's suit." + icon_state = "rig-vintagemedic" + item_state_slots = list(slot_r_hand_str = "sec_voidsuitTG", slot_l_hand_str = "sec_voidsuitTG") + slowdown = 0.5 + armor = list(melee = 30, bullet = 15, laser = 15, energy = 5, bomb = 25, bio = 100, rad = 75) + allowed = list(/obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/storage/firstaid, + /obj/item/device/healthanalyzer, + /obj/item/stack/medical, + /obj/item/device/gps, + /obj/item/device/radio/beacon, + /obj/item/weapon/cell + ) + +//Marine Crewsuit (BLUE, SHIELD) +//Really solid, balance between Sec and Sec EVA, but it has slightly worse shock protection +/obj/item/clothing/head/helmet/space/void/refurb/marine + name = "vintage marine's voidsuit helmet" + desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. The visor has a bad habit of fogging up and collecting condensation, but it beats sucking hard vacuum. The blue markings indicate this as the marine/guard variant, likely from a merchant ship." + icon_state = "rig0-vintagemarine" + item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black") + armor = list(melee = 40, bullet = 35, laser = 35, energy = 5, bomb = 40, bio = 100, rad = 50) + siemens_coefficient = 0.8 + +/obj/item/clothing/suit/space/void/refurb/marine + name = "vintage marine's voidsuit" + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer marines swear by these old things, even if new powered hardsuits have more features and better armor. The blue markings indicate this as the marine/guard variant, likely from a merchant ship." + icon_state = "rig-vintagemarine" + item_state_slots = list(slot_r_hand_str = "sec_voidsuitTG", slot_l_hand_str = "sec_voidsuitTG") + slowdown = 1 + armor = list(melee = 40, bullet = 35, laser = 35, energy = 5, bomb = 40, bio = 100, rad = 50) + siemens_coefficient = 0.8 + allowed = list(/obj/item/weapon/gun, + /obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/melee, + /obj/item/device/gps, + /obj/item/device/radio/beacon, + /obj/item/weapon/handcuffs, + /obj/item/ammo_magazine, + /obj/item/weapon/cell + ) + +//Officer Crewsuit (GOLD, X) +//The best of the bunch - at the time, this would have been almost cutting edge +//Now it's good, but it's badly outclassed by the hot shit that the TSCs and such can get +/obj/item/clothing/head/helmet/space/void/refurb/officer + name = "vintage officer's voidsuit helmet" + desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. The visor has a bad habit of fogging up and collecting condensation, but it beats sucking hard vacuum. This variant appears to be an officer's, and has the best protection of all the old models." + icon_state = "rig0-vintageofficer" + item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black") + armor = list(melee = 50, bullet = 45, laser = 45, energy = 10, bomb = 30, bio = 100, rad = 60) + siemens_coefficient = 0.7 + +/obj/item/clothing/suit/space/void/refurb/officer + name = "vintage officer's voidsuit" + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer spacers swear by these old things, even if new powered hardsuits have more features and better armor. This variant appears to be an officer's, and has the best protection of all the old models." + icon_state = "rig-vintageofficer" + item_state_slots = list(slot_r_hand_str = "sec_voidsuitTG", slot_l_hand_str = "sec_voidsuitTG") + slowdown = 1 + armor = list(melee = 50, bullet = 45, laser = 45, energy = 10, bomb = 30, bio = 100, rad = 60) + siemens_coefficient = 0.7 + allowed = list(/obj/item/weapon/gun, + /obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/melee, + /obj/item/device/gps, + /obj/item/device/radio/beacon, + /obj/item/weapon/handcuffs, + /obj/item/ammo_magazine, + /obj/item/weapon/cell + ) \ No newline at end of file diff --git a/code/modules/clothing/suits/aliens/seromi.dm b/code/modules/clothing/suits/aliens/seromi.dm index f27ec3e8a7..0bea907fbe 100644 --- a/code/modules/clothing/suits/aliens/seromi.dm +++ b/code/modules/clothing/suits/aliens/seromi.dm @@ -246,3 +246,22 @@ icon_override = 'icons/mob/species/seromi/suit.dmi' icon_state = "tesh_labcoat" species_restricted = list(SPECIES_TESHARI) + +/obj/item/clothing/suit/storage/toggle/tesharicoat + name = "small black coat" + desc = "A coat that seems too small to fit a human." + icon = 'icons/obj/clothing/species/seromi/suits.dmi' + icon_override = 'icons/mob/species/seromi/suit.dmi' + icon_state = "tesharicoat" + body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS + species_restricted = list(SPECIES_TESHARI) + + +/obj/item/clothing/suit/storage/toggle/tesharicoatwhite + name = "small coat" + desc = "A coat that seems too small to fit a human." + icon = 'icons/obj/clothing/species/seromi/suits.dmi' + icon_override = 'icons/mob/species/seromi/suit.dmi' + icon_state = "tesharicoatwhite" + body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS + species_restricted = list(SPECIES_TESHARI) \ No newline at end of file diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 691f53de5a..7fb4df785e 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -9,7 +9,7 @@ max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.6 -/obj/item/clothing/suit/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) +/obj/item/clothing/suit/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE) if(..()) //This will only run if no other problems occured when equiping. for(var/obj/item/clothing/I in list(H.gloves, H.shoes)) if(I && (src.body_parts_covered & ARMS && I.body_parts_covered & ARMS) ) @@ -189,7 +189,7 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, "sparks", 50, 1) + playsound(src, "sparks", 50, 1) user.loc = picked return PROJECTILE_FORCE_MISS @@ -520,7 +520,7 @@ |ACCESSORY_SLOT_ARMOR_M) blood_overlay_type = "armor" -/obj/item/clothing/suit/armor/pcarrier/mob_can_equip(var/mob/living/carbon/human/H, slot) +/obj/item/clothing/suit/armor/pcarrier/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE) if(..()) //This will only run if no other problems occured when equiping. if(H.gloves) if(H.gloves.body_parts_covered & ARMS) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 679fda6973..0273db3936 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -398,19 +398,59 @@ obj/item/clothing/suit/kamishimo flags_inv = HIDEHOLSTER /obj/item/clothing/suit/storage/miljacket/alt - name = "military jacket" - desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable." + name = "military jacket, alternate" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one has some extra badges on it." icon_state = "militaryjacket_badge" item_state_slots = list(slot_r_hand_str = "suit_olive", slot_l_hand_str = "suit_olive") flags_inv = HIDEHOLSTER /obj/item/clothing/suit/storage/miljacket/green - name = "military jacket" - desc = "A dark green canvas jacket. Feels sturdy, yet comfortable." + name = "green military jacket" + desc = "A dark but rather high-saturation green canvas jacket. Feels sturdy, yet comfortable." icon_state = "militaryjacket_green" item_state_slots = list(slot_r_hand_str = "suit_olive", slot_l_hand_str = "suit_olive") flags_inv = HIDEHOLSTER +/obj/item/clothing/suit/storage/miljacket/tan + name = "tan military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. Now in sandy tans for desert fans." + icon_state = "militaryjacket_tan" + item_state_slots = list(slot_r_hand_str = "suit_orange", slot_l_hand_str = "suit_orange") + flags_inv = HIDEHOLSTER + index = 1 + +/obj/item/clothing/suit/storage/miljacket/grey + name = "grey military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one's in urban grey." + icon_state = "militaryjacket_grey" + item_state_slots = list(slot_r_hand_str = "suit_grey", slot_l_hand_str = "suit_grey") + flags_inv = HIDEHOLSTER + index = 1 + +/obj/item/clothing/suit/storage/miljacket/navy + name = "navy military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. Dark navy, this one is." + icon_state = "militaryjacket_navy" + item_state_slots = list(slot_r_hand_str = "suit_navy", slot_l_hand_str = "suit_navy") + flags_inv = HIDEHOLSTER + index = 1 + +/obj/item/clothing/suit/storage/miljacket/black + name = "black military jacket" + desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. Now in tactical black." + icon_state = "militaryjacket_black" + item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") + flags_inv = HIDEHOLSTER + index = 1 + +/obj/item/clothing/suit/storage/miljacket/white + name = "white military jacket" + desc = "A white canvas jacket. Don't wear this for walks in the snow, it won't keep you warm - it'll just make it harder to find your frozen corpse." + icon_state = "militaryjacket_white" + item_state_slots = list(slot_r_hand_str = "med_dep_jacket", slot_l_hand_str = "med_dep_jacket") + flags_inv = HIDEHOLSTER + index = 1 + /obj/item/clothing/suit/storage/toggle/bomber name = "bomber jacket" desc = "A thick, well-worn WW2 leather bomber jacket." diff --git a/code/modules/clothing/suits/solgov.dm b/code/modules/clothing/suits/solgov.dm index 561d2f35dd..3fa969b369 100644 --- a/code/modules/clothing/suits/solgov.dm +++ b/code/modules/clothing/suits/solgov.dm @@ -1,128 +1,313 @@ //SolGov Uniform Suits +/obj/item/clothing/suit/storage/solgov + name = "master solgov jacket" + icon = 'icons/obj/clothing/suits_solgov.dmi' + icon_override = 'icons/mob/suit_solgov.dmi' //Service -/obj/item/clothing/suit/storage/service +/obj/item/clothing/suit/storage/solgov/service name = "service jacket" desc = "A uniform service jacket, plain and undecorated." icon_state = "blackservice" + item_state = "blackservice" item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") body_parts_covered = UPPER_TORSO|ARMS armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 allowed = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/flashlight,/obj/item/weapon/pen,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/taperoll) + valid_accessory_slots = (ACCESSORY_SLOT_ARMBAND|ACCESSORY_SLOT_MEDAL|ACCESSORY_SLOT_INSIGNIA|ACCESSORY_SLOT_RANK|ACCESSORY_SLOT_DEPT) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) -/obj/item/clothing/suit/storage/service/sifguard +/obj/item/clothing/suit/storage/solgov/service/sifguard name = "\improper SifGuard jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons." - icon_state = "blackservice_crew" + desc = "A uniform service jacket belonging to the Sif Defense Force." + icon_state = "ecservice_crew" -/obj/item/clothing/suit/storage/service/sifguard/medical - name = "\improper SifGuard medical jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and blue trim." - icon_state = "blackservice_med" +/obj/item/clothing/suit/storage/solgov/service/sifguard/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) -/obj/item/clothing/suit/storage/service/sifguard/medical/command - name = "\improper SifGuard medical command jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and blue trim." - icon_state = "blackservice_medcom" +/obj/item/clothing/suit/storage/solgov/service/sifguard/medical/command + icon_state = "ecservice_officer" -/obj/item/clothing/suit/storage/service/sifguard/engineering - name = "\improper SifGuard engineering jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and orange trim." - icon_state = "blackservice_eng" +/obj/item/clothing/suit/storage/solgov/service/sifguard/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) -/obj/item/clothing/suit/storage/service/sifguard/engineering/command - name = "\improper SifGuard engineering command jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and orange trim." - icon_state = "blackservice_engcom" +/obj/item/clothing/suit/storage/solgov/service/sifguard/engineering/command + icon_state = "ecservice_officer" -/obj/item/clothing/suit/storage/service/sifguard/supply - name = "\improper SifGuard supply jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and brown trim." - icon_state = "blackservice_sup" +/obj/item/clothing/suit/storage/solgov/service/sifguard/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) -/obj/item/clothing/suit/storage/service/sifguard/security - name = "\improper SifGuard security jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has silver buttons and red trim." - icon_state = "blackservice_sec" +/obj/item/clothing/suit/storage/solgov/service/sifguard/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) -/obj/item/clothing/suit/storage/service/sifguard/security/command - name = "\improper SifGuard security command jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and red trim." - icon_state = "blackservice_seccom" +/obj/item/clothing/suit/storage/solgov/service/sifguard/security/command + icon_state = "ecservice_officer" -/obj/item/clothing/suit/storage/service/sifguard/command - name = "\improper SifGuard command jacket" - desc = "A uniform service jacket belonging to the Sif Defense Force. It has gold buttons and gold trim." - icon_state = "blackservice_com" +/obj/item/clothing/suit/storage/solgov/service/sifguard/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) -/obj/item/clothing/suit/storage/service/marine +/obj/item/clothing/suit/storage/solgov/service/sifguard/service/command + icon_state = "ecservice_officer" + +/obj/item/clothing/suit/storage/solgov/service/sifguard/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) + +/obj/item/clothing/suit/storage/solgov/service/sifguard/exploration/command + icon_state = "ecservice_officer" + +/obj/item/clothing/suit/storage/solgov/service/sifguard/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) + +/obj/item/clothing/suit/storage/solgov/service/sifguard/research/command + icon_state = "ecservice_officer" + +/obj/item/clothing/suit/storage/solgov/service/sifguard/command + icon_state = "ecservice_officer" + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) + +/obj/item/clothing/suit/storage/solgov/service/fleet + name = "fleet service jacket" + desc = "A navy blue SCG Fleet service jacket." + icon_state = "blueservice" + item_state = "blueservice" + +/obj/item/clothing/suit/storage/solgov/service/fleet/snco + name = "fleet SNCO service jacket" + desc = "A navy blue SCG Fleet service jacket with silver cuffs." + icon_state = "blueservice_snco" + item_state = "blueservice_snco" + +/obj/item/clothing/suit/storage/solgov/service/fleet/officer + name = "fleet officer's service jacket" + desc = "A navy blue SCG Fleet dress jacket with silver accents." + icon_state = "blueservice_off" + item_state = "blueservice_off" + +/obj/item/clothing/suit/storage/solgov/service/fleet/command + name = "fleet senior officer's service jacket" + desc = "A navy blue SCG Fleet dress jacket with gold accents." + icon_state = "blueservice_comm" + item_state = "blueservice_comm" + +/obj/item/clothing/suit/storage/solgov/service/fleet/flag + name = "fleet flag officer's service jacket" + desc = "A navy blue SCG Fleet dress jacket with red accents." + icon_state = "blueservice_flag" + item_state = "blueservice_flag" + +/obj/item/clothing/suit/storage/solgov/service/army name = "marine coat" - desc = "An SCG Marine Corps service coat. Green and undecorated." + desc = "An SCG Marine service coat. Green and undecorated." icon_state = "greenservice" - item_state_slots = list(slot_r_hand_str = "suit_olive", slot_l_hand_str = "suit_olive") + item_state = "greenservice" -/obj/item/clothing/suit/storage/service/marine/medical +/obj/item/clothing/suit/storage/solgov/service/army/medical name = "marine medical jacket" - desc = "An SCG Marine Corps service coat. This one has blue markings." + desc = "An SCG Marine service coat. This one has blue markings." icon_state = "greenservice_med" + item_state = "greenservice_med" -/obj/item/clothing/suit/storage/service/marine/medical/command +/obj/item/clothing/suit/storage/solgov/service/army/medical/command name = "marine medical command jacket" - desc = "An SCG Marine Corps service coat. This one has blue and gold markings." + desc = "An SCG Marine service coat. This one has blue and gold markings." icon_state = "greenservice_medcom" + item_state = "greenservice_medcom" -/obj/item/clothing/suit/storage/service/marine/engineering +/obj/item/clothing/suit/storage/solgov/service/army/engineering name = "marine engineering jacket" - desc = "An SCG Marine Corps service coat. This one has orange markings." + desc = "An SCG Marine service coat. This one has orange markings." icon_state = "greenservice_eng" + item_state = "greenservice_eng" -/obj/item/clothing/suit/storage/service/marine/engineering/command +/obj/item/clothing/suit/storage/solgov/service/army/engineering/command name = "marine engineering command jacket" - desc = "An SCG Marine Corps service coat. This one has orange and gold markings." + desc = "An SCG Marine service coat. This one has orange and gold markings." icon_state = "greenservice_engcom" + item_state = "greenservice_engcom" -/obj/item/clothing/suit/storage/service/marine/supply +/obj/item/clothing/suit/storage/solgov/service/army/supply name = "marine supply jacket" - desc = "An SCG Marine Corps service coat. This one has brown markings." + desc = "An SCG Marine service coat. This one has brown markings." icon_state = "greenservice_sup" + item_state = "greenservice_sup" -/obj/item/clothing/suit/storage/service/marine/security +/obj/item/clothing/suit/storage/solgov/service/army/security name = "marine security jacket" - desc = "An SCG Marine Corps service coat. This one has red markings." + desc = "An SCG Marine service coat. This one has red markings." icon_state = "greenservice_sec" + item_state = "greenservice_sec" -/obj/item/clothing/suit/storage/service/marine/security/command +/obj/item/clothing/suit/storage/solgov/service/army/security/command name = "marine security command jacket" - desc = "An SCG Marine Corps service coat. This one has red and gold markings." + desc = "An SCG Marine service coat. This one has red and gold markings." icon_state = "greenservice_seccom" + item_state = "greenservice_seccom" -/obj/item/clothing/suit/storage/service/marine/command +/obj/item/clothing/suit/storage/solgov/service/army/service + name = "marine service jacket" + desc = "An SCG Marine service coat. This one has green markings." + icon_state = "greenservice_srv" + item_state = "greenservice_srv" + +/obj/item/clothing/suit/storage/solgov/service/army/service/command + name = "marine service command jacket" + desc = "An SCG Marine service coat. This one has green and gold markings." + icon_state = "greenservice_srvcom" + item_state = "greenservice_srvcom" + +/obj/item/clothing/suit/storage/solgov/service/army/exploration + name = "marine exploration jacket" + desc = "An SCG Marine service coat. This one has purple markings." + icon_state = "greenservice_exp" + item_state = "greenservice_exp" + +/obj/item/clothing/suit/storage/solgov/service/army/exploration/command + name = "marine exploration command jacket" + desc = "An SCG Marine service coat. This one has purple and gold markings." + icon_state = "greenservice_expcom" + item_state = "greenservice_expcom" + +/obj/item/clothing/suit/storage/solgov/service/army/command name = "marine command jacket" desc = "An SCG Marine Corps service coat. This one has gold markings." icon_state = "greenservice_com" + item_state = "greenservice_com" -//Dress +//Dress - murder me with a gun why are these 3 different types -/obj/item/clothing/suit/dress +/obj/item/clothing/suit/storage/solgov/dress name = "dress jacket" desc = "A uniform dress jacket, fancy." - icon_state = "greydress" + icon_state = "ecdress_xpl" + item_state = "ecdress_xpl" body_parts_covered = UPPER_TORSO|ARMS armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 allowed = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/flashlight,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/device/radio,/obj/item/weapon/pen) + valid_accessory_slots = (ACCESSORY_SLOT_MEDAL|ACCESSORY_SLOT_RANK) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) -/obj/item/clothing/suit/dress/expedition - name = "SifGuard dress jacket" +/obj/item/clothing/suit/storage/solgov/dress/sifguard + name = "\improper SifGuard dress jacket" desc = "A silver and grey dress jacket belonging to the Sif Defense Force. Fashionable, for the 25th century at least." - icon_state = "greydress" + icon_state = "ecdress_xpl" + item_state = "ecdress_xpl" -/obj/item/clothing/suit/dress/expedition/command - name = "SifGuard command dress jacket" - desc = "A gold and grey dress jacket belonging to the Sif Defense Force. The height of fashion." - icon_state = "greydress_com" +/obj/item/clothing/suit/storage/solgov/dress/sifguard/senior + name = "\improper SifGuard senior's dress coat" + icon_state = "ecdress_sxpl" + item_state = "ecdress_sxpl" + +/obj/item/clothing/suit/storage/solgov/dress/sifguard/chief + name = "\improper SifGuard chief's dress coat" + icon_state = "ecdress_cxpl" + item_state = "ecdress_cxpl" + +/obj/item/clothing/suit/storage/solgov/dress/sifguard/command + name = "\improper SifGuard officer's dress coat" + desc = "A gold and black dress peacoat belonging to the Sif Defense Force. The height of fashion." + icon_state = "ecdress_ofcr" + item_state = "ecdress_ofcr" + +/obj/item/clothing/suit/storage/solgov/dress/sifguard/command/cdr + name = "\improper SifGuard commander's dress coat" + icon_state = "ecdress_cdr" + item_state = "ecdress_cdr" + +/obj/item/clothing/suit/storage/solgov/dress/sifguard/command/capt + name = "\improper SifGuard captain's dress coat" + icon_state = "ecdress_capt" + item_state = "ecdress_capt" + +/obj/item/clothing/suit/storage/solgov/dress/sifguard/command/adm + name = "\improper SifGuard admiral's dress coat" + icon_state = "ecdress_adm" + item_state = "ecdress_adm" + +/obj/item/clothing/suit/storage/solgov/dress/fleet + name = "fleet dress jacket" + desc = "A navy blue SCG Fleet dress jacket. Don't get near pasta sauce or vox." + icon_state = "whitedress" + item_state = "whitedress" + +/obj/item/clothing/suit/storage/solgov/dress/fleet/snco + name = "fleet dress SNCO jacket" + desc = "A navy blue SCG Fleet dress jacket with silver cuffs. Don't get near pasta sauce or vox." + icon_state = "whitedress_snco" + item_state = "whitedress_snco" + +/obj/item/clothing/suit/storage/solgov/dress/fleet/officer + name = "fleet officer's dress jacket" + desc = "A navy blue SCG Fleet dress jacket with silver accents. Don't get near pasta sauce or vox." + icon_state = "whitedress_off" + item_state = "whitedress_off" + +/obj/item/clothing/suit/storage/solgov/dress/fleet/command + name = "fleet senior officer's dress jacket" + desc = "A navy blue SCG Fleet dress jacket with gold accents. Don't get near pasta sauce or vox." + icon_state = "whitedress_comm" + item_state = "whitedress_comm" + +/obj/item/clothing/suit/storage/solgov/dress/fleet/flag + name = "fleet flag officer's dress jacket" + desc = "A navy blue SCG Fleet dress jacket with red accents. Don't get near pasta sauce or vox." + icon_state = "whitedress_flag" + item_state = "whitedress_flag" + +/obj/item/clothing/suit/dress/solgov + name = "dress jacket" + desc = "A uniform dress jacket, fancy." + icon_state = "blackdress" + item_state = "blackdress" + icon = 'icons/obj/clothing/suits_solgov.dmi' + icon_override = 'icons/mob/suit_solgov.dmi' + body_parts_covered = UPPER_TORSO|ARMS + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + allowed = list(/obj/item/weapon/tank/emergency,/obj/item/device/flashlight,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/device/radio,/obj/item/weapon/pen) + valid_accessory_slots = (ACCESSORY_SLOT_MEDAL|ACCESSORY_SLOT_RANK) + +/obj/item/clothing/suit/dress/solgov/fleet/sailor + name = "fleet dress overwear" + desc = "A navy blue SCG Fleet dress suit. Almost looks like a school-girl outfit." + icon_state = "sailordress" + item_state = "whitedress" + +/obj/item/clothing/suit/dress/solgov/army + name = "marine dress jacket" + desc = "A tailored black SCG Marines dress jacket with red trim. So sexy it hurts." + icon_state = "blackdress" + item_state = "blackdress" + +/obj/item/clothing/suit/dress/solgov/army/command + name = "marine officer's dress jacket" + desc = "A tailored black SCG Marines dress jacket with gold trim. Smells like ceremony." + icon_state = "blackdress_com" + item_state = "blackdress_com" + +//Misc + +/obj/item/clothing/suit/storage/hooded/wintercoat/solgov + name = "\improper SifGuard winter coat" + icon_state = "coatec" + icon = 'icons/obj/clothing/suits_solgov.dmi' + icon_override = 'icons/mob/suit_solgov.dmi' + armor = list(melee = 25, bullet = 10, laser = 5, energy = 10, bomb = 20, bio = 0, rad = 10) + valid_accessory_slots = (ACCESSORY_SLOT_INSIGNIA|ACCESSORY_SLOT_RANK) + +/obj/item/clothing/suit/storage/hooded/wintercoat/solgov/army + name = "marine winter coat" + icon_state = "coatar" + armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0) + valid_accessory_slots = (ACCESSORY_SLOT_INSIGNIA|ACCESSORY_SLOT_RANK) + +/obj/item/clothing/suit/storage/hooded/wintercoat/solgov/fleet + name = "fleet winter coat" + icon_state = "coatfl" + armor = list(melee = 20, bullet = 10, laser = 10, energy = 20, bomb = 20, bio = 0, rad = 10) + valid_accessory_slots = (ACCESSORY_SLOT_INSIGNIA) /obj/item/clothing/suit/storage/toggle/dress name = "clasped dress jacket" @@ -142,21 +327,60 @@ item_state = "labcoat" blood_overlay_type = "coat" -/obj/item/clothing/suit/dress/marine - name = "marine dress jacket" - desc = "A tailored black SCG Marine Corps dress jacket with red trim. So sexy it hurts." - icon_state = "blackdress" - item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") - -/obj/item/clothing/suit/dress/marine/command - name = "marine command dress jacket" - desc = "A tailored black SCG Marine Corps dress jacket with gold trim. Smells like ceremony." - icon_state = "blackdress_com" -//Misc - -/obj/item/clothing/suit/storage/toggle/marshal_jacket +/obj/item/clothing/suit/storage/marshal_jacket name = "colonial marshal jacket" desc = "A black synthleather jacket. The word 'MARSHAL' is stenciled onto the back in gold lettering." icon_state = "marshal_jacket" item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") - body_parts_covered = UPPER_TORSO|ARMS \ No newline at end of file + body_parts_covered = UPPER_TORSO|ARMS + +//Terrans + +//Service + +/obj/item/clothing/suit/storage/terran/service/navy + name = "ICCGN coat" + desc = "A ICCG Navy service coat. Black and undecorated." + icon_state = "terranservice" + item_state = "terranservice" + icon = 'icons/obj/clothing/suits_solgov.dmi' + icon_override = 'icons/mob/suit_solgov.dmi' + +/obj/item/clothing/suit/storage/terran/service/navy/command + name = "indie command coat" + desc = "An ICCG Navy service command coat. White and undecorated." + icon_state = "terranservice_comm" + item_state = "terranservice_comm" + +//Dress + +/obj/item/clothing/suit/dress/terran + name = "dress jacket" + desc = "A uniform dress jacket, fancy." + icon_state = "terrandress" + item_state = "terrandress" + icon = 'icons/obj/clothing/suits_solgov.dmi' + icon_override = 'icons/mob/suit_solgov.dmi' + body_parts_covered = UPPER_TORSO|ARMS + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + allowed = list(/obj/item/weapon/tank/emergency,/obj/item/device/flashlight,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/device/radio,/obj/item/weapon/pen) + valid_accessory_slots = (ACCESSORY_SLOT_MEDAL|ACCESSORY_SLOT_RANK) + +/obj/item/clothing/suit/dress/terran/navy + name = "ICCGN dress cloak" + desc = "A black ICCG Navy dress cloak with red detailing. So sexy it hurts." + icon_state = "terrandress" + item_state = "terrandress" + +/obj/item/clothing/suit/dress/terran/navy/officer + name = "ICCGN officer's dress cloak" + desc = "A black ICCG Navy dress cloak with gold detailing. Smells like ceremony." + icon_state = "terrandress_off" + item_state = "terrandress_off" + +/obj/item/clothing/suit/dress/terran/navy/command + name = "ICCGN command dress cloak" + desc = "A black ICCG Navy dress cloak with royal detailing. Smells like ceremony." + icon_state = "terrandress_comm" + item_state = "terrandress_comm" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 1c4ab7e709..83e2fe2c69 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -18,7 +18,7 @@ return if(holster_in) - playsound(get_turf(src), holster_in, 50) + playsound(src, holster_in, 50) if(istype(user)) user.stop_aiming(no_message=1) @@ -55,7 +55,7 @@ ) if(holster_out) - playsound(get_turf(src), holster_out, sound_vol) + playsound(src, holster_out, sound_vol) user.put_in_hands(holstered) holstered.add_fingerprint(user) diff --git a/code/modules/clothing/under/accessories/torch.dm b/code/modules/clothing/under/accessories/torch.dm index 7cdec72747..6965056059 100644 --- a/code/modules/clothing/under/accessories/torch.dm +++ b/code/modules/clothing/under/accessories/torch.dm @@ -117,6 +117,7 @@ ribbons icon_state = "ribbon_marksman" on_rolled = list("down" = "none") slot = ACCESSORY_SLOT_MEDAL + w_class = ITEMSIZE_TINY /obj/item/clothing/accessory/ribbon/solgov/marksman name = "marksmanship ribbon" @@ -294,7 +295,7 @@ department tags desc = "Insignia denoting assignment to a department. These appear blank." icon_state = "dept_exped" on_rolled = list("down" = "none", "rolled" = "dept_exped_sleeves") - slot = ACCESSORY_SLOT_DECOR + slot = ACCESSORY_SLOT_DEPT //removable = FALSE /obj/item/clothing/accessory/solgov/department/command @@ -305,14 +306,18 @@ department tags /obj/item/clothing/accessory/solgov/department/command/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/command/jumper + icon_state = "dept_exped_jumper" + color = "#d6bb64" + /obj/item/clothing/accessory/solgov/department/command/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the command department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/command/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the command department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/command/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the command department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/engineering @@ -323,14 +328,17 @@ department tags /obj/item/clothing/accessory/solgov/department/engineering/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/engineering/jumper + icon_state = "dept_exped_jumper" + /obj/item/clothing/accessory/solgov/department/engineering/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the engineering department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/engineering/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the engineering department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/engineering/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the engineering department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/security @@ -341,14 +349,18 @@ department tags /obj/item/clothing/accessory/solgov/department/security/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/security/jumper + icon_state = "dept_exped_jumper" + color = "#721b1b" + /obj/item/clothing/accessory/solgov/department/security/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the security department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/security/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the security department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/security/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the security department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/medical @@ -358,15 +370,20 @@ department tags /obj/item/clothing/accessory/solgov/department/medical/service icon_state = "dept_exped_service" + color = "#7faad1" + +/obj/item/clothing/accessory/solgov/department/medical/jumper + icon_state = "dept_exped_jumper" + color = "#7faad1" /obj/item/clothing/accessory/solgov/department/medical/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the medical department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/medical/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the medical department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/medical/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the medical department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/supply @@ -377,14 +394,18 @@ department tags /obj/item/clothing/accessory/solgov/department/supply/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/supply/jumper + icon_state = "dept_exped_jumper" + color = "#7faad1" + /obj/item/clothing/accessory/solgov/department/supply/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the supply department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/supply/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the supply department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/supply/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the supply department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/service @@ -395,14 +416,18 @@ department tags /obj/item/clothing/accessory/solgov/department/service/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/service/jumper + icon_state = "dept_exped_jumper" + color = "#7b965d" + /obj/item/clothing/accessory/solgov/department/service/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the service department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/service/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the service department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/service/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the service department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/exploration @@ -413,14 +438,17 @@ department tags /obj/item/clothing/accessory/solgov/department/exploration/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/exploration/jumper + icon_state = "dept_exped_jumper" + /obj/item/clothing/accessory/solgov/department/exploration/fleet icon_state = "dept_fleet" desc = "Insignia denoting assignment to the exploration department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/exploration/marine - icon_state = "dept_marine" - desc = "Insignia denoting assignment to the exploration department. These fit marine uniforms." +/obj/item/clothing/accessory/solgov/department/exploration/army + icon_state = "dept_army" + desc = "Insignia denoting assignment to the exploration department. These fit Marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/research @@ -431,6 +459,10 @@ department tags /obj/item/clothing/accessory/solgov/department/research/service icon_state = "dept_exped_service" +/obj/item/clothing/accessory/solgov/department/research/jumper + icon_state = "dept_exped_jumper" + color = "#916f8d" + /********* ranks - ec *********/ @@ -440,7 +472,7 @@ ranks - ec desc = "Insignia denoting rank of some kind. These appear blank." icon_state = "fleetrank" on_rolled = list("down" = "none") - slot = ACCESSORY_SLOT_DECOR + slot = ACCESSORY_SLOT_RANK gender = PLURAL //high_visibility = 1 @@ -614,13 +646,13 @@ ranks - marines /obj/item/clothing/accessory/solgov/rank/marine name = "marine ranks" desc = "Insignia denoting marine rank of some kind. These appear blank." - icon_state = "marinerank_enlisted" + icon_state = "armyrank_enlisted" on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/rank/marine/enlisted name = "ranks (E-1 private)" desc = "Insignia denoting the rank of Private." - icon_state = "marinerank_enlisted" + icon_state = "armyrank_enlisted" /obj/item/clothing/accessory/solgov/rank/marine/enlisted/e2 name = "ranks (E-2 private second class)" @@ -669,7 +701,7 @@ ranks - marines /obj/item/clothing/accessory/solgov/rank/marine/officer name = "ranks (O-1 second lieutenant)" desc = "Insignia denoting the rank of Second Lieutenant." - icon_state = "marinerank_officer" + icon_state = "armyrank_officer" /obj/item/clothing/accessory/solgov/rank/marine/officer/o2 name = "ranks (O-2 first lieutenant)" @@ -694,7 +726,7 @@ ranks - marines /obj/item/clothing/accessory/solgov/rank/marine/flag name = "ranks (O-7 brigadier general)" desc = "Insignia denoting the rank of Brigadier General." - icon_state = "marinerank_command" + icon_state = "armyrank_command" /obj/item/clothing/accessory/solgov/rank/marine/flag/o8 name = "ranks (O-8 major general)" diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 0859cdf1e4..815798f90d 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -5,9 +5,9 @@ name = "master solgov uniform" desc = "You shouldn't be seeing this." icon = 'icons/obj/clothing/uniforms_solgov.dmi' + item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi') rolled_down = 0 rolled_sleeves = 0 - item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi') armor = list(melee = 5, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 5, rad = 5) siemens_coefficient = 0.8 @@ -33,11 +33,11 @@ icon_state = "fleetpt" worn_state = "fleetpt" -/obj/item/clothing/under/solgov/pt/marine +/obj/item/clothing/under/solgov/pt/army name = "marine pt uniform" desc = "Does NOT leave much to the imagination." - icon_state = "marinept" - worn_state = "marinept" + icon_state = "armypt" + worn_state = "armypt" //Utility @@ -71,6 +71,18 @@ worn_state = "blackutility_crew" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10) +/obj/item/clothing/under/solgov/utility/sifguard_skirt + name = "\improper SifGuard skirt" + desc = "A black turtleneck and skirt, the elusive ladies' uniform of the Sif Defense Force." + icon_state = "blackservicefem" + worn_state = "blackservicefem" + +/obj/item/clothing/under/solgov/utility/sifguard_skirt/officer + name = "\improper SifGuard officer skirt" + desc = "A black turtleneck and skirt, the elusive ladies' uniform of the Sif Defense Force. This one has gold trim." + icon_state = "blackservicefem_com" + worn_state = "blackservicefem_com" + /obj/item/clothing/under/solgov/utility/sifguard/command starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command) @@ -86,6 +98,9 @@ /obj/item/clothing/under/solgov/utility/sifguard/supply starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply) +/obj/item/clothing/under/solgov/utility/sifguard/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service) + /obj/item/clothing/under/solgov/utility/sifguard/exploration starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration) @@ -93,7 +108,7 @@ starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research) /obj/item/clothing/under/solgov/utility/sifguard/officer - name = "\improper Sifuard officer's uniform" + name = "\improper Sifguard officer's uniform" desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim." icon_state = "blackutility_com" worn_state = "blackutility_com" @@ -113,6 +128,9 @@ /obj/item/clothing/under/solgov/utility/sifguard/officer/supply starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply) +/obj/item/clothing/under/solgov/utility/sifguard/officer/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service) + /obj/item/clothing/under/solgov/utility/sifguard/officer/exploration starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration) @@ -145,44 +163,87 @@ /obj/item/clothing/under/solgov/utility/fleet/supply starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/fleet) +/obj/item/clothing/under/solgov/utility/fleet/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/fleet) + /obj/item/clothing/under/solgov/utility/fleet/exploration starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/fleet) +/obj/item/clothing/under/solgov/utility/fleet/combat + name = "fleet fatigues" + desc = "Alternative utility uniform of the SCG Fleet, for when coveralls are impractical." + icon_state = "navycombat" + worn_state = "navycombat" -/obj/item/clothing/under/solgov/utility/marine +/obj/item/clothing/under/solgov/utility/fleet/combat/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/combat/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/fleet, /obj/item/clothing/accessory/armband/medblue) + +/obj/item/clothing/under/solgov/utility/fleet/combat/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/combat/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/officer + name = "fleet officer's coveralls" + desc = "Alternative utility uniform of the SCG Fleet, for officers." + icon_state = "navyutilityoff" + worn_state = "navyutilityoff" + +/obj/item/clothing/under/solgov/utility/fleet/officer/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/officer/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/officer/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/officer/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/fleet) + +/obj/item/clothing/under/solgov/utility/army name = "marine fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material." - icon_state = "greyutility" - worn_state = "greyutility" - armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0) - -/obj/item/clothing/under/solgov/utility/marine/command - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/marine) - -/obj/item/clothing/under/solgov/utility/marine/engineering - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/marine) - -/obj/item/clothing/under/solgov/utility/marine/security - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/marine) - -/obj/item/clothing/under/solgov/utility/marine/medical - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/marine) - -/obj/item/clothing/under/solgov/utility/marine/supply - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/marine) - -/obj/item/clothing/under/solgov/utility/marine/exploration - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/marine) - -/obj/item/clothing/under/solgov/utility/marine/green - name = "green fatigues" - desc = "A green version of the SCG marine utility uniform, made from durable material." + desc = "The utility uniform of the SCG Marines, made from durable material." icon_state = "greenutility" worn_state = "greenutility" -/obj/item/clothing/under/solgov/utility/marine/tan +//obj/item/clothing/under/solgov/utility/army/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/army) + +/obj/item/clothing/under/solgov/utility/army/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/army) + +/obj/item/clothing/under/solgov/utility/army/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/army) + +/obj/item/clothing/under/solgov/utility/army/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/army) + +/obj/item/clothing/under/solgov/utility/army/medical/banded + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/army, /obj/item/clothing/accessory/armband/medblue) + +/obj/item/clothing/under/solgov/utility/army/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/army) + +/obj/item/clothing/under/solgov/utility/army/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/army) + +/obj/item/clothing/under/solgov/utility/army/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/army) + +/obj/item/clothing/under/solgov/utility/army/urban + name = "urban fatigues" + desc = "An urban version of the SCG Marines utility uniform, made from durable material." + icon_state = "greyutility" + worn_state = "greyutility" + +/obj/item/clothing/under/solgov/utility/army/tan name = "tan fatigues" - desc = "A tan version of the SCG marine utility uniform, made from durable material." + desc = "A tan version of the SCG Marines utility uniform, made from durable material." icon_state = "tanutility" worn_state = "tanutility" @@ -195,24 +256,166 @@ worn_state = "whiteservice" armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 5, rad = 0) siemens_coefficient = 0.9 + siemens_coefficient = 0.9 + +/obj/item/clothing/under/solgov/service/sifguard + name = "\improper SifGuard service uniform" + desc = "The service uniform of the Sif Defense Force in silver trim." + icon_state = "greydress" + worn_state = "greydress" + +/obj/item/clothing/under/solgov/service/sifguard/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt + name = "\improper SifGuard service skirt" + desc = "A feminine version of the Sif Defense Force service uniform in silver trim." + icon_state = "greydressfem" + worn_state = "greydressfem" + +/obj/item/clothing/under/solgov/service/sifguard/skirt/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/skirt/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command + name = "\improper SifGuard officer's service uniform" + desc = "The service uniform of the Sif Defense Force in gold trim." + icon_state = "greydress_com" + worn_state = "greydress_com" + +/obj/item/clothing/under/solgov/service/sifguard/command/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt + name = "\improper SifGuard officer's service skirt" + desc = "A feminine version of the Sif Defense Force service uniform in gold trim." + icon_state = "greydressfem_com" + worn_state = "greydressfem_com" + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/jumper) + +/obj/item/clothing/under/solgov/service/sifguard/command/skirt/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/jumper) /obj/item/clothing/under/solgov/service/fleet name = "fleet service uniform" desc = "The service uniform of the SCG Fleet, made from immaculate white fabric." icon_state = "whiteservice" worn_state = "whiteservice" + starting_accessories = list(/obj/item/clothing/accessory/tie/navy) -/obj/item/clothing/under/solgov/service/marine +/obj/item/clothing/under/solgov/service/fleet/skirt + name = "fleet service skirt" + desc = "The service uniform skirt of the SCG Fleet, made from immaculate white fabric." + icon_state = "whiteservicefem" + worn_state = "whiteservicefem" + +/obj/item/clothing/under/solgov/service/army name = "marine service uniform" - desc = "The service uniform of the SCG Marine Corps. Slimming." + desc = "The service uniform of the SCG Marines. Slimming." icon_state = "greenservice" worn_state = "greenservice" + starting_accessories = list(/obj/item/clothing/accessory/tie/darkgreen) -/obj/item/clothing/under/solgov/service/marine/command - name = "marine command service uniform" - desc = "The service uniform of the SCG Marine Corps. Slimming and stylish." +/obj/item/clothing/under/solgov/service/army/skirt + name = "marine service skirt" + desc = "The service uniform skirt of the SCG Marines. Slimming." + icon_state = "greenservicefem" + worn_state = "greenservicefem" + +/obj/item/clothing/under/solgov/service/army/command + name = "marine officer's service uniform" + desc = "The service uniform of the SCG Marines. Slimming and stylish." icon_state = "greenservice_com" worn_state = "greenservice_com" + starting_accessories = list(/obj/item/clothing/accessory/tie/darkgreen) + +/obj/item/clothing/under/solgov/service/army/command/skirt + name = "marine officer's service skirt" + desc = "The service uniform skirt of the SCG Marines. Slimming and stylish." + icon_state = "greenservicefem_com" + worn_state = "greenservicefem_com" //Dress @@ -221,79 +424,31 @@ desc = "A dress uniform of some kind." icon_state = "greydress" worn_state = "greydress" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - siemens_coefficient = 0.9 -/obj/item/clothing/under/solgov/mildress/sifguard - name = "\improper SifGuard dress uniform" - desc = "The dress uniform of the Sif Defense Force in silver trim." - -/obj/item/clothing/under/solgov/mildress/sifguard/command - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/engineering - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/security - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/medical - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/supply - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/service - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/exploration - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/research - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer - name = "\improper SifGuard command dress uniform" - desc = "The dress uniform of the Sif Defense Force in gold trim." - icon_state = "greydress_com" - worn_state = "greydress_com" - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/command - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/engineering - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/security - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/medical - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/supply - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/service - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/exploration - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) - -/obj/item/clothing/under/solgov/mildress/sifguard/officer/research - starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) - -/obj/item/clothing/under/solgov/mildress/marine +/obj/item/clothing/under/solgov/mildress/army name = "marine dress uniform" - desc = "The dress uniform of the SCG Marine Corps, class given form." + desc = "The dress uniform of the SCG Marines, class given form." icon_state = "blackdress" worn_state = "blackdress" -/obj/item/clothing/under/solgov/mildress/marine/command - name = "marine command dress uniform" - desc = "The dress uniform of the SCG Marine Corps, even classier in gold." - icon_state = "blackdress_com" +/obj/item/clothing/under/solgov/mildress/army/skirt + name = "marine dress skirt" + desc = "A feminine version of the SCG Marines dress uniform, class given form." + icon_state = "blackdressfem" + worn_state = "blackdressfem" + +/obj/item/clothing/under/solgov/mildress/army/command + name = "marine officer's dress uniform" + desc = "The dress uniform of the SCG Marines, even classier in gold." + icon_state = "blackdress" worn_state = "blackdress_com" +/obj/item/clothing/under/solgov/mildress/army/command/skirt + name = "marine officer's dress skirt" + desc = "A feminine version of the SCG Marines dress uniform, even classier in gold." + icon_state = "blackdressfem" + worn_state = "blackdressfem_com" + //Misc @@ -313,3 +468,33 @@ worn_state = "sterile" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 30, rad = 0) + +//Terrans + +/obj/item/clothing/under/terran + name = "master ICCGN uniform" + desc = "You shouldn't be seeing this." + icon = 'icons/obj/clothing/uniforms_solgov.dmi' + item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi') + armor = list(melee = 5, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 5, rad = 5) + siemens_coefficient = 0.8 + +/obj/item/clothing/under/terran/navy/utility + name = "ICCGN utility uniform" + desc = "A comfortable black utility jumpsuit. Worn by the ICCG Navy." + icon_state = "terranutility" + worn_state = "terranutility" + +/obj/item/clothing/under/terran/navy/service + name = "ICCGN service uniform" + desc = "The service uniform of the ICCG Navy, for low-ranking crew." + icon_state = "terranservice" + worn_state = "terranservice" + armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 5, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/terran/navy/service/command + name = "ICCGN command service uniform" + desc = "The service uniform of the ICCG Navy, for high-ranking crew." + icon_state = "terranservice_comm" + worn_state = "terranservice_comm" \ No newline at end of file diff --git a/code/modules/clothing/under/xenos/seromi.dm b/code/modules/clothing/under/xenos/seromi.dm index 8925fccba2..0e43030ade 100644 --- a/code/modules/clothing/under/xenos/seromi.dm +++ b/code/modules/clothing/under/xenos/seromi.dm @@ -33,6 +33,18 @@ name = "small rainbow smock" icon_state = "seromi_rainbow" +/obj/item/clothing/under/seromi/smock/dress + name = "small command dress" + icon_state = "seromi_dress_cap" + +/obj/item/clothing/under/seromi/smock/uniform + name = "small command uniform" + icon_state = "seromi_captain" + +/obj/item/clothing/under/seromi/smock/formal + name = "small formal uniform" + icon_state = "seromi_captain_formal" + /obj/item/clothing/under/seromi/undercoat name = "Undercoat" desc = "A Teshari traditional garb, with a modern twist! Made of micro and nanofibres to make it light and billowy, perfect for going fast and stylishly!" diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 2b0fae4923..616a0b2a3b 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -58,9 +58,9 @@ log transactions for(var/obj/item/weapon/spacecash/S in src) S.loc = src.loc if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + playsound(src, 'sound/items/polaroid1.ogg', 50, 1) else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(src, 'sound/items/polaroid2.ogg', 50, 1) break /obj/machinery/atm/emag_act(var/remaining_charges, var/mob/user) @@ -103,9 +103,9 @@ log transactions //consume the money authenticated_account.money += I:worth if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + playsound(src, 'sound/items/polaroid1.ogg', 50, 1) else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(src, 'sound/items/polaroid2.ogg', 50, 1) //create a transaction log entry var/datum/transaction/T = new() @@ -383,9 +383,9 @@ log transactions R.stamps += "
This paper has been stamped by the Automatic Teller Machine." if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + playsound(src, 'sound/items/polaroid1.ogg', 50, 1) else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(src, 'sound/items/polaroid2.ogg', 50, 1) if ("print_transaction") if(authenticated_account) var/obj/item/weapon/paper/R = new(src.loc) @@ -425,9 +425,9 @@ log transactions R.stamps += "
This paper has been stamped by the Automatic Teller Machine." if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) + playsound(src, 'sound/items/polaroid1.ogg', 50, 1) else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(src, 'sound/items/polaroid2.ogg', 50, 1) if("insert_card") if(!held_card) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 79c294c5ac..458fe9fb56 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -22,7 +22,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT var/last_world_time = 0 /datum/event_container/process() - if(!round_start_time) + if(!GLOB.round_start_time) return //don't do events if the round hasn't even started yet if(!next_event_time) diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index c6ac3e3c41..f59b9b24a5 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -65,7 +65,7 @@ message = pick("Luxury watches for Blowout sale prices!",\ "Watches, Jewelry & Accessories, Bags & Wallets !",\ "Deposit 100$ and get 300$ totally free!",\ - " 100K NT.|WOWGOLD õnly $89 ",\ + " 100K NT.|WOWGOLD �nly $89 ",\ "We have been filed with a complaint from one of your customers in respect of their business relations with you.",\ "We kindly ask you to open the COMPLAINT REPORT (attached) to reply on this complaint..") if(4) @@ -111,7 +111,7 @@ //P.tnote += "← From [sender] (Unknown / spam?):
[message]
" if (!P.message_silent) - playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(P, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(3, P.loc)) if(!P.message_silent) O.show_message(text("[bicon(P)] *[P.ttone]*")) //Search for holder of the PDA. diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index 1dd137ff32..657946d019 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -48,7 +48,7 @@ ..() /obj/item/weapon/reagent_containers/food/condiment/feed_sound(var/mob/user) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) + playsound(src, 'sound/items/drink.ogg', rand(10, 50), 1) /obj/item/weapon/reagent_containers/food/condiment/self_feed_message(var/mob/user) to_chat(user, "You swallow some of contents of \the [src].") diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index 546c47a7e2..816c910339 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -25,7 +25,7 @@ open(user) /obj/item/weapon/reagent_containers/food/drinks/proc/open(mob/user) - playsound(loc,"canopen", rand(10,50), 1) + playsound(src,"canopen", rand(10,50), 1) to_chat(user, "You open [src] with an audible pop!") flags |= OPENCONTAINER @@ -69,7 +69,7 @@ to_chat(user, "You swallow a gulp from \the [src].") /obj/item/weapon/reagent_containers/food/drinks/feed_sound(var/mob/user) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) + playsound(src, 'sound/items/drink.ogg', rand(10, 50), 1) /obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) . = ..() diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index 731efb1ff7..ebd1233fe8 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -187,7 +187,7 @@ var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") /obj/item/weapon/broken_bottle/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/bladeslice.ogg', 50, 1, -1) return ..() /obj/item/weapon/reagent_containers/food/drinks/bottle/gin diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 1731710492..57d6801ffc 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -120,7 +120,7 @@ return if(reagents) //Handle ingestion of the reagent. - playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1) + playsound(M,'sound/items/eatfood.ogg', rand(10,50), 1) if(reagents.total_volume) if(reagents.total_volume > bitesize) reagents.trans_to_mob(M, bitesize, CHEM_INGEST) diff --git a/code/modules/food/kitchen/cooking_machines/_cooker.dm b/code/modules/food/kitchen/cooking_machines/_cooker.dm index 70d7a9ad9c..f0716e015f 100644 --- a/code/modules/food/kitchen/cooking_machines/_cooker.dm +++ b/code/modules/food/kitchen/cooking_machines/_cooker.dm @@ -166,7 +166,7 @@ qdel(cooking_obj) src.visible_message("\The [src] pings!") if(cooked_sound) - playsound(get_turf(src), cooked_sound, 50, 1) + playsound(src, cooked_sound, 50, 1) if(!can_burn_food) icon_state = off_icon diff --git a/code/modules/food/kitchen/gibber.dm b/code/modules/food/kitchen/gibber.dm index ab70028bd6..1fca845091 100644 --- a/code/modules/food/kitchen/gibber.dm +++ b/code/modules/food/kitchen/gibber.dm @@ -227,7 +227,7 @@ occupant.gib() occupant = null - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) operating = 0 for (var/obj/thing in contents) // There's a chance that the gibber will fail to destroy some evidence. diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index a8da49a436..e8a9e0586a 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -353,7 +353,7 @@ src.updateUsrDialog() /obj/machinery/microwave/proc/muck_start() - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound + playsound(src, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound src.icon_state = "mwbloody1" // Make it look dirty!! /obj/machinery/microwave/proc/muck_finish() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index d4eb606aa2..3be22f940a 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -230,7 +230,7 @@ cards -= P cards = newcards user.visible_message("\The [user] shuffles [src].") - playsound(user, 'sound/items/cardshuffle.ogg', 50, 1) + playsound(src, 'sound/items/cardshuffle.ogg', 50, 1) cooldown = world.time else return diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm index cae71540cb..7c49f7ec43 100644 --- a/code/modules/games/tarot.dm +++ b/code/modules/games/tarot.dm @@ -36,7 +36,7 @@ newcards += P cards -= P cards = newcards - playsound(user, 'sound/items/cardshuffle.ogg', 50, 1) + playsound(src, 'sound/items/cardshuffle.ogg', 50, 1) user.visible_message("\The [user] shuffles [src].") cooldown = world.time else diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 2d02146315..1cd3ddf51d 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -155,7 +155,7 @@ SSnanoui.update_uis(src) /obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) last_to_emag = user //emag again to change the owner if (!emagged) emagged = 1 diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index b3783460ad..e5b7b1c3d7 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -137,7 +137,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u user.do_attack_animation(src) var/damage = rand(0, 9) if(!damage) - playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1) target.visible_message("[user] has attempted to punch [target]!") return TRUE var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting)) @@ -147,7 +147,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u if(HULK in user.mutations) damage += 5 - playsound(target.loc, "punch", 25, 1, -1) + playsound(target, "punch", 25, 1, -1) target.visible_message("[user] has punched [target]!") @@ -204,7 +204,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u update_nearby_icons() step(src, get_dir(user, src)) else - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) ..() return @@ -222,7 +222,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card)) var/aforce = I.force - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("[src] was hit by [I].") if(I.damtype == BRUTE || I.damtype == BURN) take_damage(aforce) @@ -289,7 +289,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) return TRUE return FALSE @@ -299,13 +299,13 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u force = 30 item_state = "[icon_state]_blade" w_class = ITEMSIZE_LARGE - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + playsound(src, 'sound/weapons/saberon.ogg', 50, 1) to_chat(user, "[src] is now active.") else force = 3 item_state = "[icon_state]" w_class = ITEMSIZE_SMALL - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) to_chat(user, "[src] can now be concealed.") update_icon() diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 253ca6f928..cf90921475 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -43,7 +43,7 @@ return else if(I.is_wrench()) anchored = !anchored - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) user.visible_message("[user] [anchored ? "wrenches" : "unwrenches"] \the [src].", "You [anchored ? "wrench" : "unwrench"] \the [src].") return else if(istype(I, /obj/item/bee_smoker)) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 0cb0dbb0d3..9e84c741cb 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -163,7 +163,7 @@ M.stop_pulling() to_chat(M, "You slipped on the [name]!") - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) M.Stun(8) M.Weaken(5) seed.thrown_at(src,M) @@ -199,7 +199,7 @@ else if(seed.chems) if(W.sharp && W.edge && !isnull(seed.chems["woodpulp"])) user.show_message("You make planks out of \the [src]!", 1) - playsound(loc, 'sound/effects/woodcutting.ogg', 50, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 50, 1) var/flesh_colour = seed.get_trait(TRAIT_FLESH_COLOUR) if(!flesh_colour) flesh_colour = seed.get_trait(TRAIT_PRODUCT_COLOUR) for(var/i=0,i<2,i++) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 053ce5a59c..b8ea1fa748 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -502,7 +502,7 @@ to_chat(user, "There are no seeds in \the [O.name].") return else if(O.is_wrench()) - playsound(loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") else if(O.is_screwdriver()) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index e3ac11ed76..2f93bb108b 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -72,8 +72,9 @@ var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant /obj/effect/plant/Destroy() - if(plant_controller) - plant_controller.remove_plant(src) + if(seed.get_trait(TRAIT_SPREAD)==2) + unsense_proximity(callback = .HasProximity, center = get_turf(src)) + plant_controller.remove_plant(src) for(var/obj/effect/plant/neighbor in range(1,src)) plant_controller.add_plant(neighbor) return ..() @@ -106,6 +107,7 @@ name = seed.display_name max_health = round(seed.get_trait(TRAIT_ENDURANCE)/2) if(seed.get_trait(TRAIT_SPREAD)==2) + sense_proximity(callback = .HasProximity) // Grabby max_growth = VINE_GROWTH_STAGES growth_threshold = max_health/VINE_GROWTH_STAGES icon = 'icons/obj/hydroponics_vines.dmi' diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 8c694c8b00..58f4b4da08 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -1,4 +1,4 @@ -/obj/effect/plant/HasProximity(var/atom/movable/AM) +/obj/effect/plant/HasProximity(turf/T, atom/movable/AM, old_loc) if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2) return @@ -13,6 +13,14 @@ spawn(1) entangle(M) +/obj/effect/plant/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(seed.get_trait(TRAIT_SPREAD)==2) + if(isturf(old_loc)) + unsense_proximity(callback = .HasProximity, center = old_loc) + if(isturf(loc)) + sense_proximity(callback = .HasProximity) + /obj/effect/plant/attack_hand(var/mob/user) manual_unbuckle(user) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 4c7a659e4a..236fbb1a0d 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -558,7 +558,7 @@ pestlevel -= spray.pest_kill_str weedlevel -= spray.weed_kill_str to_chat(user, "You spray [src] with [O].") - playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) + playsound(src, 'sound/effects/spray3.ogg', 50, 1, -6) qdel(O) check_health() @@ -568,7 +568,7 @@ if(locate(/obj/machinery/atmospherics/portables_connector/) in loc) return ..() - playsound(loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 6218783b6e..aea7ffc4ea 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -248,12 +248,12 @@ return FALSE if(add_circuit(I, user)) to_chat(user, "You slide \the [I] inside \the [src].") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) interact(user) return TRUE else if(I.is_crowbar()) - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) opened = !opened to_chat(user, "You [opened ? "opened" : "closed"] \the [src].") update_icon() @@ -284,7 +284,7 @@ user.drop_item(cell) cell.forceMove(src) battery = cell - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You slot \the [cell] inside \the [src]'s power supplier.") interact(user) return TRUE @@ -349,14 +349,6 @@ return TRUE return FALSE -/obj/item/device/electronic_assembly/on_loc_moved(oldloc) - for(var/obj/O in contents) - O.on_loc_moved(oldloc) - -/obj/item/device/electronic_assembly/Moved(var/oldloc) - for(var/obj/O in contents) - O.on_loc_moved(oldloc) - /obj/item/device/electronic_assembly/proc/on_anchored() for(var/obj/item/integrated_circuit/IC in contents) IC.on_anchored() diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm index d00057e411..23e84da6d6 100644 --- a/code/modules/integrated_electronics/core/assemblies/clothing.dm +++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm @@ -67,18 +67,6 @@ else ..() -/obj/item/clothing/Moved(oldloc) - if(IC) - IC.on_loc_moved(oldloc) - else - ..() - -/obj/item/clothing/on_loc_moved(oldloc) - if(IC) - IC.on_loc_moved(oldloc) - else - ..() - // Does most of the repeatative setup. /obj/item/clothing/proc/setup_integrated_circuit(new_type) // Set up the internal circuit holder. diff --git a/code/modules/integrated_electronics/core/assemblies/device.dm b/code/modules/integrated_electronics/core/assemblies/device.dm index de92fe6638..3170393fc3 100644 --- a/code/modules/integrated_electronics/core/assemblies/device.dm +++ b/code/modules/integrated_electronics/core/assemblies/device.dm @@ -20,7 +20,7 @@ ..() /obj/item/device/assembly/electronic_assembly/proc/toggle_open(mob/user) - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) opened = !opened EA.opened = opened to_chat(user, "You [opened ? "opened" : "closed"] \the [src].") diff --git a/code/modules/integrated_electronics/core/assemblies/generic.dm b/code/modules/integrated_electronics/core/assemblies/generic.dm index 2508f9919d..49a933fe1b 100644 --- a/code/modules/integrated_electronics/core/assemblies/generic.dm +++ b/code/modules/integrated_electronics/core/assemblies/generic.dm @@ -211,7 +211,7 @@ if(!istype(T, /turf/simulated/floor)) to_chat(user, "You cannot place \the [src] on this spot!") return - playsound(src.loc, 'sound/machines/click.ogg', 75, 1) + playsound(src, 'sound/machines/click.ogg', 75, 1) user.visible_message("\The [user] attaches \the [src] to the wall.", "You attach \the [src] to the wall.", "You hear clicking.") diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index f26bc693bc..631365c5e9 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -160,7 +160,7 @@ var/area/A = get_area(src) if(A) if(A.powered(EQUIP) && assembly.give_power(power_amount)) - A.use_power(power_amount, EQUIP) + A.use_power_oneoff(power_amount, EQUIP) // give_power() handles CELLRATE on its own. // Interacts with the powernet. diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 7bb9b332d1..d64f9a8645 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -39,7 +39,7 @@ size += gun.w_class gun.forceMove(src) to_chat(user, "You slide \the [gun] into the firing mechanism.") - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) else ..() @@ -48,7 +48,7 @@ installed_gun.forceMove(get_turf(src)) to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.") size = initial(size) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) installed_gun = null else to_chat(user, "There's no weapon to remove from the mechanism.") diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 17c492dc04..42a0d344c9 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -197,7 +197,7 @@ if(!selected_sound) return vol = between(0, vol, 100) - playsound(get_turf(src), selected_sound, vol, freq, -1) + playsound(src, selected_sound, vol, freq, -1) /obj/item/integrated_circuit/output/sound/beeper name = "beeper circuit" @@ -413,8 +413,13 @@ // var/datum/beam/holo_beam = null // A visual effect, to make it easy to know where a hologram is coming from. // It is commented out due to picking up the assembly killing the beam. +/obj/item/integrated_circuit/output/holographic_projector/Initialize() + . = ..() + GLOB.moved_event.register(src, src, .proc/on_moved) + /obj/item/integrated_circuit/output/holographic_projector/Destroy() destroy_hologram() + GLOB.moved_event.unregister(src, src, .proc/on_moved) return ..() /obj/item/integrated_circuit/output/holographic_projector/do_work() @@ -505,7 +510,7 @@ if(hologram) update_hologram() -/obj/item/integrated_circuit/output/holographic_projector/on_loc_moved(atom/oldloc) +/obj/item/integrated_circuit/output/holographic_projector/proc/on_moved() if(hologram) update_hologram_position() diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index ca834b3a09..f0e92e9e7a 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -37,7 +37,7 @@ ..() /obj/item/integrated_circuit/reagent/smoke/do_work() - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3) var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new() smoke_system.set_up(reagents, 10, 0, get_turf(src)) spawn(0) diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index df8e686b1f..9633ef7881 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -86,10 +86,10 @@ power_draw_per_use = 4 /obj/item/integrated_circuit/time/clock/do_work() - set_pin_data(IC_OUTPUT, 1, time2text(station_time_in_ticks, "hh:mm:ss") ) - set_pin_data(IC_OUTPUT, 2, text2num(time2text(station_time_in_ticks, "hh") ) ) - set_pin_data(IC_OUTPUT, 3, text2num(time2text(station_time_in_ticks, "mm") ) ) - set_pin_data(IC_OUTPUT, 4, text2num(time2text(station_time_in_ticks, "ss") ) ) + set_pin_data(IC_OUTPUT, 1, time2text(station_time_in_ds, "hh:mm:ss") ) + set_pin_data(IC_OUTPUT, 2, text2num(time2text(station_time_in_ds, "hh") ) ) + set_pin_data(IC_OUTPUT, 3, text2num(time2text(station_time_in_ds, "mm") ) ) + set_pin_data(IC_OUTPUT, 4, text2num(time2text(station_time_in_ds, "ss") ) ) push_data() activate_pin(2) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 1eb05b7949..9273ece79e 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -39,11 +39,11 @@ else name = ("bookcase ([newname])") else if(O.is_wrench()) - playsound(loc, O.usesound, 100, 1) + playsound(src, O.usesound, 100, 1) to_chat(user, (anchored ? "You unfasten \the [src] from the floor." : "You secure \the [src] to the floor.")) anchored = !anchored else if(O.is_screwdriver()) - playsound(loc, O.usesound, 75, 1) + playsound(src, O.usesound, 75, 1) to_chat(user, "You begin dismantling \the [src].") if(do_after(user,25 * O.toolspeed)) to_chat(user, "You dismantle \the [src].") @@ -195,9 +195,9 @@ Book Cart End if(src.dat) user << browse("Penned by [author].
" + "[dat]", "window=book") user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.") - playsound(loc, 'sound/bureaucracy/bookopen.ogg', 50, 1) + playsound(src, 'sound/bureaucracy/bookopen.ogg', 50, 1) onclose(user, "book") - playsound(loc, 'sound/bureaucracy/bookclose.ogg', 50, 1) + playsound(src, 'sound/bureaucracy/bookclose.ogg', 50, 1) else to_chat(user, "This book is completely blank!") @@ -280,7 +280,7 @@ Book Cart End to_chat(user, "You begin to carve out [title].") if(do_after(user, 30)) to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") - playsound(loc, 'sound/bureaucracy/papercrumple.ogg', 50, 1) + playsound(src, 'sound/bureaucracy/papercrumple.ogg', 50, 1) new /obj/item/weapon/shreddedp(get_turf(src)) carved = 1 return @@ -353,11 +353,11 @@ Book Cart End if(href_list["next_page"]) if(page != pages.len) page++ - playsound(src.loc, "pageturn", 50, 1) + playsound(src, "pageturn", 50, 1) if(href_list["prev_page"]) if(page > 1) page-- - playsound(src.loc, "pageturn", 50, 1) + playsound(src, "pageturn", 50, 1) src.attack_self(usr) updateUsrDialog() else diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 8700a65c6e..39894b1394 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -65,20 +65,19 @@ T.reconsider_lights() return ..() -/atom/movable/Move() - var/turf/old_loc = loc +/atom/movable/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(loc != old_loc) - for(var/datum/light_source/L in light_sources) - L.source_atom.update_light() + for(var/datum/light_source/L in light_sources) + L.source_atom.update_light() - var/turf/new_loc = loc - if(istype(old_loc) && opacity) - old_loc.reconsider_lights() + var/turf/new_turf = loc + var/turf/old_turf = old_loc + if(istype(old_turf) && opacity) + old_turf.reconsider_lights() - if(istype(new_loc) && opacity) - new_loc.reconsider_lights() + if(istype(new_turf) && opacity) + new_turf.reconsider_lights() /atom/proc/set_opacity(new_opacity) if(new_opacity == opacity) diff --git a/code/modules/looking_glass/lg_console.dm b/code/modules/looking_glass/lg_console.dm index f4a5a97b6b..17a4523e9d 100644 --- a/code/modules/looking_glass/lg_console.dm +++ b/code/modules/looking_glass/lg_console.dm @@ -110,7 +110,7 @@ /obj/machinery/computer/looking_glass/emag_act(var/remaining_charges, var/mob/user as mob) if (!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "You unlock several programs that were hidden somewhere in memory.") log_game("[key_name(usr)] emagged the [name]") diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 01cfd9bc62..029191ff6e 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -362,7 +362,7 @@ user.setClickCooldown(time) if(do_after(user, time, src) && use(1)) to_chat(user, "You cut up a log into planks.") - playsound(get_turf(src), 'sound/effects/woodcutting.ogg', 50, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 50, 1) var/obj/item/stack/material/wood/existing_wood = null for(var/obj/item/stack/material/wood/M in user.loc) if(M.material.name == src.material.name) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 6f8fc7a8f9..11917f4c40 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -164,7 +164,7 @@ to_chat(user, "You leave the crate alone.") else if(check_input(input)) to_chat(user, "The crate unlocks!") - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) + playsound(src, 'sound/machines/lockreset.ogg', 50, 1) set_locked(0) else visible_message("A red light on \the [src]'s control panel flashes briefly.") diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 1bd784bdb9..31da4a9753 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -10,7 +10,7 @@ /obj/item/weapon/mining_scanner/attack_self(mob/user as mob) to_chat(user, "You begin sweeping \the [src] about, scanning for metal deposits.") - playsound(loc, 'sound/items/goggles_charge.ogg', 50, 1, -6) + playsound(src, 'sound/items/goggles_charge.ogg', 50, 1, -6) if(!do_after(user, scan_time)) return diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index c6f7cc4a9f..d2bb572512 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -93,7 +93,7 @@ var/global/list/total_extraction_beacons = list() balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon2) holder_obj.add_overlay(balloon) - playsound(holder_obj.loc, 'sound/items/fulext_deploy.wav', 50, 1, -3) + playsound(holder_obj, 'sound/items/fulext_deploy.wav', 50, 1, -3) animate(holder_obj, pixel_z = 10, time = 20) sleep(20) animate(holder_obj, pixel_z = 15, time = 10) @@ -104,7 +104,7 @@ var/global/list/total_extraction_beacons = list() sleep(10) animate(holder_obj, pixel_z = 10, time = 10) sleep(10) - playsound(holder_obj.loc, 'sound/items/fultext_launch.wav', 50, 1, -3) + playsound(holder_obj, 'sound/items/fultext_launch.wav', 50, 1, -3) animate(holder_obj, pixel_z = 1000, time = 30) if(ishuman(A)) var/mob/living/carbon/human/L = A diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 5d7616aef7..d7b9bad320 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -153,6 +153,8 @@ turf/simulated/mineral/floor/light_corner if(random_icon) dir = pick(alldirs) . = INITIALIZE_HINT_LATELOAD + var/decl/flooring/F = get_flooring_data(/decl/flooring/sand) + footstep_sounds = F?.footstep_sounds /turf/simulated/mineral/LateInitialize() if(density && mineral) @@ -325,7 +327,7 @@ turf/simulated/mineral/floor/light_corner return to_chat(user, "You start digging.") - playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1) + playsound(user, 'sound/effects/rustle1.ogg', 50, 1) if(!do_after(user,40)) return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 96bea5fc74..f1ac203b8e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -372,10 +372,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp following = null return ..() -/mob/Move() +/mob/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - update_following() + update_following() /mob/Life() // to catch teleports etc which directly set loc @@ -815,7 +814,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0) // Lets a ghost know someone's trying to bring them back, and for them to get into their body. // Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE) +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) if((last_revive_notification + 2 MINUTES) > world.time) return last_revive_notification = world.time @@ -824,6 +823,16 @@ mob/observer/dead/MayRespawn(var/feedback = 0) window_flash(client) if(message) to_chat(src, "[message]") + if(source) + var/obj/screen/alert/A = throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning) + if(A) + if(client && client.prefs && client.prefs.UI_style) + A.icon = ui_style2icon(client.prefs.UI_style) + A.desc = message + var/old_layer = source.layer + source.layer = FLOAT_LAYER + A.overlays += source + source.layer = old_layer to_chat(src, "(Click to re-enter)") if(sound) SEND_SOUND(src, sound(sound)) diff --git a/code/modules/mob/freelook/ai/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm index 5c21c6784d..c0b4adf0f6 100644 --- a/code/modules/mob/freelook/ai/update_triggers.dm +++ b/code/modules/mob/freelook/ai/update_triggers.dm @@ -6,30 +6,28 @@ // This might be laggy, comment it out if there are problems. /mob/living/silicon/var/updating = 0 -/mob/living/silicon/robot/Move() - var/oldLoc = src.loc +/mob/living/silicon/robot/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - if(provides_camera_vision()) - if(!updating) - updating = 1 - spawn(BORG_CAMERA_BUFFER) - if(oldLoc != src.loc) - cameranet.updatePortableCamera(src.camera) - updating = 0 + if(!provides_camera_vision()) + return + if(!updating) + updating = 1 + spawn(BORG_CAMERA_BUFFER) + if(old_loc != src.loc) + cameranet.updatePortableCamera(src.camera) + updating = 0 -/mob/living/silicon/AI/Move() - var/oldLoc = src.loc +/mob/living/silicon/ai/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - if(provides_camera_vision()) - if(!updating) - updating = 1 - spawn(BORG_CAMERA_BUFFER) - if(oldLoc != src.loc) - cameranet.updateVisibility(oldLoc, 0) - cameranet.updateVisibility(loc, 0) - updating = 0 + if(!provides_camera_vision()) + return + if(!updating) + updating = 1 + spawn(BORG_CAMERA_BUFFER) + if(old_loc != src.loc) + cameranet.updateVisibility(old_loc, 0) + cameranet.updateVisibility(loc, 0) + updating = 0 #undef BORG_CAMERA_BUFFER diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm index 89a15c3000..05aba49008 100644 --- a/code/modules/mob/freelook/eye.dm +++ b/code/modules/mob/freelook/eye.dm @@ -52,8 +52,6 @@ set src = usr.contents return 0 -/mob/observer/eye/examine(mob/user) - // Use this when setting the eye's location. // It will also stream the chunk that the new loc is in. /mob/observer/eye/proc/setLoc(var/T) diff --git a/code/modules/mob/freelook/mask/update_triggers.dm b/code/modules/mob/freelook/mask/update_triggers.dm index 1dd520e7f1..8008916220 100644 --- a/code/modules/mob/freelook/mask/update_triggers.dm +++ b/code/modules/mob/freelook/mask/update_triggers.dm @@ -4,18 +4,17 @@ /mob/living/var/updating_cult_vision = 0 -/mob/living/Move() - var/oldLoc = src.loc +/mob/living/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - if(cultnet.provides_vision(src)) - if(!updating_cult_vision) - updating_cult_vision = 1 - spawn(CULT_UPDATE_BUFFER) - if(oldLoc != src.loc) - cultnet.updateVisibility(oldLoc, 0) - cultnet.updateVisibility(loc, 0) - updating_cult_vision = 0 + if(!cultnet.provides_vision(src)) + return + if(!updating_cult_vision) + updating_cult_vision = 1 + spawn(CULT_UPDATE_BUFFER) + if(old_loc != src.loc) + cultnet.updateVisibility(old_loc, 0) + cultnet.updateVisibility(loc, 0) + updating_cult_vision = 0 #undef CULT_UPDATE_BUFFER diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index ff08be434a..a576dedd13 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -91,8 +91,6 @@ var/track = null if(isobserver(src)) - if(italics && is_preference_enabled(/datum/client_preference/ghost_radio)) - return if(speaker_name != speaker.real_name && speaker.real_name) speaker_name = "[speaker.real_name] ([speaker_name])" track = "([ghost_follow_link(speaker, src)]) " @@ -281,4 +279,4 @@ name = speaker.voice_name var/rendered = "[name] [message]" - to_chat(src, rendered) \ No newline at end of file + to_chat(src, rendered) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 475e5f7aa8..46939d39cf 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -89,6 +89,22 @@ var/list/holder_mob_icon_cache = list() else if(H.r_hand == src) H.update_inv_r_hand() +/obj/item/weapon/holder/container_resist(mob/living/held) + var/mob/M = loc + if(istype(M)) + M.drop_from_inventory(src) + to_chat(M, "\The [held] wriggles out of your grip!") + to_chat(held, "You wiggle out of [M]'s grip!") + else if(istype(loc, /obj/item/clothing/accessory/holster)) + var/obj/item/clothing/accessory/holster/holster = loc + if(holster.holstered == src) + holster.clear_holster() + to_chat(held, "You extricate yourself from [holster].") + held.forceMove(get_turf(held)) + else if(isitem(loc)) + to_chat(held, "You struggle free of [loc].") + held.forceMove(get_turf(held)) + //Mob specific holders. /obj/item/weapon/holder/diona origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5) diff --git a/code/modules/mob/living/bot/SLed209bot.dm b/code/modules/mob/living/bot/SLed209bot.dm index 7b5bbc76e5..fa17b05696 100644 --- a/code/modules/mob/living/bot/SLed209bot.dm +++ b/code/modules/mob/living/bot/SLed209bot.dm @@ -40,7 +40,7 @@ if(emagged) projectile = /obj/item/projectile/beam/shock - playsound(loc, emagged ? 'sound/weapons/laser3.ogg' : 'sound/weapons/Taser.ogg', 50, 1) + playsound(src, emagged ? 'sound/weapons/laser3.ogg' : 'sound/weapons/Taser.ogg', 50, 1) var/obj/item/projectile/P = new projectile(loc) P.firer = src diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index b1ea693f2f..6a4c45f123 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -22,7 +22,7 @@ /mob/living/bot/cleanbot/handleIdle() if(!screwloose && !oddbutton && prob(2)) custom_emote(2, "makes an excited booping sound!") - playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0) + playsound(src, 'sound/machines/synth_yes.ogg', 50, 0) if(screwloose && prob(5)) // Make a mess if(istype(loc, /turf/simulated)) @@ -179,7 +179,7 @@ if(!screwloose || !oddbutton) if(user) to_chat(user, "The [src] buzzes and beeps.") - playsound(src.loc, 'sound/machines/buzzbeep.ogg', 50, 0) + playsound(src, 'sound/machines/buzzbeep.ogg', 50, 0) oddbutton = 1 screwloose = 1 return 1 diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 0d77e837f0..f0e58c455f 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -65,7 +65,7 @@ if(emagged) projectile = /obj/item/projectile/beam - playsound(loc, emagged ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1) + playsound(src, emagged ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1) var/obj/item/projectile/P = new projectile(loc) P.firer = src diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm index 13abfa8da3..a7b9812b9f 100644 --- a/code/modules/mob/living/bot/edCLNbot.dm +++ b/code/modules/mob/living/bot/edCLNbot.dm @@ -27,7 +27,7 @@ /mob/living/bot/cleanbot/edCLN/handleIdle() if(prob(10)) custom_emote(2, "makes a less than thrilled beeping sound.") - playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0) + playsound(src, 'sound/machines/synth_yes.ogg', 50, 0) if(red_switch && !blue_switch && !green_switch && prob(10) || src.emagged) if(istype(loc, /turf/simulated)) @@ -124,7 +124,7 @@ if(!emagged) if(user) to_chat(user, "The [src] buzzes and beeps.") - playsound(src.loc, 'sound/machines/buzzbeep.ogg', 50, 0) + playsound(src, 'sound/machines/buzzbeep.ogg', 50, 0) emagged = 1 return 1 diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 4eb7743254..9cec0dfe47 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -180,7 +180,7 @@ busy = 1 if(do_after(src, 30, A)) - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) visible_message("[src] waters \the [A].") tank.reagents.trans_to(T, 100 - T.waterlevel) if(FARMBOT_UPROOT) @@ -218,7 +218,7 @@ while(do_after(src, 10) && tank.reagents.total_volume < tank.reagents.maximum_volume) tank.reagents.add_reagent("water", 10) if(prob(5)) - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) busy = 0 action = "" diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index aa399a22f3..c34274a6ab 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -58,7 +58,7 @@ emagged = 1 if(user) to_chat(user, "The [src] buzzes and beeps.") - playsound(src.loc, 'sound/machines/buzzbeep.ogg', 50, 0) + playsound(src, 'sound/machines/buzzbeep.ogg', 50, 0) return 1 /mob/living/bot/floorbot/Topic(href, href_list) @@ -102,7 +102,7 @@ if(prob(1)) custom_emote(2, "makes an excited beeping sound!") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + playsound(src, 'sound/machines/twobeep.ogg', 50, 0) /mob/living/bot/floorbot/handleAdjacentTarget() if(get_turf(target) == src.loc) @@ -278,7 +278,7 @@ /mob/living/bot/floorbot/explode() turn_off() visible_message("\The [src] blows apart!") - playsound(src.loc, "sparks", 50, 1) + playsound(src, "sparks", 50, 1) var/turf/Tsec = get_turf(src) var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec) diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index edb7486fd1..a67440e013 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -44,7 +44,7 @@ ) var/message = pick(message_options) say(message) - playsound(loc, message_options[message], 50, 0) + playsound(src, message_options[message], 50, 0) /mob/living/bot/medbot/handleAdjacentTarget() UnarmedAttack(target) @@ -88,7 +88,7 @@ ) var/message = pick(message_options) say(message) - playsound(loc, message_options[message], 50, 0) + playsound(src, message_options[message], 50, 0) custom_emote(1, "points at [H.name].") last_newpatient_speak = world.time break @@ -133,7 +133,7 @@ ) var/message = pick(death_messages) say(message) - playsound(loc, death_messages[message], 50, 0) + playsound(src, death_messages[message], 50, 0) // This is down here for the same reason as above. else @@ -148,7 +148,7 @@ ) var/message = pick(possible_messages) say(message) - playsound(loc, possible_messages[message], 50, 0) + playsound(src, possible_messages[message], 50, 0) busy = 0 update_icons() @@ -293,7 +293,7 @@ reagent_glass = null if(emagged && prob(25)) - playsound(loc, 'sound/voice/medbot/minsult.ogg', 50, 0) + playsound(src, 'sound/voice/medbot/minsult.ogg', 50, 0) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index b0eee0e650..9bef4c0cbc 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -183,7 +183,7 @@ locked = !locked to_chat(user, "You [locked ? "lock" : "unlock"] the mulebot's controls!") flick("mulebot-emagged", src) - playsound(loc, 'sound/effects/sparks1.ogg', 100, 0) + playsound(src, 'sound/effects/sparks1.ogg', 100, 0) return 1 /mob/living/bot/mulebot/update_icons() @@ -202,13 +202,13 @@ /mob/living/bot/mulebot/handleFrustrated() custom_emote(2, "makes a sighing buzz.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) ..() /mob/living/bot/mulebot/handleAdjacentTarget() if(target == src.loc) custom_emote(2, "makes a chiming sound.") - playsound(loc, 'sound/machines/chime.ogg', 50, 0) + playsound(src, 'sound/machines/chime.ogg', 50, 0) UnarmedAttack(target) resetTarget() if(auto_return && home && (loc != home)) @@ -244,7 +244,7 @@ /mob/living/bot/mulebot/proc/runOver(var/mob/living/carbon/human/H) if(istype(H)) // No safety checks - WILL run over lying humans. Stop ERPing in the maint! visible_message("[src] drives over [H]!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) var/damage = rand(5, 7) H.apply_damage(2 * damage, BRUTE, BP_HEAD) @@ -298,7 +298,7 @@ if(crates_only && !istype(C,/obj/structure/closet/crate)) custom_emote(2, "makes a sighing buzz.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return var/obj/structure/closet/crate/crate = C diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 6d7ec44860..e711ec63d1 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -158,7 +158,7 @@ return if(!target) - playsound(src.loc, pick(threat_found_sounds), 50) + playsound(src, pick(threat_found_sounds), 50) global_announcer.autosay("[src] was attacked by a hostile [target_name(attacker)] in [get_area(src)].", "[src]", "Security") target = attacker attacked = TRUE @@ -169,7 +169,7 @@ if(declare_arrests) global_announcer.autosay("[src] is [arrest_type ? "detaining" : "arresting"] a level [threat] suspect [suspect_name] in [get_area(src)].", "[src]", "Security") say("Down on the floor, [suspect_name]! You have [SECBOT_WAIT_TIME*2] seconds to comply.") - playsound(src.loc, pick(preparing_arrest_sounds), 50) + playsound(src, pick(preparing_arrest_sounds), 50) // Register to be told when the target moves GLOB.moved_event.register(target, src, /mob/living/bot/secbot/proc/target_moved) @@ -207,7 +207,7 @@ awaiting_surrender = 0 say("Level [threat] infraction alert!") custom_emote(1, "points at [M.name]!") - playsound(src.loc, pick(threat_found_sounds), 50) + playsound(src, pick(threat_found_sounds), 50) return /mob/living/bot/secbot/handleAdjacentTarget() @@ -256,10 +256,10 @@ if(can_next_insult > world.time) return if(threat >= 10) - playsound(src.loc, 'sound/voice/binsult.ogg', 75) + playsound(src, 'sound/voice/binsult.ogg', 75) can_next_insult = world.time + 20 SECONDS else - playsound(src.loc, pick(fighting_sounds), 75) + playsound(src, pick(fighting_sounds), 75) can_next_insult = world.time + 5 SECONDS @@ -278,7 +278,7 @@ cuff = FALSE if(!cuff) H.stun_effect_act(0, stun_strength, null) - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1) do_attack_animation(H) busy = TRUE update_icons() @@ -288,7 +288,7 @@ visible_message("\The [H] was prodded by \the [src] with a stun baton!") insult(H) else - playsound(loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) + playsound(src, 'sound/weapons/handcuffs.ogg', 30, 1, -2) visible_message("\The [src] is trying to put handcuffs on \the [H]!") busy = TRUE if(do_mob(src, H, 60)) @@ -297,13 +297,13 @@ H.handcuffed = new /obj/item/weapon/handcuffs/cable(H) // Better to be cable cuffed than stun-locked else H.handcuffed = new /obj/item/weapon/handcuffs(H) - H.update_inv_handcuffed() + H.update_handcuffed() busy = FALSE else if(istype(M, /mob/living)) var/mob/living/L = M L.adjustBruteLoss(xeno_harm_strength) do_attack_animation(M) - playsound(loc, "swing_hit", 50, 1, -1) + playsound(src, "swing_hit", 50, 1, -1) busy = TRUE update_icons() spawn(2) diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index c120b9deef..e2c965e2c9 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -25,7 +25,7 @@ LAssailant = M - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("[] has grabbed [] passively!", M, src), 1) @@ -40,7 +40,7 @@ step_away(src,M,15) sleep(3) step_away(src,M,15) - playsound(loc, "punch", 25, 1, -1) + playsound(src, "punch", 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("[] has punched []!", M, src), 1) @@ -52,7 +52,7 @@ adjustBruteLoss(damage) updatehealth() else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("[] has attempted to punch []!", M, src), 1) diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index 6c9cca88fb..5782b5d127 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -98,7 +98,7 @@ m_type = 2 if("chirp") message = "[src] chirps!" - playsound(loc, 'sound/misc/nymphchirp.ogg', 50, 0) + playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0) m_type = 2 if("help") to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 0bd0ac89b1..370ec77422 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -148,11 +148,11 @@ if(environment.temperature > (T0C+66)) adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing. - if (fire) fire.icon_state = "fire2" + throw_alert("alien_fire", /obj/screen/alert/alien_fire) if(prob(20)) to_chat(src, "You feel a searing heat!") else - if (fire) fire.icon_state = "fire0" + clear_alert("alien_fire") /mob/living/carbon/alien/handle_fire() if(..()) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ff72f96fac..4257281210 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,403 +1,411 @@ -/mob/living/carbon/Initialize() - . = ..() - //setup reagent holders - bloodstr = new/datum/reagents/metabolism/bloodstream(500, src) - ingested = new/datum/reagents/metabolism/ingested(500, src) - touching = new/datum/reagents/metabolism/touch(500, src) - reagents = bloodstr - if (!default_language && species_language) - default_language = GLOB.all_languages[species_language] - -/mob/living/carbon/Life() - ..() - - handle_viruses() - - // Increase germ_level regularly - if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level - germ_level++ - -/mob/living/carbon/Destroy() - qdel(ingested) - qdel(touching) - // We don't qdel(bloodstr) because it's the same as qdel(reagents) - for(var/guts in internal_organs) - qdel(guts) - for(var/food in stomach_contents) - qdel(food) - return ..() - -/mob/living/carbon/rejuvenate() - bloodstr.clear_reagents() - ingested.clear_reagents() - touching.clear_reagents() - ..() - -/mob/living/carbon/Move(NewLoc, direct) - . = ..() - if(.) - if(src.nutrition && src.stat != 2) - adjust_nutrition(-DEFAULT_HUNGER_FACTOR / 10) - if(src.m_intent == "run") - adjust_nutrition(-DEFAULT_HUNGER_FACTOR / 10) - - if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360) - src.bodytemperature += 2 - - // Moving around increases germ_level faster - if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) - germ_level++ - -/mob/living/carbon/relaymove(var/mob/living/user, direction) - if((user in src.stomach_contents) && istype(user)) - if(user.last_special <= world.time) - user.last_special = world.time + 50 - src.visible_message("You hear something rumbling inside [src]'s stomach...") - var/obj/item/I = user.get_active_hand() - if(I && I.force) - var/d = rand(round(I.force / 4), I.force) - if(istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/organ = H.get_organ(BP_TORSO) - if (istype(organ)) - if(organ.take_damage(d, 0)) - H.UpdateDamageIcon() - H.updatehealth() - else - src.take_organ_damage(d) - user.visible_message("[user] attacks [src]'s stomach wall with the [I.name]!") - playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) - - if(prob(src.getBruteLoss() - 50)) - for(var/atom/movable/A in stomach_contents) - A.loc = loc - stomach_contents.Remove(A) - src.gib() - -/mob/living/carbon/gib() - for(var/mob/M in src) - if(M in src.stomach_contents) - src.stomach_contents.Remove(M) - M.loc = src.loc - for(var/mob/N in viewers(src, null)) - if(N.client) - N.show_message(text("[M] bursts out of [src]!"), 2) - ..() - -/mob/living/carbon/attack_hand(mob/M as mob) - if(!istype(M, /mob/living/carbon)) return - if (ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(H, "You can't use your [temp.name]") - return - - return - -/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null, var/stun = 1) - if(status_flags & GODMODE) return 0 //godmode - if(def_zone == "l_hand" || def_zone == "r_hand") //Diona (And any other potential plant people) hands don't get shocked. - if(species.flags & IS_PLANT) - return 0 - shock_damage *= siemens_coeff - if (shock_damage<1) - return 0 - - src.apply_damage(0.2 * shock_damage, BURN, def_zone, used_weapon="Electrocution") //shock the target organ - src.apply_damage(0.4 * shock_damage, BURN, BP_TORSO, used_weapon="Electrocution") //shock the torso more - src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part! - src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part! - - playsound(loc, "sparks", 50, 1, -1) - if (shock_damage > 15) - src.visible_message( - "[src] was electrocuted[source ? " by the [source]" : ""]!", \ - "You feel a powerful shock course through your body!", \ - "You hear a heavy electrical crack." \ - ) - else - src.visible_message( - "[src] was shocked[source ? " by the [source]" : ""].", \ - "You feel a shock course through your body.", \ - "You hear a zapping sound." \ - ) - - if(stun) - switch(shock_damage) - if(16 to 20) - Stun(2) - if(21 to 25) - Weaken(2) - if(26 to 30) - Weaken(5) - if(31 to INFINITY) - Weaken(10) //This should work for now, more is really silly and makes you lay there forever - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, loc) - s.start() - - return shock_damage - -/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) - if (src.health >= config.health_threshold_crit) - if(src == M && istype(src, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - var/datum/gender/T = gender_datums[H.get_visible_gender()] - src.visible_message( \ - "[src] examines [T.himself].", \ - "You check yourself for injuries." \ - ) - - for(var/obj/item/organ/external/org in H.organs) - var/list/status = list() - var/brutedamage = org.brute_dam - var/burndamage = org.burn_dam - /* - if(halloss > 0) //Makes halloss show up as actual wounds on self examine. - if(prob(30)) - brutedamage += halloss - if(prob(30)) - burndamage += halloss - */ - switch(brutedamage) - if(1 to 20) - status += "bruised" - if(20 to 40) - status += "wounded" - if(40 to INFINITY) - status += "mangled" - - switch(burndamage) - if(1 to 10) - status += "numb" - if(10 to 40) - status += "blistered" - if(40 to INFINITY) - status += "peeling away" - - if(org.is_stump()) - status += "MISSING" - if(org.status & ORGAN_MUTATED) - status += "weirdly shapen" - if(org.dislocated == 2) - status += "dislocated" - if(org.status & ORGAN_BROKEN) - status += "hurts when touched" - if(org.status & ORGAN_DEAD) - status += "is bruised and necrotic" - if(!org.is_usable() || org.is_dislocated()) - status += "dangling uselessly" - if(status.len) - src.show_message("My [org.name] is [english_list(status)].",1) - else - src.show_message("My [org.name] is OK.",1) - - if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) - H.play_xylophone() - else if (on_fire) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if (M.on_fire) - M.visible_message("[M] tries to pat out [src]'s flames, but to no avail!", - "You try to pat out [src]'s flames, but to no avail! Put yourself out first!") - else - M.visible_message("[M] tries to pat out [src]'s flames!", - "You try to pat out [src]'s flames! Hot!") - if(do_mob(M, src, 15)) - src.adjust_fire_stacks(-0.5) - if (prob(10) && (M.fire_stacks <= 0)) - M.adjust_fire_stacks(1) - M.IgniteMob() - if (M.on_fire) - M.visible_message("The fire spreads from [src] to [M]!", - "The fire spreads to you as well!") - else - src.adjust_fire_stacks(-0.5) //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. - if (src.fire_stacks <= 0) - M.visible_message("[M] successfully pats out [src]'s flames.", - "You successfully pat out [src]'s flames.") - src.ExtinguishMob() - src.fire_stacks = 0 - else - if (istype(src,/mob/living/carbon/human) && src:w_uniform) - var/mob/living/carbon/human/H = src - H.w_uniform.add_fingerprint(M) - - var/show_ssd - var/mob/living/carbon/human/H = src - var/datum/gender/T = gender_datums[H.get_visible_gender()] // make sure to cast to human before using get_gender() or get_visible_gender()! - if(istype(H)) show_ssd = H.species.show_ssd - if(show_ssd && !client && !teleop) - M.visible_message("[M] shakes [src] trying to wake [T.him] up!", \ - "You shake [src], but [T.he] [T.does] not respond... Maybe [T.he] [T.has] S.S.D?") - else if(lying || src.sleeping) - src.sleeping = max(0,src.sleeping-5) - if(src.sleeping == 0) - src.resting = 0 - M.visible_message("[M] shakes [src] trying to wake [T.him] up!", \ - "You shake [src] trying to wake [T.him] up!") - else - var/mob/living/carbon/human/hugger = M - var/datum/gender/TM = gender_datums[M.get_visible_gender()] - if(M.resting == 1) //Are they resting on the ground? - M.visible_message("[M] grabs onto [src] and pulls [TM.himself] up", \ - "You grip onto [src] and pull yourself up off the ground!") - if(M.fire_stacks >= (src.fire_stacks + 3)) //Fire checks. - src.adjust_fire_stacks(1) - M.adjust_fire_stacks(-1) - if(M.on_fire) - src.IgniteMob() - if(do_after(M, 0.5 SECONDS)) //.5 second delay. Makes it a bit stronger than just typing rest. - M.resting = 0 //Hoist yourself up up off the ground. No para/stunned/weakened removal. - else if(istype(hugger)) - hugger.species.hug(hugger,src) - else - M.visible_message("[M] hugs [src] to make [T.him] feel better!", \ - "You hug [src] to make [T.him] feel better!") - if(M.fire_stacks >= (src.fire_stacks + 3)) - src.adjust_fire_stacks(1) - M.adjust_fire_stacks(-1) - if(M.on_fire) - src.IgniteMob() - AdjustParalysis(-3) - AdjustStunned(-3) - AdjustWeakened(-3) - - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - -/mob/living/carbon/proc/eyecheck() - return 0 - -/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(eyecheck() < intensity || override_blindness_check) - return ..() - -// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching. -// Stop! ... Hammertime! ~Carn - -/mob/living/carbon/proc/getDNA() - return dna - -/mob/living/carbon/proc/setDNA(var/datum/dna/newDNA) - dna = newDNA - -// ++++ROCKDTBEN++++ MOB PROCS //END - -/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) - bodytemperature += temp_inc - -/mob/living/carbon/can_use_hands() - if(handcuffed) - return 0 - if(buckled && istype(buckled, /obj/structure/bed/nest)) // buckling does not restrict hands - return 0 - return 1 - -/mob/living/carbon/restrained() - if (handcuffed) - return 1 - return - -/mob/living/carbon/u_equip(obj/item/W as obj) - if(!W) return 0 - - else if (W == handcuffed) - handcuffed = null - update_inv_handcuffed() - if(buckled && buckled.buckle_require_restraints) - buckled.unbuckle_mob() - - else if (W == legcuffed) - legcuffed = null - update_inv_legcuffed() - else - ..() - - return - -//generates realistic-ish pulse output based on preset levels -/mob/living/carbon/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate - var/temp = 0 //see setup.dm:694 - switch(src.pulse) - if(PULSE_NONE) - return "0" - if(PULSE_SLOW) - temp = rand(40, 60) - return num2text(method ? temp : temp + rand(-10, 10)) - if(PULSE_NORM) - temp = rand(60, 90) - return num2text(method ? temp : temp + rand(-10, 10)) - if(PULSE_FAST) - temp = rand(90, 120) - return num2text(method ? temp : temp + rand(-10, 10)) - if(PULSE_2FAST) - temp = rand(120, 160) - return num2text(method ? temp : temp + rand(-10, 10)) - if(PULSE_THREADY) - return method ? ">250" : "extremely weak and fast, patient's artery feels like a thread" -// output for machines^ ^^^^^^^output for people^^^^^^^^^ - -/mob/living/carbon/verb/mob_sleep() - set name = "Sleep" - set category = "IC" - - if(usr.sleeping) - to_chat(usr, "You are already sleeping") - return - if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes") - usr.sleeping = 20 //Short nap - -/mob/living/carbon/Bump(atom/A) - if(now_pushing) - return - ..() - if(istype(A, /mob/living/carbon) && prob(10)) - spread_disease_to(A, "Contact") - -/mob/living/carbon/cannot_use_vents() - return - -/mob/living/carbon/slip(var/slipped_on,stun_duration=8) - if(buckled) - return 0 - stop_pulling() - to_chat(src, "You slipped on [slipped_on]!") - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - Weaken(FLOOR(stun_duration/2, 1)) - return 1 - -/mob/living/carbon/proc/add_chemical_effect(var/effect, var/magnitude = 1) - if(effect in chem_effects) - chem_effects[effect] += magnitude - else - chem_effects[effect] = magnitude - -/mob/living/carbon/get_default_language() - if(default_language) - if(can_speak(default_language)) - return default_language - else - return GLOB.all_languages[LANGUAGE_GIBBERISH] - - if(!species) - return null - - return species.default_language ? GLOB.all_languages[species.default_language] : null - -/mob/living/carbon/proc/should_have_organ(var/organ_check) - return 0 - -/mob/living/carbon/can_feel_pain(var/check_organ) - if(isSynthetic()) - return 0 - return !(species.flags & NO_PAIN) - -/mob/living/carbon/needs_to_breathe() - if(does_not_breathe) - return FALSE - return ..() +/mob/living/carbon/Initialize() + . = ..() + //setup reagent holders + bloodstr = new/datum/reagents/metabolism/bloodstream(500, src) + ingested = new/datum/reagents/metabolism/ingested(500, src) + touching = new/datum/reagents/metabolism/touch(500, src) + reagents = bloodstr + if (!default_language && species_language) + default_language = GLOB.all_languages[species_language] + +/mob/living/carbon/Life() + ..() + + handle_viruses() + + // Increase germ_level regularly + if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level + germ_level++ + +/mob/living/carbon/Destroy() + qdel(ingested) + qdel(touching) + // We don't qdel(bloodstr) because it's the same as qdel(reagents) + for(var/guts in internal_organs) + qdel(guts) + for(var/food in stomach_contents) + qdel(food) + return ..() + +/mob/living/carbon/rejuvenate() + bloodstr.clear_reagents() + ingested.clear_reagents() + touching.clear_reagents() + ..() + +/mob/living/carbon/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(src.nutrition && src.stat != 2) + adjust_nutrition(-DEFAULT_HUNGER_FACTOR / 10) + if(src.m_intent == "run") + adjust_nutrition(-DEFAULT_HUNGER_FACTOR / 10) + + if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360) + src.bodytemperature += 2 + + // Moving around increases germ_level faster + if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) + germ_level++ + +/mob/living/carbon/relaymove(var/mob/living/user, direction) + if((user in src.stomach_contents) && istype(user)) + if(user.last_special <= world.time) + user.last_special = world.time + 50 + src.visible_message("You hear something rumbling inside [src]'s stomach...") + var/obj/item/I = user.get_active_hand() + if(I && I.force) + var/d = rand(round(I.force / 4), I.force) + if(istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + var/obj/item/organ/external/organ = H.get_organ(BP_TORSO) + if (istype(organ)) + if(organ.take_damage(d, 0)) + H.UpdateDamageIcon() + H.updatehealth() + else + src.take_organ_damage(d) + user.visible_message("[user] attacks [src]'s stomach wall with the [I.name]!") + playsound(user, 'sound/effects/attackblob.ogg', 50, 1) + + if(prob(src.getBruteLoss() - 50)) + for(var/atom/movable/A in stomach_contents) + A.loc = loc + stomach_contents.Remove(A) + src.gib() + +/mob/living/carbon/gib() + for(var/mob/M in src) + if(M in src.stomach_contents) + src.stomach_contents.Remove(M) + M.loc = src.loc + for(var/mob/N in viewers(src, null)) + if(N.client) + N.show_message(text("[M] bursts out of [src]!"), 2) + ..() + +/mob/living/carbon/attack_hand(mob/M as mob) + if(!istype(M, /mob/living/carbon)) return + if (ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (H.hand) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + to_chat(H, "You can't use your [temp.name]") + return + + return + +/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null, var/stun = 1) + if(status_flags & GODMODE) return 0 //godmode + if(def_zone == "l_hand" || def_zone == "r_hand") //Diona (And any other potential plant people) hands don't get shocked. + if(species.flags & IS_PLANT) + return 0 + shock_damage *= siemens_coeff + if (shock_damage<1) + return 0 + + src.apply_damage(0.2 * shock_damage, BURN, def_zone, used_weapon="Electrocution") //shock the target organ + src.apply_damage(0.4 * shock_damage, BURN, BP_TORSO, used_weapon="Electrocution") //shock the torso more + src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part! + src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part! + + playsound(src, "sparks", 50, 1, -1) + if (shock_damage > 15) + src.visible_message( + "[src] was electrocuted[source ? " by the [source]" : ""]!", \ + "You feel a powerful shock course through your body!", \ + "You hear a heavy electrical crack." \ + ) + else + src.visible_message( + "[src] was shocked[source ? " by the [source]" : ""].", \ + "You feel a shock course through your body.", \ + "You hear a zapping sound." \ + ) + + if(stun) + switch(shock_damage) + if(16 to 20) + Stun(2) + if(21 to 25) + Weaken(2) + if(26 to 30) + Weaken(5) + if(31 to INFINITY) + Weaken(10) //This should work for now, more is really silly and makes you lay there forever + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, loc) + s.start() + + return shock_damage + +/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) + if (src.health >= config.health_threshold_crit) + if(src == M && istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + var/datum/gender/T = gender_datums[H.get_visible_gender()] + src.visible_message( \ + "[src] examines [T.himself].", \ + "You check yourself for injuries." \ + ) + + for(var/obj/item/organ/external/org in H.organs) + var/list/status = list() + var/brutedamage = org.brute_dam + var/burndamage = org.burn_dam + /* + if(halloss > 0) //Makes halloss show up as actual wounds on self examine. + if(prob(30)) + brutedamage += halloss + if(prob(30)) + burndamage += halloss + */ + switch(brutedamage) + if(1 to 20) + status += "bruised" + if(20 to 40) + status += "wounded" + if(40 to INFINITY) + status += "mangled" + + switch(burndamage) + if(1 to 10) + status += "numb" + if(10 to 40) + status += "blistered" + if(40 to INFINITY) + status += "peeling away" + + if(org.is_stump()) + status += "MISSING" + if(org.status & ORGAN_MUTATED) + status += "weirdly shapen" + if(org.dislocated == 2) + status += "dislocated" + if(org.status & ORGAN_BROKEN) + status += "hurts when touched" + if(org.status & ORGAN_DEAD) + status += "is bruised and necrotic" + if(!org.is_usable() || org.is_dislocated()) + status += "dangling uselessly" + if(status.len) + src.show_message("My [org.name] is [english_list(status)].",1) + else + src.show_message("My [org.name] is OK.",1) + + if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) + H.play_xylophone() + else if (on_fire) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if (M.on_fire) + M.visible_message("[M] tries to pat out [src]'s flames, but to no avail!", + "You try to pat out [src]'s flames, but to no avail! Put yourself out first!") + else + M.visible_message("[M] tries to pat out [src]'s flames!", + "You try to pat out [src]'s flames! Hot!") + if(do_mob(M, src, 15)) + src.adjust_fire_stacks(-0.5) + if (prob(10) && (M.fire_stacks <= 0)) + M.adjust_fire_stacks(1) + M.IgniteMob() + if (M.on_fire) + M.visible_message("The fire spreads from [src] to [M]!", + "The fire spreads to you as well!") + else + src.adjust_fire_stacks(-0.5) //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. + if (src.fire_stacks <= 0) + M.visible_message("[M] successfully pats out [src]'s flames.", + "You successfully pat out [src]'s flames.") + src.ExtinguishMob() + src.fire_stacks = 0 + else + if (istype(src,/mob/living/carbon/human) && src:w_uniform) + var/mob/living/carbon/human/H = src + H.w_uniform.add_fingerprint(M) + + var/show_ssd + var/mob/living/carbon/human/H = src + var/datum/gender/T = gender_datums[H.get_visible_gender()] // make sure to cast to human before using get_gender() or get_visible_gender()! + if(istype(H)) show_ssd = H.species.show_ssd + if(show_ssd && !client && !teleop) + M.visible_message("[M] shakes [src] trying to wake [T.him] up!", \ + "You shake [src], but [T.he] [T.does] not respond... Maybe [T.he] [T.has] S.S.D?") + else if(lying || src.sleeping) + src.sleeping = max(0,src.sleeping-5) + if(src.sleeping == 0) + src.resting = 0 + M.visible_message("[M] shakes [src] trying to wake [T.him] up!", \ + "You shake [src] trying to wake [T.him] up!") + else + var/mob/living/carbon/human/hugger = M + var/datum/gender/TM = gender_datums[M.get_visible_gender()] + if(M.resting == 1) //Are they resting on the ground? + M.visible_message("[M] grabs onto [src] and pulls [TM.himself] up", \ + "You grip onto [src] and pull yourself up off the ground!") + if(M.fire_stacks >= (src.fire_stacks + 3)) //Fire checks. + src.adjust_fire_stacks(1) + M.adjust_fire_stacks(-1) + if(M.on_fire) + src.IgniteMob() + if(do_after(M, 0.5 SECONDS)) //.5 second delay. Makes it a bit stronger than just typing rest. + M.resting = 0 //Hoist yourself up up off the ground. No para/stunned/weakened removal. + else if(istype(hugger)) + hugger.species.hug(hugger,src) + else + M.visible_message("[M] hugs [src] to make [T.him] feel better!", \ + "You hug [src] to make [T.him] feel better!") + if(M.fire_stacks >= (src.fire_stacks + 3)) + src.adjust_fire_stacks(1) + M.adjust_fire_stacks(-1) + if(M.on_fire) + src.IgniteMob() + AdjustParalysis(-3) + AdjustStunned(-3) + AdjustWeakened(-3) + + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + +/mob/living/carbon/proc/eyecheck() + return 0 + +/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) + if(eyecheck() < intensity || override_blindness_check) + return ..() + +// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching. +// Stop! ... Hammertime! ~Carn + +/mob/living/carbon/proc/getDNA() + return dna + +/mob/living/carbon/proc/setDNA(var/datum/dna/newDNA) + dna = newDNA + +// ++++ROCKDTBEN++++ MOB PROCS //END + +/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) + bodytemperature += temp_inc + +/mob/living/carbon/can_use_hands() + if(handcuffed) + return 0 + if(buckled && istype(buckled, /obj/structure/bed/nest)) // buckling does not restrict hands + return 0 + return 1 + +/mob/living/carbon/restrained() + if (handcuffed) + return 1 + return + +/mob/living/carbon/u_equip(obj/item/W as obj) + if(!W) return 0 + + else if (W == handcuffed) + handcuffed = null + update_handcuffed() + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() + + else if (W == legcuffed) + legcuffed = null + update_inv_legcuffed() + else + ..() + +//generates realistic-ish pulse output based on preset levels +/mob/living/carbon/proc/get_pulse(var/method) //method 0 is for hands, 1 is for machines, more accurate + var/temp = 0 //see setup.dm:694 + switch(src.pulse) + if(PULSE_NONE) + return "0" + if(PULSE_SLOW) + temp = rand(40, 60) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_NORM) + temp = rand(60, 90) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_FAST) + temp = rand(90, 120) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_2FAST) + temp = rand(120, 160) + return num2text(method ? temp : temp + rand(-10, 10)) + if(PULSE_THREADY) + return method ? ">250" : "extremely weak and fast, patient's artery feels like a thread" +// output for machines^ ^^^^^^^output for people^^^^^^^^^ + +/mob/living/carbon/verb/mob_sleep() + set name = "Sleep" + set category = "IC" + + if(usr.sleeping) + to_chat(usr, "You are already sleeping") + return + if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes") + usr.sleeping = 20 //Short nap + +/mob/living/carbon/Bump(atom/A) + if(now_pushing) + return + ..() + if(istype(A, /mob/living/carbon) && prob(10)) + spread_disease_to(A, "Contact") + +/mob/living/carbon/cannot_use_vents() + return + +/mob/living/carbon/slip(var/slipped_on,stun_duration=8) + if(buckled) + return 0 + stop_pulling() + to_chat(src, "You slipped on [slipped_on]!") + playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) + Weaken(FLOOR(stun_duration/2, 1)) + return 1 + +/mob/living/carbon/proc/add_chemical_effect(var/effect, var/magnitude = 1) + if(effect in chem_effects) + chem_effects[effect] += magnitude + else + chem_effects[effect] = magnitude + +/mob/living/carbon/get_default_language() + if(default_language) + if(can_speak(default_language)) + return default_language + else + return GLOB.all_languages[LANGUAGE_GIBBERISH] + + if(!species) + return null + + return species.default_language ? GLOB.all_languages[species.default_language] : null + +/mob/living/carbon/proc/should_have_organ(var/organ_check) + return 0 + +/mob/living/carbon/can_feel_pain(var/check_organ) + if(isSynthetic()) + return 0 + return !(species.flags & NO_PAIN) + +/mob/living/carbon/needs_to_breathe() + if(does_not_breathe) + return FALSE + return ..() + +/mob/living/carbon/proc/update_handcuffed() + if(handcuffed) + drop_l_hand() + drop_r_hand() + stop_pulling() + throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = handcuffed) + else + clear_alert("handcuffed") + update_action_buttons() //some of our action buttons might be unusable when we're handcuffed. + update_inv_handcuffed() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index cd59a549ec..df195a495e 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -92,7 +92,7 @@ user.visible_message("\The [user] cut [src]'s neck with \the [W]!") if(W.hitsound) - playsound(loc, W.hitsound, 50, 1, -1) + playsound(src, W.hitsound, 50, 1, -1) G.last_action = world.time flick(G.hud.icon_state, G.hud) @@ -112,7 +112,7 @@ apply_damage(damage, W.damtype, "torso", 0, sharp=W.sharp, edge=W.edge) if(W.hitsound) - playsound(loc, W.hitsound, 50, 1, -1) + playsound(src, W.hitsound, 50, 1, -1) add_attack_logs(user,src,"Knifed (shanked)") diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index d82f050897..3950e55841 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -23,8 +23,8 @@ src.gender = gender reset_hair() - update_icons_body() update_dna() + update_icons_body() return 1 /mob/living/carbon/human/proc/change_gender_identity(var/identifying_gender) @@ -141,6 +141,8 @@ /mob/living/carbon/human/proc/update_dna() check_dna() dna.ready_dna(src) + for(var/obj/item/organ/O in organs) + O.dna = dna // Update all of those because apparently they're separate, and icons won't update properly /mob/living/carbon/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) var/list/valid_species = new() diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 6caeffdb6a..8b492e7dc4 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -87,7 +87,7 @@ to_chat(O, "[src] has died in [get_area(src)]. [ghost_follow_link(src, O)] ") if(!gibbed && species.death_sound) - playsound(loc, species.death_sound, 80, 1, 1) + playsound(src, species.death_sound, 80, 1, 1) if(ticker && ticker.mode) sql_report_death(src) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 16ea5e1ee4..e4afd8e20e 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -75,7 +75,7 @@ message = "[display_msg] at [param]." else message = "[display_msg]." - playsound(src.loc, use_sound, 50, 0) + playsound(src, use_sound, 50, 0) m_type = 1 //Promethean-only emotes @@ -84,7 +84,7 @@ to_chat(src, "You are not a slime thing!") return - playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound. + playsound(src, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound. message = "squishes." m_type = 1 @@ -94,7 +94,7 @@ to_chat(src, "You are not a Skrell!") return - playsound(src.loc, 'sound/effects/warble.ogg', 50, 0) // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound. + playsound(src, 'sound/effects/warble.ogg', 50, 0) // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound. message = "warbles." m_type = 2 @@ -186,7 +186,7 @@ if("clap") if(!src.restrained()) message = "claps." - playsound(src.loc, 'sound/misc/clapping.ogg') + playsound(src, 'sound/misc/clapping.ogg') m_type = 2 if(miming) m_type = 1 @@ -267,7 +267,7 @@ use_sound = pick('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') else use_sound = pick('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') - playsound(src.loc, use_sound, 50, 0) + playsound(src, use_sound, 50, 0) else message = "makes a strong noise." m_type = 2 @@ -540,7 +540,7 @@ use_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' else use_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' - playsound(src.loc, use_sound, 50, 0) + playsound(src, use_sound, 50, 0) else message = "makes a strange noise." m_type = 2 @@ -653,14 +653,14 @@ break if(M) message = "slaps [M] across the face. Ouch!" - playsound(loc, 'sound/effects/snap.ogg', 50, 1) + playsound(src, 'sound/effects/snap.ogg', 50, 1) if(ishuman(M)) //Snowflakey! var/mob/living/carbon/human/H = M if(istype(H.wear_mask,/obj/item/clothing/mask/smokable)) H.drop_from_inventory(H.wear_mask) else message = "slaps [T.himself]!" - playsound(loc, 'sound/effects/snap.ogg', 50, 1) + playsound(src, 'sound/effects/snap.ogg', 50, 1) if("scream", "screams") if(miming) @@ -672,9 +672,9 @@ m_type = 2 /* Removed, pending the location of some actually good, properly licensed sounds. if(get_gender() == FEMALE) - playsound(loc, "[species.female_scream_sound]", 80, 1) + playsound(src, "[species.female_scream_sound]", 80, 1) else - playsound(loc, "[species.male_scream_sound]", 80, 1) //default to male screams if no gender is present. + playsound(src, "[species.male_scream_sound]", 80, 1) //default to male screams if no gender is present. */ else message = "makes a very loud noise." @@ -697,7 +697,7 @@ return message = "snaps [T.his] fingers." - playsound(loc, 'sound/effects/fingersnap.ogg', 50, 1, -3) + playsound(src, 'sound/effects/fingersnap.ogg', 50, 1, -3) if("swish") src.animate_tail_once() @@ -721,14 +721,14 @@ if("whistle" || "whistles") if(!muzzled) message = "whistles a tune." - playsound(loc, 'sound/misc/longwhistle.ogg') //praying this doesn't get abused + playsound(src, 'sound/misc/longwhistle.ogg') //praying this doesn't get abused else message = "makes a light spitting noise, a poor attempt at a whistle." if("qwhistle") if(!muzzled) message = "whistles quietly." - playsound(loc, 'sound/misc/shortwhistle.ogg') + playsound(src, 'sound/misc/shortwhistle.ogg') else message = "makes a light spitting noise, a poor attempt at a whistle." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index db67313aa0..43609d271c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -418,7 +418,7 @@ BITSET(hud_updateflag, WANTED_HUD) if(istype(usr,/mob/living/carbon/human)) var/mob/living/carbon/human/U = usr - U.handle_regular_hud_updates() + U.handle_hud_list() if(istype(usr,/mob/living/silicon/robot)) var/mob/living/silicon/robot/U = usr U.handle_regular_hud_updates() @@ -747,7 +747,7 @@ var/datum/gender/T = gender_datums[get_visible_gender()] visible_message("\The [src] begins playing [T.his] ribcage like a xylophone. It's quite spooky.","You begin to play a spooky refrain on your ribcage.","You hear a spooky xylophone melody.") var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg') - playsound(loc, song, 50, 1, -1) + playsound(src, song, 50, 1, -1) xylophone = 1 spawn(1200) xylophone=0 @@ -1374,7 +1374,7 @@ set desc = "Pop a joint back into place. Extremely painful." set src in view(1) - if(!isliving(usr) || !usr.canClick()) + if(!isliving(usr) || !usr.checkClickCooldown()) return usr.setClickCooldown(20) @@ -1612,3 +1612,37 @@ msg += get_display_species() return msg + +/mob/living/carbon/human/reduce_cuff_time() + if(istype(gloves, /obj/item/clothing/gloves/gauntlets/rig)) + return 2 + return ..() + +/mob/living/carbon/human/pull_damage() + if(((health - halloss) <= config.health_threshold_softcrit)) + for(var/name in organs_by_name) + var/obj/item/organ/external/e = organs_by_name[name] + if(!e) + continue + if((e.status & ORGAN_BROKEN && (!e.splinted || (e.splinted in e.contents && prob(30))) || e.status & ORGAN_BLEEDING) && (getBruteLoss() + getFireLoss() >= 100)) + return 1 + else + return ..() + +// Drag damage is handled in a parent +/mob/living/carbon/human/dragged(var/mob/living/dragger, var/oldloc) + if(prob(getBruteLoss() * 200 / maxHealth)) + var/bloodtrail = 1 + if(species?.flags & NO_BLOOD) + bloodtrail = 0 + else + var/blood_volume = round((vessel.get_reagent_amount("blood")/species.blood_volume)*100) + if(blood_volume < BLOOD_VOLUME_SURVIVE) + bloodtrail = 0 //Most of it's gone already, just leave it be + else + vessel.remove_reagent("blood", 1) + if(bloodtrail) + if(istype(loc, /turf/simulated)) + var/turf/T = loc + T.add_blood(src) + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 52c0fdbe0c..b8fc94afe6 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -38,7 +38,7 @@ var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, H.get_accuracy_penalty()) if(!hit_zone) H.do_attack_animation(src) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[H] reaches for [src], but misses!") return FALSE @@ -111,7 +111,7 @@ LAssailant = M H.do_attack_animation(src) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) visible_message("[M] has grabbed [src][(M.zone_sel.selecting == "l_hand" || M.zone_sel.selecting == "r_hand")? " by their hands!":" passively!"]") return TRUE @@ -220,7 +220,7 @@ else H.visible_message("[attack_message]") - playsound(loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1) + playsound(src, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1) add_attack_logs(H,src,"Melee attacked with fists (miss/block)") @@ -286,7 +286,7 @@ if((shoes || !(species.flags & NO_SLIP)) && randn <= 25) var/armor_check = run_armor_check(affecting, "melee") apply_effect(3, WEAKEN, armor_check) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(armor_check < 60) visible_message("[M] has pushed [src]!") else @@ -296,7 +296,7 @@ if(randn <= 60) //See about breaking grips or pulls if(break_all_grabs(M)) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return //Actually disarm them @@ -304,10 +304,10 @@ if(I) drop_from_inventory(I) visible_message("[M] has disarmed [src]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(" [M] attempted to disarm [src]!") return diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3675866e24..8e351372c9 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -227,7 +227,7 @@ emp_act if(!hit_zone) user.do_attack_animation(src) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("\The [user] misses [src] with \the [I]!") return null diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 176ec6a3de..df1242d007 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -2,71 +2,69 @@ /mob/living/carbon/human/movement_delay(oldloc, direct) - var/tally = 0 + . = 0 + + if (istype(loc, /turf/space)) + return ..() - 1 if(species.slowdown) - tally = species.slowdown - - if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything - - if(embedded_flag) - handle_embedded_objects() //Moving with objects stuck in you can cause bad times. + . += species.slowdown if(force_max_speed) - return HUMAN_LOWEST_SLOWDOWN + return ..() + HUMAN_LOWEST_SLOWDOWN for(var/datum/modifier/M in modifiers) if(!isnull(M.haste) && M.haste == TRUE) - return HUMAN_LOWEST_SLOWDOWN // Returning -1 will actually result in a slowdown for Teshari. + return ..() + HUMAN_LOWEST_SLOWDOWN // Returning -1 will actually result in a slowdown for Teshari. if(!isnull(M.slowdown)) - tally += M.slowdown + . += M.slowdown var/health_deficiency = (getMaxHealth() - health) - if(health_deficiency >= 40) tally += (health_deficiency / 25) + if(health_deficiency >= 40) . += (health_deficiency / 25) if(can_feel_pain()) - if(halloss >= 10) tally += (halloss / 10) //halloss shouldn't slow you down if you can't even feel it + if(halloss >= 10) . += (halloss / 10) //halloss shouldn't slow you down if you can't even feel it var/hungry = (MAX_NUTRITION - nutrition) / 5 - if (hungry >= 70) tally += hungry/50 + if (hungry >= 70) . += hungry/50 if(istype(buckled, /obj/structure/bed/chair/wheelchair)) for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM)) var/obj/item/organ/external/E = get_organ(organ_name) if(!E || E.is_stump()) - tally += 4 + . += 4 else if(E.splinted && E.splinted.loc != E) - tally += 0.5 + . += 0.5 else if(E.status & ORGAN_BROKEN) - tally += 1.5 + . += 1.5 else for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) var/obj/item/organ/external/E = get_organ(organ_name) if(!E || E.is_stump()) - tally += 4 + . += 4 else if(E.splinted && E.splinted.loc != E) - tally += 0.5 + . += 0.5 else if(E.status & ORGAN_BROKEN) - tally += 1.5 + . += 1.5 - if(shock_stage >= 10) tally += 3 + if(shock_stage >= 10) . += 3 - if(aiming && aiming.aiming_at) tally += 5 // Iron sights make you slower, it's a well-known fact. + if(aiming && aiming.aiming_at) . += 5 // Iron sights make you slower, it's a well-known fact. if(FAT in src.mutations) - tally += 1.5 + . += 1.5 if (bodytemperature < species.cold_level_1) - tally += (species.cold_level_1 - bodytemperature) / 10 * 1.75 + . += (species.cold_level_1 - bodytemperature) / 10 * 1.75 - tally += max(2 * stance_damage, 0) //damaged/missing feet or legs is slow + . += max(2 * stance_damage, 0) //damaged/missing feet or legs is slow if(mRun in mutations) - tally = 0 + . = 0 // Turf related slowdown var/turf/T = get_turf(src) - tally += calculate_turf_slowdown(T, direct) + . += calculate_turf_slowdown(T, direct) // Item related slowdown. var/item_tally = calculate_item_encumbrance() @@ -83,19 +81,25 @@ item_tally *= species.item_slowdown_mod - tally += item_tally + . += item_tally if(CE_SLOWDOWN in chem_effects) - if (tally >= 0 ) - tally = (tally + tally/4) //Add a quarter of penalties on top. - tally += chem_effects[CE_SLOWDOWN] + if (. >= 0 ) + . *= 1.25 //Add a quarter of penalties on top. + . += chem_effects[CE_SLOWDOWN] if(CE_SPEEDBOOST in chem_effects) - if (tally >= 0) // cut any penalties in half - tally = tally/2 - tally -= chem_effects[CE_SPEEDBOOST] // give 'em a buff on top. + if (. >= 0) // cut any penalties in half + . *= 0.5 + . -= chem_effects[CE_SPEEDBOOST] // give 'em a buff on top. - return max(HUMAN_LOWEST_SLOWDOWN, tally+config.human_delay) // Minimum return should be the same as force_max_speed + . = max(HUMAN_LOWEST_SLOWDOWN, . + config.human_delay) // Minimum return should be the same as force_max_speed + . += ..() + +/mob/living/carbon/human/Moved() + . = ..() + if(embedded_flag) + handle_embedded_objects() //Moving with objects stuck in you can cause bad times. // This calculates the amount of slowdown to receive from items worn. This does NOT include species modifiers. // It is in a seperate place to avoid an infinite loop situation with dragging mobs dragging each other. @@ -204,6 +208,8 @@ // Handle footstep sounds /mob/living/carbon/human/handle_footstep(var/turf/T) + if(!istype(T)) + return if(is_incorporeal()) return if(!config.footstep_volume || !T.footstep_sounds || !T.footstep_sounds.len) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index a0aa2363b8..fbd585fe6b 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -72,7 +72,7 @@ else failed = 1 - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/pierce.ogg', 25, 1, -1) if(failed) src.Weaken(rand(2,4)) diff --git a/code/modules/mob/living/carbon/human/human_resist.dm b/code/modules/mob/living/carbon/human/human_resist.dm index 56d42c1a15..f9ef85c94b 100644 --- a/code/modules/mob/living/carbon/human/human_resist.dm +++ b/code/modules/mob/living/carbon/human/human_resist.dm @@ -1,30 +1,7 @@ -/mob/living/carbon/human/process_resist() - //drop && roll - if((on_fire || has_modifier_of_type(/datum/modifier/fire)) && !buckled) - adjust_fire_stacks(-1.2) - Weaken(3) - spin(32,2) - visible_message( - "[src] rolls on the floor, trying to put themselves out!", - "You stop, drop, and roll!" - ) - sleep(30) - if(fire_stacks <= 0 && !(has_modifier_of_type(/datum/modifier/fire))) - visible_message( - "[src] has successfully extinguished themselves!", - "You extinguish yourself." - ) - ExtinguishMob() - return TRUE - - if(handcuffed) - spawn() escape_handcuffs() - else if(legcuffed) - spawn() escape_legcuffs() - else if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) - spawn() escape_straight_jacket() - else - ..() +/mob/living/carbon/human/resist_restraints() + if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) + return escape_straight_jacket() + return ..() #define RESIST_ATTACK_DEFAULT 0 #define RESIST_ATTACK_CLAWS 1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 0d9e58b7cb..379dfd4b8f 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -172,7 +172,7 @@ This saves us from having to call add_fingerprint() any time something is put in handcuffed = null if(buckled && buckled.buckle_require_restraints) buckled.unbuckle_mob() - update_inv_handcuffed() + update_handcuffed() else if (W == legcuffed) legcuffed = null update_inv_legcuffed() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index b51a506d51..8001e5bd4f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -25,12 +25,6 @@ #define HUMAN_COMBUSTION_TEMP 524 //524k is the sustained combustion temperature of human fat /mob/living/carbon/human - var/oxygen_alert = 0 - var/phoron_alert = 0 - var/co2_alert = 0 - var/fire_alert = 0 - var/pressure_alert = 0 - var/temperature_alert = 0 var/in_stasis = 0 var/heartbeat = 0 @@ -46,7 +40,6 @@ //code. Very ugly. I dont care. Moving this stuff here so its easy //to find it. blinded = 0 - fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. //TODO: seperate this out // update the current life tick, can be used to e.g. only do something every 4 ticks @@ -58,8 +51,8 @@ ..() - if(life_tick%30==15) - hud_updateflag = 1022 + if(life_tick % 30) + hud_updateflag = (1 << TOTAL_HUDS) - 1 voice = GetVoice() @@ -90,7 +83,7 @@ else if(stat == DEAD && !stasis) handle_defib_timer() - if(!handle_some_updates()) + if(skip_some_updates()) return //We go ahead and process them 5 times for HUD images and other stuff though. //Update our name based on whether our face is obscured/disfigured @@ -98,10 +91,10 @@ pulse = handle_pulse() -/mob/living/carbon/human/proc/handle_some_updates() +/mob/living/carbon/human/proc/skip_some_updates() if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle - return 0 - return 1 + return 1 + return 0 /mob/living/carbon/human/breathe() if(!inStasisNow()) @@ -377,8 +370,7 @@ if(suiciding) failed_last_breath = 1 adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster - oxygen_alert = max(oxygen_alert, 1) - suiciding -- + suiciding-- return 0 if(does_not_breathe) @@ -398,9 +390,10 @@ if(!L.is_bruised() && prob(8)) rupture_lung() - oxygen_alert = max(oxygen_alert, 1) - + throw_alert("pressure", /obj/screen/alert/lowpressure) return 0 + else + clear_alert("pressure") var/safe_pressure_min = species.minimum_breath_pressure // Minimum safe partial pressure of breathable gas in kPa @@ -459,6 +452,7 @@ var/inhale_pp = (inhaling/breath.total_moles)*breath_pressure var/toxins_pp = (poison/breath.total_moles)*breath_pressure + // To be clear, this isn't how much they're exhaling -- it's the amount of the species exhale_gas that they just var/exhaled_pp = (exhaling/breath.total_moles)*breath_pressure // Not enough to breathe @@ -471,10 +465,23 @@ adjustOxyLoss(max(HUMAN_MAX_OXYLOSS*(1-ratio), 0)) failed_inhale = 1 - oxygen_alert = max(oxygen_alert, 1) + switch(breath_type) + if("oxygen") + throw_alert("oxy", /obj/screen/alert/not_enough_oxy) + if("phoron") + throw_alert("oxy", /obj/screen/alert/not_enough_tox) + if("nitrogen") + throw_alert("oxy", /obj/screen/alert/not_enough_nitro) + if("carbon_dioxide") + throw_alert("oxy", /obj/screen/alert/not_enough_co2) + if("volatile_fuel") + throw_alert("oxy", /obj/screen/alert/not_enough_fuel) + if("sleeping_agent") + throw_alert("oxy", /obj/screen/alert/not_enough_n2o) + else // We're in safe limits - oxygen_alert = 0 + clear_alert("oxy") inhaled_gas_used = inhaling/6 @@ -485,16 +492,15 @@ // Too much exhaled gas in the air if(exhaled_pp > safe_exhaled_max) - if (!co2_alert|| prob(15)) + if (prob(15)) var/word = pick("extremely dizzy","short of breath","faint","confused") to_chat(src, "You feel [word].") adjustOxyLoss(HUMAN_MAX_OXYLOSS) - co2_alert = 1 failed_exhale = 1 else if(exhaled_pp > safe_exhaled_max * 0.7) - if (!co2_alert || prob(1)) + if (!prob(1)) var/word = pick("dizzy","short of breath","faint","momentarily confused") to_chat(src, "You feel [word].") @@ -504,26 +510,22 @@ //give them some oxyloss, up to the limit - we don't want people falling unconcious due to CO2 alone until they're pretty close to safe_exhaled_max. if (getOxyLoss() < 50*ratio) adjustOxyLoss(HUMAN_MAX_OXYLOSS) - co2_alert = 1 failed_exhale = 1 else if(exhaled_pp > safe_exhaled_max * 0.6) - if (prob(0.3)) + if(prob(0.3)) var/word = pick("a little dizzy","short of breath") to_chat(src, "You feel [word].") - else - co2_alert = 0 - // Too much poison in the air. if(toxins_pp > safe_toxins_max) var/ratio = (poison/safe_toxins_max) * 10 if(reagents) reagents.add_reagent("toxin", CLAMP(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) breath.adjust_gas(poison_type, -poison/6, update = 0) //update after - phoron_alert = max(phoron_alert, 1) + throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) else - phoron_alert = 0 + clear_alert("tox_in_air") // If there's some other shit in the air lets deal with it here. if(breath.gas["sleeping_agent"]) @@ -566,25 +568,24 @@ if(breath.temperature >= species.breath_heat_level_1) if(breath.temperature < species.breath_heat_level_2) apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Heat") - fire_alert = max(fire_alert, 2) + throw_alert("temp", /obj/screen/alert/hot, 1) else if(breath.temperature < species.breath_heat_level_3) apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Heat") - fire_alert = max(fire_alert, 2) + throw_alert("temp", /obj/screen/alert/hot, 2) else apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Heat") - fire_alert = max(fire_alert, 2) + throw_alert("temp", /obj/screen/alert/hot, 3) else if(breath.temperature <= species.breath_cold_level_1) if(breath.temperature > species.breath_cold_level_2) apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold") - fire_alert = max(fire_alert, 1) + throw_alert("temp", /obj/screen/alert/cold, 1) else if(breath.temperature > species.breath_cold_level_3) apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold") - fire_alert = max(fire_alert, 1) + throw_alert("temp", /obj/screen/alert/cold, 2) else apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Cold") - fire_alert = max(fire_alert, 1) - + throw_alert("temp", /obj/screen/alert/cold, 3) //breathing in hot/cold air also heats/cools you a bit var/temp_adj = breath.temperature - bodytemperature @@ -606,6 +607,9 @@ else if(breath.temperature <= species.cold_discomfort_level) species.get_environment_discomfort(src,"cold") + else + clear_alert("temp") + breath.update_values() return 1 @@ -647,7 +651,7 @@ loc_temp = environment.temperature if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1) - pressure_alert = 0 + clear_alert("pressure") return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection (convection) @@ -668,7 +672,6 @@ // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature >= species.heat_level_1) //Body temperature is too hot. - fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode @@ -685,11 +688,9 @@ burn_dam = HEAT_DAMAGE_LEVEL_1 take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) else if(bodytemperature <= species.cold_level_1) //Body temperature is too cold. - fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode @@ -707,7 +708,6 @@ cold_dam = COLD_DAMAGE_LEVEL_1 take_overall_damage(burn=cold_dam, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) // Account for massive pressure differences. Done by Polymorph // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! @@ -717,13 +717,13 @@ if(adjusted_pressure >= species.hazard_high_pressure) var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure") - pressure_alert = 2 + throw_alert("pressure", /obj/screen/alert/highpressure, 2) else if(adjusted_pressure >= species.warning_high_pressure) - pressure_alert = 1 + throw_alert("pressure", /obj/screen/alert/highpressure, 1) else if(adjusted_pressure >= species.warning_low_pressure) - pressure_alert = 0 + clear_alert("pressure") else if(adjusted_pressure >= species.hazard_low_pressure) - pressure_alert = -1 + throw_alert("pressure", /obj/screen/alert/lowpressure, 1) else if( !(COLD_RESISTANCE in mutations)) take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") @@ -740,9 +740,9 @@ // Firesuits (Min protection = 0.2 atmospheres) decrease oxyloss to 1/5 adjustOxyLoss(pressure_dam) - pressure_alert = -2 + throw_alert("pressure", /obj/screen/alert/lowpressure, 2) else - pressure_alert = -1 + clear_alert("pressure") return @@ -928,7 +928,7 @@ //DO NOT CALL handle_statuses() from this proc, it's called from living/Life() as long as this returns a true value. /mob/living/carbon/human/handle_regular_status_updates() - if(!handle_some_updates()) + if(skip_some_updates()) return 0 if(status_flags & GODMODE) return 0 @@ -994,12 +994,14 @@ //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar. if(client || sleeping > 3) AdjustSleeping(-1) + throw_alert("asleep", /obj/screen/alert/asleep) if( prob(2) && health && !hal_crit ) spawn(0) emote("snore") //CONSCIOUS else set_stat(CONSCIOUS) + clear_alert("asleep") //Periodically double-check embedded_flag if(embedded_flag && !(life_tick % 10)) @@ -1031,19 +1033,24 @@ SetBlinded(0) blinded = 0 eye_blurry = 0 + clear_alert("blind") else if(!vision || vision.is_broken()) // Vision organs cut out or broken? Permablind. SetBlinded(1) blinded = 1 eye_blurry = 1 + throw_alert("blind", /obj/screen/alert/blind) else //You have the requisite organs if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own blinded = 1 + throw_alert("blind", /obj/screen/alert/blind) else if(eye_blind) // Blindness, heals slowly over time AdjustBlinded(-1) blinded = 1 + throw_alert("blind", /obj/screen/alert/blind) else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster eye_blurry = max(eye_blurry-3, 0) blinded = 1 + throw_alert("blind", /obj/screen/alert/blind) //blurry sight if(vision.is_bruised()) // Vision organs impaired? Permablurry. @@ -1198,79 +1205,41 @@ healths_ma.overlays += health_images healths.appearance = healths_ma - if(nutrition_icon) - switch(nutrition) - if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0" - if(350 to 450) nutrition_icon.icon_state = "nutrition1" - if(250 to 350) nutrition_icon.icon_state = "nutrition2" - if(150 to 250) nutrition_icon.icon_state = "nutrition3" - else nutrition_icon.icon_state = "nutrition4" - if(pressure) - pressure.icon_state = "pressure[pressure_alert]" + var/fat_alert = /obj/screen/alert/fat + var/hungry_alert = /obj/screen/alert/hungry + var/starving_alert = /obj/screen/alert/starving -// if(rest) //Not used with new UI -// if(resting || lying || sleeping) rest.icon_state = "rest1" -// else rest.icon_state = "rest0" - if(toxin) - if(hal_screwyhud == 4 || (phoron_alert && !does_not_breathe)) toxin.icon_state = "tox1" - else toxin.icon_state = "tox0" - if(oxygen) - if(hal_screwyhud == 3 || (oxygen_alert && !does_not_breathe)) oxygen.icon_state = "oxy1" - else oxygen.icon_state = "oxy0" - if(fire) - if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. - else fire.icon_state = "fire0" + if(isSynthetic()) + fat_alert = /obj/screen/alert/fat/synth + hungry_alert = /obj/screen/alert/hungry/synth + starving_alert = /obj/screen/alert/starving/synth - if(bodytemp) - if (!species) - switch(bodytemperature) //310.055 optimal body temp - if(370 to INFINITY) bodytemp.icon_state = "temp4" - if(350 to 370) bodytemp.icon_state = "temp3" - if(335 to 350) bodytemp.icon_state = "temp2" - if(320 to 335) bodytemp.icon_state = "temp1" - if(300 to 320) bodytemp.icon_state = "temp0" - if(295 to 300) bodytemp.icon_state = "temp-1" - if(280 to 295) bodytemp.icon_state = "temp-2" - if(260 to 280) bodytemp.icon_state = "temp-3" - else bodytemp.icon_state = "temp-4" + switch(nutrition) + if(450 to INFINITY) + throw_alert("nutrition", fat_alert) + // if(350 to 450) + // if(250 to 350) // Alternative more-detailed tiers, not used. + if(250 to 450) + clear_alert("nutrition") + if(150 to 250) + throw_alert("nutrition", hungry_alert) else - //TODO: precalculate all of this stuff when the species datum is created - var/base_temperature = species.body_temperature - if(base_temperature == null) //some species don't have a set metabolic temperature - base_temperature = (species.heat_level_1 + species.cold_level_1)/2 + throw_alert("nutrition", starving_alert) - var/temp_step - if (bodytemperature >= base_temperature) - temp_step = (species.heat_level_1 - base_temperature)/4 + if(blinded) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /obj/screen/alert/blind) + + else + clear_fullscreens() + clear_alert("blind") - if (bodytemperature >= species.heat_level_1) - bodytemp.icon_state = "temp4" - else if (bodytemperature >= base_temperature + temp_step*3) - bodytemp.icon_state = "temp3" - else if (bodytemperature >= base_temperature + temp_step*2) - bodytemp.icon_state = "temp2" - else if (bodytemperature >= base_temperature + temp_step*1) - bodytemp.icon_state = "temp1" - else - bodytemp.icon_state = "temp0" - - else if (bodytemperature < base_temperature) - temp_step = (base_temperature - species.cold_level_1)/4 - - if (bodytemperature <= species.cold_level_1) - bodytemp.icon_state = "temp-4" - else if (bodytemperature <= base_temperature - temp_step*3) - bodytemp.icon_state = "temp-3" - else if (bodytemperature <= base_temperature - temp_step*2) - bodytemp.icon_state = "temp-2" - else if (bodytemperature <= base_temperature - temp_step*1) - bodytemp.icon_state = "temp-1" - else - bodytemp.icon_state = "temp0" - - if(blinded) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - else clear_fullscreens() + if(blinded) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + + else if(!machine) + clear_fullscreens() if(disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription if(glasses) //to every /obj/item @@ -1283,6 +1252,11 @@ set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(druggy, "high", /obj/screen/fullscreen/high) + if(druggy) + throw_alert("high", /obj/screen/alert/high) + else + clear_alert("high") + if(config.welder_vision) var/found_welder if(species.short_sighted) @@ -1374,11 +1348,12 @@ if(machine) var/viewflags = machine.check_eye(src) - machine.apply_visual(src) if(viewflags < 0) reset_view(null, 0) else if(viewflags && !looking_elsewhere) sight |= viewflags + else + machine.apply_visual(src) else if(eyeobj) if(eyeobj.owner != src) diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 9e6a07d168..3a5c358720 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -92,4 +92,4 @@ /datum/unarmed_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = target.get_organ(zone) user.visible_message("[user] jumped up and down on \the [target]'s [affecting.name]!") - playsound(user.loc, attack_sound, 25, 1, -1) \ No newline at end of file + playsound(user, attack_sound, 25, 1, -1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm index a3a14f2aa1..030a0e0335 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm @@ -15,7 +15,6 @@ var/const/MAX_ACTIVE_TIME = 400 icon_state = "facehugger" item_state = "facehugger" w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4 - flags = PROXMOVE body_parts_covered = FACE|EYES throw_range = 5 diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index f9c68c331f..bfeaf73fde 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -121,7 +121,7 @@ if(check_alien_ability(50,1,O_RESIN)) visible_message("[src] has planted some alien weeds!") - new /obj/effect/alien/weeds/node(get_turf(src), "#321D37") + new /obj/effect/alien/weeds/node(get_turf(src), null, "#321D37") return /mob/living/carbon/human/proc/Spit(var/atom/A) @@ -144,7 +144,7 @@ P.firer = src P.old_style_target(A) P.fire() - playsound(loc, 'sound/weapons/pierce.ogg', 25, 0) + playsound(src, 'sound/weapons/pierce.ogg', 25, 0) else ..() @@ -295,7 +295,7 @@ src.visible_message("\The [src] leaps at [T]!") src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src) - playsound(src.loc, 'sound/voice/hiss5.ogg', 50, 1) + playsound(src, 'sound/voice/hiss5.ogg', 50, 1) sleep(5) diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 57001713e9..2f15a4ba49 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -91,7 +91,7 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = target.get_organ(zone) user.visible_message("[user] [pick(attack_verb)] [target] in the [affecting.name]!") - playsound(user.loc, attack_sound, 25, 1, -1) + playsound(user, attack_sound, 25, 1, -1) /datum/unarmed_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target) var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name[O_EYES] diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6753ba0896..61786782db 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -808,11 +808,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(QDESTROYING(src)) return + clear_alert("legcuffed") remove_layer(LEGCUFF_LAYER) if(!legcuffed) return //Not legcuffed, why bother. + throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) + overlays_standing[LEGCUFF_LAYER] = legcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER) apply_layer(LEGCUFF_LAYER) @@ -978,7 +981,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!depth || lying) return - overlays_standing[WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve + var/atom/A = loc // We'd better be swimming and on a turf + var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve + I.color = A.color + overlays_standing[WATER_LAYER] = I apply_layer(WATER_LAYER) diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index 248fe5c6a6..8af9d9e20d 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -1,173 +1,99 @@ -/mob/living/carbon/process_resist() - - //drop && roll - if(on_fire && !buckled) - adjust_fire_stacks(-1.2) - Weaken(3) - spin(32,2) +/mob/living/carbon/resist_fire() + adjust_fire_stacks(-1.2) + Weaken(3) + spin(32,2) + visible_message( + "[src] rolls on the floor, trying to put themselves out!", + "You stop, drop, and roll!" + ) + sleep(30) + if(fire_stacks <= 0) visible_message( - "[src] rolls on the floor, trying to put themselves out!", - "You stop, drop, and roll!" + "[src] has successfully extinguished themselves!", + "You extinguish yourself." ) - sleep(30) - if(fire_stacks <= 0) - visible_message( - "[src] has successfully extinguished themselves!", - "You extinguish yourself." - ) - ExtinguishMob() - return TRUE + ExtinguishMob() + return TRUE +/mob/living/carbon/resist_restraints() + var/obj/item/I = null if(handcuffed) - spawn() escape_handcuffs() + I = handcuffed else if(legcuffed) - spawn() escape_legcuffs() - else - ..() + I = legcuffed + + if(I) + setClickCooldown(100) + cuff_resist(I, cuff_break = can_break_cuffs()) -/mob/living/carbon/proc/escape_handcuffs() - //if(!(last_special <= world.time)) return +/mob/living/carbon/proc/reduce_cuff_time() + return FALSE - //This line represent a significant buff to grabs... - // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay - setClickCooldown(100) +/mob/living/carbon/proc/cuff_resist(obj/item/weapon/handcuffs/I, breakouttime = 1200, cuff_break = 0) + + if(istype(I)) + breakouttime = I.breakouttime - if(can_break_cuffs()) //Don't want to do a lot of logic gating here. - break_handcuffs() + var/displaytime = breakouttime / 10 + + var/reduceCuffTime = reduce_cuff_time() + if(reduceCuffTime) + breakouttime /= reduceCuffTime + displaytime /= reduceCuffTime + + if(cuff_break) + visible_message("[src] is trying to break [I]!", + "You attempt to break your [I]. (This will take around 5 seconds and you need to stand still)") + + if(do_after(src, 5 SECONDS, target = src, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) + if(!I || buckled) + return + visible_message("[src] manages to break [I]!", + "You successfully break your [I].") + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + if(I == handcuffed) + handcuffed = null + update_handcuffed() + else if(I == legcuffed) + legcuffed = null + update_inv_legcuffed() + + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() + + qdel(I) + else + to_chat(src, "You fail to break [I].") + return + + visible_message("[src] attempts to remove [I]!", + "You attempt to remove [I]. (This will take around [displaytime] seconds and you need to stand still)") + if(do_after(src, breakouttime, target = src, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN)) + visible_message("[src] manages to remove [I]!", + "You successfully remove [I].") + drop_from_inventory(I) + +/mob/living/carbon/resist_buckle() + if(!buckled) return - var/obj/item/weapon/handcuffs/HC = handcuffed + if(!restrained()) + return ..() - //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type - var/breakouttime = 1200 - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - //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... - if(istype(HC)) - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - - var/mob/living/carbon/human/H = src - if(istype(H) && H.gloves && istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig)) - breakouttime /= 2 - displaytime /= 2 - - visible_message( - "\The [src] attempts to remove \the [HC]!", - "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - ) - - if(do_after(src, breakouttime, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN)) - if(!handcuffed) - return - visible_message( - "\The [src] manages to remove \the [handcuffed]!", - "You successfully remove \the [handcuffed]." - ) - drop_from_inventory(handcuffed) - -/mob/living/carbon/proc/escape_legcuffs() - //if(!(last_special <= world.time)) return - - //This line represent a significant buff to grabs... - // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay setClickCooldown(100) - - if(can_break_cuffs()) //Don't want to do a lot of logic gating here. - break_legcuffs() - return - - var/obj/item/weapon/handcuffs/legcuffs/LC = legcuffed - - //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/handcuffs/legcuffs type - var/breakouttime = 1200 - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... - if(istype(LC)) - breakouttime = LC.breakouttime - displaytime = breakouttime / 600 //Minutes - - var/mob/living/carbon/human/H = src - if(istype(H) && H.shoes && istype(H.shoes,/obj/item/clothing/shoes/magboots/rig)) - breakouttime /= 2 - displaytime /= 2 - visible_message( - "\The [src] attempts to remove \the [LC]!", - "You attempt to remove \the [LC]. (This will take around [displaytime] minutes and you need to stand still)" + "[src] attempts to unbuckle themself!", + "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" ) - if(do_after(src, breakouttime, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN)) - if(!legcuffed) + if(do_after(src, 2 MINUTES, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) + if(!buckled) return - visible_message( - "\The [src] manages to remove \the [legcuffed]!", - "You successfully remove \the [legcuffed]." - ) - drop_from_inventory(legcuffed) - legcuffed = null - update_inv_legcuffed() + visible_message("[src] manages to unbuckle themself!", + "You successfully unbuckle yourself.") + buckled.user_unbuckle_mob(src, src) /mob/living/carbon/proc/can_break_cuffs() if(HULK in mutations) return 1 - -/mob/living/carbon/proc/break_handcuffs() - visible_message( - "[src] is trying to break \the [handcuffed]!", - "You attempt to break your [handcuffed.name]. (This will take around 5 seconds and you need to stand still)" - ) - - if(do_after(src, 5 SECONDS, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) - if(!handcuffed || buckled) - return - - visible_message( - "[src] manages to break \the [handcuffed]!", - "You successfully break your [handcuffed.name]." - ) - - say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - - qdel(handcuffed) - handcuffed = null - if(buckled && buckled.buckle_require_restraints) - buckled.unbuckle_mob() - update_inv_handcuffed() - -/mob/living/carbon/proc/break_legcuffs() - to_chat(src, "You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)") - visible_message("[src] is trying to break the legcuffs!") - - if(do_after(src, 5 SECONDS, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) - if(!legcuffed || buckled) - return - - visible_message( - "[src] manages to break the legcuffs!", - "You successfully break your legcuffs." - ) - - say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - - qdel(legcuffed) - legcuffed = null - update_inv_legcuffed() - -/mob/living/carbon/escape_buckle() - if(!buckled) return - - if(!restrained()) - ..() - else - setClickCooldown(100) - visible_message( - "[usr] attempts to unbuckle themself!", - "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" - ) - - if(do_after(usr, 2 MINUTES, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) - if(!buckled) - return - visible_message("[usr] manages to unbuckle themself!", - "You successfully unbuckle yourself.") - buckled.user_unbuckle_mob(src, src) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index aeab794552..ed74c02828 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,7 +8,7 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0) +/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null) if(Debug2) to_world_log("## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked].") if(!damage || (blocked >= 100)) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 22db034374..94c86ae2ba 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -127,49 +127,37 @@ onclose(user, "mob[name]") return -/mob/living/ret_grab(obj/effect/list_container/mobl/L as obj, flag) - if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) ))) - if (!( L )) - return null - else - return L.container - else - if (!( L )) - L = new /obj/effect/list_container/mobl( null ) - L.container += src - L.master = src - if (istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = l_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = r_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (!( flag )) - if (L.master == src) - var/list/temp = list( ) - temp += L.container - //L = null - qdel(L) - return temp - else - return L.container - return +/mob/living/ret_grab(var/list/L, var/mobchain_limit = 5) + // We're the first! + if(!L) + L = list() + + // Lefty grab! + if (istype(l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = l_hand + L |= G.affecting + if(mobchain_limit-- > 0) + G.affecting?.ret_grab(L, mobchain_limit) // Recurse! They can update the list. It's the same instance as ours. + + // Righty grab! + if (istype(r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = r_hand + L |= G.affecting + if(mobchain_limit-- > 0) + G.affecting?.ret_grab(L, mobchain_limit) // Same as lefty! + + // On all but the one not called by us, this will just be ignored. Oh well! + return L /mob/living/mode() set name = "Activate Held Object" set category = "Object" set src = usr - if(world.time <= next_click) // This isn't really a 'click' but it'll work for our purposes. + if(!checkClickCooldown()) return - - next_click = world.time + 1 + + setClickCooldown(1) if(istype(loc,/obj/mecha)) return diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index bf3de8f6b7..0c52b440bc 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -159,9 +159,14 @@ //Eyes if(sdisabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own SetBlinded(1) + throw_alert("blind", /obj/screen/alert/blind) else if(eye_blind) //blindness, heals slowly over time AdjustBlinded(-1) - else if(eye_blurry) //blurry eyes heal slowly + throw_alert("blind", /obj/screen/alert/blind) + else + clear_alert("blind") + + if(eye_blurry) //blurry eyes heal slowly eye_blurry = max(eye_blurry-1, 0) //Ears @@ -172,13 +177,11 @@ if(ear_damage < 100) adjustEarDamage(-0.05,-1) -//this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/handle_regular_hud_updates() if(!client) return 0 ..() - handle_vision() handle_darksight() handle_hud_icons() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0638df73e6..e1ff661e86 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -81,7 +81,7 @@ default behaviour is: return 0 /mob/living/Bump(atom/movable/AM) - if(now_pushing || !loc) + if(now_pushing || !loc || buckled == AM) return now_pushing = 1 if (istype(AM, /mob/living)) @@ -165,7 +165,7 @@ default behaviour is: if (!istype(AM, /atom/movable) || AM.anchored) if(confused && prob(50) && m_intent=="run") Weaken(2) - playsound(loc, "punch", 25, 1, -1) + playsound(src, "punch", 25, 1, -1) visible_message("[src] [pick("ran", "slammed")] into \the [AM]!") src.apply_damage(5, BRUTE) to_chat(src, "You just [pick("ran", "slammed")] into \the [AM]!") @@ -735,117 +735,89 @@ default behaviour is: return -/mob/living/Move(a, b, flag) - if (buckled && buckled.loc != a) //not updating position - if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling. - return buckled.Move(a, b) - else //Otherwise, no running around for you. +// Almost all of this handles pulling movables behind us +/mob/living/Move(atom/newloc, direct, movetime) + if(buckled && buckled.loc != newloc) //not updating position + if(!buckled.anchored && buckled.buckle_movable) + return buckled.Move(newloc, direct) + else return 0 - if (restrained()) + var/atom/movable/pullee = pulling + // Prior to our move it's already too far away + if(pullee && get_dist(src, pullee) > 1) + stop_pulling() + // Shenanigans! Pullee closed into locker for eg. + if(pullee && !isturf(pullee.loc) && pullee.loc != loc) + stop_pulling() + // Can't pull with no hands + if(restrained()) stop_pulling() + // Will move our mob (probably) + . = ..() // Moved() called at this point if successful - var/t7 = 1 - if (restrained()) - for(var/mob/living/M in range(src, 1)) - if ((M.pulling == src && M.stat == 0 && !( M.restrained() ))) - t7 = null - if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving))))) - var/turf/T = loc - . = ..() + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move + pulledby.stop_pulling() - if (pulling && pulling.loc) - if(!( isturf(pulling.loc) )) - stop_pulling() - return - - ///// - if(pulling && pulling.anchored) - stop_pulling() - return - - if (!restrained()) - var/diag = get_dir(src, pulling) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(src, pulling) > 1 || diag)) - if (isliving(pulling)) - var/mob/living/M = pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - - if(!istype(M.loc, /turf/space)) - var/area/A = get_area(M) - if(A.has_gravity) - //this is the gay blood on floor shit -- Added back -- Skie - if (M.lying && (prob(M.getBruteLoss() / 6))) - var/bloodtrail = 1 //Checks if it's possible to even spill blood - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.flags & NO_BLOOD) - bloodtrail = 0 - else - var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) - if(blood_volume < BLOOD_VOLUME_SURVIVE) - bloodtrail = 0 //Most of it's gone already, just leave it be - else - H.vessel.remove_reagent("blood", 1) - if(bloodtrail) - var/turf/location = M.loc - if(istype(location, /turf/simulated)) - location.add_blood(M) - //pull damage with injured people - if(prob(25)) - M.adjustBruteLoss(1) - visible_message("\The [M]'s [M.isSynthetic() ? "state worsens": "wounds open more"] from being dragged!") - if(M.pull_damage()) - if(prob(25)) - M.adjustBruteLoss(2) - visible_message("\The [M]'s [M.isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") - var/turf/location = M.loc - if (istype(location, /turf/simulated)) - var/bloodtrail = 1 //Checks if it's possible to even spill blood - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.flags & NO_BLOOD) - bloodtrail = 0 - else - var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) - if(blood_volume < BLOOD_VOLUME_SURVIVE) - bloodtrail = 0 //Most of it's gone already, just leave it be - else - H.vessel.remove_reagent("blood", 1) - if(bloodtrail) - if(istype(location, /turf/simulated)) - location.add_blood(M) - - if(get_dist(pulling.loc, T) > 1 || pulling.loc.z != T.z) - M.stop_pulling() - else - step(pulling, get_dir(pulling.loc, T)) - if(t) - M.start_pulling(t) - else - if (pulling) - if (istype(pulling, /obj/structure/window)) - var/obj/structure/window/W = pulling - if(W.is_fulltile()) - for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) - stop_pulling() - - if(get_dist(pulling.loc, T) > 1 || pulling.loc.z != T.z) // This is needed or else pulled objects can't get pushed away. - stop_pulling() - else - step(pulling, get_dir(pulling.loc, T)) - else - stop_pulling() - . = ..() - - if (s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. + if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. s_active.close(src) +/mob/living/proc/dragged(var/mob/living/dragger, var/oldloc) + var/area/A = get_area(src) + if(lying && !buckled && pull_damage() && A.has_gravity && (prob(getBruteLoss() * 200 / maxHealth))) + adjustBruteLoss(2) + visible_message("\The [src]'s [isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") + +/mob/living/Moved(var/atom/oldloc, direct, forced, movetime) + . = ..() + handle_footstep(loc) + + if(pulling) // we were pulling a thing and didn't lose it during our move. + var/pull_dir = get_dir(src, pulling) + + if(pulling.anchored || !isturf(pulling.loc)) + stop_pulling() + + else if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position + // If it is too far away or across z-levels from old location, stop pulling. + if(get_dist(pulling.loc, oldloc) > 1 || pulling.loc.z != oldloc?.z) + stop_pulling() + + // living might take damage from drags + else if(isliving(pulling)) + var/mob/living/M = pulling + M.dragged(src, oldloc) + + pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position + if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up + stop_pulling() + + if(!isturf(loc)) + return + else if(lastarea?.has_gravity == 0) + inertial_drift() + else if(!isspace(loc)) + inertia_dir = 0 + make_floating(0) + +/mob/living/proc/inertial_drift() + if(x > 1 && x < (world.maxx) && y > 1 && y < (world.maxy)) + if(Process_Spacemove(1)) + inertia_dir = 0 + return + + var/locthen = loc + spawn(5) + if(!anchored && !pulledby && loc == locthen) + var/stepdir = inertia_dir ? inertia_dir : last_move + if(!stepdir) + return + var/turf/T = get_step(src, stepdir) + if(!T) + return + Move(T, stepdir, 5) + /mob/living/proc/handle_footstep(turf/T) return FALSE @@ -853,55 +825,29 @@ default behaviour is: set name = "Resist" set category = "IC" - if(!incapacitated(INCAPACITATION_KNOCKOUT) && canClick()) + if(!incapacitated(INCAPACITATION_KNOCKOUT) && checkClickCooldown()) setClickCooldown(20) resist_grab() if(!weakened) process_resist() /mob/living/proc/process_resist() - //Getting out of someone's inventory. - if(istype(src.loc, /obj/item/weapon/holder)) - escape_inventory(src.loc) - return - //unbuckling yourself if(buckled) - spawn() escape_buckle() + resist_buckle() return TRUE - //Breaking out of a locker? - if( src.loc && (istype(src.loc, /obj/structure/closet)) ) - var/obj/structure/closet/C = loc - spawn() C.mob_breakout(src) + if(isobj(loc)) + var/obj/C = loc + C.container_resist(src) return TRUE -/mob/living/proc/escape_inventory(obj/item/weapon/holder/H) - if(H != src.loc) return - - var/mob/M = H.loc //Get our mob holder (if any). - - if(istype(M)) - M.drop_from_inventory(H) - to_chat(M, "\The [H] wriggles out of your grip!") - to_chat(src, "You wriggle out of \the [M]'s grip!") - - // Update whether or not this mob needs to pass emotes to contents. - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_mob/animal/borer) || istype(A,/obj/item/weapon/holder)) - return - - else if(istype(H.loc,/obj/item/clothing/accessory/holster)) - var/obj/item/clothing/accessory/holster/holster = H.loc - if(holster.holstered == H) - holster.clear_holster() - to_chat(src, "You extricate yourself from \the [holster].") - H.forceMove(get_turf(H)) - else if(istype(H.loc,/obj/item)) - to_chat(src, "You struggle free of \the [H.loc].") - H.forceMove(get_turf(H)) - -/mob/living/proc/escape_buckle() + else if(canmove) + if(on_fire) + resist_fire() //stop, drop, and roll + else + resist_restraints() +/mob/living/proc/resist_buckle() if(buckled) if(istype(buckled, /obj/vehicle)) var/obj/vehicle/vehicle = buckled @@ -917,6 +863,12 @@ default behaviour is: if(resisting) visible_message("[src] resists!") +/mob/living/proc/resist_fire() + return + +/mob/living/proc/resist_restraints() + return + /mob/living/verb/lay_down() set name = "Rest" set category = "IC" @@ -1026,7 +978,7 @@ default behaviour is: Stun(5) src.visible_message("[src] throws up!","You throw up!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs if(istype(T)) @@ -1239,9 +1191,7 @@ default behaviour is: //actually throw it! src.visible_message("[src] has thrown [item].") - if(!src.lastarea) - src.lastarea = get_area(src.loc) - if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0)) + if((isspace(src.loc)) || (src.lastarea?.has_gravity == 0)) src.inertia_dir = get_dir(target, src) step(src, inertia_dir) @@ -1319,3 +1269,11 @@ default behaviour is: BRAIN:[getBrainLoss()] "} + +/mob/living/update_gravity(has_gravity) + if(!ticker) + return + if(has_gravity) + clear_alert("weightless") + else + throw_alert("weightless", /obj/screen/alert/weightless) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5eeae44d68..4e4e227ad4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -209,7 +209,7 @@ damage *= 0.66 // Take 2/3s as much damage. visible_message("\The [B] [attack_verb] \the [src]!", "[attack_message]!") - playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) + playsound(src, 'sound/effects/attackblob.ogg', 50, 1) //Armor var/soaked = get_armor_soak(def_zone, armor_check, armor_pen) @@ -328,6 +328,7 @@ O.loc = src src.embedded += O src.verbs += /mob/proc/yank_out_object + throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) //This is called when the mob is thrown into a dense turf /mob/living/proc/turf_collision(var/turf/T, var/speed) @@ -366,6 +367,7 @@ if(fire_stacks > 0 && !on_fire) on_fire = 1 handle_light() + throw_alert("fire", /obj/screen/alert/fire) update_fire() /mob/living/proc/ExtinguishMob() @@ -373,6 +375,7 @@ on_fire = 0 fire_stacks = 0 handle_light() + clear_alert("fire") update_fire() if(has_modifier_of_type(/datum/modifier/fire)) diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 8256fe29a0..9407a7cb18 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -8,7 +8,10 @@ return !P.can_hit_target(src, P.permutated, src == P.original, TRUE) return (!mover.density || !density || lying) -/mob/living/SelfMove(turf/n, direct) +/mob/CanZASPass(turf/T, is_zone) + return ATMOS_PASS_YES + +/mob/living/SelfMove(turf/n, direct, movetime) // If on walk intent, don't willingly step into hazardous tiles. // Unless the walker is confused. if(m_intent == "walk" && confused <= 0) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c4e49e8b88..9b25e629cb 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -322,7 +322,7 @@ proc/get_radio_key_from_channel(var/channel) images_to_clients[I1] |= M.client M << I1 M.hear_say(message_pieces, verb, italics, src, speech_sound, sound_vol) - if(whispering) //Don't even bother with these unless whispering + if(whispering && !isobserver(M)) //Don't even bother with these unless whispering if(dst > message_range && dst <= w_scramble_range) //Inside whisper scramble range if(M.client) var/image/I2 = listening[M] || speech_bubble diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c0ea523b19..c740e92002 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -477,6 +477,19 @@ var/list/ai_verbs_default = list( else to_chat(src, "System error. Cannot locate [html_decode(href_list["trackname"])].") return + + if(href_list["trackbot"]) + var/mob/living/bot/target = locate(href_list["trackbot"]) in mob_list + if(target) + ai_actual_track(target) + else + to_chat(src, "Target is not on or near any active cameras on the station.") + return + + if(href_list["open"]) + var/mob/target = locate(href_list["open"]) in mob_list + if(target) + open_nearest_door(target) return @@ -814,6 +827,39 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/is_in_chassis() return istype(loc, /turf) +/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) // Rykka ports AI opening doors + if(!istype(target)) + return + + if(target && ai_actual_track(target)) + var/obj/machinery/door/airlock/A = null + + var/dist = -1 + for(var/obj/machinery/door/airlock/D in range(3, target)) + if(!D.density) + continue + + var/curr_dist = get_dist(D, target) + + if(dist < 0) + dist = curr_dist + A = D + else if(dist > curr_dist) + dist = curr_dist + A = D + + if(istype(A)) + switch(alert(src, "Do you want to open \the [A] for [target]?", "Doorknob_v2a.exe", "Yes", "No")) + if("Yes") + A.AIShiftClick() + to_chat(src, "You open \the [A] for [target].") + else + to_chat(src, "You deny the request.") + else + to_chat(src, "Unable to locate an airlock near [target].") + + else + to_chat(src, "Target is not on or near any active cameras on the station.") /mob/living/silicon/ai/ex_act(var/severity) if(severity == 1.0) @@ -895,15 +941,20 @@ var/list/ai_verbs_default = list( jobname = "Unknown" var/track = "" - if(changed_voice) - if(impersonating) + if(changed_voice) // They have a fake name + if(impersonating) // And we found a mob with that name above, track them instead track = "[speaker_name] ([jobname])" - else + track += "\[OPEN\]" // Rykka ports AI opening doors + else // We couldn't find a mob with their fake name, don't track at all track = "[speaker_name] ([jobname])" - else - track = "[speaker_name] ([jobname])" + else // Not faking their name + if(istype(speaker, /mob/living/bot)) // It's a bot, and no fake name! (That'd be kinda weird.) :p + track = "[speaker_name] ([jobname])" + else // It's not a bot, and no fake name! + track = "[speaker_name] ([jobname])" + track += "\[OPEN\]" // Rykka ports AI opening doors - return track + return track // Feed variable back to AI /mob/living/silicon/ai/proc/relay_speech(mob/living/M, list/message_pieces, verb) var/message = combine_message(message_pieces, verb, M) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index ff3e340419..00a5e42993 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -23,7 +23,7 @@ message = "[src] beeps at [param]." else message = "[src] beeps." - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + playsound(src, 'sound/machines/twobeep.ogg', 50, 0) m_type = 1 if("ping") @@ -40,7 +40,7 @@ message = "[src] pings at [param]." else message = "[src] pings." - playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + playsound(src, 'sound/machines/ping.ogg', 50, 0) m_type = 1 if("buzz") @@ -57,7 +57,7 @@ message = "[src] buzzes at [param]." else message = "[src] buzzes." - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) m_type = 1 if("yes", "ye") @@ -74,7 +74,7 @@ message = "[src] emits an affirmative blip at [param]." else message = "[src] emits an affirmative blip." - playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0) + playsound(src, 'sound/machines/synth_yes.ogg', 50, 0) m_type = 1 if("dwoop") @@ -90,7 +90,7 @@ message = "[src] chirps happily at [param]" else message = "[src] chirps happily." - playsound(src.loc, 'sound/machines/dwoop.ogg', 50, 0) + playsound(src, 'sound/machines/dwoop.ogg', 50, 0) m_type = 1 if("no") @@ -107,7 +107,7 @@ message = "[src] emits a negative blip at [param]." else message = "[src] emits a negative blip." - playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0) + playsound(src, 'sound/machines/synth_no.ogg', 50, 0) m_type = 1 ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 0071586458..5de4e9c3e2 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -11,6 +11,7 @@ return laws.zeroth_law != null /mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg, notify = TRUE) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.set_zeroth_law(law, law_borg) if(notify) @@ -76,6 +77,7 @@ log_and_message_admins("cleared the supplied laws of [src]") /mob/living/silicon/proc/notify_of_law_change(message) + throw_alert("newlaw", /obj/screen/alert/newlaw) if((last_law_notification + 1 SECOND) > world.time) return last_law_notification = world.time diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index e159308d1b..e4f461179d 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -8,7 +8,7 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) M.show_message("The data cable rapidly retracts back into its spool.", 3, "You hear a click and the sound of wire spooling rapidly.", 2) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) qdel(src.cable) src.cable = null diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 7658ddc1bf..656e46aef7 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -127,7 +127,7 @@ var/list/mob_hat_cache = list() if(!module) module = new module_type(src) flavor_text = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '[using_map.company_name] Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + playsound(src, 'sound/machines/twobeep.ogg', 50, 0) //Redefining some robot procs... /mob/living/silicon/robot/drone/SetName(pickedName as text) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 403ee0ee0b..a3c46ab69a 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -123,7 +123,7 @@ if(istype(module,/obj/item/weapon/robot_module/robot/security)) message = "[src] shows its legal authorization barcode." - playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) + playsound(src, 'sound/voice/biamthelaw.ogg', 50, 0) m_type = 2 else to_chat(src, "You are not THE LAW, pal.") @@ -132,7 +132,7 @@ if(istype(module,/obj/item/weapon/robot_module/robot/security)) message = "[src] 's speakers skreech, \"Halt! Security!\"." - playsound(src.loc, 'sound/voice/halt.ogg', 50, 0) + playsound(src, 'sound/voice/halt.ogg', 50, 0) m_type = 2 else to_chat(src, "You are not security.") diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index c08945b3e1..102e2e3762 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -248,35 +248,22 @@ src.mind.special_role = "traitor" traitors.current_antagonists |= src.mind - if (src.cells) - if (src.cell) - var/cellcharge = src.cell.charge/src.cell.maxcharge - switch(cellcharge) - if(0.75 to INFINITY) - src.cells.icon_state = "charge4" - if(0.5 to 0.75) - src.cells.icon_state = "charge3" - if(0.25 to 0.5) - src.cells.icon_state = "charge2" - if(0 to 0.25) - src.cells.icon_state = "charge1" - else - src.cells.icon_state = "charge0" - else - src.cells.icon_state = "charge-empty" + update_cell() - if(bodytemp) - switch(src.bodytemperature) //310.055 optimal body temp - if(335 to INFINITY) - src.bodytemp.icon_state = "temp2" - if(320 to 335) - src.bodytemp.icon_state = "temp1" - if(300 to 320) - src.bodytemp.icon_state = "temp0" - if(260 to 300) - src.bodytemp.icon_state = "temp-1" + var/turf/T = get_turf(src) + var/datum/gas_mixture/environment = T.return_air() + if(environment) + switch(environment.temperature) //310.055 optimal body temp + if(400 to INFINITY) + throw_alert("temp", /obj/screen/alert/hot/robot, 2) + if(360 to 400) + throw_alert("temp", /obj/screen/alert/hot/robot, 1) + if(260 to 360) + clear_alert("temp") + if(200 to 260) + throw_alert("temp", /obj/screen/alert/cold/robot, 1) else - src.bodytemp.icon_state = "temp-2" + throw_alert("temp", /obj/screen/alert/cold/robot, 2) //Oxygen and fire does nothing yet!! // if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]" @@ -298,20 +285,43 @@ if(client && !client.adminobs) reset_view(null) + if(emagged) + throw_alert("hacked", /obj/screen/alert/hacked) + else + clear_alert("hacked") + return 1 +/mob/living/silicon/robot/proc/update_cell() + if(cell) + var/cellcharge = cell.charge/cell.maxcharge + switch(cellcharge) + if(0.75 to INFINITY) + clear_alert("charge") + if(0.5 to 0.75) + throw_alert("charge", /obj/screen/alert/lowcell, 1) + if(0.25 to 0.5) + throw_alert("charge", /obj/screen/alert/lowcell, 2) + if(0.01 to 0.25) + throw_alert("charge", /obj/screen/alert/lowcell, 3) + else + throw_alert("charge", /obj/screen/alert/emptycell) + else + throw_alert("charge", /obj/screen/alert/nocell) + + /mob/living/silicon/robot/proc/update_items() - if (src.client) - src.client.screen -= src.contents - for(var/obj/I in src.contents) + if(client) + client.screen -= contents + for(var/obj/I in contents) if(I && !(istype(I,/obj/item/weapon/cell) || istype(I,/obj/item/device/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/device/mmi))) - src.client.screen += I - if(src.module_state_1) - src.module_state_1:screen_loc = ui_inv1 - if(src.module_state_2) - src.module_state_2:screen_loc = ui_inv2 - if(src.module_state_3) - src.module_state_3:screen_loc = ui_inv3 + client.screen += I + if(module_state_1) + module_state_1:screen_loc = ui_inv1 + if(module_state_2) + module_state_2:screen_loc = ui_inv2 + if(module_state_3) + module_state_3:screen_loc = ui_inv3 updateicon() /mob/living/silicon/robot/proc/process_killswitch() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a0327a134c..580d232644 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -34,7 +34,6 @@ //Hud stuff - var/obj/screen/cells = null var/obj/screen/inv1 = null var/obj/screen/inv2 = null var/obj/screen/inv3 = null @@ -900,19 +899,19 @@ // They stay locked down if their wire is cut. if(wires.LockedCut()) state = 1 + if(state) + throw_alert("locked", /obj/screen/alert/locked) + else + clear_alert("locked") lockdown = state lockcharge = state update_canmove() /mob/living/silicon/robot/mode() - set name = "Activate Held Object" - set category = "IC" - set src = usr - - if(world.time <= next_click) // Hard check, before anything else, to avoid crashing + if(!checkClickCooldown()) return - next_click = world.time + 1 + setClickCooldown(1) var/obj/item/W = get_active_hand() if (W) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index a4a3c8c14b..78d741b012 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -27,7 +27,7 @@ if(confirm == "Yes" && !QDELETED(loaded_item)) //This is pretty copypasta-y to_chat(user, "You activate the analyzer's microlaser, analyzing \the [loaded_item] and breaking it down.") flick("portable_analyzer_scan", src) - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + playsound(src, 'sound/items/Welder2.ogg', 50, 1) for(var/T in loaded_item.origin_tech) files.UpdateTech(T, loaded_item.origin_tech[T]) to_chat(user, "\The [loaded_item] had level [loaded_item.origin_tech[T]] in [CallTechName(T)].") @@ -63,10 +63,10 @@ files.RefreshResearch() if(success) to_chat(user, "You connect to the research server, push your data upstream to it, then pull the resulting merged data from the master branch.") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) else to_chat(user, "Reserch server ping response timed out. Unable to connect. Please contact the system administrator.") - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 1) if(response == "Eject") if(loaded_item) loaded_item.loc = get_turf(src) @@ -276,7 +276,7 @@ var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode") if(!choice) return - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + playsound(src, 'sound/effects/pop.ogg', 50, 0) switch(choice) @@ -486,7 +486,7 @@ return stored_doors++ qdel(A) - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + playsound(src, 'sound/machines/hiss.ogg', 75, 1) visible_message("\The [user] deflates \the [A] with \the [src]!") return if(istype(A, /obj/item/inflatable)) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 1f8f439ddf..5ebf20e6d7 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -15,17 +15,17 @@ //No longer needed, but I'll leave it here incase we plan to re-use it. /mob/living/silicon/robot/movement_delay() - var/tally = 0 //Incase I need to add stuff other than "speed" later - - tally = speed + . = speed if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) - tally-=3 + . -= 3 - return tally+config.robot_delay + . += config.robot_delay + + . += ..() // NEW: Use power while moving. -/mob/living/silicon/robot/SelfMove(turf/n, direct) +/mob/living/silicon/robot/SelfMove(turf/n, direct, movetime) if (!is_component_functioning("actuator")) return 0 @@ -33,52 +33,52 @@ if (cell_use_power(A.active_usage)) return ..() -/mob/living/silicon/robot/Move(a, b, flag) - +/mob/living/silicon/robot/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(module) - if(module.type == /obj/item/weapon/robot_module/robot/janitor) - var/turf/tile = loc - if(isturf(tile)) - tile.clean_blood() - if (istype(tile, /turf/simulated)) - var/turf/simulated/S = tile - S.dirt = 0 - for(var/A in tile) - if(istype(A, /obj/effect)) - if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) - qdel(A) - else if(istype(A, /obj/item)) - var/obj/item/cleaned_item = A - cleaned_item.clean_blood() - else if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.lying) - if(cleaned_human.head) - cleaned_human.head.clean_blood() - cleaned_human.update_inv_head(0) - if(cleaned_human.wear_suit) - cleaned_human.wear_suit.clean_blood() - cleaned_human.update_inv_wear_suit(0) - else if(cleaned_human.w_uniform) - cleaned_human.w_uniform.clean_blood() - cleaned_human.update_inv_w_uniform(0) - if(cleaned_human.shoes) - cleaned_human.shoes.clean_blood() - cleaned_human.update_inv_shoes(0) - cleaned_human.clean_blood(1) - to_chat(cleaned_human, "[src] cleans your face!") + if(!module) + return - if((module_state_1 && istype(module_state_1, /obj/item/weapon/storage/bag/ore)) || (module_state_2 && istype(module_state_2, /obj/item/weapon/storage/bag/ore)) || (module_state_3 && istype(module_state_3, /obj/item/weapon/storage/bag/ore))) //Borgs and drones can use their mining bags ~automagically~ if they're deployed in a slot. Only mining bags, as they're optimized for mass use. - var/obj/item/weapon/storage/bag/ore/B = null - if(istype(module_state_1, /obj/item/weapon/storage/bag/ore)) //First orebag has priority, if they for some reason have multiple. - B = module_state_1 - else if(istype(module_state_2, /obj/item/weapon/storage/bag/ore)) - B = module_state_2 - else if(istype(module_state_3, /obj/item/weapon/storage/bag/ore)) - B = module_state_3 - var/turf/tile = loc - if(isturf(tile)) - B.gather_all(tile, src, 1) //Shhh, unless the bag fills, don't spam the borg's chat with stuff that's going on every time they move! - return \ No newline at end of file + //Borgs and drones can use their mining bags ~automagically~ if they're deployed in a slot. Only mining bags, as they're optimized for mass use. + if(istype(module_state_1, /obj/item/weapon/storage/bag/ore) || istype(module_state_2, /obj/item/weapon/storage/bag/ore) || istype(module_state_3, /obj/item/weapon/storage/bag/ore)) + var/obj/item/weapon/storage/bag/ore/B = null + if(istype(module_state_1, /obj/item/weapon/storage/bag/ore)) //First orebag has priority, if they for some reason have multiple. + B = module_state_1 + else if(istype(module_state_2, /obj/item/weapon/storage/bag/ore)) + B = module_state_2 + else if(istype(module_state_3, /obj/item/weapon/storage/bag/ore)) + B = module_state_3 + var/turf/tile = loc + if(isturf(tile)) + B.gather_all(tile, src, 1) //Shhh, unless the bag fills, don't spam the borg's chat with stuff that's going on every time they move! + + if(istype(module, /obj/item/weapon/robot_module/robot/janitor) && isturf(loc)) + var/turf/tile = loc + tile.clean_blood() + if (istype(tile, /turf/simulated)) + var/turf/simulated/S = tile + S.dirt = 0 + for(var/A in tile) + if(istype(A, /obj/effect)) + if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) + qdel(A) + else if(istype(A, /obj/item)) + var/obj/item/cleaned_item = A + cleaned_item.clean_blood() + else if(istype(A, /mob/living/carbon/human)) + var/mob/living/carbon/human/cleaned_human = A + if(cleaned_human.lying) + if(cleaned_human.head) + cleaned_human.head.clean_blood() + cleaned_human.update_inv_head(0) + if(cleaned_human.wear_suit) + cleaned_human.wear_suit.clean_blood() + cleaned_human.update_inv_wear_suit(0) + else if(cleaned_human.w_uniform) + cleaned_human.w_uniform.clean_blood() + cleaned_human.update_inv_w_uniform(0) + if(cleaned_human.shoes) + cleaned_human.shoes.clean_blood() + cleaned_human.update_inv_shoes(0) + cleaned_human.clean_blood(1) + to_chat(cleaned_human, "[src] cleans your face!") diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm index 2f4ca0e56b..c605584aa0 100644 --- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm @@ -17,9 +17,9 @@ GLOBAL_LIST_EMPTY(available_ai_shells) /mob/living/silicon/robot/proc/post_mmi_setup() if(istype(mmi, /obj/item/device/mmi/inert/ai_remote)) make_shell() - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + playsound(src, 'sound/machines/twobeep.ogg', 50, 0) else - playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) + playsound(src, 'sound/voice/liveagain.ogg', 75, 1) return /mob/living/silicon/robot/proc/make_shell() diff --git a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm index 255eef5318..23e4aa81ea 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm @@ -24,4 +24,4 @@ laws = new /datum/ai_laws/gravekeeper() - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0) diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm index d374562230..0460226f3f 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm @@ -21,7 +21,7 @@ if(!cell) cell = new /obj/item/weapon/cell/high(src) // 15k cell, as recharging stations are a lot more rare on the Surface. - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0) /mob/living/silicon/robot/lost/speech_bubble_appearance() return "synthetic_evil" diff --git a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm index 76496f4d4c..00e75248c7 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm @@ -25,7 +25,7 @@ radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio) radio.recalculateChannels() - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0) /mob/living/silicon/robot/syndicate/protector/init() ..() diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index acd441171b..c52755e696 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -25,4 +25,4 @@ radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio) radio.recalculateChannels() - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0) diff --git a/code/modules/mob/living/simple_mob/combat.dm b/code/modules/mob/living/simple_mob/combat.dm index 046a4ef988..7a950bf11a 100644 --- a/code/modules/mob/living/simple_mob/combat.dm +++ b/code/modules/mob/living/simple_mob/combat.dm @@ -143,7 +143,7 @@ if(do_after(src, reload_time)) if(reload_sound) - playsound(src.loc, reload_sound, 50, 1) + playsound(src, reload_sound, 50, 1) reload_count = 0 . = TRUE else diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index a8234ac970..d94d83c0a9 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -163,7 +163,7 @@ return 0 apply_damage(damage = shock_damage, damagetype = BURN, def_zone = null, blocked = null, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) - playsound(loc, "sparks", 50, 1, -1) + playsound(src, "sparks", 50, 1, -1) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, loc) diff --git a/code/modules/mob/living/simple_mob/life.dm b/code/modules/mob/living/simple_mob/life.dm index 4c063e4bd9..88b7e1f332 100644 --- a/code/modules/mob/living/simple_mob/life.dm +++ b/code/modules/mob/living/simple_mob/life.dm @@ -52,19 +52,14 @@ healths.icon_state = "health7" //Updates the nutrition while we're here - if(nutrition_icon) - var/food_per = (nutrition / initial(nutrition)) * 100 - switch(food_per) - if(90 to INFINITY) - nutrition_icon.icon_state = "nutrition0" - if(75 to 90) - nutrition_icon.icon_state = "nutrition1" - if(50 to 75) - nutrition_icon.icon_state = "nutrition2" - if(25 to 50) - nutrition_icon.icon_state = "nutrition3" - if(0 to 25) - nutrition_icon.icon_state = "nutrition4" + var/food_per = (nutrition / initial(nutrition)) * 100 + switch(food_per) + if(90 to INFINITY) + clear_alert("nutrition") + if(50 to 90) + throw_alert("nutrition", /obj/screen/alert/hungry) + if(-INFINITY to 50) + throw_alert("nutrition", /obj/screen/alert/starving) // Override for special bullshit. /mob/living/simple_mob/proc/handle_special() @@ -91,54 +86,55 @@ if( abs(Environment.temperature - bodytemperature) > 40 ) bodytemperature += ((Environment.temperature - bodytemperature) / 5) - if(min_oxy) - if(Environment.gas["oxygen"] < min_oxy) - atmos_unsuitable = 1 - if(max_oxy) - if(Environment.gas["oxygen"] > max_oxy) - atmos_unsuitable = 1 - if(min_tox) - if(Environment.gas["phoron"] < min_tox) - atmos_unsuitable = 2 - if(max_tox) - if(Environment.gas["phoron"] > max_tox) - atmos_unsuitable = 2 - if(min_n2) - if(Environment.gas["nitrogen"] < min_n2) - atmos_unsuitable = 1 - if(max_n2) - if(Environment.gas["nitrogen"] > max_n2) - atmos_unsuitable = 1 - if(min_co2) - if(Environment.gas["carbon_dioxide"] < min_co2) - atmos_unsuitable = 1 - if(max_co2) - if(Environment.gas["carbon_dioxide"] > max_co2) - atmos_unsuitable = 1 + if(min_oxy && Environment.gas["oxygen"] < min_oxy) + atmos_unsuitable = 1 + throw_alert("oxy", /obj/screen/alert/not_enough_oxy) + else if(max_oxy && Environment.gas["oxygen"] > max_oxy) + atmos_unsuitable = 1 + throw_alert("oxy", /obj/screen/alert/too_much_oxy) + else + clear_alert("oxy") + + if(min_tox && Environment.gas["phoron"] < min_tox) + atmos_unsuitable = 2 + throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox) + else if(max_tox && Environment.gas["phoron"] > max_tox) + atmos_unsuitable = 2 + throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) + else + clear_alert("tox_in_air") + + if(min_n2 && Environment.gas["nitrogen"] < min_n2) + atmos_unsuitable = 1 + throw_alert("n2o", /obj/screen/alert/not_enough_nitro) + else if(max_n2 && Environment.gas["nitrogen"] > max_n2) + atmos_unsuitable = 1 + throw_alert("n2o", /obj/screen/alert/too_much_nitro) + else + clear_alert("n2o") + + if(min_co2 && Environment.gas["carbon_dioxide"] < min_co2) + atmos_unsuitable = 1 + throw_alert("co2", /obj/screen/alert/not_enough_co2) + else if(max_co2 && Environment.gas["carbon_dioxide"] > max_co2) + atmos_unsuitable = 1 + throw_alert("co2", /obj/screen/alert/too_much_co2) + else + clear_alert("co2") //Atmos effect if(bodytemperature < minbodytemp) - fire_alert = 2 adjustFireLoss(cold_damage_per_tick) - if(fire) - fire.icon_state = "fire1" + throw_alert("temp", /obj/screen/alert/cold, 3) else if(bodytemperature > maxbodytemp) - fire_alert = 1 adjustFireLoss(heat_damage_per_tick) - if(fire) - fire.icon_state = "fire2" + throw_alert("temp", /obj/screen/alert/hot, 3) else - fire_alert = 0 - if(fire) - fire.icon_state = "fire0" + clear_alert("temp") if(atmos_unsuitable) adjustOxyLoss(unsuitable_atoms_damage) - if(oxygen) - oxygen.icon_state = "oxy1" - else if(oxygen) - if(oxygen) - oxygen.icon_state = "oxy0" + else adjustOxyLoss(-unsuitable_atoms_damage) diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index fe851648b4..c16af17ae9 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -159,53 +159,7 @@ healths.screen_loc = ui_health hud_elements |= healths - //Oxygen dep icon - oxygen = new /obj/screen() - oxygen.icon = ui_style - oxygen.icon_state = "oxy0" - oxygen.name = "oxygen" - oxygen.screen_loc = ui_oxygen - hud_elements |= oxygen - //Toxins present icon - toxin = new /obj/screen() - toxin.icon = ui_style - toxin.icon_state = "tox0" - toxin.name = "toxin" - toxin.screen_loc = ui_toxin - hud_elements |= toxin - - //Fire warning - fire = new /obj/screen() - fire.icon = ui_style - fire.icon_state = "fire0" - fire.name = "fire" - fire.screen_loc = ui_fire - hud_elements |= fire - - //Pressure warning - pressure = new /obj/screen() - pressure.icon = ui_style - pressure.icon_state = "pressure0" - pressure.name = "pressure" - pressure.screen_loc = ui_pressure - hud_elements |= pressure - - //Body temp warning - bodytemp = new /obj/screen() - bodytemp.icon = ui_style - bodytemp.icon_state = "temp0" - bodytemp.name = "body temperature" - bodytemp.screen_loc = ui_temp - hud_elements |= bodytemp - - //Nutrition status - nutrition_icon = new /obj/screen() - nutrition_icon.icon = ui_style - nutrition_icon.icon_state = "nutrition0" - nutrition_icon.name = "nutrition" - nutrition_icon.screen_loc = ui_nutrition - hud_elements |= nutrition_icon pain = new /obj/screen( null ) diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 71e7736ebb..6a750ea518 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -67,7 +67,6 @@ var/maxbodytemp = 350 // Maximum of above var/heat_damage_per_tick = 3 // Amount of damage applied if animal's body temperature is higher than maxbodytemp var/cold_damage_per_tick = 2 // Same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp - var/fire_alert = 0 // 0 = fine, 1 = hot, 2 = cold var/min_oxy = 5 // Oxygen in moles, minimum, 0 is 'no minimum' var/max_oxy = 0 // Oxygen in moles, maximum, 0 is 'no maximum' @@ -194,7 +193,7 @@ . = ..() to_chat(src,"You are \the [src]. [player_msg]") -/mob/living/simple_mob/SelfMove(turf/n, direct) +/mob/living/simple_mob/SelfMove(turf/n, direct, movetime) var/turf/old_turf = get_turf(src) var/old_dir = dir . = ..() @@ -212,9 +211,7 @@ return ..() */ /mob/living/simple_mob/movement_delay() - var/tally = 0 //Incase I need to add stuff other than "speed" later - - tally = movement_cooldown + . = movement_cooldown if(force_max_speed) return -3 @@ -223,25 +220,27 @@ if(!isnull(M.haste) && M.haste == TRUE) return -3 if(!isnull(M.slowdown)) - tally += M.slowdown + . += M.slowdown // Turf related slowdown var/turf/T = get_turf(src) if(T && T.movement_cost && !hovering) // Flying mobs ignore turf-based slowdown. Aquatic mobs ignore water slowdown, and can gain bonus speed in it. if(istype(T,/turf/simulated/floor/water) && aquatic_movement) - tally -= aquatic_movement - 1 + . -= aquatic_movement - 1 else - tally += T.movement_cost + . += T.movement_cost if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. - if(tally <= 0) - tally = 1 - tally *= purge + if(. <= 0) + . = 1 + . *= purge if(m_intent == "walk") - tally *= 1.5 + . *= 1.5 - return tally+config.animal_delay + . += config.animal_delay + + . += ..() /mob/living/simple_mob/Stat() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm index 7ff82a8160..1e7991d6a2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm @@ -54,8 +54,8 @@ var/step = get_step_to(src, food, 0) Move(step) -/mob/living/simple_mob/animal/goat/Move() - ..() +/mob/living/simple_mob/animal/goat/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() if(!stat) for(var/obj/effect/plant/SV in loc) SV.die_off(1) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm index 15b04e119a..cb086c6ec3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm @@ -104,7 +104,7 @@ var/mob/living/L = A L.Weaken(cloaked_weaken_amount) to_chat(L, span("danger", "\The [src] ambushes you!")) - playsound(L, 'sound/weapons/spiderlunge.ogg', 75, 1) + playsound(src, 'sound/weapons/spiderlunge.ogg', 75, 1) uncloak() ..() // For the poison. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm index 31997d204c..53d4bd0d24 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm @@ -115,7 +115,7 @@ continue visible_message(span("danger","\The [src] erupts from underneath, and hits \the [L]!")) - playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) + playsound(src, 'sound/weapons/heavysmash.ogg', 75, 1) L.Weaken(3) overshoot = FALSE @@ -164,7 +164,7 @@ // Stun anyone in our way. for(var/mob/living/L in T) - playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) + playsound(src, 'sound/weapons/heavysmash.ogg', 75, 1) L.Weaken(2) // Get into the tile. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm index 5f4a4dc7e0..0ac8d54c2b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm @@ -93,7 +93,7 @@ var/was_stunned = L.incapacitated(INCAPACITATION_DISABLED) L.Weaken(weaken_amount) - playsound(L, 'sound/effects/break_stone.ogg', 75, 1) + playsound(src, 'sound/effects/break_stone.ogg', 75, 1) if(was_stunned) // Try to prevent chain-stuns by having them thrown. var/throwdir = get_dir(src, L) L.throw_at(get_edge_target_turf(L, throwdir), 5, 1, src) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index 9fbb2926bb..b2ff320b52 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -196,29 +196,15 @@ next = null ..() -/mob/living/simple_mob/animal/space/space_worm/Move() - var/attachementNextPosition = loc +/mob/living/simple_mob/animal/space/space_worm/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - if(previous) - if(previous.z != z) - previous.z_transitioning = TRUE - else - previous.z_transitioning = FALSE - previous.forceMove(attachementNextPosition) // None of this 'ripped in half by an airlock' business. - update_icon() - -/mob/living/simple_mob/animal/space/space_worm/forceMove() - var/attachementNextPosition = loc - . = ..() - if(.) - if(previous) - if(previous.z != z) - previous.z_transitioning = TRUE - else - previous.z_transitioning = FALSE - previous.forceMove(attachementNextPosition) // None of this 'ripped in half by an airlock' business. x 2 - update_icon() + if(previous) + if(previous.z != z) + previous.z_transitioning = TRUE + else + previous.z_transitioning = FALSE + previous.forceMove(old_loc) // None of this 'ripped in half by an airlock' business. + update_icon() /mob/living/simple_mob/animal/space/space_worm/head/Bump(atom/obstacle) if(open_maw && !stat && obstacle != previous) diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index 0b1dea13ff..69486a061d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -56,7 +56,7 @@ /mob/living/simple_mob/illusion/attack_hand(mob/living/carbon/human/M) if(!realistic) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(span("warning", "\The [M]'s hand goes through \the [src]!")) return else @@ -67,10 +67,10 @@ span("notice", "\The [M] hugs [src] to make [T.him] feel better!"), \ span("notice", "You hug [src] to make [T.him] feel better!") ) // slightly redundant as at the moment most mobs still use the normal gender var, but it works and future-proofs it - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(I_DISARM) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(span("danger", "\The [M] attempted to disarm [src]!")) M.do_attack_animation(src) @@ -86,7 +86,7 @@ if(realistic) return ..() - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(span("warning", "\The [user]'s [I] goes through \the [src]!")) return FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm index 5c6660e67c..2e014482f2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm @@ -32,7 +32,7 @@ movement_cooldown = 5 hovering = TRUE - base_attack_cooldown = 5 + base_attack_cooldown = 2.5 SECONDS projectiletype = /obj/item/projectile/energy/excavate projectilesound = 'sound/weapons/pulse3.ogg' diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm index 0129e6970a..4049ba0370 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm @@ -152,7 +152,7 @@ visible_message(span("warning", "\The [src] creates \an [energy_ball] around itself!")) - playsound(src.loc, 'sound/effects/lightning_chargeup.ogg', 100, 1, extrarange = 30) + playsound(src, 'sound/effects/lightning_chargeup.ogg', 100, 1, extrarange = 30) // Shock nearby things that aren't ourselves. for(var/i = 1 to 10) @@ -179,7 +179,7 @@ // Shoot a tesla bolt, and flashes people who are looking at the mecha without sufficent eye protection. visible_message(span("warning", "\The [energy_ball] explodes in a flash of light, sending a shock everywhere!")) - playsound(src.loc, 'sound/effects/lightningbolt.ogg', 100, 1, extrarange = 30) + playsound(src, 'sound/effects/lightningbolt.ogg', 100, 1, extrarange = 30) tesla_zap(src.loc, 5, ELECTRIC_ZAP_POWER, FALSE) for(var/mob/living/L in viewers(src)) if(L == src) diff --git a/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm b/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm index 30c891088c..404a209c60 100644 --- a/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm +++ b/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm @@ -38,6 +38,6 @@ /mob/living/simple_mob/animal/space/tree/death() ..(null,"is hacked into pieces!") - playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) new /obj/item/stack/material/wood(loc) qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm index 5144d22697..e2ef92e982 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral.dm @@ -69,7 +69,7 @@ sharp = TRUE /obj/item/projectile/icicle/on_impact(atom/A) - playsound(get_turf(A), "shatter", 70, 1) + playsound(A, "shatter", 70, 1) return ..() /obj/item/projectile/icicle/get_structure_damage() diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index 2b73efe8c1..b06baf71a3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -1,217 +1,217 @@ -// The top-level slime defines. Xenobio slimes and feral slimes will inherit from this. - -/mob/living/simple_mob/slime - name = "slime" - desc = "It's a slime." - tt_desc = "A Macrolimbus vulgaris" - icon = 'icons/mob/slime2.dmi' - icon_state = "slime baby" - icon_living = "slime baby" - icon_dead = "slime baby dead" - var/shiny = FALSE // If true, will add a 'shiny' overlay. - var/icon_state_override = null // Used for special slime appearances like the rainbow slime. - color = "#CACACA" - glow_range = 3 - glow_intensity = 2 - gender = NEUTER - - faction = "slime" // Note that slimes are hostile to other slimes of different color regardless of faction (unless Unified). - maxHealth = 150 - movement_cooldown = 0 - pass_flags = PASSTABLE - makes_dirt = FALSE // Goop - mob_class = MOB_CLASS_SLIME - - response_help = "pets" - - // Atmos stuff. - minbodytemp = T0C-30 - heat_damage_per_tick = 0 - cold_damage_per_tick = 40 - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - unsuitable_atoms_damage = 0 - shock_resist = 0.5 // Slimes are resistant to electricity, and it actually charges them. - taser_kill = FALSE - water_resist = 0 // Slimes are very weak to water. - - melee_damage_lower = 10 - melee_damage_upper = 15 - base_attack_cooldown = 10 // One attack a second. - attack_sound = 'sound/weapons/bite.ogg' - attacktext = list("glomped") - speak_emote = list("chirps") - friendly = list("pokes") - - ai_holder_type = /datum/ai_holder/simple_mob/melee - say_list_type = /datum/say_list/slime - - var/cores = 1 // How many cores you get when placed in a Processor. - var/obj/item/clothing/head/hat = null // The hat the slime may be wearing. - var/slime_color = "grey" // Used for updating the name and for slime color-ism. - var/unity = FALSE // If true, slimes will consider other colors as their own. Other slimes will see this slime as the same color as well. - var/coretype = /obj/item/slime_extract/grey // What core is inside the slime, and what you get from the processor. - var/reagent_injected = null // Some slimes inject reagents on attack. This tells the game what reagent to use. - var/injection_amount = 5 // This determines how much. - var/mood = ":3" // Icon to use to display 'mood', as an overlay. - - can_enter_vent_with = list(/obj/item/clothing/head) - -/datum/say_list/slime - speak = list("Blorp...", "Blop...") - emote_see = list("bounces", "jiggles", "sways") - emote_hear = list("squishes") - -/mob/living/simple_mob/slime/Initialize() - verbs += /mob/living/proc/ventcrawl - update_mood() - glow_color = color - handle_light() - update_icon() - return ..() - -/mob/living/simple_mob/slime/Destroy() - if(hat) - drop_hat() - return ..() - -/mob/living/simple_mob/slime/death() - // Make dead slimes stop glowing. - glow_toggle = FALSE - handle_light() - ..() - -/mob/living/simple_mob/slime/revive() - // Make revived slimes resume glowing. - glow_toggle = initial(glow_toggle) - handle_light() - ..() - -/mob/living/simple_mob/slime/update_icon() - ..() // Do the regular stuff first. - - if(stat != DEAD) - // General slime shine. - var/image/I = image(icon, src, "slime light") - I.appearance_flags = RESET_COLOR - add_overlay(I) - - // 'Shiny' overlay, for gemstone-slimes. - if(shiny) - I = image(icon, src, "slime shiny") - I.appearance_flags = RESET_COLOR - add_overlay(I) - - // Mood overlay. - I = image(icon, src, "aslime-[mood]") - I.appearance_flags = RESET_COLOR - add_overlay(I) - - // Hat simulator. - if(hat) - var/hat_state = hat.item_state ? hat.item_state : hat.icon_state - var/image/I = image('icons/mob/head.dmi', src, hat_state) - I.pixel_y = -7 // Slimes are small. - I.appearance_flags = RESET_COLOR - add_overlay(I) - -// Controls the 'mood' overlay. Overrided in subtypes for specific behaviour. -/mob/living/simple_mob/slime/proc/update_mood() - mood = "feral" // This is to avoid another override in the /feral subtype. - -/mob/living/simple_mob/slime/proc/unify() - unity = TRUE - -// Interface override, because slimes are supposed to attack other slimes of different color regardless of faction. -// (unless Unified, of course). -/mob/living/simple_mob/slime/IIsAlly(mob/living/L) - . = ..() - if(istype(L, /mob/living/simple_mob/slime)) // Slimes should care about their color subfaction compared to another's. - var/mob/living/simple_mob/slime/S = L - if(S.unity || src.unity) - return TRUE - if(S.slime_color == src.slime_color) - return TRUE - else - return FALSE - // The other stuff was already checked in parent proc, and the . variable will implicitly return the correct value. - -// Slimes regenerate passively. -/mob/living/simple_mob/slime/handle_special() - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - -// Clicked on by empty hand. -/mob/living/simple_mob/slime/attack_hand(mob/living/L) - if(L.a_intent == I_GRAB && hat) - remove_hat(L) - else - ..() - -// Clicked on while holding an object. -/mob/living/simple_mob/slime/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/clothing/head)) // Handle hat simulator. - give_hat(I, user) - return - - // Otherwise they're probably fighting the slime. - if(prob(25)) - visible_message(span("warning", "\The [user]'s [I] passes right through \the [src]!")) - user.setClickCooldown(user.get_attack_speed(I)) - return - ..() - -// Called when hit with an active slimebaton (or xeno taser). -// Subtypes react differently. -/mob/living/simple_mob/slime/proc/slimebatoned(mob/living/user, amount) - return - -// Hat simulator -/mob/living/simple_mob/slime/proc/give_hat(var/obj/item/clothing/head/new_hat, var/mob/living/user) - if(!istype(new_hat)) - to_chat(user, span("warning", "\The [new_hat] isn't a hat.")) - return - if(hat) - to_chat(user, span("warning", "\The [src] is already wearing \a [hat].")) - return - else - user.drop_item(new_hat) - hat = new_hat - new_hat.forceMove(src) - to_chat(user, span("notice", "You place \a [new_hat] on \the [src]. How adorable!")) - update_icon() - return - -/mob/living/simple_mob/slime/proc/remove_hat(var/mob/living/user) - if(!hat) - to_chat(user, "\The [src] doesn't have a hat to remove.") - else - hat.forceMove(get_turf(src)) - user.put_in_hands(hat) - to_chat(user, "You take away \the [src]'s [hat.name]. How mean.") - hat = null - update_icon() - -/mob/living/simple_mob/slime/proc/drop_hat() - if(!hat) - return - hat.forceMove(get_turf(src)) - hat = null - update_icon() - -/mob/living/simple_mob/slime/speech_bubble_appearance() - return "slime" - -/mob/living/simple_mob/slime/proc/squish() - playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) +// The top-level slime defines. Xenobio slimes and feral slimes will inherit from this. + +/mob/living/simple_mob/slime + name = "slime" + desc = "It's a slime." + tt_desc = "A Macrolimbus vulgaris" + icon = 'icons/mob/slime2.dmi' + icon_state = "slime baby" + icon_living = "slime baby" + icon_dead = "slime baby dead" + var/shiny = FALSE // If true, will add a 'shiny' overlay. + var/icon_state_override = null // Used for special slime appearances like the rainbow slime. + color = "#CACACA" + glow_range = 3 + glow_intensity = 2 + gender = NEUTER + + faction = "slime" // Note that slimes are hostile to other slimes of different color regardless of faction (unless Unified). + maxHealth = 150 + movement_cooldown = 0 + pass_flags = PASSTABLE + makes_dirt = FALSE // Goop + mob_class = MOB_CLASS_SLIME + + response_help = "pets" + + // Atmos stuff. + minbodytemp = T0C-30 + heat_damage_per_tick = 0 + cold_damage_per_tick = 40 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + unsuitable_atoms_damage = 0 + shock_resist = 0.5 // Slimes are resistant to electricity, and it actually charges them. + taser_kill = FALSE + water_resist = 0 // Slimes are very weak to water. + + melee_damage_lower = 10 + melee_damage_upper = 15 + base_attack_cooldown = 10 // One attack a second. + attack_sound = 'sound/weapons/bite.ogg' + attacktext = list("glomped") + speak_emote = list("chirps") + friendly = list("pokes") + + ai_holder_type = /datum/ai_holder/simple_mob/melee + say_list_type = /datum/say_list/slime + + var/cores = 1 // How many cores you get when placed in a Processor. + var/obj/item/clothing/head/hat = null // The hat the slime may be wearing. + var/slime_color = "grey" // Used for updating the name and for slime color-ism. + var/unity = FALSE // If true, slimes will consider other colors as their own. Other slimes will see this slime as the same color as well. + var/coretype = /obj/item/slime_extract/grey // What core is inside the slime, and what you get from the processor. + var/reagent_injected = null // Some slimes inject reagents on attack. This tells the game what reagent to use. + var/injection_amount = 5 // This determines how much. + var/mood = ":3" // Icon to use to display 'mood', as an overlay. + + can_enter_vent_with = list(/obj/item/clothing/head) + +/datum/say_list/slime + speak = list("Blorp...", "Blop...") + emote_see = list("bounces", "jiggles", "sways") + emote_hear = list("squishes") + +/mob/living/simple_mob/slime/Initialize() + verbs += /mob/living/proc/ventcrawl + update_mood() + glow_color = color + handle_light() + update_icon() + return ..() + +/mob/living/simple_mob/slime/Destroy() + if(hat) + drop_hat() + return ..() + +/mob/living/simple_mob/slime/death() + // Make dead slimes stop glowing. + glow_toggle = FALSE + handle_light() + ..() + +/mob/living/simple_mob/slime/revive() + // Make revived slimes resume glowing. + glow_toggle = initial(glow_toggle) + handle_light() + ..() + +/mob/living/simple_mob/slime/update_icon() + ..() // Do the regular stuff first. + + if(stat != DEAD) + // General slime shine. + var/image/I = image(icon, src, "slime light") + I.appearance_flags = RESET_COLOR + add_overlay(I) + + // 'Shiny' overlay, for gemstone-slimes. + if(shiny) + I = image(icon, src, "slime shiny") + I.appearance_flags = RESET_COLOR + add_overlay(I) + + // Mood overlay. + I = image(icon, src, "aslime-[mood]") + I.appearance_flags = RESET_COLOR + add_overlay(I) + + // Hat simulator. + if(hat) + var/hat_state = hat.item_state ? hat.item_state : hat.icon_state + var/image/I = image('icons/mob/head.dmi', src, hat_state) + I.pixel_y = -7 // Slimes are small. + I.appearance_flags = RESET_COLOR + add_overlay(I) + +// Controls the 'mood' overlay. Overrided in subtypes for specific behaviour. +/mob/living/simple_mob/slime/proc/update_mood() + mood = "feral" // This is to avoid another override in the /feral subtype. + +/mob/living/simple_mob/slime/proc/unify() + unity = TRUE + +// Interface override, because slimes are supposed to attack other slimes of different color regardless of faction. +// (unless Unified, of course). +/mob/living/simple_mob/slime/IIsAlly(mob/living/L) + . = ..() + if(istype(L, /mob/living/simple_mob/slime)) // Slimes should care about their color subfaction compared to another's. + var/mob/living/simple_mob/slime/S = L + if(S.unity || src.unity) + return TRUE + if(S.slime_color == src.slime_color) + return TRUE + else + return FALSE + // The other stuff was already checked in parent proc, and the . variable will implicitly return the correct value. + +// Slimes regenerate passively. +/mob/living/simple_mob/slime/handle_special() + adjustOxyLoss(-1) + adjustToxLoss(-1) + adjustFireLoss(-1) + adjustCloneLoss(-1) + adjustBruteLoss(-1) + +// Clicked on by empty hand. +/mob/living/simple_mob/slime/attack_hand(mob/living/L) + if(L.a_intent == I_GRAB && hat) + remove_hat(L) + else + ..() + +// Clicked on while holding an object. +/mob/living/simple_mob/slime/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/clothing/head)) // Handle hat simulator. + give_hat(I, user) + return + + // Otherwise they're probably fighting the slime. + if(prob(25)) + visible_message(span("warning", "\The [user]'s [I] passes right through \the [src]!")) + user.setClickCooldown(user.get_attack_speed(I)) + return + ..() + +// Called when hit with an active slimebaton (or xeno taser). +// Subtypes react differently. +/mob/living/simple_mob/slime/proc/slimebatoned(mob/living/user, amount) + return + +// Hat simulator +/mob/living/simple_mob/slime/proc/give_hat(var/obj/item/clothing/head/new_hat, var/mob/living/user) + if(!istype(new_hat)) + to_chat(user, span("warning", "\The [new_hat] isn't a hat.")) + return + if(hat) + to_chat(user, span("warning", "\The [src] is already wearing \a [hat].")) + return + else + user.drop_item(new_hat) + hat = new_hat + new_hat.forceMove(src) + to_chat(user, span("notice", "You place \a [new_hat] on \the [src]. How adorable!")) + update_icon() + return + +/mob/living/simple_mob/slime/proc/remove_hat(var/mob/living/user) + if(!hat) + to_chat(user, "\The [src] doesn't have a hat to remove.") + else + hat.forceMove(get_turf(src)) + user.put_in_hands(hat) + to_chat(user, "You take away \the [src]'s [hat.name]. How mean.") + hat = null + update_icon() + +/mob/living/simple_mob/slime/proc/drop_hat() + if(!hat) + return + hat.forceMove(get_turf(src)) + hat = null + update_icon() + +/mob/living/simple_mob/slime/speech_bubble_appearance() + return "slime" + +/mob/living/simple_mob/slime/proc/squish() + playsound(src, 'sound/effects/slime_squish.ogg', 50, 0) visible_message("\The [src] squishes!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm index ff055bae52..51266a6d88 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm @@ -1,54 +1,54 @@ -// Contains code for slimes getting attacked, beat, touched, etc, and reacting to that. - -// Clicked on by empty hand. -// Handles trying to wrestle a slime off of someone being eatten. -/mob/living/simple_mob/slime/xenobio/attack_hand(mob/living/L) - if(victim) // Are we eating someone? - var/fail_odds = 30 - if(victim == L) // Harder to get the slime off if it's you that is being eatten. - fail_odds = 60 - - if(prob(fail_odds)) - visible_message(span("warning", "\The [L] attempts to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(span("warning", "\The [L] manages to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(40)) - adjust_discipline(1) // Do this here so that it will be justified discipline. - stop_consumption() - step_away(src, L) - - else - ..() - -// Handles the actual harming by a melee weapon. -/mob/living/simple_mob/slime/xenobio/hit_with_weapon(obj/item/I, mob/living/user, effective_force, hit_zone) - ..() // Apply damage and etc. - if(!stat && effective_force > 0) - if(!is_justified_to_discipline()) // Wow, buddy, why am I getting attacked?? - adjust_discipline(1) // This builds resentment due to being unjustified. - - if(user in friends) // Friend attacking us for no reason. - if(prob(25)) - friends -= user - say("[user]... not friend...") - - else // We're actually being bad. - var/prob_to_back_down = round(effective_force) - if(is_adult) - prob_to_back_down /= 2 - if(prob(prob_to_back_down)) - adjust_discipline(2) // Justified. - -// Shocked grilles don't hurt slimes, and in fact give them charge. -/mob/living/simple_mob/slime/xenobio/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, def_zone = null) - power_charge = between(0, power_charge + round(shock_damage / 10), 10) - to_chat(src, span("notice", "\The [source] shocks you, and it charges you.")) - -// Getting slimebatoned/xenotased. -/mob/living/simple_mob/slime/xenobio/slimebatoned(mob/living/user, amount) - adjust_discipline(round(amount/2)) - Weaken(amount) // This needs to come afterwards or else it will always be considered abuse to the slime. +// Contains code for slimes getting attacked, beat, touched, etc, and reacting to that. + +// Clicked on by empty hand. +// Handles trying to wrestle a slime off of someone being eatten. +/mob/living/simple_mob/slime/xenobio/attack_hand(mob/living/L) + if(victim) // Are we eating someone? + var/fail_odds = 30 + if(victim == L) // Harder to get the slime off if it's you that is being eatten. + fail_odds = 60 + + if(prob(fail_odds)) + visible_message(span("warning", "\The [L] attempts to wrestle \the [name] off!")) + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + else + visible_message(span("warning", "\The [L] manages to wrestle \the [name] off!")) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + + if(prob(40)) + adjust_discipline(1) // Do this here so that it will be justified discipline. + stop_consumption() + step_away(src, L) + + else + ..() + +// Handles the actual harming by a melee weapon. +/mob/living/simple_mob/slime/xenobio/hit_with_weapon(obj/item/I, mob/living/user, effective_force, hit_zone) + ..() // Apply damage and etc. + if(!stat && effective_force > 0) + if(!is_justified_to_discipline()) // Wow, buddy, why am I getting attacked?? + adjust_discipline(1) // This builds resentment due to being unjustified. + + if(user in friends) // Friend attacking us for no reason. + if(prob(25)) + friends -= user + say("[user]... not friend...") + + else // We're actually being bad. + var/prob_to_back_down = round(effective_force) + if(is_adult) + prob_to_back_down /= 2 + if(prob(prob_to_back_down)) + adjust_discipline(2) // Justified. + +// Shocked grilles don't hurt slimes, and in fact give them charge. +/mob/living/simple_mob/slime/xenobio/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, def_zone = null) + power_charge = between(0, power_charge + round(shock_damage / 10), 10) + to_chat(src, span("notice", "\The [source] shocks you, and it charges you.")) + +// Getting slimebatoned/xenotased. +/mob/living/simple_mob/slime/xenobio/slimebatoned(mob/living/user, amount) + adjust_discipline(round(amount/2)) + Weaken(amount) // This needs to come afterwards or else it will always be considered abuse to the slime. diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 61748b54db..3859f40045 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -15,7 +15,7 @@ if(matches) matches += " and " matches += "ID ([client.computer_id])" if(!config.disable_cid_warn_popup) - spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") + spawn() alert("You appear to have logged in with another key this round, which is not permitted. Please contact an administrator if you believe this message to be in error.") if(matches) if(M.client) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) @@ -50,7 +50,6 @@ else client.eye = src client.perspective = MOB_PERSPECTIVE - reload_fullscreen() // Reload any fullscreen overlays this mob has. add_click_catcher() update_client_color() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1e0200d63d..7dde39e09c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -22,16 +22,10 @@ pullin = null purged = null internals = null - oxygen = null i_select = null m_select = null - toxin = null - fire = null - bodytemp = null healths = null throw_icon = null - nutrition_icon = null - pressure = null pain = null item_use_icon = null gun_move_icon = null @@ -45,6 +39,7 @@ dead_mob_list += src else living_mob_list += src + lastarea = get_area(src) update_transform() // Some mobs may start bigger or smaller than normal. return ..() @@ -138,9 +133,6 @@ return M return 0 -/mob/proc/movement_delay(oldloc, direct) - return 0 - /mob/proc/Life() // if(organStructure) // organStructure.ProcessOrgans() @@ -223,7 +215,7 @@ if((is_blind(src) || usr.stat) && !isobserver(src)) to_chat(src, "Something is there but you can't see it.") return 1 - + //Could be gone by the time they finally pick something if(!A) return 1 @@ -507,15 +499,6 @@ /mob/proc/pull_damage() - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.health - H.halloss <= config.health_threshold_softcrit) - for(var/name in H.organs_by_name) - var/obj/item/organ/external/e = H.organs_by_name[name] - if(e && H.lying) - if((e.status & ORGAN_BROKEN && (!e.splinted || (e.splinted && e.splinted in e.contents && prob(30))) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100)) - return 1 - break return 0 /mob/MouseDrop(mob/M as mob) @@ -737,12 +720,12 @@ /mob/proc/facedir(var/ndir) - if(!canface() || (client && (client.moving || (world.time < move_delay)))) + if(!canface() || (client && (client.moving || !checkMoveCooldown()))) return 0 set_dir(ndir) if(buckled && buckled.buckle_movable) buckled.set_dir(ndir) - move_delay += movement_delay() + setMoveCooldown(movement_delay()) return 1 @@ -905,7 +888,7 @@ mob/proc/yank_out_object() set desc = "Remove an embedded item at the cost of bleeding and pain." set src in view(1) - if(!isliving(usr) || !usr.canClick()) + if(!isliving(usr) || !usr.checkClickCooldown()) return usr.setClickCooldown(20) @@ -952,6 +935,7 @@ mob/proc/yank_out_object() valid_objects = get_visible_implants(0) if(valid_objects.len == 1) //Yanking out last object - removing verb. src.verbs -= /mob/proc/yank_out_object + clear_alert("embeddedobject") if(ishuman(src)) var/mob/living/carbon/human/H = src @@ -1223,3 +1207,11 @@ mob/proc/yank_out_object() /mob/proc/GetAltName() return "" + +/mob/proc/get_ghost(even_if_they_cant_reenter = 0) + if(mind) + return mind.get_ghost(even_if_they_cant_reenter) + +/mob/proc/grab_ghost(force) + if(mind) + return mind.grab_ghost(force = force) \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 27029f7e08..9faf05a26d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -3,12 +3,10 @@ layer = MOB_LAYER plane = MOB_PLANE animate_movement = 2 - flags = PROXMOVE var/datum/mind/mind var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak - var/move_delay = null // For movement speed delays. - var/next_move = null // For click delay, despite the misleading name. + var/next_move = null // world.time when mob is next allowed to self-move. //Not in use yet var/obj/effect/organstructure/organStructure = null @@ -17,16 +15,10 @@ var/obj/screen/pullin = null var/obj/screen/purged = null var/obj/screen/internals = null - var/obj/screen/oxygen = null var/obj/screen/i_select = null var/obj/screen/m_select = null - var/obj/screen/toxin = null - var/obj/screen/fire = null - var/obj/screen/bodytemp = null var/obj/screen/healths = null var/obj/screen/throw_icon = null - var/obj/screen/nutrition_icon = null - var/obj/screen/pressure = null var/obj/screen/pain = null var/obj/screen/gun/item/item_use_icon = null var/obj/screen/gun/radio/radio_use_icon = null diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 231e67692e..f326d5f4c5 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -231,8 +231,6 @@ return if(state == GRAB_UPGRADING) return - if(!assailant.canClick()) - return if(world.time < (last_action + UPGRADE_COOLDOWN)) return if(!assailant.canmove || assailant.lying) diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index 1702e73ec9..a7a9d45db7 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -108,7 +108,7 @@ target.apply_effect(20, PARALYZE) target.visible_message("[target] [target.species.get_knockout_message(target)]") - playsound(attacker.loc, "swing_hit", 25, 1, -1) + playsound(attacker, "swing_hit", 25, 1, -1) add_attack_logs(attacker,target,"Headbutted using grab") attacker.drop_from_inventory(src) @@ -121,7 +121,7 @@ to_chat(attacker, "You require a better grab to do this.") return if(target.grab_joint(attacker, target_zone)) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return /obj/item/weapon/grab/proc/pin_down(mob/target, mob/attacker) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index ea4259effd..9585be554e 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,11 +1,25 @@ /mob/proc/setMoveCooldown(var/timeout) - move_delay = max(world.time + timeout, move_delay) + next_move = max(world.time + timeout, next_move) -/mob/proc/check_move_cooldown() - if(world.time < src.move_delay) +/mob/proc/checkMoveCooldown() + if(world.time < next_move) return FALSE // Need to wait more. return TRUE +/mob/proc/movement_delay(oldloc, direct) + . = 0 + if(locate(/obj/item/weapon/grab) in src) + . += 5 + + // Movespeed delay based on movement mode + switch(m_intent) + if("run") + if(drowsyness > 0) + . += 6 + . += config.run_speed + if("walk") + . += config.walk_speed + /client/proc/client_dir(input, direction=-1) return turn(input, direction*dir2angle(dir)) @@ -108,202 +122,206 @@ mob.control_object.forceMove(get_step(mob.control_object,direct)) return - +// NB: This is called for 'self movement', not for being pulled or things like that, which COULD be the case for /mob/Move +// But to be honest, A LOT OF THIS CODE should be in /mob/Move /client/Move(n, direct) - if(!mob) - return // Moved here to avoid nullrefs below + // Prevents a double-datum lookup each time this is referenced + // May seem dumb, but it's faster to look up a var on my_mob than dereferencing mob on client, then dereferencing the var on that mob + // Having it in a var here means it's more available to look up things on. It won't speed up that second dereference, though. + var/mob/my_mob = mob - if(mob.control_object) Move_object(direct) + // Nothing to do in nullspace + if(!my_mob.loc) + return - if(mob.incorporeal_move && isobserver(mob)) + // Used many times below, faster reference. + var/atom/loc = my_mob.loc + + // We're controlling an object which is SOMEHOW DIFFERENT FROM AN EYE?? + if(my_mob.control_object) + Move_object(direct) + + // Ghosty mob movement + if(my_mob.incorporeal_move && isobserver(my_mob)) Process_Incorpmove(direct) return - if(moving) return 0 + // We're in the middle of another move we've already decided to do + if(moving) + return 0 - if(!mob.check_move_cooldown()) + // We're still cooling down from the last move + if(!my_mob.checkMoveCooldown()) return - if(locate(/obj/effect/stop/, mob.loc)) - for(var/obj/effect/stop/S in mob.loc) - if(S.victim == mob) - return - - if(mob.stat==DEAD && isliving(mob) && !mob.forbid_seeing_deadchat) - mob.ghostize() + // If dead and we try to move in our mob, it leaves our body + if(my_mob.stat == DEAD && isliving(my_mob) && !my_mob.forbid_seeing_deadchat) + my_mob.ghostize() return - // handle possible Eye movement - if(mob.eyeobj) - return mob.EyeMove(n,direct) + // If we have an eyeobj, it moves instead + if(my_mob.eyeobj) + return my_mob.EyeMove(n,direct) - if(mob.transforming) return//This is sota the goto stop mobs from moving var + // This is sota the goto stop mobs from moving var (for some reason) + if(my_mob.transforming) + return - if(isliving(mob)) - var/mob/living/L = mob + if(isliving(my_mob)) + var/mob/living/L = my_mob if(L.incorporeal_move)//Move though walls Process_Incorpmove(direct) return - if(mob.client) - if(mob.client.view != world.view) // If mob moves while zoomed in with device, unzoom them. - for(var/obj/item/item in mob.contents) - if(item.zoom) - item.zoom() - break - /* - if(locate(/obj/item/weapon/gun/energy/sniperrifle, mob.contents)) // If mob moves while zoomed in with sniper rifle, unzoom them. - var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in mob - if(s.zoom) - s.zoom() - if(locate(/obj/item/device/binoculars, mob.contents)) // If mob moves while zoomed in with binoculars, unzoom them. - var/obj/item/device/binoculars/b = locate() in mob - if(b.zoom) - b.zoom() - */ + /* TODO observer unzoom + if(view != world.view) // If mob moves while zoomed in with device, unzoom them. + for(var/obj/item/item in mob.contents) + if(item.zoom) + item.zoom() + break + */ - if(Process_Grab()) return - - if(!mob.canmove) + if(Process_Grab()) return - //if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV)) - // if(!mob.Process_Spacemove(0)) return 0 + // Can't move + if(!my_mob.canmove) + return - if(!mob.lastarea) - mob.lastarea = get_area(mob.loc) + // Relaymove could handle it + if(my_mob.machine) + var/result = my_mob.machine.relaymove(my_mob, direct) + if(result) + return result - if((istype(mob.loc, /turf/space)) || (mob.lastarea.has_gravity == 0)) - if(!mob.Process_Spacemove(0)) return 0 - - if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved - var/atom/O = mob.loc - return O.relaymove(mob, direct) - - if(isturf(mob.loc)) - - if(mob.restrained())//Why being pulled while cuffed prevents you from moving - for(var/mob/M in range(mob, 1)) - if(M.pulling == mob) - if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) - to_chat(src, "You're restrained! You can't move!") - return 0 - else - M.stop_pulling() - - if(mob.pinned.len) - to_chat(src, "You're pinned to a wall by [mob.pinned[1]]!") + // Can't control ourselves when drifting + if(isspace(loc) || my_mob.lastarea?.has_gravity == 0) + if(!my_mob.Process_Spacemove(0)) return 0 - mob.move_delay = world.time//set move delay + // Inside an object, tell it we moved + if(isobj(loc) || ismob(loc)) + return loc.relaymove(my_mob, direct) - switch(mob.m_intent) - if("run") - if(mob.drowsyness > 0) - mob.move_delay += 6 - mob.move_delay += config.run_speed - if("walk") - mob.move_delay += config.walk_speed - mob.move_delay += mob.movement_delay(n, direct) + // Can't move unless you're in the world somewhere + if(!isturf(loc)) + return - if(istype(mob.buckled, /obj/vehicle)) - //manually set move_delay for vehicles so we don't inherit any mob movement penalties - //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm - mob.move_delay = world.time - //drunk driving - if(mob.confused && prob(20)) //vehicles tend to keep moving in the same direction - direct = turn(direct, pick(90, -90)) - return mob.buckled.relaymove(mob,direct) - - if(istype(mob.machine, /obj/machinery)) - if(mob.machine.relaymove(mob,direct)) - return - - if(mob.pulledby || mob.buckled) // Wheelchair driving! - if(istype(mob.loc, /turf/space)) - return // No wheelchair driving in space - if(istype(mob.pulledby, /obj/structure/bed/chair/wheelchair)) - return mob.pulledby.relaymove(mob, direct) - else if(istype(mob.buckled, /obj/structure/bed/chair/wheelchair)) - if(ishuman(mob)) - var/mob/living/carbon/human/driver = mob - var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") - var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") - if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump())) - return // No hands to drive your chair? Tough luck! - //drunk wheelchair driving - else if(mob.confused) - switch(mob.m_intent) - if("run") - if(prob(50)) direct = turn(direct, pick(90, -90)) - if("walk") - if(prob(25)) direct = turn(direct, pick(90, -90)) - mob.move_delay += 2 - return mob.buckled.relaymove(mob,direct) - - //We are now going to move - moving = 1 - //Something with pulling things - if(locate(/obj/item/weapon/grab, mob)) - mob.move_delay = max(mob.move_delay, world.time + 7) - var/list/L = mob.ret_grab() - if(istype(L, /list)) - if(L.len == 2) - L -= mob - var/mob/M = L[1] - if(M) - if ((get_dist(mob, M) <= 1 || M.loc == mob.loc)) - var/turf/T = mob.loc - . = ..() - if (isturf(M.loc)) - var/diag = get_dir(mob, M) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(mob, M) > 1 || diag)) - step(M, get_dir(M.loc, T)) + // Why being pulled while cuffed prevents you from moving + if(my_mob.restrained()) + for(var/mob/M in range(my_mob, 1)) + if(M.pulling == my_mob) + if(!M.restrained() && M.stat == 0 && M.canmove && my_mob.Adjacent(M)) + to_chat(src, "You're restrained! You can't move!") + return 0 else - for(var/mob/M in L) - M.other_mobs = 1 - if(mob != M) - M.animate_movement = 3 - for(var/mob/M in L) - spawn( 0 ) - step(M, direct) - return - spawn( 1 ) - M.other_mobs = null - M.animate_movement = 2 - return + M.stop_pulling() - else - if(mob.confused) - switch(mob.m_intent) + if(my_mob.pinned.len) + to_chat(src, "You're pinned to a wall by [my_mob.pinned[1]]!") + return 0 + + if(istype(my_mob.buckled, /obj/vehicle) || ismob(my_mob.buckled)) + //manually set move_delay for vehicles so we don't inherit any mob movement penalties + //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm + my_mob.next_move = world.time + //drunk driving + if(my_mob.confused && prob(20)) //vehicles tend to keep moving in the same direction + direct = turn(direct, pick(90, -90)) + if(ismob(my_mob.buckled)) + var/mob/M = my_mob.buckled + if(M.next_move > my_mob.next_move) // Don't let piggyback riders move their mob IN ADDITION TO the mob moving + return + return my_mob.buckled.relaymove(my_mob,direct) + + var/total_delay = my_mob.movement_delay(n, direct) + + if(my_mob.pulledby || my_mob.buckled) // Wheelchair driving! + if(isspace(loc)) + return // No wheelchair driving in space + if(istype(my_mob.pulledby, /obj/structure/bed/chair/wheelchair)) + total_delay += 3 + else if(istype(my_mob.buckled, /obj/structure/bed/chair/wheelchair)) + if(ishuman(my_mob)) + var/mob/living/carbon/human/driver = my_mob + var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") + var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") + if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump())) + return // No hands to drive your chair? Tough luck! + //drunk wheelchair driving + else if(my_mob.confused) + switch(my_mob.m_intent) if("run") - if(prob(75)) + if(prob(50)) direct = turn(direct, pick(90, -90)) - n = get_step(mob, direct) if("walk") if(prob(25)) direct = turn(direct, pick(90, -90)) - n = get_step(mob, direct) - . = mob.SelfMove(n, direct) + total_delay += 3 - for (var/obj/item/weapon/grab/G in mob) - if (G.state == GRAB_NECK) - mob.set_dir(reverse_dir[direct]) - G.adjust_position() - for (var/obj/item/weapon/grab/G in mob.grabbed_by) - G.adjust_position() + // We are now going to move + moving = 1 + var/pre_move_loc = loc - moving = 0 + // Confused direction randomization + if(my_mob.confused) + switch(my_mob.m_intent) + if("run") + if(prob(75)) + direct = turn(direct, pick(90, -90)) + n = get_step(my_mob, direct) + if("walk") + if(prob(25)) + direct = turn(direct, pick(90, -90)) + n = get_step(my_mob, direct) - return . + total_delay = DS2NEARESTTICK(total_delay) //Rounded to the next tick in equivalent ds + my_mob.setMoveCooldown(total_delay) - return + if(istype(my_mob.pulledby, /obj/structure/bed/chair/wheelchair)) + . = my_mob.pulledby.relaymove(my_mob, direct) + else if(istype(my_mob.buckled, /obj/structure/bed/chair/wheelchair)) + . = my_mob.buckled.relaymove(my_mob,direct) + else + . = my_mob.SelfMove(n, direct, total_delay) -/mob/proc/SelfMove(turf/n, direct) - return Move(n, direct) + // If we have a grab + var/list/grablist = my_mob.ret_grab() + if(grablist.len) + grablist -= my_mob // Just in case we're in a circular grab chain + // It's just us and another person + if(grablist.len == 1) + var/mob/M = grablist[1] + if(!my_mob.Adjacent(M)) //Oh no, we moved away + M.Move(pre_move_loc, get_dir(M, pre_move_loc), total_delay) //Have them step towards where we were + + // It's a grab chain + else + for(var/mob/M in grablist) + my_mob.other_mobs = 1 + M.other_mobs = 1 //Has something to do with people being able or unable to pass a chain of mobs + + //Ugly! + spawn(0) //Step + M.Move(pre_move_loc, get_dir(M, pre_move_loc), total_delay) + spawn(1) //Unstep + M.other_mobs = null + spawn(1) //Unset + my_mob.other_mobs = null + + // Update all the grabs! + for (var/obj/item/weapon/grab/G in my_mob) + if (G.state == GRAB_NECK) + mob.set_dir(reverse_dir[direct]) + G.adjust_position() + for (var/obj/item/weapon/grab/G in my_mob.grabbed_by) + G.adjust_position() + + // We're not in the middle of a move anymore + moving = 0 + +/mob/proc/SelfMove(turf/n, direct, movetime) + return Move(n, direct, movetime) ///Process_Incorpmove ///Called by client/Move() @@ -362,17 +380,7 @@ anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,mob.dir) mob.forceMove(get_step(mob, direct)) mob.dir = direct - // Crossed is always a bit iffy - for(var/obj/S in mob.loc) - if(istype(S,/obj/effect/step_trigger) || istype(S,/obj/effect/beam)) - S.Crossed(mob) - var/area/A = get_area_master(mob) - if(A) - A.Entered(mob) - if(isturf(mob.loc)) - var/turf/T = mob.loc - T.Entered(mob) mob.Post_Incorpmove() return 1 @@ -399,9 +407,9 @@ //Check to see if we slipped if(prob(Process_Spaceslipping(5)) && !buckled) - to_chat(src, "You slipped!") - src.inertia_dir = src.last_move - step(src, src.inertia_dir) + to_chat(src, "You slipped!") + inertia_dir = last_move + step(src, src.inertia_dir) // Not using Move for smooth glide here because this is a 'slip' so should be sudden. return 0 //If not then we can reset inertia and move inertia_dir = 0 @@ -413,7 +421,7 @@ var/shoegrip for(var/turf/turf in oview(1,src)) - if(istype(turf,/turf/space)) + if(isspace(turf)) continue if(istype(turf,/turf/simulated/floor)) // Floors don't count if they don't have gravity @@ -462,26 +470,6 @@ /mob/proc/update_gravity() return -/* -// The real Move() proc is above, but touching that massive block just to put this in isn't worth it. -/mob/Move(var/newloc, var/direct) - . = ..(newloc, direct) - if(.) - post_move(newloc, direct) -*/ -// Called when a mob successfully moves. -// Would've been an /atom/movable proc but it caused issues. -/mob/Moved(atom/oldloc) - for(var/obj/O in contents) - O.on_loc_moved(oldloc) - -// Received from Moved(), useful for items that need to know that their loc just moved. -/obj/proc/on_loc_moved(atom/oldloc) - return - -/obj/item/weapon/storage/on_loc_moved(atom/oldloc) - for(var/obj/O in contents) - O.on_loc_moved(oldloc) /client/verb/moveup() set name = ".moveup" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 064f6f9e99..6d2d4ec644 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -378,10 +378,10 @@ character = job_master.EquipRank(character, rank, 1) //equips the human UpdateFactionList(character) - // AIs don't need a spawnpoint, they must spawn at an empty core - if(character.mind.assigned_role == "AI") + var/datum/job/J = SSjob.get_job(rank) - character = character.AIize(move=0) // AIize the character, but don't move them yet + // AIs don't need a spawnpoint, they must spawn at an empty core + if(J.mob_type & JOB_SILICON_AI) // IsJobAvailable for AI checks that there is an empty core available in this list var/obj/structure/AIcore/deactivated/C = empty_playable_ai_cores[1] @@ -389,11 +389,14 @@ character.loc = C.loc + // AIize the character, but don't move them yet + character = character.AIize(move = FALSE) // Dupe of code in /datum/controller/subsystem/ticker/proc/create_characters() for non-latespawn, unify? + AnnounceCyborg(character, rank, "has been transferred to the empty core in \the [character.loc.loc]") ticker.mode.latespawn(character) - qdel(C) - qdel(src) + qdel(C) //Deletes empty core (really?) + qdel(src) //Deletes new_player return // Equip our custom items only AFTER deploying to spawn points eh? @@ -407,18 +410,15 @@ character.buckled.set_dir(character.dir) ticker.mode.latespawn(character) - - if(character.mind.assigned_role != "Cyborg") + + if(J.mob_type & JOB_SILICON) + AnnounceCyborg(character, rank, join_message, announce_channel, character.z) + else + AnnounceArrival(character, rank, join_message, announce_channel, character.z) data_core.manifest_inject(character) ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - - //Grab some data from the character prefs for use in random news procs. - - AnnounceArrival(character, rank, join_message, announce_channel, character.z) - else - AnnounceCyborg(character, rank, join_message, announce_channel, character.z) - - qdel(src) + + qdel(src) // Delete new_player mob /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel) if (ticker.current_state == GAME_STATE_PLAYING) @@ -497,8 +497,6 @@ if(!new_character) new_character = new(T) - new_character.lastarea = get_area(T) - if(ticker.random_players) new_character.gender = pick(MALE, FEMALE) client.prefs.real_name = random_name(new_character.gender) @@ -588,6 +586,9 @@ /mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null) return +/mob/new_player/hear_holopad_talk(list/message_pieces, var/verb = "says", var/mob/speaker = null) + return + // Prevents lobby players from seeing emotes, even with ghosteyes /mob/new_player/show_message(msg, type, alt, alt_type) return diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 886dae69e3..e9a2355d2a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -289,3 +289,29 @@ break return highJob + +/datum/preferences/proc/get_valid_hairstyles() + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(!(species in S.species_allowed)) + continue + + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + return valid_hairstyles + +/datum/preferences/proc/get_valid_facialhairstyles() + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(biological_gender == MALE && S.gender == FEMALE) + continue + if(biological_gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + return valid_facialhairstyles diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d44ffca31e..bd3d5f6bb0 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -41,7 +41,7 @@ return src -/mob/new_player/AIize() +/mob/new_player/AIize(var/move = TRUE) spawning = 1 return ..() @@ -53,7 +53,7 @@ return ..(move) -/mob/living/carbon/AIize() +/mob/living/carbon/AIize(var/move = TRUE) if (transforming) return for(var/obj/item/W in src) @@ -64,10 +64,34 @@ invisibility = 101 return ..() -/mob/proc/AIize(move=1) +/mob/proc/AIize(var/move = TRUE) if(client) src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs - var/mob/living/silicon/ai/O = new (loc, using_map.default_law_type,,1)//No MMI but safety is in effect. + + var/newloc = loc + if(move) + var/obj/loc_landmark + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if (sloc.name != "AI") + continue + if ((locate(/mob/living) in sloc.loc) || (locate(/obj/structure/AIcore) in sloc.loc)) + continue + loc_landmark = sloc + if (!loc_landmark) + for(var/obj/effect/landmark/tripai in landmarks_list) + if (tripai.name == "tripai") + if((locate(/mob/living) in tripai.loc) || (locate(/obj/structure/AIcore) in tripai.loc)) + continue + loc_landmark = tripai + if (!loc_landmark) + to_chat(src, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.") + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if (sloc.name == "AI") + loc_landmark = sloc + + newloc = loc_landmark.loc + + var/mob/living/silicon/ai/O = new (newloc, using_map.default_law_type,,1)//No MMI but safety is in effect. O.invisibility = 0 O.aiRestorePowerRoutine = 0 @@ -101,28 +125,6 @@ if(LANGUAGE_ROOTLOCAL in B.alternate_languages) O.add_language(LANGUAGE_ROOTLOCAL, 1) - if(move) - var/obj/loc_landmark - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name != "AI") - continue - if ((locate(/mob/living) in sloc.loc) || (locate(/obj/structure/AIcore) in sloc.loc)) - continue - loc_landmark = sloc - if (!loc_landmark) - for(var/obj/effect/landmark/tripai in landmarks_list) - if (tripai.name == "tripai") - if((locate(/mob/living) in tripai.loc) || (locate(/obj/structure/AIcore) in tripai.loc)) - continue - loc_landmark = tripai - if (!loc_landmark) - to_chat(O, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.") - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name == "AI") - loc_landmark = sloc - - O.loc = loc_landmark.loc - O.on_mob_init() O.add_ai_verbs() diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 2e4d43c731..85daf5d03d 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -5,7 +5,7 @@ use_power = USE_POWER_ACTIVE active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. idle_power_usage = 100 - icon_state = "bus" + icon_state = "ntnet" anchored = 1 density = 1 circuit = /obj/item/weapon/circuitboard/ntnet_relay @@ -32,9 +32,9 @@ /obj/machinery/ntnet_relay/update_icon() if(operable()) - icon_state = "bus" + icon_state = initial(icon_state) else - icon_state = "bus_off" + icon_state = "[initial(icon_state)]_off" /obj/machinery/ntnet_relay/process() if(operable()) diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 2848468da8..db15e841ca 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -255,6 +255,18 @@ else return ..() +/obj/item/modular_computer/apply_visual(var/mob/user) + if(active_program) + return active_program.apply_visual(user) + +/obj/item/modular_computer/remove_visual(var/mob/user) + if(active_program) + return active_program.remove_visual(user) + +/obj/item/modular_computer/relaymove(var/mob/user, direction) + if(active_program) + return active_program.relaymove(user, direction) + /obj/item/modular_computer/proc/set_autorun(program) if(!hard_drive) return diff --git a/code/modules/modular_computers/computers/modular_computer/power.dm b/code/modules/modular_computers/computers/modular_computer/power.dm index b3746d55d4..5d12d2e174 100644 --- a/code/modules/modular_computers/computers/modular_computer/power.dm +++ b/code/modules/modular_computers/computers/modular_computer/power.dm @@ -38,7 +38,7 @@ power_usage += tesla_link.passive_charging_rate battery_module.battery.give(tesla_link.passive_charging_rate * CELLRATE) - A.use_power(power_usage, EQUIP) + A.use_power_oneoff(power_usage, EQUIP) return TRUE // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 895b73b5fa..ef7eece062 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -203,8 +203,12 @@ /datum/computer_file/program/apply_visual(mob/M) if(NM) - NM.apply_visual(M) + return NM.apply_visual(M) /datum/computer_file/program/remove_visual(mob/M) if(NM) - NM.remove_visual(M) + return NM.remove_visual(M) + +/datum/computer_file/program/proc/relaymove(var/mob/M, direction) + if(NM) + return NM.relaymove(M, direction) \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/uav.dm b/code/modules/modular_computers/file_system/programs/generic/uav.dm new file mode 100644 index 0000000000..8e4909ab04 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/generic/uav.dm @@ -0,0 +1,266 @@ +/obj/item/modular_computer + var/list/paired_uavs //Weakrefs, don't worry about it! + +/datum/computer_file/program/uav + filename = "rigger" + filedesc = "UAV Control" + nanomodule_path = /datum/nano_module/uav + program_icon_state = "comm_monitor" + program_key_state = "generic_key" + program_menu_icon = "link" + extended_desc = "This program allows remote control of certain drones, but only when paired with this device." + size = 12 + available_on_ntnet = 1 + //requires_ntnet = 1 + +/datum/nano_module/uav + name = "UAV Control program" + var/obj/item/device/uav/current_uav = null //The UAV we're watching + var/signal_strength = 0 //Our last signal strength report (cached for a few seconds) + var/signal_test_counter = 0 //How long until next signal strength check + var/list/viewers //Who's viewing a UAV through us + var/adhoc_range = 30 //How far we can operate on a UAV without NTnet + +/datum/nano_module/uav/Destroy() + if(LAZYLEN(viewers)) + for(var/weakref/W in viewers) + var/M = W.resolve() + if(M) + unlook(M) + . = ..() + +/datum/nano_module/uav/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, state = default_state) + var/list/data = host.initial_data() + + if(current_uav) + if(QDELETED(current_uav)) + set_current(null) + else if(signal_test_counter-- <= 0) + signal_strength = get_signal_to(current_uav) + if(!signal_strength) + set_current(null) + else // Don't reset counter until we find a UAV that's actually in range we can stay connected to + signal_test_counter = 20 + + data["current_uav"] = null + if(current_uav) + data["current_uav"] = list("status" = current_uav.get_status_string(), "power" = current_uav.state == 1 ? 1 : null) + data["signal_strength"] = signal_strength ? signal_strength >= 2 ? "High" : "Low" : "None" + data["in_use"] = LAZYLEN(viewers) + + var/list/paired_map = list() + var/obj/item/modular_computer/mc_host = nano_host() + if(istype(mc_host)) + for(var/puav in mc_host.paired_uavs) + var/weakref/wr = puav + var/obj/item/device/uav/U = wr.resolve() + paired_map[++paired_map.len] = list("name" = "[U ? U.nickname : "!!Missing!!"]", "uavref" = "\ref[U]") + + data["paired_uavs"] = paired_map + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "mod_uav.tmpl", "UAV Control", 600, 500, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/nano_module/uav/Topic(var/href, var/href_list = list(), var/datum/topic_state/state) + if((. = ..())) + return + state = state || DefaultTopicState() || global.default_state + if(CanUseTopic(usr, state, href_list) == STATUS_INTERACTIVE) + CouldUseTopic(usr) + return OnTopic(usr, href_list, state) + CouldNotUseTopic(usr) + return TRUE + +/datum/nano_module/uav/proc/OnTopic(var/mob/user, var/list/href_list) + if(href_list["switch_uav"]) + var/obj/item/device/uav/U = locate(href_list["switch_uav"]) //This is a \ref to the UAV itself + if(!istype(U)) + to_chat(usr,"Something is blocking the connection to that UAV. In-person investigation is required.") + return TOPIC_NOACTION + + if(!get_signal_to(U)) + to_chat(usr,"The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.") + return TOPIC_NOACTION + + set_current(U) + return TOPIC_REFRESH + + if(href_list["del_uav"]) + var/refstring = href_list["del_uav"] //This is a \ref to the UAV itself + var/obj/item/modular_computer/mc_host = nano_host() + //This is so we can really scrape up any weakrefs that can't resolve + for(var/weakref/wr in mc_host.paired_uavs) + if(wr.ref == refstring) + if(current_uav?.weakref == wr) + set_current(null) + LAZYREMOVE(mc_host.paired_uavs, wr) + + else if(href_list["view_uav"]) + if(!current_uav) + return TOPIC_NOACTION + + if(current_uav.check_eye(user) < 0) + to_chat(usr,"The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.") + else + viewing_uav(user) ? unlook(user) : look(user) + return TOPIC_NOACTION + + else if(href_list["power_uav"]) + if(!current_uav) + return TOPIC_NOACTION + else if(current_uav.toggle_power()) + //Clean up viewers faster + if(LAZYLEN(viewers)) + for(var/weakref/W in viewers) + var/M = W.resolve() + if(M) + unlook(M) + return TOPIC_REFRESH + +/datum/nano_module/uav/proc/DefaultTopicState() + return global.default_state + +/datum/nano_module/uav/proc/CouldNotUseTopic(mob/user) + . = ..() + unlook(user) + +/datum/nano_module/uav/proc/CouldUseTopic(mob/user) + . = ..() + if(viewing_uav(user)) + look(user) + +/datum/nano_module/uav/proc/set_current(var/obj/item/device/uav/U) + if(current_uav == U) + return + + signal_strength = 0 + current_uav = U + + if(LAZYLEN(viewers)) + for(var/weakref/W in viewers) + var/M = W.resolve() + if(M) + if(current_uav) + to_chat(M, "You're disconnected from the UAV's camera!") + unlook(M) + else + look(M) + +//// +//// Finding signal strength between us and the UAV +//// +/datum/nano_module/uav/proc/get_signal_to(var/atom/movable/AM) + // Following roughly the ntnet signal levels + // 0 is none + // 1 is weak + // 2 is strong + var/obj/item/modular_computer/host = nano_host() //Better not add this to anything other than modular computers. + if(!istype(host)) + return + var/our_signal = host.get_ntnet_status() //1 low, 2 good, 3 wired, 0 none + var/their_z = get_z(AM) + + //If we have no NTnet connection don't bother getting theirs + if(!our_signal) + if(get_z(host) == their_z && (get_dist(host, AM) < adhoc_range)) + return 1 //We can connect (with weak signal) in same z without ntnet, within 30 turfs + else + return 0 + + var/list/zlevels_in_range = using_map.get_map_levels(their_z, FALSE) + var/list/zlevels_in_long_range = using_map.get_map_levels(their_z, TRUE) - zlevels_in_range + var/their_signal = 0 + for(var/relay in ntnet_global.relays) + var/obj/machinery/ntnet_relay/R = relay + if(!R.operable()) + continue + if(R.z == their_z) + their_signal = 2 + break + if(R.z in zlevels_in_range) + their_signal = 2 + break + if(R.z in zlevels_in_long_range) + their_signal = 1 + break + + if(!their_signal) //They have no NTnet at all + if(get_z(host) == their_z && (get_dist(host, AM) < adhoc_range)) + return 1 //We can connect (with weak signal) in same z without ntnet, within 30 turfs + else + return 0 + else + return max(our_signal, their_signal) + +//// +//// UAV viewer handling +//// +/datum/nano_module/uav/proc/viewing_uav(mob/user) + return (weakref(user) in viewers) + +/datum/nano_module/uav/proc/look(var/mob/user) + if(issilicon(user)) //Too complicated for me to want to mess with at the moment + to_chat(user, "Regulations prevent you from controlling several corporeal forms at the same time!") + return + + if(!current_uav) + return + + user.set_machine(nano_host()) + user.reset_view(current_uav) + current_uav.add_master(user) + LAZYDISTINCTADD(viewers, weakref(user)) + +/datum/nano_module/uav/proc/unlook(var/mob/user) + user.unset_machine() + user.reset_view() + if(current_uav) + current_uav.remove_master(user) + LAZYREMOVE(viewers, weakref(user)) + +/datum/nano_module/uav/check_eye(var/mob/user) + if(get_dist(user, nano_host()) > 1 || user.blinded || !current_uav) + unlook(user) + return -1 + + var/viewflag = current_uav.check_eye(user) + if (viewflag < 0) //camera doesn't work + unlook(user) + return -1 + + return viewflag + +//// +//// Relaying movements to the UAV +//// +/datum/nano_module/uav/relaymove(var/mob/user, direction) + if(current_uav) + return current_uav.relaymove(user, direction, signal_strength) + +//// +//// The effects when looking through a UAV +//// +/datum/nano_module/uav/apply_visual(var/mob/M) + if(!M.client) + return + if(weakref(M) in viewers) + M.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed) + M.overlay_fullscreen("scanlines",/obj/screen/fullscreen/scanline) + + if(signal_strength <= 1) + M.overlay_fullscreen("whitenoise",/obj/screen/fullscreen/noise) + else + M.clear_fullscreen("whitenoise", 0) + else + remove_visual(M) + +/datum/nano_module/uav/remove_visual(mob/M) + if(!M.client) + return + M.clear_fullscreen("fishbed",0) + M.clear_fullscreen("scanlines",0) + M.clear_fullscreen("whitenoise",0) diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 2f382e0f4d..1447c5008e 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -39,6 +39,27 @@ var/global/ntnet_card_uid = 1 icon_state = "netcard_advanced" hardware_size = 1 +/obj/item/weapon/computer_hardware/network_card/quantum + name = "quantum NTNet network card" + desc = "A network card that can connect to NTnet from anywhere, using quantum entanglement." + long_range = 1 + origin_tech = list(TECH_DATA = 6, TECH_ENGINEERING = 7) + power_usage = 200 // Infinite range but higher power usage. + icon_state = "netcard_advanced" + hardware_size = 1 + +/obj/item/weapon/computer_hardware/network_card/quantum/get_signal(var/specific_action = 0) + if(!holder2) + return 0 + + if(!enabled) + return 0 + + if(!check_functionality() || !ntnet_global || is_banned()) + return 0 + + return 2 + /obj/item/weapon/computer_hardware/network_card/wired name = "wired NTNet network card" desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection." @@ -82,7 +103,8 @@ var/global/ntnet_card_uid = 1 var/holderz = get_z(holder2) if(!holderz) //no reception in nullspace return 0 - var/list/zlevels_in_range = using_map.get_map_levels(holderz, long_range) + var/list/zlevels_in_range = using_map.get_map_levels(holderz, FALSE) + var/list/zlevels_in_long_range = using_map.get_map_levels(holderz, TRUE) - zlevels_in_range var/best = 0 for(var/relay in ntnet_global.relays) var/obj/machinery/ntnet_relay/R = relay @@ -91,11 +113,16 @@ var/global/ntnet_card_uid = 1 continue //We're on the same z if(R.z == holderz) - best = 2 + best = 2 //Every network card gets high signal on the same z as the relay break // No point in going further //Not on the same z but within range anyway if(R.z in zlevels_in_range) - best = 1 + best = long_range ? 2 : 1 //High-power network cards get good signal further away + break + //Only in long range + if(long_range && (R.z in zlevels_in_long_range)) + best = 1 //High-power network cards can get low signal even at long range + break return best return 0 // No computer! diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index a9f756469c..40d2ad1343 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -48,6 +48,7 @@ var/area/area = get_area(src) if(direction == UP && area.has_gravity() && !can_overcome_gravity()) var/obj/structure/lattice/lattice = locate() in destination.contents + var/obj/structure/catwalk/catwalk = locate() in destination.contents if(lattice) var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) to_chat(src, "You grab \the [lattice] and start pulling yourself upward...") @@ -57,6 +58,20 @@ else to_chat(src, "You gave up on pulling yourself up.") return 0 + else if(catwalk?.hatch_open) + var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + to_chat(src, "You grab the edge of \the [catwalk] and start pulling yourself upward...") + var/old_dest = destination + destination = get_step(destination, dir) // mob's dir + if(!destination?.Enter(src, old_dest)) + to_chat(src, "There's something in the way up above in that direction, try another.") + return 0 + destination.audible_message("You hear something climbing up \the [catwalk].") + if(do_after(src, pull_up_time)) + to_chat(src, "You pull yourself up.") + else + to_chat(src, "You gave up on pulling yourself up.") + return 0 else to_chat(src, "Gravity stops you from moving upward.") return 0 @@ -243,7 +258,7 @@ // Things that prevent objects standing on them from falling into turf below /obj/structure/catwalk/CanFallThru(atom/movable/mover as mob|obj, turf/target as turf) - if(target.z < z) + if((target.z < z) && !hatch_open) return FALSE // TODO - Technically should be density = 1 and flags |= ON_BORDER if(!isturf(mover.loc)) return FALSE // Only let loose floor items fall. No more snatching things off people's hands. @@ -426,7 +441,7 @@ visible_message("\The [src] falls from above and slams into \the [landing]!", \ "You fall off and hit \the [landing]!", \ "You hear something slam into \the [landing].") - playsound(loc, "punch", 25, 1, -1) + playsound(src, "punch", 25, 1, -1) // Because wounds heal rather quickly, 10 (the default for this proc) should be enough to discourage jumping off but not be enough to ruin you, at least for the first time. // Hits 10 times, because apparently targeting individual limbs lets certain species survive the fall from atmosphere @@ -523,7 +538,7 @@ visible_message("\The [src] falls from above and slams into \the [landing]!", \ "You fall off and hit \the [landing]!", \ "You hear something slam into \the [landing].") - playsound(loc, "punch", 25, 1, -1) + playsound(src, "punch", 25, 1, -1) // And now to hurt the mech. if(!planetary) diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 237e38562e..0bc21f07eb 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -79,7 +79,7 @@ obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) obj/machinery/atmospherics/pipe/zpipe/proc/burst() src.visible_message("\The [src] bursts!"); - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + playsound(src, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 104ad28136..237dcb87df 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -159,7 +159,7 @@ A.forceMove(target) if(isliving(A)) var/mob/living/L = A - if(L.pulling) + if(L.pulling && !L.pulling.anchored) L.pulling.forceMove(target) /obj/structure/stairs/proc/upperStep(var/turf/T) diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 8b17e46bd1..ced3aaaba5 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -34,15 +34,30 @@ ..() update() +/turf/simulated/open/ChangeTurf() + var/turf/T = GetBelow(src) + if(T) + GLOB.turf_entered_event.unregister(T, src, .proc/BelowOpenUpdated) + GLOB.turf_exited_event.unregister(T, src, .proc/BelowOpenUpdated) + . = ..() + /turf/simulated/open/Initialize() . = ..() ASSERT(HasBelow(z)) update() + var/turf/T = GetBelow(src) + if(T) + GLOB.turf_entered_event.register(T, src, .proc/BelowOpenUpdated) + GLOB.turf_exited_event.register(T, src, .proc/BelowOpenUpdated) /turf/simulated/open/Entered(var/atom/movable/mover) ..() mover.fall() +/turf/simulated/open/proc/BelowOpenUpdated(turf/T, atom/movable/AM, old_loc) + if(isobj(AM) && GLOB.open_space_initialised && !AM.invisibility) + SSopen_space.add_turf(src, 1) + // Called when thrown object lands on this turf. /turf/simulated/open/hitby(var/atom/movable/AM, var/speed) . = ..() diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm index 74e73bf9f3..b9f8d61b1e 100644 --- a/code/modules/multiz/zshadow.dm +++ b/code/modules/multiz/zshadow.dm @@ -61,7 +61,7 @@ if(shadow) shadow.sync_icon(src) -/mob/living/Move() +/mob/living/Moved() . = ..() check_shadow() diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index 90c213da1c..75c38c9ed3 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -62,3 +62,6 @@ /datum/proc/update_layout() return FALSE + +/datum/nano_module/proc/relaymove(var/mob/user, direction) + return FALSE diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index cd2f396c4a..aae472869a 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -469,6 +469,8 @@ This function completely restores a damaged organ to perfect condition. if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc. implanted_object.loc = get_turf(src) implants -= implanted_object + if(!owner.has_embedded_objects()) + owner.clear_alert("embeddedobject") if(owner && !ignore_prosthetic_prefs) if(owner.client && owner.client.prefs && owner.client.prefs.real_name == owner.real_name) @@ -1039,7 +1041,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(organ_can_feel_pain()) owner.emote("scream") - playsound(src.loc, "fracture", 10, 1, -2) + playsound(src, "fracture", 10, 1, -2) status |= ORGAN_BROKEN broken_description = pick("broken","fracture","hairline fracture") @@ -1167,6 +1169,7 @@ Note that amputating the affected organ does in fact remove the infection from t implants += W owner.embedded_flag = 1 owner.verbs += /mob/proc/yank_out_object + owner.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) W.add_blood(owner) if(ismob(W.loc)) var/mob/living/H = W.loc @@ -1355,4 +1358,11 @@ Note that amputating the affected organ does in fact remove the infection from t if(bling.body_parts_covered & src.body_part) covering_clothing |= bling - return covering_clothing \ No newline at end of file + return covering_clothing + +/mob/living/carbon/human/proc/has_embedded_objects() + . = 0 + for(var/obj/item/organ/external/L in organs) + for(var/obj/item/I in L.implants) + if(!istype(I,/obj/item/weapon/implant)) + return 1 \ No newline at end of file diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 3c50c9f53f..084e94215b 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -131,9 +131,9 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/get_icon(var/skeletal) - var/gender = "f" - if(owner && owner.gender == MALE) - gender = "m" + var/gender = "m" + if(owner && owner.gender == FEMALE) + gender = "f" icon_cache_key = "[icon_name]_[species ? species.name : SPECIES_HUMAN]" diff --git a/code/modules/overmap/events/overmap_event.dm b/code/modules/overmap/events/overmap_event.dm index 9add25a5c1..ff1b4ae105 100644 --- a/code/modules/overmap/events/overmap_event.dm +++ b/code/modules/overmap/events/overmap_event.dm @@ -19,19 +19,10 @@ icon_state = pick(event_icon_states) GLOB.overmap_event_handler.update_hazards(loc) -/obj/effect/overmap/event/Move() - var/turf/old_loc = loc +/obj/effect/overmap/event/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - GLOB.overmap_event_handler.update_hazards(old_loc) - GLOB.overmap_event_handler.update_hazards(loc) - -/obj/effect/overmap/event/forceMove(atom/destination) - var/old_loc = loc - . = ..() - if(.) - GLOB.overmap_event_handler.update_hazards(old_loc) - GLOB.overmap_event_handler.update_hazards(loc) + GLOB.overmap_event_handler.update_hazards(old_loc) + GLOB.overmap_event_handler.update_hazards(loc) /obj/effect/overmap/event/Destroy()//takes a look at this one as well, make sure everything is A-OK var/turf/T = loc diff --git a/code/modules/overmap/overmap_shuttle.dm b/code/modules/overmap/overmap_shuttle.dm index b614137db4..6fdb6cbeb1 100644 --- a/code/modules/overmap/overmap_shuttle.dm +++ b/code/modules/overmap/overmap_shuttle.dm @@ -160,11 +160,11 @@ if(W.is_crowbar()) if(opened) to_chat(user, "You tightly shut \the [src] door.") - playsound(src.loc, 'sound/effects/locker_close.ogg', 25, 0, -3) + playsound(src, 'sound/effects/locker_close.ogg', 25, 0, -3) opened = 0 else to_chat(user, "You open up \the [src] door.") - playsound(src.loc, 'sound/effects/locker_open.ogg', 15, 1, -3) + playsound(src, 'sound/effects/locker_open.ogg', 15, 1, -3) opened = 1 else if(istype(W,/obj/item/weapon/tank)) if(!opened) diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index f437874609..1824a3947a 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -150,7 +150,7 @@ var/area/overmap/A = new for (var/square in block(locate(1,1,global.using_map.overmap_z), locate(global.using_map.overmap_size,global.using_map.overmap_size,global.using_map.overmap_z))) var/turf/T = square - if(T.x == global.using_map.overmap_size || T.y == global.using_map.overmap_size) + if(T.x == 1 || T.y == 1 || T.x == global.using_map.overmap_size || T.y == global.using_map.overmap_size) T = T.ChangeTurf(/turf/unsimulated/map/edge) else T = T.ChangeTurf(/turf/unsimulated/map) diff --git a/code/modules/overmap/ships/computers/computer_shims.dm b/code/modules/overmap/ships/computers/computer_shims.dm index 3b62adc73c..5dbb61405d 100644 --- a/code/modules/overmap/ships/computers/computer_shims.dm +++ b/code/modules/overmap/ships/computers/computer_shims.dm @@ -12,10 +12,6 @@ // Power // -// This will have this machine have its area eat this much power next tick, and not afterwards. Do not use for continued power draw. -/obj/machinery/proc/use_power_oneoff(var/amount, var/chan = -1) - return use_power(amount, chan) - // Change one of the power consumption vars /obj/machinery/proc/change_power_consumption(new_power_consumption, use_power_mode = USE_POWER_IDLE) switch(use_power_mode) @@ -95,7 +91,7 @@ /obj/machinery/computer/ship/attack_ghost(mob/user) interface_interact(user) -// If you don't call parent in this proc, you must make all appropriate checks yourself. +// If you don't call parent in this proc, you must make all appropriate checks yourself. // If you do, you must respect the return value. /obj/machinery/computer/ship/attack_hand(mob/user) if((. = ..())) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 13b8e5806e..0d9d83edd7 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -98,7 +98,7 @@ if (href_list["scan"]) var/obj/effect/overmap/O = locate(href_list["scan"]) if(istype(O) && !QDELETED(O) && (O in view(7,linked))) - playsound(loc, "sound/machines/dotprinter.ogg", 30, 1) + playsound(src, "sound/machines/dotprinter.ogg", 30, 1) new/obj/item/weapon/paper/(get_turf(src), O.get_scan_data(user), "paper (Sensor Scan - [O])") return TOPIC_HANDLED diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm index 6e6304f1f8..497077a76e 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -58,6 +58,7 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov /obj/machinery/computer/ship/proc/look(var/mob/user) if(linked) + apply_visual(user) user.reset_view(linked) user.set_viewsize(world.view + extra_view) GLOB.moved_event.register(user, src, /obj/machinery/computer/ship/proc/unlook) diff --git a/code/modules/overmap/ships/engines/gas_thruster.dm b/code/modules/overmap/ships/engines/gas_thruster.dm index 04101984c4..fd689fb990 100644 --- a/code/modules/overmap/ships/engines/gas_thruster.dm +++ b/code/modules/overmap/ships/engines/gas_thruster.dm @@ -150,7 +150,7 @@ /obj/machinery/atmospherics/unary/engine/proc/burn() if(!is_on()) return 0 - if(!check_fuel() || (0 < use_power_oneoff(charge_per_burn)) || check_blockage()) + if(!check_fuel() || (use_power_oneoff(charge_per_burn) < charge_per_burn) || check_blockage()) audible_message(src,"[src] coughs once and goes silent!") update_use_power(USE_POWER_OFF) return 0 @@ -159,7 +159,7 @@ if(!removed) return 0 . = calculate_thrust(removed) - playsound(loc, 'sound/machines/thruster.ogg', 100 * thrust_limit, 0, world.view * 4, 0.1) + playsound(src, 'sound/machines/thruster.ogg', 100 * thrust_limit, 0, world.view * 4, 0.1) if(network) network.update = 1 diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 4dcecc5d6e..925d5ca136 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -12,18 +12,21 @@ /obj/effect/overmap/visitable/ship name = "generic ship" desc = "Space faring vessel." + dir = NORTH icon_state = "ship" + appearance_flags = TILE_BOUND|KEEP_TOGETHER|LONG_GLIDE var/moving_state = "ship_moving" var/vessel_mass = 10000 //tonnes, arbitrary number, affects acceleration provided by engines var/vessel_size = SHIP_SIZE_LARGE //arbitrary number, affects how likely are we to evade meteors - var/max_speed = 1/(1 SECOND) //"speed of light" for the ship, in turfs/tick. + var/max_speed = 1/(1 SECOND) //"speed of light" for the ship, in turfs/decisecond. var/min_speed = 1/(2 MINUTES) // Below this, we round speed to 0 to avoid math errors. + var/position_x // Pixel coordinates in the world + var/position_y // Pixel coordinates in the world. var/list/speed = list(0,0) //speed in x,y direction var/last_burn = 0 //worldtime when ship last acceleated var/burn_delay = 1 SECOND //how often ship can do burns - var/list/last_movement = list(0,0) //worldtime when ship last moved in x,y direction var/fore_dir = NORTH //what dir ship flies towards for purpose of moving stars effect procs var/list/engines = list() @@ -38,10 +41,11 @@ min_speed = round(min_speed, SHIP_MOVE_RESOLUTION) max_speed = round(max_speed, SHIP_MOVE_RESOLUTION) SSshuttles.ships += src - START_PROCESSING(SSobj, src) + position_x = ((loc.x - 1) * WORLD_ICON_SIZE) + (WORLD_ICON_SIZE/2) + pixel_x + 1 + position_y = ((loc.y - 1) * WORLD_ICON_SIZE) + (WORLD_ICON_SIZE/2) + pixel_y + 1 /obj/effect/overmap/visitable/ship/Destroy() - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSprocessing, src) SSshuttles.ships -= src . = ..() @@ -93,14 +97,22 @@ return (ATAN2(speed[2], speed[1]) + 360) % 360 // Yes ATAN2(y, x) is correct to get clockwise degrees /obj/effect/overmap/visitable/ship/proc/adjust_speed(n_x, n_y) + var/old_still = is_still() CHANGE_SPEED_BY(speed[1], n_x) CHANGE_SPEED_BY(speed[2], n_y) - for(var/zz in map_z) - if(is_still()) - toggle_move_stars(zz) - else - toggle_move_stars(zz, fore_dir) update_icon() + var/still = is_still() + if(still == old_still) + return + else if(still) + STOP_PROCESSING(SSprocessing, src) + for(var/zz in map_z) + toggle_move_stars(zz) + else + START_PROCESSING(SSprocessing, src) + glide_size = WORLD_ICON_SIZE/max(DS2TICKS(SSprocessing.wait), 1) //Down to whatever decimal + for(var/zz in map_z) + toggle_move_stars(zz, fore_dir) /obj/effect/overmap/visitable/ship/proc/get_brake_path() if(!get_acceleration()) @@ -136,26 +148,55 @@ if(direction & SOUTH) adjust_speed(0, -acceleration) -/obj/effect/overmap/visitable/ship/process() - if(!halted && !is_still()) - var/list/deltas = list(0,0) - for(var/i=1, i<=2, i++) - if(MOVING(speed[i]) && world.time > last_movement[i] + 1/abs(speed[i])) - deltas[i] = SIGN(speed[i]) - last_movement[i] = world.time - var/turf/newloc = locate(x + deltas[1], y + deltas[2], z) - if(newloc) - Move(newloc) - update_icon() +/obj/effect/overmap/visitable/ship/process(wait) + var/new_position_x = position_x + (speed[1] * WORLD_ICON_SIZE * wait) + var/new_position_y = position_y + (speed[2] * WORLD_ICON_SIZE * wait) + + // For simplicity we assume that you can't travel more than one turf per tick. That would be hella-fast. + var/new_turf_x = CEILING(new_position_x / WORLD_ICON_SIZE, 1) + var/new_turf_y = CEILING(new_position_y / WORLD_ICON_SIZE, 1) + + var/new_pixel_x = MODULUS(new_position_x, WORLD_ICON_SIZE) - (WORLD_ICON_SIZE/2) - 1 + var/new_pixel_y = MODULUS(new_position_y, WORLD_ICON_SIZE) - (WORLD_ICON_SIZE/2) - 1 + + var/new_loc = locate(new_turf_x, new_turf_y, z) + + position_x = new_position_x + position_y = new_position_y + + if(new_loc != loc) + var/turf/old_loc = loc + Move(new_loc, NORTH, wait) + if(get_dist(old_loc, loc) > 1) + pixel_x = new_pixel_x + pixel_y = new_pixel_y + return + animate(src, pixel_x = new_pixel_x, pixel_y = new_pixel_y, time = wait, flags = ANIMATION_END_NOW) + +// If we get moved, update our internal tracking to account for it +/obj/effect/overmap/visitable/ship/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + // If moving out of another sector start off centered in the turf. + if(!isturf(old_loc)) + position_x = (WORLD_ICON_SIZE/2) + 1 + position_y = (WORLD_ICON_SIZE/2) + 1 + pixel_x = 0 + pixel_y = 0 + position_x = ((loc.x - 1) * WORLD_ICON_SIZE) + MODULUS(position_x, WORLD_ICON_SIZE) + position_y = ((loc.y - 1) * WORLD_ICON_SIZE) + MODULUS(position_y, WORLD_ICON_SIZE) /obj/effect/overmap/visitable/ship/update_icon() if(!is_still()) icon_state = moving_state - dir = get_heading() + transform = matrix().Turn(get_heading_degrees()) else icon_state = initial(icon_state) + transform = null ..() +/obj/effect/overmap/visitable/ship/set_dir(new_dir) + return ..(NORTH) // NO! We always face north. + /obj/effect/overmap/visitable/ship/proc/burn() for(var/datum/ship_engine/E in engines) . += E.burn() @@ -175,10 +216,15 @@ //deciseconds to next step /obj/effect/overmap/visitable/ship/proc/ETA() . = INFINITY - for(var/i=1, i<=2, i++) - if(MOVING(speed[i])) - . = min(last_movement[i] - world.time + 1/abs(speed[i]), .) - . = max(.,0) + if(MOVING(speed[1])) + var/offset = MODULUS(position_x, WORLD_ICON_SIZE) + var/dist_to_go = (speed[1] > 0) ? (WORLD_ICON_SIZE - offset) : offset + . = min(., (dist_to_go / abs(speed[1])) * (1/WORLD_ICON_SIZE)) + if(MOVING(speed[2])) + var/offset = MODULUS(position_y, WORLD_ICON_SIZE) + var/dist_to_go = (speed[2] > 0) ? (WORLD_ICON_SIZE - offset) : offset + . = min(., (dist_to_go / abs(speed[2])) * (1/WORLD_ICON_SIZE)) + . = max(., 0) /obj/effect/overmap/visitable/ship/proc/halt() adjust_speed(-speed[1], -speed[2]) diff --git a/code/modules/overmap/turfs.dm b/code/modules/overmap/turfs.dm index fc9f0b16eb..bd31d6bc9a 100644 --- a/code/modules/overmap/turfs.dm +++ b/code/modules/overmap/turfs.dm @@ -19,7 +19,10 @@ var/global/list/map_sectors = list() var/turf/unsimulated/map/edge/wrap_buddy /turf/unsimulated/map/edge/Initialize() - . = ..() + ..() + return INITIALIZE_HINT_LATELOAD + +/turf/unsimulated/map/edge/LateInitialize() //This could be done by using the using_map.overmap_size much faster, HOWEVER, doing it programatically to 'find' // the edges this way allows for 'sub overmaps' elsewhere and whatnot. for(var/side in alldirs) //The order of this list is relevant: It should definitely break on finding a cardinal FIRST. diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 3c18577db3..8b94e3c416 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -120,17 +120,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins SSnanoui.update_uis(src) /obj/machinery/photocopier/faxmachine/attackby(obj/item/O as obj, mob/user as mob) - if(istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) || istype(O, /obj/item/weapon/paper_bundle)) - if(!copyitem) - user.drop_item() - copyitem = O - O.loc = src - to_chat(user, "You insert \the [O] into \the [src].") - playsound(loc, "sound/machines/click.ogg", 100, 1) - flick(insert_anim, src) - else - to_chat(user, "There is already something in \the [src].") - else if(istype(O, /obj/item/device/multitool) && panel_open) + if(O.is_multitool() && panel_open) var/input = sanitize(input(usr, "What Department ID would you like to give this fax machine?", "Multitool-Fax Machine Interface", department)) if(!input) to_chat(usr, "No input found. Please hang up and try your call again.") @@ -138,17 +128,8 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins department = input if( !(("[department]" in alldepartments) || ("[department]" in admin_departments)) && !(department == "Unknown")) alldepartments |= department - else if(O.is_wrench()) - playsound(loc, O.usesound, 50, 1) - anchored = !anchored - to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else if(default_deconstruction_screwdriver(user, O)) - return - else if(default_deconstruction_crowbar(user, O)) - return - - return + return ..() /obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination) if(stat & (BROKEN|NOPOWER)) @@ -175,7 +156,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins return 0 //You can't send faxes to "Unknown" flick("faxreceive", src) - playsound(loc, "sound/effects/printer.ogg", 50, 1) + playsound(src, "sound/effects/printer.ogg", 50, 1) // give the sprite some time to flick diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 374fb647c5..cf1f251307 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -38,19 +38,19 @@ P.loc = src icon_state = "[initial(icon_state)]-open" flick("[initial(icon_state)]-open",src) - playsound(loc, 'sound/bureaucracy/filingcabinet.ogg', 50, 1) + playsound(src, 'sound/bureaucracy/filingcabinet.ogg', 50, 1) sleep(40) icon_state = initial(icon_state) updateUsrDialog() else if(P.is_wrench()) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") else if(P.is_screwdriver()) to_chat(user, "You begin taking the [name] apart.") playsound(src, P.usesound, 50, 1) if(do_after(user, 10 * P.toolspeed)) - playsound(loc, P.usesound, 50, 1) + playsound(src, P.usesound, 50, 1) to_chat(user, "You take the [name] apart.") new /obj/item/stack/material/steel( src.loc, 4 ) for(var/obj/item/I in contents) @@ -101,7 +101,7 @@ usr.put_in_hands(P) updateUsrDialog() flick("[initial(icon_state)]-open",src) - playsound(loc, 'sound/bureaucracy/filingcabinet.ogg', 50, 1) + playsound(src, 'sound/bureaucracy/filingcabinet.ogg', 50, 1) spawn(0) sleep(20) icon_state = initial(icon_state) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 8e799efb25..8366ed94a7 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -184,7 +184,7 @@ if(rigged && (Holiday == "April Fool's Day")) if(spam_flag == 0) spam_flag = 1 - playsound(loc, 'sound/items/bikehorn.ogg', 50, 1) + playsound(src, 'sound/items/bikehorn.ogg', 50, 1) spawn(20) spam_flag = 0 return @@ -369,7 +369,7 @@ user.visible_message("[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!", \ "You hold \the [P] up to \the [src], burning it slowly.") - playsound(src.loc, 'sound/bureaucracy/paperburn.ogg', 50, 1) + playsound(src, 'sound/bureaucracy/paperburn.ogg', 50, 1) spawn(20) if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 28979b4154..bbf66d9f9a 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -154,13 +154,13 @@ insert_sheet_at(usr, page+1, in_hand) else if(page != pages.len) page++ - playsound(src.loc, "pageturn", 50, 1) + playsound(src, "pageturn", 50, 1) if(href_list["prev_page"]) if(in_hand && (istype(in_hand, /obj/item/weapon/paper) || istype(in_hand, /obj/item/weapon/photo))) insert_sheet_at(usr, page, in_hand) else if(page > 1) page-- - playsound(src.loc, "pageturn", 50, 1) + playsound(src, "pageturn", 50, 1) if(href_list["remove"]) var/obj/item/weapon/W = pages[page] usr.put_in_hands(W) diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index cbbe7eeb4e..f5fae97d83 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -60,7 +60,7 @@ paperamount += paper_result user.drop_from_inventory(W) qdel(W) - playsound(src.loc, 'sound/items/pshred.ogg', 75, 1) + playsound(src, 'sound/items/pshred.ogg', 75, 1) flick(shred_anim, src) if(paperamount > max_paper) to_chat(user,"\The [src] was too full, and shredded paper goes everywhere!") diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index dbfd7855ff..e27f8db8b0 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -26,8 +26,11 @@ drop_sound = 'sound/items/drop/accessory.ogg' /obj/item/weapon/pen/attack_self(var/mob/user) + if(!user.checkClickCooldown()) + return + user.setClickCooldown(1 SECOND) to_chat(user, "Click.") - playsound(loc, 'sound/items/penclick.ogg', 50, 1) + playsound(src, 'sound/items/penclick.ogg', 50, 1) /obj/item/weapon/pen/blue desc = "It's a normal blue ink pen." @@ -50,7 +53,7 @@ /obj/item/weapon/pen/AltClick(mob/user) to_chat(user, "Click.") - playsound(loc, 'sound/items/penclick.ogg', 50, 1) + playsound(src, 'sound/items/penclick.ogg', 50, 1) return /obj/item/weapon/pen/multi/attack_self(mob/user) @@ -149,7 +152,7 @@ sharp = 1 edge = 1 w_class = active_w_class - playsound(user, 'sound/weapons/saberon.ogg', 15, 1) + playsound(src, 'sound/weapons/saberon.ogg', 15, 1) damtype = SEARING catchable = FALSE @@ -163,7 +166,7 @@ /obj/item/weapon/pen/blade/proc/deactivate(mob/living/user) if(!active) return - playsound(user, 'sound/weapons/saberoff.ogg', 15, 1) + playsound(src, 'sound/weapons/saberoff.ogg', 15, 1) active = 0 icon_state = default_icon_state embed_chance = initial(embed_chance) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 71a110b4bd..39f91401d0 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -15,6 +15,7 @@ var/copies = 1 //how many copies to print! var/toner = 30 //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/copying = FALSE // Is the printer busy with something? Sanity check variable. /obj/machinery/photocopier/Initialize() . = ..() @@ -58,33 +59,47 @@ ui.open() ui.set_auto_update(10) +/obj/machinery/photocopier/proc/copy_operation(var/mob/user) + if(copying) + return FALSE + copying = TRUE + for(var/i = 0, i < copies, i++) + if(toner <= 0) + break + + if (istype(copyitem, /obj/item/weapon/paper)) + playsound(loc, "sound/machines/copier.ogg", 100, 1) + sleep(11) + copy(copyitem) + audible_message("You can hear [src] whirring as it finishes printing.") + playsound(loc, "sound/machines/buzzbeep.ogg", 30) + else if (istype(copyitem, /obj/item/weapon/photo)) + playsound(loc, "sound/machines/copier.ogg", 100, 1) + sleep(11) + photocopy(copyitem) + audible_message("You can hear [src] whirring as it finishes printing.") + playsound(loc, "sound/machines/buzzbeep.ogg", 30) + else if (istype(copyitem, /obj/item/weapon/paper_bundle)) + sleep(11) + playsound(loc, "sound/machines/copier.ogg", 100, 1) + var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem) + sleep(11*B.pages.len) + audible_message("You can hear [src] whirring as it finishes printing.") + playsound(loc, "sound/machines/buzzbeep.ogg", 30) + else + to_chat(user, "\The [copyitem] can't be copied by [src].") + playsound(loc, "sound/machines/buzz-two.ogg", 100) + break + + use_power(active_power_usage) + copying = FALSE + /obj/machinery/photocopier/Topic(href, href_list) if(href_list["copy"]) if(stat & (BROKEN|NOPOWER)) return + addtimer(CALLBACK(src, .proc/copy_operation, usr), 0) - for(var/i = 0, i < copies, i++) - if(toner <= 0) - break - - if (istype(copyitem, /obj/item/weapon/paper)) - playsound(loc, "sound/machines/copier.ogg", 100, 1) - sleep(11) - copy(copyitem) - else if (istype(copyitem, /obj/item/weapon/photo)) - playsound(loc, "sound/machines/copier.ogg", 100, 1) - sleep(11) - photocopy(copyitem) - else if (istype(copyitem, /obj/item/weapon/paper_bundle)) - sleep(11) - playsound(loc, "sound/machines/copier.ogg", 100, 1) - var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem) - sleep(11*B.pages.len) - else - to_chat(usr, "\The [copyitem] can't be copied by \the [src].") - break - - use_power(active_power_usage) else if(href_list["remove"]) if(copyitem) copyitem.loc = usr.loc @@ -128,7 +143,7 @@ copyitem = O O.loc = src to_chat(user, "You insert \the [O] into \the [src].") - playsound(loc, "sound/machines/click.ogg", 100, 1) + playsound(src, "sound/machines/click.ogg", 100, 1) flick(insert_anim, src) else to_chat(user, "There is already something in \the [src].") @@ -142,10 +157,9 @@ else to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") else if(O.is_wrench()) - playsound(loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else if(default_deconstruction_screwdriver(user, O)) return else if(default_deconstruction_crowbar(user, O)) @@ -205,6 +219,7 @@ if(need_toner) toner-- if(toner == 0) + playsound(loc, "sound/machines/buzz-sigh.ogg", 100) visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return c @@ -227,6 +242,7 @@ toner -= 5 //photos use a lot of ink! if(toner < 0) toner = 0 + playsound(loc, "sound/machines/buzz-sigh.ogg", 100) visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return p @@ -237,6 +253,7 @@ for(var/obj/item/weapon/W in bundle.pages) if(toner <= 0 && need_toner) toner = 0 + playsound(loc, "sound/machines/buzz-sigh.ogg", 100) visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") break diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index d3bae838fc..2e27fa0658 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -97,7 +97,7 @@ var/global/photo_count = 0 var/mob/living/carbon/human/M = usr if(!( istype(over_object, /obj/screen) )) return ..() - playsound(loc, "rustle", 50, 1, -5) + playsound(src, "rustle", 50, 1, -5) if((!( M.restrained() ) && !( M.stat ) && M.back == src)) switch(over_object.name) if("r_hand") @@ -242,7 +242,7 @@ var/global/photo_count = 0 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) + playsound(src, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) pictures_left-- desc = "A polaroid camera. It has [pictures_left] photos left." diff --git a/code/modules/planet/time.dm b/code/modules/planet/time.dm index d9c6642e6a..5194db91d7 100644 --- a/code/modules/planet/time.dm +++ b/code/modules/planet/time.dm @@ -11,27 +11,29 @@ /datum/time/New(new_time) if(new_time) + if(new_time >= seconds_in_day) + new_time = rollover(new_time) seconds_stored = new_time ..() /datum/time/proc/add_seconds(amount) var/answer = seconds_stored + amount * 10 if(answer >= seconds_in_day) - rollover(answer) + answer = rollover(answer) return new type(answer) /datum/time/proc/add_minutes(amount) var/real_amount = amount * seconds_in_minute var/answer = real_amount + seconds_stored if(answer >= seconds_in_day) - rollover(answer) + answer = rollover(answer) return new type(answer) /datum/time/proc/add_hours(amount) var/real_amount = amount * seconds_in_hour var/answer = real_amount + seconds_stored if(answer >= seconds_in_day) - rollover(answer) + answer = rollover(answer) return new type(answer) /datum/time/proc/rollover(time) diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 46f05bfd80..93c716b426 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -69,7 +69,7 @@ /obj/machinery/power/am_control_unit/proc/produce_power() - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + playsound(src, 'sound/effects/bang.ogg', 25, 1) var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with if(core_power <= 0) return 0//Something is wrong var/core_damage = 0 @@ -85,7 +85,7 @@ for(var/obj/machinery/am_shielding/AMS in linked_cores) AMS.stability -= core_damage AMS.check_stability(1) - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) + playsound(src, 'sound/effects/bang.ogg', 50, 1) return diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 47ecca696d..78a28ec0eb 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -34,10 +34,14 @@ // controls power to devices in that area // may be opened to change power cell // three different channels (lighting/equipment/environ) - may each be set to on, off, or auto -#define POWERCHAN_OFF 0 -#define POWERCHAN_OFF_AUTO 1 -#define POWERCHAN_ON 2 -#define POWERCHAN_ON_AUTO 3 +#define POWERCHAN_OFF 0 // Power channel is off and will stay that way dammit +#define POWERCHAN_OFF_AUTO 1 // Power channel is off until power rises above a threshold +#define POWERCHAN_ON 2 // Power channel is on until there is no power +#define POWERCHAN_ON_AUTO 3 // Power channel is on until power drops below a threshold + +#define NIGHTSHIFT_AUTO 1 +#define NIGHTSHIFT_NEVER 2 +#define NIGHTSHIFT_ALWAYS 3 //NOTE: STUFF STOLEN FROM AIRLOCK.DM thx @@ -119,6 +123,10 @@ var/global/list/status_overlays_lighting var/global/list/status_overlays_environ var/alarms_hidden = FALSE //If power alarms from this APC are visible on consoles + + var/nightshift_lights = FALSE + var/nightshift_setting = NIGHTSHIFT_AUTO + var/last_nightshift_switch = 0 /obj/machinery/power/apc/updateDialog() if (stat & (BROKEN|MAINT)) @@ -519,12 +527,12 @@ if (has_electronics==1 && terminal) has_electronics = 2 stat &= ~MAINT - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You screw the circuit electronics into place.") else if (has_electronics==2) has_electronics = 1 stat |= MAINT - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You unfasten the electronics.") else /* has_electronics==0 */ to_chat(user, "There is nothing to secure.") @@ -550,7 +558,7 @@ return user.visible_message("[user.name] adds cables to the APC frame.", \ "You start adding cables to the APC frame...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20)) if (C.amount >= 10 && !terminal && opened && has_electronics != 2) var/obj/structure/cable/N = T.get_cable_node() @@ -573,7 +581,7 @@ return user.visible_message("[user.name] starts dismantling the [src]'s power terminal.", \ "You begin to cut the cables...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50 * W.toolspeed)) if(terminal && opened && has_electronics!=2) if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) @@ -588,7 +596,7 @@ else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN))) user.visible_message("[user.name] inserts the power control board into [src].", \ "You start to insert the power control board into the frame...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10)) if(has_electronics==0) has_electronics = 1 @@ -648,7 +656,7 @@ if(do_after(user, 50)) user.visible_message("[user.name] resets the APC with a beep from their [W.name].",\ "You finish resetting the APC.") - playsound(src.loc, 'sound/machines/chime.ogg', 25, 1) + playsound(src, 'sound/machines/chime.ogg', 25, 1) reboot() else if ((stat & BROKEN) \ @@ -734,7 +742,7 @@ if(H.species.can_shred(H)) user.setClickCooldown(user.get_attack_speed()) user.visible_message("[user.name] slashes at the [src.name]!", "You slash at the [src.name]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + playsound(src, 'sound/weapons/slash.ogg', 100, 1) var/allcut = wires.IsAllCut() @@ -798,6 +806,8 @@ "coverLocked" = coverlocked, "siliconUser" = issilicon(user) || isobserver(user), //I add observer here so admins can have more control, even if it makes 'siliconUser' seem inaccurate. "emergencyLights" = !emergency_lights, + "nightshiftLights" = nightshift_lights, + "nightshiftSetting" = nightshift_setting, "powerChannels" = list( list( @@ -917,6 +927,15 @@ if(!can_use(usr, 1)) return 1 + if(href_list["nightshift"]) + if(last_nightshift_switch > world.time - 10 SECONDS) // don't spam... + to_chat(usr, "[src]'s night lighting circuit breaker is still cycling!") + return 0 + last_nightshift_switch = world.time + nightshift_setting = text2num(href_list["nightshift"]) + update_nightshift() + return 1 + if(locked && !issilicon(usr) ) if(isobserver(usr) ) var/mob/observer/dead/O = usr //Added to allow admin nanoUI interactions. @@ -1038,10 +1057,9 @@ return 0 /obj/machinery/power/apc/process() - - if(stat & (BROKEN|MAINT)) - return if(!area.requires_power) + return PROCESS_KILL + if(stat & (BROKEN|MAINT)) return if(failure_timer) update() @@ -1050,9 +1068,9 @@ force_update = 1 return - lastused_light = area.usage(LIGHT) - lastused_equip = area.usage(EQUIP) - lastused_environ = area.usage(ENVIRON) + lastused_light = area.usage(LIGHT, lighting >= POWERCHAN_ON) + lastused_equip = area.usage(EQUIP, equipment >= POWERCHAN_ON) + lastused_environ = area.usage(ENVIRON, environ >= POWERCHAN_ON) area.clear_usage() lastused_total = lastused_light + lastused_equip + lastused_environ @@ -1367,4 +1385,24 @@ obj/machinery/power/apc/proc/autoset(var/cur_state, var/on) if(src && grid_check == TRUE) grid_check = FALSE +/obj/machinery/power/apc/proc/set_nightshift(on, var/automated) + set waitfor = FALSE + if(automated && istype(area, /area/shuttle)) + return + nightshift_lights = on + update_nightshift() + +/obj/machinery/power/apc/proc/update_nightshift() + var/new_state = nightshift_lights + + switch(nightshift_setting) + if(NIGHTSHIFT_NEVER) + new_state = FALSE + if(NIGHTSHIFT_ALWAYS) + new_state = TRUE + + for(var/obj/machinery/light/L in area) + L.nightshift_mode(new_state) + CHECK_TICK + #undef APC_UPDATE_ICON_COOLDOWN diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 134464e18e..0fc1695363 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -112,7 +112,7 @@ var/global/list/light_type_cache = list() new /obj/item/stack/material/steel( get_turf(src.loc), sheets_refunded ) user.visible_message("[user.name] deconstructs [src].", \ "You deconstruct [src].", "You hear a noise.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 75, 1) qdel(src) if (src.stage == 2) to_chat(usr, "You have to remove the wires first.") @@ -129,7 +129,7 @@ var/global/list/light_type_cache = list() new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red") user.visible_message("[user.name] removes the wiring from [src].", \ "You remove the wiring from [src].", "You hear a noise.") - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) return if(istype(W, /obj/item/stack/cable_coil)) @@ -240,9 +240,18 @@ var/global/list/light_type_cache = list() var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode + var/nightshift_enabled = FALSE + var/nightshift_allowed = TRUE + var/brightness_range_ns + var/brightness_power_ns + var/brightness_color_ns + /obj/machinery/light/flicker auto_flicker = TRUE +/obj/machinery/light/no_nightshift + nightshift_allowed = FALSE + // the smaller bulb light fixture /obj/machinery/light/small @@ -370,7 +379,10 @@ var/global/list/light_type_cache = list() /obj/machinery/light/proc/update(var/trigger = 1) update_icon() if(on) - if(light_range != brightness_range || light_power != brightness_power || light_color != brightness_color) + var/correct_range = nightshift_enabled ? brightness_range_ns : brightness_range + var/correct_power = nightshift_enabled ? brightness_power_ns : brightness_power + var/correct_color = nightshift_enabled ? brightness_color_ns : brightness_color + if(light_range != correct_range || light_power != correct_power || light_color != correct_color) if(!auto_flicker) switchcount++ if(rigged) @@ -388,7 +400,9 @@ var/global/list/light_type_cache = list() set_light(0) else update_use_power(USE_POWER_ACTIVE) - set_light(brightness_range, brightness_power, brightness_color) + set_light(correct_range, correct_power, correct_color) + if(cell?.charge < cell?.maxcharge) + START_PROCESSING(SSobj, src) else if(has_emergency_power(LIGHT_EMERGENCY_POWER_USE) && !turned_off()) update_use_power(USE_POWER_IDLE) emergency_mode = TRUE @@ -399,6 +413,13 @@ var/global/list/light_type_cache = list() update_active_power_usage((light_range * light_power) * LIGHTING_POWER_FACTOR) +/obj/machinery/light/proc/nightshift_mode(var/state) + if(!nightshift_allowed) + return + + if(state != nightshift_enabled) + nightshift_enabled = state + update(FALSE) /obj/machinery/light/attack_generic(var/mob/user, var/damage) if(!damage) @@ -459,10 +480,15 @@ var/global/list/light_type_cache = list() status = L.status switchcount = L.switchcount rigged = L.rigged + brightness_range = L.brightness_range brightness_power = L.brightness_power brightness_color = L.brightness_color + brightness_range_ns = L.nightshift_range + brightness_power_ns = L.nightshift_power + brightness_color_ns = L.nightshift_color + // attack with item - insert light (if right type), otherwise try to break the light /obj/machinery/light/proc/insert_bulb(obj/item/weapon/light/L) @@ -727,7 +753,7 @@ var/global/list/light_type_cache = list() if(!skip_sound_and_sparks) if(status == LIGHT_OK || status == LIGHT_BURNED) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) if(on) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) @@ -770,11 +796,11 @@ var/global/list/light_type_cache = list() if(has_power()) emergency_mode = FALSE update(FALSE) - if(cell.charge == cell.maxcharge) + if(!cell.give(LIGHT_EMERGENCY_POWER_USE*2)) // Recharge and stop if no more was able to be added return PROCESS_KILL - cell.charge = min(cell.maxcharge, cell.charge + LIGHT_EMERGENCY_POWER_USE*2) //Recharge emergency power automatically while not using it if(emergency_mode && !use_emergency_power(LIGHT_EMERGENCY_POWER_USE)) update(FALSE) //Disables emergency mode and sets the color to normal + return PROCESS_KILL // Drop out if we're out of cell power. These are often in POIs and there's no point in recharging. if(auto_flicker && !flickering) if(check_for_player_proximity(src, radius = 12, ignore_ghosts = FALSE, ignore_afk = TRUE)) @@ -825,6 +851,10 @@ var/global/list/light_type_cache = list() var/brightness_power = 1 var/brightness_color = LIGHT_COLOR_INCANDESCENT_TUBE + var/nightshift_range = 8 + var/nightshift_power = 0.7 + var/nightshift_color = LIGHT_COLOR_NIGHTSHIFT + /obj/item/weapon/light/tube name = "light tube" desc = "A replacement light tube." @@ -841,6 +871,9 @@ var/global/list/light_type_cache = list() brightness_range = 15 brightness_power = 9 + nightshift_range = 10 + nightshift_power = 0.9 + /obj/item/weapon/light/bulb name = "light bulb" desc = "A replacement light bulb." @@ -852,6 +885,9 @@ var/global/list/light_type_cache = list() brightness_power = 4 brightness_color = LIGHT_COLOR_INCANDESCENT_BULB + nightshift_range = 3 + nightshift_power = 0.35 + /obj/item/weapon/light/throw_impact(atom/hit_atom) ..() shatter() @@ -938,7 +974,7 @@ var/global/list/light_type_cache = list() status = LIGHT_BROKEN force = 5 sharp = 1 - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) update_icon() //Lamp Shade diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm index 26a534e222..81f73be63d 100644 --- a/code/modules/power/pacman2.dm +++ b/code/modules/power/pacman2.dm @@ -72,7 +72,7 @@ else if(!active) if(O.is_wrench()) anchored = !anchored - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(anchored) to_chat(user, "You secure the generator to the floor.") else @@ -80,13 +80,13 @@ SSmachines.makepowernets() else if(O.is_screwdriver()) open = !open - playsound(loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) if(open) to_chat(user, "You open the access panel.") else to_chat(user, "You close the access panel.") else if(O.is_crowbar() && !open) - playsound(loc, O.usesound, 50, 1) + playsound(src, O.usesound, 50, 1) var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) for(var/obj/item/I in component_parts) I.loc = src.loc diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index d08c5dd559..6a7da80d04 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -272,7 +272,7 @@ else disconnect_from_network() to_chat(user, "You unsecure the generator from the floor.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) anchored = !anchored return else if(default_deconstruction_screwdriver(user, O)) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 91d88d2822..5c8ba5a8a4 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -64,44 +64,6 @@ /obj/machinery/power/proc/disconnect_terminal(var/obj/machinery/power/terminal/term) // machines without a terminal will just return, no harm no fowl. return -// returns true if the area has power on given channel (or doesn't require power). -// defaults to power_channel -/obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel - - if(!src.loc) - return 0 - - //Don't do this. It allows machines that set use_power to 0 when off (many machines) to - //be turned on again and used after a power failure because they never gain the NOPOWER flag. - //if(!use_power) - // return 1 - - var/area/A = src.loc.loc // make sure it's in an area - if(!A || !isarea(A)) - return 0 // if not, then not powered - if(chan == -1) - chan = power_channel - return A.powered(chan) // return power status of the area - -// increment the power usage stats for an area -/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel - var/area/A = get_area(src) // make sure it's in an area - if(!A || !isarea(A)) - return - if(chan == -1) - chan = power_channel - A.use_power(amount, chan) - -/obj/machinery/proc/power_change() // called whenever the power settings of the containing area change - // by default, check equipment channel & set flag - // can override if needed - if(powered(power_channel)) - stat &= ~NOPOWER - else - - stat |= NOPOWER - return - // connect the machine to a powernet if a node cable is present on the turf /obj/machinery/power/proc/connect_to_network() var/turf/T = src.loc @@ -372,7 +334,7 @@ var/drained_energy = drained_hp*20 if (source_area) - source_area.use_power(drained_energy/CELLRATE) + source_area.use_power_oneoff(drained_energy/CELLRATE, EQUIP) else if (istype(power_source,/datum/powernet)) var/drained_power = drained_energy/CELLRATE drained_power = PN.draw_power(drained_power) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 6478ff999a..996847b13b 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -10,12 +10,15 @@ unacidable = 1 use_power = USE_POWER_OFF light_range = 4 - flags = PROXMOVE var/obj/machinery/field_generator/FG1 = null var/obj/machinery/field_generator/FG2 = null var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second. +/obj/machinery/containment_field/Initialize() + sense_proximity(callback = .HasProximity) + /obj/machinery/containment_field/Destroy() + unsense_proximity(callback = .HasProximity) if(FG1 && !FG1.clean_up) FG1.cleanup() if(FG2 && !FG2.clean_up) @@ -33,7 +36,7 @@ /obj/machinery/containment_field/ex_act(severity) return 0 -/obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj) +/obj/machinery/containment_field/HasProximity(turf/T, atom/movable/AM, old_loc) if(istype(AM,/mob/living/silicon) && prob(40)) shock(AM) return 1 @@ -42,8 +45,6 @@ return 1 return 0 - - /obj/machinery/containment_field/shock(mob/living/user as mob) if(hasShocked) return 0 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 3b381ff2f0..ea8b5cd230 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -134,7 +134,7 @@ var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1) var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots - playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) + playsound(src, 'sound/weapons/emitter.ogg', 25, 1) if(prob(35)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) @@ -181,7 +181,7 @@ to_chat(user, "\The [src] needs to be wrenched to the floor.") if(1) if (WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) user.visible_message("[user.name] starts to weld [src] to the floor.", \ "You start to weld [src] to the floor.", \ "You hear welding") @@ -194,7 +194,7 @@ to_chat(user, "You need more welding fuel to complete this task.") if(2) if (WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) user.visible_message("[user.name] starts to cut [src] free from the floor.", \ "You start to cut [src] free from the floor.", \ "You hear welding") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index b02c835785..3917e68793 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -130,7 +130,7 @@ field_generator power level display return if(1) if (WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ "You start to weld the [src] to the floor.", \ "You hear welding") @@ -142,7 +142,7 @@ field_generator power level display return if(2) if (WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) + playsound(src, WT.usesound, 50, 1) user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ "You start to cut the [src] free from the floor.", \ "You hear welding") diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index bb470811ba..213b37d01a 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -31,12 +31,12 @@ return if(W.is_screwdriver()) panel_open = !panel_open - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) visible_message("\The [user] adjusts \the [src]'s mechanisms.") if(panel_open && do_after(user, 30)) to_chat(user, "\The [src] looks like it could be modified.") if(panel_open && do_after(user, 80 * W.toolspeed)) // We don't have skills, so a delayed hint for engineers will have to do for now. (Panel open check for sanity) - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "\The [src] looks like it could be adapted to forge advanced materials via particle acceleration, somehow..") else to_chat(user, "\The [src]'s mechanisms look secure.") diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index cdab32d110..08af0c23a5 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -132,9 +132,9 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return -/obj/structure/particle_accelerator/Move() - ..() - if(master && master.active) +/obj/structure/particle_accelerator/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + if(master?.active) master.toggle_power() log_game("PACCEL([x],[y],[z]) Was moved while active and turned off.") investigate_log("was moved whilst active; it powered down.","singulo") diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index bf658f624a..adb1bfa3d7 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -160,49 +160,54 @@ /obj/machinery/particle_accelerator/control_box/proc/part_scan() for(var/obj/structure/particle_accelerator/fuel_chamber/F in orange(1,src)) src.set_dir(F.dir) + break + connected_parts = list() - var/tally = 0 - var/ldir = turn(dir,-90) - var/rdir = turn(dir,90) + assembled = 0 + var/ldir = turn(dir,90) + var/rdir = turn(dir,-90) var/odir = turn(dir,180) var/turf/T = src.loc - T = get_step(T,rdir) - if(check_part(T,/obj/structure/particle_accelerator/fuel_chamber)) - tally++ - T = get_step(T,odir) - if(check_part(T,/obj/structure/particle_accelerator/end_cap)) - tally++ - T = get_step(T,dir) - T = get_step(T,dir) - if(check_part(T,/obj/structure/particle_accelerator/power_box)) - tally++ - T = get_step(T,dir) - if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/center)) - tally++ + T = get_step(T,ldir) - if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/left)) - tally++ - T = get_step(T,rdir) - T = get_step(T,rdir) - if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/right)) - tally++ - if(tally >= 6) - assembled = 1 - return 1 - else - assembled = 0 + if(!check_part(T,/obj/structure/particle_accelerator/fuel_chamber)) return 0 + T = get_step(T,odir) + if(!check_part(T,/obj/structure/particle_accelerator/end_cap)) + return 0 + + T = get_step(T,dir) + T = get_step(T,dir) + if(!check_part(T,/obj/structure/particle_accelerator/power_box)) + return 0 + + T = get_step(T,dir) + if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/center)) + return 0 + + T = get_step(T,ldir) + if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/left)) + return 0 + + T = get_step(T,rdir) + T = get_step(T,rdir) + if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/right)) + return 0 + + assembled = 1 + return 1 + + /obj/machinery/particle_accelerator/control_box/proc/check_part(var/turf/T, var/type) if(!(T)||!(type)) return 0 + var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T - if(istype(PA, type)) - if(PA.connect_master(src)) - if(PA.report_ready(src)) - src.connected_parts.Add(PA) - return 1 + if(istype(PA, type) && PA.connect_master(src) && PA.report_ready(src)) + src.connected_parts.Add(PA) + return 1 return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index 9d37c2e6b8..0a82e480d6 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -12,11 +12,11 @@ icon_state = "emitter_center" reference = "emitter_center" -/obj/structure/particle_accelerator/particle_emitter/left +/obj/structure/particle_accelerator/particle_emitter/right // It's looking for these in opposite directions. icon_state = "emitter_left" reference = "emitter_left" -/obj/structure/particle_accelerator/particle_emitter/right +/obj/structure/particle_accelerator/particle_emitter/left icon_state = "emitter_right" reference = "emitter_right" diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 0b0fe25a56..c878de0b41 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -154,7 +154,7 @@ //inputting if(input_attempt && (!input_pulsed && !input_cut) && !grid_check) - target_load = clamp((capacity-charge)/SMESRATE, 0, input_level) // Amount we will request from the powernet. + target_load = CLAMP((capacity-charge)/SMESRATE, 0, input_level) // Amount we will request from the powernet. var/input_available = FALSE for(var/obj/machinery/power/terminal/term in terminals) if(!term.powernet) @@ -321,7 +321,7 @@ to_chat(user, "You must remove the floor plating first.") else to_chat(user, "You begin to cut the cables...") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50 * W.toolspeed)) if (prob(50) && electrocute_mob(usr, term.powernet, term)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 558e879a87..f8bf16087e 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -58,7 +58,7 @@ // Pre-installed and pre-charged SMES hidden from the station, for use in submaps. /obj/machinery/power/smes/buildable/point_of_interest/Initialize() . = ..() - charge = 1e7 // Should be enough for an individual POI. + charge = capacity // Should be enough for an individual POI. RCon = FALSE input_level = input_level_max output_level = output_level_max @@ -333,7 +333,7 @@ to_chat(user, "You have to disassemble the terminal first!") return - playsound(get_turf(src), W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to disassemble the [src]!") if (do_after(usr, (100 * cur_coils) * W.toolspeed)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s with a normal crowbar diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 65e618613c..5eadfb7d07 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -65,14 +65,14 @@ GLOBAL_LIST_EMPTY(solars_list) /obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user) if(W.is_crowbar()) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar panel.") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc S.give_glass() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the solar panel.") qdel(src) return @@ -247,7 +247,7 @@ GLOBAL_LIST_EMPTY(solars_list) var/obj/item/stack/material/S = W if(S.use(2)) glass_type = W.type - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] places the glass on the solar assembly.") if(tracker) new /obj/machinery/power/tracker(get_turf(src), src) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index ab54a82957..28835d7fdd 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -77,7 +77,7 @@ var/power_produced = powernet ? power / power_loss : power add_avail(power_produced*input_power_multiplier) flick("coilhit", src) - playsound(src.loc, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) + playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 5, power_produced) //addtimer(CALLBACK(src, .proc/reset_shocked), 10) spawn(10) reset_shocked() @@ -92,7 +92,7 @@ coeff = max(coeff, 10) var/power = (powernet.avail/2) draw_power(power) - playsound(src.loc, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) + playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 10, power/(coeff/2)) //TFF 3/6/19 - Port Cit RP fix for infinite frames diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index ce09621b7a..2f0418b60d 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -60,7 +60,7 @@ move_the_basket_ball(max(wait - 5, 4 + orbiting_balls.len * 1.5)) - playsound(src.loc, 'sound/effects/lightningbolt.ogg', 100, 1, extrarange = 30) + playsound(src, 'sound/effects/lightningbolt.ogg', 100, 1, extrarange = 30) set_dir(tesla_zap(src.loc, 7, TESLA_DEFAULT_POWER, TRUE)) @@ -101,7 +101,7 @@ energy_to_lower = energy_to_raise - 20 energy_to_raise = energy_to_raise * 1.25 - playsound(src.loc, 'sound/effects/lightning_chargeup.ogg', 100, 1, extrarange = 30) + playsound(src, 'sound/effects/lightning_chargeup.ogg', 100, 1, extrarange = 30) //addtimer(CALLBACK(src, .proc/new_mini_ball), 100) spawn(100) new_mini_ball() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 673b2ece86..0e2cc7cbf8 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -60,14 +60,14 @@ /obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user) if(W.is_crowbar()) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar tracker.") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc S.give_glass() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the tracker.") qdel(src) return diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index b07cacd92b..fcd6e6678f 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -134,7 +134,7 @@ AC.loc = src stored_ammo.Insert(1, AC) //add it to the head of our magazine's list L.update_icon() - playsound(user.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() // This dumps all the bullets right on the floor @@ -144,11 +144,11 @@ to_chat(user, "[src] is already empty!") return to_chat(user, "You empty [src].") - playsound(user.loc, "casing_sound", 50, 1) + playsound(src, "casing_sound", 50, 1) spawn(7) - playsound(user.loc, "casing_sound", 50, 1) + playsound(src, "casing_sound", 50, 1) spawn(10) - playsound(user.loc, "casing_sound", 50, 1) + playsound(src, "casing_sound", 50, 1) for(var/obj/item/ammo_casing/C in stored_ammo) C.loc = user.loc C.set_dir(pick(cardinal)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index fc1b6c7e22..a21f5358ad 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -493,7 +493,7 @@ user.visible_message("*click click*", "*click*") else src.visible_message("*click click*") - playsound(src.loc, 'sound/weapons/empty.ogg', 100, 1) + playsound(src, 'sound/weapons/empty.ogg', 100, 1) // Called when the user is about to fire. // Moved from handle_post_fire() because if using a laser, the message for when someone got shot would show up before the firing message. @@ -643,9 +643,9 @@ return if(silenced) - playsound(user, shot_sound, 10, 1) + playsound(src, shot_sound, 10, 1) else - playsound(user, shot_sound, 50, 1) + playsound(src, shot_sound, 50, 1) //Suicide handling. /obj/item/weapon/gun/var/mouthshoot = 0 //To stop people from suiciding twice... >.> diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index a12ceb38f5..39d366d8ac 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -127,7 +127,7 @@ power_supply = P P.loc = src user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() update_held_icon() else @@ -143,7 +143,7 @@ power_supply.update_icon() user.visible_message("[user] removes [power_supply] from [src].", "You remove [power_supply] from [src].") power_supply = null - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) update_icon() update_held_icon() else diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index f47053cba0..e5d43ca526 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -150,7 +150,7 @@ user.visible_message("*fizzle*", "*fizzle*") else src.visible_message("*fizzle*") - playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 1) + playsound(src, 'sound/effects/sparks1.ogg', 100, 1) /* /obj/item/weapon/gun/energy/staff/animate name = "staff of animation" diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 259d5e2e82..5f33557727 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -61,7 +61,7 @@ grenades.len-- user.put_in_hands(G) user.visible_message("[user] removes \a [G] from [src].", "You remove \a [G] from [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else to_chat(user, "[src] is empty.") @@ -119,7 +119,7 @@ if(chambered) user.put_in_hands(chambered) user.visible_message("[user] removes \a [chambered] from [src].", "You remove \a [chambered] from [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) chambered = null else to_chat(user, "[src] is empty.") \ No newline at end of file diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index b8fe6c4e35..6a6bf73cb1 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -53,7 +53,7 @@ item_storage.remove_from_storage(removing, src.loc) user.put_in_hands(removing) to_chat(user, "You remove [removing] from the hopper.") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else to_chat(user, "There is nothing to remove in \the [src].") diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 17778ffae4..3d60e22405 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -30,7 +30,7 @@ /obj/item/weapon/syringe_cartridge/attack_self(mob/user) if(syringe) to_chat(user, "You remove [syringe] from [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) user.put_in_hands(syringe) syringe = null sharp = initial(sharp) @@ -97,7 +97,7 @@ user.visible_message("[user] unlatches and carefully relaxes the bolt on [src].", "You unlatch and carefully relax the bolt on [src], unloading the spring.") next = null else if(darts.len) - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) user.visible_message("[user] draws back the bolt on [src], clicking it into place.", "You draw back the bolt on the [src], loading the spring!") next = darts[1] add_fingerprint(user) @@ -114,7 +114,7 @@ darts -= C user.put_in_hands(C) user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else ..() diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index 9d59dbbe1d..0594e2abb3 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -58,7 +58,7 @@ removing.forceMove(get_turf(src)) user.put_in_hands(removing) user.visible_message("\The [user] removes \the [removing] from \the [src].") - playsound(loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) update_icon() return . = ..() @@ -84,7 +84,7 @@ cell = thing user.drop_from_inventory(cell) cell.forceMove(src) - playsound(loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) user.visible_message("\The [user] slots \the [cell] into \the [src].") update_icon() return @@ -95,7 +95,7 @@ manipulator.forceMove(get_turf(src)) user.put_in_hands(manipulator) user.visible_message("\The [user] levers \the [manipulator] from \the [src].") - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) manipulator = null update_icon() return @@ -106,7 +106,7 @@ capacitor.forceMove(get_turf(src)) user.put_in_hands(capacitor) user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].") - playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) capacitor = null update_icon() return @@ -118,7 +118,7 @@ capacitor = thing user.drop_from_inventory(capacitor) capacitor.forceMove(src) - playsound(loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) power_per_tick = (power_cost*0.15) * capacitor.rating user.visible_message("\The [user] slots \the [capacitor] into \the [src].") update_icon() @@ -131,7 +131,7 @@ manipulator = thing user.drop_from_inventory(manipulator) manipulator.forceMove(src) - playsound(loc, 'sound/machines/click.ogg', 10,1) + playsound(src, 'sound/machines/click.ogg', 10,1) mat_cost = initial(mat_cost) % (2*manipulator.rating) user.visible_message("\The [user] slots \the [manipulator] into \the [src].") update_icon() @@ -154,14 +154,14 @@ if(mat_storage + 2000 <= max_mat_storage && do_after(user,1.5 SECONDS)) can_hold_val ++ mat_storage += 2000 - playsound(loc, 'sound/effects/phasein.ogg', 15, 1) + playsound(src, 'sound/effects/phasein.ogg', 15, 1) else loading = FALSE break M.use(can_hold_val) user.visible_message("\The [user] loads \the [src] with \the [M].") - playsound(loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() return . = ..() diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 8c6d007fc0..ae12ce034c 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -101,7 +101,7 @@ cell = thing user.drop_from_inventory(cell) cell.forceMove(src) - playsound(loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) user.visible_message("\The [user] slots \the [cell] into \the [src].") update_icon() return @@ -113,7 +113,7 @@ capacitor.forceMove(get_turf(src)) user.put_in_hands(capacitor) user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].") - playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) capacitor = null update_icon() return @@ -125,7 +125,7 @@ capacitor = thing user.drop_from_inventory(capacitor) capacitor.forceMove(src) - playsound(loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) power_per_tick = (power_cost*0.15) * capacitor.rating user.visible_message("\The [user] slots \the [capacitor] into \the [src].") update_icon() @@ -149,7 +149,7 @@ ammo.use(1) user.visible_message("\The [user] loads \the [src] with \the [loaded].") - playsound(loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() return . = ..() @@ -169,7 +169,7 @@ removing.forceMove(get_turf(src)) user.put_in_hands(removing) user.visible_message("\The [user] removes \the [removing] from \the [src].") - playsound(loc, 'sound/machines/click.ogg', 10, 1) + playsound(src, 'sound/machines/click.ogg', 10, 1) update_icon() return . = ..() @@ -238,7 +238,7 @@ removable_components = FALSE spawn(15) audible_message("\The [src]'s power supply begins to overload as the device crumples!") //Why are you still holding this? - playsound(loc, 'sound/effects/grillehit.ogg', 10, 1) + playsound(src, 'sound/effects/grillehit.ogg', 10, 1) var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() var/turf/T = get_turf(src) sparks.set_up(2, 1, T) diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm index 637f2460a6..7745c9c623 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm @@ -45,7 +45,7 @@ return user.visible_message("\The [user] welds the barrel of \the [src] into place.") - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + playsound(src, 'sound/items/Welder2.ogg', 100, 1) increment_construction_stage() return @@ -68,7 +68,7 @@ if(thing.is_screwdriver() && construction_stage >= 9) user.visible_message("\The [user] secures \the [src] and finishes it off.") - playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/item/weapon/gun/magnetic/coilgun = new(loc) var/put_in_hands var/mob/M = src.loc diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm index dbcc1a1b41..c9688ab0d8 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -52,7 +52,7 @@ loaded.forceMove(get_turf(src)) loaded = null visible_message("\The [src] beeps and ejects its empty cartridge.","There's a beeping sound!") - playsound(get_turf(src), empty_sound, 40, 1) + playsound(src, empty_sound, 40, 1) /obj/item/weapon/gun/magnetic/railgun/automatic // Adminspawn only, this shit is absurd. name = "\improper RHR accelerator" diff --git a/code/modules/projectiles/guns/modular_guns.dm b/code/modules/projectiles/guns/modular_guns.dm index 38e2ed1a93..4eb990c0ca 100644 --- a/code/modules/projectiles/guns/modular_guns.dm +++ b/code/modules/projectiles/guns/modular_guns.dm @@ -142,7 +142,7 @@ power_supply = P P.loc = src user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() update_held_icon() return diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index d0d321b299..7f93579230 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -89,7 +89,7 @@ return else chambered.loc = get_turf(src) - playsound(src.loc, "casing", 50, 1) + playsound(src, "casing", 50, 1) if(CYCLE_CASINGS) //cycle the casing back to the end. if(ammo_magazine) ammo_magazine.stored_ammo += chambered @@ -117,7 +117,7 @@ AM.loc = src ammo_magazine = AM user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].") - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) if(SPEEDLOADER) if(loaded.len >= max_shells) to_chat(user, "[src] is full!") @@ -133,7 +133,7 @@ count++ if(count) user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) AM.update_icon() else if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/C = A @@ -147,7 +147,7 @@ C.loc = src loaded.Insert(1, C) //add to the head of the list user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else if(istype(A, /obj/item/weapon/storage)) var/obj/item/weapon/storage/storage = A @@ -174,7 +174,7 @@ if(ammo_magazine) user.put_in_hands(ammo_magazine) user.visible_message("[user] removes [ammo_magazine] from [src].", "You remove [ammo_magazine] from [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) ammo_magazine.update_icon() ammo_magazine = null else if(loaded.len) @@ -194,7 +194,7 @@ loaded.len-- user.put_in_hands(C) user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].") - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else to_chat(user, "[src] is empty.") update_icon() @@ -224,7 +224,7 @@ "[ammo_magazine] falls out and clatters on the floor!" ) if(auto_eject_sound) - playsound(user, auto_eject_sound, 40, 1) + playsound(src, auto_eject_sound, 40, 1) ammo_magazine.update_icon() ammo_magazine = null update_icon() //make sure to do this after unsetting ammo_magazine diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index 0555fb31de..15571e53c7 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -30,7 +30,7 @@ to_chat(user, "You begin to shorten the barrel and stock of \the [src].") if(loaded.len) afterattack(user, user) - playsound(user, fire_sound, 50, 1) + playsound(src, fire_sound, 50, 1) user.visible_message("[src] goes off!", "The rifle goes off in your face!") return if(do_after(user, 30)) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index e407703498..3b9431c938 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -19,7 +19,7 @@ chamber_offset = 0 visible_message("\The [usr] spins the cylinder of \the [src]!", \ "You hear something metallic spin and click.") - playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1) + playsound(src, 'sound/weapons/revolver_spin.ogg', 100, 1) loaded = shuffle(loaded) if(rand(1,max_shells) > loaded.len) chamber_offset = rand(0,max_shells - loaded.len) @@ -242,7 +242,7 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun() chamber_offset = 0 visible_message("\The [usr] spins the cylinder of \the [src]!", \ "You hear something metallic spin and click.") - playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1) + playsound(src, 'sound/weapons/revolver_spin.ogg', 100, 1) if(!flipped_firing) loaded = shuffle(loaded) if(rand(1,max_shells) > loaded.len) diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 9862b71b06..e091552859 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -29,7 +29,7 @@ recentpump = world.time /obj/item/weapon/gun/projectile/shotgun/pump/proc/pump(mob/M as mob) - playsound(M, action_sound, 60, 1) + playsound(src, action_sound, 60, 1) if(chambered)//We have a shell in the chamber chambered.loc = get_turf(src)//Eject casing diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 343384f290..074917a5df 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -30,7 +30,7 @@ icon_state = "heavysniper" /obj/item/weapon/gun/projectile/heavysniper/attack_self(mob/user as mob) - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) bolt_open = !bolt_open if(bolt_open) if(chambered) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3ed6564229..8a03ec8347 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -338,14 +338,13 @@ START_PROCESSING(SSprojectiles, src) pixel_move(1, FALSE) //move it now! -/obj/item/projectile/Move(atom/newloc, dir = NONE) +/obj/item/projectile/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - if(.) - if(temporary_unstoppable_movement) - temporary_unstoppable_movement = FALSE - DISABLE_BITFIELD(movement_type, UNSTOPPABLE) - if(fired && can_hit_target(original, permutated, TRUE)) - Bump(original) + if(temporary_unstoppable_movement) + temporary_unstoppable_movement = FALSE + DISABLE_BITFIELD(movement_type, UNSTOPPABLE) + if(fired && can_hit_target(original, permutated, TRUE)) + Bump(original) /obj/item/projectile/proc/after_z_change(atom/olcloc, atom/newloc) @@ -793,4 +792,4 @@ var/volume = CLAMP(vol_by_damage() + 20, 0, 100) if(silenced) volume = 5 - playsound(get_turf(A), hitsound_wall, volume, 1, -1) + playsound(A, hitsound_wall, volume, 1, -1) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 3d7dca8d19..71081664f7 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -195,7 +195,7 @@ /obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/carbon/M) to_chat(M, "You hear a loud roar.") - playsound(M.loc, 'sound/effects/bang.ogg', 50, 1) + playsound(src, 'sound/effects/bang.ogg', 50, 1) var/ear_safety = 0 ear_safety = M.get_ear_protection() if(ear_safety == 1) diff --git a/code/modules/projectiles/projectile/hook.dm b/code/modules/projectiles/projectile/hook.dm index ad02dee8cf..ee5fd6c471 100644 --- a/code/modules/projectiles/projectile/hook.dm +++ b/code/modules/projectiles/projectile/hook.dm @@ -82,7 +82,7 @@ if(!(H.species.flags & NO_SLIP) && prob(50)) var/armor_check = H.run_armor_check(def_zone, "melee") H.apply_effect(3, WEAKEN, armor_check) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(armor_check < 60) visible_message("\The [src] has pushed [H]!") else @@ -91,19 +91,19 @@ else if(H.break_all_grabs(firer)) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return for(var/obj/item/I in holding) if(I) H.drop_from_inventory(I) visible_message("\The [src] has disarmed [H]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return /obj/item/projectile/energy/hook/proc/perform_intent_unique(atom/target) - playsound(src.loc, impact_sound, 40, 1) + playsound(src, impact_sound, 40, 1) var/success = FALSE if(istype(target,/turf)) if(launcher_intent) @@ -148,7 +148,7 @@ var/message = pick(help_messages) if(message == "slaps") spawn(1) - playsound(loc, 'sound/effects/snap.ogg', 50, 1) + playsound(src, 'sound/effects/snap.ogg', 50, 1) visible_message("\The [src] [message] [target].") done_mob_unique = TRUE success = TRUE diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm index 4c36476ddb..5c3b1f817b 100644 --- a/code/modules/projectiles/projectile/magnetic.dm +++ b/code/modules/projectiles/projectile/magnetic.dm @@ -137,7 +137,7 @@ /obj/item/projectile/bullet/magnetic/fuelrod/supermatter/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) //You cannot touch the supermatter without disentigrating. Assumedly, this is true for condensed rods of it flying at relativistic speeds. if(istype(target,/turf/simulated/wall) || istype(target,/mob/living)) target.visible_message("The [src] burns a perfect hole through \the [target] with a blinding flash!") - playsound(target.loc, 'sound/effects/teleport.ogg', 40, 0) + playsound(target, 'sound/effects/teleport.ogg', 40, 0) return ..(target, blocked, def_zone) /obj/item/projectile/bullet/magnetic/fuelrod/supermatter/check_penetrate() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index ac039460cb..9c06241ecf 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -116,7 +116,7 @@ if(A) A.ex_act(2) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) for(var/mob/M in range(10, src)) if(!M.stat && !istype(M, /mob/living/silicon/ai))\ diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index 9bce28831f..a7d069fad4 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -175,7 +175,7 @@ obj/aiming_overlay/proc/update_aiming_deferred() aiming_with = thing aiming_at = target if(istype(aiming_with, /obj/item/weapon/gun)) - playsound(get_turf(owner), 'sound/weapons/TargetOn.ogg', 50,1) + playsound(owner, 'sound/weapons/TargetOn.ogg', 50,1) forceMove(get_turf(target)) START_PROCESSING(SSobj, src) @@ -215,7 +215,7 @@ obj/aiming_overlay/proc/update_aiming_deferred() if(!aiming_with || !aiming_at) return if(istype(aiming_with, /obj/item/weapon/gun)) - playsound(get_turf(owner), 'sound/weapons/TargetOff.ogg', 50,1) + playsound(owner, 'sound/weapons/TargetOff.ogg', 50,1) if(!no_message) owner.visible_message("\The [owner] lowers \the [aiming_with].") diff --git a/code/modules/projectiles/targeting/targeting_triggers.dm b/code/modules/projectiles/targeting/targeting_triggers.dm index 3563727fc1..1b8f3fcadd 100644 --- a/code/modules/projectiles/targeting/targeting_triggers.dm +++ b/code/modules/projectiles/targeting/targeting_triggers.dm @@ -17,7 +17,7 @@ return if(perm && (target_permissions & perm)) return - if(!owner.canClick()) + if(!owner.checkClickCooldown()) return owner.setClickCooldown(5) // Spam prevention, essentially. if(owner.a_intent == I_HELP && owner.is_preference_enabled(/datum/client_preference/safefiring)) diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index 7c7075f45f..c472a9f1f9 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -35,7 +35,7 @@ deployed = 1 visible_message("The explosive bolts on \the [src] detonate, throwing it open!") - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) + playsound(src, 'sound/effects/bang.ogg', 50, 1, 5) // This is shit but it will do for the sake of testing. for(var/obj/structure/droppod_door/D in orange(1,src)) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 079f162e2c..02d52626f5 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -238,7 +238,7 @@ count = input("Select the number of pills to make.", "Max [max_pill_count]", pillamount) as null|num if(!count) //Covers 0 and cancel return - count = CLAMP(count, 1, max_pill_count) + count = CLAMP(round(count), 1, max_pill_count) // Fix decimals input and clamp to reasonable amounts if(reagents.total_volume/count < 1) //Sanity checking. return @@ -260,7 +260,7 @@ if(reagents.total_volume/count < 1) //Sanity checking. return - while (count--) + while(count-- > 0) // Will definitely eventually stop. var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] pill" @@ -542,7 +542,7 @@ if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) return - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) + playsound(src, 'sound/machines/blender.ogg', 50, 1) inuse = 1 // Reset the machine. diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 69577da357..b859e419bd 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -160,7 +160,7 @@ var/label = href_list["dispense"] if(cartridges[label] && container && container.is_open_container()) var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = cartridges[label] - playsound(src.loc, 'sound/machines/reagent_dispense.ogg', 25, 1) + playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1) C.reagents.trans_to(container, amount) else if(href_list["ejectBeaker"]) diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index 02b91a7c53..645f13c76b 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -267,7 +267,7 @@ return if(chan == -1) chan = power_channel - A.use_power(amount, chan) + A.use_power_oneoff(amount, chan) /obj/machinery/portable_atmospherics/powered/reagent_distillery/process() ..() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d1a63ac41b..a08ea1b19b 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -110,7 +110,7 @@ if(href_list["reagent"]) var/t = reagent_ids.Find(href_list["reagent"]) if(t) - playsound(loc, 'sound/effects/pop.ogg', 50, 0) + playsound(src, 'sound/effects/pop.ogg', 50, 0) mode = t var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]] to_chat(usr, "Synthesizer is now producing '[R.name]'.") diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index fec6f83de5..b57dbd0841 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -295,7 +295,7 @@ else reagents.trans_to_obj(D, 5) to_chat(user, "You wet \the [D] in \the [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) else return ..() @@ -336,7 +336,7 @@ obj/item/weapon/reagent_containers/glass/bucket/wood else reagents.trans_to_obj(D, 5) to_chat(user, "You wet \the [D] in \the [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + playsound(src, 'sound/effects/slosh.ogg', 25, 1) return else return ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index d49645d4b3..f18ab442ef 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -98,7 +98,7 @@ loaded_vial = null to_chat(user, "You remove the vial from the [src].") update_icon() - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) return ..() else @@ -120,7 +120,7 @@ loaded_vial.reagents.trans_to_holder(reagents,volume) user.visible_message("[user] has loaded [W] into \the [src].","You have loaded [W] into \the [src].") update_icon() - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else to_chat(user, "\The [src] already has a vial.") else diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 1aece5b845..2a89067e8a 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -55,7 +55,7 @@ return /obj/item/weapon/reagent_containers/spray/proc/Spray_at(atom/A as mob|obj, mob/user as mob, proximity) - playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) + playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) if (A.density && proximity) A.visible_message("[usr] sprays [A] with [src].") reagents.splash(A, amount_per_transfer_from_this) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 3a81e2cb1d..eb792fda70 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -238,11 +238,22 @@ if(cupholder) . += "There are [cups] cups in the cup dispenser." +/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise() + set name = "Rotate Cooler Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + to_chat(usr, "It is fastened to the floor!") + return 0 + src.set_dir(turn(src.dir, 270)) + return 1 + /obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob) if(I.is_wrench()) src.add_fingerprint(user) if(bottle) - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) if(do_after(user, 20) && bottle) to_chat(user, "You unfasten the jug.") var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc ) @@ -261,12 +272,12 @@ if(!src) return to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") anchored = !anchored - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) return if(I.is_screwdriver()) if(cupholder) - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) to_chat(user, "You take the cup dispenser off.") new /obj/item/stack/material/plastic( src.loc ) if(cups) @@ -277,7 +288,7 @@ update_icon() return if(!bottle && !cupholder) - playsound(loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) to_chat(user, "You start taking the water-cooler apart.") if(do_after(user, 20 * I.toolspeed) && !bottle && !cupholder) to_chat(user, "You take the water-cooler apart.") @@ -311,7 +322,7 @@ var/obj/item/stack/material/plastic/P = I src.add_fingerprint(user) to_chat(user, "You start to attach a cup dispenser onto the water-cooler.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20) && !cupholder && anchored) if (P.use(1)) to_chat(user, "You attach a cup dispenser onto the water-cooler.") @@ -327,7 +338,7 @@ if(cups) new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc) cups-- - update_icon() + flick("[icon_state]-vend", src) return /obj/structure/reagent_dispensers/water_cooler/update_icon() @@ -337,12 +348,6 @@ if(bottle) I = image(icon, "water_cooler_bottle") overlays += I - if(cupholder) - I = image(icon, "water_cooler_cupholder") - overlays += I - if(cups) - I = image(icon, "water_cooler_cups") - overlays += I return /obj/structure/reagent_dispensers/beerkeg diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index e9d4e4227d..656723942f 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -281,7 +281,7 @@ else density = 1 // We don't want disposal bins or outlets to go density 0 to_chat(user, "You attach the [nicetype] to the underfloor.") - playsound(loc, I.usesound, 100, 1) + playsound(src, I.usesound, 100, 1) update() // weldingtool: convert to real pipe diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index f3dd0fa384..e8eaa809fe 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -639,7 +639,7 @@ for (var/mob/M in hearers(src.loc.loc)) to_chat(M, "CLONG, clong!") - playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) + playsound(src, 'sound/effects/clang.ogg', 50, 0, 0) // called to vent all gas in holder to a location proc/vent_gas(var/atom/location) @@ -1169,7 +1169,7 @@ if(O.currTag)// Tag set sort_tag = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) + playsound(src, 'sound/machines/twobeep.ogg', 100, 1) to_chat(user, "Changed tag to '[sort_tag]'.") updatename() updatedesc() @@ -1237,7 +1237,7 @@ if(O.currTag)// Tag set sortType = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) + playsound(src, 'sound/machines/twobeep.ogg', 100, 1) to_chat(user, "Changed filter to '[sortType]'.") updatename() updatedesc() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 767bf2c8b9..f088621f5e 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -18,7 +18,7 @@ unwrap() proc/unwrap() - playsound(loc, 'sound/items/package_unwrap.ogg', 50, 1) + playsound(src, 'sound/items/package_unwrap.ogg', 50, 1) // Destroy will drop our wrapped object on the turf, so let it. qdel(src) @@ -33,7 +33,7 @@ update_icon() else src.sortTag = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) else to_chat(user, "The package is already labeled for [O.currTag].") else @@ -143,7 +143,7 @@ update_icon() else src.sortTag = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) else to_chat(user, "The package is already labeled for [O.currTag].") else @@ -273,7 +273,7 @@ user.visible_message("\The [user] wraps \a [target] with \a [src].",\ "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ "You hear someone taping paper around a small object.") - playsound(loc, 'sound/items/package_wrap.ogg', 50, 1) + playsound(src, 'sound/items/package_wrap.ogg', 50, 1) else if (istype(target, /obj/structure/closet/crate)) var/obj/structure/closet/crate/O = target if (src.amount > 3 && !O.opened) @@ -285,7 +285,7 @@ user.visible_message("\The [user] wraps \a [target] with \a [src].",\ "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ "You hear someone taping paper around a large object.") - playsound(loc, 'sound/items/package_wrap.ogg', 50, 1) + playsound(src, 'sound/items/package_wrap.ogg', 50, 1) else if(src.amount < 3) to_chat(user, "You need more paper.") else if (istype (target, /obj/structure/closet)) @@ -299,7 +299,7 @@ user.visible_message("\The [user] wraps \a [target] with \a [src].",\ "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ "You hear someone taping paper around a large object.") - playsound(loc, 'sound/items/package_wrap.ogg', 50, 1) + playsound(src, 'sound/items/package_wrap.ogg', 50, 1) else if(src.amount < 3) to_chat(user, "You need more paper.") else @@ -432,18 +432,18 @@ if(I.is_screwdriver()) if(c_mode==0) c_mode=1 - playsound(src.loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) to_chat(user, "You remove the screws around the power connection.") return else if(c_mode==1) c_mode=0 - playsound(src.loc, I.usesound, 50, 1) + playsound(src, I.usesound, 50, 1) to_chat(user, "You attach the screws around the power connection.") return else if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1) var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You start slicing the floorweld off the delivery chute.") if(do_after(user,20 * W.toolspeed)) if(!src || !W.isOn()) return diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm index 8faf037136..2ce34f3485 100644 --- a/code/modules/research/designs/misc.dm +++ b/code/modules/research/designs/misc.dm @@ -63,3 +63,12 @@ datum/design/item/general/laserpointer materials = list(DEFAULT_WALL_MATERIAL = 500) build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon sort_string = "TBAAB" + +/datum/design/item/general/bsflare + name = "bluespace flare" + desc = "A marker that can be detected by shuttle landing systems." + id = "bsflare" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 4) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 2000, MAT_SILVER = 2000) + build_path = /obj/item/device/spaceflare + sort_string = "TBAAC" diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 125de3db6c..7316c42179 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -1030,3 +1030,12 @@ req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 6, TECH_ILLEGAL = 3, TECH_BLUESPACE = 4, TECH_ARCANE = 2, TECH_PRECURSOR = 3) materials = list(MAT_DURASTEEL = 5000, MAT_GRAPHITE = 3000, MAT_MORPHIUM = 1500, MAT_OSMIUM = 1500, MAT_PHORON = 1750, MAT_VERDANTIUM = 3000, MAT_SUPERMATTER = 2000) build_path = /obj/item/rig_module/teleporter + +/datum/design/item/mechfab/uav/basic + name = "UAV - Recon Skimmer" + id = "recon_skimmer" + build_path = /obj/item/device/uav + time = 20 + req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5, TECH_PHORON = 3, TECH_MAGNET = 4, TECH_POWER = 6) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, "silver" = 4000) + \ No newline at end of file diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index ebe09e3a98..bbcda60927 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -129,12 +129,12 @@ var/global/list/obj/machinery/message_server/message_servers = list() switch(priority) if(2) if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(Console, 'sound/machines/twobeep.ogg', 50, 1) Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5) Console.message_log += "High Priority message from [sender]
[authmsg]" else if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) + playsound(Console, 'sound/machines/twobeep.ogg', 50, 1) Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4) Console.message_log += "Message from [sender]
[authmsg]" Console.set_light(2) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index d8b3a995be..df0d2cf251 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -42,6 +42,7 @@ removeFromQueue(1) if(linked_console) linked_console.updateUsrDialog() + flick("[initial(icon_state)]_finish", src) update_icon() else if(busy) @@ -74,15 +75,20 @@ eject_materials(f, -1) ..() + /obj/machinery/r_n_d/protolathe/update_icon() + overlays.Cut() + + icon_state = initial(icon_state) + if(panel_open) - icon_state = "protolathe_t" - else if(busy) - icon_state = "protolathe_n" - else - if(icon_state == "protolathe_n") - flick("protolathe_u", src) // If lid WAS closed, show opening animation - icon_state = "protolathe" + overlays.Add(image(icon, "[icon_state]_panel")) + + if(stat & NOPOWER) + return + + if(busy) + icon_state = "[icon_state]_work" /obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) if(busy) @@ -128,9 +134,7 @@ if(materials[S.material.name] + amnt <= max_res_amount) if(S && S.get_amount() >= 1) var/count = 0 - overlays += "fab-load-metal" - spawn(10) - overlays -= "fab-load-metal" + flick("[initial(icon_state)]_loading", src) while(materials[S.material.name] + amnt <= max_res_amount && S.get_amount() >= 1) materials[S.material.name] += amnt S.use(1) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 192df50bec..41510d0545 100755 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -48,6 +48,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, req_access = list(access_research) //Data and setting manipulation requires scientist access. + var/protofilter //String to filter protolathe designs by + var/circuitfilter //String to filter circuit designs by + /obj/machinery/computer/rdconsole/proc/CallMaterialName(var/ID) var/return_name = ID switch(return_name) @@ -144,7 +147,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/emp_act(var/remaining_charges, var/mob/user) if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "You you disable the security protocols.") return 1 @@ -169,7 +172,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk. screen = 0.0 - spawn(50) + spawn(5 SECONDS) screen = 1.2 files.AddTech2Known(t_disk.stored) updateUsrDialog() @@ -192,7 +195,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["updt_design"]) //Updates the research holder with design data from the design disk. screen = 0.0 - spawn(50) + spawn(5 SECONDS) screen = 1.4 files.AddDesign2Known(d_disk.blueprint) updateUsrDialog() @@ -235,7 +238,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, screen = 0.1 updateUsrDialog() flick("d_analyzer_process", linked_destroy) - spawn(24) + spawn(2.4 SECONDS) if(linked_destroy) linked_destroy.busy = 0 if(!linked_destroy.loaded_item) @@ -283,7 +286,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, to_chat(usr, "You must connect to the network first.") else griefProtection() //Putting this here because I dont trust the sync process - spawn(30) + spawn(3 SECONDS) if(src) for(var/obj/machinery/r_n_d/server/S in machines) var/server_processed = 0 @@ -319,8 +322,38 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(being_built) linked_lathe.addToQueue(being_built) + else if(href_list["buildfive"]) //Causes the Protolathe to build 5 of something. + if(linked_lathe) + var/datum/design/being_built = null + for(var/datum/design/D in files.known_designs) + if(D.id == href_list["buildfive"]) + being_built = D + break + if(being_built) + for(var/i = 1 to 5) + linked_lathe.addToQueue(being_built) + screen = 3.1 - updateUsrDialog() + + else if(href_list["protofilter"]) + var/filterstring = input(usr, "Input a filter string, or blank to not filter:", "Design Filter", protofilter) as null|text + if(!Adjacent(usr)) + return + if(isnull(filterstring)) //Clicked Cancel + return + if(filterstring == "") //Cleared value + protofilter = null + protofilter = sanitize(filterstring, 25) + + else if(href_list["circuitfilter"]) + var/filterstring = input(usr, "Input a filter string, or blank to not filter:", "Design Filter", circuitfilter) as null|text + if(!Adjacent(usr)) + return + if(isnull(filterstring)) //Clicked Cancel + return + if(filterstring == "") //Cleared value + circuitfilter = null + circuitfilter = sanitize(filterstring, 25) else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something. if(linked_imprinter) @@ -332,7 +365,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(being_built) linked_imprinter.addToQueue(being_built) screen = 4.1 - updateUsrDialog() else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it) linked_imprinter.reagents.del_reagent(href_list["dispose"]) @@ -489,7 +521,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(d_disk) dat += "
  • Disk Operations" else - dat += "
  • Disk Operations" + dat += "
  • Disk Operations" if(linked_destroy) dat += "
  • Destructive Analyzer Menu" if(linked_lathe) @@ -638,9 +670,12 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Material Amount: [linked_lathe.TotalMaterials()] cm3 (MAX: [linked_lathe.max_material_storage])
    " dat += "Chemical Volume: [linked_lathe.reagents.total_volume] (MAX: [linked_lathe.reagents.maximum_volume])
    " dat += "
      " + dat += "Filter: [protofilter ? protofilter : "None Set"]" for(var/datum/design/D in files.known_designs) if(!D.build_path || !(D.build_type & PROTOLATHE)) continue + if(protofilter && findtext(D.name, protofilter) == 0) + continue var/temp_dat for(var/M in D.materials) temp_dat += ", [D.materials[M]*linked_lathe.mat_efficiency] [CallMaterialName(M)]" @@ -649,7 +684,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(temp_dat) temp_dat = " \[[copytext(temp_dat, 3)]\]" if(linked_lathe.canBuild(D)) - dat += "
    • [D.name][temp_dat]" + dat += "
    • [D.name](x5)[temp_dat]" else dat += "
    • [D.name][temp_dat]" dat += "
    " @@ -683,7 +718,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(3.3) //Protolathe Chemical Storage Submenu dat += "Main Menu || " dat += "Protolathe Menu
    " - dat += "Chemical Storage

    " + dat += "Chemical Storage:

    " for(var/datum/reagent/R in linked_lathe.reagents.reagent_list) dat += "Name: [R.name] | Units: [R.volume] " dat += "(Purge)
    " @@ -692,7 +727,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(3.4) // Protolathe queue dat += "Main Menu || " dat += "Protolathe Menu
    " - dat += "Queue

    " + dat += "Protolathe Construction Queue:

    " if(!linked_lathe.queue.len) dat += "Empty" else @@ -721,9 +756,12 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Material Amount: [linked_imprinter.TotalMaterials()] cm3
    " dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
    " dat += "
      " + dat += "Filter: [circuitfilter ? circuitfilter : "None Set"]" for(var/datum/design/D in files.known_designs) if(!D.build_path || !(D.build_type & IMPRINTER)) continue + if(circuitfilter && findtext(D.name, circuitfilter) == 0) + continue var/temp_dat for(var/M in D.materials) temp_dat += ", [D.materials[M]*linked_imprinter.mat_efficiency] [CallMaterialName(M)]" @@ -794,8 +832,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "List of Researched Technologies and Designs:" dat += GetResearchListInfo() - user << browse("Research and Development Console
      [dat.Join()]", "window=rdconsole;size=850x600") - onclose(user, "rdconsole") + dat = jointext(dat, null) + var/datum/browser/popup = new(user, "rdconsole", "Research and Development Console", 850, 600) + popup.set_content(dat) + popup.open() /obj/machinery/computer/rdconsole/robotics name = "Robotics R&D Console" diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 3227e1528d..1c9a142998 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -290,7 +290,7 @@ /obj/machinery/computer/rdservercontrol/emag_act(var/remaining_charges, var/mob/user) if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "You you disable the security protocols.") src.updateUsrDialog() diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index cff6f08570..0e3a9f02d5 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -64,10 +64,6 @@ else security_announcement_down.Announce("[config.alert_desc_red_downto]", "Attention! Code red!") security_level = SEC_LEVEL_RED - /* - At the time of commit, setting status displays didn't work properly - var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) - if(CC) - CC.post_status("alert", "redalert")*/ if(SEC_LEVEL_DELTA) security_announcement_up.Announce("[config.alert_desc_delta]", "Attention! Delta alert level reached!", new_sound = 'sound/effects/siren.ogg') security_level = SEC_LEVEL_DELTA @@ -85,6 +81,9 @@ else atc.reroute_traffic(yes = 0) + spawn() + SSnightshift.check_nightshift() + /proc/get_security_level() switch(security_level) diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 818b78a21e..d3d943297a 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -67,7 +67,7 @@ /obj/effect/directional_shield/bullet_act(var/obj/item/projectile/P) adjust_health(-P.get_structure_damage()) P.on_hit() - playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 75, 1) + playsound(src, 'sound/effects/EMPulse.ogg', 75, 1) // All the shields tied to their projector are one 'unit', and don't have individualized health values like most other shields. /obj/effect/directional_shield/proc/adjust_health(amount) @@ -97,17 +97,22 @@ var/high_color = "#0099FF" // Color the shield will be when at max health. A light blue. var/low_color = "#FF0000" // Color the shield will drift towards as health is lowered. Deep red. -/obj/item/shield_projector/New() +/obj/item/shield_projector/Initialize() START_PROCESSING(SSobj, src) if(always_on) create_shields() + GLOB.moved_event.register(src, src, .proc/moved_event) ..() /obj/item/shield_projector/Destroy() destroy_shields() STOP_PROCESSING(SSobj, src) + GLOB.moved_event.unregister(src, src, .proc/moved_event) return ..() +/obj/item/shield_projector/proc/moved_event() + update_shield_positions() + /obj/item/shield_projector/proc/create_shield(var/newloc, var/new_dir) var/obj/effect/directional_shield/S = new(newloc, src) S.dir = new_dir @@ -139,12 +144,12 @@ destroy_shields() var/turf/T = get_turf(src) T.visible_message("\The [src] overloads and the shield vanishes!") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 75, 0) + playsound(src, 'sound/machines/defib_failed.ogg', 75, 0) else if(shield_health < max_shield_health / 4) // Play a more urgent sounding beep if it's at 25% health. - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 75, 0) + playsound(src, 'sound/machines/defib_success.ogg', 75, 0) else - playsound(get_turf(src), 'sound/machines/defib_SafetyOn.ogg', 75, 0) + playsound(src, 'sound/machines/defib_SafetyOn.ogg', 75, 0) last_damaged_time = world.time update_shield_colors() @@ -198,9 +203,9 @@ if(always_on && !active) // Make shields as soon as possible if this is set. create_shields() if(shield_health == max_shield_health) - playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 75, 0) + playsound(src, 'sound/machines/defib_ready.ogg', 75, 0) else - playsound(get_turf(src), 'sound/machines/defib_safetyOff.ogg', 75, 0) + playsound(src, 'sound/machines/defib_safetyOff.ogg', 75, 0) /obj/item/shield_projector/examine(var/mob/user) . = ..() @@ -210,14 +215,6 @@ /obj/item/shield_projector/emp_act(var/severity) adjust_health(-max_shield_health / severity) // A strong EMP will kill the shield instantly, but weaker ones won't on the first hit. -/obj/item/shield_projector/Move(var/newloc, var/direct) - ..(newloc, direct) - update_shield_positions() - -/obj/item/shield_projector/on_loc_moved(atom/oldloc) - update_shield_positions() - - // Subtypes /obj/item/shield_projector/rectangle diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 21e244cc36..4920ffb513 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -48,7 +48,7 @@ src.health -= aforce //Play a fitting sound - playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1) + playsound(src, 'sound/effects/EMPulse.ogg', 75, 1) check_failure() set_opacity(1) @@ -105,7 +105,7 @@ src.health -= tforce //This seemed to be the best sound for hitting a force field. - playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1) + playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) check_failure() diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index 3e9d470826..eb6c0a2620 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -146,16 +146,16 @@ if (dna_hash in authorized) src.visible_message("\The [src] buzzes. That ID has already been scanned.") - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return 0 if (!(access_heads in access)) src.visible_message("\The [src] buzzes, rejecting [ident].") - playsound(src.loc, 'sound/machines/deniedbeep.ogg', 50, 0) + playsound(src, 'sound/machines/deniedbeep.ogg', 50, 0) return 0 src.visible_message("\The [src] beeps as it scans [ident].") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + playsound(src, 'sound/machines/twobeep.ogg', 50, 0) authorized[dna_hash] = auth_name if (req_authorizations - authorized.len) to_chat(world, "Alert: [req_authorizations - authorized.len] authorization\s needed to override the shuttle autopilot.") //TODO- Belsima, make this an announcement instead of magic. diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm index 9e02cf9513..e9874ccc12 100644 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -25,7 +25,7 @@ How they spawn stuff is decided by behaviour vars, which are explained below cast_sound = 'sound/items/welder.ogg' /spell/aoe_turf/conjure/cast(list/targets, mob/user) - playsound(get_turf(user), cast_sound, 50, 1) + playsound(user, cast_sound, 50, 1) for(var/i=1,i <= summon_amt,i++) if(!targets.len) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 01b5bb276b..71f6c66fcd 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -205,6 +205,8 @@ user.visible_message("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]!", \ "You take [obj] out of incision on [target]'s [affected.name]s with \the [tool]!" ) affected.implants -= obj + if(!target.has_embedded_objects()) + target.clear_alert("embeddedobject") BITSET(target.hud_updateflag, IMPLOYAL_HUD) @@ -239,6 +241,6 @@ if (prob(fail_prob)) var/obj/item/weapon/implant/imp = affected.implants[1] user.visible_message(" Something beeps inside [target]'s [affected.name]!") - playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) + playsound(imp, 'sound/items/countdown.ogg', 75, 1, -3) spawn(25) imp.activate() diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index 5d6691027f..fee9550cbe 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -90,9 +90,9 @@ M.apply_damage(8,def_zone = BP_HEAD) visible_message("[G.assailant] slams [G.affecting]'s face against \the [src]!") if(material) - playsound(loc, material.tableslam_noise, 50, 1) + playsound(src, material.tableslam_noise, 50, 1) else - playsound(loc, 'sound/weapons/tablehit1.ogg', 50, 1) + playsound(src, 'sound/weapons/tablehit1.ogg', 50, 1) var/list/L = take_damage(rand(1,5)) // Shards. Extra damage, plus potentially the fact YOU LITERALLY HAVE A PIECE OF GLASS/METAL/WHATEVER IN YOUR FACE for(var/obj/item/weapon/material/shard/S in L) @@ -123,8 +123,8 @@ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) user.visible_message("\The [src] was sliced apart by [user]!") break_to_parts() return diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index cba429d318..9f08123b35 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -26,8 +26,6 @@ var/carpeted = 0 var/carpeted_type = /obj/item/stack/tile/carpet - var/list/connections = list("nw0", "ne0", "sw0", "se0") - var/item_place = 1 //allows items to be placed on the table, but not on benches. /obj/structure/table/proc/update_material() @@ -260,7 +258,7 @@ user.visible_message("\The [user] begins removing the [type_holding] holding \the [src]'s [M.display_name] [what] in place.", "You begin removing the [type_holding] holding \the [src]'s [M.display_name] [what] in place.") if(sound) - playsound(src.loc, sound, 50, 1) + playsound(src, sound, 50, 1) if(!do_after(user, delay)) manipulating = 0 return M @@ -393,60 +391,6 @@ if(carpeted) overlays += "carpet_flip[type]" -// set propagate if you're updating a table that should update tables around it too, for example if it's a new table or something important has changed (like material). -/obj/structure/table/proc/update_connections(propagate=0) - if(!material) - connections = list("0", "0", "0", "0") - - if(propagate) - for(var/obj/structure/table/T in oview(src, 1)) - T.update_connections() - return - - var/list/blocked_dirs = list() - for(var/obj/structure/window/W in get_turf(src)) - if(W.is_fulltile()) - connections = list("0", "0", "0", "0") - return - blocked_dirs |= W.dir - - for(var/D in list(NORTH, SOUTH, EAST, WEST) - blocked_dirs) - var/turf/T = get_step(src, D) - for(var/obj/structure/window/W in T) - if(W.is_fulltile() || W.dir == reverse_dir[D]) - blocked_dirs |= D - break - else - if(W.dir != D) // it's off to the side - blocked_dirs |= W.dir|D // blocks the diagonal - - for(var/D in list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) - blocked_dirs) - var/turf/T = get_step(src, D) - - for(var/obj/structure/window/W in T) - if(W.is_fulltile() || W.dir & reverse_dir[D]) - blocked_dirs |= D - break - - // Blocked cardinals block the adjacent diagonals too. Prevents weirdness with tables. - for(var/x in list(NORTH, SOUTH)) - for(var/y in list(EAST, WEST)) - if((x in blocked_dirs) || (y in blocked_dirs)) - blocked_dirs |= x|y - - var/list/connection_dirs = list() - - for(var/obj/structure/table/T in orange(src, 1)) - var/T_dir = get_dir(src, T) - if(T_dir in blocked_dirs) continue - if(material && T.material && material.name == T.material.name && flipped == T.flipped) - connection_dirs |= T_dir - if(propagate) - spawn(0) - T.update_connections() - T.update_icon() - - connections = dirs_to_corner_states(connection_dirs) #define CORNER_NONE 0 #define CORNER_COUNTERCLOCKWISE 1 diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm index 46f201ab4f..1ca46cb77d 100644 --- a/code/modules/turbolift/turbolift.dm +++ b/code/modules/turbolift/turbolift.dm @@ -98,7 +98,7 @@ doors_closing = 0 open_doors() control_panel_interior.audible_message("\The [current_floor.ext_panel] buzzes loudly.") - playsound(control_panel_interior.loc, "sound/machines/buzz-two.ogg", 50, 1) + playsound(control_panel_interior, "sound/machines/buzz-two.ogg", 50, 1) return 0 doors_closing = 0 // The doors weren't open, so they are done closing @@ -107,7 +107,7 @@ if(target_floor == current_floor) - playsound(control_panel_interior.loc, origin.arrival_sound, 50, 1) + playsound(control_panel_interior, origin.arrival_sound, 50, 1) target_floor.arrived(src) target_floor = null diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index 885741d891..0ed4310d95 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -96,7 +96,6 @@ desc = "A control panel for moving the elevator. There's a slot for swiping IDs to enable additional controls." icon_state = "panel" - /obj/structure/lift/panel/attack_ghost(var/mob/user) return interact(user) diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css index cae146d86f..157d5e6b19 100644 --- a/code/modules/vchat/css/ss13styles.css +++ b/code/modules/vchat/css/ss13styles.css @@ -164,13 +164,28 @@ h1.alert, h2.alert {color: #000000;} .bug {color: #9e9e39;} .vox {color: #AA00AA;} .promethean {color: #5A5A5A; font-family:"Comic Sans MS","Comic Sans",cursive;} -.inverted .promethean {color: #A5A5A5; font-family:"Comic Sans MS","Comic Sans",cursive;} +.inverted .promethean {color: #A5A5A5; font-family:"Comic Sans MS","Comic Sans",cursive;} .zaddat {color: #941C1C;} .rough {font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} .interface {color: #330033;} +.black {color: #000000;} +.darkgray {color: #808080;} +.gray {color: #A9A9A9;} +.red {color: #FF0000;} +.orange {color: #FF8C00;} +.blue {color: #0000FF;} +.green {color: #00DD00;} +.inverted .black {color: #606060;} +.inverted .darkgray {color: #808080;} +.inverted .gray {color: #A9A9A9;} +.inverted .red {color: #FF4444;} +.inverted .orange {color: #FF8C00;} +.inverted .blue {color: #6666FF;} +.inverted .green {color: #44FF44;} + /*BIG IMG.icon {width: 32px; height: 32px;}*/ img.icon {vertical-align: middle; max-height: 1em;} img.icon.bigicon {max-height: 32px;} diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js index 94eb088cd8..0748ba0125 100644 --- a/code/modules/vchat/js/vchat.js +++ b/code/modules/vchat/js/vchat.js @@ -89,6 +89,7 @@ function start_vchat() { //Inform byond we're done vchat_state.ready = true; push_Topic('done_loading'); + push_Topic_showingnum(this.showingnum); //I'll do my own winsets doWinset("htmloutput", {"is-visible": true}); @@ -342,6 +343,7 @@ function start_vue() { } set_storage("showingnum",this.showingnum); + push_Topic_showingnum(this.showingnum); // Send the buffer length back to byond so we have it in case of reconnect this.attempt_archive(); }, current_categories: function(newSetting, oldSetting) { @@ -579,7 +581,7 @@ function start_vue() { } newmessage.content = newmessage.content.replace( - /(\b(https?):\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z09+&@#\/%=~_|])/img, //Honestly good luck with this regex ~Gear + /(\b(https?):\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z0-9+&@#\/%=~_|])/img, //Honestly good luck with this regex ~Gear '$1'); //Unread indicator and insertion into current tab shown messages if sensible @@ -789,6 +791,11 @@ function push_Topic(topic_uri) { window.location = '?_src_=chat&proc=' + topic_uri; //Yes that's really how it works. } +// Send the showingnum back to byond +function push_Topic_showingnum(topic_num) { + window.location = '?_src_=chat&showingnum=' + topic_num; +} + //Tells byond client to focus the main map window. function focusMapWindow() { window.location = 'byond://winset?mapwindow.map.focus=true'; diff --git a/code/modules/vchat/vchat_client.dm b/code/modules/vchat/vchat_client.dm index 0e8d72279f..a142a22382 100644 --- a/code/modules/vchat/vchat_client.dm +++ b/code/modules/vchat/vchat_client.dm @@ -15,11 +15,15 @@ GLOBAL_LIST_INIT(vchatFiles, list( // First do logging in database if(isclient(target)) var/client/C = target - vchat_add_message(C.ckey,message) + vchat_add_message(C.ckey, message) else if(ismob(target)) var/mob/M = target if(M.ckey) - vchat_add_message(M.ckey,message) + vchat_add_message(M.ckey, message) + else if(target == world) + for(var/client/C in GLOB.clients) + if(!QDESTROYING(C)) // Might be necessary? + vchat_add_message(C.ckey, message) // Now lets either queue it for sending, or send it right now if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.subsystem_initialized) @@ -37,6 +41,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic var/list/message_queue = list() var/broken = FALSE var/resources_sent = FALSE + var/message_buffer = 200 // Number of messages being actively shown to the user, used to play back that many messages on reconnect var/last_topic_time = 0 var/too_many_topics = 0 @@ -128,11 +133,14 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic send_playerinfo() load_database() + owner.verbs += /client/proc/vchat_export_log + //Perform DB shenanigans /datum/chatOutput/proc/load_database() set waitfor = FALSE var/list/results = vchat_get_messages(owner.ckey) //If there's bad performance on reconnects, look no further - for(var/list/message in results) + for(var/i in max(1, results.len - message_buffer)) // Only send them the number of buffered messages, instead of the ENTIRE log + var/list/message = results[i] var/count = 10 to_chat_immediate(owner, message["time"], message["message"]) count++ @@ -233,6 +241,9 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic if("debug") data = debugmsg(arglist(params)) + if(href_list["showingnum"]) + message_buffer = CLAMP(text2num(href_list["showingnum"]), 50, 2000) + if(data) send_event(event = data) @@ -354,3 +365,44 @@ var/to_chat_src var/list/tojson = list("time" = time, "message" = message); target << output(jsEncode(tojson), "htmloutput:putmessage") + +/client/proc/vchat_export_log() + set name = "Export chatlog" + set category = "OOC" + + if(chatOutput.broken) + to_chat(src, "Error: VChat isn't processing your messages!") + return + + var/list/results = vchat_get_messages(ckey) + if(!LAZYLEN(results)) + to_chat(src, "Error: No messages found! Please inform a dev if you do have messages!") + return + + var/o_file = "data/chatlog_tmp/[ckey]_chat_log" + if(fexists(o_file) && !fdel(o_file)) + to_chat(src, "Error: Your chat log is already being prepared. Please wait until it's been downloaded before trying to export it again.") + return + + o_file = file(o_file) + + // Write the CSS file to the log + o_file << "" + + // Write the messages to the log + for(var/list/result in results) + o_file << "[result["message"]]
      " + + o_file << "" + + // Send the log to the client + src << ftp(o_file, "log_[time2text(world.timeofday, "YYYY_MM_DD_(hh_mm)")].html") + + // clean up the file on our end + spawn(10 SECONDS) + if(!fdel(o_file)) + spawn(1 MINUTE) + if(!fdel(o_file)) + log_debug("Warning: [ckey]'s chatlog could not be deleted one minute after file transfer was initiated. It is located at 'data/chatlog_tmp/[ckey]_chat_log' and will need to be manually removed.") \ No newline at end of file diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 5d8abe9fbd..fe059b9e07 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -1,6 +1,7 @@ /obj/vehicle/bike name = "space-bike" desc = "Space wheelies! Woo!" + description_info = "Use ctrl-click to quickly toggle the engine if you're adjacent (only when vehicle is stationary). Alt-click will similarly toggle the kickstand." icon = 'icons/obj/bike.dmi' icon_state = "bike_off" dir = SOUTH @@ -54,6 +55,12 @@ return ..() +/obj/vehicle/bike/CtrlClick(var/mob/user) + if(Adjacent(user) && anchored) + toggle() + else + return ..() + /obj/vehicle/bike/verb/toggle() set name = "Toggle Engine" set category = "Vehicle" @@ -71,7 +78,13 @@ turn_off() src.visible_message("\The [src] putters before turning off.", "You hear something putter slowly.") -/obj/vehicle/bike/verb/kickstand(var/mob/user as mob) //TFF 22/3/20 - Tweaking the visible_message output so it's not "You put kickstand down" to everyone. +/obj/vehicle/bike/AltClick(var/mob/user) + if(Adjacent(user)) + kickstand(user) + else + return ..() + +/obj/vehicle/bike/verb/kickstand(var/mob/user as mob) set name = "Toggle Kickstand" set category = "Vehicle" set src in view(0) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 69abd64f92..a8c35ebc79 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -1,6 +1,7 @@ /obj/vehicle/train/engine name = "cargo train tug" desc = "A ridable electric car designed for pulling cargo trolleys." + description_info = "Use ctrl-click to quickly toggle the engine if you're adjacent (only when vehicle is stationary). Alt-click will grab the keys, if present." icon = 'icons/obj/vehicles.dmi' icon_state = "cargo_engine" on = 0 @@ -197,6 +198,22 @@ . += "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." . += "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%" + +/obj/vehicle/train/engine/CtrlClick(var/mob/user) + if(Adjacent(user)) + if(on) + stop_engine() + else + start_engine() + else + return ..() + +/obj/vehicle/train/engine/AltClick(var/mob/user) + if(Adjacent(user)) + remove_key() + else + return ..() + /obj/vehicle/train/engine/verb/start_engine() set name = "Start engine" set category = "Vehicle" diff --git a/code/modules/vehicles/construction.dm b/code/modules/vehicles/construction.dm index 49021d5fd0..bb0ca7cb0b 100644 --- a/code/modules/vehicles/construction.dm +++ b/code/modules/vehicles/construction.dm @@ -130,10 +130,10 @@ if(7) if(W.is_wrench() || W.is_screwdriver()) - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin your finishing touches on \the [src].") if(do_after(user, 20) && build_stage == 7) - playsound(loc, W.usesound, 30, 1) + playsound(src, W.usesound, 30, 1) var/obj/vehicle/train/engine/quadbike/built/product = new(src) to_chat(user, "You finish \the [product]") product.loc = get_turf(src) @@ -178,7 +178,7 @@ if(2) if(W.is_screwdriver()) - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You close up \the [src].") var/obj/vehicle/train/trolley/trailer/product = new(src) product.loc = get_turf(src) @@ -259,10 +259,10 @@ if(6) if(W.is_wrench() || W.is_screwdriver()) - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin your finishing touches on \the [src].") if(do_after(user, 20) && build_stage == 6) - playsound(loc, W.usesound, 30, 1) + playsound(src, W.usesound, 30, 1) var/obj/vehicle/bike/built/product = new(src) to_chat(user, "You finish \the [product]") product.loc = get_turf(src) diff --git a/code/modules/vehicles/quad.dm b/code/modules/vehicles/quad.dm index 99adccf459..657d4976f4 100644 --- a/code/modules/vehicles/quad.dm +++ b/code/modules/vehicles/quad.dm @@ -45,19 +45,18 @@ icon_state = "quad_keys" w_class = ITEMSIZE_TINY -/obj/vehicle/train/engine/quadbike/Move(var/turf/destination) - var/turf/T = get_turf(src) - ..() //Move it move it, so we can test it test it. - if(T != get_turf(src) && !istype(destination, T.type)) //Did we move at all, and are we changing turf types? - if(istype(destination, /turf/simulated/floor/water)) +/obj/vehicle/train/engine/quadbike/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() //Move it move it, so we can test it test it. + if(!istype(loc, old_loc.type) && !istype(old_loc, loc.type)) //Did we move at all, and are we changing turf types? + if(istype(loc, /turf/simulated/floor/water)) speed_mod = outdoors_speed_mod * 4 //It kind of floats due to its tires, but it is slow. - else if(istype(destination, /turf/simulated/floor/outdoors/rocks)) + else if(istype(loc, /turf/simulated/floor/outdoors/rocks)) speed_mod = initial(speed_mod) //Rocks are good, rocks are solid. - else if(istype(destination, /turf/simulated/floor/outdoors/dirt) || istype(destination, /turf/simulated/floor/outdoors/grass)) + else if(istype(loc, /turf/simulated/floor/outdoors/dirt) || istype(loc, /turf/simulated/floor/outdoors/grass)) speed_mod = outdoors_speed_mod //Dirt and grass are the outdoors bench mark. - else if(istype(destination, /turf/simulated/floor/outdoors/mud)) + else if(istype(loc, /turf/simulated/floor/outdoors/mud)) speed_mod = outdoors_speed_mod * 1.5 //Gets us roughly 1. Mud may be fun, but it's not the best. - else if(istype(destination, /turf/simulated/floor/outdoors/snow)) + else if(istype(loc, /turf/simulated/floor/outdoors/snow)) speed_mod = outdoors_speed_mod * 1.7 //Roughly a 1.25. Snow is coarse and wet and gets everywhere, especially your electric motors. else speed_mod = initial(speed_mod) @@ -193,8 +192,8 @@ ..() update_icon() -/obj/vehicle/train/trolley/trailer/Move() - ..() +/obj/vehicle/train/trolley/trailer/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() if(lead) switch(dir) //Due to being a Big Boy sprite, it has to have special pixel shifting to look 'normal'. if(1) diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 24d24b1179..67fc0735a3 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -29,14 +29,11 @@ /obj/vehicle/train/Move() var/old_loc = get_turf(src) - if(..()) + if((. = ..())) if(tow) tow.Move(old_loc) - return 1 - else - if(lead) - unattach() - return 0 + else if(lead) + unattach() /obj/vehicle/train/Bump(atom/Obstacle) if(!istype(Obstacle, /atom/movable)) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 8fa521c053..e43228c4be 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -42,8 +42,6 @@ var/load_offset_y = 0 //pixel_y offset for item overlay var/mob_offset_y = 0 //pixel_y offset for mob overlay - var/datum/riding/riding_datum = null - //------------------------------------------- // Standard procs //------------------------------------------- @@ -66,54 +64,29 @@ /obj/vehicle/unbuckle_mob(mob/living/buckled_mob, force = FALSE) . = ..(buckled_mob, force) - buckled_mob.update_water() + buckled_mob?.update_water() if(riding_datum) riding_datum.restore_position(buckled_mob) riding_datum.handle_vehicle_offsets() // So the person in back goes to the front. -/obj/vehicle/set_dir(newdir) - ..(newdir) - if(riding_datum) - riding_datum.handle_vehicle_offsets() +/obj/vehicle/Move(var/newloc, var/direction, var/movetime) + if(world.time < l_move_time + move_delay) //This AND the riding datum move speed limit? + return -//MOVEMENT -/obj/vehicle/relaymove(mob/user, direction) - if(riding_datum) - riding_datum.handle_ride(user, direction) + if(mechanical && on && powered && cell.charge < charge_use) + turn_off() + return -/obj/vehicle/Moved() . = ..() - if(riding_datum) - riding_datum.handle_vehicle_layer() - riding_datum.handle_vehicle_offsets() -/obj/vehicle/Move() - if(world.time > l_move_time + move_delay) - var/old_loc = get_turf(src) - if(mechanical && on && powered && cell.charge < charge_use) - turn_off() + if(mechanical && on && powered) + cell.use(charge_use) - var/init_anc = anchored - anchored = 0 - if(!..()) - anchored = init_anc - return 0 - - set_dir(get_dir(old_loc, loc)) - anchored = init_anc - - if(mechanical && on && powered) - cell.use(charge_use) - - //Dummy loads do not have to be moved as they are just an overlay - //See load_object() proc in cargo_trains.dm for an example - if(load && !istype(load, /datum/vehicle_dummy_load)) - load.forceMove(loc) - load.set_dir(dir) - - return 1 - else - return 0 + //Dummy loads do not have to be moved as they are just an overlay + //See load_object() proc in cargo_trains.dm for an example + //Also mobs are buckled to the vehicle and get moved in atom/movable/Move's call to take care of that + if(load && !(load in buckled_mobs) && !istype(load, /datum/vehicle_dummy_load)) + load.forceMove(loc) /obj/vehicle/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/hand_labeler)) diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm index 433a26977b..36ec60e8cb 100644 --- a/code/modules/virus2/centrifuge.dm +++ b/code/modules/virus2/centrifuge.dm @@ -138,7 +138,7 @@ delay = delay/2 curing = round(delay) - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) + playsound(src, 'sound/machines/juicer.ogg', 50, 1) update_icon() return 1 diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index bd8fdf7513..60e3543e19 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -367,8 +367,8 @@ secondary_effect.ToggleActivate(0) return -/obj/machinery/artifact/Move() - ..() +/obj/machinery/artifact/Moved() + . = ..() if(my_effect) my_effect.UpdateMove() if(secondary_effect) diff --git a/code/modules/xenoarcheaology/effects/vampire.dm b/code/modules/xenoarcheaology/effects/vampire.dm index ee75ea5ba1..cf0ae9a246 100644 --- a/code/modules/xenoarcheaology/effects/vampire.dm +++ b/code/modules/xenoarcheaology/effects/vampire.dm @@ -12,7 +12,7 @@ /datum/artifact_effect/vampire/proc/bloodcall(var/mob/living/carbon/human/M) last_bloodcall = world.time if(istype(M)) - playsound(holder.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) + playsound(holder, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) var/target = pick(M.organs_by_name) M.apply_damage(rand(5, 10), SEARING, target) @@ -54,7 +54,7 @@ charges += 0.25 else charges += 1 - playsound(holder.loc, 'sound/effects/splat.ogg', 50, 1, -3) + playsound(holder, 'sound/effects/splat.ogg', 50, 1, -3) qdel(B) @@ -68,7 +68,7 @@ charges -= 1 var/spawn_type = pick(/mob/living/simple_mob/animal/space/bats, /mob/living/simple_mob/creature, /mob/living/simple_mob/faithless) new spawn_type(get_turf(pick(view(1,T)))) - playsound(holder.loc, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3) + playsound(holder, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3) if(charges >= 1 && nearby_mobs.len && prob(15 * nearby_mobs.len)) var/mob/living/L = pick(nearby_mobs) diff --git a/code/modules/xenoarcheaology/finds/special.dm b/code/modules/xenoarcheaology/finds/special.dm index 3ed9ce38e8..93bfa10966 100644 --- a/code/modules/xenoarcheaology/finds/special.dm +++ b/code/modules/xenoarcheaology/finds/special.dm @@ -77,7 +77,7 @@ charges += 0.25 else charges += 1 - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1, -3) + playsound(src, 'sound/effects/splat.ogg', 50, 1, -3) //use up stored charges if(charges >= 10) @@ -89,12 +89,12 @@ charges -= 1 var/spawn_type = pick(/mob/living/simple_mob/creature) new spawn_type(pick(view(1,src))) - playsound(src.loc, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3) + playsound(src, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3) if(charges >= 1) if(shadow_wights.len < 5 && prob(5)) shadow_wights.Add(new /obj/effect/shadow_wight(src.loc)) - playsound(src.loc, 'sound/effects/ghost.ogg', 50, 1, -3) + playsound(src, 'sound/effects/ghost.ogg', 50, 1, -3) charges -= 0.1 if(charges >= 0.1) @@ -124,7 +124,7 @@ /obj/item/weapon/vampiric/proc/bloodcall(var/mob/living/carbon/human/M) last_bloodcall = world.time if(istype(M)) - playsound(src.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) + playsound(src, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) nearby_mobs.Add(M) var/target = pick(M.organs_by_name) @@ -180,7 +180,7 @@ src.loc = get_turf(pick(orange(1,src))) var/mob/living/carbon/M = locate() in src.loc if(M) - playsound(src.loc, pick('sound/hallucinations/behind_you1.ogg',\ + playsound(src, pick('sound/hallucinations/behind_you1.ogg',\ 'sound/hallucinations/behind_you2.ogg',\ 'sound/hallucinations/i_see_you1.ogg',\ 'sound/hallucinations/i_see_you2.ogg',\ diff --git a/code/modules/xenoarcheaology/tools/coolant_tank.dm b/code/modules/xenoarcheaology/tools/coolant_tank.dm index 9f5172b3de..2975cf0749 100644 --- a/code/modules/xenoarcheaology/tools/coolant_tank.dm +++ b/code/modules/xenoarcheaology/tools/coolant_tank.dm @@ -21,7 +21,7 @@ var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread S.set_up(5, 0, src.loc) - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3) spawn(0) S.start() diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index 5cb5d32479..3d15b0583d 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -244,7 +244,7 @@ scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0) if(prob(0.75)) src.visible_message("[bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2) - playsound(loc, 'sound/effects/ding.ogg', 25) + playsound(src, 'sound/effects/ding.ogg', 25) last_process_worldtime = world.time /obj/machinery/radiocarbon_spectrometer/proc/stop_scanning() diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index 9ab39467d3..f4a60f1bfd 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -133,7 +133,7 @@ anchored = 0 else anchored = 1 - playsound(loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You wrench the stabilising legs [anchored ? "into place" : "up against the body"].") if(anchored) desc = "It is resting securely on four stubby legs." diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm index fddbb13a5e..6368f68e15 100644 --- a/code/modules/xenobio/items/extracts.dm +++ b/code/modules/xenobio/items/extracts.dm @@ -323,7 +323,7 @@ /datum/chemical_reaction/slime/orange_fire/on_reaction(var/datum/reagents/holder) log_and_message_admins("Orange extract reaction (fire) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") holder.my_atom.visible_message("\The [src] begins to vibrate violently!") - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 75, 1) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) spawn(5 SECONDS) if(holder && holder.my_atom) var/turf/simulated/T = get_turf(holder.my_atom) @@ -360,11 +360,11 @@ /datum/chemical_reaction/slime/yellow_emp/on_reaction(var/datum/reagents/holder) log_and_message_admins("Yellow extract reaction (emp) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") holder.my_atom.visible_message("\The [src] begins to vibrate violently!") - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 75, 1) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) spawn(5 SECONDS) if(holder && holder.my_atom) empulse(get_turf(holder.my_atom), 2, 4, 7, 10) // As strong as a normal EMP grenade. - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 75, 1) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) ..() @@ -575,7 +575,7 @@ log_and_message_admins("Red extract reaction (enrage) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 75, 1) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) ..() @@ -696,7 +696,7 @@ power++ E.uses = 0 - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 75, 1) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1) holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!") log_and_message_admins("Oil extract reaction (explosion) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]") diff --git a/code/modules/xenobio/machinery/processor.dm b/code/modules/xenobio/machinery/processor.dm index 6d888adb26..216c0cb77b 100644 --- a/code/modules/xenobio/machinery/processor.dm +++ b/code/modules/xenobio/machinery/processor.dm @@ -27,7 +27,7 @@ begin_processing() else to_chat(user, "The processor is empty.") - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) return // Verb to remove everything. @@ -54,7 +54,7 @@ return if(!can_insert(AM)) to_chat(user, "\The [src] cannot process \the [AM] at this time.") - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) return to_be_processed.Add(AM) AM.forceMove(src) @@ -64,26 +64,26 @@ if(processing) return // Already doing it. processing = TRUE - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) + playsound(src, 'sound/machines/juicer.ogg', 50, 1) for(var/atom/movable/AM in to_be_processed) extract(AM) sleep(1 SECONDS) while(monkeys_recycled >= 4) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(src)) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) monkeys_recycled -= 4 sleep(1 SECOND) processing = FALSE - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src, 'sound/machines/ding.ogg', 50, 1) /obj/machinery/processor/proc/extract(var/atom/movable/AM) if(istype(AM, /mob/living/simple_mob/slime)) var/mob/living/simple_mob/slime/S = AM while(S.cores) new S.coretype(get_turf(src)) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) S.cores-- sleep(1 SECOND) to_be_processed.Remove(S) @@ -91,7 +91,7 @@ if(istype(AM, /mob/living/carbon/human)) var/mob/living/carbon/human/M = AM - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) to_be_processed.Remove(M) qdel(M) monkeys_recycled++ diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 3b35bf8c24..dca8e74190 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -115,4 +115,13 @@ BIG IMG.icon {width: 32px; height: 32px;} .debug_debug {color:#0000FF;} .debug_trace {color:#888888;} +.black {color: #000000;} +.darkgray {color: #808080;} +.gray {color: #A9A9A9;} +.red {color: #FF0000;} +.orange {color: #FF8C00;} +.blue {color: #0000FF;} +.green {color: #00DD00;} + + "} diff --git a/config/example/config.txt b/config/example/config.txt index 118c64821c..f28c6539c8 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -515,4 +515,13 @@ SQLITE_FEEDBACK_COOLDOWN 0 SQLITE_FEEDBACK_MIN_AGE 7 ## Uncomment this if you want to disable the popup alert for people on the same CID (Don't do this on a live server if you ban multikeying) -#DISABLE_CID_WARN_POPUP \ No newline at end of file +#DISABLE_CID_WARN_POPUP + +## Comment this out if you don't want to use the 'nightshift lighting' subsystem to adjust lights based on ingame time +ENABLE_NIGHT_SHIFTS +## OOC/LOOC control ## + +# Uncomment to allow links of the following kinds. # +# ALLOW_BYOND_LINKS +# ALLOW_DISCORD_LINKS +ALLOW_URL_LINKS diff --git a/html/changelog.html b/html/changelog.html index 6045c2ca04..cc0d540a75 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,39 @@ -->
      +

      13 May 2020

      +

      Atermonera updated:

      +
        +
      • Added a preference to control multilingual parsing behaviour, with a few different modes. Should hopefully be less punishing to people who stutter and use hyphens as a language key.
      • +
      • The examine mode preference should now persist across reconnections during a single round, but if the server is fully restarted it still appears to reset. This issue is also present for the multilingual preference, and I'm still looking into it. Savefiles are cryptic.
      • +
      +

      Layne updated:

      +
        +
      • Added Promethean language.
      • +
      +

      Mechoid updated:

      +
        +
      • Adds more interactions with animals, like shearing and taming.
      • +
      • New PoIs
      • +
      • Thermal poncho attachment, has minor slowdown, but gives thermal protection to the armor it is attached to.
      • +
      • Mercenaries now drop their guns again. Most likely to be broken, however they can be repaired. Examining when adjacent will allow you to inspect the gun for what is needed.
      • +
      • Mercenary Snipers now exist. They will telegraph their shots approximately 2 seconds in advance, and can fire at 14 tiles away. Will occasionally drop pieces of their PTRs that survive combat.
      • +
      • Clothing can now check attachments for temperature resistance.
      • +
      • MHD Howitzer beam effect actually exists again.
      • +
      • Xenoresin ground cover is properly colored again.
      • +
      +

      atlantiscze updated:

      +
        +
      • Robots can now search loot piles.
      • +
      • Hardsuits now allow backpacks to be carried in storage slot. This is limited to hardsuits which are worn on the back slot.
      • +
      • SMES units now have automatic load balancing both on inputs and outputs
      • +
      • SMES units (and derived objects, such as PSUs) can now have more than one input terminal. This allows for input from more otherwise isolated power networks.
      • +
      • Completely redesigned cell rack PSUs, removed ghetto variant. Cell rack PSUs now support multiple power cells and hot-swapping of cells during operation. This allows for either charging multiple cells at once in one device (directly from power cable) or for powering up various machinery with only a power cell. They are still inferior to SMESes in pretty much all aspects.
      • +
      • Multitool on a cable now shows nicer results with large currents (uses kW or MW accordingly)
      • +
      • Multitool may be now used to change colour of cable coils.
      • +
      • Supermatter delamination effects have been tweaked. Delamination is considerably less laggy, and less directly destructive. Instead, it causes larger health hazard and secondary engineering problems such as power outage or partial damage of solar arrays.
      • +
      +

      29 April 2020

      Leshana updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 08eaf8a18c..2f698c2602 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5132,3 +5132,48 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Shutoff valve monitoring is now also available as a modular computer program. Its UI has also been cleaned up a little. - rscadd: Research robot module now has basic exploration and xenoarchaeology tools. +2020-05-13: + Atermonera: + - rscadd: Added a preference to control multilingual parsing behaviour, with a few + different modes. Should hopefully be less punishing to people who stutter and + use hyphens as a language key. + - tweak: The examine mode preference should now persist across reconnections during + a single round, but if the server is fully restarted it still appears to reset. + This issue is also present for the multilingual preference, and I'm still looking + into it. Savefiles are cryptic. + Layne: + - rscadd: Added Promethean language. + Mechoid: + - rscadd: Adds more interactions with animals, like shearing and taming. + - rscadd: New PoIs + - rscadd: Thermal poncho attachment, has minor slowdown, but gives thermal protection + to the armor it is attached to. + - rscadd: Mercenaries now drop their guns again. Most likely to be broken, however + they can be repaired. Examining when adjacent will allow you to inspect the + gun for what is needed. + - rscadd: Mercenary Snipers now exist. They will telegraph their shots approximately + 2 seconds in advance, and can fire at 14 tiles away. Will occasionally drop + pieces of their PTRs that survive combat. + - tweak: Clothing can now check attachments for temperature resistance. + - bugfix: MHD Howitzer beam effect actually exists again. + - bugfix: Xenoresin ground cover is properly colored again. + atlantiscze: + - rscadd: Robots can now search loot piles. + - rscadd: Hardsuits now allow backpacks to be carried in storage slot. This is limited + to hardsuits which are worn on the back slot. + - rscadd: SMES units now have automatic load balancing both on inputs and outputs + - rscadd: SMES units (and derived objects, such as PSUs) can now have more than + one input terminal. This allows for input from more otherwise isolated power + networks. + - tweak: Completely redesigned cell rack PSUs, removed ghetto variant. Cell rack + PSUs now support multiple power cells and hot-swapping of cells during operation. + This allows for either charging multiple cells at once in one device (directly + from power cable) or for powering up various machinery with only a power cell. + They are still inferior to SMESes in pretty much all aspects. + - tweak: Multitool on a cable now shows nicer results with large currents (uses + kW or MW accordingly) + - tweak: Multitool may be now used to change colour of cable coils. + - tweak: Supermatter delamination effects have been tweaked. Delamination is considerably + less laggy, and less directly destructive. Instead, it causes larger health + hazard and secondary engineering problems such as power outage or partial damage + of solar arrays. diff --git a/html/changelogs/KasparoVv - PR - 7215.yml b/html/changelogs/KasparoVv - PR - 7215.yml new file mode 100644 index 0000000000..efd745d1a9 --- /dev/null +++ b/html/changelogs/KasparoVv - PR - 7215.yml @@ -0,0 +1,7 @@ +author: KasparoVv +delete-after: True +changes: + - rscadd: "You can now quickly cycle hrough previous or next hair/facial styles at character creation." + - rscadd: "Use the -mv- button to pick a marking and place it above of another on your character. Saves you from pressing up or down a bunch." + - tweak: "Ports color_square() from Paradise for colour previews, cleaning up pref. code & correct alignment issue w/ nested tables." + - tweak: "Markings are now properly aligned within a table." \ No newline at end of file diff --git a/html/changelogs/Layne - Promethean Language.yml b/html/changelogs/Layne - Promethean Language.yml deleted file mode 100644 index ed0f2e7ab3..0000000000 --- a/html/changelogs/Layne - Promethean Language.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Layne -delete-after: True -changes: - - rscadd: "Promethean language." - - tweak: "NONVERBAL define was changed a bit." diff --git a/html/changelogs/mechoid-newhorizon.yml b/html/changelogs/arokha-janicart.yml similarity index 59% rename from html/changelogs/mechoid-newhorizon.yml rename to html/changelogs/arokha-janicart.yml index e9740680a3..9caf37fab8 100644 --- a/html/changelogs/mechoid-newhorizon.yml +++ b/html/changelogs/arokha-janicart.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Mechoid +author: Arokha # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,12 +33,5 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - rscadd: "Adds more interactions with animals, like shearing and taming." - - rscadd: "Sif moss turfs can now spawn animal groups." - - rscadd: "New PoIs" - - rscadd: "Thermal poncho attachment, has minor slowdown, but gives thermal protection to the armor it is attached to." - - rscadd: "Mercenaries now drop their guns again. Most likely to be broken, however they can be repaired. Examining when adjacent will allow you to inspect the gun for what is needed." - - rscadd: "Mercenary Snipers now exist. They will telegraph their shots approximately 2 seconds in advance, and can fire at 14 tiles away. Will occasionally drop pieces of their PTRs that survive combat." - - tweak: "Clothing can now check attachments for temperature resistance." - - bugfix: "MHD Howitzer beam effect actually exists again. - - bugfix: "Xenoresin ground cover is properly colored again." + - rscadd: "New sprites for janicart" + - tweak: "Alt-click helpers for stowing mop, chemicals on janicart" diff --git a/html/changelogs/atermonera - vchat_exportlog.yml b/html/changelogs/atermonera - vchat_exportlog.yml new file mode 100644 index 0000000000..a2915951a2 --- /dev/null +++ b/html/changelogs/atermonera - vchat_exportlog.yml @@ -0,0 +1,5 @@ +author: Atermonera +delete-after: True +changes: + - rscadd: "Added verb to export vchat logs, found in OOC tab when vchat has successfully loaded." + - tweak: "Vchat only sends you enough messages to fill your buffer on reconnect, instead of all of them." diff --git a/html/changelogs/atermonera_multilingual_pref.yml b/html/changelogs/atermonera_multilingual_pref.yml deleted file mode 100644 index 84552b9a13..0000000000 --- a/html/changelogs/atermonera_multilingual_pref.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: Atermonera -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Added a preference to control multilingual parsing behaviour, with a few different modes. Should hopefully be less punishing to people who stutter and use hyphens as a language key." - - tweak: "The examine mode preference should now persist across reconnections during a single round, but if the server is fully restarted it still appears to reset. This issue is also present for the multilingual preference, and I'm still looking into it. Savefiles are crpytic." diff --git a/html/changelogs/atlantiscze-dumpsterdive.yml b/html/changelogs/atlantiscze-dumpsterdive.yml deleted file mode 100644 index ee988d11b9..0000000000 --- a/html/changelogs/atlantiscze-dumpsterdive.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: atlantiscze - -delete-after: True - -changes: - - rscadd: "Robots can now search loot piles." \ No newline at end of file diff --git a/html/changelogs/atlantiscze-hardsuit.yml b/html/changelogs/atlantiscze-hardsuit.yml deleted file mode 100644 index 92cea41472..0000000000 --- a/html/changelogs/atlantiscze-hardsuit.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: atlantiscze - -delete-after: True - -changes: - - rscadd: "Hardsuits now allow backpacks to be carried in storage slot. This is limited to hardsuits which are worn on the back slot." \ No newline at end of file diff --git a/html/changelogs/atlantiscze-power.yml b/html/changelogs/atlantiscze-power.yml deleted file mode 100644 index 31e354cc55..0000000000 --- a/html/changelogs/atlantiscze-power.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: atlantiscze -delete-after: True - -changes: - - rscadd: "SMES units now have automatic load balancing both on inputs and outputs" - - rscadd: "SMES units (and derived objects, such as PSUs) can now have more than one input terminal. This allows for input from more otherwise isolated power networks." - - tweak: "Completely redesigned cell rack PSUs, removed ghetto variant. Cell rack PSUs now support multiple power cells and hot-swapping of cells during operation. This allows for either charging multiple cells at once in one device (directly from power cable) or for powering up various machinery with only a power cell. They are still inferior to SMESes in pretty much all aspects." - - tweak: "Multitool on a cable now shows nicer results with large currents (uses kW or MW accordingly)" - - tweak: "Multitool may be now used to change colour of cable coils." - \ No newline at end of file diff --git a/html/changelogs/atlantiscze-sm.yml b/html/changelogs/atlantiscze-sm.yml deleted file mode 100644 index d6d8ddbfcf..0000000000 --- a/html/changelogs/atlantiscze-sm.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: atlantiscze - -delete-after: True - -changes: - - tweak: "Supermatter delamination effects have been tweaked. Delamination is considerably less laggy, and less directly destructive. Instead, it causes larger health hazard and secondary engineering problems such as power outage or partial damage of solar arrays." \ No newline at end of file diff --git a/icons/mob/custom_items_mob.dmi b/icons/mob/custom_items_mob.dmi index e69de29bb2..ee0943afc4 100644 Binary files a/icons/mob/custom_items_mob.dmi and b/icons/mob/custom_items_mob.dmi differ diff --git a/icons/mob/custom_items_rig_boots.dmi b/icons/mob/custom_items_rig_boots.dmi index cf74d73796..1d06e30339 100644 Binary files a/icons/mob/custom_items_rig_boots.dmi and b/icons/mob/custom_items_rig_boots.dmi differ diff --git a/icons/mob/custom_items_rig_gloves.dmi b/icons/mob/custom_items_rig_gloves.dmi index cf74d73796..be4669fad9 100644 Binary files a/icons/mob/custom_items_rig_gloves.dmi and b/icons/mob/custom_items_rig_gloves.dmi differ diff --git a/icons/mob/custom_items_rig_helmet.dmi b/icons/mob/custom_items_rig_helmet.dmi index cf74d73796..d0121b7dfb 100644 Binary files a/icons/mob/custom_items_rig_helmet.dmi and b/icons/mob/custom_items_rig_helmet.dmi differ diff --git a/icons/mob/custom_items_rig_suit.dmi b/icons/mob/custom_items_rig_suit.dmi index cf74d73796..0f836f3174 100644 Binary files a/icons/mob/custom_items_rig_suit.dmi and b/icons/mob/custom_items_rig_suit.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index e564761550..07f4090386 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/screen/holo.dmi b/icons/mob/screen/holo.dmi index 4fb14b0eca..e7a0d01a1b 100644 Binary files a/icons/mob/screen/holo.dmi and b/icons/mob/screen/holo.dmi differ diff --git a/icons/mob/screen/midnight.dmi b/icons/mob/screen/midnight.dmi index 1b6775124e..a2519bf1d5 100644 Binary files a/icons/mob/screen/midnight.dmi and b/icons/mob/screen/midnight.dmi differ diff --git a/icons/mob/screen/minimalist.dmi b/icons/mob/screen/minimalist.dmi index 68536c8c28..f53374f86f 100644 Binary files a/icons/mob/screen/minimalist.dmi and b/icons/mob/screen/minimalist.dmi differ diff --git a/icons/mob/screen/old-noborder.dmi b/icons/mob/screen/old-noborder.dmi index fef88b9460..7998ec1ae1 100644 Binary files a/icons/mob/screen/old-noborder.dmi and b/icons/mob/screen/old-noborder.dmi differ diff --git a/icons/mob/screen/old.dmi b/icons/mob/screen/old.dmi index 44f9147b67..54465c4831 100644 Binary files a/icons/mob/screen/old.dmi and b/icons/mob/screen/old.dmi differ diff --git a/icons/mob/screen/orange.dmi b/icons/mob/screen/orange.dmi index 3c7a2eb443..22f806952e 100644 Binary files a/icons/mob/screen/orange.dmi and b/icons/mob/screen/orange.dmi differ diff --git a/icons/mob/screen/white.dmi b/icons/mob/screen/white.dmi index 8b241bfa65..12ec85588e 100644 Binary files a/icons/mob/screen/white.dmi and b/icons/mob/screen/white.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi new file mode 100644 index 0000000000..32921f3213 Binary files /dev/null and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/spacesuit.dmi b/icons/mob/spacesuit.dmi index 7c1425e07c..3a62b0b055 100644 Binary files a/icons/mob/spacesuit.dmi and b/icons/mob/spacesuit.dmi differ diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi index 0c8999a9b5..f5222773f7 100644 Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi index d10902a6ff..5b6fb68f69 100644 Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index 7a95007bd7..b16391d08b 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index 9a5d4ec447..ba0d05c28b 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 4f8010b259..edca8f2790 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index 6902130e1d..0b68e98a67 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 7dba50ef6b..c3b9f3896f 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index 10cf92dcf4..b9cd1410f7 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi index 98d45f3ac9..257f67a322 100644 Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index 2d2d0a434b..3149eb2a22 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 13ed45334c..82d26fb02e 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/suit_1.dmi b/icons/mob/suit_1.dmi index 7c2c53f8ff..7d52018483 100644 Binary files a/icons/mob/suit_1.dmi and b/icons/mob/suit_1.dmi differ diff --git a/icons/mob/suit_solgov.dmi b/icons/mob/suit_solgov.dmi new file mode 100644 index 0000000000..9806d68b9c Binary files /dev/null and b/icons/mob/suit_solgov.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index b65057ef8b..a9e2f8eb92 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform_rolled_down.dmi b/icons/mob/uniform_rolled_down.dmi index 8e4c1d7aab..95a013291d 100644 Binary files a/icons/mob/uniform_rolled_down.dmi and b/icons/mob/uniform_rolled_down.dmi differ diff --git a/icons/mob/uniform_sleeves_rolled.dmi b/icons/mob/uniform_sleeves_rolled.dmi index dbb4edaf75..0e7e878307 100644 Binary files a/icons/mob/uniform_sleeves_rolled.dmi and b/icons/mob/uniform_sleeves_rolled.dmi differ diff --git a/icons/mob/uniform_solgov.dmi b/icons/mob/uniform_solgov.dmi index 3e6a47e4f2..ecc6310dc4 100644 Binary files a/icons/mob/uniform_solgov.dmi and b/icons/mob/uniform_solgov.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index a83c32053a..8f887eeb92 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index d170c2510d..30a96788da 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/spacesuits.dmi b/icons/obj/clothing/spacesuits.dmi index 2ee7110282..d53f8e7078 100644 Binary files a/icons/obj/clothing/spacesuits.dmi and b/icons/obj/clothing/spacesuits.dmi differ diff --git a/icons/obj/clothing/species/seromi/suits.dmi b/icons/obj/clothing/species/seromi/suits.dmi index c9d42aef96..0457262657 100644 Binary files a/icons/obj/clothing/species/seromi/suits.dmi and b/icons/obj/clothing/species/seromi/suits.dmi differ diff --git a/icons/obj/clothing/species/seromi/uniform.dmi b/icons/obj/clothing/species/seromi/uniform.dmi index 17a0405f24..f2dc52a913 100644 Binary files a/icons/obj/clothing/species/seromi/uniform.dmi and b/icons/obj/clothing/species/seromi/uniform.dmi differ diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi index 6512b42d6e..9a76e3e570 100644 Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi index 3874dac941..572cd18d10 100644 Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi index 89f359a4a9..a1b4dee3a4 100644 Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi index e8ab73eadf..069141c2a9 100644 Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi index 82eb675ed1..5c578e4bfd 100644 Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi index 01bc6e4650..928c0cd533 100644 Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index ad2cf41c4d..0421e0bff6 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/suits_1.dmi b/icons/obj/clothing/suits_1.dmi index f734907c89..7a75bbba5b 100644 Binary files a/icons/obj/clothing/suits_1.dmi and b/icons/obj/clothing/suits_1.dmi differ diff --git a/icons/obj/clothing/suits_solgov.dmi b/icons/obj/clothing/suits_solgov.dmi new file mode 100644 index 0000000000..13aa71d033 Binary files /dev/null and b/icons/obj/clothing/suits_solgov.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index d8196073b0..0bc7a9fcb2 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/uniforms_solgov.dmi b/icons/obj/clothing/uniforms_solgov.dmi index 4f1d58afe3..2b55ea04a2 100644 Binary files a/icons/obj/clothing/uniforms_solgov.dmi and b/icons/obj/clothing/uniforms_solgov.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 5d6825416e..735f9c3f5b 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/custom_items_obj.dmi b/icons/obj/custom_items_obj.dmi index e69de29bb2..0e8e9a0125 100644 Binary files a/icons/obj/custom_items_obj.dmi and b/icons/obj/custom_items_obj.dmi differ diff --git a/icons/obj/gps.dmi b/icons/obj/gps.dmi index 17c25ac15e..2a1bc98b10 100644 Binary files a/icons/obj/gps.dmi and b/icons/obj/gps.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index f73fc5a2e8..35dd126559 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 2a08fc2a8d..349c8a4030 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 7b7238c3ab..e647e51ad4 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index a34f07a83e..da6e770039 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/modular_components.dmi b/icons/obj/modular_components.dmi index 3784d6992c..e9fca8c555 100644 Binary files a/icons/obj/modular_components.dmi and b/icons/obj/modular_components.dmi differ diff --git a/icons/obj/railing.dmi b/icons/obj/railing.dmi index c37c89c159..3a1f07cdbf 100644 Binary files a/icons/obj/railing.dmi and b/icons/obj/railing.dmi differ diff --git a/icons/obj/robot_component.dmi b/icons/obj/robot_component.dmi index be418d392b..108a111fa9 100644 Binary files a/icons/obj/robot_component.dmi and b/icons/obj/robot_component.dmi differ diff --git a/icons/obj/robotics.dmi b/icons/obj/robotics.dmi index 1a7e1caf67..25a1aa9caa 100644 Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 51c8493a3e..88fa2ab801 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 6f318cff60..f67997c910 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/uav.dmi b/icons/obj/uav.dmi new file mode 100644 index 0000000000..daae9a03da Binary files /dev/null and b/icons/obj/uav.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 16eb4c814a..b3af4f19f8 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/turf/catwalks.dmi b/icons/turf/catwalks.dmi index 9e3d3d977c..20c5e1f4d9 100644 Binary files a/icons/turf/catwalks.dmi and b/icons/turf/catwalks.dmi differ diff --git a/icons/turf/flooring/eris/grass.dmi b/icons/turf/flooring/eris/grass.dmi new file mode 100644 index 0000000000..d5a85320c4 Binary files /dev/null and b/icons/turf/flooring/eris/grass.dmi differ diff --git a/icons/turf/flooring/eris/hull.dmi b/icons/turf/flooring/eris/hull.dmi new file mode 100644 index 0000000000..9ec88575b6 Binary files /dev/null and b/icons/turf/flooring/eris/hull.dmi differ diff --git a/icons/turf/flooring/eris/plating.dmi b/icons/turf/flooring/eris/plating.dmi new file mode 100644 index 0000000000..455fdcc4f2 Binary files /dev/null and b/icons/turf/flooring/eris/plating.dmi differ diff --git a/icons/turf/flooring/eris/tiles.dmi b/icons/turf/flooring/eris/tiles.dmi new file mode 100644 index 0000000000..61edb65708 Binary files /dev/null and b/icons/turf/flooring/eris/tiles.dmi differ diff --git a/icons/turf/flooring/eris/tiles_dark.dmi b/icons/turf/flooring/eris/tiles_dark.dmi new file mode 100644 index 0000000000..7ca285d856 Binary files /dev/null and b/icons/turf/flooring/eris/tiles_dark.dmi differ diff --git a/icons/turf/flooring/eris/tiles_maint.dmi b/icons/turf/flooring/eris/tiles_maint.dmi new file mode 100644 index 0000000000..2d94d9c8b5 Binary files /dev/null and b/icons/turf/flooring/eris/tiles_maint.dmi differ diff --git a/icons/turf/flooring/eris/tiles_steel.dmi b/icons/turf/flooring/eris/tiles_steel.dmi new file mode 100644 index 0000000000..59cef85928 Binary files /dev/null and b/icons/turf/flooring/eris/tiles_steel.dmi differ diff --git a/icons/turf/flooring/eris/tiles_white.dmi b/icons/turf/flooring/eris/tiles_white.dmi new file mode 100644 index 0000000000..ee27b6caa2 Binary files /dev/null and b/icons/turf/flooring/eris/tiles_white.dmi differ diff --git a/icons/turf/flooring/eris/tilestack.dmi b/icons/turf/flooring/eris/tilestack.dmi new file mode 100644 index 0000000000..b46c363372 Binary files /dev/null and b/icons/turf/flooring/eris/tilestack.dmi differ diff --git a/icons/turf/flooring/grass.dmi b/icons/turf/flooring/grass.dmi index 5b8c7c3fca..abe272fbc4 100644 Binary files a/icons/turf/flooring/grass.dmi and b/icons/turf/flooring/grass.dmi differ diff --git a/icons/turf/outdoors.dmi b/icons/turf/outdoors.dmi index b8af78d986..f08a94a80f 100644 Binary files a/icons/turf/outdoors.dmi and b/icons/turf/outdoors.dmi differ diff --git a/icons/turf/outdoors_edge.dmi b/icons/turf/outdoors_edge.dmi index fb0b04168e..bb334272fb 100644 Binary files a/icons/turf/outdoors_edge.dmi and b/icons/turf/outdoors_edge.dmi differ diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index cb8e5deb27..0077da2ef7 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -23,7 +23,7 @@ "aaw" = (/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym) "aax" = (/obj/structure/fitness/punchingbag,/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym) "aay" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Station Gym"; dir = 2},/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym) -"aaz" = (/obj/structure/reagent_dispensers/water_cooler/full,/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym) +"aaz" = (/obj/structure/reagent_dispensers/water_cooler/full{dir = 8},/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/holofloor/wood,/area/crew_quarters/firstdeck/gym) "aaA" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "d1fore_port2_pump"},/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/hallway/primary/firstdeck/auxdockfore) "aaB" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "d1fore_port2_pump"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/hallway/primary/firstdeck/auxdockfore) "aaC" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/firstdeck/auxdockfore) @@ -623,7 +623,7 @@ "alY" = (/obj/structure/bed/chair,/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station) "alZ" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/bed/chair,/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod2/station) "ama" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/shuttle/large_escape_pod2/station) -"amb" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod2/station) +"amb" = (/obj/machinery/vending/fitness{dir = 4},/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) "amc" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hangar/one) "amd" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/hangar/one) "ame" = (/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/suit/storage/hazardvest,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport) @@ -639,8 +639,8 @@ "amo" = (/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "amp" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "amq" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/hangar/one) -"amr" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle1/start) -"ams" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle1/start) +"amr" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod2/station) +"ams" = (/obj/machinery/vending/cigarette{dir = 4},/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) "amt" = (/obj/structure/closet,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hangar/one) "amu" = (/obj/item/weapon/storage/bible,/obj/structure/table/rack,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/firstdeck/foreport) "amv" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fpcenter) @@ -704,7 +704,7 @@ "anB" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/airless,/area/rnd/xenobiology/xenoflora) "anC" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_isolation) "anD" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_2_hatch"; locked = 1; name = "Large Escape Pod Hatch 2"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) -"anE" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod2/station) +"anE" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle1/start) "anF" = (/obj/machinery/space_heater,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hangar/one) "anG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/monotile,/area/hangar/one) "anH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hangar/one) @@ -771,7 +771,7 @@ "aoQ" = (/obj/machinery/telecomms/bus/preset_three,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber) "aoR" = (/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/machinery/camera/network/telecom{c_tag = "Tcoms - Central Compartment Starboard"; dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber) "aoS" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/tcomm/computer) -"aoT" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/obj/machinery/airlock_sensor/airlock_exterior{frequency = 1381; id_tag = "server_access_ex_sensor"; master_tag = "server_access_airlock"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled/dark,/area/tcomm/computer) +"aoT" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle1/start) "aoU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/tiled,/area/tcomm/computer) "aoV" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/tcomm/computer) "aoW" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/floor/tiled,/area/tcomm/computer) @@ -823,7 +823,7 @@ "apQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber) "apR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/black,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber) "apS" = (/obj/structure/cable/cyan,/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/tcomm/computer) -"apT" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/dark,/area/tcomm/computer) +"apT" = (/obj/machinery/vending/coffee{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) "apU" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled,/area/tcomm/computer) "apV" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/tcomm/computer) "apW" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/tiled,/area/tcomm/computer) @@ -1639,7 +1639,7 @@ "aFA" = (/obj/effect/floor_decal/borderfloorblack/corner{dir = 8},/obj/effect/floor_decal/industrial/danger/corner{dir = 1},/turf/simulated/floor/tiled,/area/hangar/two) "aFB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/monotile,/area/hangar/two) "aFC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/space_heater,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hangar/two) -"aFD" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod1/station) +"aFD" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod2/station) "aFE" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/airless,/area/shuttle/large_escape_pod1/station) "aFF" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod1/station) "aFG" = (/obj/structure/bed/roller,/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor/white,/area/shuttle/large_escape_pod1/station) @@ -1666,7 +1666,7 @@ "aGb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/quartermaster/mininglockerroom) "aGc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/mininglockerroom) "aGd" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/tiled/steel,/area/quartermaster/mininglockerroom) -"aGe" = (/obj/machinery/computer/security/mining,/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/brown/bordercorner,/turf/simulated/floor/tiled/steel,/area/quartermaster/mininglockerroom) +"aGe" = (/obj/machinery/computer/telecomms/server{dir = 4; network = "tcommsat"},/obj/machinery/airlock_sensor/airlock_exterior{frequency = 1381; id_tag = "server_access_ex_sensor"; master_tag = "server_access_airlock"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled/dark,/area/tcomm/computer) "aGf" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/apcenter) "aGg" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/apcenter) "aGh" = (/obj/structure/sign/deck/first{pixel_x = -32},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/green/border,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/elevator) @@ -1687,8 +1687,8 @@ "aGw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/monotile,/area/hangar/two) "aGx" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/industrial/danger{dir = 4},/turf/simulated/floor/tiled,/area/hangar/two) "aGy" = (/turf/simulated/floor/reinforced,/area/hangar/two) -"aGz" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod1/station) -"aGA" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle2/start) +"aGz" = (/obj/machinery/computer/telecomms/monitor{dir = 4; network = "tcommsat"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/dark,/area/tcomm/computer) +"aGA" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod1/station) "aGB" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/industrial/danger{dir = 8},/turf/simulated/floor/tiled,/area/hangar/two) "aGC" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/hangar/two) "aGD" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) @@ -1758,13 +1758,13 @@ "aHP" = (/turf/simulated/floor/tiled,/area/tcomm/entrance) "aHQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/shuttle/shuttle2/start) "aHR" = (/obj/machinery/teleport/station,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tcomm/entrance) -"aHS" = (/obj/machinery/computer/teleporter,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tcomm/entrance) +"aHS" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/large_escape_pod1/station) "aHT" = (/obj/machinery/teleport/hub,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tcomm/entrance) "aHU" = (/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/shuttle/shuttle2/start) "aHV" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/shuttle/plating,/area/shuttle/shuttle2/start) "aHW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/monotile,/area/hangar/two) "aHX" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/steel,/area/hangar/two) -"aHY" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle2/start) +"aHY" = (/obj/machinery/computer/security/mining{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/brown/bordercorner,/turf/simulated/floor/tiled/steel,/area/quartermaster/mininglockerroom) "aHZ" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/storage) "aIa" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) "aIb" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -1993,7 +1993,7 @@ "aMq" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aMr" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 10; icon_state = "intact"},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aMs" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) -"aMt" = (/obj/machinery/computer/security/engineering,/obj/machinery/light{dir = 1},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) +"aMt" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle2/start) "aMu" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aMv" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/atmospherics/portables_connector,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_isolation) "aMw" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) @@ -2027,7 +2027,7 @@ "aMY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/red,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aMZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aNa" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/auxiliary_engineering) -"aNb" = (/obj/machinery/computer/station_alert,/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) +"aNb" = (/turf/simulated/floor/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/shuttle2/start) "aNc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aNd" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aNe" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 10},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) @@ -2082,7 +2082,7 @@ "aOb" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aOc" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aOd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/substation/firstdeck) -"aOe" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/shutoff_monitor,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) +"aOe" = (/obj/machinery/computer/teleporter{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tcomm/entrance) "aOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) "aOg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) "aOh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) @@ -2287,7 +2287,7 @@ "aRY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aRZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aSa" = (/turf/simulated/wall,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) -"aSb" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod3/station) +"aSb" = (/obj/machinery/computer/security/engineering{dir = 8},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aSc" = (/turf/simulated/shuttle/wall,/area/shuttle/escape_pod5/station) "aSd" = (/turf/simulated/shuttle/wall/no_join{base_state = "orange"; icon = 'icons/turf/shuttle_orange.dmi'; icon_state = "orange"},/area/shuttle/escape_pod5/station) "aSe" = (/turf/simulated/floor/airless,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) @@ -2344,14 +2344,14 @@ "aTd" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/security/checkpoint3) "aTe" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/tool/crowbar,/obj/item/weapon/pen,/obj/item/device/flash,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint3) "aTf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/monotile,/area/security/checkpoint3) -"aTg" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3) +"aTg" = (/obj/machinery/computer/station_alert{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/red{icon_state = "intact"; dir = 4},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aTh" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aTi" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aTj" = (/obj/structure/sign/warning/caution,/turf/simulated/wall/r_wall,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aTk" = (/turf/space,/area/ninja_dojo/arrivals_dock) "aTl" = (/turf/simulated/shuttle/wall,/area/shuttle/escape_pod4/station) "aTm" = (/turf/simulated/shuttle/wall/no_join{base_state = "orange"; icon = 'icons/turf/shuttle_orange.dmi'; icon_state = "orange"},/area/shuttle/escape_pod4/station) -"aTn" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod5/station) +"aTn" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/shutoff_monitor{dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/auxiliary_engineering) "aTo" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/obj/machinery/hologram/holopad,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftport) "aTp" = (/obj/machinery/camera/network/first_deck{c_tag = "First Deck - Aft Port Escape Pods"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftport) "aTq" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/hallway/secondary/escape/firstdeck/ep_aftport) @@ -2363,11 +2363,11 @@ "aTw" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/glass,/obj/machinery/door/window/brigdoor/eastright{name = "Security Checkpoint"},/turf/simulated/floor/tiled,/area/security/checkpoint3) "aTx" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint3) "aTy" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/monotile,/area/security/checkpoint3) -"aTz" = (/obj/machinery/computer/card,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3) +"aTz" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod3/station) "aTA" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aTB" = (/obj/machinery/camera/network/first_deck{c_tag = "First Deck - Aft Starboard Escape Pods"; dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aTC" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/hologram/holopad,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) -"aTD" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod4/station) +"aTD" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod5/station) "aTE" = (/turf/simulated/shuttle/wall,/area/shuttle/escape_pod6/station) "aTF" = (/turf/simulated/shuttle/wall/no_join{base_state = "orange"; icon = 'icons/turf/shuttle_orange.dmi'; icon_state = "orange"},/area/shuttle/escape_pod6/station) "aTG" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/station) @@ -2385,9 +2385,9 @@ "aTS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft) "aTT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/green/bordercorner2,/obj/effect/floor_decal/corner/green/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft) "aTU" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/aft) -"aTV" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint3) +"aTV" = (/obj/machinery/computer/secure_data{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3) "aTW" = (/turf/simulated/floor/tiled/monotile,/area/security/checkpoint3) -"aTX" = (/obj/machinery/computer/security,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3) +"aTX" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod4/station) "aTY" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aTZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_6_berth"; pixel_x = 25; pixel_y = 30; tag_door = "escape_pod_6_berth_hatch"},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) "aUa" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_6_berth_hatch"; locked = 1; name = "Escape Pod 6"; req_access = list(13)},/turf/simulated/floor,/area/hallway/secondary/escape/firstdeck/ep_aftstarboard) @@ -2492,7 +2492,7 @@ "aVV" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "d1aft_port_pump"},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/auxdockaft) "aVW" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor,/area/hallway/primary/firstdeck/auxdockaft) "aVX" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "skipjack_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "skipjack_shuttle_dock_sensor"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/auxdockaft) -"aVY" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod6/station) +"aVY" = (/obj/machinery/computer/card{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3) "aVZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor,/area/hallway/primary/firstdeck/auxdockaft) "aWa" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "d1aft_starboard_airlock"; pixel_x = -26; pixel_y = 0; req_access = list(13); tag_airpump = "d1aft_starboard_pump"; tag_chamber_sensor = "d1aft_starboard_sensor"; tag_exterior_door = "d1aft_starboard_outer"; tag_interior_door = "d1aft_starboard_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "d1aft_port_pump"},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/auxdockaft) "aWb" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "d1aft_starboard_sensor"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "d1aft_port_pump"},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/auxdockaft) @@ -3011,8 +3011,8 @@ "bfU" = (/obj/machinery/disposal,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled/dark,/area/security/warden) "bfV" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/security/warden) "bfW" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled/dark,/area/security/warden) -"bfX" = (/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled/dark,/area/security/warden) -"bfY" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/modular_computer/console/preset/security,/turf/simulated/floor/tiled/dark,/area/security/warden) +"bfX" = (/turf/simulated/shuttle/wall,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape_pod6/station) +"bfY" = (/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/computer/secure_data{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/warden) "bfZ" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/warden) "bga" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "bgb" = (/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced/polarized{id = "secpro"},/turf/simulated/floor/plating,/area/security/security_processing) @@ -3020,7 +3020,7 @@ "bgd" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/security/security_processing) "bge" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/security/security_processing) "bgf" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/machinery/button/windowtint{id = "secpro"; pixel_x = -12; pixel_y = -24},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/red/bordercorner,/turf/simulated/floor/tiled,/area/security/security_processing) -"bgg" = (/obj/machinery/computer/secure_data,/obj/item/device/radio/intercom/department/security{dir = 8; icon_override = "secintercom"; pixel_x = 21},/obj/machinery/newscaster{pixel_y = -30},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/turf/simulated/floor/tiled,/area/security/security_processing) +"bgg" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/modular_computer/console/preset/security{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/warden) "bgh" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/security/main) "bgi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/main) "bgj" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/main) @@ -3231,11 +3231,11 @@ "bkg" = (/obj/structure/closet/wardrobe/detective,/obj/item/device/radio/intercom/department/security{dir = 8; icon_override = "secintercom"; pixel_x = 21},/obj/structure/noticeboard{pixel_y = 30},/turf/simulated/floor/lino,/area/security/detectives_office) "bkh" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/lobby) "bki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/security/lobby) -"bkj" = (/obj/machinery/computer/security,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/lobby) +"bkj" = (/obj/machinery/computer/secure_data{dir = 8},/obj/item/device/radio/intercom/department/security{dir = 8; icon_override = "secintercom"; pixel_x = 21},/obj/machinery/newscaster{pixel_y = -30},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/turf/simulated/floor/tiled,/area/security/security_processing) "bkk" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/security/lobby) "bkl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/security/lobby) "bkm" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/lobby) -"bkn" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled/dark,/area/security/lobby) +"bkn" = (/obj/machinery/computer/security{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/lobby) "bko" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/security/lobby) "bkp" = (/obj/item/device/radio/intercom/department/security{dir = 8; icon_override = "secintercom"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) "bkq" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/sc/hos) @@ -3476,7 +3476,7 @@ "boR" = (/obj/machinery/portable_atmospherics/canister/empty,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/simulated/floor/tiled,/area/engineering/atmos) "boS" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/atmos) "boT" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{dir = 4; initialize_directions = 11},/turf/simulated/floor/tiled,/area/engineering/atmos) -"boU" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/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/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/black/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/black/bordercorner2{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) +"boU" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/computer/secure_data{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/lobby) "boV" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 5; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "boW" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 3; tag_south = 0; tag_west = 2; use_power = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "boX" = (/obj/machinery/atmospherics/tvalve/mirrored/bypass{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -3498,8 +3498,8 @@ "bpn" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/warning,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/turf/simulated/floor/tiled/steel_grid,/area/security/lobby) "bpo" = (/obj/machinery/status_display,/turf/simulated/wall,/area/security/lobby) "bpp" = (/obj/structure/filingcabinet,/obj/item/device/radio/intercom/department/security{dir = 4; icon_override = "secintercom"; pixel_x = -21},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = -32},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) -"bpq" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) -"bpr" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/item/modular_computer/console/preset/security,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) +"bpq" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/item/modular_computer/console/preset/security{dir = 1},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) +"bpr" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/machinery/computer/secure_data{dir = 1},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) "bps" = (/obj/structure/closet/secure_closet/hos,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -30},/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) "bpt" = (/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/obj/machinery/status_display{pixel_x = 32; pixel_y = -32},/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/structure/table/reinforced,/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hos) "bpu" = (/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/storage/secure/briefcase,/obj/structure/closet,/obj/item/weapon/storage/secure/briefcase,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled/dark,/area/lawoffice) @@ -3535,7 +3535,7 @@ "bpY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/structure/plushie/beepsky,/turf/simulated/floor/plating,/area/maintenance/security_port) "bpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/security_port) "bqa" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/security_port) -"bqb" = (/obj/machinery/computer/secure_data/detective_computer,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) +"bqb" = (/obj/machinery/computer/secure_data/detective_computer{dir = 1},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) "bqc" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/spray/luminol,/obj/item/device/uv_light,/obj/item/clothing/gloves/sterile/latex,/obj/machinery/requests_console{announcementConsole = 0; department = "Security"; departmentType = 5; name = "Security RC"; pixel_y = -30},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) "bqd" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{desc = "Talk... listen through this."; dir = 2; name = "Station Intercom (Brig Radio)"; pixel_x = 0; pixel_y = -21; wires = 7},/obj/item/weapon/forensics/sample_kit,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) "bqe" = (/obj/structure/table/reinforced,/obj/item/weapon/forensics/sample_kit/powder,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) @@ -3692,7 +3692,7 @@ "bsZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "bta" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) "btb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/engineering/atmos) -"btc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) +"btc" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint3) "btd" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 1; tag_south = 2; tag_west = 7; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "bte" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos) "btf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -3760,7 +3760,7 @@ "bup" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "buq" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "bur" = (/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/engineering/atmos) -"bus" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) +"bus" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/button/windowtint{id = "holodeck_tint"; pixel_x = -11; pixel_y = -24; range = 10},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/locker) "but" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2O to Connector"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) "buu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "buv" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/monitoring) @@ -3875,7 +3875,7 @@ "bwA" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/steel_grid,/area/engineering/atmos/monitoring) "bwB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "bwC" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/cyan,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) -"bwD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Phoron Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) +"bwD" = (/obj/machinery/computer/security{dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint3) "bwE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 1; tag_south = 0; tag_west = 6; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "bwF" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/yellow/border{dir = 9},/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bwG" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -3942,7 +3942,7 @@ "bxP" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "toxins_airlock"; name = "exterior access button"; pixel_x = 28; pixel_y = -22; req_one_access = list(8,13,65)},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/airless,/area/rnd/toxins_launch) "bxQ" = (/turf/simulated/floor/airless,/area/rnd/toxins_launch) "bxR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) -"bxS" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) +"bxS" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{dir = 4; 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/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/black/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/black/bordercorner2{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) "bxT" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/orange/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/purple/bordercorner2{dir = 10},/obj/machinery/atmospherics/valve/digital{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) "bxU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "bxV" = (/obj/machinery/atmospherics/binary/pump,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -4068,7 +4068,7 @@ "bAl" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bAm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bAn" = (/obj/machinery/atmospherics/tvalve/mirrored{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos) -"bAo" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/yellow/bordercorner,/obj/machinery/computer/shutoff_monitor,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"bAo" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{dir = 4; frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "bAp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bAq" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/obj/structure/table/reinforced,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/item/clamp,/obj/item/clamp,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bAr" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -4306,11 +4306,11 @@ "bEP" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bEQ" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/techmaint,/area/engineering/hallway/atmos_hallway) "bER" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/hallway/atmos_hallway) -"bES" = (/obj/machinery/computer/power_monitor,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = 30},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bES" = (/obj/machinery/computer/power_monitor{dir = 4},/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = 30},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) "bET" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bEU" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/engineering/foyer) "bEV" = (/turf/simulated/floor/tiled,/area/engineering/foyer) -"bEW" = (/obj/machinery/computer/security/engineering,/obj/machinery/newscaster{pixel_y = 30},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bEW" = (/obj/machinery/computer/security/engineering{dir = 8},/obj/machinery/newscaster{pixel_y = 30},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "bEX" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/engineer_eva) "bEY" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/eastleft{name = "Engineering Suits"; req_access = list(11)},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/engineering/engineer_eva) "bEZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/camera/network/engineering{c_tag = "ENG - EVA"; dir = 2},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineer_eva) @@ -4347,7 +4347,7 @@ "bFE" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Research Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/research) "bFF" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "bFG" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/alarm{pixel_y = 23},/obj/structure/table/steel,/obj/machinery/cell_charger,/obj/item/stack/cable_coil,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/research) -"bFH" = (/obj/machinery/computer/aifixer,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hor) +"bFH" = (/obj/machinery/computer/aifixer{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hor) "bFI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) "bFJ" = (/obj/structure/flora/pottedplant/mysterious,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) "bFK" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) @@ -4400,11 +4400,11 @@ "bGF" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bGG" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bGH" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway) -"bGI" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/obj/item/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/engineering/foyer) +"bGI" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/obj/item/modular_computer/console/preset/engineering{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "bGJ" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bGK" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/engineering/foyer) "bGL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) -"bGM" = (/obj/machinery/computer/atmoscontrol,/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bGM" = (/obj/machinery/computer/atmoscontrol{dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "bGN" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/window/eastright{name = "Engineering Suits"; req_access = list(11)},/turf/simulated/floor/tiled/dark,/area/engineering/engineer_eva) "bGO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineer_eva) "bGP" = (/obj/machinery/suit_cycler/engineering,/turf/simulated/floor/tiled/dark,/area/engineering/engineer_eva) @@ -4432,7 +4432,7 @@ "bHl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/research) "bHm" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/research) "bHn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/research) -"bHo" = (/obj/machinery/computer/robotics,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hor) +"bHo" = (/obj/machinery/computer/robotics{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hor) "bHp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) "bHq" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) "bHr" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) @@ -4456,7 +4456,7 @@ "bHJ" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/rnd/storage) "bHK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/rnd/storage) "bHL" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/firecloset,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/rnd/storage) -"bHM" = (/obj/machinery/vending/phoronresearch,/turf/simulated/floor/tiled/white,/area/rnd/mixing) +"bHM" = (/obj/machinery/vending/phoronresearch{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bHN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bHO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bHP" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Heated to Waste"},/turf/simulated/floor/tiled/white,/area/rnd/mixing) @@ -4483,11 +4483,11 @@ "bIk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bIl" = (/obj/structure/table/reinforced,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/recharger{pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway) "bIm" = (/obj/item/device/t_scanner,/obj/structure/table/steel,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/engineering) -"bIn" = (/obj/machinery/computer/rcon,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bIn" = (/obj/machinery/computer/rcon{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) "bIo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) "bIp" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer) "bIq" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway) -"bIr" = (/obj/machinery/computer/atmos_alert,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bIr" = (/obj/machinery/computer/atmos_alert{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "bIs" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/eastleft{name = "Engineering Suits"; req_access = list(11)},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/dark,/area/engineering/engineer_eva) "bIt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineer_eva) "bIu" = (/obj/structure/table/steel_reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/simulated/floor/tiled/dark,/area/engineering/engineer_eva) @@ -4513,7 +4513,7 @@ "bIO" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plating,/area/maintenance/substation/research) "bIP" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Research Subgrid"; name_tag = "Research Subgrid"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/substation/research) "bIQ" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/substation/research) -"bIR" = (/obj/machinery/computer/mecha,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hor) +"bIR" = (/obj/machinery/computer/mecha{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/sc/hor) "bIS" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) "bIT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 8},/obj/machinery/camera/network/research{c_tag = "SCI - RD's Office"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) "bIU" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/hor) @@ -4533,7 +4533,7 @@ "bJi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) "bJj" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/storage) "bJk" = (/obj/machinery/camera/network/research{c_tag = "SCI - Toxins Gas Storage"; dir = 1},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/rnd/storage) -"bJl" = (/obj/machinery/computer/area_atmos,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/storage) +"bJl" = (/obj/machinery/computer/area_atmos{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/storage) "bJm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/rnd/storage) "bJn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/standard,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/screwdriver{pixel_y = 10},/obj/item/weapon/tool/crowbar,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bJo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/mixing) @@ -4885,7 +4885,7 @@ "bPW" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_waste) "bPX" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/machinery/door/window/northleft{name = "Engine Waste"; req_one_access = list(10,24)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_waste) "bPY" = (/obj/machinery/door/window/northright{name = "Engine Waste"; req_one_access = list(10,24)},/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 26; pixel_y = 0; req_access = null; req_one_access = list(11,24)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_waste) -"bPZ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"bPZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{dir = 4; frequency = 1441; input_tag = "tox_in"; name = "Phoron Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) "bQa" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "bQb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "bQc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) @@ -4970,7 +4970,7 @@ "bRD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research) "bRE" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) "bRF" = (/obj/structure/sign/warning/caution,/turf/simulated/wall/r_wall,/area/rnd/mixing) -"bRG" = (/obj/machinery/computer/general_air_control{frequency = 1430; name = "Mixing Chamber Monitor"; sensors = list("toxins_mixing_exterior" = "Mixing Chamber - Exterior", "toxins_mixing_interior" = "Mixing Chamber - Interior")},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/mixing) +"bRG" = (/obj/machinery/computer/general_air_control{dir = 4; frequency = 1430; name = "Mixing Chamber Monitor"; sensors = list("toxins_mixing_exterior" = "Mixing Chamber - Exterior", "toxins_mixing_interior" = "Mixing Chamber - Interior")},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bRH" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bRI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bRJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/white,/area/rnd/mixing) @@ -5059,7 +5059,7 @@ "bTo" = (/turf/simulated/floor/reinforced,/area/rnd/misc_lab) "bTp" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/dark,/area/server) "bTq" = (/obj/structure/bed/chair/office/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled/dark,/area/server) -"bTr" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/firealarm{pixel_y = 24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/dark,/area/server) +"bTr" = (/obj/machinery/computer/rdservercontrol{dir = 8},/obj/machinery/firealarm{pixel_y = 24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/dark,/area/server) "bTs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research) "bTt" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) "bTu" = (/obj/structure/dispenser,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) @@ -5075,7 +5075,7 @@ "bTE" = (/obj/structure/sign/warning/radioactive,/turf/simulated/wall/r_wall,/area/engineering/engine_room) "bTF" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/turf/simulated/floor,/area/engineering/engine_room) "bTG" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/turf/simulated/floor,/area/engineering/engine_room) -"bTH" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"bTH" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/yellow/bordercorner,/obj/machinery/computer/shutoff_monitor{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bTI" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/computer/cryopod/robot{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "bTJ" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway) "bTK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway) @@ -5160,7 +5160,7 @@ "bVl" = (/obj/machinery/portable_atmospherics/canister,/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous Test Chamber"; dir = 8; network = list("Research","Miscellaneous Reseach")},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) "bVm" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/tiled/dark,/area/server) "bVn" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/floor/tiled/dark,/area/server) -"bVo" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/tiled/dark,/area/server) +"bVo" = (/obj/machinery/computer/message_monitor{dir = 8},/turf/simulated/floor/tiled/dark,/area/server) "bVp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research) "bVq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) "bVr" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/rnd/mixing) @@ -5236,7 +5236,7 @@ "bWJ" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/research) "bWK" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/lab) "bWL" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/rnd/lab) -"bWM" = (/obj/machinery/computer/rdconsole/core,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/lab) +"bWM" = (/obj/machinery/computer/rdconsole/core{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/lab) "bWN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/lab) "bWO" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/turf/simulated/floor/tiled/steel_grid,/area/rnd/lab) "bWP" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/cable/green,/turf/simulated/floor/tiled/white,/area/assembly/robotics) @@ -5279,13 +5279,13 @@ "bXA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway) "bXB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/engineering{c_tag = "ENG - Engineering Hallway 2"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway) "bXC" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/engineering/workshop) -"bXD" = (/obj/machinery/vending/tool,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop) +"bXD" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/machinery/computer/atmoscontrol{dir = 1},/obj/machinery/button/remote/blast_door{id = "atmoslockdown"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 0; req_one_access = list(10,24)},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 34; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bXE" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop) "bXF" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar/red,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled/dark,/area/engineering/workshop) -"bXG" = (/obj/machinery/computer/station_alert/all,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) +"bXG" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/computer/security/engineering{dir = 4; name = "Drone Monitoring Cameras"; network = list("Engineering")},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "bXH" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "bXI" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) -"bXJ" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/skills,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) +"bXJ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/computer/drone_control{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "bXK" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/blue/bordercorner,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "bXL" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/wingrille_spawn/reinforced/polarized{id = "ceoffice"},/turf/simulated/floor,/area/crew_quarters/heads/sc/chief) "bXM" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) @@ -5362,10 +5362,10 @@ "bZf" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled/dark,/area/engineering/workshop) "bZg" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/turf/simulated/floor/tiled,/area/engineering/workshop) "bZh" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/engineering/workshop) -"bZi" = (/obj/machinery/vending/engivend,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop) +"bZi" = (/obj/machinery/vending/tool{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop) "bZj" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/turf/simulated/floor/tiled,/area/engineering/workshop) "bZk" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/tool/wrench,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/engineering/workshop) -"bZl" = (/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Engine"); pixel_x = 0; pixel_y = -34},/obj/machinery/computer/atmos_alert,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) +"bZl" = (/obj/machinery/computer/station_alert/all{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "bZm" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "bZn" = (/obj/machinery/camera/network/engineering{c_tag = "ENG - Chief Engineer's Office"; dir = 1},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; pixel_x = -6; pixel_y = -44; specialfunctions = 4},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = 6; pixel_y = -44},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/button/remote/blast_door{id = "englockdown"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -34; req_access = list(10)},/obj/machinery/button/remote/blast_door{id = "atmoslockdown"; name = "Atmospherics Lockdown"; pixel_x = 6; pixel_y = -34; req_access = list(10)},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "bZo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) @@ -5431,7 +5431,7 @@ "caw" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "cax" = (/turf/simulated/wall/r_wall,/area/rnd/workshop) "cay" = (/obj/machinery/computer/rdconsole/core,/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/green/border{dir = 9},/turf/simulated/floor/tiled/dark,/area/rnd/workshop) -"caz" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/brown/bordercorner,/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/tiled,/area/quartermaster/foyer) +"caz" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/item/modular_computer/console/preset/engineering{dir = 1},/turf/simulated/floor/tiled,/area/engineering/break_room) "caA" = (/obj/structure/table/steel,/obj/item/weapon/storage/bag/circuits/basic,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/green/border{dir = 5},/turf/simulated/floor/tiled/dark,/area/rnd/workshop) "caB" = (/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/wall,/area/rnd/workshop) "caC" = (/turf/simulated/floor/tiled/white,/area/hallway/secondary/seconddeck/research_medical) @@ -5463,7 +5463,7 @@ "cbc" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) "cbd" = (/obj/machinery/computer/guestpass{pixel_x = 30; pixel_y = 0},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "cbe" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/structure/table/standard,/obj/item/device/radio/beacon,/obj/item/device/radio/beacon,/obj/random_multi/single_item/hand_tele,/turf/simulated/floor/tiled,/area/teleporter) -"cbf" = (/obj/machinery/computer/security/engineering,/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/break_room) +"cbf" = (/obj/machinery/computer/security/engineering{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/break_room) "cbg" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/tiled,/area/engineering/break_room) "cbh" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/woodentable,/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/atmospipes,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 2},/obj/item/weapon/book/manual/evaguide{pixel_x = -2; pixel_y = 7},/turf/simulated/floor/tiled,/area/engineering/break_room) "cbi" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/woodentable,/obj/item/weapon/dice,/obj/item/weapon/deck/cards,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/break_room) @@ -5559,7 +5559,7 @@ "ccU" = (/obj/structure/disposalpipe/broken{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) "ccV" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research) "ccW" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/engineering) -"ccX" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) +"ccX" = (/obj/machinery/vending/snack{dir = 4},/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) "ccY" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) "ccZ" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter) "cda" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/fpcenter) @@ -5637,7 +5637,7 @@ "ceu" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/double,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/maintenance/engineering) "cev" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/engineering{name = "Utility Down"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/engineering) "cew" = (/obj/structure/disposalpipe/broken{dir = 1},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/engineering) -"cex" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) +"cex" = (/obj/machinery/vending/coffee{dir = 4},/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) "cey" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/fpcenter) "cez" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter) "ceA" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Emergency Storage"},/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/central_emergency) @@ -5724,7 +5724,7 @@ "cgd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) "cge" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) "cgf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/engineering) -"cgg" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) +"cgg" = (/obj/machinery/vending/cola{dir = 4},/turf/simulated/floor/tiled/hydro,/area/hallway/primary/seconddeck/fpcenter) "cgh" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter) "cgi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/green/bordercorner2,/obj/effect/floor_decal/corner/green/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter) "cgj" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fpcenter) @@ -5778,7 +5778,7 @@ "chf" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_room) "chg" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room) "chh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring) -"chi" = (/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"chi" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/skills{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "chj" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/supermatter_engine,/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "chk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/light{dir = 1},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "chl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -5857,7 +5857,7 @@ "ciG" = (/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/engine_room) "ciH" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/turf/simulated/floor,/area/engineering/engine_room) "ciI" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring) -"ciJ" = (/obj/machinery/computer/rcon,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"ciJ" = (/obj/machinery/vending/engivend{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/workshop) "ciK" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "ciL" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "ciM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -5960,7 +5960,7 @@ "ckF" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/engine_room) "ckG" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engineering/engine_room) "ckH" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring) -"ckI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/power_monitor,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"ckI" = (/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Engine"); pixel_x = 0; pixel_y = -34},/obj/machinery/computer/atmos_alert{dir = 4},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/chief) "ckJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -6; pixel_y = -3; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/emitter{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; pixel_y = 2; req_access = list(10)},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/engine_setup/shutters,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "ckK" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "ckL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -6061,7 +6061,7 @@ "cmC" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{icon_state = "map"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room) "cmD" = (/turf/simulated/floor,/area/engineering/engine_room) "cmE" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/wingrille_spawn/reinforced_phoron,/turf/simulated/floor,/area/engineering/engine_monitoring) -"cmF" = (/obj/machinery/computer/security/engineering,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cmF" = (/obj/machinery/computer/general_air_control/supermatter_core{dir = 4; frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cmG" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cmH" = (/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cmI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -6158,7 +6158,7 @@ "cov" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room) "cow" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/engine_room) "cox" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room) -"coy" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"coy" = (/obj/machinery/computer/rcon{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "coz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/engineering) "coA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -30},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "coB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -6456,7 +6456,7 @@ "cuh" = (/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/apcenter) "cui" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/camera/network/second_deck{c_tag = "Second Deck - Center Elevator Access"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/apcenter) "cuj" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/wingrille_spawn/reinforced/polarized{id = "hop_office"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/heads/sc/hop) -"cuk" = (/obj/machinery/computer/card,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/hop) +"cuk" = (/obj/machinery/computer/card{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/hop) "cul" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/hop) "cum" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/sc/hop) "cun" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/hop,/turf/simulated/floor/carpet,/area/crew_quarters/heads/sc/hop) @@ -6486,7 +6486,7 @@ "cuL" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/genetics) "cuM" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/medical/genetics) "cuN" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology) -"cuO" = (/obj/machinery/computer/diseasesplicer,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) +"cuO" = (/obj/machinery/computer/diseasesplicer{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) "cuP" = (/obj/machinery/power/generator{anchored = 1; dir = 2},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_room) "cuQ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_room) "cuR" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_room) @@ -6554,7 +6554,7 @@ "cwb" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/pink/border{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "cwc" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/alarm{pixel_y = 23},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/pink/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "cwd" = (/obj/structure/table/glass,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/box/rxglasses,/obj/random/medical,/obj/random/firstaid,/obj/item/device/radio/intercom/department/medbay{dir = 8; pixel_x = 21},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/pink/border{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/exam_room) -"cwe" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) +"cwe" = (/obj/machinery/vending/snack{dir = 4},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) "cwf" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/reception) "cwg" = (/obj/structure/bed/chair,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/item/device/radio/intercom/department/medbay{dir = 2; pixel_x = 0; pixel_y = 21},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "cwh" = (/obj/structure/bed/chair,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/reception) @@ -6657,7 +6657,7 @@ "cya" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/pink/border{dir = 8},/obj/structure/closet/secure_closet/medical_wall/pills{pixel_x = -32},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "cyb" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "cyc" = (/obj/structure/bed/padded,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/camera/network/medbay{c_tag = "MED - Examination Room"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/pink/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/exam_room) -"cyd" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/white,/area/medical/reception) +"cyd" = (/obj/machinery/vending/cola{dir = 4},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/white,/area/medical/reception) "cye" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "cyf" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/storage/box/glasses/square,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "cyg" = (/obj/structure/table/glass,/obj/item/weapon/deck/cards,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/reception) @@ -6742,11 +6742,11 @@ "czH" = (/obj/structure/bed/chair/wheelchair,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/pink/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "czI" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/white,/area/medical/exam_room) "czJ" = (/obj/machinery/vending/wallmed1{pixel_x = 25},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/pink/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/exam_room) -"czK" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) +"czK" = (/obj/machinery/vending/coffee{dir = 4},/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) "czL" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/random/medical,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "czM" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "czN" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/reception) -"czO" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/item/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/engineering/break_room) +"czO" = (/obj/item/modular_computer/console/preset/medical{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/reception) "czP" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/table/reinforced,/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; pixel_x = -4; pixel_y = 6},/obj/machinery/button/remote/blast_door{id = "medbayrecquar"; name = "Medbay Entrance Quarantine Shutters Control"; pixel_x = -4; pixel_y = -4; req_access = list(5)},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "czQ" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/foyer) "czR" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/foyer) @@ -6879,7 +6879,7 @@ "cCo" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "cCp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "cCq" = (/obj/structure/table/steel,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 36; pixel_y = 0},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/brown/bordercorner,/turf/simulated/floor/tiled,/area/quartermaster/delivery) -"cCr" = (/obj/machinery/computer/supplycomp,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/foyer) +"cCr" = (/obj/machinery/computer/supplycomp{dir = 4},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/foyer) "cCs" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/quartermaster/foyer) "cCt" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/foyer) "cCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/foyer) @@ -7518,7 +7518,7 @@ "cOD" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Firefighting Equipment"; req_access = newlist(); req_one_access = list(12,25,27,28,35)},/turf/simulated/floor/plating,/area/maintenance/bar) "cOE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/engineering) "cOF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cOG" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/machinery/computer/atmoscontrol,/obj/machinery/button/remote/blast_door{id = "atmoslockdown"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 0; req_one_access = list(10,24)},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 34; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"cOG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/power_monitor{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cOH" = (/obj/machinery/floodlight,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/ap_emergency) "cOI" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/ap_emergency) "cOJ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/ap_emergency) @@ -7662,7 +7662,7 @@ "cRr" = (/obj/structure/sign/warning/high_voltage{pixel_y = 32},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/medbay) "cRs" = (/obj/structure/closet/secure_closet/CMO,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/cmo) "cRt" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 0; pixel_y = -30},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/cmo) -"cRu" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/blue/border,/obj/item/modular_computer/console/preset/medical,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/cmo) +"cRu" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/brown/bordercorner,/obj/machinery/mineral/equipment_vendor{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/foyer) "cRv" = (/obj/structure/filingcabinet/chestdrawer{dir = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/cmo) "cRw" = (/obj/machinery/photocopier,/obj/item/device/radio/intercom/department/medbay{dir = 1; pixel_x = 0; pixel_y = -21},/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/cmo) "cRx" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/medical/sleeper) @@ -7804,7 +7804,7 @@ "cUd" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/ward) "cUe" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/ward) "cUf" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/purple/border{dir = 10},/obj/machinery/clonepod/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"cUg" = (/obj/machinery/computer/cloning,/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) +"cUg" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/blue/border,/obj/item/modular_computer/console/preset/medical{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/sc/cmo{dir = 1}) "cUh" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/purple/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "cUi" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "cUj" = (/obj/structure/closet/wardrobe/medic_white,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite/corner,/obj/effect/floor_decal/corner/purple/bordercorner,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) @@ -7982,7 +7982,7 @@ "cXz" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "aft_starboard_pump"},/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/medbay) "cXA" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "aft_starboard_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/medbay) "cXB" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"},/turf/simulated/wall/r_wall,/area/maintenance/medbay) -"cXC" = (/obj/item/modular_computer/console/preset/medical,/turf/simulated/floor/tiled/white,/area/medical/reception) +"cXC" = (/obj/machinery/computer/cloning{dir = 1},/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "cXD" = (/obj/structure/closet/emcloset/legacy,/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "cXE" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/structure/extinguisher_cabinet{pixel_x = -28; pixel_y = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/medical/ward) "cXF" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = 0; pixel_y = -32},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/medical/ward) @@ -8040,7 +8040,7 @@ "cYF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "cYG" = (/turf/simulated/floor/tiled,/area/crew_quarters/locker) "cYH" = (/turf/simulated/wall,/area/crew_quarters/locker) -"cYI" = (/obj/machinery/vending/dinnerware,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"cYI" = (/obj/machinery/vending/dinnerware{dir = 4},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "cYJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "cYK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = list(5,12,25,27,28,35)},/turf/simulated/floor/plating,/area/maintenance/medbay) "cYL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/wall/r_wall,/area/maintenance/medbay) @@ -8441,7 +8441,7 @@ "dgq" = (/obj/machinery/seed_extractor,/turf/simulated/floor/tiled/hydro,/area/hydroponics) "dgr" = (/obj/structure/table/glass,/obj/item/weapon/storage/laundry_basket,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "dgs" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) -"dgt" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"dgt" = (/obj/machinery/computer/HolodeckControl{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "dgu" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced/polarized{id = "holodeck_tint"},/obj/machinery/camera/network/civilian{c_tag = "CIV - Holodeck Starboard"; dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/locker) "dgv" = (/obj/structure/closet/emcloset,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/hallway/primary/seconddeck/aft) "dgw" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) @@ -8469,7 +8469,7 @@ "dgS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) "dgT" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) "dgU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) -"dgV" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) +"dgV" = (/obj/machinery/vending/snack{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) "dgW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall,/area/maintenance/substation/civilian) "dgX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/maintenance/substation/civilian) "dgY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/substation/civilian) @@ -8486,7 +8486,7 @@ "dhj" = (/turf/space,/area/shuttle/response_ship/seconddeck) "dhk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar) "dhl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/locker) -"dhm" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) +"dhm" = (/obj/machinery/vending/cola{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) "dhn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/port) "dho" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Cafeteria"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/cafeteria) "dhp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/port) @@ -8544,7 +8544,7 @@ "dip" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) "diq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/port) "dir" = (/obj/structure/sign/greencross{desc = "White cross in a green field, you can get medical aid here."; name = "First-Aid"},/turf/simulated/wall,/area/ai_monitored/storage/emergency/eva) -"dis" = (/obj/machinery/vending/fitness,/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) +"dis" = (/obj/machinery/vending/cigarette{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) "dit" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/port) "diu" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/green/border{dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "div" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft) @@ -8568,7 +8568,7 @@ "diN" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/green/border{dir = 6},/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; name = "Locker Room"; sortType = "Locker Room"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "diO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar) "diP" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/hydroponics) -"diQ" = (/obj/machinery/vending/snack,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) +"diQ" = (/obj/machinery/vending/fitness{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) "diR" = (/obj/structure/bookcase{name = "bookcase (Fiction)"},/turf/simulated/floor/wood,/area/library) "diS" = (/obj/machinery/door/airlock/glass{name = "Library"},/turf/simulated/floor/tiled/steel_grid,/area/library) "diT" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/library) @@ -8584,7 +8584,7 @@ "djd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main) "dje" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) "djf" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/locker) -"djg" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/button/windowtint{id = "holodeck_tint"; pixel_x = -11; pixel_y = -24},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/locker) +"djg" = (/obj/machinery/computer/security/engineering{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "djh" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/locker) "dji" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/locker) "djj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar) @@ -8955,7 +8955,7 @@ "dqk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/construction/seconddeck/construction2) "dql" = (/obj/structure/table/standard,/obj/item/weapon/towel,/obj/item/weapon/towel,/turf/simulated/floor/tiled/freezer,/area/construction/seconddeck/construction2) "dqm" = (/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/construction/seconddeck/construction2) -"dqn" = (/obj/machinery/vending/fitness,/turf/simulated/floor/tiled/dark,/area/construction/seconddeck/construction2) +"dqn" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) "dqo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/aft) "dqp" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/plating,/area/construction/seconddeck/construction2) "dqq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/construction/seconddeck/construction2) @@ -8982,8 +8982,8 @@ "dqL" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/storage/primary) "dqM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/storage/primary) "dqN" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/storage/primary) -"dqO" = (/obj/machinery/vending/tool,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) -"dqP" = (/obj/machinery/computer/secure_data,/obj/item/device/radio/intercom/department/security{dir = 4; icon_override = "secintercom"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2) +"dqO" = (/obj/machinery/vending/fitness{dir = 4},/turf/simulated/floor/tiled/dark,/area/construction/seconddeck/construction2) +"dqP" = (/obj/machinery/vending/tool{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) "dqQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/checkpoint2) "dqR" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2) "dqS" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/obj/structure/barricade,/turf/simulated/floor/plating,/area/construction/seconddeck/construction2) @@ -9012,8 +9012,8 @@ "drp" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/storage/primary) "drq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) "drr" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/storage/primary) -"drs" = (/obj/machinery/vending/assist,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) -"drt" = (/obj/machinery/computer/card,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2) +"drs" = (/obj/machinery/computer/secure_data{dir = 4},/obj/item/device/radio/intercom/department/security{dir = 4; icon_override = "secintercom"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2) +"drt" = (/turf/simulated/floor/airless,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) "dru" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/security/checkpoint2) "drv" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2) "drw" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor/westleft{name = "Security Checkpoint"; req_access = list(1)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/security/checkpoint2) @@ -9043,8 +9043,8 @@ "drU" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/storage/primary) "drV" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/storage/primary) "drW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/storage/primary) -"drX" = (/obj/machinery/lapvend,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) -"drY" = (/obj/machinery/computer/security,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2) +"drX" = (/obj/machinery/vending/assist{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) +"drY" = (/obj/machinery/computer/card{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2) "drZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/checkpoint2) "dsa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/tool/crowbar,/obj/item/weapon/pen,/obj/item/device/flash,/obj/machinery/camera/network/security{c_tag = "SEC - Arrival Checkpoint"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2) "dsb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/gamblingtable,/obj/item/weapon/deck/cards,/turf/simulated/floor/plating,/area/construction/seconddeck/construction2) @@ -9597,7 +9597,7 @@ "dCC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/foreportsolar) "dCD" = (/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/reinforced/airless,/area/thirddeck/roof) "dCE" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/solars/foreportsolar) -"dCF" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/solar_control{auto_start = 2; id = "foreportsolar"; name = "Fore Port Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/foreportsolar) +"dCF" = (/obj/machinery/lapvend{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) "dCG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Solar Fore Port"; dir = 2},/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/plating,/area/maintenance/solars/foreportsolar) "dCH" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/plating,/area/maintenance/solars/foreportsolar) "dCI" = (/turf/simulated/wall,/area/maintenance/solars/foreportsolar) @@ -9617,7 +9617,7 @@ "dCW" = (/turf/simulated/wall,/area/maintenance/solars/forestarboardsolar) "dCX" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/plating,/area/maintenance/solars/forestarboardsolar) "dCY" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Solar Fore Starboard"; dir = 2},/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/solars/forestarboardsolar) -"dCZ" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/solar_control{id = "forestarboardsolar"; name = "Fore Starboard Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/forestarboardsolar) +"dCZ" = (/obj/machinery/computer/security{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/checkpoint2) "dDa" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/solars/forestarboardsolar) "dDb" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/forestarboardsolar) "dDc" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/foreportsolar) @@ -9760,7 +9760,7 @@ "dFJ" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard) "dFK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport) "dFL" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/flora/pottedplant/dead,/turf/simulated/floor/plating,/area/maintenance/chapel) -"dFM" = (/obj/machinery/computer/message_monitor,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/ai/ai_server_room) +"dFM" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/solar_control{auto_start = 2; dir = 4; id = "foreportsolar"; name = "Fore Port Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/foreportsolar) "dFN" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_server_room) "dFO" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_server_room) "dFP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_server_room) @@ -9772,7 +9772,7 @@ "dFV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_cyborg_station) "dFW" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_cyborg_station) "dFX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/bed/chair/office/light{dir = 4},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_cyborg_station) -"dFY" = (/obj/machinery/computer/aifixer,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/bluegrid,/area/ai/ai_cyborg_station) +"dFY" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/solar_control{dir = 8; id = "forestarboardsolar"; name = "Fore Starboard Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/forestarboardsolar) "dFZ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/largecrate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard) "dGa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard) "dGb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport) @@ -10196,7 +10196,7 @@ "dOd" = (/obj/structure/railing{dir = 4},/turf/simulated/open,/area/hallway/primary/thirddeck/central) "dOe" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dOf" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) -"dOg" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) +"dOg" = (/obj/machinery/computer/message_monitor{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/ai/ai_server_room) "dOh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{id_tag = "sbridgedoor"; name = "Bridge"; req_access = list(19)},/turf/simulated/floor/tiled/steel_grid,/area/bridge) "dOi" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_command{id_tag = "sbridgedoor"; name = "Bridge"; req_access = list(19)},/turf/simulated/floor/tiled/steel_grid,/area/bridge) "dOj" = (/obj/structure/table/wooden_reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/matches,/obj/item/clothing/mask/smokable/cigarette/cigar,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/random_multi/single_item/captains_spare_id,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/carpet,/area/crew_quarters/heads/sc/sd) @@ -10225,7 +10225,7 @@ "dOG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dOH" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/thirddeck/central) "dOI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) -"dOJ" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) +"dOJ" = (/obj/machinery/computer/aifixer{dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/bluegrid,/area/ai/ai_cyborg_station) "dOK" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/hallway/primary/thirddeck/central) "dOL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/bridge) "dOM" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/bridge) @@ -10351,11 +10351,11 @@ "dRc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/bridge) "dRd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/bridge) "dRe" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/device/flashlight,/obj/item/device/flashlight{pixel_x = 2; pixel_y = 2},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 8},/turf/simulated/floor/tiled/dark,/area/bridge) -"dRf" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/obj/machinery/computer/atmos_alert,/turf/simulated/floor/tiled/dark,/area/bridge) -"dRg" = (/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/item/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled/dark,/area/bridge) +"dRf" = (/obj/machinery/vending/snack{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) +"dRg" = (/obj/machinery/vending/cola{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/central) "dRh" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/tiled/dark,/area/bridge) -"dRi" = (/obj/machinery/computer/rcon,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 8},/turf/simulated/floor/tiled/dark,/area/bridge) -"dRj" = (/obj/machinery/computer/power_monitor,/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled/dark,/area/bridge) +"dRi" = (/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/item/modular_computer/console/preset/engineering{dir = 1},/turf/simulated/floor/tiled/dark,/area/bridge) +"dRj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/obj/machinery/computer/atmos_alert{dir = 1},/turf/simulated/floor/tiled/dark,/area/bridge) "dRk" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/multitool,/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/turf/simulated/floor/tiled/dark,/area/bridge) "dRl" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/bridge) "dRm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/bridge) @@ -10398,17 +10398,17 @@ "dRX" = (/obj/structure/bed/chair/office/dark,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Command Secretary"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "dRY" = (/obj/structure/filingcabinet,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "dRZ" = (/obj/machinery/ai_status_display,/turf/simulated/wall/r_wall,/area/bridge/meeting_room) -"dSa" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 6},/obj/item/modular_computer/console/preset/security,/turf/simulated/floor/tiled,/area/bridge) +"dSa" = (/obj/machinery/computer/rcon{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 8},/turf/simulated/floor/tiled/dark,/area/bridge) "dSb" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/folder/red,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/bridge) -"dSc" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled,/area/bridge) +"dSc" = (/obj/machinery/computer/power_monitor{dir = 1},/obj/structure/window/reinforced,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled/dark,/area/bridge) "dSd" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = -24},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/bridge) "dSe" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/bridge) "dSf" = (/obj/structure/bed/chair,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/bridge) "dSg" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/blue/bordercorner,/turf/simulated/floor/tiled,/area/bridge) "dSh" = (/obj/machinery/button/remote/blast_door{id = "bridge blast"; name = "Bridge Blastdoors"; pixel_x = 0; pixel_y = -36},/obj/machinery/button/windowtint{id = "bridge_center"; pixel_x = -11; pixel_y = -24},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/bridge) -"dSi" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/white/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 6},/obj/machinery/computer/med_data,/turf/simulated/floor/tiled,/area/bridge) +"dSi" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/obj/machinery/computer/secure_data{dir = 1},/turf/simulated/floor/tiled,/area/bridge) "dSj" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/folder/white,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/white/border,/turf/simulated/floor/tiled,/area/bridge) -"dSk" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/white/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/obj/item/modular_computer/console/preset/medical,/turf/simulated/floor/tiled,/area/bridge) +"dSk" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 6},/obj/item/modular_computer/console/preset/security{dir = 1},/turf/simulated/floor/tiled,/area/bridge) "dSl" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/crew_quarters/heads/sc/sd) "dSm" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) "dSn" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/sc/sd) @@ -10439,9 +10439,9 @@ "dSM" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/bridge) "dSN" = (/obj/structure/table/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/newscaster{pixel_y = -30},/obj/item/weapon/storage/secure/briefcase,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/simulated/floor/tiled,/area/bridge) "dSO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/bridge) -"dSP" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/obj/item/modular_computer/console/preset/command,/turf/simulated/floor/tiled,/area/bridge) +"dSP" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/white/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/obj/item/modular_computer/console/preset/medical{dir = 1},/turf/simulated/floor/tiled,/area/bridge) "dSQ" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/paper_bin,/obj/item/weapon/folder/red,/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/machinery/light,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/bridge) -"dSR" = (/obj/machinery/computer/communications,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/bridge) +"dSR" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/white/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 6},/obj/machinery/computer/med_data{dir = 1},/turf/simulated/floor/tiled,/area/bridge) "dSS" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/aicard,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/bridge) "dST" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/machinery/recharger{pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/obj/item/weapon/storage/box/donut,/turf/simulated/floor/tiled,/area/bridge) "dSU" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 8; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) @@ -10512,7 +10512,7 @@ "dUh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/aftstarboardsolar) "dUi" = (/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/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/airless,/area/solar/aftstarboardsolar) "dUj" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/aftstarboardsolar) -"dUk" = (/obj/structure/cable/yellow,/obj/machinery/power/solar_control{auto_start = 2; id = "aftportsolar"; name = "Aft Port Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/aftportsolar) +"dUk" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/obj/item/modular_computer/console/preset/command{dir = 1},/turf/simulated/floor/tiled,/area/bridge) "dUl" = (/obj/machinery/camera/network/engineering{c_tag = "ENG - Solar Aft Port"; dir = 1},/obj/machinery/light/small,/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/solars/aftportsolar) "dUm" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/plating,/area/maintenance/solars/aftportsolar) "dUn" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftport) @@ -10527,7 +10527,7 @@ "dUw" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard) "dUx" = (/obj/structure/cable,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/steel,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/plating,/area/maintenance/solars/aftstarboardsolar) "dUy" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "ENG - Solar Aft Starboard"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/solars/aftstarboardsolar) -"dUz" = (/obj/structure/cable/yellow,/obj/machinery/power/solar_control{auto_start = 2; id = "aftstarboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/aftstarboardsolar) +"dUz" = (/obj/machinery/computer/communications{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/simulated/floor/tiled,/area/bridge) "dUA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/catwalk,/turf/simulated/floor/airless,/area/solar/aftportsolar) "dUB" = (/obj/structure/table/steel,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftport) "dUC" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/table/steel,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftport) @@ -10613,7 +10613,7 @@ "dWe" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Isolation to Waste"},/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_isolation) "dWf" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_isolation) "dWg" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_isolation) -"dWh" = (/obj/machinery/vending/fitness,/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) +"dWh" = (/obj/machinery/computer/station_alert{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "dWi" = (/obj/structure/closet/firecloset,/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) "dWj" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "dWk" = (/obj/structure/table/glass,/obj/machinery/reagentgrinder,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) @@ -10636,7 +10636,7 @@ "dWB" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_isolation) "dWC" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_isolation) "dWD" = (/obj/machinery/atmospherics/unary/heater{dir = 8; icon_state = "heater"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_isolation) -"dWE" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) +"dWE" = (/obj/structure/cable/yellow,/obj/machinery/power/solar_control{auto_start = 2; dir = 4; id = "aftportsolar"; name = "Aft Port Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/aftportsolar) "dWF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloorwhite/corner,/obj/effect/floor_decal/corner/purple/bordercorner,/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "dWG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/purple/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "dWH" = (/obj/structure/closet/emcloset/legacy,/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) @@ -10655,7 +10655,7 @@ "dWU" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/camera/network/research{c_tag = "SCI - Xenoflora Isolation Aft"; dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_isolation) "dWV" = (/obj/machinery/atmospherics/unary/freezer{dir = 8; icon_state = "freezer"},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_isolation) "dWW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/random/mob/mouse,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport) -"dWX" = (/obj/machinery/vending/coffee,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/rnd/research/firstdeck/hallway) +"dWX" = (/obj/structure/cable/yellow,/obj/machinery/power/solar_control{auto_start = 2; dir = 8; id = "aftstarboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/turf/simulated/floor/plating,/area/maintenance/solars/aftstarboardsolar) "dWY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/borderfloorwhite/corner{dir = 4},/obj/effect/floor_decal/corner/purple/bordercorner{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "dWZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "dXa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) @@ -11138,13 +11138,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaeFafCajEafEafFajFajGajHajIagZagWajJajKafGafFafKajEaiGaeFajLaioajMadlaaaaaaaaaaabaaaaaaajpajpajoajNajOajPajQajRajSajTajUahUajVajWajXajYajZakaakbakcajwajxajxaaaaaaaabaaaaaaaaaadFakdajyakeaeZaiSakfaiAagmagmagmagmagmagmagmagmagmagmagmagVakfagpaeZcdzcdCcdBcfocfncfpcfpckbcjEclTclTcpDcnNcpFcpEcpHcpGcvHcpHcItcCgcLTcJxcOQcLUcSccPZcTFaowaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaeFafCajEakgafFakhagZagZagZagZakiakjaJtaklafFafKajEaiGaeFahcakmaknadlaaaaaaaaaaaaaaaajpajpakoakpakqakraksaktakuakvakwakxakyakzakAakBakCakDakEakFakGakHakIajxajxaaaaaaaaaaaaaaaadFakJakKaikaeZaiSakfaiAagmagmagmagmagmagmagmagmagmagmagmagVakfagpaeZcXDdfZcYadjyarMcfpcfpdGcdkodGydGydVCdOZdVEdVDdGydVFdVGdGydVIdVHdVKdVJdVMdVLdVOdVNdVPaowaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLakLakLakLakLakLakLakLakLakLakLakLakLaeFaeFakMakgafFafGalzakOakNakNakPakQakRakSafFafKakTaeFaeFaeFaioakUadlaaaaaaaaaaaaajpajpakoakVakWakWakXakYakZalaalbalcaldalealfalgalhalialjalkallalmalmalnakIajxajxaaaaaaaaaaaaadFaloaiyaeZaeZaeZalpaiAagmagmagmagmagmagmagmagmagmagmagmagValqaeZaeZdVQdVSdVRapiaqzdVUdVTdVVdVTdVVdVWdVYdVXdWadVZdVVdVVdVVdVVdWbbmqdWddWcdWedWcdWcdWfdWgaowaafaafaafaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsalsaltaltaltalualtaltalualtaltaltalvaeFalwalxakgafFafGalAalBaAxalCaAyalBaDdafGafFafKalDalEaeFahcaioadladlaaaaaaaaaajpajpakoakoalFakoalGalHalHalHalHalHalHalHalHalHalHalHalHalIalIalIalJakIalKakIakIajxajxaaaaaaaaaadFadFaiyaikaeZalLalMaiAagmagmagmagmagmagmagmagmagmagmagmagValNaijaeZdWhdfZcYadWibmqdWkdWjdWmdWldWodWndWqdWpdWsdWrdWudWtdWwdWvdWxbmqdWzdWydWBdWAbHAdWCdWDaowaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsaltalRalSalTalUalValWalXalYalZamaambaeFamcajEafEafFaiDaiDahBafFafFafFahBaiDaiDafFafKajEamdaeFameaioadLaaaaaaaaaaaaajpakoakVakWamfamgalHalHalHalHalHalHalHalHalHalHalHalHalHalIalIalIalIamhamialmalnakIajxaaaaaaaaaaaaaejaiyamjaeZaiSamkaiAagmagmagmagmagmagmagmagmagmagmagmagVakfagpaeZdWEdWGdWFdWHbmqdWIarMdWJarMbmqbmqdWLdWKdWNdWMbmqarMdWJarMdWObmqdWQdWPdWSdWRdWUdWTdWVaowaaaaaaaaaaaaaafaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsammamnamoamoamoamoamoamoamoampamaambaeFamqajEafEafFamramsafFafFafFafFafFamramsafFafKajEamtaeFamudWWadLaaaaaaaaaajoajoamvalFakoamwamxalHalHalHamyamzamAamBamCamDamEamBamFamGamHamIamJalIamKamLakIalKamMajwajwaaaaaaaaaaejaiyamNaeZamOamkaiAagmagmagmagmagmagmagmagmagmagmagmagVakfamPaeZdWXdWZdWYdXbdXadXddXcdXbdXbdXfdXedXhdXgdXjdXidXkdXbdXmdXldXnaSNdXodXodXodXodXodXodXodXodXoaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsaltalRamRamSamTaSjamUamVamWamXamaambaeFamYamZanaanbanbanbanbanbanbanbanbanbanbanbancandaneaeFanfaioadLaaaaaaaaaajoanganhalFalGanianianialHalHanjanjanjanjanjankanlanmanmannanoanpanqalIalIalIalJalKanransajwaaaaaaaaaaejaiyantaeZanuanvanwanxanxanxanxanxanxanxanxanxanxanxanyanzanAaeZdXpdXrdXqdXqdXsdXudXtdXwdXvdXxdXvdXzdXydXBdXAdXDdXCdXFdXEdXHdXGdXodXIdXKdXJdXMdXLdXKdXNdXobhgbhgaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsalsaltaltaltaluanDanDalualtaltaltanEaeFanFanGanHanHanIanHanHanJanKanLanManNanNanNanNanOamtaeFanPaioadladlaaaaaaajpanQanRanSanianiaoJaoKanialHanVanWanXanYanZanZaoaaobaocaodaoealIaofalIaogalIalIaohaoiaojajxaaaaaaadFadFaiyaokaeZaolaomaonaonaonaonaooaopaoqaoraosaosaotaosaosaouaovaeZdXOdXQdXPdXRapiatLdXSapidXUdXWdXVdXXaSNaSNdXYaSNaZYdXZcfodXHdYadXodYbdYcdXJdXMdXLdXKdYddXodXodYfdYedXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaakLatTatTakLakLakLakLaoxaoxaoyaoyaoyaoyaoyaeFaeFaeFaeFaeFaeFaeFaeFaozahcaoAaeFaoBaoBaoBaeFaeFaeFaeFafMaoCaoDadlaaaaaaajpaoEaoFaoGaoHaoIapOarganialHanjaoLaoMaoNaEyanZaoOaoPaoQaoRaoSaoTaoUaoVaoWaoXalIaoYaoZapaajxaaaaaaadFapbapcapdaeZaeZaeZaikapeapeapeaikapfaikapgaikaeZaeZaeZaeZaeZaeZaeZaphaphaphaphaphdYgdYgalralralralralralrdYidYhalralrdXZdYjdYkdWHdXodYldXKdXJdXMdXLdXKdYldXodYmdYodYndXodXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafakLakLapjapkaplapmapnakLapoapoappapqaprapsaptapuapvapwapxapyapyapzapuapAapAapBapCapDapEapFapCapGafMadlapHapIapJadlaaaaaaajpapKapLapManiapNaNGaNHanialHanjanjanjanjanjapPapQapQapQapRapSapTapUapVapWapXalIapYapZaqaajxaaaaaaadFaqbaghaqcaqdaqeaqfaqgaqhaqiaqjaqgaqkaqlaqlaqmaqnaqoaqoaqpaqqaqraqmaqsaqtaquaqvaqwaqxaqxalraqydYpaqAaqBaqCalOdYqatMalrdYtdYsdXodXodXodYudYwdYvdYydYxdYAdYzdXodYBdYDdYCdYFdYEdYGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsalsaltaltaltalualtaltalualtaltaltalvaeFalwalxakgafFafGalAalBaAxalCaAyalBaDdafGafFafKalDalEaeFahcaioadladlaaaaaaaaaajpajpakoakoalFakoalGalHalHalHalHalHalHalHalHalHalHalHalHalIalIalIalJakIalKakIakIajxajxaaaaaaaaaadFadFaiyaikaeZalLalMaiAagmagmagmagmagmagmagmagmagmagmagmagValNaijaeZambdfZcYadWibmqdWkdWjdWmdWldWodWndWqdWpdWsdWrdWudWtdWwdWvdWxbmqdWzdWydWBdWAbHAdWCdWDaowaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsaltalRalSalTalUalValWalXalYalZamaamraeFamcajEafEafFaiDaiDahBafFafFafFahBaiDaiDafFafKajEamdaeFameaioadLaaaaaaaaaaaaajpakoakVakWamfamgalHalHalHalHalHalHalHalHalHalHalHalHalHalIalIalIalIamhamialmalnakIajxaaaaaaaaaaaaaejaiyamjaeZaiSamkaiAagmagmagmagmagmagmagmagmagmagmagmagVakfagpaeZamsdWGdWFdWHbmqdWIarMdWJarMbmqbmqdWLdWKdWNdWMbmqarMdWJarMdWObmqdWQdWPdWSdWRdWUdWTdWVaowaaaaaaaaaaaaaafaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsammamnamoamoamoamoamoamoamoampamaamraeFamqajEafEafFanEaoTafFafFafFafFafFanEaoTafFafKajEamtaeFamudWWadLaaaaaaaaaajoajoamvalFakoamwamxalHalHalHamyamzamAamBamCamDamEamBamFamGamHamIamJalIamKamLakIalKamMajwajwaaaaaaaaaaejaiyamNaeZamOamkaiAagmagmagmagmagmagmagmagmagmagmagmagVakfamPaeZapTdWZdWYdXbdXadXddXcdXbdXbdXfdXedXhdXgdXjdXidXkdXbdXmdXldXnaSNdXodXodXodXodXodXodXodXodXoaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsaltalRamRamSamTaSjamUamVamWamXamaamraeFamYamZanaanbanbanbanbanbanbanbanbanbanbanbancandaneaeFanfaioadLaaaaaaaaaajoanganhalFalGanianianialHalHanjanjanjanjanjankanlanmanmannanoanpanqalIalIalIalJalKanransajwaaaaaaaaaaejaiyantaeZanuanvanwanxanxanxanxanxanxanxanxanxanxanxanyanzanAaeZdXpdXrdXqdXqdXsdXudXtdXwdXvdXxdXvdXzdXydXBdXAdXDdXCdXFdXEdXHdXGdXodXIdXKdXJdXMdXLdXKdXNdXobhgbhgaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalsalsaltaltaltaluanDanDalualtaltaltaFDaeFanFanGanHanHanIanHanHanJanKanLanManNanNanNanNanOamtaeFanPaioadladlaaaaaaajpanQanRanSanianiaoJaoKanialHanVanWanXanYanZanZaoaaobaocaodaoealIaofalIaogalIalIaohaoiaojajxaaaaaaadFadFaiyaokaeZaolaomaonaonaonaonaooaopaoqaoraosaosaotaosaosaouaovaeZdXOdXQdXPdXRapiatLdXSapidXUdXWdXVdXXaSNaSNdXYaSNaZYdXZcfodXHdYadXodYbdYcdXJdXMdXLdXKdYddXodXodYfdYedXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaakLatTatTakLakLakLakLaoxaoxaoyaoyaoyaoyaoyaeFaeFaeFaeFaeFaeFaeFaeFaozahcaoAaeFaoBaoBaoBaeFaeFaeFaeFafMaoCaoDadlaaaaaaajpaoEaoFaoGaoHaoIapOarganialHanjaoLaoMaoNaEyanZaoOaoPaoQaoRaoSaGeaoUaoVaoWaoXalIaoYaoZapaajxaaaaaaadFapbapcapdaeZaeZaeZaikapeapeapeaikapfaikapgaikaeZaeZaeZaeZaeZaeZaeZaphaphaphaphaphdYgdYgalralralralralralrdYidYhalralrdXZdYjdYkdWHdXodYldXKdXJdXMdXLdXKdYldXodYmdYodYndXodXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafakLakLapjapkaplapmapnakLapoapoappapqaprapsaptapuapvapwapxapyapyapzapuapAapAapBapCapDapEapFapCapGafMadlapHapIapJadlaaaaaaajpapKapLapManiapNaNGaNHanialHanjanjanjanjanjapPapQapQapQapRapSaGzapUapVapWapXalIapYapZaqaajxaaaaaaadFaqbaghaqcaqdaqeaqfaqgaqhaqiaqjaqgaqkaqlaqlaqmaqnaqoaqoaqpaqqaqraqmaqsaqtaquaqvaqwaqxaqxalraqydYpaqAaqBaqCalOdYqatMalrdYtdYsdXodXodXodYudYwdYvdYydYxdYAdYzdXodYBdYDdYCdYFdYEdYGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaakLakLaqDaqDapkaqEaqFaqFaqGaqHaqIaqJaqKaqLaqMaqNapuapvaqOaqPapyapyapyapuaqQaqQaqRaqSaqTaqUaqVapCaqWaqXaqYaqZaraarbadlaaaaaaajoarcardareaniarfaOdaNWanialHarhariarjarkarlarmarnarkaroarparqarrarsartaruarvalIarwapZarxajwaaaaaaadFaryaghaghaghaghagharzarAarBarCarDarEarFarFaqmarGarHaqoarIaqqaqqaqmarJarKarLdYHarNarOarPdYIarRarRarRarRarRarRalOalralrdYKdYJdXodYLdYNdYMaShdYOdYRdYQaShdYSdYUdYTdYWdYVdXodXodXodXodXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLarSapkakLakLakLakLakLakLarTarUarUarUarVarWarXapuarYapyaqParZasaasbapuascasdaseapCasfasgashapCasiasjaskaslasmasnadlasoasoaspasqasrajSamxarfaOdaOzanialHalHalHalHalHalHalHalHalHalHalHalIalIalIamHassastalIasuasvaswasxasyasyadFaszaghasAasAasAasAaqgasBasCasDaqgasEasFasGaqmasHasIasJarIasKaqqaqmasLasMasNasOasOasOaphalralralralralralralOalPalrdYXdYYdXHdZadYZdZcdZbdZedZddZfdZddZgdZddZhdZddZjdZidZldZkdZndZmdXoaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLasPapkakLasQasQasQasQasQarTasRasSasTasUasVasWasXasYapuasZapuapuapuapuataatbatcatdapCapCapCapCateadlarUarUadlatfarUatgathatiatjatkatlatmatmaOWaOXatmaurauraurauratoatoatoatoatoatpatqatratsattatuatvatwatpatxatyatzatAatBatCatDatEadFatDatDatDatDaqgaqgaqgaqgatFatGatHatIaqmaqmaqmaqmatJaqmatKaSzatNbDEatOatDatPatQatRatSatSatSatSatSalralOalOalrdZodZqdZpdZsdZrdZtdZbdZudYTdYTdYTdZwdZvdZxdZbdZzdZydZAdXKdZBdXKdXoaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11156,10 +11156,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaakLakLapkapkapkapkaqDaqDaqDaqDaqDazVazWazWazXaxVayQayRayRazYayRayRayVaxVazZaAaaAaaAbazbazbaAcaAcaAcaAcaAcaAcaAcaAdaybaaaaaaaAeaAfaAgaAhauAazrazqaAjaAiauAaAnaAoaApaAkaAraAsaAtaAuaAvaAwaGoaBNaAzaAAaABaACaAzaADaAEaAFaAGaaaaaaayxaAHazBaAIaAIaAIaAIaAJaAKaALaAMaANaAOaAPaAPayDaAQaARaASazNaATaAUayDaAVaAWaAXaAYaAZaBaaBbeaKaBdaBdaBearRarRarRalralrdXodXodXodXoeaLeaNeaMeaPeaOeaReaQeaPeaSeaTdYTdYTeaUdXodXodXodXodXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafakLakLaBfaBfaBgaBhaBiaBjaBkaBlaxTaBmaBmaBmaxVayQaBnayRaBoayRaBpaBqaxVaBraBsaBsaBtaBtaBtaBtaBtaBtaBtaBtaBuaBvaBwaybaaaaaaaBxaByaBzaBAaBDaAqaAmaBCaBBaBGaBHaBIaBJaBJaBKaBJaBEaBFaAvaCWaBOaBPaBQaBRaBSaBTaAzaBUaBVaBWaBXaaaaaaayxaBYazBaAIaBZaCaaCaayyaCbaCcaCdayyaqkaqlaqlayDaCeaCfayDaCgaARaChayDaCiaCjaCkaClaCmaCnaCnalraCoalOaCpaCqaCralralraafaaaaaaaaadXodXodXoeaVeaXeaWdYyeaYebaeaZdXodZbdZbdZbebbdXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakLakLaBfaCsaCsaCsaCsaCtaCtaCsaCsaCuaCsaCsaCsaCsaCsaCsaCsaCsaCsaCvaCwaCxaCyaBtaCzaCAaCBaCCaCDaCEaBtaybaCFaCGaybaaaaaaaBxaCHaCIaCJauAaBLaBMaCZaCKaCLaCPaCQaCRaCSaCTaCUaCVaCXaAvaGpaCYaDbaDadVsaDcaHbaAzaDeaDfaDgaBXaaaaaaayxaDhaDiaAIaDjaDjaDjaDkaDlaDlaDlaDkaDmaDkaDnaDkaDjaDjaDjaDjaDjaDjaDjazUazUazUazUazUaDoaDoalralralralravpavpalraaaaaaaaaaaaaaaaaaaaadXodYldXKdXKdYydXKdXKdYldXoebcebeebddXodXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaDpaDqaDraDsaDtaDuaDvaDwaDxaDtaDyaDzaDAaDBaDCaDDaDEaDFaDGaDHaDIaDJaDKaDLaDMaDMaDMaDNaBtaDOaDPaybaybaaaaaaaBxaDQaCMaDSaCNaCNaykaykaykaykaDUaDVaDWaDXaDYaDZaEaaEbaEcaEdaEeaEfaAzaEgaEhaAzaAzaEiaEjaEkaBXaaaaaaayxayxaElaEmaDjaEnaEoaEpaEpaEpaEpaEqaEraEsaEtaEuaEuaEvaEuaEuaEwaExaDjaFDaEzaEzaEzaEAaEBaEBaECaEzaEzaEzaEDaEDaaaaaaaaaaaaaaaaaaaaaaaadXodYbdZBdXKdYydXKdXKdYddXodXodYfdYedXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaEEaEFaEGaEHaEHaEIaEJaEJaEKaELaEMaENaENaEOaEPaEQaERaESaETaEUaEVaEWaEXaEYaEZaDMaDMaFaaFbaDOaDPaFcaaaaaaaaaaAeaFdaFeaFfaFgauHauHaFhaFhaDTaFiaFjaCUaCUaCUaFkaCVaFlaFmaFnaFoaFpaAzaAzaAzaAzaFqaFraFsaFtaAGaaaaaaaaaaFuaElaFvaDjaFwaFxaFyaFzaFzaFzaFzaFzaFzaFzaFzaFzaFzaFzaFAaFBaFCaDjaGzaFEaFFaFGaFHaFIaSBaFKaFLaFMaFNaEzaEDaaaaaaaaaaaaaaaaaaaaaaaadXoebfdXKdXKdYydXKdXKebgdXobhgbhgaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaFSaEPaEPaFTaEPaEPaFUaFVaFWaFXaFYaFZaGaaDMaGbaGcaGdaGeaBtaDOaDPaFcaaaaaaaaaaAeaAeaGfaFfaFfaGgaDTauHaFhaDTaGhaGiaGjaGkaCUaGlaGmaGnaAvaHdaHcaHPaGqaAzaGraGsaGtaFraGuaAGaAGaaaaaaaaaaFuaElaGvaDjaEnaGwaGxaGyaGAaHYaGyaGyaGyaGyaGyaGAaHYaGyaGBaGwaGCaDjaGzaFEaGDaFJaFJaFJaFJaFJaFJaFJaGEaGFaEDaaaaaaaaaaaaaaaaaaaaaaaadXodXodXodXodXodXodXodXodXoaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaGGaEPaEPaFTaEPaEPaGHaCxaGIaGJaGKaGLaGMaGNaGOaGPaGQaGRaBtaybaGSaFcaaaaaaaaaaaaaBxaFfaFfaFfaFfaGTauHauHauHaGUauHaGVaGWaGXaCUaGYaGZaHaaHSaHRaHTaAvaAvaHeaHfaHgaHhaGtaBXaaaaaaaaaaaaaFuaElaHiaDjaHjaGwaGxaGyaHkaHkaHlaGyaGyaGyaHlaHkaHkaGyaGBaGwaHmaDjaGzaFEaHnaHoaHpaHqaHraHsaHtaHuaFNaEzaEDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaDpaDqaDraDsaDtaDuaDvaDwaDxaDtaDyaDzaDAaDBaDCaDDaDEaDFaDGaDHaDIaDJaDKaDLaDMaDMaDMaDNaBtaDOaDPaybaybaaaaaaaBxaDQaCMaDSaCNaCNaykaykaykaykaDUaDVaDWaDXaDYaDZaEaaEbaEcaEdaEeaEfaAzaEgaEhaAzaAzaEiaEjaEkaBXaaaaaaayxayxaElaEmaDjaEnaEoaEpaEpaEpaEpaEqaEraEsaEtaEuaEuaEvaEuaEuaEwaExaDjaGAaEzaEzaEzaEAaEBaEBaECaEzaEzaEzaEDaEDaaaaaaaaaaaaaaaaaaaaaaaadXodYbdZBdXKdYydXKdXKdYddXodXodYfdYedXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaEEaEFaEGaEHaEHaEIaEJaEJaEKaELaEMaENaENaEOaEPaEQaERaESaETaEUaEVaEWaEXaEYaEZaDMaDMaFaaFbaDOaDPaFcaaaaaaaaaaAeaFdaFeaFfaFgauHauHaFhaFhaDTaFiaFjaCUaCUaCUaFkaCVaFlaFmaFnaFoaFpaAzaAzaAzaAzaFqaFraFsaFtaAGaaaaaaaaaaFuaElaFvaDjaFwaFxaFyaFzaFzaFzaFzaFzaFzaFzaFzaFzaFzaFzaFAaFBaFCaDjaHSaFEaFFaFGaFHaFIaSBaFKaFLaFMaFNaEzaEDaaaaaaaaaaaaaaaaaaaaaaaadXoebfdXKdXKdYydXKdXKebgdXobhgbhgaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaFSaEPaEPaFTaEPaEPaFUaFVaFWaFXaFYaFZaGaaDMaGbaGcaGdaHYaBtaDOaDPaFcaaaaaaaaaaAeaAeaGfaFfaFfaGgaDTauHaFhaDTaGhaGiaGjaGkaCUaGlaGmaGnaAvaHdaHcaHPaGqaAzaGraGsaGtaFraGuaAGaAGaaaaaaaaaaFuaElaGvaDjaEnaGwaGxaGyaMtaNbaGyaGyaGyaGyaGyaMtaNbaGyaGBaGwaGCaDjaHSaFEaGDaFJaFJaFJaFJaFJaFJaFJaGEaGFaEDaaaaaaaaaaaaaaaaaaaaaaaadXodXodXodXodXodXodXodXodXoaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaGGaEPaEPaFTaEPaEPaGHaCxaGIaGJaGKaGLaGMaGNaGOaGPaGQaGRaBtaybaGSaFcaaaaaaaaaaaaaBxaFfaFfaFfaFfaGTauHauHauHaGUauHaGVaGWaGXaCUaGYaGZaHaaOeaHRaHTaAvaAvaHeaHfaHgaHhaGtaBXaaaaaaaaaaaaaFuaElaHiaDjaHjaGwaGxaGyaHkaHkaHlaGyaGyaGyaHlaHkaHkaGyaGBaGwaHmaDjaHSaFEaHnaHoaHpaHqaHraHsaHtaHuaFNaEzaEDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxTalsaCtaHvaFOaFPaFPaFPaFPaFPaFPaFPaHwaHxaHxaHxaFTaEPaEPaHyaCxaHzaHAaHBaEWaEWaGLaHCaEWaEWaEWaEWaHDazhaybaybaaaaaaaaaaBxaBxaFfaFfaFfaFfaFgaHEaHFaHFaHFaHGaHHaHIaHJaHKaHLaAvaAvaAvaAvaAvaFqaGtaFraGtaGtaBXaBXaaaaaaaaaayxayxaElaDkaDjaHMaHNaGxaGyaHOaHVaHQbqBaMzbskaHQbsmaHOaGyaGBaHWaHXaDjaRLaEzaEzaEzaEAaEzaEzaECaEzaEzaEzaEDaEDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLakLaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaHZaHZaHZaIaaFTaEPaEPaIbaESaIcaHAaIdaIeaIfaDHaIgaESaDOaIhaIiaAcazhaIjaybaaaaaaaaaaaaaBxaBxaFfaFfaFfaFfaIkaIlaImaInazlaIoaIpaIqaIraIsaItaIuaIvaIwaIxaHgaHgaHhaGtaBXaBXaaaaaaaaaaaaayxaIyaElaDjaDjaDjaIzaGxaGyaIAaIBaICaIDaIEaIEaIFbwsaHOaGyaGBaIGaDjaDjalralralralralralralralralralralralralraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCOaEEaFOaFPaFPaFPaFPaFPaFPaFPaIHaIIaIJaIIaIKaENaENaILaIMaINaIOaIPaIQaIRaIQaISaITaDOaIhaAcaAcaIUaIVaybaaaaaaaaaaaaaaaaBxaBxaFfaIWaIXaIYaIZaJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaJnaJoaGtaBXaBXaaaaaaaaaaaaaaaayxaJpaJqaDkaDjaJraGwaGxaGyaJsaTJaJuaJvaJwaJwaJwaJwaJxaGyaGBaGwaJyaDjaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11168,9 +11168,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaKGaKGaKGaKHaKIaCsaKJaKJaKJaKJaKJaKpaKKaKLaKMaKqaKNaKNaKNaKNaybazhaKsaKOaKPaKtaKtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKQaKRaKSaJUaKTaKUaKQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKyaKyaKVaKWaKzaElaKXaDjaJraKYaGxaGyaGyaHOaKZaLaaJwaLbaLcaHOaGyaGyaGBaKYaJyaDjaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaIHaIIaIIaIIaFTaLdaKJaKJaKJaKJaKJaKpaLeaLfaLgaKqaLhaAcaAcaAcaLiazhaLjaLkaLlaLmaKtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKQaLnaLoaLpaLqaLraKQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKyaLsaLtaLuaLvaElaLwaDjaJraLxaGxaGyaGyaHkaLyaJwaJwaJwaLzaHkaGyaGyaGBaLxaJyaDjaDkaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaLAaFOaFPaFPaFPaFPaFPaFPaFPaFRaEPaEPaEPaLBaLCaKJaKJaKJaKJaKJaKpaLDaLEaLFaKqaAcaAcaAcaLGaybaLHaKsaLIaLlaLJaKtaaaaaaaaaaaaaLKaLLaLMaLLaLNaaaaaaaLOaLOaLPaJUaLQaLRaLRaLRaLRaLRaLRaLSaLSaLSaLRaLRaLRaLRaKyaLTaLtaLUaKzaElaDkaDjaDjaLVaLWaGyaGyaKhaLXaLXaJwaLXaLXaKhaGyaGyaGBaLYaDjaDjaDjaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaLZaEPaEPaFTaMaaKJaKJaKJaKJaKJaKpaKqaMbaKqaKqaMcaMdaMeaMfaMfaMgaKsaMhaLlaMiaKtaaaaaaaaaaaaaMjaMkaMlaMmaMjaaaaaaaaaaLOaMnaJUaMoaMpaMqaMraMsaMtaLSaMuebhaMwaMxaMybCFaLRaMAaMBaLtaLuaKzaMCaDjaDjaMDaMEaLWaGyaGyaHOaMFaKhaMGaKhaHlaHOaGyaGyaGBaMHaMIaDjaDkaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaMJaMKaMLaMMaCsaMNaKJaKJaKJaKJaMfaDOaDOaDOaybaybaybaybaMfaMOaLHaKsaKsaMPaKsaKtaMQaMQaMQaMRaMjaMSaMTaMUaMjaMVaMQaMQaMQaMWaMXaMWaLRaMqaMYaMZaNbaNaaNdaNcaNfaNeaNgbCFaLRaKzaKzaNhaKzaKzaNiaDkaDjaNjaNkaLWaGyaGyaKhaNlaNmaJwaNmaNnaKhaGyaGyaGBaNkaJyaDjaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaCsaNoaNpaNqaNraNraNsaNtaNtaNuaNvaNwaCtaCtaCtaCsaMfaMfaMfaMfaMfaMfaNxaNxaNxaNyaNzaybaNAaNBaAcaNCaNDaNEaNFaPEaPiaMQaNIaNJaNKaNLaNMaNNaNMaNLaNOaNPaNQaMQaNRaNSaNRaLRaNTaNUaNVaOeaNXaNYaNZaOaaObaOcbCFaLRaPFaQjaOfaOgaOhaOiaAIaOjaOkaNkaGxaGyaGyaHOaHUaOlaOmaOnaHUaHOaGyaGyaGBaNkaJyaDjaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaLZaEPaEPaFTaMaaKJaKJaKJaKJaKJaKpaKqaMbaKqaKqaMcaMdaMeaMfaMfaMgaKsaMhaLlaMiaKtaaaaaaaaaaaaaMjaMkaMlaMmaMjaaaaaaaaaaLOaMnaJUaMoaMpaMqaMraMsaSbaLSaMuebhaMwaMxaMybCFaLRaMAaMBaLtaLuaKzaMCaDjaDjaMDaMEaLWaGyaGyaHOaMFaKhaMGaKhaHlaHOaGyaGyaGBaMHaMIaDjaDkaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaCsaEEaFOaFPaFPaFPaFPaFPaFPaFPaFRaMJaMKaMLaMMaCsaMNaKJaKJaKJaKJaMfaDOaDOaDOaybaybaybaybaMfaMOaLHaKsaKsaMPaKsaKtaMQaMQaMQaMRaMjaMSaMTaMUaMjaMVaMQaMQaMQaMWaMXaMWaLRaMqaMYaMZaTgaNaaNdaNcaNfaNeaNgbCFaLRaKzaKzaNhaKzaKzaNiaDkaDjaNjaNkaLWaGyaGyaKhaNlaNmaJwaNmaNnaKhaGyaGyaGBaNkaJyaDjaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaCsaNoaNpaNqaNraNraNsaNtaNtaNuaNvaNwaCtaCtaCtaCsaMfaMfaMfaMfaMfaMfaNxaNxaNxaNyaNzaybaNAaNBaAcaNCaNDaNEaNFaPEaPiaMQaNIaNJaNKaNLaNMaNNaNMaNLaNOaNPaNQaMQaNRaNSaNRaLRaNTaNUaNVaTnaNXaNYaNZaOaaObaOcbCFaLRaPFaQjaOfaOgaOhaOiaAIaOjaOkaNkaGxaGyaGyaHOaHUaOlaOmaOnaHUaHOaGyaGyaGBaNkaJyaDjaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaCsaCsaOoaOpaOqaOqaOraOqaOqaOsaOtaOuaCuaDOaOvaAcaAcaAcaOwaAcaAcaAcaAcaAcaOxaAcaAcaOyaAcaAcaAcaAcaAcaAcaAcaQmaQkaMQaOAaOAaOBaOCaODaOEaOFaOGaOHaOAaOIaMQaIpaOJaOKaLRaOLaOMaONaOOaOPaOQaORaOSaOTaOUaOVaLRaQxagAaOYaOZebiaPbaAIaDjaPcaNkaGxaGyaGyaGyaHOaPdaPeaPfaHOaGyaGyaGyaGBaNkaJyaDjaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaCsaCsaCOaDRaCOaCsaCOaDRaCOaCsaCsaCsaDOaOvaMfaFcaFcaFcaFcaFcaMfaPgaPhaMfaMfaMfaMfaMfaMfaMfaFcaFcebjaAcaQAaQzaMQaPjaOAaPkaPlaPlaPmaPnaPnaPoaOAaPpaMQaPqaPraPsaLRaPtaPuaPvaPwaPxaPyaPzaPAaPBaPCaPDaLRaQYaQyaPGaPHaFuaFuaPIaDjaDjaNkaPJaPKaPKaPKaPKaPKaPKaPKaPKaPKaPKaPKaPLaPMaDjaDjaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaCsaMfaMfaMfaaaaaaaaaaaaaaaaMfaMfaMfaMfaaaaaaaaaaafaaaaaaaaaaFcaFcaAcaQmbpyaMQaPNaPOaPPaPQaPRaPSaPTaPUaPVaPWaNMaPXaPYaPZaKTaLRaLRaQaaQbaQcaLSaQdaQeaQfaQgaQhaQiaLRbrrbwSaQlaFuaFuaaaaaaaaaaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaDjaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11178,13 +11178,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaFcbySbyQaQBaQCaQDaQDaQEaQFaQGaQHaQDaQIaQDaQJaQKaQLaQMaQNaQKaQOaQPaQQaQRaQSaQKaQTaQUaQVaQVaQWaQXbznbzXaFuaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaagaadaadabcaagaagaadaadaafaagaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaabaaaaaaaaaaMfazgazgaybaRaaRbaRbaRcaRdaReaRfaRgaRhaRbaRiaRjaRkaRlaRmaRjaRnaRjaRoaRpaRqaRraRsaRtaRjaRjaRuayxazBazBaPIaaaaaaaaaaabaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaafaadaadaadaafaaeaagaadaadaadaafaaaaafaagaadaadaadaadaafaaeaaaaMfaMfaMfaMfaLOaLOaLOaRvaRwaRxaRyaRzaRAaRzaRzaRBaKvaRCaKwaKxaRDaRDaRDaRDaREaRFaRGaRHaLOaLOaLOaPIaPIaPIaPIaafaafaadaadaadaadaKmaaaaadaafaadaadaadaadaadaadaadaaaaaeaKmaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaRIaRJaRJaRKaRJaSbaRMaRNaROaRMaRPaRQaRRaRzaRSaRTaRCaRUaRSaRDaRVaRWaRWaREaRYaRZaSaaTnaScaSdaScaScaSeaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaRIaRJaRJaRKaRJaTzaRMaRNaROaRMaRPaRQaRRaRzaRSaRTaRCaRUaRSaRDaRVaRWaRWaREaRYaRZaSaaTDaScaSdaScaScaSeaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaaaaSfaaaaaaaaaaaaaaaaSfaaaaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaSgbEoaSidHcaSkaSlaSmaSnaRMaSoaSpaSqaSraRSaSsaStaKTaKRaRDaSuaRVaSvaSwaSxaSydgEaSAdLkaSCaSDaSEaSeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaSfdLNaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaRJaRJaRKaRJaSbaRMaSFaSGaRyaRzaRzaRzaRzaRSaSHaSIaSJaSKaSLaSMebkaSOaREaSPaSQaSaaTnaScaSdaScaScaSeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSRaRyaRyaRyaRyaRyaRyaSSaSTaRyaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTeaTfaTgaREaThaTiaREaREaREaREaREaREaTjaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTDaRMaToaTpaTqaTraTbaTbaTbaTsaTbaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaSaaVYaTEaTFaTEaTEaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTGaTHaTIdPJaTKaTLaTMaTNaRyaTOaTPaTQaTRaRnaTSaTTaTUaTcaTdaTVaTWaTXaREaTYaTZaUaaUbdYPaUdaUeaUfaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTDaRMaUgaUhaRydnCaKRaUjaUkaUlaUmaUnaUmaUoaUkaUpaUqaUraREaUsaUtaSaaVYaTEaTFaTEaTEaSeaaaaaaaaaaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaSfdLNaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaRJaRJaRKaRJaTzaRMaSFaSGaRyaRzaRzaRzaRzaRSaSHaSIaSJaSKaSLaSMebkaSOaREaSPaSQaSaaTDaScaSdaScaScaSeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSRaRyaRyaRyaRyaRyaRyaSSaSTaRyaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTeaTfaTVaREaThaTiaREaREaREaREaREaREaTjaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTXaRMaToaTpaTqaTraTbaTbaTbaTsaTbaTtaTuaTvaTwaTxaTyaVYaTAaTBaTCaSabfXaTEaTFaTEaTEaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTGaTHaTIdPJaTKaTLaTMaTNaRyaTOaTPaTQaTRaRnaTSaTTaTUaTcaTdbtcaTWbwDaREaTYaTZaUaaUbdYPaUdaUeaUfaSeaaaaaaaaaaTkaaaaaaaaaaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRIaTlaTlaTmaTlaTXaRMaUgaUhaRydnCaKRaUjaUkaUlaUmaUnaUmaUoaUkaUpaUqaUraREaUsaUtaSabfXaTEaTFaTEaTEaSeaaaaaaaaaaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUuaUvaUvaUvaUvaUvaRyaUwaUwaRMaUxaUkaUkaUkaUyaUzaUAaUzaUBaUkaUCaUCaUCaREaUDaUEaREaUvaUvaUvaUvaUvaUuaaaaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFaUGaUHaUFaUIaUJaUKaULaUMaUNaUOaUPaUQaURaUSaUTaUUaUVaUWaUXaUYaULaUYaUZaUMaVaaVbaVcaVdaUFaVeaVfaUFaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaSfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaVqaVraVraVraVraVsaVtaVuaVraVraVraVraVvaVwaVxaVyaVmaVlaVzaVAaVBaVCaVDaTkecraTkaTkaTkaTkaTkaTkaTkaTkaTkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11365,25 +11365,25 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaadaafaafaafaafaafaafaafbgvbhibhjbgvaafbgvbhkbhlbgvaafbgvbhmbhnbgvbigbgvbhpbhqbgvaaaaadaaaaaaaaaaaaaadaaaaaaaaaaaabcNbdybdzbdAbcRbdBbdzbdAbcRbdCbdDaXhbdEbdFbcrbdGbdHbdIbdJbdKbdLbdMbcxbdNbdObdPbdQbdRbdQbdSbdgbdTbcCbdUbdVbdWbdXbdYbdZbdYbeabebbecbedbeebefaWXaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabegaWsbehaWsaWtaWtbcgbaDbchaWtaWtaWsbehaWsbegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaaaaaaaaaaaaaaaaaaaaabgvbTTbTTbgvaaabgvbYmbYmbgvaaabgvbYibYibgvaaabgvbZHbZHbgvaaabfGaaaaaaaaaaaaaadaafaafaafbeibcNbejbenbelbcRbembePbelbcRbeobepaXhbeqberbcrbesbdHbetbdHbeubevbcwbewbexbeybezbeAbeBbeCbeDbdgbeEbeFbeGbeHbbUbeIbeJbeJbeJbeJbeJbeKbeKbeKbeKbeLbeLaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabegbeMbaDaWsaWsaWsaWtbaDaWtaWsaWsaWsbaDbeMbegaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaaaaaaaaaaaaaaaaaaaaabgvbibbicbgvaafbgvbidbiebgvaafbgvbihbiibgvbfFbgvbjebjWbgvaafaafaafaafaafaafbeNaaaaaaaaabeObeQbeTbeRbeSbeUbkzbeRbeVbeWbeXbeYaXhbeZbfabcrbfbbfcbfdbdHbfebffbcwbcxbfgbfhbfibdQbfjbdQbfkbflbfmbfnbfobfpbfqbfrbeJbfsbftbfubfvbfwbfxbfybfzbfAbeLaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabegbaDbfBbegaaaaWsaWsbfCaWsaWsaaabegbfDbfEbegaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaabaaaaaaaaaaaabgvbjabjbbgvaaabgvbjabjbbgvaaabgvbjcbjdbgvbgwbgvbkBbkDbgvaaaaaaaaaaaaaaaabcaaaaaaaaaaaabfHbfIbfJbfKbfLbfMbfNbfObfPbfQbfRbfSaXhbcWbfTbcrbfUbfVbfWbfXbfYbfZbcwbcxbgabgbbgcbgdbgebgfbggbdgbghbghbgibgjbghbgkbeJbglbgmbgnbeJbgobgpbgqbgrbgsbeLaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbegbehbgtbegaaaaafaaaaaaaaaaafaaabegbgtbgubegaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaabaaaaaaaaaaaabgvbjabjbbgvaaabgvbjabjbbgvaaabgvbjcbjdbgvbgwbgvbkBbkDbgvaaaaaaaaaaaaaaaabcaaaaaaaaaaaabfHbfIbfJbfKbfLbfMbfNbfObfPbfQbfRbfSaXhbcWbfTbcrbfUbfVbfWbfYbggbfZbcwbcxbgabgbbgcbgdbgebgfbkjbdgbghbghbgibgjbghbgkbeJbglbgmbgnbeJbgobgpbgqbgrbgsbeLaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbegbehbgtbegaaaaafaaaaaaaaaaafaaabegbgtbgubegaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaabjUbgwaaaaaaaaabjUbgwaaaaaaaaabjVbjVaaabgwaaabkEbkFaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgxbgybgzbgybcRbgAbcRbgBbcRbcRbgCbgDbgEbgFbgGbcrbgHbgIbgJbgKbgLbcrbgMbgNbgObdgbgPbgQbgRbdgbdgbdgbgSbgTbgUbgVbgWbgXbhXbgYbgZbhabeJbhbbhcbhdbhebhfbeLaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaabhgbhgbhgaaaaaaaafaaaaaaaaaaafaaaaaabhgbhhbhgaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaabkAbkAbkCbkGbkIbkHbkHbkJbkGbkKbkMbkHbkHbkLblGblHbkKblCblIblJbkAbkAaaaaadaaaaaaaadaafaafaafbgxbgxbhrbhsbgybhtbhubcRbhvbhwbcRbhxbhybhzbhAbhBbhCbhDbhEbhFbhGbhHbhIbhJbhKbhLbhIbhMbhNbhObhPbhQbhRbhSbhTbhUbhTbhVbhWbstbhXbhYbhXbeJbhZbiabhZbeKbeKbeLaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaabkAblKblDblEblFblLblOblPblMblNbnGblSblQblRbmKbmRblTbuobmSbmVbmTbkAaaaaadaaaaaaaadaaaaaaaaabgxbijbikbilbgybimbinbcRbiobipbcRbiqbirbisbitbiubivbiwbixbiybizbiAbiBbiCbiDbiEbiFbiGbiHbiIbiJbiKbiLbiKbiKbiMbiKbiNbiObiPbiQbiRbiSbiTbiUbiVbiWbiXbiYbiZaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaabkAbmWbmLbmMbmNbnFbmTbmLbmObmPbmQbmTbmTbnLbnNbnObsWbnMbnRbnSbnPbkHaaaaadaadaaaaaaaaaaaaaaabgxbjfbjgbjhbgybjibjjbcRbjkbjlbcRbjmbjnbjmbjmbjobjpbjqbjmbjrbjsbjtbjubjvbjwbjxbjubjybjsbjzbjAbjBbjCbfgbjDbjEbjFbjGbjHbjIbjJbjKbjLbjMbjNbjObjPbjQbjRbjSaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhbjTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabgvbgvbgvbgvbgvaaabkHbnTbnGbmObmPbnHbnHbnHbnIbnJbnKboHboHboIboNboPbsWbmTbmUbmMboRbkHaaaaaaaadbfGaaaaaaaaaaaabgxbjXbjgbjYbgxbcNbcNbcNbcNbcRbcRbjZbkabkbbkcbkdbkebkfbkgbjrbkhbkibkjbkkbklbkmbknbkobkpbkqbkrbksbktbkubkqbkvbkvbkvbkvbkvbkvbkvbkvbkwbkxbkybkybkybEBbkyaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabgvboFbZKboGboJboKboSboUboLboMboVboQboQboLboQboWboOboQboQboLbpHbpIboXbmTbmUbpLbpKbkAaaaaaaaafaaaaadaaaaaaaaabgxbgxbkNbgxbgxbkObkPbkQbjrbkRbkSbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhblibljblkbllblmblnbloblpblqbkvblrblsbltblublvblwbkvblxblybkyblzblAblBbkyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbhgaafaafaafaafaaaaaaaaaaafaafaafaafbhhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabgvbgvbgvbgvbgvaaabkHbnTbnGbmObmPbnHbnHbnHbnIbnJbnKboHboHboIboNboPbsWbmTbmUbmMboRbkHaaaaaaaadbfGaaaaaaaaaaaabgxbjXbjgbjYbgxbcNbcNbcNbcNbcRbcRbjZbkabkbbkcbkdbkebkfbkgbjrbkhbkibknbkkbklbkmboUbkobkpbkqbkrbksbktbkubkqbkvbkvbkvbkvbkvbkvbkvbkvbkwbkxbkybkybkybEBbkyaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabgvboFbZKboGboJboKboSbxSboLboMboVboQboQboLboQboWboOboQboQboLbpHbpIboXbmTbmUbpLbpKbkAaaaaaaaafaaaaadaaaaaaaaabgxbgxbkNbgxbgxbkObkPbkQbjrbkRbkSbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhblibljblkbllblmblnbloblpblqbkvblrblsbltblublvblwbkvblxblybkyblzblAblBbkyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbhgaafaafaafaafaaaaaaaaaaafaafaafaafbhhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbgvbpDbZKbpEbpFbpGbpMbpNbpJbnQbpObnHbnHbnHbnHbnHbpPbnHbnHbnHbnQbpQbmPbnHbpUbpVbpRbpSaaaaafaadaafaadaafaafaafblUblVblVblVblWblXblYblZbjrbmabmbbmcbmdbmebkZbmfbmgbmhbmibmjbmkbldbmlbmmbmnbmoblcbljbmpebnbmrbmsbmtbmubmvbkvbmwbmxbmybmzbmAbmBbmCbmDbmEbmFbmGbmHbmIbkyaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmJbhgbmJaaaaaaaafaaaaaaaaaaafaaaaaabmJbhhbmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabgvbgvbgvbgvbgvaaabqCbqDbqEbmMbmNbmTbmTbqJbqGbqIbqNbqObqKbqMbuobnLbmNbmTbmUbqPbqPbkAaaaaaaaadaaaaaaaaaaaaaaablUbmXbmYbmZblWblWbnablWbjrbnbbncbndbnebnfbngbnhbnibnjbnkbnlbnmbnnbnobnpbnqbnrbnobnsblkebobnubnvbnwbnxbnybkvbnzbnAbmAbnBbmAbnCbmCbnDbnEbkybkybkybkybkyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbhgaafaafaafaafaaaaaaaaaaafaafaafaafbhhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaafaaaaaabkHbrAbmTbmMbsWbmTbmTbmTbmTbrCbmTbrGbrFbrFbrJbqLbrHbrIbpTbrKbrKbkHaaaaaaaafaaaaaaaaaaaaaaablUblUbnUebpbnWbnXbnYblVbjrbnZboabmbbobbocbkZbodbmfboebofbjrbogbohboibojbokbolbombonboobkqbopboqborbosbotbkvboubovbowboxbmyboybmCbozboAboBebqboDboEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadKaafaafaafbgvbgvbgvbgvbgvaaabkHbrAbmTbmMbsWbmTbmTbsTbsTbqFbmTbsXbsZbsUbmUbnLbsWbqJbmTbsVbsVbkHaaaaaaaafaaaaaaaabaaaaaaaaaboYboZbpablYbpbbnYblVbpcbpdbpebpfbpgbphbkZbpibkZbpjbpkbjrbjubjubjubplbpmbpnbjubpobjubkqbppbprbpqbpsbptbkvbpubpvbmAbpwbmxbpxbmCbADbpzbpAbpBbpCboEaaaaaaaaaaabaagaaaaaaaaaaaaaaaaafabcaadaadaadaadaadaagaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabgvbvmcaPbvlboJboKbtbbtcboLbrBbtdbmTbmTbtgbtfbqFbmTbrDbmLbuobmUbnLbsWbmTbthbpWbpWbpWbpWbpWaafaaaaaaaaaaaaaaaaaaboYboZbpXbpYbpZbqablVbjrbqbbqcbqdbqebqfbqgbqhbqibqjbqkbjrbqlbjubqmbqnbqobqpbqmbqqbjubqrbkqbkqbkqbkqbkqbkvbqsbqtbqubqvbqwbqxbmCbqybqzbqAbZLbZLboEaaaaaaaaaaaaaadaaaaaaaaaaaaaafaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadKaafaafaafbgvbgvbgvbgvbgvaaabkHbrAbmTbmMbsWbmTbmTbsTbsTbqFbmTbsXbsZbsUbmUbnLbsWbqJbmTbsVbsVbkHaaaaaaaafaaaaaaaabaaaaaaaaaboYboZbpablYbpbbnYblVbpcbpdbpebpfbpgbphbkZbpibkZbpjbpkbjrbjubjubjubplbpmbpnbjubpobjubkqbppbpqbprbpsbptbkvbpubpvbmAbpwbmxbpxbmCbADbpzbpAbpBbpCboEaaaaaaaaaaabaagaaaaaaaaaaaaaaaaafabcaadaadaadaadaadaagaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabgvbvmcaPbvlboJboKbtbbAoboLbrBbtdbmTbmTbtgbtfbqFbmTbrDbmLbuobmUbnLbsWbmTbthbpWbpWbpWbpWbpWaafaaaaaaaaaaaaaaaaaaboYboZbpXbpYbpZbqablVbjrbqbbqcbqdbqebqfbqgbqhbqibqjbqkbjrbqlbjubqmbqnbqobqpbqmbqqbjubqrbkqbkqbkqbkqbkqbkvbqsbqtbqubqvbqwbqxbmCbqybqzbqAbZLbZLboEaaaaaaaaaaaaaadaaaaaaaaaaaaaafaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabgvbwucaPbBUbpFbpGbpMbtjbwybunbsWbmTbsXbrIbrIbqHbuqbsYbupbsYbpTbnLbsWbmTburbpWbqQbqRbqSbpWbqTbqUbqUaaaaaabqVblUbqWbqXbqYbqZbrabrbbrbbrbbrbbrbbrbbrcbrbbrbbrbbrbbrbbrbbrbbrbbrbbrdbrebrfbrfbrgbrhbribribrjbrkbrlbrmbrnbmCbrobrpbrqbrobrobmCbmCbuubrsbrtbrubrvbrwbrxaafaafaafaadaaaaaaaaaaafaafaaaaaaaafaaaaaaaafaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbgvbgvbgvbgvbgvaaabqCbutbqEbmTbmNbmTbmUbmTbmTbuobmTbrDbmTbuobmTbrEbANbvnbvobvqbrLbrMbrNbrObrPebrbqUbqUaaabrRbrSbrTbrUbrVbrWbrXbrYbrZbsabsbbscbsdbsebsfbsgbshbsibsjbZNbslbZPbsnbsobspbsqbsrbssbsubsvbtPbswbsxbsybszbsAbsBbsCbsDbsEbsFbsGbsHbsIbsJbsKbsLbsMbsNbsObsPaaaaaaaaaabcaadaadaadaagaabaaaaaaaafaaaaaaaafaaaaafaafbsQaafaafaaaaaaaaaaaeaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaafaaaaaabkHbrAbmTbmTbsWbmTbmUbtabvsbvpboQbvubvtbtebvxbvybvvbvwbvzbwvbtkbtlbtmbtnbtobtpbtqbqUaaabtrbrSbtsbttbtubtvbtwbtxbtybtzbtAbtzbtBbtzbtCbtDbtzbtEbtFbtGbtHbtIbtJbtKbtLbtMbtNbtObtQbtRbuTbtSbvkbtTbtUbtVbtWbtVbtXbtVbtYbtZbuabubbucbudbsLbuebufbsObugaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabuhbuibujbukaaaaafaaabulaaaaafaaaaaaaagaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaabaaaaaabhhaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabgvbgvbgvbgvbgvaaabkHbrAbmTbmTbsWbqJbnRbwxbuvbwwbwwbwAbwwbwzbuvbnLbsWbmTbwCbuwbuwbuwbuwbuwbuxbuybuzbqTbqTblUblUbuAbuBbuCbuDbuEbrbbuFbuGbuHbuGbuIbuJbuGbuKbuLbuHbuKbuMbuNbuObuPbuQbspbuRbuSbuUbuVbvXbvYbuWbuXbuWbuYbuWbuWbuWbuZbvabAPbvabuZbuZbvcbvdbrtbvebvfbrwbrwaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabvgbvhbvhbvgbvgbvgbvibvjaaaaafaaaaaaaafaaaaaaaaaaaaaabbhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbgvbrybZMbrzboJboKbtbbwDboLboQbwEbvrbwGboTbwwbwFbwJbwKbwHbwIbwwbwMbwLbmTbxRbuwbwNbvAbvBbuwbvCbvDbvEbvFbvGbvHbvIbvJbvKblUblUbvLbrbbvMbvNbvObvNbvPbrbbvQbuPbrbbvRbuPbrbbvSbuPbrYbvTbvUbvVbvWbxhbxjbzybxjbuWbwabwbbwcbwdbwebuWbwfbwgbwhbwibwjbuZbwkbvZbvZbwlbwmbwnbvgaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabwobwpbwqbwrcaQcaQbwtbvjbvibvidmJaaaaafaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbgvbrybZMbrzboJboKbtbbPZboLboQbwEbvrbwGboTbwwbwFbwJbwKbwHbwIbwwbwMbwLbmTbxRbuwbwNbvAbvBbuwbvCbvDbvEbvFbvGbvHbvIbvJbvKblUblUbvLbrbbvMbvNbvObvNbvPbrbbvQbuPbrbbvRbuPbrbbvSbuPbrYbvTbvUbvVbvWbxhbxjbzybxjbuWbwabwbbwcbwdbwebuWbwfbwgbwhbwibwjbuZbwkbvZbvZbwlbwmbwnbvgaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabwobwpbwqbwrcaQcaQbwtbvjbvibvidmJaaaaafaaaaaaaaaaaaaaabhgaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaabhhaaaaaaaaaaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadJaaaaaaaaabgvbsRbZMbsSbpFbpGbtibxTbxWbxUbxUbxVbxYbxZbwwbxXbycbydbyabybbyfbygbyebwBbzebuwbyhbwObwPbwQbwRbCqbYsbwUbwUbwUbwUbwUbwUbwVbwWbwXbrbbwYbvNbwZbvNbvPbrbbvNbxabrbbvNbxbbrbbvNbxcbrbbxdbxebxfbxgbxhclfclgcnebuWbxkbxlbxmbxnbxobuWbxpbxqbxrbxsbxtbuZbxubxvbvZbxwbxibxxbvgaaaaaaaaaaaaaaabvgbvgbvibvibvibvgbxybxzbxAbxBbxCbxDbxEbxFcePccVcdkbxHbxHbxIbxIaafaafaafbhgaafaafaafaafbxJbxKbxLbhgbxMbxNbxObxPbxQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgvbgvbgvbgvbgvaaabqCbumbqEbzhbzfbzgbzjbAnbzibAqbArbAsbAocOGbzibnLbAtbAubBQbuwbAvbyibyjbuwbvCbxGcozbuxbuxbuxbuxbuxbuxbuxbymbynbrbbyobvNbypbyqbvPbrbbyrbysbrbbyrbytbrbbyrbyubrbbyvbywbyxbxgbxhcnfcoUcJZbuWbyybyzbyAbyBbyCbuWbyDbxqbyEbxqbyFbuZbyGbxvbvZbvZbyHbvZbvZbvgbvgbvgbvgbvgbvgebsbyIbyJbyKbyKbyLbyMbyMbyLbyNcePbyOcqUcyVcqTbyTbxHbyUbyVbxIbxIaaaaaabhgaaaaaaaaaaafbyWbyXbyYbyZbzabyZbyWbzbbyWaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgvbgvbgvbgvbgvaaabqCbumbqEbzhbzfbzgbzjbAnbzibAqbArbAsbTHbXDbzibnLbAtbAubBQbuwbAvbyibyjbuwbvCbxGcozbuxbuxbuxbuxbuxbuxbuxbymbynbrbbyobvNbypbyqbvPbrbbyrbysbrbbyrbytbrbbyrbyubrbbyvbywbyxbxgbxhcnfcoUcJZbuWbyybyzbyAbyBbyCbuWbyDbxqbyEbxqbyFbuZbyGbxvbvZbvZbyHbvZbvZbvgbvgbvgbvgbvgbvgebsbyIbyJbyKbyKbyLbyMbyMbyLbyNcePbyOcqUcyVcqTbyTbxHbyUbyVbxIbxIaaaaaabhgaaaaaaaaaaafbyWbyXbyYbyZbzabyZbyWbzbbyWaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabkHbzcbzdbBRbkAbkAbBTbBVbzkbuvbBWbzlbwwbuvbuvbDpbBYbDobqIbuwbuwbzmbuwbuwbuxbAObzobzpbuxbzqbzrbzsbztbuxbymbynbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbzubzvbzwbzxbxhcOBdcSdfrbuWbzAbzBbzCbzDbzEbuWbzFbzGbzHbxqbzIbuZbzJbzKbzLbzMbzNbzNbzNbzNbzNbzNbzObzNbzNbzNbzNbzPbzQbzRbzSbzTbzUbzVbzWbyObyPcHvbyObzYbzZbAabAbbAcbAdbxIaaaaaabhgaaaaaaaaaaaabyWbAebFdbAfbAgbAhbyWbAibyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjaaaaaaaaaaaaaaabAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAkbAkbAkbAkbAkbAkbAkbAkbAkbAlbAmbDvbDqbApbETbFhbELbEMbAwbGFbGmbEMbAxbAybAzbAAbABbACbvCcKMbAEbAFbuxbDJbymbymbymbAGbAHbAIbwUbAJbAKbALbAMbwUbwUbwUbwUcNqcOFcQhcOEcOFcQibAQbuxbARbASbATbxhbxhbxhbxhbuWbAVbAWbAXbAYbAZbuWbBabBbbBcbBdbBebuZbBfbxibBgbBhbBibBjbBkbxibxibBlbBlbBlbBlbBlbBlbBlbBmbBnbBobBpbBqbBrbBrbBrbBrbBsbBsbBsbBsbBsbBtbBubBvbBwbBwbBxbBwbBxbBwbBxbBwbBwbBybBzbBAbBBbBCbyWbBDbyWbyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaabAjecAbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaaaaaabBEbBFbBGbBHbAkbBIbBJbBKbBLbBMbBMbBNbAkbBObBPbIobGJbBSbJSbBSbIqbBSbLjbBXbJUbBZbCabCbbCcbCdbCebCfbvCbCgbzobChbuxbCibCjbymbymbuxbCkbClbymbCmbCnbuxbuxbCobuxbuxbCpcRncgecSBcRocSBcSEbuxbuxbCsbCtbCubvZbvZbCvbyJbuWbCwbCxbuWbuWbuWbuWbuZbuZbCybuZbuZbuZbBfbxibCzbCAbBibwnbCBbCCbCDbBlbCEcaRbCGbCHbCIbBlbCJbCJbCKbCJbCJbBrbCLbCMebubBsbCObBsbCPbBsbCQbCRbCSbBwbCTbCUbCVbCVbCWbCXbCYbBwbCZbDabDbbDcbDdbDebDfbDgbyWaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11395,29 +11395,29 @@ aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbA aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaafbKLbKMbKMbKMbKMbKNbKObKPbKQbKRbKSbKTbKUbHWbKVbKWbKXbKYbKZbBEbAkbAkbAkbAkbAkbAkbAkbAkbAkbLabLbbLcbLdbLebLfbLgbLhbLibOXbIpedXbLmbEXbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbIxbLybLzbLAbCrbDGbDGbDGbDGaaaaaaaaaaaaaaaaaabLBbLBbLCbLCbLCbLBbLBbLDbLEbHcbLFbLGbLHbLHbIDbIDbIDbLHbLHaaaaaaaaaaaaaaaaaabFBbFBbFBbFBbFBbLIbBqbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbLWbLXbLYbLZbMabMbbMbbMbbMdbMebMfbMgbMhbMibMjbMkbMlbMmbMmbMnbMobMpbMmbMqbMrbJvbMsbMtbMubMvbMwbMxbMybMzbMAbMAbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaabaaaaadaadaadaadaadaadaadaagaadaaaaaaaaaaaabMCbMDbMEbKMbMDbKNbMFbMGbMHbMIbMJbMKbMLbMMebNbMObMPbMQbBEbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbOXbIpedYbLmbEXbNlbJWbNmbNnbNobIxbNpbNqbNrbNsbNtbIxbNubNvbuxbCrbymbuxaaaaaaaaaaabaaaaaabLCbLCbLBbNwbNxbNybNzbNAbNBbNCbNDbHcbNEbNFbNGbNHbNIbNJbNKbNLbLHbIDbIDaaaaaaaabaaaaaaaaabvZbNMbDXbNNbBqbCKbNObNPbNQbNRbNSbNTbNUbNVbNWbNXbNYbNXbNZbOabObbNXbOabNXbOcbOdbOeebObOfbOgbNWbNYbOabOhbNZbNXbOibOjbOkbOhbOlbOmbOnbPGbOpbOqbOrbOsbOtbOubOvbOwbOxbOxdgpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKLbMDbMDbKMbMDbKNbMFbOybOzbOAbOBbOCbODbHWbOEbKXbOFbOGbOHbOIbOJbOKbOLbOMbONbOObOPbOQbORbOSbOTbOKbOUbOVbLgbNhbOWbNjbOXbOYbOZbPabDybDybDzbPbbDzbDybIxbIxbPcbPdbNsbPebIxbPfbPgbAQbCrbymbuxaaaaaaaaaaaaaaabLCbLCbPhbPibPhbPjbPkbPlbNAbNAbPmbNDbHcbNEbPmbNHbNHbPnbPobPpbPqbPrbPqbIDbIDaaaaaaaaaaaaaaabvZbPsbPtbPubPvbPvbPwbPxbPwbPwbPwbPwbPybPzbCSbPAbPAbPAbPAbPBbPAbPAbPAbPAbPAbPAbPAbPCbPDbSWbPFbPFbPFbPFbPFbPFbPFbTabPHbPIbPJbPKbPLbJvbPMbPNbMubPObPPbPQbMybPRbPSbTCbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMCbKMbKMbKMbKMbKNbKObPUbPVbPVbPWbPXbPYbHWbPZbQabQbbQcbDibQdbQebQfbQgbQhbQibQhbQhbQjbQhbQgbQkbQlbQmbQnbQobQpbQkbQqbQrbQsbOZbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbNsbQEbIxbQFbPgbAQbCrbQGbuxaaaaaaaaaaaabLCbLCbQHbQIbQJbQKbQLbQMbQNbQJbQObQPbQQbHcbQRbQPbQSbNEbQTbQUbQVbQWbNEbQXbQYbIDbIDaaaaaaaaaaaabvZbQZbvZbvZbPvbRabRbbRcbRdbRebRfbRgbRhbRibEsbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbPAbPCbRubRvbRwbRxbPFbRybRzbRAbPFbRBbRCbPIbPIbRDbREbRFbRGbRHbRIbRJbKBbKKbKBbKBbKBbKBbKGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMCbKMbKMbKMbKMbKNbKObPUbPVbPVbPWbPXbPYbHWbXGbQabQbbQcbDibQdbQebQfbQgbQhbQibQhbQhbQjbQhbQgbQkbQlbQmbQnbQobQpbQkbQqbQrbQsbOZbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbNsbQEbIxbQFbPgbAQbCrbQGbuxaaaaaaaaaaaabLCbLCbQHbQIbQJbQKbQLbQMbQNbQJbQObQPbQQbHcbQRbQPbQSbNEbQTbQUbQVbQWbNEbQXbQYbIDbIDaaaaaaaaaaaabvZbQZbvZbvZbPvbRabRbbRcbRdbRebRfbRgbRhbRibEsbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbPAbPCbRubRvbRwbRxbPFbRybRzbRAbPFbRBbRCbPIbPIbRDbREbRFbRGbRHbRIbRJbKBbKKbKBbKBbKBbKBbKGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabHWbRKbRLbRMbRNbRObRPbHWbRQbRRbQbbRSbDibRTbRUbQgbQgbRVbRWbRXbRYbRZbSabSbbQkbScbSdbSebSfbSgbShbSibSjbSkbEVbSlbSmbSnbSobSpbSqbSrbSsbStbStbSubStbStbStbStbuxbuxbCrbSvbuxaaaaaaaaabLCbLCbQHbQIbSwbSwbSxbSybSzbSAbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbSJbSKbSLbSMbSMbQXbQYbIDbIDaaaaaaaaabvZbSNbSObSPbPvbSQbSRbSSbSTbSUbSVbWObSXbSYbSZcdnbTbbTcbTdbTdbTdbTebTfbTgbThbTibTjbPCbTkbTlbTmbTnbTobTobTobTobPFbTpbTqbTrbPIbTsbTtbKBbTubTvbTwbTxbTybTzbTAbTBbJvaaaaaaaabaaaaaaaaaabcaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbTHbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkcbFbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvdNgbUxbUybUzbUAbUBbQPbUCbekbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCcdFbVgbVhbVxbVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbXJbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkcbFbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvdNgbUxbUybUzbUAbUBbQPbUCbekbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCcdFbVgbVhbVxbVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVybVzbVEbVBbVCbVDbVBbXpbVBbVFbVGbVHbVIbBEbVJbVKbVLbVMbVNbVObQgbVPbTMbVQbVRbVSbVTbTRbVUbQkbVVbVWbVXbVYbVZbWabNjbWbbWcbWdbWebWfbWgbWhbWibWjbUhbWkbWlbWmbWnbWobWpbWqbStbWrbymbCrbWsbGZaaaaaabLBbLBbWtbQJbSwbWubWvbWwbWxbWybWxbWxbWzbWAbKjbWBbWCbWDbWEbWDbWFbWGbWDbWDbWHbUHbSMbNEbWIbLHbLHaaaaaabvibUKbxibWJbPvbWKbWLbWMbUPbWNbPvbYxbxHcfqbxHbPCbPCbWPbWQbWRbWSbVabWTbWUbWVbWWbWXbPCbWYbWZbXabXbbVjbXcbTobXdbPFbXebXfbXgbPIbXhbBvbKBbVrbXibXjbXkbXlbXmbXnbVubGsaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXoccAbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObXDbXEbTObTRbXFbQkbXGbXHbXIbXJbXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymcWTbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYlbYjbYkbZOcbebWDbWDbYnbYobYpbYqbYrbLHaaaaaabvidGFdGGcvCbPvbYtbYubYubYvbYwbUScbWbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaadbYTbYUbYVbYWbYXbYVbYWbYXbXubYYbYZbZabBEbZbbZcbZbbDibZdbZebQgbZfbZgbZhbZibXEbZhbZjbZkbQkbZlbZmbZnbZobZpbZqbSibOXbEVbEVbSlbZrbZsbQwbQwbQwbQwbZtbStbZubStbZvbStbStbStbuxbymcWTbZwbuxaaaaaabLCbZxbZybZzbZAbZBbZCbZDbZEbZFbZGbWwcbIcbIbZIbZJbWDcbGcgpcdfcdgcbHcbJceJbWDbZQbZRbZSbYqbZTbIDaaaaaabvZdGHcqSbvZbPvbZUbZVbZWbZWbZXbZYbZZcaacabcaccadcaecafcagcagcagcahcaicajcakcalcambYIcancaocapcaqbPFcarcascatbPFcaucavcawbPIbRDbREcaxcaybGEcaAcaBcaCcaDcaEcaFcaGcaHcaIcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVycaJbTDcaKbYWbYXbYVbYWbYXbXucaLcaMcaMcaMcaMcaMcaMcaMcaNcaObQgdxCdzedxlcaScaTcaUcaVcaWbQkbQkcaXbQkcaYcaZbQkcbacbbbEVcbccbdbQuczOcbfcbgcbhcbicbjbStcbkbStcblbStcbmcbncbobymcWTbymbuxaaaaaabLCcbpcbqcbrcbscbtcbuebPcbwcbxcbycbzcbAcbBcbCcbDbWDceKceLcgocgqceMceNchTcbKcbLcbMcbNcbOcbPbIDaaaaaabvZdGHcAIcbRbPvbPvcbScbTcbUcbVbUSdmbcbXcbYcbZccaccbcccccdebRebQccgcaicchcciccjcckbYIbPFcclbPFbPFbPFbPFbPFbPFbPFbPIbPIbPIbPIccmccncaxccoccpccqccrccscctcaCcaFcaFcaHccuccvccwcaHccxccycaHcaHaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXoccAbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObZibXEbTObTRbXFbQkbZlbXHbXIchibXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymcWTbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYlbYjbYkbZOcbebWDbWDbYnbYobYpbYqbYrbLHaaaaaabvidGFdGGcvCbPvbYtbYubYubYvbYwbUScbWbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaadbYTbYUbYVbYWbYXbYVbYWbYXbXubYYbYZbZabBEbZbbZcbZbbDibZdbZebQgbZfbZgbZhciJbXEbZhbZjbZkbQkckIbZmbZnbZobZpbZqbSibOXbEVbEVbSlbZrbZsbQwbQwbQwbQwbZtbStbZubStbZvbStbStbStbuxbymcWTbZwbuxaaaaaabLCbZxbZybZzbZAbZBbZCbZDbZEbZFbZGbWwcbIcbIbZIbZJbWDcbGcgpcdfcdgcbHcbJceJbWDbZQbZRbZSbYqbZTbIDaaaaaabvZdGHcqSbvZbPvbZUbZVbZWbZWbZXbZYbZZcaacabcaccadcaecafcagcagcagcahcaicajcakcalcambYIcancaocapcaqbPFcarcascatbPFcaucavcawbPIbRDbREcaxcaybGEcaAcaBcaCcaDcaEcaFcaGcaHcaIcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVycaJbTDcaKbYWbYXbYVbYWbYXbXucaLcaMcaMcaMcaMcaMcaMcaMcaNcaObQgdxCdzedxlcaScaTcaUcaVcaWbQkbQkcaXbQkcaYcaZbQkcbacbbbEVcbccbdbQucazcbfcbgcbhcbicbjbStcbkbStcblbStcbmcbncbobymcWTbymbuxaaaaaabLCcbpcbqcbrcbscbtcbuebPcbwcbxcbycbzcbAcbBcbCcbDbWDceKceLcgocgqceMceNchTcbKcbLcbMcbNcbOcbPbIDaaaaaabvZdGHcAIcbRbPvbPvcbScbTcbUcbVbUSdmbcbXcbYcbZccaccbcccccdebRebQccgcaicchcciccjcckbYIbPFcclbPFbPFbPFbPFbPFbPFbPFbPIbPIbPIbPIccmccncaxccoccpccqccrccscctcaCcaFcaFcaHccuccvccwcaHccxccycaHcaHaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVyccBbTDccCbYWccDccEbYWccDbXuccFcaMccGccHccIccJccKcaMbXAccLcaWcaWcaWcaWcaWcaWcaWcaWcaWcCibQkbQkbQkbQkbQkbQkccNccObDxccPccNccQccQccQccQccQccQccQccRccRccRccRbStccSccTbuxccUdHeccWbuxaaaaaabLCccXccYccZcdacdbbWwbWwbWwbWwbWwbWwcdccddcddcdebWDbWDbWDclubWDchUbYjcnxbWDcdhcbMcdicbOcdjbIDaaaaaabvZdHxdHzcbQcdlbPvbPvbPvbPvbPvbPvcdmcipcdocipcdmbPCbPCbPCbPCbPCbPCbYIcdpcdqcdqcdrbYIcdscdscdscdtcducdvcdwcdxcdycdAcgUebVebSebTcdDcdEcrWcdGcdHccrccscdIcaCcdJcaFcdKcdLcdMcdNcaIcdOcdMcdPcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafbTDcehcdScdTcdUcdVcdTcdWcdXcdYcdZceacebceccedceebXAcefcegcfEceicejcekcekcekcekcekcekcekcekcekcelcemcenceocepceqceqcerbuxcescescetbDLceubymbAQbAQbvFbvGbuxcevbuxbuxbymcWTcewbuxaaaaaabLBcexccYbQJceycezceAceBceCceDceEceFceGceHceHceIceHceHceHdcybWDbYjcnydzAbWDbNEceObNEcbObNGbLHaaaaaabvZdIcdILceQceQceRceSbxiceTceUbvZceVceWceXceWceYceZcfacfbcfccfdcfebYIbYIcffcfgbYIbYIcfhcficficfjcfkcflcfmcfmcfmcdvebYbxHebWebXbOncoHcfrcfscftccrccsccscdIcdIcaFcaHcfucfvcfwcfxcfycfzcfAcfBcfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcfDbXrcfFciGcfGcfHbXucfIcaMcaMcaMcaMcfJcfKcfLcfMcfNcfOcfOcfPcfQcfRcfRcfRcfRcfRcfRcfRcencencencfScfTcfUcfVcfWcfXcfYcfZcgacgbcgacgacgacgacgacgccgccgccgccgdcgccgccgcdINcgfbuxbLCbLCbLBcggccYcghcgicgjcgkcglcglcgmceEcgnbWAbWAbWAbWAbWAbWAbWAcgnbWEdMrecFecGbWDcgrcgscgtcgucgvbLHcgwcgwbvZdJCdJEbAUbCCbCDcgxbxicgybxicgzcgAcgBcgCcgDcgAcgEcfacgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgOcdtcdtcdtcdtcdtcdtcdtcfmcdvcgPbxHcgQcgRcgScaxcgTcvecgVccrccscdIcgWcgXcaFcaHcgYcgZchacaHcaIchbcaIcaHcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDchdchechfbXuchgchhchichjchkchlchmchnchochpchqchrchschtcfRchuchuchuchuchuchvchwchxcenchychzchAchBchCchDchEbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxchFchGchHchIbLBchJchKchLchMchNcgkcgkchOchPceEchQbWAchRchRchRchRchRbWAchSbWDbWDbWDbWDbWDchVchWchVchXchYchZciacibciccidbvgbvZbvZbvZbvZbvZbvZbvZbvZciecifcigcihcieceZceZceZciiceZceZceZceZcijcikcgNcilcimcinciociociociociocdtcdvcdvcaGbxHcoIbxHbxHcaxciqcaxcaxccrcaFcaGcaHcaHcaHcaHcircgZciscitciucivciwcixcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafciybTDcizciAciBciCciDciEciFcmCciHciIciJciKciLciMciNciOciPciQciRcfOciSciTcfRchuchuchuchuchuciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgdVxcjdcjhcjicjbcjjcjkcjlcjmcjbcjncjociWcjpcjqcjrcjscjtcjucjvbUwbUwcjwcjxcjycjzcgkceEceEceEcdcbWAchRchRchRchRchRbWAcgnbWAdxoebUbWDciacjAcjBcjCcjDcjDebZcjFcjGcjHcjIcjJcjKcjLcjMcjNcjOcjPcjQcjRcjNcjOcjScjTcjUcjVcjWcjXcjTcjYcjZckaecacijckcckdckeckfckgciociociociociocdtckhcdvckickjckkcklcaGckmcknckockpcaCckqckrcaHckscktcaHckueccecbecbecbcopcdMckvckwcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackxckyckzckAckBckCckDckEckFckGckHckIckJckKckLckMchnbLgckNcfOcfOckOcencfRchuchuchuchuchuckPckQckRckSckTckUckVckWckXckWckYckUckZckUckUclaclbckUckUclccldcledhndhpdhqclhclicljclkcllclmcllcllcllcllcllclncloclpbYhclqclrceHclsbWAchRchRchRchRchRbWAcltbZJecJclvclwclxclyclzclAclAclAclAclAclBclCclDclEclFclGclHclIclHclHclJclKclHclIclLclHclMclHclHclNclHclHclOclPclJclQclRclSecdclUclVciociociociociocdtclWcdvclXclYclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmncmocmpcmqcmrcmscmtcdMcmucmvaafaafaafaadaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaaabTDcmwciAcmxcmycmzcmAcmBcrAcmDcmEcmFcmGcmHcmIcmJcmKcfOcfOcfOcmLcmMcmNcfRchuchuchuchuchucmOcmPciWciXcmQcmRcmScmTcjccmUcmVcmWcmXchCdhscmYcmZcmTcnacnbcnccndcngdhSdiqcnhcnicnjcnkcnlcnmcnncnobUwbUwcnpcnqcnrcnsbWAcntcnucddcddbWAchRchRchRchRchRbWAcnvcnwbZJecKbWAcnzcnAcnBcnCcnDcnDcnEcnFcnGcnHcnIcnJcjKcjLcjPcnKcjPcjPcnLcnMececnOcnPcnQdVycnRcnScnTcnLcnRcnUcnVcnWcnXckcckdcnYcnZcoaciociociociociocdtcobcoccaGcodcoecofcaGcogcohcogcoicojcokcolcaHcomconcaHcoocopcoqcdMcorcgZcdMcoscotcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDcoucovcowbXucoxchhcoyebtcoAcoBcoCcoDcoEcoFcoGcmLcrQcrOcfRchuchuchuchuchuchvcoJcoKcencencoLchEcoMchCcoNcoOcoPcoPcoPcoPcoPcoPcoQcoQcoRcoScoQdirdwgdwqditcoTcoVcoWchGcoXcnsbLBcoYchKchLcoZchNbLBbWAcgncpacpbcpcbWAchRchRchRchRchRcpdcpdcpecpdcpdcpdcpdcpfchWchVchXcpgchZcphcpiciccpjcpkcpkcpkcplcpmcpncpncpncpncpncpocpncpncpncpncpncpncppcpqcprcnVcpsciecptcgNcpuciecinciociociociociocdtcpvcdvcaGcpwcpxcpycpzcpzcpzcpAcpzcpBcpzcpzcaHcaHcaHcaHcpCechecfecgeciecjcpIcpJcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDchdchechfbXuchgchhcmFchjchkchlchmchnchochpchqchrchschtcfRchuchuchuchuchuchvchwchxcenchychzchAchBchCchDchEbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxchFchGchHchIbLBchJchKchLchMchNcgkcgkchOchPceEchQbWAchRchRchRchRchRbWAchSbWDbWDbWDbWDbWDchVchWchVchXchYchZciacibciccidbvgbvZbvZbvZbvZbvZbvZbvZbvZciecifcigcihcieceZceZceZciiceZceZceZceZcijcikcgNcilcimcinciociociociociocdtcdvcdvcaGbxHcoIbxHbxHcaxciqcaxcaxccrcaFcaGcaHcaHcaHcaHcircgZciscitciucivciwcixcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafciybTDcizciAciBciCciDciEciFcmCciHciIcoyciKciLciMciNciOciPciQciRcfOciSciTcfRchuchuchuchuchuciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgdVxcjdcjhcjicjbcjjcjkcjlcjmcjbcjncjociWcjpcjqcjrcjscjtcjucjvbUwbUwcjwcjxcjycjzcgkceEceEceEcdcbWAchRchRchRchRchRbWAcgnbWAdxoebUbWDciacjAcjBcjCcjDcjDebZcjFcjGcjHcjIcjJcjKcjLcjMcjNcjOcjPcjQcjRcjNcjOcjScjTcjUcjVcjWcjXcjTcjYcjZckaecacijckcckdckeckfckgciociociociociocdtckhcdvckickjckkcklcaGckmcknckockpcaCckqckrcaHckscktcaHckueccecbecbecbcopcdMckvckwcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackxckyckzckAckBckCckDckEckFckGckHcOGckJckKckLckMchnbLgckNcfOcfOckOcencfRchuchuchuchuchuckPckQckRckSckTckUckVckWckXckWckYckUckZckUckUclaclbckUckUclccldcledhndhpdhqclhclicljclkcllclmcllcllcllcllcllclncloclpbYhclqclrceHclsbWAchRchRchRchRchRbWAcltbZJecJclvclwclxclyclzclAclAclAclAclAclBclCclDclEclFclGclHclIclHclHclJclKclHclIclLclHclMclHclHclNclHclHclOclPclJclQclRclSecdclUclVciociociociociocdtclWcdvclXclYclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmncmocmpcmqcmrcmscmtcdMcmucmvaafaafaafaadaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaaabTDcmwciAcmxcmycmzcmAcmBcrAcmDcmEdjgcmGcmHcmIcmJcmKcfOcfOcfOcmLcmMcmNcfRchuchuchuchuchucmOcmPciWciXcmQcmRcmScmTcjccmUcmVcmWcmXchCdhscmYcmZcmTcnacnbcnccndcngdhSdiqcnhcnicnjcnkcnlcnmcnncnobUwbUwcnpcnqcnrcnsbWAcntcnucddcddbWAchRchRchRchRchRbWAcnvcnwbZJecKbWAcnzcnAcnBcnCcnDcnDcnEcnFcnGcnHcnIcnJcjKcjLcjPcnKcjPcjPcnLcnMececnOcnPcnQdVycnRcnScnTcnLcnRcnUcnVcnWcnXckcckdcnYcnZcoaciociociociociocdtcobcoccaGcodcoecofcaGcogcohcogcoicojcokcolcaHcomconcaHcoocopcoqcdMcorcgZcdMcoscotcaIaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDcoucovcowbXucoxchhdWhebtcoAcoBcoCcoDcoEcoFcoGcmLcrQcrOcfRchuchuchuchuchuchvcoJcoKcencencoLchEcoMchCcoNcoOcoPcoPcoPcoPcoPcoPcoQcoQcoRcoScoQdirdwgdwqditcoTcoVcoWchGcoXcnsbLBcoYchKchLcoZchNbLBbWAcgncpacpbcpcbWAchRchRchRchRchRcpdcpdcpecpdcpdcpdcpdcpfchWchVchXcpgchZcphcpiciccpjcpkcpkcpkcplcpmcpncpncpncpncpncpocpncpncpncpncpncpncppcpqcprcnVcpsciecptcgNcpuciecinciociociociociocdtcpvcdvcaGcpwcpxcpycpzcpzcpzcpAcpzcpBcpzcpzcaHcaHcaHcaHcpCechecfecgeciecjcpIcpJcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcpKcpLcpMcpNchecmDbXucpOcpPcpPcpQcpPcpRcpScpPcoEcmLcmLcmLcpUcpTcfRcfRcfRcfRcfRcfRcfRcencencencpVcpWcpXcpYcpZcqacpXcqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcoQdwTdwWdwTdwUcqncqocoVbLCbLCcqpcqqcqrcqscqtcqubWzcqvcqwcqxcqxcqxcqycqycqzcqAcqBcqpcpdcqCcqDcqEcqFcqGcpdcqHcqIcjCcqJcqKchZcgwcgwcpkcqLcqMcqNcqOcqPcqPcqQcqRcDfcSCecUcqVcqWcqXcqYcqZcracracrbcrccrdcrecrfcrgcrhcrhcrhcricdtcdtcdtcdtcdtcdtcdtcfmcdvcrjcpwcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrvcaHcrwcgZcrxcaHcaIcrycaIcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabKLbVibKLbVibKLbVibKLbVibKLbVibKLbViaafaafbTDcrzbXrctqcrBcrCcrDcrEcrFcrGcrHcrIcrJcrKcrLcpPcuXcrMcrNcrNcrPcuZcrRcrRcrRcrScrTcrUcrVcpVcvfcpVcpVcencrXcrXcrXcrXcrXcoPcrYcrZcsacsbcsccoQcsdcsecsfcsgcoQdyidypdybdwUcshcqocoVaaaaaacqpcsicqrcsjcskcslbWzcsmcsncqxcsocspcsqcsrcsjcsjcsjcsscstcsucsvcswcsxcsycpdcszcsAcjDcsBcsCchZaaaaaacpkcsDcsEcsFcpkcsGcsHcpncsIcsJcsKcsLcsMcsNcsOcsPcsQcsRcsScpncsTcsUcsVcsVcsWcrhcdvcdvcsXcfmcfmcfmcfmcfmcfmcfmcfmcdvcsYcpwcsZctacrmctbctcctdctectfctgcthcticrvcrvctjctkctlctmcaIctnctoctpcaHaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvbVwbVAbVwbVAbVwbVAbVwbVAbVwbVAbVwbVybVzbTDcttctrctscwRctrctuctvctwcpPctxctyctzctActBcpPcuXctCctDctDctFctEctDctGctGctHcTCctIctJctIcvgcvgctIctLctLctMctNctMctLctLctOctOctOctPctOctOctQctRctScoQcoQdUPdUQdBMdwUctTcqocoVaaaaaactUctVctWctXcskctYbWzctZcuacubcuccudcuecufcugcuhcsjcuicujcukculcumcuncuocpdcupcsAcuqcurcuscgwaaaaaacpkcutcuucuucuucuvcuwcuucuucuxcuxcuxcuycuzcuAcuzcuzcuzcuzcuBcuCcuDcuEcuFcuCcuGcuGcuGcuGcuGcuGcuGcuHcuHcuHcuHcuIcuIcuIcuIcuJcuKcuLctbcuMcrqcrqcrqcrqcrqcrvcrvcrvcaHcuNcorcuOcaIcdOcdMcdPcaHaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVycaJbTDcaKcuPcuQcuRcuScuQcuTcuUcpPcpPcpPcpPcpPcpPcpPcuXcuVctDcuWcuYcxbctDcvacvbcvcctHctIcvdctIctKctIcxicvhcvicvjcvkcvjcvlcvmcvncvocvpcvqcvrctOcvscvtcvucvvcoQdUSdUTdURdwUcvwcqocoVaaaaaactUcvxcvycvzcvAcvBbWzcDQcvDcqxcvEcvFcvGeckcvIcvJcsjcvKcvLcvMcvNcumcvOcvPcvQcvRcsAcvScvTcvUcgwaaaaaacpkcsDcuucvVcvWcvXcvYcvZcwacwbcwccwdcuycwecwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscwtcwucwvcwwcwxcwycwzcwAcwBcwCcwDcwEcwFcwGcrmcwHcwIcwJcrqcrqcrqcwKcwLcwIcrvcaHcwMcwNcwOcaHccxcwPcaHcaHaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaadbYTcwQcwUcwScwTcxtcwScwTcwVcwWcwXcwYbTDcfRcrMcrNcrNcrNcwZctDcxacxccxdctDcvacxectHecWctIcxfcxgcxhcXqcxjcxkcxlcxlcxlcxmcxncxocxpcxqcxrcxscFGcxucxvcxwcxxcvvcoQdwUdwUdwUdwUcoVcqocoVaaaaaactUcxycqrcxzcxAcxBbWzcxCcxDcqxcxEcxFcxGcsrcxHcxIcxJcvKcxKcxLcxMcxNcxOcxPcpdcvRcxQcxRcxScxTcgwaaaaaacpkcsDcuucxUcxVcxWcxXcxYcxZcyacybcyccuzcydcyecyfcygcyhcyicyjcykcylcymcyncyocypcyqcyrcyscyrcytcwwcyucyvcywcwAcyxcyycyzcwEcyAcyBcrmcrmcrmcrmcrmcrmcrmcrmcrmcpzcpzcaHcyCcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaaaaaaaaabKLbKMbKMbKMbKMbKMbKMbKMcyDbKMbKMbKMbVybXocyEcyFcyGcyHcyIcyJcyHcyKcyLcyLcyMbTDcfRcyNcmLcyOcyOcyPcyOctDcyRcyQctDctDcyTcyUecHctIcyWcyXcyYcyZczaczbcxlcxlczcczdczeczfctOczgczhcziczjctOcoQcoQczkcoQcoQcqmcqmcqmcqmcoVcqoczlaaaaaacqpcsicqrczmcznczobWAbWAczpcqxcxEczqczrcsrcsjcvAcsjczscpdcztczuczvczwcpdcpdczxczyczzczAczBchZaaaaaaczCcsDcuuczDczEcxWczFczGcxZczHczIczJcuzczKcyeczLczMczNcXCczPczQczRczSczTczUczVczWczXczYczXczZcAacAbcAccAdcwAcAecAfcAgcwEcAhcAicAjcAkcAlcAmcAncAocApcAqcArcAsbYScAtcAuaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaaaaaaaaabKLbKMbKMbKMbKMbKMbKMbKMcyDbKMbKMbKMbVybXocyEcyFcyGcyHcyIcyJcyHcyKcyLcyLcyMbTDcfRcyNcmLcyOcyOcyPcyOctDcyRcyQctDctDcyTcyUecHctIcyWcyXcyYcyZczaczbcxlcxlczcczdczeczfctOczgczhcziczjctOcoQcoQczkcoQcoQcqmcqmcqmcqmcoVcqoczlaaaaaacqpcsicqrczmcznczobWAbWAczpcqxcxEczqczrcsrcsjcvAcsjczscpdcztczuczvczwcpdcpdczxczyczzczAczBchZaaaaaaczCcsDcuuczDczEcxWczFczGcxZczHczIczJcuzczKcyeczLczMczNczOczPczQczRczSczTczUczVczWczXczYczXczZcAacAbcAccAdcwAcAecAfcAgcwEcAhcAicAjcAkcAlcAmcAncAocApcAqcArcAsbYScAtcAuaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvcczcdQcczcdQcczcdQcczcdQcczcdQcczbVyccBbTDbTDcAvcAwcAxbXpcAxcAycyLcyLcAzbTDcfRcyNcmLcyOcAAcABcACctDcAEcyScAFctDcAGcAHecIctIcAJcAKcALcAMcANcAOcAPcAQcAQcARczecAScATcAUcAVcAWcAXctOcAYcAZcBacBbcBccqmcBdcqmcBecoVcqoczlaaaaaacqpcqpcBfcsjcuhcBgcBhbWAcBicqxcqxcqxcqxcBjcBkcBlcBkcBmcpdcpdcBncBocpdcpdcBpcBqcBrcjDcBschZchZaaaaaaczCcsDcuucuucBtcBucBvcBwcxZcBxcBycBzcuzcBAcBBcBCcBCcBDcBEcBFcBGcBHcBIcwocBJcypcBLcBNcBMcBKcBOcuGcBPcBQcBRcwAcBScBTcBUcwEcBVcBWcBXcBYcBYcAmcBZcCacCbcAmcAmcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcfRcCccencyOcCdcABcCectDcCfcADcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcazcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJdVzcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzdbIcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdRbMCcdRbMCcdRbMCcdRbMCcdRbMCcdRaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcfRcCccencyOcCdcABcCectDcCfcADcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcRucxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJdVzcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzdbIcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcDIcDJcDKcDLcDLcDMcDNcXVcCheclcPXcyOcDRcDScDTctDctDctDctDcDUcDVcDWcDUctIcDXctIcDYcDZctIcEacEbcEccEccEdcEecEactOcEfcEgcEhcEictOcEjcEjcEjcEkcEjcBbcBbcBbcqmcoVcqocoVaaaaaaaaactUctUcElcCEcuhcuhcEmcEncEocEocEpcEqcErcEscEtcEucErcEvcEwcExcExcEycEzcBrcBrcCWcEAcgwcgwaaaaaaaaacpkcsDcEBcuucuucECcEDcEEcxZcEFcEGcEHcuzcEIcEJcEKcELcEMcENcEOcEPcEQcERcEScETcuGcEUcEVcEWcEXcEYcuGcDOcFacFbcwAdbLcFdcFecwEcFfcFgcFhcFicFjcAmcFkcFlcFmcAscAscAsaafaafaafabcaafaaaaaaaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcFncFocFpcFqcDHcDHcDHcMXcEZcDPcFtcyOcyOcyOcyOcGTcFvcFwcFxcDUcFycFzcFAcFBcFCcFDcFEcFFctIcOlcFHcFIcFJcFKcFLcFMctOcxpcFNcxpcFOctOcFPcFQcFRcFScEjcoVcoVcFTcoVcoVcFUcoVaaaaaaaaaaaactUctUcElcCEcsjcFVcFWcFXcFYcsjcFZcGacGbcskcGccGacGdcjDcGecGfcGgcGhcjDcCWcEAcgwcgwaaaaaaaaaaaacpkcsDcGicGjcGkcGlcGmcGncGocGpcGqcGrcuzcGscuzcuzcGtcGucGtcuycuEcGvcuEcGwcuEcuGcwwcGxcGycwwcuGcuGcGzcGAcFrcwAcwEcGCcwEcwEcFfcFgcFhcGDcGEcAmcGFcGGcGHcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacFpcGIcFpcGJcGKcGLcDHcGMcGBcLFcFscGPcGQcGRcGScGTcFucGUcGVcFxcDUcGWcGXcGYcGZcHacDUcHbcHccHdcHecHfcHgcHgcHhcHicHjcHkcHlcHmcHncHocEjcHpcHqcHrcHscEjcHtcHuecZedacHwcHxcoVaaaaaaaaaaaaaaactUctUcHycHzcHycHAcHBcHCcHDcHDcHEcslcskcslcHEcHFcHFcHGcHHcHIcHJcHKcHJcgwcgwaaaaaaaaaaaaaaacpkcHLcHMcGjcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcIacHUcIbcIccIdcIecIfcIgcIhcIicIjcIkcIlcImcIncIocIpcIqcIrcIsecmcIucIvcIwcIxcIycIzcIAcAmcAmcIBcAmcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11427,9 +11427,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaacMWcDHcFpcFpcDHcDHcMXcMYcMYcMXcMZcNacMXcMXcLLcGTcIMcIMcIMcDUcNbcNccNdcNecNfcDUcNgcHgcHgcNhcNicHgcHgcHgcNjcNkcLWcLWcLWcLWcLWcLXcNlcNmcNncLYcCwcQkcoVcTDedgcNrcNscNscNtcNucKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcNvcNwcNxcNycNzctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcNAcNBcNCcKRcNDcKVcNEcNFcNGcKTcNHcNIcNJcNKcNLcNMcNNcNOcNPcNQcNRcLccNScNTcNUcNVcNWcNXcNYcNZcOacObcOccLhcOdcOecOfcOgcOhcMOcOicOjcOkcPucMOcOmcOncLucOocOpcOqcLyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcOrcOscOtcMXcLLcGTcIMcIMcIMcDUcDUcDUcDUcDUcDUcDUcOucOvcHgcHgcOwcOwcOwcHgcOxcOycLWcLWcLWcLWcLWcLXcOzcOAdUVcLYcOCcBbcODedhedicKNcPVcOHcOIcOJcKNcoVcoVcoVcoVczlczlczlcoVcoVcoVcoVcoVcOKcOLcMfcOMcOKcpkcpkcpkcpkcpkczCczCczCcpkcpkcpkcpkcKRcONcOOcOPcKRecqcKVcORcOScOTcKTcOUcOVcOWcOXcOYcKZcOZcPacPbcPccPdcLfcNScNTcPecPfcPgcPhcPicPjcPkcPlcPmcLhcPncPocPpcPqcPrcMOcPscPtcPtcSLcMOcPvcPwcPxcPycPzcPAcKlaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcPBcPCcPDcMXcLLcGTcGTcPEcIMcFucFucIMcIMcIMcPFcGTcEacPGcEacEacPHcPIcPJcPKcPLcPMcLWcLWcLWcLWcLWcLXcPNcPOcPPcLYcPQcPRcoVcPScPTcKNcKNcKNcKNcKNcKNcPWcHwcHwcQacQacPYcQacQacQacQacQacQacQbcQccQdcQecQfcQgcQgcQgcQgcQgcQgcURcTHcpkcQjcSpcQlcKRcQmcOOcQncKRcQocKVcKVcQpcKVcKTcQqcQrcQscQtcQucKXcQvcQwcQxcQycPdcLccNScQzcQAcQBcQCcQDcQEcQFcQGcQHcQIcLhcLlcLlcLlcLlcLlcMOcPscQJcQKcSLcMOcQLcQMcKlcKlcKlcKlcKlaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafaaaaaaaaaaaacMXcQNcQNcMXcMXcLLcIMcGTcGTcFucFucGTcGTcGTcGTcGTcGTcQOcQOcQOcEacEacEacEacQPcQQcKGcLWcLWcLWcLWcLWcLXcLYcKUcLYcLYcoVcoVcoVcQScQTcQUcHwcQVcQWcQXcHwcHxcBbcBbcBbcBbcQYcQZcAYcPUcPUcRdcRecoVcRfcRgcRhcpkcRicRjcRicRkcRlcRmcWecWcedmedpedpedocKRcKRcRpcKRcKRcQocpkcGjcRqcRrcLacRscRtcRucRvcRwcKZcRxcRycRzcRAcRBcLbcRCcRDcREcRFcRGcRHcRIcRJcRKcRLcRMcRNcROcRPcRQcRRcRScMOcRTcRUcPtcRVcMOcRWcRXcpwaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafaaaaaaaaaaaacMXcQNcQNcMXcMXcLLcIMcGTcGTcFucFucGTcGTcGTcGTcGTcGTcQOcQOcQOcEacEacEacEacQPcQQcKGcLWcLWcLWcLWcLWcLXcLYcKUcLYcLYcoVcoVcoVcQScQTcQUcHwcQVcQWcQXcHwcHxcBbcBbcBbcBbcQYcQZcAYcPUcPUcRdcRecoVcRfcRgcRhcpkcRicRjcRicRkcRlcRmcWecWcedmedpedpedocKRcKRcRpcKRcKRcQocpkcGjcRqcRrcLacRscRtcUgcRvcRwcKZcRxcRycRzcRAcRBcLbcRCcRDcREcRFcRGcRHcRIcRJcRKcRLcRMcRNcROcRPcRQcRRcRScMOcRTcRUcPtcRVcMOcRWcRXcpwaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaadaadaaaaaaaaacMXcRYcRZcSacMXcSbcKvecscSdcSecSfcSgcShcIMcSicIMcSjcSkcSkcSkcSlcSmcSmcEacEacEacKGcKGcKGcKGcKGcKGcKGcQOcSncQOcGTcSocGTdTdcBbcFUcBbcSqcSrcPScNocBbcSucSvcSwcSucSucSucSucSucSucSucSucSucSucSxcSycSzcSAcSAcSAcSKcSAcSAcSAcSAdaMedvedredvedtcSFcSGcSHcSDcSDcSIcSJcTucTycSMcLacLacLacLacLacLacLacSNcLbcLbcLbcSOcLbcSPcSQcSRcSScSPcLhcSTcLhcLhcLhcMIcSUcSVcSWcSXcSYcSZcTacPtcTbcTccTdcTecTfcTgcpwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfGaafaafaafaafaaaaaaaaacMXcMXcSbcKucKucKucThcTicTicTicTjcTicTicTicTkcKucKucKucKucThcKucKucKucKucKucKucKucKucTlcTmcTncTocTpcKucTqcTrcTscTtcTJcTJcTJcTJcTJcVYcSucTvcTwcRbcRacSucStcTxcUCcRccSscTEcSucTzcTAcXacSAcTGcTIcUucUvcUvcUMcSAcUNcSAcpkcpkcpkcpkcpkcpkcpkcpkcpkcTKcsFcTLcTMcTNcTOcTPcTQcTQcTRcTScTTcTUcTVcTWcTXcSRcTYcTZcUacUbcUccSRcUdcTWcTVcTUcUecSUcUfcUgcUhcUicUjcMOcUkcUlcUmcUncUocUpcUqcpwaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfGaafaafaafaafaaaaaaaaacMXcMXcSbcKucKucKucThcTicTicTicTjcTicTicTicTkcKucKucKucKucThcKucKucKucKucKucKucKucKucTlcTmcTncTocTpcKucTqcTrcTscTtcTJcTJcTJcTJcTJcVYcSucTvcTwcRbcRacSucStcTxcUCcRccSscTEcSucTzcTAcXacSAcTGcTIcUucUvcUvcUMcSAcUNcSAcpkcpkcpkcpkcpkcpkcpkcpkcpkcTKcsFcTLcTMcTNcTOcTPcTQcTQcTRcTScTTcTUcTVcTWcTXcSRcTYcTZcUacUbcUccSRcUdcTWcTVcTUcUecSUcUfcXCcUhcUicUjcMOcUkcUlcUmcUncUocUpcUqcpwaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaacMXcMXcMYcMYcMYcMXcMXcMXcMYcMYcMYcMXcMXcMXcMXcMXcMXcMXcMXcIMcIMcIMecucIMcIMcIMcIMcIMcIMcIMcMXcMXcMXcMXcUrdaPcUtcTJcUycUwcUxcUYcUZcSucUzcTwcUDcUAcUBcUGcUHcUEcUFcUIcUScSucUJcUKdfkcSAcSAcSAcUOcUPcUQcUTcSAcUUcUXcVacVbcVccWdcWfcWkcWncWocpkcpkcpkcTLcVfcVhcVdcVecVgcWbcGjcTScVicUacVjcVkcVlcSRcVmcVncVocVpcVqcSRcVrcVkcVjcUacVscSUcSUcSUcSUcVtcSUcMOcMOcMOcMOcMOcMOcVucVvcVwaafaafaafabcaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacMXcMXcVxcVycVzcVAcVBcVCcVDcVEcVFcMXcMXaaaaaaaaaczledbcVHcVKcVIcVIcVJcVNcVOcSucVLcVQcVRcVPcSucVTcVUcVScVMcWacUVcSucVVcVWcVXcSAcWpcWqcWrcWWcXbcXccXdcXecXfcVacXgcXjcYrcWfcYscYtcYvcpkcXkcpkcTLcWlcWmcWmcWlcXlcXmcXncXocWscWtcWucWvcWwcWxcWycWzcWAcWycWycWxcWAcWBcWCcWycWDcWEcQRcWGcWHcWIcWJcWKcWLcWMcWNcWOcWPcWQcWRcWSaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaagaadaadaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaacMXcMXcMXcMYcMYcMYcMYcMYcMXcMXcMXaaaaaaaaaaaaczledycWUcTJcUWcWgcVZcWicXtcSucSucSucSucSucWjcWVcWXcWYcWZcWZcYlcSucXhcUKcXicSAcSAcSAcSAcSAcYxcSAcSAcUUcUXcVacYycYzcYCcWfcYDcYEcZocpkcYAcpkcYKcXycXzcXAcXBecLcYBcGjcTScXEcXFcXGcXHcXIcXJcXKcXLcXMcXNcXKcXOcXPcXQcXRcXScXTcXUcWFcXWcXXcXYcXZecwcYbcYccYdcYecYfcYgcYhcYiaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11443,12 +11443,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrddqcoVcoVcTJdekcZKcZKcZKcZldeldjFdemdemdendbHderdepdeqdeudevcYwdescVWdfydipdftdfudfvdfwdfIcYGdfNdfTdeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaagaadaaaaaaaaaaaaaagaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaacUrddXdeBcAYcTJcZLdeCdeFdeddeDdeEcXpdeIcYqdeHdeKcYwdeJddAddAdeLcYwdeQcUKdgcdgvcYHdfVcYGdfWdfYcYGdfNdgadgbddZddZddZddZddZddZddZddZddZddZdgedcEdmGaafaafaadaaaaabaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaafaafaadaadaadaafaaeaagaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafczlddXdeRdeTdeTdeUdeUdeUdeTdeSdeZdeTdeTcYqcZpdeVcYwdffdfgdfgdeXdfideWcUKdgUdficYHdgfdggdgjdgrdgsdfNdgtdeMddZddZddZddZddZddZddZddZddZddZdgudcEdnfaaaaaaaadaaaaaaaaaaaaaaaaadaadaaaaaaaaaaafaaaaaaaaaaafaaaaadaadaafaadaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczlddXcBbdhXdfhdfxdfedfxdfmdgzdfldgFdeUcYqdfndemdgLdgNdgSdfJdfKdfLdfMcZydgTdeYdiQdgwdggdgxdgydgsdgMdkvdeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaadaaaaaaaaaaaaaaaaaaaadaagaaaaadaadaadaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczldfzdfAdfDdfEdfBdfCdfBdfBdfFdfGdfPdfRdfOdfOdfOdhodhrdhtdghcULcSzdgidfXdhzdeYdgVdgwcYGdhbdhicYGdfNdgadgbddZddZddZddZddZddZddZddZddZddZdgedhldmGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaafcUrddXcBbdeTdgldfQdgkdgodgqdgmdgndhPdeUcYqcYqdhQcYwdhRdhZdiadiidfidgIcTAdgJdeYdhmdgwcYGdhIcYGcYGdfNdhKdeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczlddXcBbdhXdfhdfxdfedfxdfmdgzdfldgFdeUcYqdfndemdgLdgNdgSdfJdfKdfLdfMcZydgTdeYdgVdgwdggdgxdgydgsdgMdkvdeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaadaaaaaaaaaaaaaaaaaaaadaagaaaaadaadaadaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczldfzdfAdfDdfEdfBdfCdfBdfBdfFdfGdfPdfRdfOdfOdfOdhodhrdhtdghcULcSzdgidfXdhzdeYdhmdgwcYGdhbdhicYGdfNdgadgbddZddZddZddZddZddZddZddZddZddZdgedhldmGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaafcUrddXcBbdeTdgldfQdgkdgodgqdgmdgndhPdeUcYqcYqdhQcYwdhRdhZdiadiidfidgIcTAdgJdeYdisdgwcYGdhIcYGcYGdfNdhKdeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaczlddXdgAdeTdgCdfQdgBdgHdgKdgDdfQdiodeTdiSdiSdiMdiMdiMdiMdiMdiMdiMdhcdhddhedfidhMdgwdhNdhOdikdildimdindeMddZddZddZddZddZddZddZddZddZddZdfsdcEdnfaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczldgOcvwdeTdgQdfQdgPdfSdfQdgRdfQdiPdeTdjsdjsdiTdjwdiVdiMdiWdlIdiMcTBcTAdiXdixdisdiudiwdiJdiKdiLdiNdjedeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczldhkctTdeTdhgdgZdgZdgZdjtdgZdgZdjvdeTdjsdjsdjBdjsdjEdjGdjHdjIdiMdhUdhVdhWdixdhudhudixdljdlkdixdlldhucYHcYHcYHcYHcYHcYHcYHdjfdjgdjhcYHcYHdcEdmGaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjecBdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczldgOcvwdeTdgQdfQdgPdfSdfQdgRdfQdiPdeTdjsdjsdiTdjwdiVdiMdiWdlIdiMcTBcTAdiXdixdiQdiudiwdiJdiKdiLdiNdjedeMddZddZddZddZddZddZddZddZddZddZdeMdcEdnfaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaczldhkctTdeTdhgdgZdgZdgZdjtdgZdgZdjvdeTdjsdjsdjBdjsdjEdjGdjHdjIdiMdhUdhVdhWdixdhudhudixdljdlkdixdlldhucYHcYHcYHcYHcYHcYHcYHdjfbusdjhcYHcYHdcEdmGaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjecBdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaafaafaafaafcUrdhkcoVdeTdijdeTdeTdeUdjOdeUdhfdeTdeTdjPdjsdjQdjSdmkdjTdjUdjVdjTdivcVWdiYdhudhvdhwdhxdkkdhydhxdhAdkndhBdhCdhDdhEdhFdhGdhBdgWdgXdgYdmFdjidjkdmGaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaacUrcUrdhkdiMdktdkudlcdkwdkxdjsdjzdkAdmpdkBdjsdjsdlbdjWdkjdiMdjTdjTdiMdfkcUKdiYdhudiZdkEdkFdkkdhydkGdkIdiZdhBdiddiedifdigdihdhBdhHdhJdhLdjldjmdnMdmGaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhjdhjdhjdhjdhjdhjdhjdhjdhjdhjdhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaacUrcBbdhkdiMdkUdkVdkWdkXdkxdjsdkYdjsdjsdjsdjsdjsdjsdkZdladjudjsdjsdkCdbKcUKdlddixdiydiBdiAdkkdhydjRdiCdhxdiDdiEdiFdiGdiHdiIdhBdjodjpdjqdjrdjJdmGdmGaaaaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11457,15 +11457,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrdkTdmddiMdmOdmfdmOdmgdjsdjsdkYdmidiRdlxdmjdlUdjsdmkdmldmmdmndmodmOdmqcUKdlidhudhxdmrdmtdmudmvdmwdmxdjYdjXdjYdjYdjZdkadkbdkcdkddkbdkbdkedkfdkgdkhdkiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrcAYdjjdkldlDdmydlDdlDdmzdmAdmBdmAdmAdmAdmAdmCdmDdmVdmldmWdmYdmodmOdfkcUKdmsdlEdlFdlGdlJdlKdlLdlYdlZdkHdmEdkJdkHdkKdkLdkMdkNdkOdkNdkNdkPdkQdkRdkSdkiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUrcUrcUrcUrcUrcUrcUrdmediMdiMdkrdksdnJdnKdmZdoodoqdoudoudnLdmhdoxdoydozdoAdoAdlHdmOdfkdncdowdixdixdmUdixdixdixdixdmXdixdixdixdlmdixdlndixdlodlpdlqdhxdnadhxdnbdixdjAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHbusdmKdmLdmMdiMdmNdmOdmOdmPdmQdiMdiMdiMdiMdiMdiMdiMdiMdiMdmOdmOdmOdmRdmSdcLdmTdnednhdnhdnxdnhdnydnDdnednednednednEdnFdnGdixdnHdnHdnIdnNdnOdhxdordosdotaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdqndmKdmLdmMdiMdmNdmOdmOdmPdmQdiMdiMdiMdiMdiMdiMdiMdiMdiMdmOdmOdmOdmRdmSdcLdmTdnednhdnhdnxdnhdnydnDdnednednednednEdnFdnGdixdnHdnHdnIdnNdnOdhxdordosdotaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdrgdrgdrgdnidnidmKdnjdnkdnkdnldnkdnmdnndnodnpdnqdnrdnsdntdnudnvdnwdpNdpOdnzdnAdnBdfkcUKdVAdnedovdovdoCdoDdpkdoFdnedpcdpcdnedixdixdixdixdixdixdixdixdmadixdixdixdjAaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdnPdnQdnRdnRdnSdmIdnTdnUdnVdnWdnXdnYdnZdoadobdocdoddoedofdogdohdoidojdokdoldomdomdomdondqodopdnednednedpedpfdpgdphdpidpjdsRdnedpldpmdpndpodppdpqdprdnedpsdcGdpLdpMdpPaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdoGdoHdoHecTdoJdmcdoLdoMdoNdoOdoPdoQdoRdoPdoPdoOdoSdoTdoUdoVdoWdoXdoYdoZdpadpbdoYdfkcUKdpddnedpQdpRdpUdqkdqldqmdnedoEdoEdnedqndqpdpqdqqdqrdqsdqtdnedqudqvdcGdqwdpPaafaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdoGdoHdoHecTdoJdmcdoLdoMdoNdoOdoPdoQdoRdoPdoPdoOdoSdoTdoUdoVdoWdoXdoYdoZdpadpbdoYdfkcUKdpddnedpQdpRdpUdqkdqldqmdnedoEdoEdnedqOdqpdpqdqqdqrdqsdqtdnedqudqvdcGdqwdpPaafaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdptdoHdoHdoIdoJdmcdoLdpudpvdoOdpwdpxdpydpzdpAdoOdpBdpBdpCdpBdpDdpEdpFdpGdpFdpHdpIdpJcUKdpKdnednednednedqxdnednhdnednednednedqydqzdpqdsbdqAdpqdqtdnedqBdcGcZScZScZScZSaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdpSdoKdpTdpTdnSdmIdmKdpVdpudpWdoPdpXdpYdpZdpXdpXdqadqbdqcdqddqcdqedpEdqfdqgdqhdpFdqidfkcUKdqjdqCdqSdqTdqUdqVdqWdqXdqYdqZdradrbdrcdrddredrfdrydrydrydrzdrAdrBdhhdrCdrDdpPaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdqDdqDdqDdnidnidmKdqEdpudqFdoPdqGdqHdqIdqJdqKdoOdqLdqMdqNdqcdqOdpEdqPdqQdqRdpFdqidfkdsLdqjdqCdqSdrEdpqdpqdrFdrGdrGdrHdrGdrIdrJdrKdrGdrLdrGdrMdscdnedsddsedsfdcGdsgdpPaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHbxSdmKdrhdridrjdoOdrkdrldrmdrndrodoOdrpdrqdrrdqcdrsdpEdrtdrudrvdrwdrxdfkdtrdtsdsidsjdskdsldsmdrGdrGdsndnDdpqdsodnednednedspdnednednednedsEdsFdhhdsGdsHdpPaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmKdmKdmKdmKdmKdmKdmKdrNdrOdpWdoPdrPdrQdrRdrSdrTdoOdrUdqcdrVdrWdrXdpEdrYdrZdsadpFdqidfkcUKdXTdsIdsJdsKdsMdsNdrGdrGdsndpqdpqdsOdsPdnedpqdsQdshdnedsSdnedtkdtldhhdhhcZScZSaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdqDdqDdqDdnidnidmKdqEdpudqFdoPdqGdqHdqIdqJdqKdoOdqLdqMdqNdqcdqPdpEdrsdqQdqRdpFdqidfkdsLdqjdqCdqSdrEdpqdpqdrFdrGdrGdrHdrGdrIdrJdrKdrGdrLdrGdrMdscdnedsddsedsfdcGdsgdpPaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdrtdmKdrhdridrjdoOdrkdrldrmdrndrodoOdrpdrqdrrdqcdrXdpEdrYdrudrvdrwdrxdfkdtrdtsdsidsjdskdsldsmdrGdrGdsndnDdpqdsodnednednedspdnednednednedsEdsFdhhdsGdsHdpPaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmKdmKdmKdmKdmKdmKdmKdrNdrOdpWdoPdrPdrQdrRdrSdrTdoOdrUdqcdrVdrWdCFdpEdCZdrZdsadpFdqidfkcUKdXTdsIdsJdsKdsMdsNdrGdrGdsndpqdpqdsOdsPdnedpqdsQdshdnedsSdnedtkdtldhhdhhcZScZSaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmKdsqdsrdqFdoPdssdpxdssdstdsudoOdsvdqcdswdqcdsxdpEdsydszdsAdpFdsBdsCcTAdsDdsIdtmdtndtodsNdrGdrGdsndpqdtpdpqdpqdnhdpmdtqdttdnedtudnedtvdFLcZSaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTdsTdsTdsTaaaaaaaaaaaaaaaaaadmKdsUdsVdoXdoOdsWdsXdsYdssdsZdtadtbdtcdtddtcdtedpEdpEdpEdpEdtfdtgdthdtidtjdtgdHddUXdUYdUZdVadrGdsndpqdpqdVbdVcdnhdVddVedVfdnedsSdnedVgdVtcZSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsTdsTdsTdsTdsTdsTdsTaaaaaaaaaaaadtgdtgdtwdtxdtydoOdoOdoPdoPdoPdoOdoOdtzdpBdpBdpBdtzdtAdtBdtCdtydtDdtCdtxdtEdtwdtFdtgdtAedledledledldtAdnednednednednednednednednednednedtHdtIdtgdtgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11647,7 +11647,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBPdBcdBcdBQdBRdBSdBTdBUdBVdBWdBXdBYdBZdCadBcdBcdCbdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBraaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaadBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaadaadaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdCcdCcdCcdCcdCcdCcdAVdAVdAVdAVdAVdAVdAVdBcdBcdBcdBIdBJdBKdBLdCddBLdCedBmdBNdBcdBcdBcdAVdAVdAVdAVdAVdAVdAVdCfdCfdCfdCfdCfdCfdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaagaafaaaaafaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdBGdBHdBudAVdAVdAVdAVdAVdAVdCgdChdChdChdChdCidCjdCkdCldCmdCcdAVdAVdAVdAVdAVdCndCodCodCpdCpdCqdCrdCsdBLdBLdBLdBAdCtdCudBcdBcdAVdAVdAVdAVdAVdAVdAVdAVdCfdCvdCwdCxdCydCzdCAdCAdCAdCAdCBdAVdAVdAVdAVdAVdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdBDdBOdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdCDdAVdCEdCEdCEdCgdCFdCGdCHdCIdCJdCldCldCldCKdCcdAVdAVdAVdAVdAVdCLdAVdAVdBcdBcdBcdCMdCNdCOdDvdCOdCQdCRdBcdBcdBcdAVdAVdAVdAVdAVdAVdAVdAVdCfdCSdCTdCUdCUdCVdCWdCXdCYdCZdCBdDadDadDadAVdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdCDdAVdCEdCEdCEdCgdFMdCGdCHdCIdCJdCldCldCldCKdCcdAVdAVdAVdAVdAVdCLdAVdAVdBcdBcdBcdCMdCNdCOdDvdCOdCQdCRdBcdBcdBcdAVdAVdAVdAVdAVdAVdAVdAVdCfdCSdCTdCUdCUdCVdCWdCXdCYdFYdCBdDadDadDadAVdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdDbdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdDcdDddDddDddDedDddDddDddDedDddDddDddDedDddDddDddDedDddDddDddDedDddDddDfdDgdDhdDidDjdDkdDldDmdDndDodDpdDqdDrdDsdDtdCcaaaaaaaaaaaaaaadDuaaaaaadBcdBcdBcdBjdIqdDwdDxdDydDzdBedBcdBcdBcaaaaaadDAaaaaaaaaaaaaaaadCfdDBdDCdDDdDDdDEdDFdDGdDHdDIdDJdDKdDLdDMdDNdDOdDPdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDQdDRdDSdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdCCdAVdAVdAVdAVdCEdDTdDUdDVdDWdDXdDYdCIdDZdCldEadEbdCcdCcaaaaaaaaaaaaaaadDuaaaaaaaaaaaadBcdBcdBcdBcdEcdBcdBcdBcdBcaaaaaaaaaaaadDAaaaaaaaaaaaaaaadCfdCfdEddEedCUdEfdCWdEgdEhdEidEjdEkdEldDadAVdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdEmdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEnaaaaaaaaadEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdEodBudAVdBGdEodBudAVdBGdEodBudAVdBGdEodBudAVdBGdEodBudAVdAVdAVdAVdAVdAVdCgdChdChdChdCcdEpdEqdCcdCcdCcaaaaaaaaaaaaaaaaaadCLdAVdAVdAVdErdErdErdErdBcdEsdEtdEudErdErdErdAVdAVdAVdAVaaaaaaaaaaaaaaaaaadCfdCfdCfdEvdEwdCfdCAdCAdCAdCBdAVdAVdAVdAVdAVdAVdBDdExdBFdAVdBDdExdBFdAVdBDdExdBFdAVdBDdExdBFdAVdBDdExdBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11657,7 +11657,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdFcdBudAVdBGdFcdBudAVdBGdFcdBudAVdBGdFcdBudAVdBGdFcdBudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdEUdFddCcaaaaaaaaadAVdAVdAVdAVdAVdCLdAVdAVdAVdErdFedESdErdFfdFgdFhdErdFidFjdErdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaadCfdFkdFbdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBDdFldBFdAVdBDdFldBFdAVdBDdFldBFdAVdBDdFldBFdAVdBDdFldBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaabcaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFmdFndFoaaaaaaaaadAVdAVdAVdAVdAVdCLdAVdAVdFpdFpdFqdFpdFpdErdFrdErdFsdFsdFtdFsdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaadFudFvdFwdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEnedxdEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFxdFydFoaaaaaadAVdAVdAVdAVdAVdAVdCLdAVdFpdFpdFzdFAdFBdFpdFCdFDdFEdFsdFFdFGdFHdFsdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaadFudFIdFJdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFKdVudFoaaaaaadAVdAVdAVdAVdAVdAVdCLdAVdFpdFMdFNdFOdFPdFQdFRdFSdFTdFUdFVdFWdFXdFYdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaadFudFZdGadCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFKdVudFoaaaaaadAVdAVdAVdAVdAVdAVdCLdAVdFpdOgdFNdFOdFPdFQdFRdFSdFTdFUdFVdFWdFXdOJdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaadFudFZdGadCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGbecCdCcaaaaaadGddGedGfdGedGgdGgdGhdGgdGgdGidGjdGkdGldFpdGmdGndGmdFsdGodGpdGqdGrdGsdGtdGudGtdGsdGvdGwdGvdGxaaaaaadCfecDdGzdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGAdCldCcaaaaaadGddGBdGCdGDdGEedAedzedBdGgdFpdFpdFpdGIdGJdGKdGLdGMdGNdGOdFsdFsdFsdGsdGPdGQdGRdGSdGTdGUdGVdGxaaaaaadCfdCUdGWdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGXdGYdCcaaaaaadGddGZdHadHbdGEdeoedCedEdGgdHfdHgdHgdHhdHgdHgdHidHgdHgdHjdHgdHgdHkdGsdHldHmdHndGSdHodHpdHqdGxaaaaaadCfdHrdHsdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11672,18 +11672,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdMxdMxdMxdMxdMxdMydMzdKHdMAdMBdMCdMDdMDdMEdKLdMFdMGdMHdKKdMIdMJdMKdMLdMMdMNdMNdMNdMOdMPdMQdMNdMRdKWdMSdMTdMUdKVdMVdMWdMXdLaaaaaaadMYdMZdNadMYdMYdMYdMYdMYdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNcdKHdKHdKHdKHdKHdKHdKHdKKdKKdKKdKKdKKdNddNedNfdVBdNhdNhdNidNjdNkdNldNmdNndNodKWdKWdKWdKWdKWdLadLadLadLaaaaaaadMYdNpdNqdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNrdNsdMxaaaaaadNtdNudNvdNwdNxdNydNzdNAdNtdNBdNCdNDdNEdNFdNGdNHdNGdNEdNEdNDdNIdNJdNKdNLdNMdNNdNOdNKdNPdNQdNKaaaaaadMYdNRdNSdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNTdMxaaaaaadNtdNUdNVdNWdNXdNYdNZdOadNtdObdOcdIedOddOedHBdHAdHBdOfdOgdIedOhdOidNKdOjdOkdOldOmdOndOodOpdNKaaaaaadMYdOqdOrdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdOsdOtaaaaaadOudNydOvdOwdOxdOydOzdOAdOBdOCdODdOEdOddOFdOGdOHdOIdHBdOJdOKdOLdOMdONdOOdOPdOQdORdNKdOSdOTdNKaaaaaadOUdOVdOWdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdNTdMxaaaaaadNtdNUdNVdNWdNXdNYdNZdOadNtdObdOcdIedOddOedHBdHAdHBdOfdRfdIedOhdOidNKdOjdOkdOldOmdOndOodOpdNKaaaaaadMYdOqdOrdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdNbdOsdOtaaaaaadOudNydOvdOwdOxdOydOzdOAdOBdOCdODdOEdOddOFdOGdOHdOIdHBdRgdOKdOLdOMdONdOOdOPdOQdORdNKdOSdOTdNKaaaaaadOUdOVdOWdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdOXdOYdOtaaaaaaecEdPadPbdPcdPddPcdPedPfdNtdPgdPhdIedPidPjdPkdPldPmdPndPodIedPpdPqdNKdNKdNKdPrdNKdNKdNKdNKdNKaaaaaadOUdPsdPtdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudPvdOtaaaaaadPwdPxdNydNydPydNydNydPzdNtdObdOcdPAdPAdPAdPBdPCdPDdPAdPAdPAdOhdOidNKdPEdPFdPGdPHdPIdUWdPKdNKaaaaaadOUdPLdPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdPOdPPdAVdPNdPOdPPdAVdPNdPOdPPdAVdPNdPOdPPdAVdPNdPOdPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudPQdMxaaaaaadPRdPSdPTdNydPUdPVdPWdPXdPYdPZdQadQbdQcdQddQedQfdQgdQhdQidQjdQkdQldQmdQndQodQpdQqdQrdQsdQtdNKaaaaaadMYdQudPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQwdQxdAVdQvdQwdQxdAVdQvdQwdQxdAVdQvdQwdQxdAVdQvdQwdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafabcaafaaaaaaaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudQzdMxdMxdNtdNtdNtdQAdQBdQCdQBdQAdNtdNtdQDdQEdQFdQGdQHdQGdQIdQGdQHdQGdQGdQJdQKdNKdNKdQLdQMdQNdQOdQPdQQdNKdNKdMYdMYdQRdPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudNTdQTdQUdNtdQVdQWdQXdQYdPUdNydNydQZdRadRbdRcdRddRedRgdRfdRhdRidRjdRkdRldRmdRndRodRpdRqdRrdRsdRtdRudQrdRvdNKdRwdRxdRydPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudNTdQTdQUdNtdQVdQWdQXdQYdPUdNydNydQZdRadRbdRcdRddRedRidRjdRhdSadScdRkdRldRmdRndRodRpdRqdRrdRsdRtdRudQrdRvdNKdRwdRxdRydPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudNTdNTdNTdRzdNydRAdRBdRCdRDdREdRFdNtdRGdRHdRIdRJdRIdRIdRIdRJdRIdRIdRIdRIdRIdRHdRKdNKdRLdQrdQqdRMdQrdQrdRNdNKdROdRPdRQdPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdRRdRSdRSdRSdMxdRTdMzdMzdMzdNtdRUdRVdRWdNydRXdRVdRYdRZdScdSbdSadSddSedRIdRIdSfdRIdRIdSgdShdSkdSjdSidSldSmdQrdSndSodOkdQrdSpdNKdMZdMZdMZdSqdMYdSrdSrdSrdSsdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSvdSwdSxdSydSzdSAdSBdSCdSDdSEdSFdNtdNtdSGdSHdSIdSJdSGdNtdNtdSKdSLdSMdPAdSNdSOdSPdSQdSRdSSdSTdPAdSUdSVdSWdNKdNKdSXdSYdSZdOkdTadNKdNKdTbdTcdVvdTedTfdTgdThdTidTjdTkdTldTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdRRdRSdRSdRSdMxdRTdMzdMzdMzdNtdRUdRVdRWdNydRXdRVdRYdRZdSidSbdSkdSddSedRIdRIdSfdRIdRIdSgdShdSPdSjdSRdSldSmdQrdSndSodOkdQrdSpdNKdMZdMZdMZdSqdMYdSrdSrdSrdSsdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSvdSwdSxdSydSzdSAdSBdSCdSDdSEdSFdNtdNtdSGdSHdSIdSJdSGdNtdNtdSKdSLdSMdPAdSNdSOdUkdSQdUzdSSdSTdPAdSUdSVdSWdNKdNKdSXdSYdSZdOkdTadNKdNKdTbdTcdVvdTedTfdTgdThdTidTjdTkdTldTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdTodTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTrdTsdTtdTudTvdTwdTxdTydTzdTAdTBdTCdTCdTDdTEdNtdNtdTFdTGdTHdTIdPRaaaaaaaaaaaadTJdPAdSKdTKdTLdTMdSMdPAdPAaaaaaaaaaaaadTNdTOdTPdTQdTRdNKdNKdTSdTTdTUdTVdTWdTXdTYdTZdUadUbdUcdUddUedUfdUgdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUjdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSudSudRRdUkdUldUmdSBdUndNTdNTdUodUpdMxdUqdUrdUrdUrdUrdUsdAVdAVdAVdAVdAVdUqdUrdUrdUrdUrdUrdUsdUtdAVdAVdAVdAVdUqdUrdUrdUrdUrdUsdMYdUudUvdUvdUvdUwdTfdUxdUydUzdSsdTmdTmdTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSudSudRRdWEdUldUmdSBdUndNTdNTdUodUpdMxdUqdUrdUrdUrdUrdUsdAVdAVdAVdAVdAVdUqdUrdUrdUrdUrdUrdUsdUtdAVdAVdAVdAVdUqdUrdUrdUrdUrdUsdMYdUudUvdUvdUvdUwdTfdUxdUydWXdSsdTmdTmdTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaagaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdAVdAVdAVdAVdAVdRRdRSdRSdRSdRSdUBdUCdUDdUEdUFdMxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMYdUGdUvdUHdUIdUJdSrdSrdSrdSrdSsdAVdAVdAVdAVdAVdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdMxdMxdMxdMxdMxdMxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMYdMYdMYdMYdMYdMYdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaadaadabcaadaadaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/southern_cross/southern_cross-4.dmm b/maps/southern_cross/southern_cross-4.dmm index 869946b07f..bafb677edf 100644 --- a/maps/southern_cross/southern_cross-4.dmm +++ b/maps/southern_cross/southern_cross-4.dmm @@ -190,7 +190,7 @@ "dH" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/effect/floor_decal/industrial/warning/full,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/surface/outpost/research/xenoarcheology/anomaly) "dI" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/button/remote/blast_door{id = "xenoarch_cell2"; name = "Cell 2"; pixel_x = 26; pixel_y = 0},/turf/simulated/floor/tiled,/area/surface/outpost/research/xenoarcheology/anomaly) "dJ" = (/obj/structure/table/steel,/obj/effect/floor_decal/industrial/warning/dust{icon_state = "warning_dust"; dir = 1},/obj/machinery/cell_charger,/obj/item/weapon/cell/high,/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave) -"dK" = (/obj/machinery/computer/crew,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/medical) +"dK" = (/obj/machinery/computer/crew{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/medical) "dL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/table/glass,/obj/machinery/recharger,/obj/item/device/defib_kit/loaded,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenoarch First-Aid"; dir = 1},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/medical) "dM" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/o2{pixel_x = 0; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled/white,/area/surface/outpost/research/xenoarcheology/medical) "dN" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/surface/outpost/research/xenoarcheology/medical) @@ -439,7 +439,7 @@ "iz" = (/obj/effect/floor_decal/industrial/warning/dust,/obj/structure/ore_box,/turf/simulated/floor/tiled/asteroid_steel,/area/surface/outpost/mining_main/cave) "iA" = (/obj/effect/step_trigger/teleporter/mine/from_mining,/turf/simulated/mineral/floor/ignore_mapgen/sif,/area/surface/cave/explored/normal) "iB" = (/obj/effect/step_trigger/teleporter/mine/from_mining,/turf/simulated/floor/water{outdoors = 0},/area/surface/cave/explored/normal) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxcwcwcwcxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyczczczaaaaaaaaaaaaaaaaaa aaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcxcXcZcYcxababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacdsdsdsababababababababaa @@ -697,4 +697,3 @@ adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae adaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeipafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegLgLgLaeaeaeaeaeaeaeaead adadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadieiAiAiAadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadiBiBiBadadadadadadadadad "} - diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm index 7911103f8d..e114a34a58 100644 --- a/maps/southern_cross/southern_cross-6.dmm +++ b/maps/southern_cross/southern_cross-6.dmm @@ -1,2540 +1,2540 @@ -"aa" = (/turf/space,/area/space) -"ab" = (/turf/unsimulated/wall,/area/space) -"ac" = (/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) -"ad" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/wall,/area/space) -"ae" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) -"af" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) -"ag" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) -"ah" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"ai" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aj" = (/obj/structure/table/rack/holorack,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/head/pin/flower,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) -"ak" = (/obj/effect/landmark/costume,/obj/structure/table/rack/holorack,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) -"al" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"am" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"an" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) -"ao" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife) -"ap" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_plating) -"aq" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"ar" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"as" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"at" = (/obj/structure/flora/ausbushes/fullgrass,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"au" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"av" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) -"aw" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) -"ax" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) -"ay" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"az" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aA" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) -"aB" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"aC" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aD" = (/obj/effect/landmark{name = "Holocarp Spawn"},/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife) -"aE" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"aF" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"aG" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"aH" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood/corner,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aI" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aJ" = (/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"aK" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aL" = (/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) -"aM" = (/obj/effect/floor_decal/carpet{dir = 5},/obj/effect/floor_decal/carpet{dir = 6},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"aN" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"aO" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) -"aP" = (/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"aQ" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"aR" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 4; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) -"aS" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) -"aT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/holostool,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) -"aU" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) -"aV" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"aW" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"aX" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"aY" = (/obj/machinery/door/window/holowindoor{dir = 1},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"aZ" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"ba" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bb" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 6},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bc" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bd" = (/obj/structure/bed/chair/holochair,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"be" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"bf" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"bg" = (/obj/structure/bed/chair/holochair,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"bh" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bi" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bj" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) -"bk" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) -"bl" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bm" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bn" = (/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bo" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bp" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bq" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"br" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bs" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bt" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bu" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bv" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bw" = (/obj/structure/table/woodentable/holotable,/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bx" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"by" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bz" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bA" = (/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"bB" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"bC" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"bD" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"bE" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 9},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bF" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bG" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bH" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 4},/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"bI" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bJ" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bK" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bL" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bM" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 4},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bN" = (/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bO" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bP" = (/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bQ" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bR" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bS" = (/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bT" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) -"bU" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bV" = (/obj/structure/flora/ausbushes/fullgrass,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bW" = (/obj/effect/floor_decal/carpet,/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bX" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) -"bY" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/machinery/door/window/holowindoor{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"bZ" = (/obj/machinery/door/window/holowindoor{dir = 4; name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) -"ca" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"cb" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"cc" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"cd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) -"ce" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) -"cf" = (/turf/simulated/floor/holofloor/space,/area/holodeck/source_space) -"cg" = (/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) -"ch" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) -"ci" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) -"cj" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"ck" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cl" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"cm" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cn" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"co" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cp" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) -"cq" = (/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) -"cr" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"cs" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"ct" = (/obj/machinery/door/window/holowindoor{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) -"cu" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"cv" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"cw" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) -"cx" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"cy" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"cz" = (/obj/effect/landmark{name = "Holocarp Spawn Random"},/turf/simulated/floor/holofloor/space,/area/holodeck/source_space) -"cA" = (/obj/structure/flora/grass/both,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) -"cB" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) -"cC" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cD" = (/obj/effect/floor_decal/corner/green{dir = 5},/obj/structure/holohoop,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cE" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cF" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cG" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"cH" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) -"cI" = (/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"cJ" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"cK" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"cL" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"cM" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) -"cN" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) -"cO" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"cP" = (/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) -"cQ" = (/obj/effect/overlay/palmtree_l,/obj/effect/overlay/coconut,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) -"cR" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"cS" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 2; icon_state = "right"; name = "Red Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"cT" = (/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"cU" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) -"cV" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) -"cW" = (/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) -"cX" = (/obj/effect/floor_decal/carpet{dir = 5},/obj/effect/floor_decal/carpet{dir = 6},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"cY" = (/obj/item/weapon/beach_ball,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) -"cZ" = (/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"da" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"db" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dc" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dd" = (/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"de" = (/obj/structure/flora/grass/green,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) -"df" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dg" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/under/color/green,/obj/item/clothing/suit/armor/tdome/green,/obj/item/weapon/holo/esword/green,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dh" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"di" = (/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dj" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dk" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) -"dl" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dm" = (/obj/item/weapon/inflatable_duck,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) -"dn" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"do" = (/obj/effect/floor_decal/spline/plain{dir = 5},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) -"dp" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dq" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dr" = (/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"ds" = (/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dt" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"du" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dv" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dw" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dx" = (/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dy" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dz" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dA" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dB" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dC" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 4; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) -"dD" = (/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dE" = (/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dF" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dG" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dH" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 4; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) -"dI" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dJ" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dK" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) -"dL" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) -"dM" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dN" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dO" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dP" = (/turf/unsimulated/beach/sand{icon_state = "beach"},/area/holodeck/source_beach) -"dQ" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"dR" = (/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"dS" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Green Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"dT" = (/obj/effect/floor_decal/corner/green/full,/obj/structure/window/reinforced/holowindow/disappearing{dir = 2},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dU" = (/obj/effect/floor_decal/corner/green{dir = 10},/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dV" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"dW" = (/turf/simulated/floor/holofloor/beach/water,/area/holodeck/source_beach) -"dX" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dY" = (/obj/item/weapon/beach_ball/holoball,/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"dZ" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"ea" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/obj/structure/table/holotable,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"eb" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"ec" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"ed" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove{icon_state = "boxinggreen"; item_state = "boxinggreen"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"ee" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) -"ef" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) -"eg" = (/obj/structure/table/rack,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"eh" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Weapon Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ei" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ej" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ek" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/rocket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"el" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"em" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"en" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"eo" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ep" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"eq" = (/obj/structure/table/rack,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"er" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"es" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"et" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"eu" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"ev" = (/obj/machinery/deployable/barrier,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ew" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ex" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ey" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/ionrifle,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ez" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/ionrifle/pistol,/obj/item/weapon/gun/energy/ionrifle/pistol,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eA" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eB" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eC" = (/obj/machinery/teleport/hub,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eD" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eE" = (/obj/machinery/mech_recharger,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eF" = (/obj/machinery/mech_recharger,/obj/mecha/combat/gygax/dark,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eG" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eH" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eI" = (/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eJ" = (/obj/structure/table/steel_reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eK" = (/obj/structure/table/steel_reinforced,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eL" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eM" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"eN" = (/obj/item/weapon/bikehorn/rubberducky,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"eO" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/curtain/open/shower,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"eP" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Armor Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"eQ" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/launcher/grenade,/obj/item/weapon/gun/launcher/grenade,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eR" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eS" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eT" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eU" = (/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eV" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/taser,/obj/item/weapon/gun/energy/taser,/obj/item/weapon/gun/energy/taser,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eX" = (/obj/structure/closet/wardrobe/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eY" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"eZ" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fa" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fb" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fc" = (/obj/structure/table/standard,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/random/soap,/obj/random/soap,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fd" = (/obj/structure/urinal{pixel_y = 32},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fe" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/window/reinforced/tinted,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"ff" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fg" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/curtain/open/shower,/obj/structure/window/reinforced/tinted,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fh" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fi" = (/obj/structure/table/steel_reinforced,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fj" = (/obj/item/mecha_parts/mecha_equipment/teleporter,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fk" = (/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fl" = (/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fm" = (/obj/structure/table/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fn" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/emps{pixel_x = 4; pixel_y = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/box/frags,/obj/item/weapon/storage/box/smokes,/obj/item/weapon/storage/box/smokes,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fo" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fp" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fq" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fr" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fs" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ft" = (/obj/structure/table/reinforced,/obj/item/weapon/shield_diffuser,/obj/item/weapon/shield_diffuser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/shield_diffuser,/obj/item/weapon/shield_diffuser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fv" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"fw" = (/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fx" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fz" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fA" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) -"fB" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fC" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fD" = (/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,/obj/item/mecha_parts/mecha_equipment/tool/rcd,/obj/item/weapon/pickaxe/diamonddrill,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fE" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fF" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fG" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fH" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fI" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fJ" = (/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fK" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fL" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fM" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fN" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"fO" = (/obj/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fP" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fQ" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fR" = (/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"fS" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/flash,/obj/item/ammo_magazine/m45/flash,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fT" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fU" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fV" = (/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fW" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fX" = (/obj/structure/table/rack,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"fZ" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ga" = (/obj/machinery/door/airlock/centcom{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gb" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gc" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"gd" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"ge" = (/obj/structure/sign/warning/secure_area/armory,/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) -"gf" = (/obj/structure/sign/warning/secure_area,/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) -"gg" = (/obj/effect/floor_decal/corner/red{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gh" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gi" = (/obj/effect/floor_decal/corner/red{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gj" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gk" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gl" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gm" = (/obj/structure/table/rack,/obj/item/device/lightreplacer,/obj/item/device/lightreplacer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gn" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"go" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/centcomm,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gp" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gq" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gr" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gs" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) -"gt" = (/obj/effect/floor_decal/corner/yellow,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gu" = (/obj/effect/floor_decal/corner/yellow{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gv" = (/obj/effect/floor_decal/corner/yellow{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gw" = (/obj/effect/floor_decal/corner/white,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gx" = (/obj/effect/floor_decal/corner/white{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gy" = (/obj/effect/floor_decal/corner/white{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gz" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gA" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gB" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gC" = (/obj/structure/table/rack,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gD" = (/obj/item/weapon/mop,/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gE" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket{amount_per_transfer_from_this = 50},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gF" = (/obj/structure/sign/greencross{desc = "White cross in a green field, you can get medical aid here."; name = "First-Aid"},/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) -"gG" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"gH" = (/turf/simulated/shuttle/wall/dark/no_join,/area/centcom/specops) -"gI" = (/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gJ" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gK" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gL" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gM" = (/obj/machinery/vending/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gN" = (/obj/structure/table/rack,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gO" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gP" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/pillbottles,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gQ" = (/obj/machinery/chemical_dispenser/full,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gR" = (/obj/machinery/chem_master,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gS" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gT" = (/obj/machinery/vending/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gU" = (/obj/item/clothing/glasses/hud/health{pixel_x = 4; pixel_y = 4},/obj/item/clothing/glasses/hud/health{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gV" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gW" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gX" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"gY" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"gZ" = (/turf/simulated/shuttle/wall/dark{join_group = "shuttle_ert"},/area/shuttle/response_ship/start) -"ha" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hb" = (/obj/structure/closet/crate/medical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"hc" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"hd" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/weapon/rig/ert/medical,/obj/item/weapon/rig/ert/medical,/obj/item/weapon/rig/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"he" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hg" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hh" = (/obj/structure/closet/crate/internals{name = "Mask Crate"},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hi" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hj" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"hk" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/response_ship/start) -"hl" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("NETWORK_ERT"); pixel_y = 26},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hm" = (/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hn" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"ho" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/structure/bed/chair,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hp" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/obj/machinery/light{dir = 4},/obj/structure/bed/chair,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hq" = (/turf/simulated/shuttle/wall/dark{hard_corner = 1; join_group = "shuttle_ert"},/area/shuttle/response_ship/start) -"hr" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hs" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ht" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/response_ship/start) -"hu" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hv" = (/obj/machinery/computer/shuttle_control/web/ert{icon_state = "flightcomp_center"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hw" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "response_shuttle_door"},/obj/effect/shuttle_landmark{base_area = /area/centcom/specops; base_turf = /turf/simulated/floor/plating; docking_controller = "response_base"; landmark_tag = "response_ship_start"; name = "ERT Shuttle Bay"},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hy" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_shuttle_door"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hz" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_base_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"hA" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_base"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "response_base_door"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"hB" = (/obj/structure/reagent_dispensers/watertank,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hC" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hD" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hE" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hF" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hG" = (/obj/structure/table/reinforced,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/tool/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hI" = (/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hJ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hK" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hL" = (/obj/structure/table/rack,/obj/item/rig_module/device/rcd,/obj/item/rig_module/device/rcd,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/plasmacutter,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hM" = (/obj/structure/table/rack,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/healthscanner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hN" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/egun,/obj/item/rig_module/mounted/egun,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hO" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hP" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hQ" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hR" = (/turf/unsimulated/wall,/area/ai_multicam_room) -"hS" = (/obj/structure/flight_right{icon_state = "right"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hU" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hV" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"hW" = (/obj/structure/reagent_dispensers/fueltank,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hX" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hY" = (/obj/structure/table/steel_reinforced,/obj/item/taperoll/atmos,/obj/item/taperoll/atmos,/obj/item/taperoll/atmos,/obj/item/weapon/pickaxe/drill,/obj/item/weapon/pickaxe/drill,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"hZ" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ia" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ib" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/spaceacillin,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ic" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"id" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/obj/item/weapon/autopsy_scanner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ie" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"if" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ig" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ih" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"ii" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ij" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ik" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"il" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"im" = (/obj/structure/table/reinforced,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"in" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/specops) -"io" = (/obj/machinery/shield_gen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ip" = (/obj/machinery/shield_gen/external,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iq" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ir" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"is" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"it" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iu" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iv" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/bodybags,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"ix" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iy" = (/obj/machinery/shield_capacitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iz" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iA" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iB" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/combat{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/combat,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iC" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/toxin,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iE" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/adv{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iF" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/o2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iG" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/clotting{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/clotting,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iI" = (/obj/structure/table/reinforced,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iJ" = (/obj/structure/table/rack,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/drill,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iK" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iL" = (/obj/structure/table/rack,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/grenade_launcher,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iM" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"iN" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"iO" = (/obj/structure/table/reinforced,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iP" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iQ" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"iR" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) -"iS" = (/obj/structure/sign/warning/docking_area,/turf/unsimulated/wall,/area/centcom/command) -"iT" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) -"iU" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"iV" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"iW" = (/turf/unsimulated/wall,/area/centcom/command) -"iX" = (/turf/unsimulated/wall,/area/centcom/suppy) -"iY" = (/turf/simulated/shuttle/wall,/area/centcom/evac) -"iZ" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/evac) -"ja" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/suppy) -"jb" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/centcom) -"jc" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod2/centcom) -"jd" = (/turf/simulated/shuttle/wall,/area/shuttle/supply) -"je" = (/turf/unsimulated/wall,/area/centcom/main_hall) -"jf" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/wall/dark/no_join,/area/shuttle/supply) -"jg" = (/turf/unsimulated/wall,/area/tdome) -"jh" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall) -"ji" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"jj" = (/turf/unsimulated/wall,/area/centcom/creed) -"jk" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/creed) -"jl" = (/turf/simulated/shuttle/floor,/area/shuttle/supply) -"jm" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/supply) -"jn" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/supply) -"jo" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"jp" = (/obj/structure/closet/secure_closet/hydroponics,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"jq" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"jr" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/bar) -"js" = (/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/command) -"jt" = (/turf/unsimulated/ai_visible,/area/ai_multicam_room) -"ju" = (/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"jv" = (/obj/structure/table/rack,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"jw" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod1/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/centcom) -"jx" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod2/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod2/centcom) -"jy" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"jz" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"jA" = (/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"jB" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"jC" = (/obj/machinery/chem_master/condimaster,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"jD" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"jE" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jF" = (/obj/structure/bed/chair/comfy/teal,/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jG" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jH" = (/obj/structure/table/wooden_reinforced,/obj/machinery/computer/security/telescreen{name = "Spec. Ops. Monitor"; network = list("ERT")},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"jI" = (/obj/structure/bed/chair/office/dark,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"jJ" = (/obj/item/device/radio/intercom/specops{pixel_y = -21},/obj/machinery/computer/communications{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) -"jK" = (/obj/structure/closet/secure_closet/hos,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"jL" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/floor,/area/shuttle/supply) -"jM" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating/airless,/area/centcom/evac) -"jN" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 1"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"jO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 2"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"jP" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"jQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"jR" = (/obj/structure/closet/chefcloset,/obj/item/glass_jar,/obj/item/device/retail_scanner/civilian,/obj/item/weapon/soap/nanotrasen,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"jS" = (/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"jT" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"jU" = (/obj/structure/bed/chair/comfy/teal{dir = 4},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jV" = (/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jW" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/bananapeel,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jX" = (/obj/structure/bed/chair/comfy/teal{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"jY" = (/obj/structure/table/wooden_reinforced,/obj/machinery/button/remote/blast_door{name = "Spec Ops Ready Room"; pixel_y = 15; req_access = list(11); id = "CREED"},/obj/machinery/button/remote/blast_door{name = "Mech Storage"; icon_state = "doorctrl0"; pixel_y = 0; req_access = list(11); id = "ASSAULT"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"jZ" = (/obj/structure/table/wooden_reinforced,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"ka" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/supply) -"kb" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/shuttle/plating,/area/centcom/evac) -"kc" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/simulated/shuttle/plating,/area/centcom/evac) -"kd" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"ke" = (/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"kf" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_1_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_1_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"kg" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_2_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_2_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"kh" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/plating,/area/centcom/evac) -"ki" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"kj" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/centcom/main_hall) -"kk" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/centcom/evac) -"kl" = (/turf/simulated/shuttle/plating,/area/centcom/evac) -"km" = (/obj/machinery/door/airlock/maintenance_hatch{req_access = list(101)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"kn" = (/turf/simulated/shuttle/floor,/area/centcom/evac) -"ko" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/turf/simulated/shuttle/floor,/area/centcom/evac) -"kp" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac) -"kq" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac) -"kr" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/shuttle/plating,/area/centcom/evac) -"ks" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"kt" = (/obj/machinery/door/blast/regular{id = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"ku" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome2) -"kv" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome2) -"kw" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"kx" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/melee/energy/axe,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"ky" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/command) -"kz" = (/obj/machinery/door/airlock/centcom{name = "Administrative Office"; opacity = 1; req_access = list(108)},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"kA" = (/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"kB" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"kC" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/supply) -"kD" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "supply_shuttle"; pixel_x = 25; pixel_y = 0; req_one_access = list(13,31); tag_door = "supply_shuttle_hatch"},/obj/effect/shuttle_landmark/southern_cross/supply_offsite,/turf/simulated/shuttle/floor,/area/shuttle/supply) -"kE" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/shuttle/plating,/area/centcom/evac) -"kF" = (/obj/machinery/vending/engineering,/turf/simulated/shuttle/plating,/area/centcom/evac) -"kG" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/shuttle/plating,/area/centcom/evac) -"kH" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome2) -"kI" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"kJ" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/storage/briefcase,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"kK" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/floor,/area/shuttle/supply) -"kL" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/evac) -"kM" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod7/centcom) -"kN" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod8/centcom) -"kO" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"kP" = (/obj/structure/bed/chair/comfy/teal{dir = 1},/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"kQ" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"kR" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"kS" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/supply) -"kT" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_7_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 7"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"kU" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_7_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "escape_pod_7_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"kV" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_8_recovery"; pixel_x = 26; pixel_y = -26; req_one_access = list(13); tag_door = "escape_pod_8_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"kW" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_8_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 8"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"kX" = (/obj/effect/floor_decal/carpet,/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"kY" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"kZ" = (/obj/machinery/door/window/holowindoor{dir = 4; name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) -"la" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome) -"lb" = (/obj/machinery/door/blast/regular{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"lc" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"ld" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"le" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/main_hall) -"lf" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"lg" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/command) -"lh" = (/turf/simulated/shuttle/wall/hard_corner,/area/centcom/evac) -"li" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"lj" = (/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"lk" = (/obj/machinery/igniter,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"ll" = (/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"lm" = (/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"ln" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"lo" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"lp" = (/obj/machinery/smartfridge,/turf/unsimulated/wall,/area/centcom/bar) -"lq" = (/obj/structure/closet/secure_closet/bar,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"lr" = (/obj/machinery/door/window/holowindoor{dir = 4; name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) -"ls" = (/turf/simulated/shuttle/wall,/area/shuttle/transport1/centcom) -"lt" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) -"lu" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) -"lv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/shuttle/plating,/area/centcom/evac) -"lw" = (/turf/simulated/shuttle/wall/dark/no_join,/area/centcom/evac) -"lx" = (/obj/structure/closet/secure_closet/security,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"ly" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"lz" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"lA" = (/obj/structure/table/rack,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"lB" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) -"lC" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/centcom/evac) -"lD" = (/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod2/centcom) -"lE" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"lF" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"lG" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"lH" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"lI" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"lJ" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"lK" = (/obj/effect/floor_decal/corner/red{dir = 10},/obj/structure/holohoop{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) -"lL" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/transport1/centcom) -"lM" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"lN" = (/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"lO" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) -"lP" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) -"lQ" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"lR" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"lS" = (/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"lT" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"lU" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"lV" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"lW" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"lX" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"lY" = (/obj/structure/reagent_dispensers/watertank/high,/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"lZ" = (/obj/machinery/door/airlock/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"ma" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/glass/beaker,/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mb" = (/obj/machinery/door/airlock/freezer,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"mc" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"md" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"me" = (/obj/machinery/computer/rcon,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"mf" = (/obj/machinery/computer/station_alert/all,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"mg" = (/obj/machinery/computer/power_monitor,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"mh" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"mi" = (/obj/machinery/door/airlock/external{frequency = 1380; glass = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_bay_door"; locked = 1; name = "Transport Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"mj" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mk" = (/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"ml" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mm" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mn" = (/obj/effect/landmark/ai_multicam_room,/turf/unsimulated/ai_visible,/area/ai_multicam_room) -"mo" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(1)},/turf/simulated/shuttle/plating,/area/centcom/evac) -"mp" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"mq" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"mr" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"ms" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"mt" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mu" = (/obj/machinery/biogenerator,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mv" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mw" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/fryer,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mx" = (/obj/machinery/computer/card/centcom{dir = 4},/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"my" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"mz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start) -"mA" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/transport1/centcom) -"mB" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mC" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mD" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) -"mE" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) -"mF" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "centcom_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mG" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"mH" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"mI" = (/obj/machinery/computer/pod{id = "thunderdomeaxe"; name = "Thunderdome Axe Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"mJ" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"mK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"mL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/grill,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mN" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mO" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"mP" = (/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"mQ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 26; pixel_y = 0; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"mR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start) -"mS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start) -"mT" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"mU" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/oven,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mV" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/minihoe,/obj/item/weapon/material/minihoe,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mW" = (/obj/machinery/smartfridge/drying_rack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mX" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"mY" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"mZ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"na" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 02"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"nb" = (/obj/machinery/computer/pod{id = "thunderdomehea"; name = "Thunderdome Heavy Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"nc" = (/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"nd" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"ne" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"nf" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"ng" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) -"nh" = (/obj/machinery/seed_storage/garden,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"ni" = (/obj/machinery/honey_extractor,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nj" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nk" = (/obj/machinery/computer/pod{dir = 8; id = "NTrasen"; name = "Hull Door Control"},/obj/item/device/radio/intercom/specops{pixel_y = -21},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) -"nl" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"nm" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"nn" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"no" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"np" = (/obj/machinery/computer/shuttle_control/web/shuttle2{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"nq" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"nr" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/vending/dinnerware{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"ns" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/simulated/shuttle/floor,/area/centcom/evac) -"nt" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "large_escape_pod_2_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "large_escape_pod_2_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"nu" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"nv" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{pixel_x = 1},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"nw" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"nx" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/effect/wingrille_spawn/reinforced/crescent,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"ny" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"nz" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"nA" = (/obj/machinery/camera/network/thunder{c_tag = "Thunderdome Arena"; invisibility = 101},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"nB" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"nC" = (/obj/machinery/seed_extractor,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/candy,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nF" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"nG" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"nH" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"nI" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"nJ" = (/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/mob/living/silicon/decoy{name = "A.L.I.C.E."},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"nK" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"nL" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"nM" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor,/area/centcom/evac) -"nN" = (/obj/machinery/computer/pod{id = "thunderdome"; name = "Thunderdome Blast Door Control"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"nO" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"nP" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"nQ" = (/obj/structure/table/marble,/obj/item/weapon/storage/box/glasses/square,/obj/item/weapon/storage/box/glasses/square,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nR" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/icecream_vat,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"nS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/centcom/evac) -"nT" = (/obj/machinery/computer/shuttle_control/web/shuttle1,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"nU" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1443; listening = 0; name = "Spec Ops Intercom"; pixel_y = 22},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"nV" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"nW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/obj/machinery/turretid{pixel_x = 0; pixel_y = 28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) -"nX" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/centcom/evac) -"nY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = -26; tag_door = "admin_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"nZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "large_escape_pod_1_recovery"; pixel_x = -25; pixel_y = -25; req_one_access = list(13); tag_door = "large_escape_pod_1_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"oa" = (/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"ob" = (/obj/structure/table/marble,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"oc" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"od" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"oe" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/cereal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"of" = (/obj/structure/table/reinforced,/obj/item/weapon/card/id/gold/captain/spare,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"og" = (/obj/structure/table/reinforced,/obj/item/device/pda/captain,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) -"oh" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) -"oi" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 01"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"oj" = (/obj/structure/table/standard,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"ok" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"ol" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"om" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/centcom/evac) -"on" = (/obj/structure/flora/pottedplant/stoutbush,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall) -"oo" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"op" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"oq" = (/obj/machinery/account_database{name = "CentComm Accounts database"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"or" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"os" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"ot" = (/turf/simulated/shuttle/plating,/area/shuttle/cryo/centcom) -"ou" = (/obj/structure/table/standard,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/random/soap,/obj/random/soap,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"ov" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"ow" = (/obj/structure/toilet,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"ox" = (/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod1/centcom) -"oy" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"oz" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"oA" = (/obj/structure/flora/pottedplant,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"oB" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/door/airlock/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"oC" = (/obj/machinery/telecomms/broadcaster/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"oD" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/supply) -"oE" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"oF" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/supply) -"oG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"oH" = (/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"oI" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"oJ" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"oK" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) -"oL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/spesslaw,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"oM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/stuffing,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"oN" = (/obj/machinery/telecomms/hub/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"oO" = (/obj/machinery/computer/shuttle_control/centcom{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"oP" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"oQ" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/supplycomp/control{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"oR" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom) -"oS" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) -"oT" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"oU" = (/obj/machinery/computer/robotics{dir = 8},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"oV" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom) -"oW" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"oX" = (/obj/machinery/vending/cigarette,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"oY" = (/obj/machinery/microwave,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"oZ" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/supply) -"pa" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) -"pb" = (/obj/item/device/multitool,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pc" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pd" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cryostorage_shuttle_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock Cryostorage"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"pe" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "cryostorage_shuttle_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "cryostorage_shuttle_recovery_hatch"},/turf/simulated/shuttle/floor,/area/centcom/evac) -"pf" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/simulated/shuttle/floor,/area/centcom/evac) -"pg" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) -"ph" = (/obj/machinery/telecomms/receiver/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"pi" = (/obj/machinery/telecomms/bus/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"pj" = (/obj/machinery/telecomms/relay/preset/southerncross/transit,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"pk" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"pl" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"pm" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"pn" = (/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"po" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) -"pp" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pq" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pr" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/slice/orangecake/filled,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"ps" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/meatsteak,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"pt" = (/obj/machinery/door/window/northright,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pu" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pv" = (/obj/item/weapon/flame/lighter/zippo,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pw" = (/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"px" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"py" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pz" = (/obj/item/stack/material/glass{amount = 50},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pA" = (/obj/item/stack/material/steel{amount = 50},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"pB" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"pC" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"pD" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"pE" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"pF" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/melee/energy/axe,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"pG" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall) -"pH" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"pI" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"pJ" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"pK" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/soylenviridians,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"pL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"pM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/candiedapple,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"pN" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"pO" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"pP" = (/turf/unsimulated/wall,/area/centcom/bar) -"pQ" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"pR" = (/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"pS" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"pT" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"pU" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"pV" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"pW" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"pX" = (/turf/unsimulated/wall,/area/centcom/living) -"pY" = (/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"pZ" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"qa" = (/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"qb" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"qc" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/administration/centcom) -"qd" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qe" = (/obj/item/weapon/stool,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qf" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qg" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qh" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qi" = (/obj/machinery/robotic_fabricator,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qj" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Thunderdome Autolathe"},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qk" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"ql" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"qm" = (/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"qn" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/obj/structure/curtain/open/shower,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"qo" = (/obj/machinery/door/airlock,/turf/simulated/shuttle/floor,/area/centcom/evac) -"qp" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"qq" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qr" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/bloodsoup,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qs" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) -"qt" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/table/standard,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"qu" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"qv" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"qw" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/living) -"qx" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"qy" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/under/color/red,/obj/item/clothing/suit/armor/tdome/red,/obj/item/weapon/holo/esword/red,/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"qz" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"qA" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac) -"qB" = (/turf/unsimulated/wall,/area/shuttle/trade) -"qC" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"qD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/amanita_pie,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qF" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qG" = (/obj/structure/bed/chair/wood/wings,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"qH" = (/obj/machinery/light,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qI" = (/obj/machinery/computer/card{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"qJ" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/simulated/shuttle/plating,/area/shuttle/administration/centcom) -"qK" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) -"qL" = (/obj/structure/table/standard,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) -"qM" = (/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"qN" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qO" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/stew,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qP" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/beetsoup,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qQ" = (/obj/machinery/smartfridge,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"qR" = (/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"qS" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"qT" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"qU" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"qV" = (/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"qW" = (/obj/structure/device/piano{dir = 4},/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"qX" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"qY" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/centcom) -"qZ" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod6/centcom) -"ra" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) -"rb" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) -"rc" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/glass2/square,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"rd" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"re" = (/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"rf" = (/obj/structure/table/marble,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"rg" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"rh" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/tofukabob,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"ri" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/main_hall) -"rj" = (/obj/structure/table/marble,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/accessory/wcoat,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"rk" = (/obj/machinery/vending/cola,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"rl" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"rm" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"rn" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/poppypretzel,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) -"ro" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) -"rp" = (/obj/machinery/floor_light,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) -"rq" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"rr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"rs" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"rt" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"ru" = (/obj/machinery/computer/cloning,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"rv" = (/obj/machinery/clonepod,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"rw" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"rx" = (/obj/machinery/computer/secure_data{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) -"ry" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_4_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 4"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"rz" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_4_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "escape_pod_4_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"rA" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_6_recovery"; pixel_x = 26; pixel_y = -26; req_one_access = list(13); tag_door = "escape_pod_6_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"rB" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_6_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 6"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"rC" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/burst,/obj/item/weapon/gun/energy/gun/burst,/obj/item/weapon/gun/energy/ionrifle/pistol,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"rD" = (/obj/structure/table/standard,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"rE" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"rF" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/clerical,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"rG" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"rH" = (/obj/machinery/door/airlock/glass{name = "Bar"},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"rI" = (/obj/machinery/floor_light,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) -"rJ" = (/obj/structure/sink{pixel_y = 16},/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"rK" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac) -"rL" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/stunshells/large,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"rM" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"rN" = (/obj/machinery/computer/secure_data{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"rO" = (/obj/structure/closet/crate,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) -"rP" = (/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) -"rQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"rR" = (/obj/machinery/door/airlock/centcom{name = "Bridge Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"rS" = (/obj/machinery/door/airlock/glass_centcom{name = "Bridge Access"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"rT" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"rU" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"rV" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/flame/candle,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"rW" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"rX" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"rY" = (/obj/structure/table/reinforced,/obj/machinery/librarycomp,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"rZ" = (/obj/structure/bookcase,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sa" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor,/area/centcom/evac) -"sb" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy,/obj/item/clothing/suit/storage/vest,/obj/item/clothing/head/helmet,/obj/item/clothing/head/helmet,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sc" = (/obj/structure/frame/computer,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sd" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) -"se" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"sf" = (/obj/machinery/media/jukebox,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"sg" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"sh" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"si" = (/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -6},/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"sj" = (/obj/machinery/door/window/northright{icon_state = "right"; dir = 2},/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sk" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sl" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sm" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sn" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/centcom) -"so" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/centcom) -"sp" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/shuttle/trade) -"sq" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 4; req_access = list(160)},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sr" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) -"ss" = (/obj/machinery/floor_light,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) -"st" = (/obj/machinery/light{dir = 8},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"su" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 3"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"sv" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_3_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "escape_pod_3_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"sw" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/centcom/evac) -"sx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_5_recovery"; pixel_x = 26; pixel_y = -26; req_one_access = list(13); tag_door = "escape_pod_5_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"sy" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 5"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"sz" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"sA" = (/obj/structure/table/standard,/obj/item/weapon/soap/deluxe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"sB" = (/obj/structure/table/standard,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sC" = (/obj/structure/closet/wardrobe/white,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sD" = (/obj/structure/closet/wardrobe/green,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sE" = (/obj/structure/closet/wardrobe/grey,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"sF" = (/obj/machinery/button/remote/blast_door{id = "tradestationshutters"; name = "warehouse control"; pixel_x = -30; req_access = list(160)},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) -"sG" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"sH" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"sI" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"sJ" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sK" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sL" = (/obj/machinery/chemical_dispenser/ert,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"sM" = (/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"sN" = (/obj/machinery/door/blast/shutters{dir = 8; id = "tradestationshutters"; name = "Warehouse Shutters"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) -"sO" = (/obj/structure/table/standard,/obj/random/soap,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) -"sP" = (/obj/structure/sign/double/barsign,/turf/unsimulated/wall,/area/centcom/bar) -"sQ" = (/obj/structure/sign/directions/cargo{dir = 8},/obj/structure/sign/directions/security{dir = 8; pixel_y = -10},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 10},/turf/unsimulated/wall,/area/centcom/main_hall) -"sR" = (/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"sS" = (/obj/structure/sign/directions/medical{dir = 4},/obj/structure/sign/directions/evac{pixel_y = 10},/turf/unsimulated/wall,/area/centcom/main_hall) -"sT" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -25; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"sU" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Central Access"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"sV" = (/obj/machinery/turretid{pixel_x = -28; pixel_y = -28; req_access = list(101)},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"sW" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"sX" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"sY" = (/obj/machinery/vending/cola,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"sZ" = (/obj/machinery/vending/cigarette,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) -"ta" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"tb" = (/obj/machinery/door/airlock{name = "Restroom"},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"tc" = (/obj/structure/table/bench/steel,/obj/effect/landmark{name = "Trader"},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) -"td" = (/obj/effect/landmark{name = "Trader"},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) -"te" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"tf" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"tg" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"th" = (/obj/structure/table/reinforced,/obj/item/frame/light,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"ti" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"tj" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"tk" = (/obj/item/weapon/tool/crowbar,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"tl" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tm" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tn" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"to" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tp" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tq" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tr" = (/obj/machinery/button/remote/blast_door{id = "tradestationshutters"; name = "warehouse control"; pixel_x = 30; req_access = list(160)},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"ts" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/main_hall) -"tt" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tu" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tv" = (/obj/structure/bed/roller,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tw" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tx" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"ty" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tz" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tA" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"tB" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"tC" = (/obj/structure/closet/wardrobe/pink,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tD" = (/obj/structure/closet/wardrobe/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tE" = (/obj/structure/closet/wardrobe/mixed,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tF" = (/obj/structure/closet/wardrobe/pjs,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tG" = (/obj/structure/closet/wardrobe/suit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tH" = (/obj/structure/closet/wardrobe/xenos,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tI" = (/obj/structure/closet/wardrobe/black,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"tJ" = (/obj/item/frame/light,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"tK" = (/obj/machinery/chem_master,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tL" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) -"tM" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tN" = (/obj/machinery/chemical_dispenser/full,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tO" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tP" = (/obj/structure/closet/secure_closet/medical_wall/pills{pixel_y = 32},/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tQ" = (/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tR" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/blue{dir = 5},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"tS" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tT" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"tU" = (/turf/unsimulated/wall,/area/centcom/security) -"tV" = (/turf/unsimulated/wall,/area/centcom/medical) -"tW" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/obj/structure/table/standard,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/machinery/recharger,/obj/item/weapon/tool/screwdriver,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tX" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tY" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"tZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "trade_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; tag_door = "trade_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"ua" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ub" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"uc" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/floor_decal/corner/orange/full{dir = 8},/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ud" = (/obj/structure/table/reinforced,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ue" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"uf" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ug" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"uh" = (/obj/structure/closet/secure_closet/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ui" = (/obj/structure/closet/secure_closet/security,/obj/effect/floor_decal/corner/red{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"uj" = (/obj/structure/closet/secure_closet/security,/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"uk" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/medical) -"ul" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"um" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"un" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uo" = (/obj/machinery/iv_drip,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"up" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uq" = (/obj/structure/table/standard,/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/cautery,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"ur" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/retractor,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"us" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/scalpel,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"ut" = (/obj/structure/table/standard,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/surgical/FixOVein,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uu" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uv" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access = list(109)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/bodybags,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"ux" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uy" = (/obj/machinery/clonepod,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uz" = (/obj/machinery/computer/med_data{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"uA" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uB" = (/obj/structure/closet{name = "Prisoner's Locker"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"uC" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/security) -"uD" = (/obj/machinery/computer/shuttle_control{dir = 8; name = "Beruang control console"; req_access = list(160); shuttle_tag = "Trade"},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"uE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uF" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uH" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uI" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uJ" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uK" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uL" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uM" = (/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uN" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uO" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uP" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uQ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) -"uR" = (/obj/machinery/optable,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uS" = (/obj/machinery/computer/operating,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"uT" = (/obj/machinery/computer/security{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"uU" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"uV" = (/obj/structure/morgue,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uW" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"uX" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/merchant/home) -"uY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"uZ" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/merchant/home) -"va" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vb" = (/obj/machinery/vending/hydroseeds,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vc" = (/obj/structure/table/reinforced,/obj/item/clothing/head/greenbandana,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vd" = (/obj/machinery/computer/crew{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"ve" = (/obj/machinery/bodyscanner{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vf" = (/obj/machinery/body_scanconsole,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vh" = (/obj/machinery/vending/wallmed1{pixel_y = -30},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vi" = (/obj/structure/closet/secure_closet/medical2,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vj" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"vk" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"vl" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"vm" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"vn" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"vo" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/obj/item/weapon/stamp/captain,/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"vp" = (/obj/machinery/computer/shuttle_control{dir = 4; req_access = list(101); shuttle_tag = "Centcom"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"vq" = (/obj/structure/table/standard,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"vr" = (/obj/machinery/computer/shuttle_control{dir = 8; req_access = list(101); shuttle_tag = "Centcom"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"vs" = (/obj/structure/table/standard,/obj/item/device/radio/off,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"vt" = (/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"vu" = (/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"vv" = (/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"vw" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/wall/no_join,/area/shuttle/supply) -"vx" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vy" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/merchant/home) -"vz" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/table/holotable,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) -"vA" = (/obj/machinery/door/window/brigdoor{dir = 4; name = "Security"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vB" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"vC" = (/obj/structure/table/glass,/obj/machinery/reagentgrinder,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vD" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/centcom/evac) -"vE" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vF" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/rd,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vG" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vH" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vI" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"vJ" = (/obj/structure/bed/chair,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"vK" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"vL" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vM" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"vN" = (/obj/machinery/computer/card{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"vO" = (/obj/structure/table/bench/steel,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vP" = (/obj/structure/closet/secure_closet/brig,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vQ" = (/obj/structure/table/reinforced,/obj/item/weapon/book/codex/corp_regs,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"vR" = (/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"vS" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/medical) -"vT" = (/obj/structure/closet/secure_closet/chemical,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vU" = (/obj/structure/table/glass,/obj/item/stack/material/phoron,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vV" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vW" = (/obj/machinery/sleeper{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vX" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vY" = (/obj/structure/closet/wardrobe/white,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"vZ" = (/obj/machinery/clonepod,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"wa" = (/obj/machinery/computer/cloning,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"wb" = (/obj/machinery/dna_scannernew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"wc" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"wd" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"we" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wf" = (/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wg" = (/obj/machinery/door/airlock/silver{name = "Sleeping"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wh" = (/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"wi" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"wj" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"wk" = (/obj/machinery/atm{pixel_x = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wl" = (/obj/machinery/suit_cycler/syndicate,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wm" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wn" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wo" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/structure/closet/medical_wall{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wp" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wq" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"wr" = (/obj/structure/table/reinforced,/obj/item/weapon/book/codex/corp_regs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ws" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"wt" = (/obj/machinery/door/airlock/glass_security{name = "Spaceport Security Airlock"; req_access = list(63)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"wu" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"wv" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"ww" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wx" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wy" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wz" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"wA" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"wB" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 32},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"wC" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/inflatable_duck,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wD" = (/obj/structure/table/steel_reinforced,/obj/item/stack/material/mhydrogen,/obj/item/stack/material/diamond,/obj/item/stack/material/sandstone,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wE" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/rig/internalaffairs,/obj/item/clothing/head/helmet/space/void/wizard,/obj/item/clothing/suit/space/void/wizard,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wF" = (/obj/structure/table/steel_reinforced,/obj/random/tool,/obj/random/tool,/obj/random/tool,/obj/random/tool,/obj/random/tool,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wG" = (/obj/structure/table/steel_reinforced,/obj/random/toolbox,/obj/random/toolbox,/obj/random/toolbox,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"wI" = (/obj/vehicle/train/engine,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wJ" = (/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"wK" = (/obj/machinery/door/airlock/glass_medical{name = "Medical Bay"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wL" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wM" = (/obj/machinery/computer/communications{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) -"wN" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"wO" = (/obj/structure/closet/walllocker/emerglocker{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wP" = (/obj/machinery/button/remote/blast_door{id = "tradestarshutters"; name = "remote shutter control"; pixel_x = 30; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wQ" = (/obj/structure/table/steel_reinforced,/obj/random/firstaid,/obj/random/firstaid,/obj/random/firstaid,/obj/random/firstaid,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wR" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wS" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wT" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wU" = (/obj/structure/table/steel_reinforced,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/weapon/weldpack,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wV" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"wW" = (/obj/vehicle/train/trolley,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wX" = (/obj/machinery/light,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wY" = (/obj/machinery/vending/medical{pixel_y = -32; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"wZ" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xa" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xb" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xc" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xd" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xe" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 4; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xf" = (/obj/structure/table/steel_reinforced,/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xg" = (/obj/machinery/door/window/southleft{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xh" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/coin/uranium,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/platinum,/obj/item/weapon/coin/phoron,/obj/item/weapon/coin/iron,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/diamond,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xi" = (/obj/machinery/door/window/southright{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xj" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/hyper,/obj/item/weapon/cell/potato,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"xl" = (/obj/structure/table/standard,/obj/item/clothing/gloves/sterile/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/circular_saw,/obj/item/stack/nanopaste,/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xm" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xn" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xo" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xp" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xq" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"xr" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"xs" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xt" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xu" = (/obj/machinery/door/airlock/multi_tile/glass,/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"xv" = (/obj/structure/closet/crate/secure/weapon,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xw" = (/obj/machinery/computer/arcade/orion_trail,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xx" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xy" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xz" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xA" = (/obj/structure/closet/secure_closet/personal/patient,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xB" = (/obj/effect/floor_decal/corner/blue{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xC" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xD" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xE" = (/obj/structure/table/steel_reinforced,/obj/machinery/newscaster{pixel_x = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xF" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) -"xG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light/small,/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) -"xH" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 28},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) -"xI" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 3},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) -"xJ" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xK" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"xL" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"xM" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 30},/obj/effect/floor_decal/corner/orange{dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xO" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xP" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xQ" = (/obj/structure/bed/chair/office/light{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xR" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 4; name = "Security"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"xS" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xT" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xU" = (/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"xV" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"xW" = (/obj/machinery/computer/rdservercontrol{badmin = 1; dir = 8; name = "Master R&D Server Controller"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) -"xX" = (/obj/machinery/light{dir = 4},/obj/structure/sign/kiddieplaque{desc = "A plaque commemorating the construction of the cargo ship Beruang."; name = "Beruang"; pixel_x = 32},/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"xY" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) -"xZ" = (/obj/machinery/door/airlock/silver{name = "Restroom"},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) -"ya" = (/obj/structure/undies_wardrobe,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yb" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yc" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/largecrate/animal/cat,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yd" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/largecrate/animal/cow,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"ye" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/closet/crate/freezer/rations,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yf" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/item/device/kit/paint/ripley/death,/obj/item/device/kit/paint/ripley/flames_blue,/obj/item/device/kit/paint/ripley/flames_red,/obj/item/device/kit/paint/ripley,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yg" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/closet/crate/secure/loot,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/largecrate/hoverpod,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yi" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/mecha/working/ripley/mining,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yj" = (/obj/machinery/door/window/westright{name = "Storefront"; req_access = list(160)},/obj/structure/table/marble,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "trade"; name = "Shop Shutters"; opacity = 0},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"yk" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"yl" = (/obj/machinery/computer/arcade/battle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ym" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/effect/floor_decal/corner/orange{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"yn" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"yo" = (/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30; pixel_x = 2; pixel_y = 3},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"yp" = (/obj/item/weapon/storage/box/evidence,/obj/item/weapon/folder/red,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"yq" = (/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"yr" = (/obj/structure/closet{name = "Evidence Closet"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"ys" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/supply) -"yt" = (/obj/machinery/smartfridge/chemistry,/turf/unsimulated/wall,/area/centcom/medical) -"yu" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"yv" = (/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"yw" = (/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"yx" = (/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"yy" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"yz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/transport1/centcom) -"yA" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"yB" = (/obj/machinery/door/airlock/command{name = "Bridge"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yC" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yD" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/structure/largecrate/animal/corgi,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yE" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/largecrate/animal/corgi,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yF" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/crate/internals,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yG" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/warning,/obj/item/device/kit/paint/gygax/darkgygax,/obj/item/device/kit/paint/gygax/recitence,/obj/item/device/kit/paint/durand,/obj/item/device/kit/paint/durand/phazon,/obj/item/device/kit/paint/durand/seraph,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yH" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/crate/secure/loot,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/largecrate/hoverpod,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yJ" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/mecha/working/ripley/firefighter,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yK" = (/obj/machinery/door/window/westleft{name = "Storefront"; req_access = list(160)},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "trade"; name = "Shop Shutters"; opacity = 0},/obj/structure/table/marble,/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"yL" = (/obj/machinery/door/airlock/medical,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"yM" = (/obj/machinery/computer/arcade/battle,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yN" = (/obj/structure/table/steel_reinforced,/obj/machinery/button/remote/blast_door{id = "tradebridgeshutters"; name = "remote shutter control"; pixel_x = 30; req_access = list(150)},/obj/structure/flora/pottedplant{icon_state = "plant-09"; name = "Esteban"; pixel_y = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yO" = (/obj/machinery/vending/assist{contraband = null; name = "Old Vending Machine"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yP" = (/obj/structure/closet{name = "custodial"},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yQ" = (/obj/machinery/vending/sovietsoda,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yR" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/soap,/obj/item/weapon/towel{color = "#0000FF"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yS" = (/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yT" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 2; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yU" = (/obj/machinery/door/window/westleft{name = "Storefront"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yV" = (/obj/machinery/button/remote/blast_door{id = "trade"; name = "Shop Shutters"; pixel_x = 0; pixel_y = -26},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) -"yW" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/bearpelt,/obj/item/clothing/head/bowler,/obj/item/clothing/head/caphat/cap,/obj/item/clothing/head/beaverhat,/obj/item/clothing/head/beret/centcom,/obj/item/clothing/head/beret/sec,/obj/item/clothing/head/collectable/kitty,/obj/item/clothing/head/collectable/kitty,/obj/item/clothing/head/collectable/kitty,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/petehat,/obj/item/clothing/head/collectable/pirate,/obj/item/clothing/head/collectable/wizard,/obj/item/clothing/head/collectable/xenom,/obj/item/clothing/head/cowboy_hat,/obj/item/clothing/head/pin/flower/violet,/obj/item/clothing/head/pin/flower/blue,/obj/item/clothing/head/pin/flower/orange,/obj/item/clothing/head/pin/flower/pink,/obj/item/clothing/head/justice,/obj/item/clothing/head/justice/blue,/obj/item/clothing/head/justice/green,/obj/item/clothing/head/justice/pink,/obj/item/clothing/head/justice/yellow,/obj/item/clothing/head/philosopher_wig,/obj/item/clothing/head/plaguedoctorhat,/obj/item/clothing/head/xenos,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"yX" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"yY" = (/turf/unsimulated/wall,/area/centcom/terminal) -"yZ" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"za" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"zb" = (/obj/machinery/vending/boozeomat{req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zc" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zd" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"ze" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/under/cheongsam,/obj/item/clothing/under/hosformalmale,/obj/item/clothing/under/hosformalfem,/obj/item/clothing/under/harness,/obj/item/clothing/under/gladiator,/obj/item/clothing/under/ert,/obj/item/clothing/under/schoolgirl,/obj/item/clothing/under/redcoat,/obj/item/clothing/under/sexymime,/obj/item/clothing/under/sexyclown,/obj/item/clothing/under/soviet,/obj/item/clothing/under/space,/obj/item/clothing/under/swimsuit/stripper/mankini,/obj/item/clothing/under/suit_jacket/female,/obj/item/clothing/under/rank/psych/turtleneck,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/tacticool,/obj/item/clothing/under/syndicate/tacticool,/obj/item/clothing/under/dress/sailordress,/obj/item/clothing/under/dress/redeveninggown,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/under/dress/blacktango,/obj/item/clothing/under/dress/blacktango/alt,/obj/item/clothing/under/dress/dress_orange,/obj/item/clothing/under/dress/maid/janitor,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zf" = (/obj/machinery/door/airlock/glass{name = "Dock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"zg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/steel_reinforced,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zh" = (/obj/machinery/door/window/northleft{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zi" = (/obj/structure/table/steel_reinforced,/obj/random/plushie,/obj/random/plushie,/obj/random/plushie,/obj/random/plushie,/obj/random/plushie,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zj" = (/obj/machinery/door/window/northright{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zk" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/blue,/obj/item/clothing/gloves/brown,/obj/item/clothing/gloves/captain,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/green,/obj/item/clothing/gloves/grey,/obj/item/clothing/gloves/light_brown,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/rainbow,/obj/item/clothing/gloves/swat,/obj/item/clothing/gloves/white,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zl" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 2; start_pressure = 740.5},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zm" = (/obj/structure/closet/walllocker/emerglocker{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zn" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zo" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/terminal) -"zp" = (/obj/machinery/button/remote/blast_door{id = "tradeportshutters"; name = "remote shutter control"; pixel_x = 30; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zq" = (/obj/structure/table/steel_reinforced,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/item/weapon/bikehorn,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zr" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zs" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zt" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zu" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"zv" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/structure/largecrate/animal/cat,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zw" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zx" = (/obj/machinery/vending/medical,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zy" = (/obj/structure/flora/pottedplant/orientaltree,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zz" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zA" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zB" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zC" = (/obj/structure/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zD" = (/obj/structure/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zE" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/o2{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zF" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zG" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zH" = (/obj/effect/floor_decal/corner/paleblue,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zI" = (/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zJ" = (/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = 0; pixel_y = -32},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zK" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"zL" = (/obj/structure/closet/wardrobe/captain,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zM" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zN" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zO" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"zP" = (/obj/machinery/photocopier,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"zQ" = (/obj/structure/table/steel_reinforced,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zR" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/jade,/obj/item/weapon/lipstick/purple,/obj/item/weapon/lipstick,/obj/item/weapon/lipstick/random,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zS" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/webbing,/obj/item/clothing/accessory/storage/webbing,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/scarf/white,/obj/item/clothing/accessory/scarf/lightblue,/obj/item/clothing/accessory/scarf/red,/obj/item/clothing/accessory/scarf/purple,/obj/item/clothing/accessory/armband/science,/obj/item/clothing/accessory/armband/med,/obj/item/clothing/accessory/armband/engine,/obj/item/clothing/accessory/armband/cargo,/obj/item/clothing/accessory/armband,/obj/item/clothing/accessory/medal/nobel_science,/obj/item/clothing/accessory/medal/silver,/obj/item/clothing/accessory/medal/gold,/obj/item/clothing/accessory/medal/bronze_heart,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zT" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zU" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/suit/hgpirate,/obj/item/clothing/suit/imperium_monk,/obj/item/clothing/suit/leathercoat,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/pirate,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zV" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/closet/crate/solar,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"zW" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zX" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zY" = (/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access = list(5)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"zZ" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Aa" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Ab" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Ac" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Ad" = (/obj/structure/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Ae" = (/obj/structure/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Af" = (/obj/machinery/computer/communications{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"Ag" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/centcom/terminal) -"Ah" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/terminal) -"Ai" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/terminal) -"Aj" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/terminal) -"Ak" = (/obj/structure/sign/directions/cargo{dir = 1},/obj/structure/sign/directions/security{dir = 1; pixel_y = -10},/obj/structure/sign/directions/engineering{dir = 1; pixel_y = 10},/turf/unsimulated/wall,/area/centcom/terminal) -"Al" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"Am" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"An" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"Ao" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/transport1/centcom) -"Ap" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"Aq" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"Ar" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"As" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) -"At" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/machinery/atm{pixel_x = -32},/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Au" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "trade2_control"; pixel_x = -22; pixel_y = -32; req_one_access = list(150)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Av" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Aw" = (/obj/structure/table/standard,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Ax" = (/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Ay" = (/obj/structure/table/standard,/obj/item/stack/material/steel{amount = 2},/obj/item/stack/material/steel{amount = 2},/obj/item/stack/material/glass{amount = 15},/obj/item/stack/material/glass{amount = 15},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Az" = (/obj/structure/sign/directions/medical{dir = 1; pixel_y = -10},/obj/structure/sign/directions/science{dir = 1},/turf/unsimulated/wall,/area/centcom/terminal) -"AA" = (/obj/machinery/door/airlock/glass{name = "Dock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AB" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AC" = (/obj/effect/floor_decal/corner/white/full{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AD" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AE" = (/obj/structure/table/glass,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AF" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AG" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"AH" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"AI" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) -"AJ" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_inner"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AK" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_inner"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AL" = (/obj/machinery/vending/engivend,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AM" = (/obj/machinery/vending/tool,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AN" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"AO" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"AP" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AQ" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AR" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AS" = (/obj/structure/table/standard,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"AT" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "trade2_vent"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "trade2_control"; pixel_x = -24; req_access = list(150); tag_airpump = "trade2_vent"; tag_chamber_sensor = "trade2_sensor"; tag_exterior_door = "trade2_shuttle_outer"; tag_interior_door = "trade2_shuttle_inner"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AU" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "trade2_sensor"; pixel_x = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "trade2_vent"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AV" = (/obj/structure/table/standard,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"AW" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"AX" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"AY" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_outer"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"AZ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "trade2_control"; pixel_x = 24; req_one_access = list(150)},/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_outer"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Ba" = (/obj/structure/table/standard,/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bc" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bd" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Be" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bf" = (/obj/machinery/light{dir = 8},/obj/structure/bed/chair/shuttle{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bg" = (/obj/machinery/light{dir = 8},/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bi" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"Bj" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"Bk" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bl" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bm" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) -"Bn" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Bo" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bp" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/sign/dock/one,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bq" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Br" = (/obj/structure/lattice,/turf/space,/area/space) -"Bs" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space,/area/space) -"Bt" = (/obj/structure/sign/warning/docking_area,/turf/unsimulated/wall,/area/centcom/terminal) -"Bu" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bv" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bw" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Bx" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"By" = (/turf/simulated/shuttle/wall,/area/shuttle/escape/centcom) -"Bz" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"BA" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/sign/dock/two,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BB" = (/obj/effect/floor_decal/corner/white{dir = 6; icon_state = "corner_white"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BC" = (/obj/effect/floor_decal/corner/white{dir = 5},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BD" = (/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BE" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/escape/centcom) -"BF" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"BG" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"BH" = (/obj/machinery/computer/shuttle_control/emergency,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"BI" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"BJ" = (/obj/effect/floor_decal/corner/white,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BK" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/wizard_station) -"BL" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"BM" = (/obj/effect/floor_decal/corner/white{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BN" = (/obj/effect/floor_decal/corner/white{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"BO" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"BP" = (/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"BQ" = (/obj/structure/bed/chair/shuttle{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"BR" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"BS" = (/obj/structure/bed/chair/shuttle{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"BT" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"BU" = (/obj/machinery/chemical_dispenser/bar_soft/full,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"BV" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/pwine{pixel_x = -4; pixel_y = 10},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"BW" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"BX" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"BY" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"BZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_shuttle"; pixel_x = 0; pixel_y = -25; req_one_access = list(13); tag_door = "escape_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Ca" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Cb" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Cc" = (/obj/machinery/computer/arcade/battle,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Cd" = (/obj/machinery/computer/arcade/orion_trail,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Ce" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"Cf" = (/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"Cg" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/toy/figure/ninja,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) -"Ch" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) -"Ci" = (/obj/structure/AIcore/deactivated,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Cj" = (/obj/structure/bed/chair/wood/wings,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Ck" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Cl" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Cm" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"Cn" = (/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) -"Co" = (/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) -"Cp" = (/obj/structure/table/woodentable,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/ore/slag{desc = "Well at least Arthur doesn't have to share now..."; name = "pet rock"},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) -"Cq" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/structure/bedsheetbin,/obj/structure/table/woodentable,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) -"Cr" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Cs" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access = list(19)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Ct" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Cu" = (/obj/structure/table/woodentable,/obj/item/device/radio/headset,/obj/item/weapon/spacecash/c500,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Cv" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Cw" = (/obj/item/weapon/reagent_containers/food/snacks/spellburger{pixel_y = 8},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) -"Cx" = (/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Cy" = (/obj/structure/undies_wardrobe,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Cz" = (/turf/simulated/shuttle/wall/no_join,/area/shuttle/escape/centcom) -"CA" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/tool/crowbar,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"CB" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"CC" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CD" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CE" = (/obj/structure/table/woodentable,/obj/item/weapon/book/codex/corp_regs,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CF" = (/obj/machinery/door/airlock/hatch,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CG" = (/obj/machinery/door/airlock/hatch,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CH" = (/obj/item/weapon/antag_spawner/technomancer_apprentice,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CI" = (/obj/structure/table/woodentable,/obj/item/clothing/shoes/boots/workboots,/obj/item/clothing/under/technomancer,/obj/item/clothing/head/technomancer,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CJ" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"CK" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_dock_airlock"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"CL" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"CM" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CN" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) -"CO" = (/obj/machinery/vending/hydroseeds,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) -"CP" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"CQ" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CR" = (/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CS" = (/obj/structure/table/woodentable,/obj/machinery/librarycomp{pixel_y = 6},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CT" = (/obj/machinery/media/jukebox,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"CU" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) -"CV" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/under/psysuit,/obj/item/clothing/suit/wizrobe/psypurple,/obj/item/clothing/head/wizard/amp,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"CW" = (/mob/living/simple_mob/animal/passive/mouse/gray{desc = "He looks kingly."; name = "Arthur"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CX" = (/obj/structure/flora/pottedplant{icon_state = "plant-24"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"CY" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"CZ" = (/obj/structure/bed/chair/shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Da" = (/obj/structure/bed/chair/shuttle{dir = 4},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Db" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Dc" = (/obj/machinery/photocopier,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Dd" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"De" = (/obj/structure/flora/pottedplant{icon_state = "plant-08"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Df" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/shoes/sandal/marisa{desc = "A set of fancy shoes that are as functional as they are comfortable."; name = "Gentlemans Shoes"},/obj/item/clothing/under/gentlesuit,/obj/item/clothing/suit/wizrobe/gentlecoat,/obj/item/clothing/head/wizard/cap,/obj/item/weapon/staff/gentcane,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dg" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dh" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Di" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dj" = (/obj/structure/bed/chair/shuttle{dir = 4},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Dk" = (/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Dl" = (/obj/machinery/the_singularitygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dm" = (/obj/machinery/crystal,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Dn" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Do" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/arrow/quill,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Dp" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/stock_parts/matter_bin/super,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dq" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"Dr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_one_access = list(13); tag_door = "centcom_dock_airlock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Ds" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"Dt" = (/obj/machinery/computer/shuttle_control/administration{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) -"Du" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dv" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dw" = (/obj/machinery/computer/message_monitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dx" = (/obj/structure/frame/computer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Dy" = (/obj/structure/table/steel_reinforced,/obj/item/stack/telecrystal,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Dz" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DA" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"DB" = (/obj/structure/flora/pottedplant{icon_state = "plant-04"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DC" = (/obj/structure/sign/electricshock,/turf/simulated/shuttle/wall/dark/hard_corner,/area/wizard_station) -"DD" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"DE" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/administration/centcom) -"DF" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"DG" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"DH" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/administration/centcom) -"DI" = (/obj/machinery/computer/secure_data{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"DJ" = (/obj/structure/frame/computer{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"DK" = (/obj/structure/table/steel_reinforced,/obj/item/device/mmi/radio_enabled,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"DL" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"DM" = (/obj/structure/flora/pottedplant{icon_state = "plant-03"},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DN" = (/obj/structure/reagent_dispensers/watertank,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"DO" = (/obj/machinery/power/port_gen/pacman,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"DP" = (/obj/structure/table/steel_reinforced,/obj/item/xenos_claw,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DQ" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/coin/diamond,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"DR" = (/obj/structure/table/steel_reinforced,/obj/item/broken_device,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"DS" = (/obj/structure/table/steel_reinforced,/obj/item/organ/internal/stack,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DT" = (/obj/machinery/floodlight,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"DU" = (/obj/machinery/mecha_part_fabricator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DV" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DW" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/ripley_build_and_repair,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DX" = (/obj/item/device/suit_cooling_unit,/obj/structure/table/steel_reinforced,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DY" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/item/target,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"DZ" = (/obj/item/target/syndicate,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ea" = (/obj/structure/table/steel_reinforced,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Eb" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/steel_reinforced,/obj/item/weapon/gun/energy/laser/practice,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ec" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(1)},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) -"Ed" = (/obj/machinery/door/airlock/glass_medical{name = "Escape Shuttle Infirmary"; req_access = list(5)},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Ee" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Ef" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Eg" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Eh" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Ei" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ej" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/obj/item/target,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ek" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) -"El" = (/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) -"Em" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) -"En" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Eo" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Ep" = (/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Eq" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Er" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"Es" = (/obj/item/robot_parts/r_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"Et" = (/obj/item/robot_parts/l_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"Eu" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/robotics_cyborgs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ev" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ew" = (/obj/machinery/power/emitter{anchored = 1; desc = "It is a heavy duty industrial laser used in a very non-industrial way."; name = "teleport defender"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Ex" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Ey" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"Ez" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EA" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EB" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"EC" = (/obj/item/robot_parts/r_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"ED" = (/obj/item/robot_parts/chest,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EE" = (/obj/item/robot_parts/l_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EF" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"EG" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"EH" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EI" = (/obj/structure/target_stake,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EJ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EK" = (/obj/machinery/light,/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) -"EL" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"EM" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"EN" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"EO" = (/obj/machinery/sleep_console{dir = 4},/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"EP" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"EQ" = (/obj/structure/AIcore,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"ER" = (/obj/structure/flora/pottedplant{icon_state = "plant-20"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"ES" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"ET" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EU" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EV" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/shuttle/escape/centcom) -"EW" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EX" = (/obj/item/robot_parts/head,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) -"EY" = (/obj/item/weapon/firstaid_arm_assembly,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"EZ" = (/obj/machinery/computer/shuttle_control/merchant{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"Fa" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating/airless,/area/shuttle/escape/centcom) -"Fb" = (/obj/item/weapon/bucket_sensor,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Fc" = (/obj/item/weapon/farmbot_arm_assembly,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Fd" = (/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"Fe" = (/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Ff" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Fg" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Fh" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Fi" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) -"Fj" = (/turf/unsimulated/wall,/area/ninja_dojo/dojo) -"Fk" = (/turf/unsimulated/wall,/area/beach) -"Fl" = (/turf/unsimulated/mineral,/area/ninja_dojo/dojo) -"Fm" = (/turf/unsimulated/beach/sand{density = 1; opacity = 1},/area/beach) -"Fn" = (/turf/simulated/mineral,/area/ninja_dojo/dojo) -"Fo" = (/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) -"Fp" = (/obj/effect/floor_decal/asteroid,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) -"Fq" = (/turf/unsimulated/beach/sand,/area/beach) -"Fr" = (/obj/structure/signpost,/turf/unsimulated/beach/sand,/area/beach) -"Fs" = (/obj/structure/closet,/turf/unsimulated/beach/sand,/area/beach) -"Ft" = (/turf/simulated/shuttle/wall/voidcraft/green,/area/ninja_dojo/start) -"Fu" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand,/area/beach) -"Fv" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach) -"Fw" = (/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach) -"Fx" = (/obj/item/target/alien,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken2"},/area/ninja_dojo/dojo) -"Fy" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Fz" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/flame/candle,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"FA" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/material/sword/katana,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"FB" = (/obj/machinery/space_heater,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"FC" = (/obj/item/target,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"FD" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/ninja_dojo/start) -"FE" = (/turf/simulated/shuttle/wall/voidcraft/blue,/area/ninja_dojo/start) -"FF" = (/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand,/area/beach) -"FG" = (/obj/item/target/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"FH" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"FI" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"FJ" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"FK" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) -"FL" = (/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) -"FM" = (/obj/machinery/teleport/hub,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) -"FN" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) -"FO" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) -"FP" = (/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"FQ" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"FR" = (/obj/effect/floor_decal/carpet{dir = 4},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"FS" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) -"FT" = (/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/ninja_dojo/start) -"FU" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 2; start_pressure = 740.5},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"FV" = (/obj/machinery/computer/teleporter,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) -"FW" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) -"FX" = (/obj/machinery/teleport/hub,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) -"FY" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"FZ" = (/obj/structure/table/standard,/turf/unsimulated/beach/sand,/area/beach) -"Ga" = (/obj/structure/table/standard,/obj/item/clothing/under/color/rainbow,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/head/collectable/petehat{pixel_y = 5},/turf/unsimulated/beach/sand,/area/beach) -"Gb" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Gc" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Gd" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) -"Ge" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "ninja_shuttle_outer"; name = "Ship External Hatch"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; dir = 8; icon_state = "pdoor0"; id = "blastninja"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gf" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod7/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod7/centcom) -"Gg" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"Gh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gi" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"Gj" = (/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gk" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/combat,/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gl" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/beach/sand,/area/beach) -"Gm" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/beach/sand,/area/beach) -"Gn" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/beach) -"Go" = (/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Gp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ninja_shuttle"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "ninja_shuttle_pump"},/obj/machinery/button/remote/blast_door{id = "blastninja"; name = "ship lockdown control"; pixel_x = -25},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gq" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "ninja_shuttle_inner"; name = "Ship Internal Hatch"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gr" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ninja_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gs" = (/obj/structure/table/steel_reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"Gt" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"Gu" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"Gv" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) -"Gw" = (/obj/machinery/computer/security{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"Gx" = (/obj/machinery/computer/cloning{dir = 1},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"Gy" = (/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken1"},/area/ninja_dojo/dojo) -"Gz" = (/obj/structure/table/steel_reinforced,/obj/item/device/paicard,/obj/item/device/pda/syndicate,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"GA" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"GB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/obj/machinery/button/remote/blast_door{id = "ninjawindow"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"GC" = (/obj/structure/table/bench/wooden,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"GD" = (/obj/structure/flight_right{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"GE" = (/obj/machinery/computer/shuttle_control/web/ninja{icon_state = "flightcomp_center"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"GF" = (/obj/structure/flight_left{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"GG" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/obj/item/toy/plushie/mouse{desc = "A plushie of a small fuzzy rodent."; name = "Woodrat"},/turf/unsimulated/beach/sand,/area/beach) -"GH" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) -"GI" = (/obj/machinery/vending/coffee,/turf/unsimulated/beach/sand,/area/beach) -"GJ" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"GK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "ninjawindow"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) -"GL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "ninjawindow"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/ninja_dojo/start) -"GM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "ninjawindow"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/ninja_dojo/start) -"GN" = (/obj/item/clothing/head/collectable/paper,/turf/unsimulated/beach/sand,/area/beach) -"GO" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) -"GP" = (/obj/structure/flora/ausbushes/palebush,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) -"GQ" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) -"GR" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo) -"GS" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo) -"GT" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo) -"GU" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) -"GV" = (/turf/unsimulated/floor{icon_state = "sandwater"},/area/beach) -"GW" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/beach) -"GX" = (/turf/unsimulated/beach/coastline,/area/beach) -"GY" = (/turf/unsimulated/beach/water{density = 1; opacity = 1},/area/beach) -"GZ" = (/turf/unsimulated/beach/water,/area/beach) -"Ha" = (/obj/structure/table/wooden_reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hb" = (/obj/structure/table/wooden_reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hc" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Dooruranium.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/ninja_dojo/dojo) -"Hd" = (/obj/structure/table/glass,/obj/item/clothing/mask/balaclava/tactical{pixel_x = 2; pixel_y = 2},/obj/item/clothing/mask/balaclava,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"He" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/fortunecookie,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hf" = (/obj/structure/table/glass,/obj/item/clothing/mask/balaclava,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hg" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hh" = (/obj/structure/table/glass,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hi" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"Hj" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"Hk" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"Hl" = (/obj/structure/table/bench/wooden,/obj/effect/landmark{name = "ninjastart"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hm" = (/obj/effect/landmark{name = "ninjastart"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hn" = (/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/table/glass,/obj/item/weapon/towel{color = "#FF6666"; name = "light red towel"},/obj/item/weapon/towel{color = "#FF6666"; name = "light red towel"},/obj/random/soap,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"Ho" = (/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hp" = (/obj/structure/table/wooden_reinforced,/obj/item/device/radio/uplink,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"Hr" = (/obj/item/weapon/rig/light/stealth,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Hs" = (/obj/item/device/suit_cooling_unit,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Ht" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) -"Hu" = (/obj/machinery/door/morgue,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) -"Hv" = (/obj/structure/closet/crate,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Hw" = (/obj/item/broken_device,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"Hx" = (/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) -"Hy" = (/obj/machinery/door/morgue,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"Hz" = (/obj/structure/table/steel_reinforced,/obj/item/rig_module/chem_dispenser/ninja,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"HA" = (/obj/structure/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"HB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/obj/random/tech_supply,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"HC" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"HD" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/obj/structure/curtain/open/shower/medical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) -"HE" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/random/powercell,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"HF" = (/obj/structure/table/steel_reinforced,/obj/item/rig_module/mounted/energy_blade,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"HG" = (/obj/structure/table/steel_reinforced,/obj/item/rig_module/fabricator/energy_net,/obj/item/rig_module/vision/multi,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) -"HH" = (/obj/machinery/sleeper{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) -"HI" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) -"HJ" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) -"HK" = (/turf/unsimulated/wall,/area/syndicate_station) -"HL" = (/obj/machinery/space_heater,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken3"},/area/ninja_dojo/dojo) -"HM" = (/turf/unsimulated/wall,/area/syndicate_mothership/elite_squad) -"HN" = (/turf/unsimulated/wall,/area/skipjack_station) -"HO" = (/turf/unsimulated/wall,/area/prison/solitary) -"HP" = (/obj/structure/table/rack,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HQ" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency{pixel_x = -3; pixel_y = -3},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency{pixel_x = -3; pixel_y = -3},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HR" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/plasmastun,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HS" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HT" = (/obj/structure/table/rack,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HU" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HV" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"HW" = (/obj/mecha/combat/marauder/mauler,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"HX" = (/obj/machinery/mech_recharger,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"HY" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"HZ" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/syndicate_elite/mothership) -"Ia" = (/obj/machinery/computer/operating{dir = 4},/turf/simulated/shuttle/floor/white,/area/centcom/evac) -"Ib" = (/obj/machinery/computer/shuttle{dir = 1},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"Ic" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod8/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod8/centcom) -"Id" = (/turf/simulated/mineral,/area/space) -"Ie" = (/turf/simulated/mineral,/area/skipjack_station) -"If" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"Ig" = (/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two;Airlock Three;Airlock Four"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock;escape_dock_snorth_airlock;escape_dock_ssouth_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_y = -32; req_one_access = list(13)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"Ih" = (/obj/structure/table/standard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Ii" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "cobweb1"},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Ij" = (/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Ik" = (/obj/structure/bed,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) -"Il" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) -"Im" = (/obj/structure/table/rack,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"In" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Io" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Ip" = (/mob/living/silicon/decoy{icon_state = "ai-malf"; name = "GLaDOS"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Iq" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) -"Ir" = (/obj/structure/inflatable,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Is" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"It" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Iu" = (/obj/structure/table/rack,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Iv" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs{pixel_x = 4; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/smokes,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Iw" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Ix" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1213; listening = 1; name = "Syndicate Ops Intercom"; pixel_y = 26; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Iy" = (/obj/machinery/door/airlock/glass_security{name = "Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{id = "syndicate_elite_mech_room"; name = "Mech Room Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"Iz" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) -"IA" = (/turf/simulated/shuttle/wall/dark/no_join,/area/shuttle/syndicate_elite/mothership) -"IB" = (/obj/effect/landmark{name = "Syndicate-Commando-Bomb"},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"IC" = (/obj/structure/inflatable,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"ID" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"IE" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"IF" = (/obj/item/weapon/tray{pixel_y = 5},/obj/structure/table/standard,/obj/item/weapon/material/knife/butch,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"IG" = (/obj/structure/table/rack,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"IH" = (/obj/structure/table/rack,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"II" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"IJ" = (/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two"; child_tags_txt = "arrivals_dock_north_airlock;arrivals_dock_south_airlock"; frequency = 1380; id_tag = "arrivals_dock"; pixel_y = -32},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) -"IK" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_station) -"IL" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"IM" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) -"IN" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) -"IO" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"IP" = (/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"IQ" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"IR" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"IS" = (/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"IT" = (/obj/item/weapon/ore,/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"IU" = (/obj/structure/table/rack,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"IV" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"IW" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"IX" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"IY" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership/elite_squad) -"IZ" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"Ja" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jb" = (/obj/structure/urinal{pixel_y = 32},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"Jc" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"Jd" = (/obj/structure/toilet,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"Je" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jf" = (/obj/item/weapon/gun/energy/sonic,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jg" = (/obj/structure/closet/crate,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jh" = (/obj/structure/closet/crate,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Ji" = (/obj/structure/closet/crate,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jj" = (/obj/item/weapon/gun/launcher/spikethrower,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jk" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jl" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = -2; pixel_y = -2},/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Jm" = (/obj/effect/landmark{name = "Syndicate-Commando"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"Jn" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"Jo" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"Jp" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"Jq" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"Jr" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"Js" = (/obj/structure/mirror/raider{pixel_x = -32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"Jt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"Ju" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"Jv" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jw" = (/obj/item/clothing/glasses/night/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jx" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/darkmatter,/obj/item/weapon/gun/energy/darkmatter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Jy" = (/obj/machinery/door/airlock/centcom{name = "Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Jz" = (/obj/machinery/door/airlock/centcom{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"JA" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken1"},/area/skipjack_station) -"JB" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"JC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"JD" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"JE" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"JF" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"JG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"JH" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) -"JI" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"JJ" = (/obj/item/weapon/gun/energy/plasmastun,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"JK" = (/obj/item/weapon/gun/launcher/crossbow,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"JL" = (/obj/fiftyspawner/rods,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"JM" = (/obj/item/clothing/mask/gas/swat/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"JN" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas/swat/vox,/obj/item/clothing/mask/gas/swat/vox,/obj/item/clothing/mask/gas/swat/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"JO" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"JP" = (/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"JQ" = (/obj/structure/reagent_dispensers/beerkeg/fakenuke{desc = "Something seems off about this bomb."; name = "\improper Nuclear Fission Explosive"},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"JR" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"JS" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"JT" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"JU" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"JV" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"JW" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"JX" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"JY" = (/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"JZ" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station) -"Ka" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"Kb" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"Kc" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) -"Kd" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/skipjack_station) -"Ke" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Kf" = (/obj/machinery/door/airlock/centcom{name = "Armory"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Kg" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"Kh" = (/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"Ki" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"Kj" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"Kk" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"Kl" = (/obj/machinery/computer/station_alert{dir = 1},/turf/simulated/shuttle/floor/black,/area/centcom/evac) -"Km" = (/obj/machinery/computer/card{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) -"Kn" = (/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken3"},/area/skipjack_station) -"Ko" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station) -"Kp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station) -"Kq" = (/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station) -"Kr" = (/obj/item/xenos_claw,/obj/item/organ/internal/brain/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"Ks" = (/obj/item/weapon/ore,/turf/unsimulated/floor{name = "plating"; icon_state = "asteroid_dug"},/area/skipjack_station) -"Kt" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/syndicate_station) -"Ku" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/obj/effect/landmark{name = "Nuclear-Code"},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"Kv" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"Kw" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"Kx" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/syndicate_elite/mothership) -"Ky" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite/mothership) -"Kz" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken2"},/area/skipjack_station) -"KA" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station) -"KB" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"KC" = (/obj/structure/table/rack,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"KD" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"KE" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/spikethrower,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"KF" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"KG" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"KH" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"KI" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"KJ" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"KK" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = 3; pixel_y = 12},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"KL" = (/obj/structure/table/standard,/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/soap/syndie,/obj/item/weapon/soap/syndie,/turf/simulated/floor/tiled/freezer,/area/syndicate_station) -"KM" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"KN" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"KO" = (/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) -"KP" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"KQ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"KR" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hop,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) -"KS" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"KT" = (/obj/item/clothing/head/xenos,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"KU" = (/obj/machinery/door/airlock/centcom{name = "Suit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"KV" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) -"KW" = (/obj/machinery/door/airlock{name = "Restroom"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) -"KX" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) -"KY" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"KZ" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"La" = (/obj/item/clothing/mask/gas/swat{desc = "A close-fitting mask clearly not made for a human face."; name = "\improper alien mask"},/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"Lb" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/head/helmet/space/void/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Lc" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/green,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/green,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Ld" = (/obj/machinery/computer/crew{dir = 1},/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"Le" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"Lf" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"Lg" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"Lh" = (/obj/item/weapon/storage/box/syndie_kit/clerical,/obj/structure/table/standard,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"Li" = (/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"Lj" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"Lk" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"Ll" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"Lm" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Ln" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station) -"Lo" = (/obj/structure/table/rack,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"Lp" = (/obj/item/pizzabox/meat,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"Lq" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase/inflatable,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Lr" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/blue,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Ls" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Lt" = (/obj/machinery/computer/communications{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"Lu" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"Lv" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"Lw" = (/obj/structure/table/standard,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"Lx" = (/obj/structure/bed/chair,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"Ly" = (/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"Lz" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/orange,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"LA" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"LB" = (/obj/machinery/computer/shuttle{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"LC" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"LD" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"LE" = (/obj/structure/table/glass,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"LF" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"LG" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"LH" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/obj/item/clothing/glasses/sunglasses/prescription,/obj/item/clothing/glasses/sunglasses/prescription,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"LI" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"LJ" = (/obj/structure/table/steel,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"LK" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"LL" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"LM" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"LN" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"LO" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"LP" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"LQ" = (/obj/structure/table/glass,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"LR" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"LS" = (/obj/structure/table/steel,/obj/item/device/radio/uplink,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"LT" = (/obj/item/weapon/gun/launcher/pneumatic,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"LU" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) -"LV" = (/obj/structure/table/standard,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) -"LW" = (/obj/item/weapon/storage/box/syndie_kit/spy,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"LX" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) -"LY" = (/obj/structure/ore_box,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) -"LZ" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Ma" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Mb" = (/obj/structure/table/rack,/obj/item/weapon/rig/merc/empty,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Mc" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Md" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) -"Me" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Mf" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) -"Mg" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/space) -"Mh" = (/obj/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_base_hatch"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Mi" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space) -"Mj" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Mk" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Ml" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Mm" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Mn" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) -"Mo" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) -"Mp" = (/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) -"Mq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Mr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Ms" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Mt" = (/turf/simulated/wall/skipjack,/area/skipjack_station/start) -"Mu" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start) -"Mv" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_northwest_lock"; locked = 0; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Mw" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_northeast_lock"; locked = 0; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Mx" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start) -"My" = (/obj/structure/table/standard,/obj/random/projectile,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) -"Mz" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/obj/machinery/door/airlock/voidcraft{frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"MA" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MB" = (/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MC" = (/obj/machinery/autolathe{hacked = 1; name = "hacked autolathe"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MD" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/airless,/area/syndicate_station/start) -"ME" = (/obj/structure/shuttle/engine/router{icon_state = "router"; dir = 8},/turf/simulated/floor/airless,/area/syndicate_station/start) -"MF" = (/obj/machinery/computer/crew{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"MG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"MH" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"MI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"MJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"MK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"ML" = (/obj/machinery/computer/power_monitor{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"MM" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"MN" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) -"MO" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/computer/station_alert/all{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) -"MP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "merc_shuttle_sensor"; pixel_x = 28; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "merc_shuttle"; pixel_x = 24; pixel_y = -2; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"MQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) -"MR" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) -"MS" = (/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,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"MT" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MU" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MV" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/structure/table/steel,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MW" = (/obj/machinery/light{dir = 4},/obj/structure/table/rack,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"MX" = (/obj/effect/shuttle_landmark/southern_cross/transport1_offsite,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"MY" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"MZ" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Na" = (/obj/structure/flight_left,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nb" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nc" = (/obj/structure/flight_right,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nd" = (/obj/machinery/computer/shuttle_control/web/heist,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Ne" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/pirate,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nf" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "skipjack_shuttle"; pixel_x = -24; req_access = list(150); tag_airpump = "vox_east_vent"; tag_chamber_sensor = "vox_east_sensor"; tag_exterior_door = "vox_northeast_lock"; tag_interior_door = "vox_southeast_lock"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "vox_east_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Ng" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Nh" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Ni" = (/obj/machinery/atmospherics/pipe/manifold/visible{icon_state = "map"; dir = 8},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Nj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/light/small,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Nk" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Nl" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Nm" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Nn" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"No" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Np" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Nq" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/structure/table/steel,/obj/item/weapon/storage/box/frags,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Nr" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_southwest_lock"; locked = 0; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Ns" = (/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nt" = (/obj/machinery/light/small{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nu" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nv" = (/obj/machinery/light/small{dir = 4},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Nw" = (/obj/machinery/button/remote/blast_door{id = "skipjackshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start) -"Nx" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_southeast_lock"; locked = 0; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Ny" = (/obj/machinery/porta_turret/ai_defense{req_one_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Nz" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) -"NA" = (/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,/obj/structure/window/reinforced/full,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"NB" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) -"NC" = (/obj/structure/table/steel,/obj/effect/spawner/newbomb/timer/syndicate,/obj/item/weapon/tool/screwdriver,/obj/item/device/assembly/signaler{pixel_y = 2},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"ND" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NE" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"NF" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"NG" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/merchant/home) -"NH" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; pixel_x = -22; req_one_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"NI" = (/obj/structure/table/rack,/obj/item/weapon/material/harpoon,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/random/rigsuit,/obj/random/multiple/voidsuit,/obj/random/multiple/voidsuit,/obj/random/energy,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"NJ" = (/obj/structure/table/rack,/obj/random/rigsuit,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"NK" = (/obj/structure/table/rack,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/random/multiple/voidsuit,/obj/random/multiple/voidsuit,/obj/random/energy,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"NL" = (/obj/structure/table/rack,/obj/item/clothing/mask/breath,/obj/machinery/light/small{dir = 8},/obj/random/multiple/voidsuit,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"NM" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_east_control"; pixel_x = 22; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"NN" = (/obj/structure/frame/computer,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NO" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NP" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NQ" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security/tactical/bandolier,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NR" = (/obj/structure/table/steel,/obj/item/weapon/storage/toolbox/syndicate/powertools,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NS" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/item/ammo_magazine/m9mm,/obj/item/weapon/gun/projectile/pistol,/obj/item/ammo_magazine/m9mm,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NT" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NU" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NV" = (/obj/machinery/light,/obj/structure/closet/syndicate/suit{name = "suit closet"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NW" = (/obj/machinery/light,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NX" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_telebay"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"NY" = (/obj/machinery/door/blast/regular{dir = 4; id = "syndieshutters_telebay"; name = "Outer Airlock"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"NZ" = (/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Oa" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Ob" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Oc" = (/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Od" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/steel,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Oe" = (/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/material/minihoe,/obj/item/weapon/beartrap,/obj/structure/table/steel,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Of" = (/obj/machinery/vending/hydroseeds,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Og" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/weapon/tank/oxygen,/obj/item/weapon/pinpointer/shuttle/heist,/obj/item/weapon/pinpointer/shuttle/heist,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Oh" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/clothing/shoes/magboots,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Oi" = (/obj/machinery/washing_machine,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Oj" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Ok" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Ol" = (/obj/structure/table/steel_reinforced,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Om" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"On" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Oo" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/bed/chair/comfy/red{dir = 4; icon_state = "comfychair_preview"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Op" = (/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Oq" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Or" = (/obj/machinery/door/airlock/voidcraft{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Os" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Ot" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Ou" = (/obj/structure/table/rack,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Ov" = (/obj/structure/table/rack,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Ow" = (/obj/structure/table/rack,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Ox" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/mineral,/area/space) -"Oy" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Oz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OC" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"OD" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Blast Door"},/area/centcom/main_hall) -"OE" = (/obj/item/robot_parts/head,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"OG" = (/obj/structure/flight_right{icon_state = "right"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"OH" = (/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"OI" = (/obj/structure/bed/chair/comfy/red{dir = 4; icon_state = "comfychair_preview"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"OJ" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"OK" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"OL" = (/obj/machinery/turretid{pixel_x = 0; pixel_y = 32; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"OM" = (/obj/structure/table/rack,/obj/item/device/aicard,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"ON" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space) -"OO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OP" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OQ" = (/obj/machinery/computer/shuttle_control/web/syndicate{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"OR" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"OS" = (/obj/machinery/door/airlock/voidcraft/vertical{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"OT" = (/mob/living/simple_mob/animal/passive/cat/kitten{name = "Enola"},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"OU" = (/obj/machinery/door/airlock/voidcraft/vertical{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"OV" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"OW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OX" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OY" = (/obj/machinery/floodlight,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"OZ" = (/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pa" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/obj/machinery/light/small{dir = 8},/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Pb" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Pc" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Pd" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Pe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pf" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pg" = (/obj/structure/flight_left{icon_state = "left"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Ph" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Pi" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Pj" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Pk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pl" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"Pm" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Pn" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Po" = (/obj/structure/table/steel,/obj/item/clothing/glasses/regular,/obj/item/clothing/glasses/regular,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Pp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"Pq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pr" = (/obj/item/weapon/tool/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Ps" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/tool/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Pu" = (/obj/structure/table/steel_reinforced,/obj/machinery/recharger,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Pv" = (/obj/structure/bed/chair/comfy/red,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Pw" = (/obj/machinery/vending/assist{contraband = null; name = "AntagCorpVend"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Px" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Py" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Pz" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/machinery/light/small,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"PA" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"PB" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"PC" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"PD" = (/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"PE" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"PF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"PG" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"PH" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"PI" = (/obj/structure/table/steel,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"PJ" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"PK" = (/obj/machinery/light/small{dir = 1},/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"PL" = (/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"PM" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"PN" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"PO" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"PP" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/computer/station_alert{dir = 4},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"PQ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/computer/security{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) -"PR" = (/obj/structure/closet/crate/freezer/rations,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"PS" = (/obj/item/weapon/cigbutt,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"PT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"PU" = (/obj/machinery/light{dir = 1},/obj/structure/table/steel,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/device/defib_kit/compact/combat/loaded,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"PV" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/storage/firstaid/combat,/obj/item/weapon/storage/firstaid/clotting,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"PW" = (/obj/machinery/atmospherics/pipe/manifold/visible{icon_state = "map"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"PX" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"PY" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating/airless,/area/skipjack_station/start) -"PZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Qa" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Qb" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"Qc" = (/obj/machinery/door/airlock/voidcraft{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Qd" = (/obj/machinery/door/window{dir = 8; name = "Cell"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Qe" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qf" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qg" = (/obj/machinery/atmospherics/portables_connector{icon_state = "map_connector"; dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qh" = (/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/obj/machinery/atmospherics/pipe/manifold/visible,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/clotting,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qi" = (/obj/machinery/atmospherics/unary/freezer{icon_state = "freezer_0"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qj" = (/turf/simulated/shuttle/wall/no_join{base_state = "orange"; icon = 'icons/turf/shuttle_orange.dmi'; icon_state = "orange"},/area/centcom/evac) -"Qk" = (/obj/structure/table/standard,/obj/item/weapon/handcuffs/legcuffs,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"Ql" = (/obj/structure/table/standard,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"Qm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Qn" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) -"Qo" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"Qp" = (/obj/structure/toilet{dir = 4},/obj/machinery/flasher{id = "syndieflash"; pixel_x = -28; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"Qq" = (/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/shuttle/plating,/area/syndicate_station/start) -"Qr" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Qs" = (/obj/machinery/light{dir = 4},/obj/machinery/button/flasher{id = "syndieflash"; name = "Flasher"; pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"Qt" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window{dir = 8; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qu" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qv" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/steel,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"Qw" = (/mob/living/simple_mob/animal/passive/tindalos,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"Qx" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"Qy" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"Qz" = (/obj/structure/table/standard,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/retractor,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"QA" = (/obj/structure/closet{name = "custodial"},/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"QB" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"QC" = (/obj/structure/table/steel,/obj/item/weapon/material/knife{pixel_x = -6},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 9},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = -1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"QD" = (/obj/item/device/radio/electropack,/obj/structure/table/steel,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"QE" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_infirmary"; name = "remote shutter control"; pixel_x = -25},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/steel,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QG" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/gloves/sterile/latex,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QH" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"QI" = (/obj/item/weapon/bedsheet/rainbow,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"QJ" = (/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"QK" = (/obj/item/weapon/bedsheet/hos,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"QL" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/obj/item/weapon/surgical/FixOVein,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"QM" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QN" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QO" = (/obj/structure/table/steel,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QQ" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QR" = (/obj/machinery/iv_drip,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) -"QS" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/floor/airless,/area/syndicate_station/start) -"QT" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) -"QU" = (/obj/item/weapon/bedsheet/orange,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"QV" = (/obj/item/weapon/bedsheet/green,/obj/machinery/light/small{dir = 4},/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"QW" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/firstaid/clotting,/obj/item/stack/medical/splint,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"QX" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/machinery/light/small{dir = 4},/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) -"QY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"QZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Ra" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"Rb" = (/obj/item/weapon/bedsheet/rd,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"Rc" = (/obj/item/pizzabox/meat,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"Rd" = (/obj/item/weapon/bedsheet/clown,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) -"Re" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/space) -"Rf" = (/turf/unsimulated/wall{icon = 'icons/misc/title.dmi'; icon_state = "title"},/area/space) -"Rg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/mineral,/area/space) -"Rh" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve) -"Ri" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"Rj" = (/obj/structure/table/glass,/obj/item/weapon/book/codex/lore/vir,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"Rk" = (/obj/machinery/computer/cryopod/dorms{pixel_y = -30},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) -"Rl" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/merchant/home) -"Rm" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; invisibility = 60; layer = 1; name = "Blocker"},/turf/simulated/shuttle/floor/white,/area/centcom/main_hall) -"Rn" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; invisibility = 60; layer = 1; name = "Blocker"},/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/centcom/main_hall) -"Ro" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/merchant/home) -"Rp" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape/centcom) -"Rq" = (/obj/machinery/cryopod/robot/door/dorms{time_till_despawn = 200},/turf/simulated/shuttle/floor/white,/area/centcom/main_hall) -"Rr" = (/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) -"Rs" = (/obj/machinery/computer/pod{dir = 1; id = "syndicate_elite"; name = "Hull Door Control"},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"Rt" = (/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) -"Ru" = (/obj/machinery/computer/syndicate_elite_shuttle{dir = 1},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) -"Rv" = (/obj/machinery/vending/snack{dir = 4; name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Rw" = (/obj/machinery/vending/cola{dir = 4; name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Rx" = (/obj/machinery/vending/cigarette{dir = 4; name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) -"Ry" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership) -"Rz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership) -"RA" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership) -"RB" = (/obj/structure/frame/computer{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"RC" = (/obj/structure/frame/computer{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) -"RD" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) -"RE" = (/obj/effect/shuttle_landmark/southern_cross/large_escape_pod2/offsite,/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod2/centcom) -"RF" = (/obj/effect/shuttle_landmark/southern_cross/large_escape_pod1/offsite,/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod1/centcom) -"RG" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "admin_shuttle_hatch"},/obj/effect/shuttle_landmark/southern_cross/admin_offsite,/turf/simulated/floor/plating,/area/shuttle/administration/centcom) -"RH" = (/obj/effect/shuttle_landmark/southern_cross/cryostorage_offsite,/turf/simulated/shuttle/plating,/area/shuttle/cryo/centcom) -"RI" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "trade_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "trade_shuttle_hatch"},/obj/effect/shuttle_landmark/southern_cross/merchant_offsite,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) -"RJ" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod4/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/centcom) -"RK" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod6/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod6/centcom) -"RL" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod3/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/centcom) -"RM" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod5/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/centcom) -"RN" = (/obj/effect/shuttle_landmark/southern_cross/escape/offsite,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"RO" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ninja_shuttle_sensor"; pixel_x = 0; pixel_y = 28},/obj/effect/shuttle_landmark{base_area = /area/ninja_dojo/dojo; base_turf = /turf/snow; landmark_tag = "ninja_start"; name = "Dojo Outpost"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) -"RP" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; landmark_tag = "skipjack_start"; name = "The Hideaway"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"RQ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/button/remote/blast_door{id = "smindicate"; name = "ship lockdown control"; pixel_x = -25},/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; landmark_tag = "syndie_start"; name = "Merc Base Dock"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) -"RR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) -"RS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) -"RT" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/skipjack_station/start) - -(1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeafaeaeaeaeaeaeagahaiahaiahahaiahaiahagbkbkbkbkbkbkaOaLaAajagananclalalalalalalalagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauambAbxbxbxbxbxbDawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaxaeagaiazayazayazayazayahagbkbkbkbkbkbkaOaLaAakagananctaBaBaBaBaBaBaBagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaxaeaeaeaeaeaeaeaeagatayaHaCaIaCaIaKazahagbkaVbmaWbmaXaOaLaAakagananaJalaPalaBaQaZaYagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavaRbBaFaFaFaFaFbCawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeafaeaeaeaeagaUbabbaSaTaTaUaNazaiagbcbrbqbvbqbsaOaLaAakagaManbdbebfbHbgclbhbiagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeafaeaeaeafaeaeaeagaUaUaUaUbjbjaUaNayahagblbrbqbvbqbsaOaLaAakagananbnbobobobpclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcacbcbcbcbcbccawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaeaeagaUaUaUaUbjbjaUbGazaiagblbrbqbvbqbsaOaLaAakagananbubybzbybwclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamaqarararararasawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaxaeaeaeafagaUbEbFaSaTaTaUaNayaiagbIbrbqbvbqbsaOaLaAakagaManbObQbzbQbRclbtbNagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaxaeaeaeaeaeaeaeagbVaybJbKbLbKbLbMazahagbkbUbSbWbSbXaOaLaAakagananbYbzbzbzbNclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavbZaEaFaFaFaFaFaGawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaeaeagaiazayazayazayazazaiagbkbkbkbkbkbkaOaLaAakagananbObQbzbQbRclbtbNagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafaeaeaeaxaeaeaeaeaxagahaiahaiahahaiahaiahagbTbkbkbkbkbkaOaLaAakaganancncrbPcrcsclcBcuagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcIcKcKcKcKcKcOawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcecececececececececeabcecececececececececeabcecececececececececeabcecececececececececeabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcgcgagchcicicicicicicicichagcpcocCdxdydxcDdzdydzagcqcqcqcqcqcqcqcqcqcqagcwcvcRdfdgdgdgdgdgeaagcxcxcycycycycycycycyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfczcfcfcfcfczcfagcgcAcgcgcgcgcAcgcgcgagdkdkdkdkdkdkdociciciagcpcocCdFcFdFcFdGcFdGagcqcqcHcqcqcqcqcqcqcqagcwcvcRdpcJcJcJcJcJduagcycycycycLcLcLcycycyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcMcgagcWdwdAdBdAdhcVciciciagcpcpdCdFcFdydydycFdGagcqcqcqcqcqcqcPcQcqcqagcwcwdHdpcJcJcJcJcJduagcycycycScTcTcTcycycyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfczcfcfcfcfczcfcfcfagcgcgcUcgcMcgcgcgcgcgagcXdIdndvdndMcVcNdOciagcpcocCdFcFcFcFcFcFdGagcqcqcqcqcYcqcqcqcqcqagcwcvcRdpcJcJcJcJcJduagcycLcZdadbdbdcddcLcyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgdecgcgcgcgdecgagcWdIdndvdndMcVcNdQciagcpcocCdXdNdNdNdNdNdZagcqcqcqcqcqcqcqdmcqcqagcwcvcRdTdUdUdUdUdUdVagcycLcZdqdrdsdtddcLcyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcgcgagcWdIdndvdndMcVcNdQciagcpcocCcjckckdYckckcmagcqcqcqcqcqcqcqcqcqcqagcwcvcRebecececececgYagcycLcZdqdDdEdtddcLcyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfczcfcfcfcfczcfagcgcgcgcgcAcgcUcgcgcAagcXdIdndvdndMcVcNhjciagcpcocCcEcFcFcFcFcFcGagdPdPdPdPdPdPdPdPdPdPagcwcvcRihcJcJcJcJcJjyagcycLcZdcdJdJdKddcLcyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagdLcgcgcgcgdLcgcgcgcgagcWjzjAkXjAkYcVciciciagcpcpkZcEcFdjdjdjcFcGagdWdWdWdWdWdWdWdWdWdWagcwcwlrihcJcJcJcJcJjyagcycycydRdRdRdScycycyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfczcfcfcfcfczcfcfcfagcgdecgcUcgcgdecgcUcgagRrRrRrRrRrRrRtciciciagcpcocCcEcFcEcFcGcFcGagdWdWdWdWdWdWdWdWdWdWagcwcvcRihcJcJcJcJcJjyagcycycycLcLcLcycycycyawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgdLcgcgcgcgdLagchcicicicicicicicichagcpcocCdidjdilKdldjdlagdWdWdWdWdWdWdWdWdWdWagcwcvcRqbqyqyqyqyqyvzagcycycycycycycycyededawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtmnjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefegeheieieiehejefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefekeheieieiehelefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefeieieiefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefemeheieieiehenefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeoeheieieiehepefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefeieieiefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeqeheieieieherefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeseheieieiehetefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefefefefefefehehehefefefefefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueuefeueueueuefevevewewewewexeyezefeAeBeCeieieDewewefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeEeueueEefeFeueueEefeieieieieieieieieGefeweweHeieieDewewefaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeIeueueIefeJeueueKefeieieieieieieieieLefeweweweieiewewewefaaaaaaefefefefefefefefefefefefeMeNeOefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefePePefefefePePefefeQeReSeTeUeVeieieWefeweweHeieieDewewefaaaaaaefeXeXeXeYeZfafbeffcfdeffefffgefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffheueufifjfkeueufleffmfnfofpfqfreieifsefftftfueieieDewewefaaaaaaeffvfvfvfwewewewefffffffffffffefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueueueueueufxefeieieieieieieieifyeffzfzeffAfAeffzfzefefefefeffBfBfBewewewewfCffffffffffffefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueueueueueufDefeieieieieieieieifEeffFfGfHeieifIfJfKefeweweweffvfvfvfweweweweffLffeffMeffNefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeEfOeEfPeEfQeueufReffSfTfUfVfWfXeieifYeffZeieieieieieifKefgaefgaefeXeXeXewewgbgbeffLffefgcefgcefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzefgdgdefeffzfzfzfzfzgefAfAgeefeieieieieieieieigfeieieiefefefeffAfAefefefefefefefefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieiggghghgieieieigjgjgjgjeieifAeieieifAeieieieieieieieieieieieieieieigkefewglgmefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieieieieieieieieigngogpgqeieifzeieieifzeieieieieieieieieieieieieieieigkgrewewgsefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieigtgugugveieieieieieigwgxgxgyeieieigpgzgAgBeieifAeieieifAeieieieieieieieieieieieieieieigkefgCgDgEefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzeffAfAefeffzfzfzfzfzgFfAfAgFefeieigGgGgGgGeieiefeieieiefgHgHgHgHgHgHgHgHgHgHgHgHgHgHeieiefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefgIgJgKgLgMgNeieigOefgPgQgRgSgTgUeieigVefgWeieieieieieigXefeieieiefeumzgZgZgZgZgZgZgZgZgZgZeugHeieifzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihaefhbhceihceieieieihdefhehffJeieihghhhiefeieieiefeumRhkhlhmhmhmhmhnhohphqgZgHeieifzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihrefeieieieieieieieihseffzfzeffAfAeffzfzefeieieiefeumRhthuhvhwhmhmhmhmhmhxhyhzhAeiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihBhChDhEeieihFefeieihGhHhIhJeieihKefhLhMhNeieihOhPhQefeieieiefeumRhtjJhShThUhUhmhmhVhqgZgHefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihWhXhYhZeieiiaefeieiibicidieeieiiaefewewifeieieDewigefeieieiefeumSgZgZgZgZgZgZgZgZgZgZeugHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefiieieieieieieieiijefeieieieieieieieiikefileweweieiewewimefeieieiefefininininininininininininefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefioipiqirisitiuewivefeieieieieieieieiiwefewewifeieieDewixefeieieiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefiyiyiqirisitiuizivefiAiBiCiDiEiFiGiHiIefiJiKiLiMiNiOiPiQefeieieiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefeffAefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefiRiRiRefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiSiTiUiTiSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWiViViViWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXiXiXiXiXiXiXiXiXiXiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiZiZiZiYiZiZiZiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXjajajajajajajajajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjbjbjbiYjcjcjciYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpPpPpPpPpPaaaaaaaaaaaapPpPpPpPpPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXjajajdjdjdjdjdjajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjbjbjbiYjcjcjciYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaajgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpPjpjpjpjqpPjrpPpPpPpPpPpPjBjBjCpPjrpPpPjejejejejejejeaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXjajdjdjfjfjfjdjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjbjbjbiYjcjcjciYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaajgjojojojojojojojojojojojojojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpPjDjqjqjqjqjqjqjqpPjRjSjSpPjTjTjTjTjTjTpPkjkjjekIkIkIjeaaaaaaaaaaaaiWiWiTiTiTiTiWiWjiiWjijjjjjkjkjkjjjjaaaaiXjajdjmjljljljnjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYjbjwjbiYjcjxjciYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjgjgjojojgjgjgjgjgjgjgjgjgjgjojojgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaapPjqjqldldldldldjqjqlpjSjSjSpPlqlWjTjTjTlXpPkjkjlekIkIkIjeaaaaaaaaaaaaiWjsjsjsjsjsjsiWiViViVjjmxjujujujvjjaaaaiXjajdjljljLjLjLkajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYnSnXnXnXomiYiYjbjbjbiYjcjcjciYiYnSnXnXnXomiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojojojPjojojQjQjQjQjQjojgjojojojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPlYjqldldldldldjqjqlZjSjSmapPpPpPpPmbpPpPpPkjkjlekIkIkIjeaaaaaaaaaaaaiWjsjEjFjFjGjsiTiViViVjkjHjInkjujKjjaaaaiXjajdjljljljljlkCjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjMjMjMjMjMiYiYiYjNiYiYiYjOiYiYiYjMjMjMjMjMiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojgjgjgjgkikikikikikijgjgjgjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPmtjqjqjqjqjqjqjqmuqsmvjSjSjSmwmMmLjSmNmUqskjkjlekIkIkIjeaaaaaaaaaaaaiWjsjUjVjWjXjsiTiViViVjkjYjZjZjujujjaaaaiXjajdjljljljlkDjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYkbkckckckciYkdkekfkekekekgkekdiYkckckckckhiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojgksktkukukukvkvkukukukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPmVmXmWninhnjmtjqnCqsnDjSjSjSjSjSjSjSjSnEqskjkjjekIkIkIjeaaaaaaaaaaaaiWjsjUjVjVjXjsiWiViViVjjjujujujujujjaaaaiXjajdjljljljljlkCjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYkkklklklklkmkeknkokpknkqkoknkekmklklklklkriYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojgksktkukvkvkHkHkvkvkukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPpPpPpPpPpPpPqslZqsqsnDjSjSnRnQocobodjSoeqskjkjjekIkIkIjejeaaaaaaaaaaiWjsjUjVjVjXjskyiViViVkzjujujujukBjjaaaaiXjajdjljlkKkKkKkSjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYkEklklklkliYkeknkokpknkqkoknkeiYkFklklklkGiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojgksktkukvkvkHkHkvkvkukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPokpRolpPpPjSjSjSjSjSjSjSjSnrqskjkjlekIkIkIonjeaaaaaaaaaaiWjsjUjVjVjXjsiWiViViVjjjukAjujujujjaaaaiXjajdjmjljljljnjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalhiYiYiYiYiYiYkeknkokpknkqkoknkeiYiYiYiYiYiYlhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojgksktkukukukvkvkukukukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPozpRoloApPqsoBpPjSoMoLpsprpPpPkjkjlekIkIkIpGjeaaaaaaaaaaiWjsjUjVkJjXjsiTiViViVjkjZjZjZjujujjaaaaiXjajdoZjljljloZjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLkMkMkMkMkMiYkeknkokpknkqkoknkeiYkNkNkNkNkNkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojgksktkukukukvkvkukukukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpRpRolpIpHpJjqpKjSjSjSjSpLpMqskjkjlekIkIkIonjeaaaaaaaaaaiWjskOkPkPkQjsiTiViViVjkjZkRjujujujjaaaaiXjajdjdvwvwvwjdjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLkMkMkMGfkMkTkUknknknknknknknkVkWkNIckNkNkNkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgjglajgjgjgjgjglblblblblblbjgjgjgjgjglcjgjgaaaaaaaaaaaaaaaaaaaaaaaaaapPpPpPpPpPpPpNpRolpQpOqqqpqDqrqFqEqOqNqPqskjkjlekIkIkIjejeaaaaaaaaaaiWjsjsjsjsjsjsiWiViViVjjjujujujujujjaaaaiXjajaoDoFoFoFysjajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLkMkMkMkMkMiYkekekekeknkekekekeiYkNkNkNkNkNkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgliljljljjglklllllllllllllllllkjglmlmlmlnjgaaaaaaaaaaaaaaaaaaaaaaaaaapPqQsRsRsRqRozpRolpIqSpJjqqTmtqTmtqTmtqTpPlelejekIkIkIjejejejejejejejeiWiWiWiTiTiTiWlfiTlfiWiWiWiWiWiWiWiWiWiWlglglglglglglglglglglglglgiWaaaaaaaaaaaaaaaaaaQjiYiYiYiYiYiYiYiYiYiYiYiYiYkeknkeiYiYiYiYiYiYiYiYiYiYiYiYiYQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgliljljlElFlllllllllllllllllllllFlGlmlmlHjgaaaaaaaaaaaaaaaaaaaaaaaaaapPqUsRqVsRrcozpRoljqqpjqqpjqqpjqqpjqqpjqrdkIkIkIkIkIkIjekIkIkIkIkIkIkIiWiWiWiViViViViViViViViViViViWiWiWiViViSyzlslsltltltlslslslslslsluiWaaaaaaaaaaaaaaaaaakLlvkllvlwlxlylzlAlBlAlAlAiYlBlClBiYkllDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgliljlTlElFlllllllllllllllllllllFlGlUlmlVjgaaaaaaaaaaaaaaaaaaaaaaaaaapPtLsRresRrcozpRolqpjqqpjqqpjqqpjqqpjqqpqskIkIkIkIkIkIjekIkIkIkIkIkIkIiWiWlJiViViViViViViViViViViVlJiWiWiViViTAolLlMlMlNlMlOlPlslQlRlslsiWaaaaaaaaaaaaaaaaaakLklklkllBlSlSlSlSlBlSlSlSiYkeknkeiYlDlDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgmqljljlElFlllllllllllllllllllllFlGlmlmmrjgaaaaaaaaaaaaaaaaaaaaaaaaaapPrfsRsRsIrcozpRoljqqpjqqpjqpIrhrgqqqpjqrdkIkIkIkIkIkIjekIkIkIkIkIkIkIiTiViViViVmcmdmemfmgmdmhiViViViViWiViVmimjMXmkmkmkmkmkmkmlmkmmoOltiWaaaaaaaaaaaaaaaaaakLlvklklmolSlSlSlSmplSlSlSiYkeknkeiYlDlDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgmIljlTlElFlllllllllllllllllllllFlGlUlmmJjgjejejejejejejeaaaajejerijepPrjsRrcrcqRozpRoloArkrmrlqppQrornpJjqqppPlelejekIkIkIjekIkIkIkIkIkIkIiTiViViVoQmdmdmymdmymdmdoUiViViViWiViViTyzmAmBmBmCmBmDmElsmFmGlslsiWaaaaaaaaaaaaaaaaaakLklklkllBmHlSlSmHlBlSlSlSiYkeknkeiYlDlDlDlDlDRElDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqKqLqBqMqMqBqLqKqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgmTljljlElFlllllllllllllllllllllFlGlmlmlmjgkIkIkIkIkIkIjejejejejhjhjhpPpPpRozozozpRpRpRrprprprppPpPpPpPpPrqpPpPkjkjjekIkIkIjekIkIkIkIkIkIkIiTiViVmcmdmdmdmOmPmOmdmdmdmhiViViWiVmQiWAolslsltltltlslslslslslsluiWaaaaaaaaaaaaaaaaaakLlvkllvlwqIlSlSrxlBlAlAlAiYkeknkeiYkllDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBrararbqMqMrbraraqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgnbljncljndllllllnenflllllllllllFlmlmlmlmngkIkIkIkIkIkIjerrlerGkIkIkIkIrHpRpRpRpRpRpRpRrIrIrIrIpPjTjTjTjTjTrJpPkjkjjekIkIkIjejejejejejemYjeiWiViVmdmdmdmOmZmZmZmOmdmdmdiViViWiViViWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiTiSQjlhiYiYlBiYiYmpmpiYiYiYlBiYiYkeknkeiYiYlBiYiYiYnanaiYiYlBiYlhQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBqBqMqMqBqBqBqBrCqMrDrEqMrFqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgljljnvnwnxnynynynznAnBlllllllllFlmlmlmlmjgkIkIkIkIkIkIrRrrrSrGkIkIkIkIqspRpRpRpRpRqGpRrIrIrIrIpPrTpPrUpPjTjTpPkjkjjekIkIkIkIlekIkIjekIkIkIlfiViVrNnlmOmZnmnnnonpmOnquziViVlfiViViViViViViViViViViViViViViViViViViViVjiiTiViViTiYnsknlBkekekekekekekekekdlBkekeknkekelBkdkekekentkekekekenulBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqKqLqBqMqMqBqLqKqBrLqMqMqMrMuDqBrOrPrOrPrOrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgnNljljnOndllllllnPnflllllllllllFlmlmlmlmngkIkIkIkIkIkIjerrlerGkIkIkIkIrHpRrWrVserWsrsfssrIrIrIpPsGpPsHpPsOpPpPkjkjlekIkIkIkInFkIkInGkIkIkIiTiViVnHmdmOnIiWnJiWnKmOmdnLiViViTiViViViViViViViViViViViViViViViViViViViVjiiUiViViUnMnsknnMknknknknknknknknknlCknknknknknlCknknknknknknknknknnulBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBrararbqMqMrbraraqBsbqMqMqMqMscqBsdrPsdrPsdrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgoaljljlElFlllllllllllllllllllllFlGlmlmmJjgkIkIkIkIkIkIjejejejekIkIkIjepPpPqsqsqsqssPpPqsqsqsqspPpPpPpPpPpPpPkjkjkjlekIkIkIkIlekIkIjekIkIkIlfiViVuTnlmOnTnUnVnWmZmOnqvdiViVlfiViViViViViVnYiViViViViViViViViViViViViVjiiWiViViWiYnsknlBkekekekekekekekekdlBkekeknkekelBkdkekekenZkekekekenulBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBqBqBqBqBqMqMqBqBqBqBspspsqqMspspqBrPrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgojljlTlElFlllllllllllllllllllllFlGlUlmmrjgODODODODjejejekjkjlekIkIkIjekjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjlekIkIkIjejelelejelemsleiWiViVmdmdmdmOofmOogmOmdmdmdiViViWiWiWiWiWiWiWiWohohiWiWiWiWiWiWiWiWiWiWiWiWiWiWiTiSQjlhiYiYlBiYiYlwlwiYiYiYlwiYiYkeknkeiYiYlBiYiYiYoioiiYiYlBiYlhQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBszsAszqBsBsBqMqMsCsDsEqBqMqMqMqMqMqMqBsFrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgoyljljlElFlllllllllllllllllllllFlGlmlmoKjgkjkjkjkjkjkjkjkjjesQkIkIkIsSjekjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjjejekIkIkIleoooplolololooqiTiViVormdmdmdmOmOmOmdmdmdosiViViWlulululululululululululululululululululululuiWaaaaaakLotototototototiYouovlwowiYkeknkeiYoxoxoxoxoxoxoxoxoxoxoxklkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBsMsMsMqBqMrPrPrPrPrPqMqMqMrPrPrPrPqMsNrPrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgoJljlTlElFlllllllllllllllllllljgRhRhRhRhjglelelelejelelelejejhkIkIkIjhjejejejejelelelelelelelelelelelelejelelelejejhkIkIkIlemKsTlolololooCiTiViViVvpmdmdoEmdoEmdmdvriViViViWlulululululululululululululululululululululuiWaaaaaakLotototototototiYoGoHlwoIiYkeknkeiYoxoxoxoxoxoxRFoxoxoxoxoxkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBtasMsMtbqMtctctctctcqMqMqMrPtdtdrPqMsNrPrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgoTljljlElFlllllllllllllllllllljgkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjhkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkInGkIkIkIkIjesVlololololooNiTiViViViVormdvNoPwMmdosiViViViViWlululululuoRoRoRoRoRoSoSoRoRoRoRoRlululululuiWaaaaaakLotototototototiYknknknkniYkeknkeiYoxoxoxoxoxoxoxoxoxoxoxoxkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBtasMsMqBqMrPrPrPrPrPqMqMqMrPrPrPrPtrqBsdrPrOrPsdrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgpgljljljjglklllllllllllllllllkjgkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjhkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjekIkIkIkIjelolololololoxWiWiWlJiViViViViViViViViViViVlJiWiWlulululuoRoVoWoXoYoRRGpaoRpbpcoRoRoRoRlululuiWaaaaaakLotototototRHotpdpeknknknpfkeknkeiYoxoxoxoxoxoxoxoxoxoxoxoxkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBtAqBtBqBtCtDtEtFtGtHtIqBqMqMqMqMqMqMqBrOrPrOrPrOrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaajgjglajgjgjgjgjglblblblblblbjgjgjgkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjhkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkInGkIkIkIkIjephpipjpkpllopmiWiWiWiViViViViViViViViViViViWiWiWlululuoRoRpnpnpnpnoRpopooRpnpnpppqoRoRoRluluiWaaaaaakLotototototototpdknknknknpfkeknkeiYoxoxoxoxoxoxoxoxoxoxoxklkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBtTqBqBqBqBqBqBqBqBqBqBqBsqqMqBqBqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojgpCktjopDpDpEpEpDpDpDRipFjgjeleleletflelelejejelelelejejhkIkIkIjhjelelelejejelelelesUlelelejejelelejelelelejejhkIkIkIjejejejejejejejeiWiWiWiWiWiWiWlfiTlfiWiWiWiWiWiWiWluluoRoRoRptpupvpwoRpxpnpypnpnpnpnpzpAoRluluiWaaaaaakLotototototototiYlwlwpBlwiYkeknkeiYlwlwlwlwlwlwlwlwlwlwlwlwlwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBaaaaaaaaaaaaaaaaaaqBqMtZqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojgpCktjopDpDpEpEpDpDpDRipFjgtekIkIkIkIkIkIkIRjjekjkjkjjejetftftfjejekjkjkjjekIkIkIkIkIkIkIkItgjekjkjkjkjkjkjjejekIkIkIjejeaaaaaaaaaaaaaaaapXpSpTpUpVpWpWpWpXpYpZqapZpYiWluluDEqcqdpnqeqeqeoRpnpnoRqfqgqhqiqjqkoRluluiWaaaaaakLotototototototiYqlqmqmqniYkeknkeqoknknknknknknknknknknknknlwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqMqMqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojgpCktjopEpEqCqCpEpEpDRipFjgkIkIRkkIkIkIRkkIkIjekjkjkjkjjekIkIkIjekjkjkjkjjethtitikIkIkIkIkItgjekjkjkjkjkjkjkjlekIkIkIjeaaaaaaaaaaaaaaaaaapXqtquqvpXpWpWpWqwpYpZqxpZpYiWluluDHqcpnpnpnpnpnpypnpnoRoRoRoRoRoRoRoRluluiWaaaaaakLotototototototiYqlqzqmqniYlBlClBiYqAkoqAkoqAkoqAkoqAkoqAkolwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBuQuQqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojgpCktjopEpEqCqCpEpEpDRipFjgkIkIjeRqjeRqjekIkIlekjkjkjkjlekIkIkIlekjkjkjkjlekIkIkIkIkIkIkIkItjjelelejejejejejejejejejejeaaaaaaaaaaaaaaaaaapXpXpXpXpXpWpWpWqwpYpYpYpYpYiWluluoRoRpnpnpnqHpnoRpnpnpnAfqJlululululululuiWaaaaaaQjiYiYiYiYiYiYiYiYiYiYlwiYiYkeknkeiYiYiYiYiYiYiYiYiYiYiYiYiYQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauXuYuYuXaaaaaaaauZuZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojgpCktjopDpDpEpEpDpDpDRipFjgkIkIjeRmjeRmjekIkIlekjkjkjlelekIkIkIlelekjkjkjlekIkItkkIkIkIkIkIjejetstststsjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpSpTpUpVpWpWpWpYpYpYpYqWpZiWlululuoRoRoRoRoRoRoRpxpnqXpnqJlululululululuiWaaaaaaaaaaaaaakLqYqYqYqYqYiYkdkekekeknkekekekdiYqZqZqZqZqZkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZuZvtvuvvuZaaaaaaaaaauZuZRIvxuZuZaaaauZuZuZuZvyNGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojgjgjgjgkikikikikikijgjgjgjelolojeRnjeRnjelololekjkjkjlekIkIkIkIkIlekjkjkjlekIkIkIkIkIkIkIkIjetststststsjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXrsquqvpXpWpWpWpYpYpYpYpYpYiWluluoRoRrtrurvrtrwoRpnpnpnDtqJlululululululuiWaaaaaaaaaaaaaakLqYqYqYRJqYryrzknknknknknknknrArBqZRKqZqZqZkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuXvEvFuZvGvHvIvJvKuZuZaaaaaauZuZuXuYuYuXuZvtvvuXvLvMuZvyRlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjojojojojPjojorQrQrQrQrQjojgjelolojejejejejelololekjkjkjjekIkIkIkIkIjekjkjkjletJkIkIkIkIkIkIkIjetststststsjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpXpXpXpXpWpWpWqwpYpYpYpYpYiWluluDEqcpnpnpnpnpnpypnpnoRoRoRoRoRoRoRoRluluiWaaaaaaaaaaaaaakLqYqYqYqYqYiYkeknrKrKrKrKrKknkeiYqZqZqZqZqZkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawdwewfwfwgwfwfwhwiwjuZuZvtvuvvuZuZwkwfwfwluZwmwnwowfwpuZvyRlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaajgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjelololololololololojekjkjkjlekIkIkIkIkIlekjkjkjjekIkIkIkIkIkIkIkIjejejejejejejeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpSpTpUpVpWpWpWqwpYpZqxpZpYiWluluDHqcrXpnpnpnpnoRpnpnpnpnpnoRpnrYrZoRluluiWaaaaaaaaaaaaaaiYiYiYiYiYiYiYkeknsasasasasaknkeiYiYiYiYiYiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawvwwwxwyuZwfwfwzwAwBuZwCwDwEwFwGwHwIwJwJwfwKwfwfwfwfwLuZvyRoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajejelololololololojejekjkjkjlelekIkIkIlelekjkjkjjejekIkIkIkIkIkIkIjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXrsquqvpXpWsgshpXpYpZsipZpYiWluluoRoRoRsjskslsmoRpxslslslpnpypnpnpnoRluluiWaaaaaaaaaaaaaakLsnsnsnsnsniYkeknsasasasasaknkeiYsososososokLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZuZwOwfwfwPuZwQwRwSwTwUwVwWwJwJwfwKwfwXwYwfwfuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajejejejejejejejejekjkjkjkjkjlekIkIkIlekjkjkjkjkjjejejejerijejejejeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpXpXpXpXpXpXpXpXpXpXpXpXpXiWlululuoRoRpnpnpnpnoRpnslslslpnoRstoRoRoRluluiWaaaaaaaaaaaaaakLsnsnsnRLsnsusvknswswswswswknsxsysoRMsososokLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZxewfuZuXxfxgxhxixjxkwWwJwfwOuXuZuZuXxlxmuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUjekIkIkIjetVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlulululuoRoRsJsKsLoRpnpnpnpnpnoRoRoRoRlululuiWaaaaaaaaaaaaaakLsnsnsnsnsniYkeknknknknknknknkeiYsososososokLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZxqxruZuZuZuZuZuZuZuZxswfwfwfwfxtwfwfwfwfuZuZxuwfuXuZxvxvuZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUucudueueuetUufugubububtUuhuhuiujtUlIkIkIkIlIuktKtNtMtOtKtPtVtPtQtRtRunumupuouotVuqurusuttVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlululululuoRoRoRoRoRoRoRoRoRoRoRoRlululululuiWaaaaaaaaaaaaaaiYiYiYiYiYiYiYsWsXkekeknkekesYsZiYiYiYiYiYiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZxDxEuZxFuZxGxHxIuXuZxJwfwJwJwJwJwJwJwJwJwJwfwJwfxKxLwJwJwfuZvyNGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuBubuBtUubububububuCufufDIubububububububtUkIkIkIkIkIukululululululululuEuFuFuFuGululultVuHululuItVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlulululululululululululululululululululululuiWaaaaaaaaaaaaaaaaiYtlqmtmtniYiYiYiYkeknkeiYiYiYiYtotptptqiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxVDJwJxXuZxYuXuZxZuZyauZybwJwJycydyeyfygyhyiwJwJwJwJyjykwJwJwfuZvyRlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUubububububuCubububububtUububububtUkIkIkIkIkIukvCvUvTvTxzxzytulululululululululyLululuRuStVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlulululululululululululululululululululululuiWaaaaaaaaaaaaaaaaiYttqmqmqmtutulBkdkeknkekdlBtvtwtxtytytziYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayyEZyAwJyBwfwfwfwfyCwfwfwfwJwJyDyEyFyGyHyIyJwJwJwJwJyKwJwJwJwfuZvyRlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuCubuCtUububvavbvctUubGwubububtUtUtUtUtUtUjezflezfjetVtVukukukuktVtVuIulvevfululululzxtVvgvhulvitVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWaaaaaaaaaaaaaaaalBqmqmqmqmqmqmtSkeknknknketSqmqmqmqmqmqmlBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZyMyNuZyOyPyQyRySwfyTwfwfwJwJwJwJwJwJwJwJwJwfwJwfyUwfyVwJwpuZvyRoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUububububububtUuCuCtUugufubububvAvBvBvBvBtUjekIkIkIjetVzyzzzzzzzzzytVulululululzAzBultVtVtVtVtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYtWqmqmtXtYqmlBkeknknknkelBqmqmqmqmqmqmiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZyZzauZuZuZuZuZuZuZuXzbwfwfwfwfwXwfwfwfwfuZuZxuwfuXuZzczduZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUubvOvOvOububuCvPvPuCufufubububvQvBvBvBvBvRkIkIkIkIkIvSululzCzDululvVululvWvXulzEzFultVvYvZwawbwctVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQjuuqmqmtvqmqmiYiYlBuvlBiYiYuwuxqmuyGxuAQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZxewfuZuXzgzhzizjzkwHzlwJwfzmuXuZuZuZwfznuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUubwqwrwsububwtububwtububububwuufvBvBvBvBuClIkIkIkIlIukululzCzDululukulululululxSzGulyLululululultVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQjuJqmqmtXtYqmiYuKuLuMuNuOiYlwlwuPlwlwlwQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZwfzmwfwfzpuZzqzrzsztyWwVzvwJwJwfzwwfxtwfwfwfuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUubvOvOvOububwtububwtubububububwNvBvBvBvBvRkIkIkIkIkIvSululzCzDululvVululvWvXulululzHtVtVtVyLtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYIaqmqmqmqmqmiYuMuUuMuUuMiYuVqmqmqmuWlwiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazKzLzMzNuZwfwfwhzOzPuZzQzRzSzezUxkzVwJwJwfzwwfwfwfwfwfuZvyNGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUububububububtUuCuCtUuCuCwZuCuCuCxaxaxavBtUkIkIkIkIkItVzIululululzHtVzIzHzJxzxzxzxzzTtVxbxcxcxcxdtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYvjvkvlvmvniYvoIbvqKlvsiYuVqmqmqmuWiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAlwfwfwfAmwfwfAnApApuZuZAqArAsuZuZAtAuAvwfuZAwAxAywfwpuZvyRlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuCubuCtUububububugtUubububububtUtUuCuCuCtUlolololokItVzWululululzXxnzWzXtVukukzYukuktVxoulululxptVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYvDvDvDvDvDiYiYiYiYiYiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuXADAEuZAFwfAGAHAIuZuZaaaaaauZuZuXAJAKuXuZAqAsuZALAMuZvyRlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUububububxwtUububufububtUububububxxkIkIkIkIkIukzZulzCzDulzXxyAazXtVxAulululxAtVxBulululxCtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZuZAqArAsuZaaaaaaaaaauZuZATAUuZuZaaaauZuZuZuZvyRoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuBubuBtUxMubububxNtUubxOufxPubwZubububxQxRkIlolololoukAbulzCzDulzXxTzWzXtVulululululyLululuRulxUtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauXAYAZuXaaaaaaaauZuZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUylugubymyntUyoypyqwqyrtUububKmDIuCkIkIkIkIkIukAcxzAdAexzzTtVLdzTtVyuulyuulyutVyvywywywyxtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUjezfzfzfjetVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYAgAgAgAgAgAgAgAgAgAgAgAgAgyYAgAgAgAgAgAgzojhkIkIkIjhzoAgAgAgAgAgAgyYAgAgAgAgAgAgAgAgAgAgAgAgyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYAgAgAgAgAgAgAgAgAgAgAgAgAgyYAgAgAgAgAgAgzolIkIkIkIlIzoAgAgAgAgAgAgyYAgAgAgAgAgAgAgAgAgAgAgAgyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYAgAgAgAgAgAgAgAgAgAgyYyYAhyYyYAgAgAgAgAgzojhkIkIkIjhzoAgAgAgAgAgyYyYAhyYyYAgAgAgAgAgAgAgAgAgyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYzozozozozozoyYzozoyYyYAiAiAjyYyYzozozoyYAkzoyXyXyXzoAzyYzozozoyYyYAjAiAiyYyYzozozozozoyYyYyYyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyXyXyXyXyXyXyXyXyXzuyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXzuyXyXyXyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyXyXyXyXyXyXyXyXyXyYyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyYyXyXyXyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaBKBKBKBLBKBKBKaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyXyXyXyXyXyXIgyXyXzuyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXzuyXIJyXyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaBKBLBKBKBUBVBWBKBKBLBKaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYzozozozozozoyYzozoyYyYAAAAAAyYyYzoyYzozozozozoyYzozozozozoyYzoyYyYAAAAAAyYyYzoyYzozozozozozoyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaBKBKBKCcCdBKCeCfCfBKCgChBKBKBKaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoyXyXyXyXCrzoaaaaBraaaaaaaaaaaaaaaaaaBraaaazoCryXyXyXCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaBKBKCjCkClClBKCmCfCfBKCnCoCpCqBKBKaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaBraaaaaaaaaaaaaaaaaaBraaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKBKCtCuCvClClBKCwCfCfBKCxCxCxCxCyBKBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoABACyXyXyYaaaaBraaaaaaaaaaaaaaaaaaBraaaayYyXBJBCBNyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKCCCDCECvClClCFCxCxCxCGCxCxCxCHCxCIBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPBByXBwzoaaaaBraaByBzBzBzBzBzByaaBraaaazoBxyXAQyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBKBKClCMCMClClClBKCNCxCOBKCPCxCQCxCxCRBKBKaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARBMyXyXzoaaaaBrByBEASBGBHBIAVBEByBraaaazoyXBMBCBDyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBLCSClClClClClCTBKCNCxCUBKCVCxCxCWCxCxCXBLaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaBrByBOBPBQBRBQBSBTByBraaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKBKBKDcDdClDeDdBKBKBKCGBKBKBKDfDgCxDhDiBKBKBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBtyYzozozoyYyYyYyYyYyXyXyXyXyXyYBrBrBrBzBRBRBZCaCbBRBRBzBrBrBryYyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKCxBKBKBKCFBKBKBKDlDmDnDoDpBKBKBKCGBKBKBKDqBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaaaByBRBRBECiBEBRBRByaaaaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBLLtCxDuDvCxDwDxBKDyDnCxDzDABKDBDnCxDnDCDDDqBLaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoAByXyXCrzoaaaaByBECsAWBEByBEAWCsBEByaaaazoCryXyXyXCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBLLBCxDFCxCxCxCxCGDnCxBKCxDnCGCxCxCxCxDGDqDqBLaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPyXAXzozozozoCzCABRBRCBBaCBBRBRCACzzozozozoAByXAXzozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBLMFCxDnDnCxMLMOBKDKDnCxDnDLBKDMDnCxDnBKDNDOBLaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARyXBbCKyXBcCKCLRNBRBRBRBRBRBRBRBRCLCKyXBcCKAPyXBbCJAOANBXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKCxBKBKBKCGBKBKBKDPDQDnDRDSBKBKBKCGBKBKBKDTBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXBbCKBdyXCKCLBRBRBRBRBRBRBRBRBRCLCKBdyXCKAPyXBezozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKBKBKDUDVCxDWDXBKBKBKCGBKBKBKDYDZCxEaEbBKBKBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBtyYzozozoyYyYyYyYyYyXyXyXBezozozozoCzBfBRCZDaBRCZDaBRDbCzzozozozoARyXyXBvzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBLEeCxCxCxCxCxEfBKEgEhEiBKEjCxCxCxCxCxCxBLaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBvzoaaaaBzDjBRCZDaBRCZDaBRDkBzaaaazoBvyXyXyXyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBKBKDqEsDqEtCxEuBKEvEwExBKDZCxEyEzEAEBBKBKaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoAByXyXDryYaaaaBzDjBRCZDaCaCZDaBRDkBzaaaayYyXyXyXyXyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKDqECEDEECxCxCGEFCxEGCGCxCxEHEIEJEBBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPyXyXBvzoaaaaBzDjBRCZDaBRCZDaBRDkBzaaaazoBvyXyXyXyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKBKEQDqDqCxERBKEvCxExBKDnCxESETEUBKBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARyXAXzozozozoCzBgBRCZDaBRCZDaBRBhCzzozozozoAByXyXBvzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaBKBKEWEXCxEYBKBKCGBKBKDnCxEBEBBKBKaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXBbCKyXBcCKCLBRBRBRBRBRBRBRBRBRCLCKyXBcCKAPyXAXzozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaBKBKBKFbFcBKCxCxCxBKFdFeBKBKBKaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBtyYzozozoyYyYyYyYyYyXyXyXBbCKBdyXCKCLBRBRBRBRBRBRBRBRBRCLCKBdyXCKAPyXBbCJAOANBXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaBKBLBKBKFfFgFhBKBKBLBKaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXBezozozozoCzAWEcAWByBiBjEdBiBjCzzozozozoARyXBezozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaBKBKBKBLBKBKBKaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoAByXyXCrzoaaaaByEkElEmByEnEoEpEqErByaaaazoCryXyXyXCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPyXyXBwzoBrBrByEkElEmByBkBlEpEpEpByBrBrzoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARyXyXyXyYaaaaByEkEKBmByELEMBnEOEPByaaaayYyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaByEVEVBEByByByBEEVEVByaaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoyXAXBpBoBqzoaaaaByRpRpByFaFaFaByRpRpByaaaazoBuBoBAABCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyYzoCJCJBtyYaaaaaaaaaaByRpRpRpByaaaaaaaaaayYBtCJCJzoyYyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBFCYBYzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBFCYBYzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoDsFiENzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoDsFiENzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozoBXBXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBXBXzozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFkFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFlFnFnFnFoFpFoFoFoFoFoFoFoFoFnFnFnFnFkFmFqFqFrFqFqFqFsFsFsFqFqFsFsFsFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFlFnFoFoFoFoFoFtFoFoFoFtFoFoFnFnFnFnFkFmFuFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFvFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFjFjFjFjFjFnFoFoFpFoFoFoFtFoFoFoFtFoFoFoFnFnFnFkFmFqFqFqFqFqFqFqFqFqFqFqFqFqFwFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFxFyFyFzFAFzFyFyFBFjFoFpFoFoFoFoFoFtFoFoFoFtFoFoFoFoFnFnFkFmFqFqFqFqFqFqFqFqFqFqFqFqFqFuFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFCFyFyFyFyFyFyFyFyFjFoFoFoFoFoFoFoFtFDFEFDFtFoFoFoFoFoFnFkFmFqFqFqFqFFFwFqFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFGFyFHFIFIFIFJFyFyFjFjFKFKFjFoFtFDFtFtFtFtFtFDFtFoFpFoFoFkFmFqFqFqFqFqFLFLFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFMFNFOFjFyFyFyFPFQFQFQFRFyFyFyFjFSFSFjFtFtFTFUFVFWFXFYFTFtFtFoFoFoFkFmFqFqFqFqFLFZGaFLFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjGbGbGbGcFyFyFyFPFQFQFQFRFyFyFyGdFSFSGdGeROFtGgGhGhGhGiGjGkFtFoFoFoFkFmFqFqFqFqFLGlGmFLFqFqFFFqGnFqFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjGoGoGoFjFyFyFyFPFQFQFQFRFyFyFyFjFSFSFjFtGpGqGrGjGjGjGjGjGsFtFoFoFoFkFmFqFqFqFqFqFLFLFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFyFyGtGuGuGuGvFyFyFjFjFKFKFjFtFTFTPPGjGjGjPQFTFTFtFoFoFpFkFmFqFqFwFqFqFqFqFqFqFqFqFqFqFqFqFqFuFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFjFyFyFyFyFyFyFyGyFyFjFoFoFoFoFoFtFTGzGjGAGjGBFTFtFoFoFoFoFkFmFqFqFFFwFqFqFqFqFqFqFqFqFqFqFqFqFwFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFjGCGCGCFyFyFyGCGCGCFjFoFoFpFoFoFoFtFtGDGEGFFtFtFoFoFoFoFoFkFmFqFqFqFqFqFqFqGGFqGHFqGHFqGIFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFjFjFjFjFKGJFKFjFjFjFjFoFoFoFoFoFoFoFtGKGLGMFtFoFoFoFoFoFoFkFmFqFqFqGNFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoGOFoFoFoFoGPGQGRGSGTGUGPFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkFmGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVFmFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGWGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGWFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFpFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoGOFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoGOFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFpFoFoFoFoFoFoGOFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGSFjFjFKFKFKFjFjFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGSFjHaFyFyFyHbFjFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFKFKFKFKFjFKGJFKFjFyFyGCFyFyFjFKFjFjFjFKFjFjFjFjFjFjFjFjFjFjFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHcFyFyFyFyFyFyFyFyFyFyHdFjFyGCHeGCFyFjHfHgFjHgHhFjHiHjHkFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHcFyFyFyFyFyFyFyFyFyFyFyFjFyFyHlFyFyFjFyHmFjHmFyFjHnHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFKGcFKFjHoFyFyFyFyFyFyFjHpFyFyFyHbFjFyFyFjFyFyFjHqHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHrGoHsFjFKHtFKFjFyFyFyFjFKFjHuFjFKFjFjHuFjHuFjFjFjHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHvGoHwFjHxHxHxFjFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyHyHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHzHAHBFjHxHxHxFjFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFjHCHDFjaaaaaaaaaaFkGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYFkaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHEHFHGFjHHHIHJFjHcFjHcFjHKHKHKHKHKHKHKHKFyFyFBHLHMHMHMHMHMHMHMHMHMHMHMabababababababababababababababababababababaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababHNHNHNHNHNHNHNHNHNHNHNHNHNababababababababababHOHOHOHOHOHOHOHOHOHOHOHOHOababHKHKHPHQHRHSHTHUHKHKHKHKHKHMHVHWHXHWHXHWHXHWHXHMaaaaaaaaHZRyRzRAHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIeIeIeIfHNMyMyIhHNIiIjIjHNIeIdIdIdIdIdIdIdIdIdIdHOIkIlHOIkIlHOIkIlHOIkIlHOIdIdHKImInInInInInInIoHKHKIpHKHMHVHVHVHVHVHVHVHVHVHMaaaaaaaaHZIqIqIqHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIeIfIfIfIrIjIjIjHNIjIjIsItIeIeIeIdIdIdIdIdIdIdIdHOHOHOHOHOHOHOHOHOHOHOHOHOIdIdHKIuInInIvIwInInIoHKInInIxHMHMHMHMHMIyHMHMHMHMHMHMHMIzHMIAIBIBIBIAaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIeIeIfIfICIfIjIjIDIjIjIjHNIEIFIeIeIdIdIdIdIdIdIdHOIkIlHOIkIlHOIkIlHOIkIlHOIdIdHKIGInInIHIIInInHYHKIKIKIKHMHVHVHVHVHVHVHVHVHVHVHVILIMINIOIPIPIPHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdIeIeIfHNIQIjIjHNIjIjIjHNIRISITIeIeHNHNHNHNHNHNHOHOHOHOHOHOHOHOHOHOHOHOHOIdIdHKIUInInIVIWInInIXHKInInInIYHVHVHVHVHVHVHVHVHVHVHVILIMINIOIPIPIPHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdIdIeIeHNIjIjIjHNIjIjIjHNIZISISItIeJaJbJcJdHNJeJfJgJhJiJjJkabIdIdIdIdIdIdIdIdHKJlInInInInInInIXHKInInInIYJmJmJmJnJnJnJmJmJmHMHMHMIzHMIAJoIPJpIAaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNHNHNHNHNHNHNHNIjIjIjJqISISISJrHNJsJtJtJuHNJvItJwItItItJxabIdIdIdIdIdIdIdHKHKIKIKHKJyJyHKIKIKHKHKJzJzHMHMHMHMHMHMHMHMHMHMHMIdIdIdaaHZJoIPJpHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJAJBJCJBJDJEHNIjIjIjHNISISISJFHNJGJtJtJHHNJIJJJKJLJwJMJNabIdIdIdIdIdHKHKHKInInInInInInInInInHKInInInHKJOJPJQJRJSHKJTJUJVHKHKHKIdaaHZJWIPJWHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJXJYJXJYJXJZHNIjIjIjHNKaKbKcHNHNHNIDHNHNHNHNHNKdKdKdHNHNabIdIdIdIdIdHKInHKInInInKeInInInInInKfInInInHKKgJPJPJPKhHKKiKiKiKjKkHKIdaaHZRsIPRuHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJYKnJYJYJYKoKpIjIjIjHNHNHNHNHNIjIjIjIjItKpKqKrIfIfKsIfIeabIdIdIdIdIdHKKtHKInInInInInInInInInKfInInInHKKuJPJPJPKvHKKwKiKiHKHKHKIdaaHZKxKyKxHZaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJXJYJXJYKzKAHNIjIjIjIjIjIjIjIjIjIjIjIjIjKBKqIfKCKDKEIfIeabIdIdIdIdIdHKHKHKInKFKGInInInInKHKIHKInInInHKKJJPJPJPKKHKKLKiKiKMKNHKIdaaaaHZKOHZaaaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNKPJBKQJBKRJBHNKqIjIjIjIjIjIjIjIjIjHNHNHNIeKSKqIfIfIfKTIeabIdIdIdIdIdIdIdHKHKIKIKHKKUKUHKIKIKHKHKInInHKHKHKKVHKHKHKHKKWHKHKHKHKIdaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNHNHNHNHNHNHNHNKXKYKXHNHNHNHNHNHNHNHNIeIeIeIeKZIfIfIfLaIeabIdIdIdIdIdIdIdIdHKLbInInInInInInLcHKRvInInIKLeLfLgLgLhHKLiLiLjLjLjHKHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNHNIiIjIjKqKqHNLkLkLkLkLlHNLmIjIjIjLnHNHNIeIeIeIfLoKDKDLpIeabIdIdIdIdIdIdIdIdHKLbInInLqLrInInLsHKRwInInHKLgLgLuLgLgHKLiLiLvLvLvLwHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNIjIjIjIjIjKqHNLkLkLxLkLkHNIjIjIjIjKqKqHNIeIeIeLyIfIfIfIfIeabIdIdIdIdIdIdIdIdHKLbInInLbLzInInLAHKRxInInLCLgLDLELFLgLGLiLiLiLiLiLHHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNIjIjIjIjIjIjKYLkLILJLKLkKYIjIjIjIjIjKqHNIeIdIeIeLLLMIfIeIeabIdIdIdIdIdIdIdIdHKLbInInLNLOInInLPHKLQInInHKLgLDLELFLgHKLiLiLvLvLvLRHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNKqIjHNKXKXKXHNLkLILSLKLkHNKXKXKXHNIjIjHNIeIdIdIeIeIeLTIfIeabIdIdIdIdIdIdIdIdHKLbInInInInInInLPHKInInInIKLgLgLULgLgHKLVLVLjLjLjHKHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdaaHNIjKqHNaaaaaaHNLWLkLXLkLkHNaaaaaaHNIjIjHNIeIdIdIdIdIeIeLYIeabIdIdIdIdIdIdIdIdHKHKHKLZMaMbMcHKHKHKHKInInHKIKLgLgLgIKHKHKHKIKIKIKHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdaaaaaaMdMeMeMfaaaaaaHNHNKXKXKXHNHNaaaaaaMdMeMeMfaaIdIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdIdHKHKHKHKHKHKaaaaMgMhMhMiIKIKIKIKIKaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdaaaaaaaaMdMjMkMfaaaaaaaaaaaaaaaaaaaaaaaaaaMdMjMkMfaaIdIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaMgMlMmMiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdaaaaaaaaMdMeMeMfaaaaaaaaaaaaaaaaaaaaaaaaaaMdMeMeMfaaaaIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaMnMhMhMoaaaaaaaaaaaaMpMpMqMrMsMpMpMpMpMpMpMpaaaaaaIdIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtMuMvMtaaaaaaMtaaaaaaaaaaMtaaaaaaMtMwMxMtaaaaIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaMpMzMzMpaaaaaaMpMpMpMpMAMBMBMBMBMBMCMpMDMERDaaaaaaaaIdIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtMGMHMtaaaaaaMtMIMJMJMJMKMtaaaaaaMtRPMMMtaaaaaaaaIdIdIdIdIdabIdIdIdIdIdIdIdIdaaaaaaaaaaaaMpMpMpMpMNRQMPMQMRMSMpMpMTMUMpMVMBMBMBMBMBMWMpMDMERRaaaaaaaaaaIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtMYMZMtaaaaMtMtNbNaNdNcNeMtMtaaaaMtNfNgMtaaaaaaaaaaIdIdIdIdabIdIdIdIdIdIdIdaaaaaaaaaaMpMpMpMBMBNhNiNjNkNlNmNnNnNoNpMBMpNqMBMBMBMpMpMpMpMDMERRaaaaaaaaaaIdIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtNrMtMtaaaaMtMtNtNsNuNsNvNwMtaaaaMtMtNxMtaaaaaaaaaaIdIdIdIdabIdIdIdIdIdIdaaaaaaaaMpMpMpMpNyMBMBMpNzNANAMQNBMBMBMBMBNyMpNCMBMBNDMpNENFMpMDMERSaaaaaaaaaaaaIdIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtNHNIMtMtMtMtNJNsNsNsNsNsNJMtMtMtMtNKNMMtaaaaaaaaaaIdIdIdIdabIdIdIdIdIdaaaaaaaaMpMpNNNOMpMBMBNPMpNQNRNSNTMpNUNVMBMBMpMpMpNWMBNXNYNZOaMpMpMpMpMpaaaaaaaaaaaaIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdaaaaaaaaaaaaMtObOcOdOeOfMtOgNsNsNsNsNsOgMtOhOiOjOcObMtaaaaaaaaaaIdIdIdIdabIdIdIdIdaaaaaaaaaaOkOlMBOmMpMBMBOnMpOoOpOpOqMpMpMpMpOrMpOsMpMSOrMpMpNZOtMpOuOvOwMpMpaaaaaaaaaaIdIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxIdaaaaaaaaaaaaaaMtObOcOcOcOyMtOzOAOBOCOzOAOBMtNLOcOcOEObMtaaaaaaaaaaIdIdIdIdabIdIdIdIdaaaaaaaaaaOFOGOpOHMpMBMBNPMpOIOpOpOJMpMBOKOLOpMBMBMBOKOpMBMpMpMpMpNZNZNZOMMpMpaaaaaaaaaaIdIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaOOObOcOcOcOcOCNsNsNsNsNsNsNsOCOcOcOPOcObOOaaaaaaaaaaaaIdIdIdabIdIdIdIdaaaaaaaaaaOFOQOROpOSOpOpOpOSOpOpOpOpOSOpOpOpOpOpOTOpOpOpNZNZNZNZOUNZNZNZNZOVMpaaaaaaaaaaaaIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaOWOXOcOYOZOcMtPaPbNsNsNsPdPcMtOcPeOcPfObOWaaaaaaaaaaaaIdIdIdabIdIdIdaaaaaaaaaaaaOFPgOpPhMpMBMBNPMpOIOpOpOJMpMBNWMBOpMBMBMBNWOpMBMpMpMpMpPiNZNZPjMpMpaaaaaaaaaaaaIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaPkOXOcOcMtPlMtMtMtPmPoPnMtMtMtPpMtPqPrPsPkaaaaaaaaaaaaaaIdIdabIdIdIdaaaaaaaaaaaaPtPuMBPvMpMBMBOnMpOoOpOpOqMpMpMpMpOrMpPwMpMSOrMpMpPxPxMpPyPzPAMpMpaaaaaaaaaaaaaaIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaMtMtPBPCPCMtPDPEPDPFPGPIPHPFPJPKPLMtPMPNPOMtMtaaaaaaaaaaaaIdIdabIdIdaaaaaaaaaaaaaaMpMpRBRCMpMBMBNPMpPRMBMBPRMpPSPTMpMBMpMpMpPUOpPVOpPWPXMpMpMpMpMpaaaaaaaaaaaaaaaaIdIdIdabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaMtMtPYPYMtMtPDPDPDPZPGQaPHPZPLPLQbMtMtPYPYMtMtaaaaaaaaaaaaIdIdabIdIdaaaaaaaaaaaaaaaaMpMpMpMpNyMBMBMpMpMpQcMpMpNZNZQdMBNPMpQeQfOpOpQgQhQiMpMDMERDaaaaaaaaaaaaaaaaaaaaIdIdabaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaMtRTRTMtMtQkQlPDQmQnNsQnQmPLPLQoMtMtRTRTMtaaaaaaaaaaaaaaIdIdabIdaaaaaaaaaaaaaaaaaaaaaaMpMpMpMBMBMBMpNENZMpQpNZNZQqQrQsMpOpOpOpOpQtQuQvMpMDMERRaaaaaaaaaaaaaaaaaaaaIdIdabaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtPDQwPDMtMtQxMtMtQyPLQzMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaMpMpMpMpMpQAQBMpMpMSMpMpQCQDMpQEOpOpOpQFOpQGMpMDMERRaaaaaaaaaaaaaaaaaaaaIdIdabaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtPDPDQHMtQIQJQKMtPLPLQLMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMpMpMpMpaaaaaaMpMpMpMpQMQNOpQOQPQQQRMpQSMERSaaaaaaaaaaaaaaaaaaBrBrIdabaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtMtQTPDMtQUQJQVMtQWQXMtMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMpMpQYQZRaMpMpMpMpMpMpMpaaaaaaaaaaaaaaaaBrBraaIdabaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtMtMtMtMtRbRcRdMtMtMtMtMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdBrBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBrBraaaaIdOxaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaaaaaMtMtPYPYPYPYPYMtMtaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdabIdaaBrBraaaaIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBrBraaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaIdIdIdaaaaaaaaaaaaaaaaaaMtRTRTRTRTRTMtaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdabIdaaaaBrBrIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdaaaaaaaaaaONaaaa -aaaaabababababababReabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdaaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdabIdaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdaaaaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdaaaaaaIdabIdaaaaaaaaIdIdIdIdIdIdIdBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdaaaaaaIdabIdaaaaaaaaaaIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdaaaaaaaaIdabIdaaaaaaaaaaaaaaaaIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdaaaaaaaaaaaaaaaaaaaaONaaaa -aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaa -aaaaRfababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONRgRgOxONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -"} +"aa" = (/turf/space,/area/space) +"ab" = (/turf/unsimulated/wall,/area/space) +"ac" = (/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) +"ad" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/wall,/area/space) +"ae" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) +"af" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) +"ag" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) +"ah" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"ai" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aj" = (/obj/structure/table/rack/holorack,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/head/pin/flower,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) +"ak" = (/obj/effect/landmark/costume,/obj/structure/table/rack/holorack,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) +"al" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"am" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"an" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) +"ao" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife) +"ap" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_plating) +"aq" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"ar" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"as" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"at" = (/obj/structure/flora/ausbushes/fullgrass,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"au" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"av" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) +"aw" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) +"ax" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) +"ay" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"az" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aA" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) +"aB" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"aC" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aD" = (/obj/effect/landmark{name = "Holocarp Spawn"},/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife) +"aE" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"aF" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"aG" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"aH" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood/corner,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aI" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aJ" = (/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"aK" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aL" = (/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) +"aM" = (/obj/effect/floor_decal/carpet{dir = 5},/obj/effect/floor_decal/carpet{dir = 6},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"aN" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"aO" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) +"aP" = (/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"aQ" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"aR" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 4; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) +"aS" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) +"aT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/holostool,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) +"aU" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) +"aV" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"aW" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"aX" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"aY" = (/obj/machinery/door/window/holowindoor{dir = 1},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"aZ" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"ba" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{icon_state = "spline_fancy"; dir = 10},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bb" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 6},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bc" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bd" = (/obj/structure/bed/chair/holochair,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"be" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"bf" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"bg" = (/obj/structure/bed/chair/holochair,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"bh" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bi" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bj" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) +"bk" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) +"bl" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bm" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bn" = (/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bo" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bp" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bq" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"br" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bs" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bt" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bu" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bv" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bw" = (/obj/structure/table/woodentable/holotable,/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bx" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"by" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bz" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bA" = (/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bB" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bC" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bD" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bE" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 9},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bF" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bG" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bH" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 4},/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"bI" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bJ" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bK" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bL" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bM" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 4},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bN" = (/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bO" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bP" = (/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bQ" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bR" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bS" = (/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bT" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) +"bU" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bV" = (/obj/structure/flora/ausbushes/fullgrass,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"bW" = (/obj/effect/floor_decal/carpet,/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bX" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"bY" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/machinery/door/window/holowindoor{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"bZ" = (/obj/machinery/door/window/holowindoor{dir = 4; name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) +"ca" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cb" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cc" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) +"ce" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) +"cf" = (/turf/simulated/floor/holofloor/space,/area/holodeck/source_space) +"cg" = (/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"ch" = (/obj/structure/flora/pottedplant{icon_state = "plant-06"},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) +"ci" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) +"cj" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"ck" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cl" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"cm" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cn" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/structure/window/reinforced/holowindow{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"co" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cp" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) +"cq" = (/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) +"cr" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"cs" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"ct" = (/obj/machinery/door/window/holowindoor{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"cu" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"cv" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"cw" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) +"cx" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"cy" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"cz" = (/obj/effect/landmark{name = "Holocarp Spawn Random"},/turf/simulated/floor/holofloor/space,/area/holodeck/source_space) +"cA" = (/obj/structure/flora/grass/both,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"cB" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"cC" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cD" = (/obj/effect/floor_decal/corner/green{dir = 5},/obj/structure/holohoop,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cE" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cF" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cG" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"cH" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) +"cI" = (/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cJ" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"cK" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cL" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"cM" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"cN" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) +"cO" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cP" = (/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) +"cQ" = (/obj/effect/overlay/palmtree_l,/obj/effect/overlay/coconut,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) +"cR" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"cS" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 2; icon_state = "right"; name = "Red Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"cT" = (/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"cU" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"cV" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"cW" = (/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"cX" = (/obj/effect/floor_decal/carpet{dir = 5},/obj/effect/floor_decal/carpet{dir = 6},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"cY" = (/obj/item/weapon/beach_ball,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) +"cZ" = (/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"da" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"db" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dc" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dd" = (/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"de" = (/obj/structure/flora/grass/green,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"df" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dg" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/under/color/green,/obj/item/clothing/suit/armor/tdome/green,/obj/item/weapon/holo/esword/green,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dh" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"di" = (/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dj" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dk" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"dl" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dm" = (/obj/item/weapon/inflatable_duck,/turf/simulated/floor/holofloor/beach/sand,/area/holodeck/source_beach) +"dn" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"do" = (/obj/effect/floor_decal/spline/plain{dir = 5},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"dp" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dq" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dr" = (/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"ds" = (/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dt" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"du" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dv" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dw" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dx" = (/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dy" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dz" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dA" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dB" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dC" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 4; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) +"dD" = (/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dE" = (/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dF" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dG" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dH" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 4; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) +"dI" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dJ" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dK" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"dL" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"dM" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dN" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dO" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dP" = (/turf/unsimulated/beach/sand{icon_state = "beach"},/area/holodeck/source_beach) +"dQ" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"dR" = (/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"dS" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Green Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"dT" = (/obj/effect/floor_decal/corner/green/full,/obj/structure/window/reinforced/holowindow/disappearing{dir = 2},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dU" = (/obj/effect/floor_decal/corner/green{dir = 10},/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dV" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"dW" = (/turf/simulated/floor/holofloor/beach/water,/area/holodeck/source_beach) +"dX" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dY" = (/obj/item/weapon/beach_ball/holoball,/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"dZ" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"ea" = (/obj/effect/floor_decal/corner/green/full{dir = 1},/obj/structure/table/holotable,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"eb" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"ec" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"ed" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove{icon_state = "boxinggreen"; item_state = "boxinggreen"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"ee" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) +"ef" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) +"eg" = (/obj/structure/table/rack,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"eh" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Weapon Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ei" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ej" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ek" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/rocket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"el" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"em" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/obj/item/weapon/rig/ert/assetprotection,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"en" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"eo" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ep" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/obj/item/ammo_magazine/m545saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"eq" = (/obj/structure/table/rack,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"er" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"es" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"et" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"eu" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"ev" = (/obj/machinery/deployable/barrier,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ew" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ex" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ey" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/ionrifle,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ez" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/ionrifle/pistol,/obj/item/weapon/gun/energy/ionrifle/pistol,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eA" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eB" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eC" = (/obj/machinery/teleport/hub,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eD" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eE" = (/obj/machinery/mech_recharger,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eF" = (/obj/machinery/mech_recharger,/obj/mecha/combat/gygax/dark,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eG" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eH" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eI" = (/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eJ" = (/obj/structure/table/steel_reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eK" = (/obj/structure/table/steel_reinforced,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eL" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eM" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"eN" = (/obj/item/weapon/bikehorn/rubberducky,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"eO" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/curtain/open/shower,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"eP" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Armor Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"eQ" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/launcher/grenade,/obj/item/weapon/gun/launcher/grenade,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eR" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eS" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eT" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eU" = (/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eV" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/taser,/obj/item/weapon/gun/energy/taser,/obj/item/weapon/gun/energy/taser,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/night{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses/sechud/tactical{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eX" = (/obj/structure/closet/wardrobe/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eY" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"eZ" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fa" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fb" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fc" = (/obj/structure/table/standard,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/random/soap,/obj/random/soap,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fd" = (/obj/structure/urinal{pixel_y = 32},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fe" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/window/reinforced/tinted,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"ff" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fg" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/curtain/open/shower,/obj/structure/window/reinforced/tinted,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fh" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fi" = (/obj/structure/table/steel_reinforced,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fj" = (/obj/item/mecha_parts/mecha_equipment/teleporter,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fk" = (/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fl" = (/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fm" = (/obj/structure/table/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fn" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/emps{pixel_x = 4; pixel_y = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/box/frags,/obj/item/weapon/storage/box/smokes,/obj/item/weapon/storage/box/smokes,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fo" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fp" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fq" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fr" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fs" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/obj/item/clothing/accessory/storage/black_drop_pouches,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ft" = (/obj/structure/table/reinforced,/obj/item/weapon/shield_diffuser,/obj/item/weapon/shield_diffuser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/shield_diffuser,/obj/item/weapon/shield_diffuser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fv" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"fw" = (/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fx" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fz" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fA" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) +"fB" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fC" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fD" = (/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,/obj/item/mecha_parts/mecha_equipment/tool/rcd,/obj/item/weapon/pickaxe/diamonddrill,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fE" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fF" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fG" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/hip,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fH" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fI" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fJ" = (/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fK" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fL" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fM" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fN" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"fO" = (/obj/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fP" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fQ" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fR" = (/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"fS" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/flash,/obj/item/ammo_magazine/m45/flash,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fT" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fU" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fV" = (/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fW" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fX" = (/obj/structure/table/rack,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/taperoll/police,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"fZ" = (/obj/structure/table/rack,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/item/clothing/accessory/holster/leg,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ga" = (/obj/machinery/door/airlock/centcom{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gb" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gc" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"gd" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"ge" = (/obj/structure/sign/warning/secure_area/armory,/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) +"gf" = (/obj/structure/sign/warning/secure_area,/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) +"gg" = (/obj/effect/floor_decal/corner/red{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gh" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gi" = (/obj/effect/floor_decal/corner/red{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gj" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gk" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gl" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gm" = (/obj/structure/table/rack,/obj/item/device/lightreplacer,/obj/item/device/lightreplacer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gn" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"go" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/centcomm,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gp" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gq" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/crowbar,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gr" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gs" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"gt" = (/obj/effect/floor_decal/corner/yellow,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gu" = (/obj/effect/floor_decal/corner/yellow{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gv" = (/obj/effect/floor_decal/corner/yellow{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gw" = (/obj/effect/floor_decal/corner/white,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gx" = (/obj/effect/floor_decal/corner/white{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gy" = (/obj/effect/floor_decal/corner/white{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gz" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gA" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gB" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gC" = (/obj/structure/table/rack,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gD" = (/obj/item/weapon/mop,/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gE" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket{amount_per_transfer_from_this = 50},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gF" = (/obj/structure/sign/greencross{desc = "White cross in a green field, you can get medical aid here."; name = "First-Aid"},/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) +"gG" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"gH" = (/turf/simulated/shuttle/wall/dark/no_join,/area/centcom/specops) +"gI" = (/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gJ" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gK" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gL" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gM" = (/obj/machinery/vending/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gN" = (/obj/structure/table/rack,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gO" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gP" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/pillbottles,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gQ" = (/obj/machinery/chemical_dispenser/full,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gR" = (/obj/machinery/chem_master,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gS" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gT" = (/obj/machinery/vending/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gU" = (/obj/item/clothing/glasses/hud/health{pixel_x = 4; pixel_y = 4},/obj/item/clothing/glasses/hud/health{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gV" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gW" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gX" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"gY" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"gZ" = (/turf/simulated/shuttle/wall/dark{join_group = "shuttle_ert"},/area/shuttle/response_ship/start) +"ha" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hb" = (/obj/structure/closet/crate/medical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"hc" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"hd" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/weapon/rig/ert/medical,/obj/item/weapon/rig/ert/medical,/obj/item/weapon/rig/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"he" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hg" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hh" = (/obj/structure/closet/crate/internals{name = "Mask Crate"},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hi" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hj" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"hk" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/response_ship/start) +"hl" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("NETWORK_ERT"); pixel_y = 26},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hm" = (/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hn" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"ho" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/structure/bed/chair,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hp" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/obj/machinery/light{dir = 4},/obj/structure/bed/chair,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hq" = (/turf/simulated/shuttle/wall/dark{hard_corner = 1; join_group = "shuttle_ert"},/area/shuttle/response_ship/start) +"hr" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_drop_pouches,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hs" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ht" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/response_ship/start) +"hu" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hv" = (/obj/machinery/computer/shuttle_control/web/ert{icon_state = "flightcomp_center"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hw" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "response_shuttle_door"},/obj/effect/shuttle_landmark{base_area = /area/centcom/specops; base_turf = /turf/simulated/floor/plating; docking_controller = "response_base"; landmark_tag = "response_ship_start"; name = "ERT Shuttle Bay"},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hy" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_shuttle_door"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hz" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_base_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"hA" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_base"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "response_base_door"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"hB" = (/obj/structure/reagent_dispensers/watertank,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hC" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hD" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hE" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hF" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hG" = (/obj/structure/table/reinforced,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/tool/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hI" = (/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hJ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hK" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hL" = (/obj/structure/table/rack,/obj/item/rig_module/device/rcd,/obj/item/rig_module/device/rcd,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/plasmacutter,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hM" = (/obj/structure/table/rack,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/healthscanner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hN" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/egun,/obj/item/rig_module/mounted/egun,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hO" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hP" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hQ" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start) +"hS" = (/obj/structure/flight_right{icon_state = "right"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hU" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hV" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"hW" = (/obj/structure/reagent_dispensers/fueltank,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hX" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hY" = (/obj/structure/table/steel_reinforced,/obj/item/taperoll/atmos,/obj/item/taperoll/atmos,/obj/item/taperoll/atmos,/obj/item/weapon/pickaxe/drill,/obj/item/weapon/pickaxe/drill,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"hZ" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ia" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ib" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/spaceacillin,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ic" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"id" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/obj/item/weapon/autopsy_scanner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ie" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"if" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ig" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ih" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"ii" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ij" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ik" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"il" = (/obj/structure/table/reinforced,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/obj/item/weapon/tool/crowbar,/obj/item/weapon/tool/screwdriver,/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"im" = (/obj/structure/table/reinforced,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"in" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/specops) +"io" = (/obj/machinery/shield_gen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ip" = (/obj/machinery/shield_gen/external,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iq" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ir" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"is" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"it" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iu" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iv" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/bodybags,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"ix" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iy" = (/obj/machinery/shield_capacitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iz" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iA" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iB" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/combat{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/combat,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iC" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/toxin,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iE" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/adv{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iF" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/o2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iG" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/clotting{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/clotting,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iI" = (/obj/structure/table/reinforced,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iJ" = (/obj/structure/table/rack,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/drill,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iK" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iL" = (/obj/structure/table/rack,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/grenade_launcher,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iM" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"iN" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"iO" = (/obj/structure/table/reinforced,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/weapon/material/knife/tacknife/combatknife,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iP" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iQ" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"iR" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) +"iS" = (/obj/structure/sign/warning/docking_area,/turf/unsimulated/wall,/area/centcom/command) +"iT" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) +"iU" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"iV" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"iW" = (/turf/unsimulated/wall,/area/centcom/command) +"iX" = (/turf/unsimulated/wall,/area/centcom/suppy) +"iY" = (/turf/simulated/shuttle/wall,/area/centcom/evac) +"iZ" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/evac) +"ja" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/suppy) +"jb" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/centcom) +"jc" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod2/centcom) +"jd" = (/turf/simulated/shuttle/wall,/area/shuttle/supply) +"je" = (/turf/unsimulated/wall,/area/centcom/main_hall) +"jf" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/wall/dark/no_join,/area/shuttle/supply) +"jg" = (/turf/unsimulated/wall,/area/tdome) +"jh" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall) +"ji" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"jj" = (/turf/unsimulated/wall,/area/centcom/creed) +"jk" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/creed) +"jl" = (/turf/simulated/shuttle/floor,/area/shuttle/supply) +"jm" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/supply) +"jn" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/supply) +"jo" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"jp" = (/obj/structure/closet/secure_closet/hydroponics,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"jq" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"jr" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/bar) +"js" = (/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/command) +"jt" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start) +"ju" = (/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"jv" = (/obj/structure/table/rack,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"jw" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod1/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/centcom) +"jx" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod2/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod2/centcom) +"jy" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"jz" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"jA" = (/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"jB" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"jC" = (/obj/machinery/chem_master/condimaster,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"jD" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"jE" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jF" = (/obj/structure/bed/chair/comfy/teal,/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jG" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jH" = (/obj/structure/table/wooden_reinforced,/obj/machinery/computer/security/telescreen{name = "Spec. Ops. Monitor"; network = list("ERT")},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"jI" = (/obj/structure/bed/chair/office/dark,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"jJ" = (/obj/item/device/radio/intercom/specops{pixel_y = -21},/obj/machinery/computer/communications{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start) +"jK" = (/obj/structure/closet/secure_closet/hos,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"jL" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/floor,/area/shuttle/supply) +"jM" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating/airless,/area/centcom/evac) +"jN" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 1"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"jO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 2"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"jP" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"jQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"jR" = (/obj/structure/closet/chefcloset,/obj/item/glass_jar,/obj/item/device/retail_scanner/civilian,/obj/item/weapon/soap/nanotrasen,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"jS" = (/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"jT" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"jU" = (/obj/structure/bed/chair/comfy/teal{dir = 4},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jV" = (/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jW" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/bananapeel,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jX" = (/obj/structure/bed/chair/comfy/teal{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"jY" = (/obj/structure/table/wooden_reinforced,/obj/machinery/button/remote/blast_door{name = "Spec Ops Ready Room"; pixel_y = 15; req_access = list(11); id = "CREED"},/obj/machinery/button/remote/blast_door{name = "Mech Storage"; icon_state = "doorctrl0"; pixel_y = 0; req_access = list(11); id = "ASSAULT"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"jZ" = (/obj/structure/table/wooden_reinforced,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"ka" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/supply) +"kb" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/shuttle/plating,/area/centcom/evac) +"kc" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/simulated/shuttle/plating,/area/centcom/evac) +"kd" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"ke" = (/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"kf" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_1_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_1_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"kg" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_2_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_2_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"kh" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/plating,/area/centcom/evac) +"ki" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"kj" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/centcom/main_hall) +"kk" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/centcom/evac) +"kl" = (/turf/simulated/shuttle/plating,/area/centcom/evac) +"km" = (/obj/machinery/door/airlock/maintenance_hatch{req_access = list(101)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"kn" = (/turf/simulated/shuttle/floor,/area/centcom/evac) +"ko" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/turf/simulated/shuttle/floor,/area/centcom/evac) +"kp" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac) +"kq" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac) +"kr" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/shuttle/plating,/area/centcom/evac) +"ks" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"kt" = (/obj/machinery/door/blast/regular{id = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"ku" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome2) +"kv" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome2) +"kw" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"kx" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/melee/energy/axe,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"ky" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/command) +"kz" = (/obj/machinery/door/airlock/centcom{name = "Administrative Office"; opacity = 1; req_access = list(108)},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"kA" = (/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"kB" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"kC" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/supply) +"kD" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "supply_shuttle"; pixel_x = 25; pixel_y = 0; req_one_access = list(13,31); tag_door = "supply_shuttle_hatch"},/obj/effect/shuttle_landmark/southern_cross/supply_offsite,/turf/simulated/shuttle/floor,/area/shuttle/supply) +"kE" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/shuttle/plating,/area/centcom/evac) +"kF" = (/obj/machinery/vending/engineering,/turf/simulated/shuttle/plating,/area/centcom/evac) +"kG" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/shuttle/plating,/area/centcom/evac) +"kH" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome2) +"kI" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"kJ" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/storage/briefcase,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"kK" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/floor,/area/shuttle/supply) +"kL" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/evac) +"kM" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod7/centcom) +"kN" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod8/centcom) +"kO" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"kP" = (/obj/structure/bed/chair/comfy/teal{dir = 1},/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"kQ" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) +"kR" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"kS" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/supply) +"kT" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_7_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 7"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"kU" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_7_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "escape_pod_7_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"kV" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_8_recovery"; pixel_x = 26; pixel_y = -26; req_one_access = list(13); tag_door = "escape_pod_8_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"kW" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_8_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 8"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"kX" = (/obj/effect/floor_decal/carpet,/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"kY" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"kZ" = (/obj/machinery/door/window/holowindoor{dir = 4; name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) +"la" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome) +"lb" = (/obj/machinery/door/blast/regular{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"lc" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"ld" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"le" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/main_hall) +"lf" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"lg" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/command) +"lh" = (/turf/simulated/shuttle/wall/hard_corner,/area/centcom/evac) +"li" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"lj" = (/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"lk" = (/obj/machinery/igniter,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"ll" = (/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"lm" = (/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"ln" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"lo" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"lp" = (/obj/machinery/smartfridge,/turf/unsimulated/wall,/area/centcom/bar) +"lq" = (/obj/structure/closet/secure_closet/bar,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"lr" = (/obj/machinery/door/window/holowindoor{dir = 4; name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) +"ls" = (/turf/simulated/shuttle/wall,/area/shuttle/transport1/centcom) +"lt" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) +"lu" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) +"lv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/shuttle/plating,/area/centcom/evac) +"lw" = (/turf/simulated/shuttle/wall/dark/no_join,/area/centcom/evac) +"lx" = (/obj/structure/closet/secure_closet/security,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"ly" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"lz" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"lA" = (/obj/structure/table/rack,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"lB" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) +"lC" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/centcom/evac) +"lD" = (/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod2/centcom) +"lE" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"lF" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"lG" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"lH" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"lI" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"lJ" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"lK" = (/obj/effect/floor_decal/corner/red{dir = 10},/obj/structure/holohoop{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"lL" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/transport1/centcom) +"lM" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"lN" = (/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"lO" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) +"lP" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) +"lQ" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"lR" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"lS" = (/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"lT" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"lU" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"lV" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"lW" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"lX" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"lY" = (/obj/structure/reagent_dispensers/watertank/high,/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"lZ" = (/obj/machinery/door/airlock/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"ma" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/glass/beaker,/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mb" = (/obj/machinery/door/airlock/freezer,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"mc" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"md" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"me" = (/obj/machinery/computer/rcon,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"mf" = (/obj/machinery/computer/station_alert/all,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"mg" = (/obj/machinery/computer/power_monitor,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"mh" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"mi" = (/obj/machinery/door/airlock/external{frequency = 1380; glass = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_bay_door"; locked = 1; name = "Transport Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"mj" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mk" = (/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"ml" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mm" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mn" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start) +"mo" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(1)},/turf/simulated/shuttle/plating,/area/centcom/evac) +"mp" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"mq" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"mr" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"ms" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"mt" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mu" = (/obj/machinery/biogenerator,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mv" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mw" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/fryer,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mx" = (/obj/machinery/computer/card/centcom{dir = 4},/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"my" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"mz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/centcom/evac) +"mA" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating/airless,/area/shuttle/transport1/centcom) +"mB" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mC" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mD" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) +"mE" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/shuttle/floor/yellow,/area/shuttle/transport1/centcom) +"mF" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "centcom_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mG" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"mH" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"mI" = (/obj/machinery/computer/pod{id = "thunderdomeaxe"; name = "Thunderdome Axe Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"mJ" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"mK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"mL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/grill,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mN" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mO" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"mP" = (/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"mQ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 26; pixel_y = 0; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"mR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/centcom/evac) +"mS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/centcom/evac) +"mT" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"mU" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/oven,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mV" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/knife/machete/hatchet,/obj/item/weapon/material/minihoe,/obj/item/weapon/material/minihoe,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mW" = (/obj/machinery/smartfridge/drying_rack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mX" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"mY" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"mZ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"na" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 02"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"nb" = (/obj/machinery/computer/pod{id = "thunderdomehea"; name = "Thunderdome Heavy Supply"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"nc" = (/obj/item/weapon/tool/wrench,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"nd" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"ne" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"nf" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"ng" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"nh" = (/obj/machinery/seed_storage/garden,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"ni" = (/obj/machinery/honey_extractor,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nj" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nk" = (/obj/machinery/computer/pod{dir = 8; id = "NTrasen"; name = "Hull Door Control"},/obj/item/device/radio/intercom/specops{pixel_y = -21},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/creed) +"nl" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"nm" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"nn" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"no" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"np" = (/obj/machinery/computer/shuttle_control/web/shuttle2{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"nq" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"nr" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/vending/dinnerware{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"ns" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/simulated/shuttle/floor,/area/centcom/evac) +"nt" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "large_escape_pod_2_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "large_escape_pod_2_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"nu" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"nv" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{pixel_x = 1},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"nw" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"nx" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/effect/wingrille_spawn/reinforced/crescent,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"ny" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"nz" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"nA" = (/obj/machinery/camera/network/thunder{c_tag = "Thunderdome Arena"; invisibility = 101},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"nB" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"nC" = (/obj/machinery/seed_extractor,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/candy,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nF" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"nG" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"nH" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"nI" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"nJ" = (/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/mob/living/silicon/decoy{name = "A.L.I.C.E."},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"nK" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"nL" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"nM" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor,/area/centcom/evac) +"nN" = (/obj/machinery/computer/pod{id = "thunderdome"; name = "Thunderdome Blast Door Control"},/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"nO" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"nP" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"nQ" = (/obj/structure/table/marble,/obj/item/weapon/storage/box/glasses/square,/obj/item/weapon/storage/box/glasses/square,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nR" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/icecream_vat,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"nS" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/supply) +"nT" = (/obj/machinery/computer/shuttle_control/web/shuttle1,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"nU" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1443; listening = 0; name = "Spec Ops Intercom"; pixel_y = 22},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"nV" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"nW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/obj/machinery/turretid{pixel_x = 0; pixel_y = 28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/command) +"nX" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/supply) +"nY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = -26; tag_door = "admin_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"nZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "large_escape_pod_1_recovery"; pixel_x = -25; pixel_y = -25; req_one_access = list(13); tag_door = "large_escape_pod_1_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"oa" = (/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"ob" = (/obj/structure/table/marble,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/obj/effect/floor_decal/corner/white/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"oc" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"od" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"oe" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/cooker/cereal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"of" = (/obj/structure/table/reinforced,/obj/item/weapon/card/id/gold/captain/spare,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"og" = (/obj/structure/table/reinforced,/obj/item/device/pda/captain,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/command) +"oh" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) +"oi" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 01"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"oj" = (/obj/structure/table/standard,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"ok" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"ol" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"om" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/supply) +"on" = (/obj/structure/flora/pottedplant/stoutbush,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall) +"oo" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"op" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"oq" = (/obj/machinery/account_database{name = "CentComm Accounts database"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"or" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"os" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"ot" = (/turf/simulated/shuttle/plating,/area/shuttle/cryo/centcom) +"ou" = (/obj/structure/table/standard,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/item/weapon/towel,/obj/random/soap,/obj/random/soap,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"ov" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"ow" = (/obj/structure/toilet,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"ox" = (/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod1/centcom) +"oy" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"oz" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"oA" = (/obj/structure/flora/pottedplant,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"oB" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/door/airlock/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"oC" = (/obj/machinery/telecomms/broadcaster/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"oD" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/transport1/centcom) +"oE" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"oF" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/transport1/centcom) +"oG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"oH" = (/obj/structure/extinguisher_cabinet{pixel_x = 28; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"oI" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"oJ" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"oK" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) +"oL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/spesslaw,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"oM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/stuffing,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"oN" = (/obj/machinery/telecomms/hub/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"oO" = (/obj/machinery/computer/shuttle_control/centcom{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"oP" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"oQ" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/supplycomp/control{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"oR" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom) +"oS" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"oT" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"oU" = (/obj/machinery/computer/robotics{dir = 8},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"oV" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom) +"oW" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"oX" = (/obj/machinery/vending/cigarette,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"oY" = (/obj/machinery/microwave,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"oZ" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/supply) +"pa" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"pb" = (/obj/item/device/multitool,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pc" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pd" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cryostorage_shuttle_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock Cryostorage"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"pe" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "cryostorage_shuttle_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "cryostorage_shuttle_recovery_hatch"},/turf/simulated/shuttle/floor,/area/centcom/evac) +"pf" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/simulated/shuttle/floor,/area/centcom/evac) +"pg" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeadmin) +"ph" = (/obj/machinery/telecomms/receiver/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"pi" = (/obj/machinery/telecomms/bus/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"pj" = (/obj/machinery/telecomms/relay/preset/southerncross/transit,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"pk" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"pl" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"pm" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"pn" = (/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"po" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"pp" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pq" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pr" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/slice/orangecake/filled,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"ps" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/meatsteak,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"pt" = (/obj/machinery/door/window/northright,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pu" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pv" = (/obj/item/weapon/flame/lighter/zippo,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pw" = (/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"px" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"py" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pz" = (/obj/item/stack/material/glass{amount = 50},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pA" = (/obj/item/stack/material/steel{amount = 50},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"pB" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"pC" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"pD" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) +"pE" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) +"pF" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/melee/energy/axe,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"pG" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/main_hall) +"pH" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"pI" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"pJ" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"pK" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/soylenviridians,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"pL" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"pM" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/candiedapple,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"pN" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"pO" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"pP" = (/turf/unsimulated/wall,/area/centcom/bar) +"pQ" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"pR" = (/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"pS" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"pT" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"pU" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"pV" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"pW" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"pX" = (/turf/unsimulated/wall,/area/centcom/living) +"pY" = (/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"pZ" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"qa" = (/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"qb" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"qc" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/administration/centcom) +"qd" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qe" = (/obj/item/weapon/stool,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qf" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qg" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qh" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qi" = (/obj/machinery/robotic_fabricator,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qj" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Thunderdome Autolathe"},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qk" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"ql" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"qm" = (/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"qn" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/obj/structure/curtain/open/shower,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"qo" = (/obj/machinery/door/airlock,/turf/simulated/shuttle/floor,/area/centcom/evac) +"qp" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"qq" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qr" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/bloodsoup,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qs" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) +"qt" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/table/standard,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"qu" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"qv" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"qw" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/living) +"qx" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"qy" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/under/color/red,/obj/item/clothing/suit/armor/tdome/red,/obj/item/weapon/holo/esword/red,/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"qz" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"qA" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor,/area/centcom/evac) +"qB" = (/turf/unsimulated/wall,/area/shuttle/trade) +"qC" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) +"qD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qE" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/amanita_pie,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qF" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qG" = (/obj/structure/bed/chair/wood/wings,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"qH" = (/obj/machinery/light,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qI" = (/obj/machinery/computer/card{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"qJ" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/simulated/shuttle/plating,/area/shuttle/administration/centcom) +"qK" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) +"qL" = (/obj/structure/table/standard,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) +"qM" = (/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"qN" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qO" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/stew,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qP" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/snacks/beetsoup,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qQ" = (/obj/machinery/smartfridge,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"qR" = (/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"qS" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"qT" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"qU" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"qV" = (/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"qW" = (/obj/structure/device/piano{dir = 4},/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"qX" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"qY" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/centcom) +"qZ" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod6/centcom) +"ra" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) +"rb" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/shuttle/trade) +"rc" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/glass2/square,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"rd" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"re" = (/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"rf" = (/obj/structure/table/marble,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"rg" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"rh" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/tofukabob,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"ri" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/main_hall) +"rj" = (/obj/structure/table/marble,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/accessory/wcoat,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"rk" = (/obj/machinery/vending/cola,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"rl" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"rm" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"rn" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/poppypretzel,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bar) +"ro" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/bar) +"rp" = (/obj/machinery/floor_light,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) +"rq" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"rr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"rs" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) +"rt" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"ru" = (/obj/machinery/computer/cloning,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"rv" = (/obj/machinery/clonepod,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"rw" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"rx" = (/obj/machinery/computer/secure_data{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/centcom/evac) +"ry" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_4_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 4"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"rz" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_4_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "escape_pod_4_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"rA" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_6_recovery"; pixel_x = 26; pixel_y = -26; req_one_access = list(13); tag_door = "escape_pod_6_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"rB" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_6_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 6"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"rC" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/burst,/obj/item/weapon/gun/energy/gun/burst,/obj/item/weapon/gun/energy/ionrifle/pistol,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"rD" = (/obj/structure/table/standard,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"rE" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"rF" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/clerical,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"rG" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"rH" = (/obj/machinery/door/airlock/glass{name = "Bar"},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"rI" = (/obj/machinery/floor_light,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) +"rJ" = (/obj/structure/sink{pixel_y = 16},/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"rK" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac) +"rL" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/stunshells/large,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"rM" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"rN" = (/obj/machinery/computer/secure_data{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"rO" = (/obj/structure/closet/crate,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) +"rP" = (/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) +"rQ" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"rR" = (/obj/machinery/door/airlock/centcom{name = "Bridge Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"rS" = (/obj/machinery/door/airlock/glass_centcom{name = "Bridge Access"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"rT" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"rU" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"rV" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = 4; pixel_y = -2},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/item/weapon/flame/candle,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"rW" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"rX" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"rY" = (/obj/structure/table/reinforced,/obj/machinery/librarycomp,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"rZ" = (/obj/structure/bookcase,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sa" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor,/area/centcom/evac) +"sb" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy,/obj/item/clothing/suit/storage/vest,/obj/item/clothing/head/helmet,/obj/item/clothing/head/helmet,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sc" = (/obj/structure/frame/computer,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sd" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) +"se" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"sf" = (/obj/machinery/media/jukebox,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"sg" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"sh" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"si" = (/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -6},/obj/structure/table/standard,/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"sj" = (/obj/machinery/door/window/northright{icon_state = "right"; dir = 2},/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sk" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sl" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sm" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sn" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/centcom) +"so" = (/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/centcom) +"sp" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/shuttle/trade) +"sq" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 4; req_access = list(160)},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sr" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor{icon_state = "wood"},/area/centcom/bar) +"ss" = (/obj/machinery/floor_light,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/bar) +"st" = (/obj/machinery/light{dir = 8},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"su" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 3"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"sv" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_3_recovery"; pixel_x = -26; pixel_y = 26; req_one_access = list(13); tag_door = "escape_pod_3_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"sw" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/centcom/evac) +"sx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_5_recovery"; pixel_x = 26; pixel_y = -26; req_one_access = list(13); tag_door = "escape_pod_5_recovery_hatch"},/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"sy" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 5"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"sz" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"sA" = (/obj/structure/table/standard,/obj/item/weapon/soap/deluxe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"sB" = (/obj/structure/table/standard,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sC" = (/obj/structure/closet/wardrobe/white,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sD" = (/obj/structure/closet/wardrobe/green,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sE" = (/obj/structure/closet/wardrobe/grey,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sF" = (/obj/machinery/button/remote/blast_door{id = "tradestationshutters"; name = "warehouse control"; pixel_x = -30; req_access = list(160)},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) +"sG" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"sH" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"sI" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"sJ" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sK" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sL" = (/obj/machinery/chemical_dispenser/ert,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"sM" = (/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"sN" = (/obj/machinery/door/blast/shutters{dir = 8; id = "tradestationshutters"; name = "Warehouse Shutters"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/shuttle/trade) +"sO" = (/obj/structure/table/standard,/obj/random/soap,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bar) +"sP" = (/obj/structure/sign/double/barsign,/turf/unsimulated/wall,/area/centcom/bar) +"sQ" = (/obj/structure/sign/directions/cargo{dir = 8},/obj/structure/sign/directions/security{dir = 8; pixel_y = -10},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 10},/turf/unsimulated/wall,/area/centcom/main_hall) +"sR" = (/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"sS" = (/obj/structure/sign/directions/medical{dir = 4},/obj/structure/sign/directions/evac{pixel_y = 10},/turf/unsimulated/wall,/area/centcom/main_hall) +"sT" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -25; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"sU" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Central Access"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"sV" = (/obj/machinery/turretid{pixel_x = -28; pixel_y = -28; req_access = list(101)},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"sW" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"sX" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"sY" = (/obj/machinery/vending/cola,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"sZ" = (/obj/machinery/vending/cigarette,/turf/simulated/shuttle/floor/yellow,/area/centcom/evac) +"ta" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"tb" = (/obj/machinery/door/airlock{name = "Restroom"},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"tc" = (/obj/structure/table/bench/steel,/obj/effect/landmark{name = "Trader"},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) +"td" = (/obj/effect/landmark{name = "Trader"},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/trade) +"te" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"tf" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"tg" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"th" = (/obj/structure/table/reinforced,/obj/item/frame/light,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"ti" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"tj" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"tk" = (/obj/item/weapon/tool/crowbar,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"tl" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tm" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tn" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"to" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tp" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tq" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tr" = (/obj/machinery/button/remote/blast_door{id = "tradestationshutters"; name = "warehouse control"; pixel_x = 30; req_access = list(160)},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"ts" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/main_hall) +"tt" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tu" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tv" = (/obj/structure/bed/roller,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tw" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tx" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"ty" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tz" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tA" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"tB" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"tC" = (/obj/structure/closet/wardrobe/pink,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tD" = (/obj/structure/closet/wardrobe/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tE" = (/obj/structure/closet/wardrobe/mixed,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tF" = (/obj/structure/closet/wardrobe/pjs,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tG" = (/obj/structure/closet/wardrobe/suit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tH" = (/obj/structure/closet/wardrobe/xenos,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tI" = (/obj/structure/closet/wardrobe/black,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"tJ" = (/obj/item/frame/light,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"tK" = (/obj/machinery/chem_master,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tL" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "lino"},/area/centcom/bar) +"tM" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tN" = (/obj/machinery/chemical_dispenser/full,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tO" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tP" = (/obj/structure/closet/secure_closet/medical_wall/pills{pixel_y = 32},/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tQ" = (/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tR" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/blue{dir = 5},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"tS" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tT" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) +"tU" = (/turf/unsimulated/wall,/area/centcom/security) +"tV" = (/turf/unsimulated/wall,/area/centcom/medical) +"tW" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/obj/structure/table/standard,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/machinery/recharger,/obj/item/weapon/tool/screwdriver,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tX" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tY" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"tZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "trade_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; tag_door = "trade_shuttle_bay_door"},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"ua" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ub" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"uc" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/floor_decal/corner/orange/full{dir = 8},/obj/item/weapon/reagent_containers/glass/bucket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ud" = (/obj/structure/table/reinforced,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ue" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"uf" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ug" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"uh" = (/obj/structure/closet/secure_closet/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ui" = (/obj/structure/closet/secure_closet/security,/obj/effect/floor_decal/corner/red{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"uj" = (/obj/structure/closet/secure_closet/security,/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"uk" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/medical) +"ul" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"um" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"un" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uo" = (/obj/machinery/iv_drip,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"up" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uq" = (/obj/structure/table/standard,/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/cautery,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"ur" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/retractor,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"us" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/scalpel,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"ut" = (/obj/structure/table/standard,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/surgical/FixOVein,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uu" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uv" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access = list(109)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/bodybags,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"ux" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uy" = (/obj/machinery/clonepod,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uz" = (/obj/machinery/computer/med_data{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"uA" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uB" = (/obj/structure/closet{name = "Prisoner's Locker"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"uC" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/security) +"uD" = (/obj/machinery/computer/shuttle_control{dir = 8; name = "Beruang control console"; req_access = list(160); shuttle_tag = "Trade"},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"uE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uF" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uH" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uI" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uJ" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uK" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uL" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uM" = (/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uN" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uO" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uP" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uQ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"uR" = (/obj/machinery/optable,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uS" = (/obj/machinery/computer/operating,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"uT" = (/obj/machinery/computer/security{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"uU" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"uV" = (/obj/structure/morgue,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uW" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"uX" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/merchant/home) +"uY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"uZ" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/merchant/home) +"va" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vb" = (/obj/machinery/vending/hydroseeds,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vc" = (/obj/structure/table/reinforced,/obj/item/clothing/head/greenbandana,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vd" = (/obj/machinery/computer/crew{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"ve" = (/obj/machinery/bodyscanner{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vf" = (/obj/machinery/body_scanconsole,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vh" = (/obj/machinery/vending/wallmed1{pixel_y = -30},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vi" = (/obj/structure/closet/secure_closet/medical2,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vj" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"vk" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"vl" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"vm" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"vn" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"vo" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/obj/item/weapon/stamp/captain,/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"vp" = (/obj/machinery/computer/shuttle_control{dir = 4; req_access = list(101); shuttle_tag = "Centcom"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"vq" = (/obj/structure/table/standard,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"vr" = (/obj/machinery/computer/shuttle_control{dir = 8; req_access = list(101); shuttle_tag = "Centcom"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"vs" = (/obj/structure/table/standard,/obj/item/device/radio/off,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"vt" = (/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"vu" = (/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"vv" = (/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"vw" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/wall/no_join,/area/shuttle/supply) +"vx" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vy" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/merchant/home) +"vz" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/table/holotable,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"vA" = (/obj/machinery/door/window/brigdoor{dir = 4; name = "Security"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vB" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"vC" = (/obj/structure/table/glass,/obj/machinery/reagentgrinder,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vD" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/centcom/evac) +"vE" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vF" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/rd,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vG" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vH" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vI" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"vJ" = (/obj/structure/bed/chair,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"vK" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"vL" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vM" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"vN" = (/obj/machinery/computer/card{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"vO" = (/obj/structure/table/bench/steel,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vP" = (/obj/structure/closet/secure_closet/brig,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vQ" = (/obj/structure/table/reinforced,/obj/item/weapon/book/codex/corp_regs,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"vR" = (/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"vS" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/medical) +"vT" = (/obj/structure/closet/secure_closet/chemical,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vU" = (/obj/structure/table/glass,/obj/item/stack/material/phoron,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vV" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vW" = (/obj/machinery/sleeper{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vX" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vY" = (/obj/structure/closet/wardrobe/white,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"vZ" = (/obj/machinery/clonepod,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"wa" = (/obj/machinery/computer/cloning,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"wb" = (/obj/machinery/dna_scannernew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"wc" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"wd" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"we" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wf" = (/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wg" = (/obj/machinery/door/airlock/silver{name = "Sleeping"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wh" = (/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"wi" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"wj" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"wk" = (/obj/machinery/atm{pixel_x = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wl" = (/obj/machinery/suit_cycler/syndicate,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wm" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wn" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wo" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/structure/closet/medical_wall{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wp" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wq" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"wr" = (/obj/structure/table/reinforced,/obj/item/weapon/book/codex/corp_regs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ws" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"wt" = (/obj/machinery/door/airlock/glass_security{name = "Spaceport Security Airlock"; req_access = list(63)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"wu" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"wv" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradestarshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"ww" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wx" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wy" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wz" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"wA" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"wB" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 32},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"wC" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/inflatable_duck,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wD" = (/obj/structure/table/steel_reinforced,/obj/item/stack/material/mhydrogen,/obj/item/stack/material/diamond,/obj/item/stack/material/sandstone,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wE" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/rig/internalaffairs,/obj/item/clothing/head/helmet/space/void/wizard,/obj/item/clothing/suit/space/void/wizard,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wF" = (/obj/structure/table/steel_reinforced,/obj/random/tool,/obj/random/tool,/obj/random/tool,/obj/random/tool,/obj/random/tool,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wG" = (/obj/structure/table/steel_reinforced,/obj/random/toolbox,/obj/random/toolbox,/obj/random/toolbox,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"wI" = (/obj/vehicle/train/engine,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wJ" = (/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"wK" = (/obj/machinery/door/airlock/glass_medical{name = "Medical Bay"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wL" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wM" = (/obj/machinery/computer/communications{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"wN" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"wO" = (/obj/structure/closet/walllocker/emerglocker{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wP" = (/obj/machinery/button/remote/blast_door{id = "tradestarshutters"; name = "remote shutter control"; pixel_x = 30; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wQ" = (/obj/structure/table/steel_reinforced,/obj/random/firstaid,/obj/random/firstaid,/obj/random/firstaid,/obj/random/firstaid,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wR" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wS" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wT" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wU" = (/obj/structure/table/steel_reinforced,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/weapon/weldpack,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wV" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"wW" = (/obj/vehicle/train/trolley,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wX" = (/obj/machinery/light,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wY" = (/obj/machinery/vending/medical{pixel_y = -32; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"wZ" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xa" = (/obj/structure/table/bench/padded,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"xb" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xc" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xd" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xe" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 4; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xf" = (/obj/structure/table/steel_reinforced,/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/random/medical,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xg" = (/obj/machinery/door/window/southleft{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xh" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/coin/uranium,/obj/item/weapon/coin/silver,/obj/item/weapon/coin/platinum,/obj/item/weapon/coin/phoron,/obj/item/weapon/coin/iron,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/diamond,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xi" = (/obj/machinery/door/window/southright{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xj" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/hyper,/obj/item/weapon/cell/potato,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"xl" = (/obj/structure/table/standard,/obj/item/clothing/gloves/sterile/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/circular_saw,/obj/item/stack/nanopaste,/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xm" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xn" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xo" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xp" = (/obj/structure/morgue{icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xq" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"xr" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"xs" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xt" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xu" = (/obj/machinery/door/airlock/multi_tile/glass,/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"xv" = (/obj/structure/closet/crate/secure/weapon,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xw" = (/obj/machinery/computer/arcade/orion_trail,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xx" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xy" = (/obj/structure/table/glass,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xz" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xA" = (/obj/structure/closet/secure_closet/personal/patient,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xB" = (/obj/effect/floor_decal/corner/blue{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xC" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xD" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xE" = (/obj/structure/table/steel_reinforced,/obj/machinery/newscaster{pixel_x = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xF" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) +"xG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light/small,/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) +"xH" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 28},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) +"xI" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 3},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) +"xJ" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xK" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"xL" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"xM" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 30},/obj/effect/floor_decal/corner/orange{dir = 6},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xO" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xP" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xQ" = (/obj/structure/bed/chair/office/light{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xR" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 4; name = "Security"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"xS" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xT" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xU" = (/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"xV" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"xW" = (/obj/machinery/computer/rdservercontrol{badmin = 1; dir = 8; name = "Master R&D Server Controller"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/main_hall) +"xX" = (/obj/machinery/light{dir = 4},/obj/structure/sign/kiddieplaque{desc = "A plaque commemorating the construction of the cargo ship Beruang."; name = "Beruang"; pixel_x = 32},/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"xY" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) +"xZ" = (/obj/machinery/door/airlock/silver{name = "Restroom"},/turf/simulated/shuttle/floor/white,/area/shuttle/merchant/home) +"ya" = (/obj/structure/undies_wardrobe,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yb" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yc" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/largecrate/animal/cat,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yd" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/largecrate/animal/cow,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"ye" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/closet/crate/freezer/rations,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yf" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/item/device/kit/paint/ripley/death,/obj/item/device/kit/paint/ripley/flames_blue,/obj/item/device/kit/paint/ripley/flames_red,/obj/item/device/kit/paint/ripley,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yg" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/closet/crate/secure/loot,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/largecrate/hoverpod,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yi" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/mecha/working/ripley/mining,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yj" = (/obj/machinery/door/window/westright{name = "Storefront"; req_access = list(160)},/obj/structure/table/marble,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "trade"; name = "Shop Shutters"; opacity = 0},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"yk" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"yl" = (/obj/machinery/computer/arcade/battle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ym" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/effect/floor_decal/corner/orange{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"yn" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"yo" = (/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30; pixel_x = 2; pixel_y = 3},/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"yp" = (/obj/item/weapon/storage/box/evidence,/obj/item/weapon/folder/red,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"yq" = (/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"yr" = (/obj/structure/closet{name = "Evidence Closet"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"ys" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/administration/centcom) +"yt" = (/obj/machinery/smartfridge/chemistry,/turf/unsimulated/wall,/area/centcom/medical) +"yu" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"yv" = (/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"yw" = (/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"yx" = (/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"yy" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"yz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/administration/centcom) +"yA" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"yB" = (/obj/machinery/door/airlock/command{name = "Bridge"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yC" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yD" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/structure/largecrate/animal/corgi,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yE" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/largecrate/animal/corgi,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yF" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/crate/internals,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yG" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/warning,/obj/item/device/kit/paint/gygax/darkgygax,/obj/item/device/kit/paint/gygax/recitence,/obj/item/device/kit/paint/durand,/obj/item/device/kit/paint/durand/phazon,/obj/item/device/kit/paint/durand/seraph,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yH" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/crate/secure/loot,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/largecrate/hoverpod,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yJ" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/mecha/working/ripley/firefighter,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yK" = (/obj/machinery/door/window/westleft{name = "Storefront"; req_access = list(160)},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "trade"; name = "Shop Shutters"; opacity = 0},/obj/structure/table/marble,/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"yL" = (/obj/machinery/door/airlock/medical,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"yM" = (/obj/machinery/computer/arcade/battle,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yN" = (/obj/structure/table/steel_reinforced,/obj/machinery/button/remote/blast_door{id = "tradebridgeshutters"; name = "remote shutter control"; pixel_x = 30; req_access = list(150)},/obj/structure/flora/pottedplant{icon_state = "plant-09"; name = "Esteban"; pixel_y = 8},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yO" = (/obj/machinery/vending/assist{contraband = null; name = "Old Vending Machine"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yP" = (/obj/structure/closet{name = "custodial"},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yQ" = (/obj/machinery/vending/sovietsoda,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yR" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/soap,/obj/item/weapon/towel{color = "#0000FF"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yS" = (/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yT" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 2; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yU" = (/obj/machinery/door/window/westleft{name = "Storefront"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yV" = (/obj/machinery/button/remote/blast_door{id = "trade"; name = "Shop Shutters"; pixel_x = 0; pixel_y = -26},/turf/simulated/shuttle/floor/darkred,/area/shuttle/merchant/home) +"yW" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/bearpelt,/obj/item/clothing/head/bowler,/obj/item/clothing/head/caphat/cap,/obj/item/clothing/head/beaverhat,/obj/item/clothing/head/beret/centcom,/obj/item/clothing/head/beret/sec,/obj/item/clothing/head/collectable/kitty,/obj/item/clothing/head/collectable/kitty,/obj/item/clothing/head/collectable/kitty,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/petehat,/obj/item/clothing/head/collectable/pirate,/obj/item/clothing/head/collectable/wizard,/obj/item/clothing/head/collectable/xenom,/obj/item/clothing/head/cowboy_hat,/obj/item/clothing/head/pin/flower/violet,/obj/item/clothing/head/pin/flower/blue,/obj/item/clothing/head/pin/flower/orange,/obj/item/clothing/head/pin/flower/pink,/obj/item/clothing/head/justice,/obj/item/clothing/head/justice/blue,/obj/item/clothing/head/justice/green,/obj/item/clothing/head/justice/pink,/obj/item/clothing/head/justice/yellow,/obj/item/clothing/head/philosopher_wig,/obj/item/clothing/head/plaguedoctorhat,/obj/item/clothing/head/xenos,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"yX" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"yY" = (/turf/unsimulated/wall,/area/centcom/terminal) +"yZ" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"za" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"zb" = (/obj/machinery/vending/boozeomat{req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zc" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zd" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"ze" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/under/cheongsam,/obj/item/clothing/under/hosformalmale,/obj/item/clothing/under/hosformalfem,/obj/item/clothing/under/harness,/obj/item/clothing/under/gladiator,/obj/item/clothing/under/ert,/obj/item/clothing/under/schoolgirl,/obj/item/clothing/under/redcoat,/obj/item/clothing/under/sexymime,/obj/item/clothing/under/sexyclown,/obj/item/clothing/under/soviet,/obj/item/clothing/under/space,/obj/item/clothing/under/swimsuit/stripper/mankini,/obj/item/clothing/under/suit_jacket/female,/obj/item/clothing/under/rank/psych/turtleneck,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/tacticool,/obj/item/clothing/under/syndicate/tacticool,/obj/item/clothing/under/dress/sailordress,/obj/item/clothing/under/dress/redeveninggown,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/under/dress/blacktango,/obj/item/clothing/under/dress/blacktango/alt,/obj/item/clothing/under/dress/dress_orange,/obj/item/clothing/under/dress/maid/janitor,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zf" = (/obj/machinery/door/airlock/glass{name = "Dock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"zg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/steel_reinforced,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zh" = (/obj/machinery/door/window/northleft{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zi" = (/obj/structure/table/steel_reinforced,/obj/random/plushie,/obj/random/plushie,/obj/random/plushie,/obj/random/plushie,/obj/random/plushie,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zj" = (/obj/machinery/door/window/northright{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zk" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/blue,/obj/item/clothing/gloves/brown,/obj/item/clothing/gloves/captain,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/green,/obj/item/clothing/gloves/grey,/obj/item/clothing/gloves/light_brown,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/rainbow,/obj/item/clothing/gloves/swat,/obj/item/clothing/gloves/white,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zl" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 2; start_pressure = 740.5},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zm" = (/obj/structure/closet/walllocker/emerglocker{pixel_y = 32},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zn" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zo" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/terminal) +"zp" = (/obj/machinery/button/remote/blast_door{id = "tradeportshutters"; name = "remote shutter control"; pixel_x = 30; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zq" = (/obj/structure/table/steel_reinforced,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/item/weapon/bikehorn,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zr" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zs" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zt" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zu" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"zv" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/structure/largecrate/animal/cat,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zw" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zx" = (/obj/machinery/vending/medical,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zy" = (/obj/structure/flora/pottedplant/orientaltree,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zz" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zA" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zB" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zC" = (/obj/structure/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zD" = (/obj/structure/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zE" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/o2{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zF" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zG" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zH" = (/obj/effect/floor_decal/corner/paleblue,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zI" = (/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zJ" = (/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = 0; pixel_y = -32},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zK" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"zL" = (/obj/structure/closet/wardrobe/captain,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zM" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zN" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zO" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"zP" = (/obj/machinery/photocopier,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"zQ" = (/obj/structure/table/steel_reinforced,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/obj/random/action_figure,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zR" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/jade,/obj/item/weapon/lipstick/purple,/obj/item/weapon/lipstick,/obj/item/weapon/lipstick/random,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zS" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/armpit,/obj/item/clothing/accessory/holster/hip,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/webbing,/obj/item/clothing/accessory/storage/webbing,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/scarf/white,/obj/item/clothing/accessory/scarf/lightblue,/obj/item/clothing/accessory/scarf/red,/obj/item/clothing/accessory/scarf/purple,/obj/item/clothing/accessory/armband/science,/obj/item/clothing/accessory/armband/med,/obj/item/clothing/accessory/armband/engine,/obj/item/clothing/accessory/armband/cargo,/obj/item/clothing/accessory/armband,/obj/item/clothing/accessory/medal/nobel_science,/obj/item/clothing/accessory/medal/silver,/obj/item/clothing/accessory/medal/gold,/obj/item/clothing/accessory/medal/bronze_heart,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zT" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zU" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/suit/hgpirate,/obj/item/clothing/suit/imperium_monk,/obj/item/clothing/suit/leathercoat,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/justice,/obj/item/clothing/suit/pirate,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zV" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/closet/crate/solar,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"zW" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zX" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zY" = (/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access = list(5)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"zZ" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Aa" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Ab" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Ac" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Ad" = (/obj/structure/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Ae" = (/obj/structure/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Af" = (/obj/machinery/computer/communications{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"Ag" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/centcom/terminal) +"Ah" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Doormaint.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/centcom/terminal) +"Ai" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/terminal) +"Aj" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/terminal) +"Ak" = (/obj/structure/sign/directions/cargo{dir = 1},/obj/structure/sign/directions/security{dir = 1; pixel_y = -10},/obj/structure/sign/directions/engineering{dir = 1; pixel_y = 10},/turf/unsimulated/wall,/area/centcom/terminal) +"Al" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"Am" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = list(160)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"An" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"Ao" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/merchant/home) +"Ap" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"Aq" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"Ar" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"As" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "tradeportshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/shuttle/merchant/home) +"At" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/obj/machinery/atm{pixel_x = -32},/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Au" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "trade2_control"; pixel_x = -22; pixel_y = -32; req_one_access = list(150)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Av" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Aw" = (/obj/structure/table/standard,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Ax" = (/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Ay" = (/obj/structure/table/standard,/obj/item/stack/material/steel{amount = 2},/obj/item/stack/material/steel{amount = 2},/obj/item/stack/material/glass{amount = 15},/obj/item/stack/material/glass{amount = 15},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Az" = (/obj/structure/sign/directions/medical{dir = 1; pixel_y = -10},/obj/structure/sign/directions/science{dir = 1},/turf/unsimulated/wall,/area/centcom/terminal) +"AA" = (/obj/machinery/door/airlock/glass{name = "Dock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AB" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AC" = (/obj/effect/floor_decal/corner/white/full{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AD" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AE" = (/obj/structure/table/glass,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AF" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AG" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"AH" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"AI" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/simulated/floor/carpet,/area/shuttle/merchant/home) +"AJ" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_inner"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AK" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_inner"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AL" = (/obj/machinery/vending/engivend,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AM" = (/obj/machinery/vending/tool,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AN" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"AO" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"AP" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AQ" = (/obj/effect/floor_decal/corner/white/diagonal{icon_state = "corner_white_diagonal"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AR" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AS" = (/obj/structure/table/standard,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"AT" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "trade2_vent"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "trade2_control"; pixel_x = -24; req_access = list(150); tag_airpump = "trade2_vent"; tag_chamber_sensor = "trade2_sensor"; tag_exterior_door = "trade2_shuttle_outer"; tag_interior_door = "trade2_shuttle_inner"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AU" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "trade2_sensor"; pixel_x = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "trade2_vent"},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AV" = (/obj/structure/table/standard,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"AW" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"AX" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"AY" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_outer"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"AZ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "trade2_control"; pixel_x = 24; req_one_access = list(150)},/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "trade2_shuttle_outer"; locked = 1; name = "Ship Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Ba" = (/obj/structure/table/standard,/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bc" = (/obj/effect/floor_decal/industrial/loading{icon_state = "loadingarea"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bd" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Be" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bf" = (/obj/machinery/light{dir = 8},/obj/structure/bed/chair/shuttle{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bg" = (/obj/machinery/light{dir = 8},/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bi" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"Bj" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"Bk" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bl" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bm" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) +"Bn" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Bo" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bp" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/sign/dock/one,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bq" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Br" = (/obj/structure/lattice,/turf/space,/area/space) +"Bs" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space,/area/space) +"Bt" = (/obj/structure/sign/warning/docking_area,/turf/unsimulated/wall,/area/centcom/terminal) +"Bu" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bv" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bw" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Bx" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"By" = (/turf/simulated/shuttle/wall,/area/shuttle/escape/centcom) +"Bz" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"BA" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/sign/dock/two,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BB" = (/obj/effect/floor_decal/corner/white{dir = 6; icon_state = "corner_white"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BC" = (/obj/effect/floor_decal/corner/white{dir = 5},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BD" = (/obj/effect/floor_decal/corner/white{icon_state = "corner_white"; dir = 1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BE" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/escape/centcom) +"BF" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"BG" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"BH" = (/obj/machinery/computer/shuttle_control/emergency,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"BI" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"BJ" = (/obj/effect/floor_decal/corner/white,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BK" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/wizard_station) +"BL" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"BM" = (/obj/effect/floor_decal/corner/white{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BN" = (/obj/effect/floor_decal/corner/white{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"BO" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BP" = (/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BQ" = (/obj/structure/bed/chair/shuttle{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BR" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BS" = (/obj/structure/bed/chair/shuttle{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BT" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BU" = (/obj/machinery/chemical_dispenser/bar_soft/full,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"BV" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/pwine{pixel_x = -4; pixel_y = 10},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"BW" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"BX" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"BY" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"BZ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_shuttle"; pixel_x = 0; pixel_y = -25; req_one_access = list(13); tag_door = "escape_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"Ca" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"Cb" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"Cc" = (/obj/machinery/computer/arcade/battle,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Cd" = (/obj/machinery/computer/arcade/orion_trail,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Ce" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"Cf" = (/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"Cg" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/toy/figure/ninja,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) +"Ch" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) +"Ci" = (/obj/structure/AIcore/deactivated,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"Cj" = (/obj/structure/bed/chair/wood/wings,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Ck" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Cl" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Cm" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"Cn" = (/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) +"Co" = (/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) +"Cp" = (/obj/structure/table/woodentable,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/ore/slag{desc = "Well at least Arthur doesn't have to share now..."; name = "pet rock"},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) +"Cq" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/structure/bedsheetbin,/obj/structure/table/woodentable,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) +"Cr" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Cs" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access = list(19)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"Ct" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Cu" = (/obj/structure/table/woodentable,/obj/item/device/radio/headset,/obj/item/weapon/spacecash/c500,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Cv" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Cw" = (/obj/item/weapon/reagent_containers/food/snacks/spellburger{pixel_y = 8},/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "white"},/area/wizard_station) +"Cx" = (/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Cy" = (/obj/structure/undies_wardrobe,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Cz" = (/turf/simulated/shuttle/wall/no_join,/area/shuttle/escape/centcom) +"CA" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/tool/crowbar,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"CB" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"CC" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CD" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CE" = (/obj/structure/table/woodentable,/obj/item/weapon/book/codex/corp_regs,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CF" = (/obj/machinery/door/airlock/hatch,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CG" = (/obj/machinery/door/airlock/hatch,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CH" = (/obj/item/weapon/antag_spawner/technomancer_apprentice,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CI" = (/obj/structure/table/woodentable,/obj/item/clothing/shoes/boots/workboots,/obj/item/clothing/under/technomancer,/obj/item/clothing/head/technomancer,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CJ" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"CK" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_dock_airlock"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"CL" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"CM" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CN" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) +"CO" = (/obj/machinery/vending/hydroseeds,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) +"CP" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"CQ" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CR" = (/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CS" = (/obj/structure/table/woodentable,/obj/machinery/librarycomp{pixel_y = 6},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CT" = (/obj/machinery/media/jukebox,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"CU" = (/obj/machinery/vending/hydronutrients,/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) +"CV" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/under/psysuit,/obj/item/clothing/suit/wizrobe/psypurple,/obj/item/clothing/head/wizard/amp,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"CW" = (/mob/living/simple_mob/animal/passive/mouse/gray{desc = "He looks kingly."; name = "Arthur"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CX" = (/obj/structure/flora/pottedplant{icon_state = "plant-24"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"CY" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"CZ" = (/obj/structure/bed/chair/shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Da" = (/obj/structure/bed/chair/shuttle{dir = 4},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Db" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Dc" = (/obj/machinery/photocopier,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Dd" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"De" = (/obj/structure/flora/pottedplant{icon_state = "plant-08"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Df" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/shoes/sandal/marisa{desc = "A set of fancy shoes that are as functional as they are comfortable."; name = "Gentlemans Shoes"},/obj/item/clothing/under/gentlesuit,/obj/item/clothing/suit/wizrobe/gentlecoat,/obj/item/clothing/head/wizard/cap,/obj/item/weapon/staff/gentcane,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dg" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dh" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Di" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dj" = (/obj/structure/bed/chair/shuttle{dir = 4},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Dk" = (/obj/structure/bed/chair/shuttle{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Dl" = (/obj/machinery/the_singularitygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dm" = (/obj/machinery/crystal,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Dn" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Do" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/arrow/quill,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Dp" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/stock_parts/matter_bin/super,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dq" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"Dr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_one_access = list(13); tag_door = "centcom_dock_airlock"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Ds" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"Dt" = (/obj/machinery/computer/shuttle_control/administration{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) +"Du" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dv" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dw" = (/obj/machinery/computer/message_monitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dx" = (/obj/structure/frame/computer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Dy" = (/obj/structure/table/steel_reinforced,/obj/item/stack/telecrystal,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Dz" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DA" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"DB" = (/obj/structure/flora/pottedplant{icon_state = "plant-04"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DC" = (/obj/structure/sign/electricshock,/turf/simulated/shuttle/wall/dark/hard_corner,/area/wizard_station) +"DD" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"DE" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/merchant/home) +"DF" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"DG" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"DH" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/merchant/home) +"DI" = (/obj/machinery/computer/secure_data{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"DJ" = (/obj/structure/frame/computer{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"DK" = (/obj/structure/table/steel_reinforced,/obj/item/device/mmi/radio_enabled,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"DL" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"DM" = (/obj/structure/flora/pottedplant{icon_state = "plant-03"},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DN" = (/obj/structure/reagent_dispensers/watertank,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"DO" = (/obj/machinery/power/port_gen/pacman,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"DP" = (/obj/structure/table/steel_reinforced,/obj/item/xenos_claw,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DQ" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/coin/diamond,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"DR" = (/obj/structure/table/steel_reinforced,/obj/item/broken_device,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"DS" = (/obj/structure/table/steel_reinforced,/obj/item/organ/internal/stack,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DT" = (/obj/machinery/floodlight,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"DU" = (/obj/machinery/mecha_part_fabricator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DV" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DW" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/ripley_build_and_repair,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DX" = (/obj/item/device/suit_cooling_unit,/obj/structure/table/steel_reinforced,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DY" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 30},/obj/item/target,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"DZ" = (/obj/item/target/syndicate,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ea" = (/obj/structure/table/steel_reinforced,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Eb" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/steel_reinforced,/obj/item/weapon/gun/energy/laser/practice,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ec" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(1)},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) +"Ed" = (/obj/machinery/door/airlock/glass_medical{name = "Escape Shuttle Infirmary"; req_access = list(5)},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Ee" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Ef" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Eg" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Eh" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Ei" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ej" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/obj/item/target,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ek" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) +"El" = (/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) +"Em" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) +"En" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Eo" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Ep" = (/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Eq" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/tool/wrench,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Er" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"Es" = (/obj/item/robot_parts/r_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"Et" = (/obj/item/robot_parts/l_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"Eu" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/robotics_cyborgs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ev" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ew" = (/obj/machinery/power/emitter{anchored = 1; desc = "It is a heavy duty industrial laser used in a very non-industrial way."; name = "teleport defender"},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Ex" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Ey" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"Ez" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EA" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EB" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"EC" = (/obj/item/robot_parts/r_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"ED" = (/obj/item/robot_parts/chest,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EE" = (/obj/item/robot_parts/l_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EF" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"EG" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"EH" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EI" = (/obj/structure/target_stake,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EJ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EK" = (/obj/machinery/light,/turf/simulated/shuttle/floor/red,/area/shuttle/escape/centcom) +"EL" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"EM" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"EN" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"EO" = (/obj/machinery/sleep_console{dir = 4},/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"EP" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) +"EQ" = (/obj/structure/AIcore,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"ER" = (/obj/structure/flora/pottedplant{icon_state = "plant-20"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"ES" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"ET" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EU" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EV" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/shuttle/escape/centcom) +"EW" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EX" = (/obj/item/robot_parts/head,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) +"EY" = (/obj/item/weapon/firstaid_arm_assembly,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"EZ" = (/obj/machinery/computer/shuttle_control/merchant{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"Fa" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating/airless,/area/shuttle/escape/centcom) +"Fb" = (/obj/item/weapon/bucket_sensor,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Fc" = (/obj/item/weapon/farmbot_arm_assembly,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Fd" = (/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"Fe" = (/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Ff" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Fg" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Fh" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Fi" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/terminal) +"Fj" = (/turf/unsimulated/wall,/area/ninja_dojo/dojo) +"Fk" = (/turf/unsimulated/wall,/area/beach) +"Fl" = (/turf/unsimulated/mineral,/area/ninja_dojo/dojo) +"Fm" = (/turf/unsimulated/beach/sand{density = 1; opacity = 1},/area/beach) +"Fn" = (/turf/simulated/mineral,/area/ninja_dojo/dojo) +"Fo" = (/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) +"Fp" = (/obj/effect/floor_decal/asteroid,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) +"Fq" = (/turf/unsimulated/beach/sand,/area/beach) +"Fr" = (/obj/structure/signpost,/turf/unsimulated/beach/sand,/area/beach) +"Fs" = (/obj/structure/closet,/turf/unsimulated/beach/sand,/area/beach) +"Ft" = (/turf/simulated/shuttle/wall/voidcraft/green,/area/ninja_dojo/start) +"Fu" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand,/area/beach) +"Fv" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach) +"Fw" = (/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach) +"Fx" = (/obj/item/target/alien,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken2"},/area/ninja_dojo/dojo) +"Fy" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Fz" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/flame/candle,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"FA" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/material/sword/katana,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"FB" = (/obj/machinery/space_heater,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"FC" = (/obj/item/target,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"FD" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/ninja_dojo/start) +"FE" = (/turf/simulated/shuttle/wall/voidcraft/blue,/area/ninja_dojo/start) +"FF" = (/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand,/area/beach) +"FG" = (/obj/item/target/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"FH" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"FI" = (/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"FJ" = (/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"FK" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) +"FL" = (/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) +"FM" = (/obj/machinery/teleport/hub,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) +"FN" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) +"FO" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) +"FP" = (/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"FQ" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"FR" = (/obj/effect/floor_decal/carpet{dir = 4},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"FS" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) +"FT" = (/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/ninja_dojo/start) +"FU" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 2; start_pressure = 740.5},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"FV" = (/obj/machinery/computer/teleporter,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) +"FW" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) +"FX" = (/obj/machinery/teleport/hub,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) +"FY" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"FZ" = (/obj/structure/table/standard,/turf/unsimulated/beach/sand,/area/beach) +"Ga" = (/obj/structure/table/standard,/obj/item/clothing/under/color/rainbow,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/head/collectable/petehat{pixel_y = 5},/turf/unsimulated/beach/sand,/area/beach) +"Gb" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Gc" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Gd" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/ninja_dojo/dojo) +"Ge" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "ninja_shuttle_outer"; name = "Ship External Hatch"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; dir = 8; icon_state = "pdoor0"; id = "blastninja"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gf" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod7/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod7/centcom) +"Gg" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"Gh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gi" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"Gj" = (/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gk" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/combat,/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gl" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/beach/sand,/area/beach) +"Gm" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/beach/sand,/area/beach) +"Gn" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/beach) +"Go" = (/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Gp" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ninja_shuttle"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "ninja_shuttle_pump"},/obj/machinery/button/remote/blast_door{id = "blastninja"; name = "ship lockdown control"; pixel_x = -25},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gq" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "ninja_shuttle_inner"; name = "Ship Internal Hatch"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gr" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ninja_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gs" = (/obj/structure/table/steel_reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"Gt" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"Gu" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"Gv" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo) +"Gw" = (/obj/machinery/computer/security{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"Gx" = (/obj/machinery/computer/cloning{dir = 1},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"Gy" = (/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken1"},/area/ninja_dojo/dojo) +"Gz" = (/obj/structure/table/steel_reinforced,/obj/item/device/paicard,/obj/item/device/pda/syndicate,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"GA" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"GB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/obj/machinery/button/remote/blast_door{id = "ninjawindow"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"GC" = (/obj/structure/table/bench/wooden,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"GD" = (/obj/structure/flight_right{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"GE" = (/obj/machinery/computer/shuttle_control/web/ninja{icon_state = "flightcomp_center"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"GF" = (/obj/structure/flight_left{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"GG" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/obj/item/toy/plushie/mouse{desc = "A plushie of a small fuzzy rodent."; name = "Woodrat"},/turf/unsimulated/beach/sand,/area/beach) +"GH" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) +"GI" = (/obj/machinery/vending/coffee,/turf/unsimulated/beach/sand,/area/beach) +"GJ" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"GK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "ninjawindow"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/ninja_dojo/start) +"GL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "ninjawindow"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/ninja_dojo/start) +"GM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "ninjawindow"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/ninja_dojo/start) +"GN" = (/obj/item/clothing/head/collectable/paper,/turf/unsimulated/beach/sand,/area/beach) +"GO" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) +"GP" = (/obj/structure/flora/ausbushes/palebush,/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) +"GQ" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) +"GR" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo) +"GS" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo) +"GT" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "asteroid"},/area/ninja_dojo/dojo) +"GU" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{dir = 2; icon = 'icons/turf/snow_new.dmi'; icon_state = "snow"; name = "snow"},/area/ninja_dojo/dojo) +"GV" = (/turf/unsimulated/floor{icon_state = "sandwater"},/area/beach) +"GW" = (/turf/unsimulated/beach/coastline{density = 1; opacity = 1},/area/beach) +"GX" = (/turf/unsimulated/beach/coastline,/area/beach) +"GY" = (/turf/unsimulated/beach/water{density = 1; opacity = 1},/area/beach) +"GZ" = (/turf/unsimulated/beach/water,/area/beach) +"Ha" = (/obj/structure/table/wooden_reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hb" = (/obj/structure/table/wooden_reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hc" = (/turf/unsimulated/wall{icon = 'icons/obj/doors/Dooruranium.dmi'; icon_state = "door_closed"; name = "Sealed Door"},/area/ninja_dojo/dojo) +"Hd" = (/obj/structure/table/glass,/obj/item/clothing/mask/balaclava/tactical{pixel_x = 2; pixel_y = 2},/obj/item/clothing/mask/balaclava,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"He" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/fortunecookie,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hf" = (/obj/structure/table/glass,/obj/item/clothing/mask/balaclava,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hg" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hh" = (/obj/structure/table/glass,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hi" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"Hj" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"Hk" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"Hl" = (/obj/structure/table/bench/wooden,/obj/effect/landmark{name = "ninjastart"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hm" = (/obj/effect/landmark{name = "ninjastart"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hn" = (/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/table/glass,/obj/item/weapon/towel{color = "#FF6666"; name = "light red towel"},/obj/item/weapon/towel{color = "#FF6666"; name = "light red towel"},/obj/random/soap,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"Ho" = (/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hp" = (/obj/structure/table/wooden_reinforced,/obj/item/device/radio/uplink,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"Hr" = (/obj/item/weapon/rig/light/stealth,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Hs" = (/obj/item/device/suit_cooling_unit,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Ht" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'},/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) +"Hu" = (/obj/machinery/door/morgue,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo) +"Hv" = (/obj/structure/closet/crate,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Hw" = (/obj/item/broken_device,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"Hx" = (/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) +"Hy" = (/obj/machinery/door/morgue,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"Hz" = (/obj/structure/table/steel_reinforced,/obj/item/rig_module/chem_dispenser/ninja,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"HA" = (/obj/structure/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"HB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/obj/random/tech_supply,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"HC" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"HD" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/obj/structure/curtain/open/shower/medical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja_dojo/dojo) +"HE" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/random/powercell,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"HF" = (/obj/structure/table/steel_reinforced,/obj/item/rig_module/mounted/energy_blade,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"HG" = (/obj/structure/table/steel_reinforced,/obj/item/rig_module/fabricator/energy_net,/obj/item/rig_module/vision/multi,/turf/unsimulated/floor{icon_state = "dark"},/area/ninja_dojo/dojo) +"HH" = (/obj/machinery/sleeper{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) +"HI" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) +"HJ" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "white"},/area/ninja_dojo/dojo) +"HK" = (/turf/unsimulated/wall,/area/syndicate_station) +"HL" = (/obj/machinery/space_heater,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken3"},/area/ninja_dojo/dojo) +"HM" = (/turf/unsimulated/wall,/area/syndicate_mothership/elite_squad) +"HN" = (/turf/unsimulated/wall,/area/skipjack_station) +"HO" = (/turf/unsimulated/wall,/area/prison/solitary) +"HP" = (/obj/structure/table/rack,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HQ" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency{pixel_x = -3; pixel_y = -3},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency{pixel_x = -3; pixel_y = -3},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HR" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/plasmastun,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HS" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HT" = (/obj/structure/table/rack,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/obj/item/weapon/material/knife/tacknife/combatknife,/obj/item/weapon/material/knife/tacknife/combatknife,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HU" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HV" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"HW" = (/obj/mecha/combat/marauder/mauler,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"HX" = (/obj/machinery/mech_recharger,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"HY" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/obj/item/ammo_magazine/m545,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"HZ" = (/turf/simulated/shuttle/wall/dark,/area/shuttle/syndicate_elite/mothership) +"Ia" = (/obj/machinery/computer/operating{dir = 4},/turf/simulated/shuttle/floor/white,/area/centcom/evac) +"Ib" = (/obj/machinery/computer/shuttle{dir = 1},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"Ic" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod8/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod8/centcom) +"Id" = (/turf/simulated/mineral,/area/space) +"Ie" = (/turf/simulated/mineral,/area/skipjack_station) +"If" = (/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"Ig" = (/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two;Airlock Three;Airlock Four"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock;escape_dock_snorth_airlock;escape_dock_ssouth_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_y = -32; req_one_access = list(13)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"Ih" = (/obj/structure/table/standard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Ii" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "cobweb1"},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Ij" = (/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Ik" = (/obj/structure/bed,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) +"Il" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) +"Im" = (/obj/structure/table/rack,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"In" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Io" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Ip" = (/mob/living/silicon/decoy{icon_state = "ai-malf"; name = "GLaDOS"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Iq" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) +"Ir" = (/obj/structure/inflatable,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Is" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"It" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Iu" = (/obj/structure/table/rack,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Iv" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs{pixel_x = 4; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/smokes,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Iw" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Ix" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1213; listening = 1; name = "Syndicate Ops Intercom"; pixel_y = 26; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Iy" = (/obj/machinery/door/airlock/glass_security{name = "Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{id = "syndicate_elite_mech_room"; name = "Mech Room Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"Iz" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) +"IA" = (/turf/simulated/shuttle/wall/dark/no_join,/area/shuttle/syndicate_elite/mothership) +"IB" = (/obj/effect/landmark{name = "Syndicate-Commando-Bomb"},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"IC" = (/obj/structure/inflatable,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"ID" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"IE" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"IF" = (/obj/item/weapon/tray{pixel_y = 5},/obj/structure/table/standard,/obj/item/weapon/material/knife/butch,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"IG" = (/obj/structure/table/rack,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"IH" = (/obj/structure/table/rack,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/obj/item/device/binoculars,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"II" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"IJ" = (/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two"; child_tags_txt = "arrivals_dock_north_airlock;arrivals_dock_south_airlock"; frequency = 1380; id_tag = "arrivals_dock"; pixel_y = -32},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/terminal) +"IK" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_station) +"IL" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"IM" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) +"IN" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) +"IO" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"IP" = (/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"IQ" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"IR" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"IS" = (/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"IT" = (/obj/item/weapon/ore,/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"IU" = (/obj/structure/table/rack,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"IV" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/pinpointer/shuttle/merc,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"IW" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"IX" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"IY" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership/elite_squad) +"IZ" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"Ja" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jb" = (/obj/structure/urinal{pixel_y = 32},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"Jc" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"Jd" = (/obj/structure/toilet,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"Je" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jf" = (/obj/item/weapon/gun/energy/sonic,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jg" = (/obj/structure/closet/crate,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jh" = (/obj/structure/closet/crate,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/obj/item/clothing/accessory/storage/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Ji" = (/obj/structure/closet/crate,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/gloves/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/shoes/magboots/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jj" = (/obj/item/weapon/gun/launcher/spikethrower,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jk" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jl" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = -2; pixel_y = -2},/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy/merc,/obj/item/clothing/suit/storage/vest/heavy/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Jm" = (/obj/effect/landmark{name = "Syndicate-Commando"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"Jn" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"Jo" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"Jp" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"Jq" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"Jr" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"Js" = (/obj/structure/mirror/raider{pixel_x = -32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"Jt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"Ju" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"Jv" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jw" = (/obj/item/clothing/glasses/night/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jx" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/darkmatter,/obj/item/weapon/gun/energy/darkmatter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Jy" = (/obj/machinery/door/airlock/centcom{name = "Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Jz" = (/obj/machinery/door/airlock/centcom{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"JA" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken1"},/area/skipjack_station) +"JB" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"JC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"JD" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"JE" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"JF" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"JG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"JH" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/skipjack_station) +"JI" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"JJ" = (/obj/item/weapon/gun/energy/plasmastun,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"JK" = (/obj/item/weapon/gun/launcher/crossbow,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"JL" = (/obj/fiftyspawner/rods,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"JM" = (/obj/item/clothing/mask/gas/swat/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"JN" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas/swat/vox,/obj/item/clothing/mask/gas/swat/vox,/obj/item/clothing/mask/gas/swat/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"JO" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"JP" = (/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"JQ" = (/obj/structure/reagent_dispensers/beerkeg/fakenuke{desc = "Something seems off about this bomb."; name = "\improper Nuclear Fission Explosive"},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"JR" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"JS" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"JT" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"JU" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"JV" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"JW" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"JX" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"JY" = (/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"JZ" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 9},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station) +"Ka" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"Kb" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"Kc" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "white"},/area/skipjack_station) +"Kd" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/skipjack_station) +"Ke" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Kf" = (/obj/machinery/door/airlock/centcom{name = "Armory"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Kg" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"Kh" = (/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"Ki" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"Kj" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"Kk" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"Kl" = (/obj/machinery/computer/station_alert{dir = 1},/turf/simulated/shuttle/floor/black,/area/centcom/evac) +"Km" = (/obj/machinery/computer/card{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/security) +"Kn" = (/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken3"},/area/skipjack_station) +"Ko" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station) +"Kp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station) +"Kq" = (/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station) +"Kr" = (/obj/item/xenos_claw,/obj/item/organ/internal/brain/vox,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"Ks" = (/obj/item/weapon/ore,/turf/unsimulated/floor{name = "plating"; icon_state = "asteroid_dug"},/area/skipjack_station) +"Kt" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/syndicate_station) +"Ku" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/obj/effect/landmark{name = "Nuclear-Code"},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"Kv" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"Kw" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"Kx" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/syndicate_elite/mothership) +"Ky" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite/mothership) +"Kz" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken2"},/area/skipjack_station) +"KA" = (/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 10},/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/skipjack_station) +"KB" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"KC" = (/obj/structure/table/rack,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"KD" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"KE" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/spikethrower,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"KF" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"KG" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"KH" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"KI" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"KJ" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"KK" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = 3; pixel_y = 12},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"KL" = (/obj/structure/table/standard,/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/towel{color = "#ff0000"; name = "red towel"},/obj/item/weapon/soap/syndie,/obj/item/weapon/soap/syndie,/turf/simulated/floor/tiled/freezer,/area/syndicate_station) +"KM" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"KN" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"KO" = (/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) +"KP" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"KQ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"KR" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hop,/turf/unsimulated/floor{icon_state = "wood"},/area/skipjack_station) +"KS" = (/obj/item/weapon/ore,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"KT" = (/obj/item/clothing/head/xenos,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"KU" = (/obj/machinery/door/airlock/centcom{name = "Suit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"KV" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_station) +"KW" = (/obj/machinery/door/airlock{name = "Restroom"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_station) +"KX" = (/obj/effect/wingrille_spawn/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/skipjack_station) +"KY" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"KZ" = (/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"La" = (/obj/item/clothing/mask/gas/swat{desc = "A close-fitting mask clearly not made for a human face."; name = "\improper alien mask"},/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"Lb" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/head/helmet/space/void/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Lc" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/green,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/green,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Ld" = (/obj/machinery/computer/crew{dir = 1},/obj/effect/floor_decal/corner/paleblue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"Le" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"Lf" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"Lg" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"Lh" = (/obj/item/weapon/storage/box/syndie_kit/clerical,/obj/structure/table/standard,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"Li" = (/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"Lj" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"Lk" = (/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"Ll" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"Lm" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Ln" = (/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"},/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station) +"Lo" = (/obj/structure/table/rack,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"Lp" = (/obj/item/pizzabox/meat,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"Lq" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase/inflatable,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Lr" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/blue,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Ls" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Lt" = (/obj/machinery/computer/communications{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"Lu" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"Lv" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"Lw" = (/obj/structure/table/standard,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/obj/item/device/radio/headset/syndicate/alt,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"Lx" = (/obj/structure/bed/chair,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"Ly" = (/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"Lz" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/orange,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"LA" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"LB" = (/obj/machinery/computer/shuttle{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"LC" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"LD" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"LE" = (/obj/structure/table/glass,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"LF" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"LG" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"LH" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/obj/item/clothing/glasses/sunglasses/prescription,/obj/item/clothing/glasses/sunglasses/prescription,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"LI" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"LJ" = (/obj/structure/table/steel,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"LK" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"LL" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/item/weapon/tank/vox,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"LM" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"LN" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"LO" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"LP" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"LQ" = (/obj/structure/table/glass,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"LR" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"LS" = (/obj/structure/table/steel,/obj/item/device/radio/uplink,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"LT" = (/obj/item/weapon/gun/launcher/pneumatic,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"LU" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/syndicate_station) +"LV" = (/obj/structure/table/standard,/obj/item/device/pda/syndicate,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station) +"LW" = (/obj/item/weapon/storage/box/syndie_kit/spy,/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"LX" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{name = "plating"; icon_state = "cult"},/area/skipjack_station) +"LY" = (/obj/structure/ore_box,/turf/unsimulated/floor{icon_state = "asteroid"},/area/skipjack_station) +"LZ" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Ma" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Mb" = (/obj/structure/table/rack,/obj/item/weapon/rig/merc/empty,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Mc" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Md" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) +"Me" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Mf" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) +"Mg" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/space) +"Mh" = (/obj/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_base_hatch"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Mi" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space) +"Mj" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Mk" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Ml" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Mm" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Mn" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) +"Mo" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) +"Mp" = (/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) +"Mq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Mr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Ms" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Mt" = (/turf/simulated/wall/skipjack,/area/skipjack_station/start) +"Mu" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start) +"Mv" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_northwest_lock"; locked = 0; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Mw" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_northeast_lock"; locked = 0; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Mx" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start) +"My" = (/obj/structure/table/standard,/obj/random/projectile,/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station) +"Mz" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/obj/machinery/door/airlock/voidcraft{frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"MA" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MB" = (/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MC" = (/obj/machinery/autolathe{hacked = 1; name = "hacked autolathe"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MD" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/airless,/area/syndicate_station/start) +"ME" = (/obj/structure/shuttle/engine/router{icon_state = "router"; dir = 8},/turf/simulated/floor/airless,/area/syndicate_station/start) +"MF" = (/obj/machinery/computer/crew{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"MG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"MH" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"MI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"MJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"MK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"ML" = (/obj/machinery/computer/power_monitor{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"MM" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"MN" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) +"MO" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/computer/station_alert/all{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) +"MP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "merc_shuttle_sensor"; pixel_x = 28; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "merc_shuttle"; pixel_x = 24; pixel_y = -2; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"MQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) +"MR" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 10},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) +"MS" = (/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,/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"MT" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MU" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MV" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/structure/table/steel,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MW" = (/obj/machinery/light{dir = 4},/obj/structure/table/rack,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"MX" = (/obj/effect/shuttle_landmark/southern_cross/transport1_offsite,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"MY" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"MZ" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Na" = (/obj/structure/flight_left,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nb" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nc" = (/obj/structure/flight_right,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nd" = (/obj/machinery/computer/shuttle_control/web/heist,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Ne" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/pirate,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nf" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "skipjack_shuttle"; pixel_x = -24; req_access = list(150); tag_airpump = "vox_east_vent"; tag_chamber_sensor = "vox_east_sensor"; tag_exterior_door = "vox_northeast_lock"; tag_interior_door = "vox_southeast_lock"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "vox_east_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Ng" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Nh" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Ni" = (/obj/machinery/atmospherics/pipe/manifold/visible{icon_state = "map"; dir = 8},/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Nj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/light/small,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Nk" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Nl" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Nm" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Nn" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"No" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Np" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Nq" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/structure/table/steel,/obj/item/weapon/storage/box/frags,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Nr" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_southwest_lock"; locked = 0; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Ns" = (/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nt" = (/obj/machinery/light/small{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nu" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nv" = (/obj/machinery/light/small{dir = 4},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Nw" = (/obj/machinery/button/remote/blast_door{id = "skipjackshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/wall/skipjack,/area/skipjack_station/start) +"Nx" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_southeast_lock"; locked = 0; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Ny" = (/obj/machinery/porta_turret/ai_defense{req_one_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Nz" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) +"NA" = (/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,/obj/structure/window/reinforced/full,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"NB" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/turf/simulated/shuttle/wall/voidcraft/red,/area/syndicate_station/start) +"NC" = (/obj/structure/table/steel,/obj/effect/spawner/newbomb/timer/syndicate,/obj/item/weapon/tool/screwdriver,/obj/item/device/assembly/signaler{pixel_y = 2},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"ND" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NE" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"NF" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"NG" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/escape/centcom) +"NH" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; pixel_x = -22; req_one_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"NI" = (/obj/structure/table/rack,/obj/item/weapon/material/harpoon,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/random/rigsuit,/obj/random/multiple/voidsuit,/obj/random/multiple/voidsuit,/obj/random/energy,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"NJ" = (/obj/structure/table/rack,/obj/random/rigsuit,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"NK" = (/obj/structure/table/rack,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/random/multiple/voidsuit,/obj/random/multiple/voidsuit,/obj/random/energy,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"NL" = (/obj/structure/table/rack,/obj/item/clothing/mask/breath,/obj/machinery/light/small{dir = 8},/obj/random/multiple/voidsuit,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"NM" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_east_control"; pixel_x = 22; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"NN" = (/obj/structure/frame/computer,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NO" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NP" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NQ" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security/tactical/bandolier,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NR" = (/obj/structure/table/steel,/obj/item/weapon/storage/toolbox/syndicate/powertools,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NS" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/item/ammo_magazine/m9mm,/obj/item/weapon/gun/projectile/pistol,/obj/item/ammo_magazine/m9mm,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NT" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NU" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NV" = (/obj/machinery/light,/obj/structure/closet/syndicate/suit{name = "suit closet"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NW" = (/obj/machinery/light,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NX" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_telebay"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"NY" = (/obj/machinery/door/blast/regular{dir = 4; id = "syndieshutters_telebay"; name = "Outer Airlock"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"NZ" = (/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Oa" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Ob" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Oc" = (/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Od" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/steel,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Oe" = (/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/material/minihoe,/obj/item/weapon/beartrap,/obj/structure/table/steel,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Of" = (/obj/machinery/vending/hydroseeds,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Og" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/weapon/tank/oxygen,/obj/item/weapon/pinpointer/shuttle/heist,/obj/item/weapon/pinpointer/shuttle/heist,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Oh" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/clothing/shoes/magboots,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Oi" = (/obj/machinery/washing_machine,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Oj" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Ok" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Ol" = (/obj/structure/table/steel_reinforced,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Om" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"On" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Oo" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/bed/chair/comfy/red{dir = 4; icon_state = "comfychair_preview"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Op" = (/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Oq" = (/obj/machinery/light{dir = 4},/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Or" = (/obj/machinery/door/airlock/voidcraft{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Os" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Ot" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Ou" = (/obj/structure/table/rack,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Ov" = (/obj/structure/table/rack,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Ow" = (/obj/structure/table/rack,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Ox" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/mineral,/area/space) +"Oy" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Oz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OC" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"OD" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; dir = 8; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Blast Door"},/area/centcom/main_hall) +"OE" = (/obj/item/robot_parts/head,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"OG" = (/obj/structure/flight_right{icon_state = "right"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"OH" = (/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"OI" = (/obj/structure/bed/chair/comfy/red{dir = 4; icon_state = "comfychair_preview"},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"OJ" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"OK" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"OL" = (/obj/machinery/turretid{pixel_x = 0; pixel_y = 32; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"OM" = (/obj/structure/table/rack,/obj/item/device/aicard,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"ON" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space) +"OO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OP" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OQ" = (/obj/machinery/computer/shuttle_control/web/syndicate{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"OR" = (/obj/structure/bed/chair/comfy/red{icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"OS" = (/obj/machinery/door/airlock/voidcraft/vertical{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"OT" = (/mob/living/simple_mob/animal/passive/cat/kitten{name = "Enola"},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"OU" = (/obj/machinery/door/airlock/voidcraft/vertical{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"OV" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"OW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OX" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OY" = (/obj/machinery/floodlight,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"OZ" = (/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pa" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/obj/machinery/light/small{dir = 8},/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Pb" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Pc" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Pd" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Pe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pf" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pg" = (/obj/structure/flight_left{icon_state = "left"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Ph" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Pi" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Pj" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Pk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pl" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"Pm" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Pn" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Po" = (/obj/structure/table/steel,/obj/item/clothing/glasses/regular,/obj/item/clothing/glasses/regular,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Pp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"Pq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pr" = (/obj/item/weapon/tool/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Ps" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/tool/crowbar,/obj/item/device/suit_cooling_unit,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Pu" = (/obj/structure/table/steel_reinforced,/obj/machinery/recharger,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Pv" = (/obj/structure/bed/chair/comfy/red,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Pw" = (/obj/machinery/vending/assist{contraband = null; name = "AntagCorpVend"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Px" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Py" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Pz" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/machinery/light/small,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"PA" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"PB" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"PC" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"PD" = (/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"PE" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"PF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"PG" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"PH" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"PI" = (/obj/structure/table/steel,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"PJ" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"PK" = (/obj/machinery/light/small{dir = 1},/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"PL" = (/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"PM" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"PN" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"PO" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"PP" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/computer/station_alert{dir = 4},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"PQ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/computer/security{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start) +"PR" = (/obj/structure/closet/crate/freezer/rations,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"PS" = (/obj/item/weapon/cigbutt,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"PT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"PU" = (/obj/machinery/light{dir = 1},/obj/structure/table/steel,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/device/defib_kit/compact/combat/loaded,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"PV" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/storage/firstaid/combat,/obj/item/weapon/storage/firstaid/clotting,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"PW" = (/obj/machinery/atmospherics/pipe/manifold/visible{icon_state = "map"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"PX" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 9},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"PY" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating/airless,/area/skipjack_station/start) +"PZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Qa" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Qb" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"Qc" = (/obj/machinery/door/airlock/voidcraft{req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Qd" = (/obj/machinery/door/window{dir = 8; name = "Cell"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Qe" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qf" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qg" = (/obj/machinery/atmospherics/portables_connector{icon_state = "map_connector"; dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qh" = (/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/obj/machinery/atmospherics/pipe/manifold/visible,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/clotting,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qi" = (/obj/machinery/atmospherics/unary/freezer{icon_state = "freezer_0"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qj" = (/turf/simulated/shuttle/wall/no_join{base_state = "orange"; icon = 'icons/turf/shuttle_orange.dmi'; icon_state = "orange"},/area/centcom/evac) +"Qk" = (/obj/structure/table/standard,/obj/item/weapon/handcuffs/legcuffs,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"Ql" = (/obj/structure/table/standard,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"Qm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Qn" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) +"Qo" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"Qp" = (/obj/structure/toilet{dir = 4},/obj/machinery/flasher{id = "syndieflash"; pixel_x = -28; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"Qq" = (/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/shuttle/plating,/area/syndicate_station/start) +"Qr" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Qs" = (/obj/machinery/light{dir = 4},/obj/machinery/button/flasher{id = "syndieflash"; name = "Flasher"; pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"Qt" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window{dir = 8; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qu" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qv" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/steel,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"Qw" = (/mob/living/simple_mob/animal/passive/tindalos,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"Qx" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"Qy" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"Qz" = (/obj/structure/table/standard,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/retractor,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"QA" = (/obj/structure/closet{name = "custodial"},/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"QB" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"QC" = (/obj/structure/table/steel,/obj/item/weapon/material/knife{pixel_x = -6},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 9},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = -1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"QD" = (/obj/item/device/radio/electropack,/obj/structure/table/steel,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"QE" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_infirmary"; name = "remote shutter control"; pixel_x = -25},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/steel,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QG" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/gloves/sterile/latex,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QH" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"QI" = (/obj/item/weapon/bedsheet/rainbow,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"QJ" = (/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"QK" = (/obj/item/weapon/bedsheet/hos,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"QL" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/obj/item/weapon/surgical/FixOVein,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"QM" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QN" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QO" = (/obj/structure/table/steel,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QQ" = (/obj/machinery/optable,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QR" = (/obj/machinery/iv_drip,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) +"QS" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/obj/machinery/turretid{pixel_x = 32; req_access = list(150)},/turf/simulated/floor/airless,/area/syndicate_station/start) +"QT" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor/black,/area/skipjack_station/start) +"QU" = (/obj/item/weapon/bedsheet/orange,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"QV" = (/obj/item/weapon/bedsheet/green,/obj/machinery/light/small{dir = 4},/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"QW" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/firstaid/clotting,/obj/item/stack/medical/splint,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"QX" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/machinery/light/small{dir = 4},/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/shuttle/floor/white,/area/skipjack_station/start) +"QY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"QZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Ra" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"Rb" = (/obj/item/weapon/bedsheet/rd,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"Rc" = (/obj/item/pizzabox/meat,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"Rd" = (/obj/item/weapon/bedsheet/clown,/obj/structure/bed/padded,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) +"Re" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/space) +"Rf" = (/turf/unsimulated/wall{icon = 'icons/misc/title.dmi'; icon_state = "title"},/area/space) +"Rg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/mineral,/area/space) +"Rh" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve) +"Ri" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) +"Rj" = (/obj/structure/table/glass,/obj/item/weapon/book/codex/lore/vir,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"Rk" = (/obj/machinery/computer/cryopod/dorms{pixel_y = -30},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"Rl" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership) +"Rm" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; invisibility = 60; layer = 1; name = "Blocker"},/turf/simulated/shuttle/floor/white,/area/centcom/main_hall) +"Rn" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; invisibility = 60; layer = 1; name = "Blocker"},/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/centcom/main_hall) +"Ro" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership) +"Rp" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/syndicate_elite/mothership) +"Rq" = (/obj/machinery/cryopod/robot/door/dorms{time_till_despawn = 200},/turf/simulated/shuttle/floor/white,/area/centcom/main_hall) +"Rr" = (/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"Rs" = (/obj/machinery/computer/pod{dir = 1; id = "syndicate_elite"; name = "Hull Door Control"},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"Rt" = (/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"Ru" = (/obj/machinery/computer/syndicate_elite_shuttle{dir = 1},/turf/simulated/shuttle/floor/skipjack,/area/shuttle/syndicate_elite/mothership) +"Rv" = (/obj/machinery/vending/snack{dir = 4; name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Rw" = (/obj/machinery/vending/cola{dir = 4; name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Rx" = (/obj/machinery/vending/cigarette{dir = 4; name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_station) +"Ry" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) +"Rz" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) +"RA" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) +"RB" = (/obj/structure/frame/computer{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"RC" = (/obj/structure/frame/computer{dir = 1},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) +"RD" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/skipjack_station/start) +"RE" = (/obj/effect/shuttle_landmark/southern_cross/large_escape_pod2/offsite,/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod2/centcom) +"RF" = (/obj/effect/shuttle_landmark/southern_cross/large_escape_pod1/offsite,/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod1/centcom) +"RG" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "admin_shuttle_hatch"},/obj/effect/shuttle_landmark/southern_cross/admin_offsite,/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"RH" = (/obj/effect/shuttle_landmark/southern_cross/cryostorage_offsite,/turf/simulated/shuttle/plating,/area/shuttle/cryo/centcom) +"RI" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "trade_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "trade_shuttle_hatch"},/obj/effect/shuttle_landmark/southern_cross/merchant_offsite,/turf/simulated/shuttle/floor/black,/area/shuttle/merchant/home) +"RJ" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod4/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/centcom) +"RK" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod6/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod6/centcom) +"RL" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod3/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/centcom) +"RM" = (/obj/effect/shuttle_landmark/southern_cross/escape_pod5/offsite,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/centcom) +"RN" = (/obj/effect/shuttle_landmark/southern_cross/escape/offsite,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"RO" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ninja_shuttle_sensor"; pixel_x = 0; pixel_y = 28},/obj/effect/shuttle_landmark{base_area = /area/ninja_dojo/dojo; base_turf = /turf/snow; landmark_tag = "ninja_start"; name = "Dojo Outpost"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start) +"RP" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; landmark_tag = "skipjack_start"; name = "The Hideaway"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"RQ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/button/remote/blast_door{id = "smindicate"; name = "ship lockdown control"; pixel_x = -25},/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; landmark_tag = "syndie_start"; name = "Merc Base Dock"},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) +"RR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) +"RS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) +"RT" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/skipjack_station/start) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeafaeaeaeaeaeaeagahaiahaiahahaiahaiahagbkbkbkbkbkbkaOaLaAajagananclalalalalalalalagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauambAbxbxbxbxbxbDawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaxaeagaiazayazayazayazayahagbkbkbkbkbkbkaOaLaAakagananctaBaBaBaBaBaBaBagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaxaeaeaeaeaeaeaeaeagatayaHaCaIaCaIaKazahagbkaVbmaWbmaXaOaLaAakagananaJalaPalaBaQaZaYagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavaRbBaFaFaFaFaFbCawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeafaeaeaeaeagaUbabbaSaTaTaUaNazaiagbcbrbqbvbqbsaOaLaAakagaManbdbebfbHbgclbhbiagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeafaeaeaeafaeaeaeagaUaUaUaUbjbjaUaNayahagblbrbqbvbqbsaOaLaAakagananbnbobobobpclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcacbcbcbcbcbccawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaeaeagaUaUaUaUbjbjaUbGazaiagblbrbqbvbqbsaOaLaAakagananbubybzbybwclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamaqarararararasawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaxaeaeaeafagaUbEbFaSaTaTaUaNayaiagbIbrbqbvbqbsaOaLaAakagaManbObQbzbQbRclbtbNagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaxaeaeaeaeaeaeaeagbVaybJbKbLbKbLbMazahagbkbUbSbWbSbXaOaLaAakagananbYbzbzbzbNclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavbZaEaFaFaFaFaFaGawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaeaeagaiazayazayazayazazaiagbkbkbkbkbkbkaOaLaAakagananbObQbzbQbRclbtbNagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafaeaeaeaxaeaeaeaeaxagahaiahaiahahaiahaiahagbTbkbkbkbkbkaOaLaAakaganancncrbPcrcsclcBcuagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcIcKcKcKcKcKcOawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcecececececececececeabcecececececececececeabcecececececececececeabcecececececececececeabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcgcgagchcicicicicicicicichagcpcocCdxdydxcDdzdydzagcqcqcqcqcqcqcqcqcqcqagcwcvcRdfdgdgdgdgdgeaagcxcxcycycycycycycycyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfczcfcfcfcfczcfagcgcAcgcgcgcgcAcgcgcgagdkdkdkdkdkdkdociciciagcpcocCdFcFdFcFdGcFdGagcqcqcHcqcqcqcqcqcqcqagcwcvcRdpcJcJcJcJcJduagcycycycycLcLcLcycycyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcMcgagcWdwdAdBdAdhcVciciciagcpcpdCdFcFdydydycFdGagcqcqcqcqcqcqcPcQcqcqagcwcwdHdpcJcJcJcJcJduagcycycycScTcTcTcycycyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfczcfcfcfcfczcfcfcfagcgcgcUcgcMcgcgcgcgcgagcXdIdndvdndMcVcNdOciagcpcocCdFcFcFcFcFcFdGagcqcqcqcqcYcqcqcqcqcqagcwcvcRdpcJcJcJcJcJduagcycLcZdadbdbdcddcLcyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgdecgcgcgcgdecgagcWdIdndvdndMcVcNdQciagcpcocCdXdNdNdNdNdNdZagcqcqcqcqcqcqcqdmcqcqagcwcvcRdTdUdUdUdUdUdVagcycLcZdqdrdsdtddcLcyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcgcgagcWdIdndvdndMcVcNdQciagcpcocCcjckckdYckckcmagcqcqcqcqcqcqcqcqcqcqagcwcvcRebecececececgYagcycLcZdqdDdEdtddcLcyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfczcfcfcfcfczcfagcgcgcgcgcAcgcUcgcgcAagcXdIdndvdndMcVcNhjciagcpcocCcEcFcFcFcFcFcGagdPdPdPdPdPdPdPdPdPdPagcwcvcRihcJcJcJcJcJjyagcycLcZdcdJdJdKddcLcyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagdLcgcgcgcgdLcgcgcgcgagcWjzjAkXjAkYcVciciciagcpcpkZcEcFdjdjdjcFcGagdWdWdWdWdWdWdWdWdWdWagcwcwlrihcJcJcJcJcJjyagcycycydRdRdRdScycycyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfczcfcfcfcfczcfcfcfagcgdecgcUcgcgdecgcUcgagRrRrRrRrRrRrRtciciciagcpcocCcEcFcEcFcGcFcGagdWdWdWdWdWdWdWdWdWdWagcwcvcRihcJcJcJcJcJjyagcycycycLcLcLcycycycyawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgdLcgcgcgcgdLagchcicicicicicicicichagcpcocCdidjdilKdldjdlagdWdWdWdWdWdWdWdWdWdWagcwcvcRqbqyqyqyqyqyvzagcycycycycycycycyededawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabeeeeeeeeeeeeeeeeeeeeabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtmnjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjthRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRhRaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefegeheieieiehejefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefekeheieieiehelefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefeieieiefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefemeheieieiehenefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeoeheieieiehepefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefeieieiefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeqeheieieieherefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeseheieieiehetefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefefefefefefehehehefefefefefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueuefeueueueuefevevewewewewexeyezefeAeBeCeieieDewewefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeEeueueEefeFeueueEefeieieieieieieieieGefeweweHeieieDewewefaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeIeueueIefeJeueueKefeieieieieieieieieLefeweweweieiewewewefaaaaaaefefefefefefefefefefefefeMeNeOefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefePePefefefePePefefeQeReSeTeUeVeieieWefeweweHeieieDewewefaaaaaaefeXeXeXeYeZfafbeffcfdeffefffgefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffheueufifjfkeueufleffmfnfofpfqfreieifsefftftfueieieDewewefaaaaaaeffvfvfvfwewewewefffffffffffffefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueueueueueufxefeieieieieieieieifyeffzfzeffAfAeffzfzefefefefeffBfBfBewewewewfCffffffffffffefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueueueueueufDefeieieieieieieieifEeffFfGfHeieifIfJfKefeweweweffvfvfvfweweweweffLffeffMeffNefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeEfOeEfPeEfQeueufReffSfTfUfVfWfXeieifYeffZeieieieieieifKefgaefgaefeXeXeXewewgbgbeffLffefgcefgcefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzefgdgdefeffzfzfzfzfzgefAfAgeefeieieieieieieieigfeieieiefefefeffAfAefefefefefefefefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieiggghghgieieieigjgjgjgjeieifAeieieifAeieieieieieieieieieieieieieieigkefewglgmefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieieieieieieieieigngogpgqeieifzeieieifzeieieieieieieieieieieieieieieigkgrewewgsefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieigtgugugveieieieieieigwgxgxgyeieieigpgzgAgBeieifAeieieifAeieieieieieieieieieieieieieieigkefgCgDgEefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzeffAfAefeffzfzfzfzfzgFfAfAgFefeieigGgGgGgGeieiefeieieiefgHgHgHgHgHgHgHgHgHgHgHgHgHgHeieiefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefgIgJgKgLgMgNeieigOefgPgQgRgSgTgUeieigVefgWeieieieieieigXefeieieiefeuhRgZgZgZgZgZgZgZgZgZgZeugHeieifzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihaefhbhceihceieieieihdefhehffJeieihghhhiefeieieiefeujthkhlhmhmhmhmhnhohphqgZgHeieifzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihrefeieieieieieieieihseffzfzeffAfAeffzfzefeieieiefeujththuhvhwhmhmhmhmhmhxhyhzhAeiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihBhChDhEeieihFefeieihGhHhIhJeieihKefhLhMhNeieihOhPhQefeieieiefeujthtjJhShThUhUhmhmhVhqgZgHefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihWhXhYhZeieiiaefeieiibicidieeieiiaefewewifeieieDewigefeieieiefeumngZgZgZgZgZgZgZgZgZgZeugHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefiieieieieieieieiijefeieieieieieieieiikefileweweieiewewimefeieieiefefininininininininininininefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefioipiqirisitiuewivefeieieieieieieieiiwefewewifeieieDewixefeieieiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefiyiyiqirisitiuizivefiAiBiCiDiEiFiGiHiIefiJiKiLiMiNiOiPiQefeieieiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefeffAefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefiRiRiRefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiSiTiUiTiSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWiViViViWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXiXiXiXiXiXiXiXiXiXiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiZiZiZiYiZiZiZiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXjajajajajajajajajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjbjbjbiYjcjcjciYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpPpPpPpPpPaaaaaaaaaaaapPpPpPpPpPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXjajajdjdjdjdjdjajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjbjbjbiYjcjcjciYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaajgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpPjpjpjpjqpPjrpPpPpPpPpPpPjBjBjCpPjrpPpPjejejejejejejeaaaaaaaaaaaaaaaaaaaaaaaaaaiTiViViViTaaaaaaaaaaaaaaaaiXjajdjdjfjfjfjdjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjbjbjbiYjcjcjciYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaajgjojojojojojojojojojojojojojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpPjDjqjqjqjqjqjqjqpPjRjSjSpPjTjTjTjTjTjTpPkjkjjekIkIkIjeaaaaaaaaaaaaiWiWiTiTiTiTiWiWjiiWjijjjjjkjkjkjjjjaaaaiXjajdjmjljljljnjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYjbjwjbiYjcjxjciYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjgjgjojojgjgjgjgjgjgjgjgjgjgjojojgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaapPjqjqldldldldldjqjqlpjSjSjSpPlqlWjTjTjTlXpPkjkjlekIkIkIjeaaaaaaaaaaaaiWjsjsjsjsjsjsiWiViViVjjmxjujujujvjjaaaaiXjajdjljljLjLjLkajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYmzmRmRmRmSiYiYjbjbjbiYjcjcjciYiYmzmRmRmRmSiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojojojPjojojQjQjQjQjQjojgjojojojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPlYjqldldldldldjqjqlZjSjSmapPpPpPpPmbpPpPpPkjkjlekIkIkIjeaaaaaaaaaaaaiWjsjEjFjFjGjsiTiViViVjkjHjInkjujKjjaaaaiXjajdjljljljljlkCjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYjMjMjMjMjMiYiYiYjNiYiYiYjOiYiYiYjMjMjMjMjMiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojgjgjgjgkikikikikikijgjgjgjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPmtjqjqjqjqjqjqjqmuqsmvjSjSjSmwmMmLjSmNmUqskjkjlekIkIkIjeaaaaaaaaaaaaiWjsjUjVjWjXjsiTiViViVjkjYjZjZjujujjaaaaiXjajdjljljljlkDjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYkbkckckckciYkdkekfkekekekgkekdiYkckckckckhiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojgksktkukukukvkvkukukukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPmVmXmWninhnjmtjqnCqsnDjSjSjSjSjSjSjSjSnEqskjkjjekIkIkIjeaaaaaaaaaaaaiWjsjUjVjVjXjsiWiViViVjjjujujujujujjaaaaiXjajdjljljljljlkCjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYkkklklklklkmkeknkokpknkqkoknkekmklklklklkriYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojgksktkukvkvkHkHkvkvkukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaapPpPpPpPpPpPpPqslZqsqsnDjSjSnRnQocobodjSoeqskjkjjekIkIkIjejeaaaaaaaaaaiWjsjUjVjVjXjskyiViViVkzjujujujukBjjaaaaiXjajdjljlkKkKkKkSjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYkEklklklkliYkeknkokpknkqkoknkeiYkFklklklkGiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojgksktkukvkvkHkHkvkvkukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPokpRolpPpPjSjSjSjSjSjSjSjSnrqskjkjlekIkIkIonjeaaaaaaaaaaiWjsjUjVjVjXjsiWiViViVjjjukAjujujujjaaaaiXjajdjmjljljljnjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalhiYiYiYiYiYiYkeknkokpknkqkoknkeiYiYiYiYiYiYlhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojgksktkukukukvkvkukukukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPozpRoloApPqsoBpPjSoMoLpsprpPpPkjkjlekIkIkIpGjeaaaaaaaaaaiWjsjUjVkJjXjsiTiViViVjkjZjZjZjujujjaaaaiXjajdoZjljljloZjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLkMkMkMkMkMiYkeknkokpknkqkoknkeiYkNkNkNkNkNkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojgksktkukukukvkvkukukukwkxjgjojojgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapPpRpRolpIpHpJjqpKjSjSjSjSpLpMqskjkjlekIkIkIonjeaaaaaaaaaaiWjskOkPkPkQjsiTiViViVjkjZkRjujujujjaaaaiXjajdjdvwvwvwjdjdjaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLkMkMkMGfkMkTkUknknknknknknknkVkWkNIckNkNkNkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgjglajgjgjgjgjglblblblblblbjgjgjgjgjglcjgjgaaaaaaaaaaaaaaaaaaaaaaaaaapPpPpPpPpPpPpNpRolpQpOqqqpqDqrqFqEqOqNqPqskjkjlekIkIkIjejeaaaaaaaaaaiWjsjsjsjsjsjsiWiViViVjjjujujujujujjaaaaiXjajanSnXnXnXomjajaiXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakLkMkMkMkMkMiYkekekekeknkekekekeiYkNkNkNkNkNkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgliljljljjglklllllllllllllllllkjglmlmlmlnjgaaaaaaaaaaaaaaaaaaaaaaaaaapPqQsRsRsRqRozpRolpIqSpJjqqTmtqTmtqTmtqTpPlelejekIkIkIjejejejejejejejeiWiWiWiTiTiTiWlfiTlfiWiWiWiWiWiWiWiWiWiWlglglglglglglglglglglglglgiWaaaaaaaaaaaaaaaaaaQjiYiYiYiYiYiYiYiYiYiYiYiYiYkeknkeiYiYiYiYiYiYiYiYiYiYiYiYiYQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgliljljlElFlllllllllllllllllllllFlGlmlmlHjgaaaaaaaaaaaaaaaaaaaaaaaaaapPqUsRqVsRrcozpRoljqqpjqqpjqqpjqqpjqqpjqrdkIkIkIkIkIkIjekIkIkIkIkIkIkIiWiWiWiViViViViViViViViViViViWiWiWiViViSoDlslsltltltlslslslslslsluiWaaaaaaaaaaaaaaaaaakLlvkllvlwlxlylzlAlBlAlAlAiYlBlClBiYkllDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgliljlTlElFlllllllllllllllllllllFlGlUlmlVjgaaaaaaaaaaaaaaaaaaaaaaaaaapPtLsRresRrcozpRolqpjqqpjqqpjqqpjqqpjqqpqskIkIkIkIkIkIjekIkIkIkIkIkIkIiWiWlJiViViViViViViViViViViVlJiWiWiViViToFlLlMlMlNlMlOlPlslQlRlslsiWaaaaaaaaaaaaaaaaaakLklklkllBlSlSlSlSlBlSlSlSiYkeknkeiYlDlDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgmqljljlElFlllllllllllllllllllllFlGlmlmmrjgaaaaaaaaaaaaaaaaaaaaaaaaaapPrfsRsRsIrcozpRoljqqpjqqpjqpIrhrgqqqpjqrdkIkIkIkIkIkIjekIkIkIkIkIkIkIiTiViViViVmcmdmemfmgmdmhiViViViViWiViVmimjMXmkmkmkmkmkmkmlmkmmoOltiWaaaaaaaaaaaaaaaaaakLlvklklmolSlSlSlSmplSlSlSiYkeknkeiYlDlDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgmIljlTlElFlllllllllllllllllllllFlGlUlmmJjgjejejejejejejeaaaajejerijepPrjsRrcrcqRozpRoloArkrmrlqppQrornpJjqqppPlelejekIkIkIjekIkIkIkIkIkIkIiTiViViVoQmdmdmymdmymdmdoUiViViViWiViViToDmAmBmBmCmBmDmElsmFmGlslsiWaaaaaaaaaaaaaaaaaakLklklkllBmHlSlSmHlBlSlSlSiYkeknkeiYlDlDlDlDlDRElDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqKqLqBqMqMqBqLqKqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgmTljljlElFlllllllllllllllllllllFlGlmlmlmjgkIkIkIkIkIkIjejejejejhjhjhpPpPpRozozozpRpRpRrprprprppPpPpPpPpPrqpPpPkjkjjekIkIkIjekIkIkIkIkIkIkIiTiViVmcmdmdmdmOmPmOmdmdmdmhiViViWiVmQiWoFlslsltltltlslslslslslsluiWaaaaaaaaaaaaaaaaaakLlvkllvlwqIlSlSrxlBlAlAlAiYkeknkeiYkllDlDlDlDlDlDlDlDlDlDlDkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBrararbqMqMrbraraqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgnbljncljndllllllnenflllllllllllFlmlmlmlmngkIkIkIkIkIkIjerrlerGkIkIkIkIrHpRpRpRpRpRpRpRrIrIrIrIpPjTjTjTjTjTrJpPkjkjjekIkIkIjejejejejejemYjeiWiViVmdmdmdmOmZmZmZmOmdmdmdiViViWiViViWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiTiSQjlhiYiYlBiYiYmpmpiYiYiYlBiYiYkeknkeiYiYlBiYiYiYnanaiYiYlBiYlhQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBqBqMqMqBqBqBqBrCqMrDrEqMrFqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgljljnvnwnxnynynynznAnBlllllllllFlmlmlmlmjgkIkIkIkIkIkIrRrrrSrGkIkIkIkIqspRpRpRpRpRqGpRrIrIrIrIpPrTpPrUpPjTjTpPkjkjjekIkIkIkIlekIkIjekIkIkIlfiViVrNnlmOmZnmnnnonpmOnquziViVlfiViViViViViViViViViViViViViViViViViViViVjiiTiViViTiYnsknlBkekekekekekekekekdlBkekeknkekelBkdkekekentkekekekenulBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqKqLqBqMqMqBqLqKqBrLqMqMqMrMuDqBrOrPrOrPrOrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgnNljljnOndllllllnPnflllllllllllFlmlmlmlmngkIkIkIkIkIkIjerrlerGkIkIkIkIrHpRrWrVserWsrsfssrIrIrIpPsGpPsHpPsOpPpPkjkjlekIkIkIkInFkIkInGkIkIkIiTiViVnHmdmOnIiWnJiWnKmOmdnLiViViTiViViViViViViViViViViViViViViViViViViViVjiiUiViViUnMnsknnMknknknknknknknknknlCknknknknknlCknknknknknknknknknnulBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBrararbqMqMrbraraqBsbqMqMqMqMscqBsdrPsdrPsdrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgoaljljlElFlllllllllllllllllllllFlGlmlmmJjgkIkIkIkIkIkIjejejejekIkIkIjepPpPqsqsqsqssPpPqsqsqsqspPpPpPpPpPpPpPkjkjkjlekIkIkIkIlekIkIjekIkIkIlfiViVuTnlmOnTnUnVnWmZmOnqvdiViVlfiViViViViViVnYiViViViViViViViViViViViViVjiiWiViViWiYnsknlBkekekekekekekekekdlBkekeknkekelBkdkekekenZkekekekenulBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBqBqBqBqBqMqMqBqBqBqBspspsqqMspspqBrPrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgojljlTlElFlllllllllllllllllllllFlGlUlmmrjgODODODODjejejekjkjlekIkIkIjekjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjlekIkIkIjejelelejelemsleiWiViVmdmdmdmOofmOogmOmdmdmdiViViWiWiWiWiWiWiWiWohohiWiWiWiWiWiWiWiWiWiWiWiWiWiWiTiSQjlhiYiYlBiYiYlwlwiYiYiYlwiYiYkeknkeiYiYlBiYiYiYoioiiYiYlBiYlhQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBszsAszqBsBsBqMqMsCsDsEqBqMqMqMqMqMqMqBsFrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgoyljljlElFlllllllllllllllllllllFlGlmlmoKjgkjkjkjkjkjkjkjkjjesQkIkIkIsSjekjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjjejekIkIkIleoooplolololooqiTiViVormdmdmdmOmOmOmdmdmdosiViViWlulululululululululululululululululululululuiWaaaaaakLotototototototiYouovlwowiYkeknkeiYoxoxoxoxoxoxoxoxoxoxoxklkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBsMsMsMqBqMrPrPrPrPrPqMqMqMrPrPrPrPqMsNrPrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgoJljlTlElFlllllllllllllllllllljgRhRhRhRhjglelelelejelelelejejhkIkIkIjhjejejejejelelelelelelelelelelelelejelelelejejhkIkIkIlemKsTlolololooCiTiViViVvpmdmdoEmdoEmdmdvriViViViWlulululululululululululululululululululululuiWaaaaaakLotototototototiYoGoHlwoIiYkeknkeiYoxoxoxoxoxoxRFoxoxoxoxoxkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBtasMsMtbqMtctctctctcqMqMqMrPtdtdrPqMsNrPrPrPrPrPrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgoTljljlElFlllllllllllllllllllljgkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjhkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkInGkIkIkIkIjesVlololololooNiTiViViViVormdvNoPwMmdosiViViViViWlululululuoRoRoRoRoRoSoSoRoRoRoRoRlululululuiWaaaaaakLotototototototiYknknknkniYkeknkeiYoxoxoxoxoxoxoxoxoxoxoxoxkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBtasMsMqBqMrPrPrPrPrPqMqMqMrPrPrPrPtrqBsdrPrOrPsdrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgpgljljljjglklllllllllllllllllkjgkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjhkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjekIkIkIkIjelolololololoxWiWiWlJiViViViViViViViViViViVlJiWiWlulululuoRoVoWoXoYoRRGpaoRpbpcoRoRoRoRlululuiWaaaaaakLotototototRHotpdpeknknknpfkeknkeiYoxoxoxoxoxoxoxoxoxoxoxoxkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBtAqBtBqBtCtDtEtFtGtHtIqBqMqMqMqMqMqMqBrOrPrOrPrOrPqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaajgjglajgjgjgjgjglblblblblblbjgjgjgkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIjhkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkIkInGkIkIkIkIjephpipjpkpllopmiWiWiWiViViViViViViViViViViViWiWiWlululuoRoRpnpnpnpnoRpopooRpnpnpppqoRoRoRluluiWaaaaaakLotototototototpdknknknknpfkeknkeiYoxoxoxoxoxoxoxoxoxoxoxklkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBtTqBqBqBqBqBqBqBqBqBqBqBsqqMqBqBqBqBqBqBqBqBqBqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojgpCktjopDpDpEpEpDpDpDRipFjgjeleleletflelelejejelelelejejhkIkIkIjhjelelelejejelelelesUlelelejejelelejelelelejejhkIkIkIjejejejejejejejeiWiWiWiWiWiWiWlfiTlfiWiWiWiWiWiWiWluluoRoRoRptpupvpwoRpxpnpypnpnpnpnpzpAoRluluiWaaaaaakLotototototototiYlwlwpBlwiYkeknkeiYlwlwlwlwlwlwlwlwlwlwlwlwlwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqBqBaaaaaaaaaaaaaaaaaaqBqMtZqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojgpCktjopDpDpEpEpDpDpDRipFjgtekIkIkIkIkIkIkIRjjekjkjkjjejetftftfjejekjkjkjjekIkIkIkIkIkIkIkItgjekjkjkjkjkjkjjejekIkIkIjejeaaaaaaaaaaaaaaaapXpSpTpUpVpWpWpWpXpYpZqapZpYiWluluysqcqdpnqeqeqeoRpnpnoRqfqgqhqiqjqkoRluluiWaaaaaakLotototototototiYqlqmqmqniYkeknkeqoknknknknknknknknknknknknlwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBqMqMqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojgpCktjopEpEqCqCpEpEpDRipFjgkIkIRkkIkIkIRkkIkIjekjkjkjkjjekIkIkIjekjkjkjkjjethtitikIkIkIkIkItgjekjkjkjkjkjkjkjlekIkIkIjeaaaaaaaaaaaaaaaaaapXqtquqvpXpWpWpWqwpYpZqxpZpYiWluluyzqcpnpnpnpnpnpypnpnoRoRoRoRoRoRoRoRluluiWaaaaaakLotototototototiYqlqzqmqniYlBlClBiYqAkoqAkoqAkoqAkoqAkoqAkolwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqBuQuQqBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojgpCktjopEpEqCqCpEpEpDRipFjgkIkIjeRqjeRqjekIkIlekjkjkjkjlekIkIkIlekjkjkjkjlekIkIkIkIkIkIkIkItjjelelejejejejejejejejejejeaaaaaaaaaaaaaaaaaapXpXpXpXpXpWpWpWqwpYpYpYpYpYiWluluoRoRpnpnpnqHpnoRpnpnpnAfqJlululululululuiWaaaaaaQjiYiYiYiYiYiYiYiYiYiYlwiYiYkeknkeiYiYiYiYiYiYiYiYiYiYiYiYiYQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauXuYuYuXaaaaaaaauZuZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojgpCktjopDpDpEpEpDpDpDRipFjgkIkIjeRmjeRmjekIkIlekjkjkjlelekIkIkIlelekjkjkjlekIkItkkIkIkIkIkIjejetstststsjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpSpTpUpVpWpWpWpYpYpYpYqWpZiWlululuoRoRoRoRoRoRoRpxpnqXpnqJlululululululuiWaaaaaaaaaaaaaakLqYqYqYqYqYiYkdkekekeknkekekekdiYqZqZqZqZqZkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZuZvtvuvvuZaaaaaaaaaauZuZRIvxuZuZaaaauZuZuZuZvyAoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojgjgjgjgkikikikikikijgjgjgjelolojeRnjeRnjelololekjkjkjlekIkIkIkIkIlekjkjkjlekIkIkIkIkIkIkIkIjetststststsjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXrsquqvpXpWpWpWpYpYpYpYpYpYiWluluoRoRrtrurvrtrwoRpnpnpnDtqJlululululululuiWaaaaaaaaaaaaaakLqYqYqYRJqYryrzknknknknknknknrArBqZRKqZqZqZkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuXvEvFuZvGvHvIvJvKuZuZaaaaaauZuZuXuYuYuXuZvtvvuXvLvMuZvyDEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjojojojojPjojorQrQrQrQrQjojgjelolojejejejejelololekjkjkjjekIkIkIkIkIjekjkjkjletJkIkIkIkIkIkIkIjetststststsjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpXpXpXpXpWpWpWqwpYpYpYpYpYiWluluysqcpnpnpnpnpnpypnpnoRoRoRoRoRoRoRoRluluiWaaaaaaaaaaaaaakLqYqYqYqYqYiYkeknrKrKrKrKrKknkeiYqZqZqZqZqZkLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawdwewfwfwgwfwfwhwiwjuZuZvtvuvvuZuZwkwfwfwluZwmwnwowfwpuZvyDEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaajgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjelololololololololojekjkjkjlekIkIkIkIkIlekjkjkjjekIkIkIkIkIkIkIkIjejejejejejejeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpSpTpUpVpWpWpWqwpYpZqxpZpYiWluluyzqcrXpnpnpnpnoRpnpnpnpnpnoRpnrYrZoRluluiWaaaaaaaaaaaaaaiYiYiYiYiYiYiYkeknsasasasasaknkeiYiYiYiYiYiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawvwwwxwyuZwfwfwzwAwBuZwCwDwEwFwGwHwIwJwJwfwKwfwfwfwfwLuZvyDHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajejelololololololojejekjkjkjlelekIkIkIlelekjkjkjjejekIkIkIkIkIkIkIjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXrsquqvpXpWsgshpXpYpZsipZpYiWluluoRoRoRsjskslsmoRpxslslslpnpypnpnpnoRluluiWaaaaaaaaaaaaaakLsnsnsnsnsniYkeknsasasasasaknkeiYsososososokLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZuZwOwfwfwPuZwQwRwSwTwUwVwWwJwJwfwKwfwXwYwfwfuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajejejejejejejejejekjkjkjkjkjlekIkIkIlekjkjkjkjkjjejejejerijejejejeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapXpXpXpXpXpXpXpXpXpXpXpXpXpXiWlululuoRoRpnpnpnpnoRpnslslslpnoRstoRoRoRluluiWaaaaaaaaaaaaaakLsnsnsnRLsnsusvknswswswswswknsxsysoRMsososokLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZxewfuZuXxfxgxhxixjxkwWwJwfwOuXuZuZuXxlxmuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUjekIkIkIjetVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlulululuoRoRsJsKsLoRpnpnpnpnpnoRoRoRoRlululuiWaaaaaaaaaaaaaakLsnsnsnsnsniYkeknknknknknknknkeiYsososososokLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZxqxruZuZuZuZuZuZuZuZxswfwfwfwfxtwfwfwfwfuZuZxuwfuXuZxvxvuZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUucudueueuetUufugubububtUuhuhuiujtUlIkIkIkIlIuktKtNtMtOtKtPtVtPtQtRtRunumupuouotVuqurusuttVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlululululuoRoRoRoRoRoRoRoRoRoRoRoRlululululuiWaaaaaaaaaaaaaaiYiYiYiYiYiYiYsWsXkekeknkekesYsZiYiYiYiYiYiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZxDxEuZxFuZxGxHxIuXuZxJwfwJwJwJwJwJwJwJwJwJwfwJwfxKxLwJwJwfuZvyAoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuBubuBtUubububububuCufufDIubububububububtUkIkIkIkIkIukululululululululuEuFuFuFuGululultVuHululuItVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlulululululululululululululululululululululuiWaaaaaaaaaaaaaaaaiYtlqmtmtniYiYiYiYkeknkeiYiYiYiYtotptptqiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxVDJwJxXuZxYuXuZxZuZyauZybwJwJycydyeyfygyhyiwJwJwJwJyjykwJwJwfuZvyDEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUubububububuCubububububtUububububtUkIkIkIkIkIukvCvUvTvTxzxzytulululululululululyLululuRuStVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWlulululululululululululululululululululululuiWaaaaaaaaaaaaaaaaiYttqmqmqmtutulBkdkeknkekdlBtvtwtxtytytziYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayyEZyAwJyBwfwfwfwfyCwfwfwfwJwJyDyEyFyGyHyIyJwJwJwJwJyKwJwJwJwfuZvyDEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuCubuCtUububvavbvctUubGwubububtUtUtUtUtUtUjezflezfjetVtVukukukuktVtVuIulvevfululululzxtVvgvhulvitVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWiWaaaaaaaaaaaaaaaalBqmqmqmqmqmqmtSkeknknknketSqmqmqmqmqmqmlBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZyMyNuZyOyPyQyRySwfyTwfwfwJwJwJwJwJwJwJwJwJwfwJwfyUwfyVwJwpuZvyDHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUububububububtUuCuCtUugufubububvAvBvBvBvBtUjekIkIkIjetVzyzzzzzzzzzytVulululululzAzBultVtVtVtVtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYtWqmqmtXtYqmlBkeknknknkelBqmqmqmqmqmqmiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZyZzauZuZuZuZuZuZuZuXzbwfwfwfwfwXwfwfwfwfuZuZxuwfuXuZzczduZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUubvOvOvOububuCvPvPuCufufubububvQvBvBvBvBvRkIkIkIkIkIvSululzCzDululvVululvWvXulzEzFultVvYvZwawbwctVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQjuuqmqmtvqmqmiYiYlBuvlBiYiYuwuxqmuyGxuAQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZxewfuZuXzgzhzizjzkwHzlwJwfzmuXuZuZuZwfznuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUubwqwrwsububwtububwtububububwuufvBvBvBvBuClIkIkIkIlIukululzCzDululukulululululxSzGulyLululululultVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQjuJqmqmtXtYqmiYuKuLuMuNuOiYlwlwuPlwlwlwQjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZwfzmwfwfzpuZzqzrzsztyWwVzvwJwJwfzwwfxtwfwfwfuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUubvOvOvOububwtububwtubububububwNvBvBvBvBvRkIkIkIkIkIvSululzCzDululvVululvWvXulululzHtVtVtVyLtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYIaqmqmqmqmqmiYuMuUuMuUuMiYuVqmqmqmuWlwiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazKzLzMzNuZwfwfwhzOzPuZzQzRzSzezUxkzVwJwJwfzwwfwfwfwfwfuZvyAoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUububububububtUuCuCtUuCuCwZuCuCuCxaxaxavBtUkIkIkIkIkItVzIululululzHtVzIzHzJxzxzxzxzzTtVxbxcxcxcxdtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYvjvkvlvmvniYvoIbvqKlvsiYuVqmqmqmuWiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAlwfwfwfAmwfwfAnApApuZuZAqArAsuZuZAtAuAvwfuZAwAxAywfwpuZvyDEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuCubuCtUububububugtUubububububtUtUuCuCuCtUlolololokItVzWululululzXxnzWzXtVukukzYukuktVxoulululxptVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYvDvDvDvDvDiYiYiYiYiYiYiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuXADAEuZAFwfAGAHAIuZuZaaaaaauZuZuXAJAKuXuZAqAsuZALAMuZvyDEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUububububxwtUububufububtUububububxxkIkIkIkIkIukzZulzCzDulzXxyAazXtVxAulululxAtVxBulululxCtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauZuZuZuZuZuZAqArAsuZaaaaaaaaaauZuZATAUuZuZaaaauZuZuZuZvyDHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuBubuBtUxMubububxNtUubxOufxPubwZubububxQxRkIlolololoukAbulzCzDulzXxTzWzXtVulululululyLululuRulxUtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauXAYAZuXaaaaaaaauZuZuZuZuZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUuaubuatUylugubymyntUyoypyqwqyrtUububKmDIuCkIkIkIkIkIukAcxzAdAexzzTtVLdzTtVyuulyuulyutVyvywywywyxtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUtUjezfzfzfjetVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVtVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYAgAgAgAgAgAgAgAgAgAgAgAgAgyYAgAgAgAgAgAgzojhkIkIkIjhzoAgAgAgAgAgAgyYAgAgAgAgAgAgAgAgAgAgAgAgyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYAgAgAgAgAgAgAgAgAgAgAgAgAgyYAgAgAgAgAgAgzolIkIkIkIlIzoAgAgAgAgAgAgyYAgAgAgAgAgAgAgAgAgAgAgAgyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYAgAgAgAgAgAgAgAgAgAgyYyYAhyYyYAgAgAgAgAgzojhkIkIkIjhzoAgAgAgAgAgyYyYAhyYyYAgAgAgAgAgAgAgAgAgyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYzozozozozozoyYzozoyYyYAiAiAjyYyYzozozoyYAkzoyXyXyXzoAzyYzozozoyYyYAjAiAiyYyYzozozozozoyYyYyYyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyXyXyXyXyXyXyXyXyXzuyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXzuyXyXyXyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyXyXyXyXyXyXyXyXyXyYyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyYyXyXyXyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaBKBKBKBLBKBKBKaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyXyXyXyXyXyXIgyXyXzuyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXzuyXIJyXyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaBKBLBKBKBUBVBWBKBKBLBKaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYzozozozozozoyYzozoyYyYAAAAAAyYyYzoyYzozozozozoyYzozozozozoyYzoyYyYAAAAAAyYyYzoyYzozozozozozoyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaBKBKBKCcCdBKCeCfCfBKCgChBKBKBKaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoyXyXyXyXCrzoaaaaBraaaaaaaaaaaaaaaaaaBraaaazoCryXyXyXCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaBKBKCjCkClClBKCmCfCfBKCnCoCpCqBKBKaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaBraaaaaaaaaaaaaaaaaaBraaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKBKCtCuCvClClBKCwCfCfBKCxCxCxCxCyBKBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoABACyXyXyYaaaaBraaaaaaaaaaaaaaaaaaBraaaayYyXBJBCBNyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKCCCDCECvClClCFCxCxCxCGCxCxCxCHCxCIBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPBByXBwzoaaaaBraaByBzBzBzBzBzByaaBraaaazoBxyXAQyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBKBKClCMCMClClClBKCNCxCOBKCPCxCQCxCxCRBKBKaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARBMyXyXzoaaaaBrByBEASBGBHBIAVBEByBraaaazoyXBMBCBDyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBLCSClClClClClCTBKCNCxCUBKCVCxCxCWCxCxCXBLaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaBrByBOBPBQBRBQBSBTByBraaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKBKBKDcDdClDeDdBKBKBKCGBKBKBKDfDgCxDhDiBKBKBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBtyYzozozoyYyYyYyYyYyXyXyXyXyXyYBrBrBrBzBRBRBZCaCbBRBRBzBrBrBryYyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKCxBKBKBKCFBKBKBKDlDmDnDoDpBKBKBKCGBKBKBKDqBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaaaByBRBRBECiBEBRBRByaaaaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBLLtCxDuDvCxDwDxBKDyDnCxDzDABKDBDnCxDnDCDDDqBLaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoAByXyXCrzoaaaaByBECsAWBEByBEAWCsBEByaaaazoCryXyXyXCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBLLBCxDFCxCxCxCxCGDnCxBKCxDnCGCxCxCxCxDGDqDqBLaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPyXAXzozozozoCzCABRBRCBBaCBBRBRCACzzozozozoAByXAXzozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBLMFCxDnDnCxMLMOBKDKDnCxDnDLBKDMDnCxDnBKDNDOBLaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARyXBbCKyXBcCKCLRNBRBRBRBRBRBRBRBRCLCKyXBcCKAPyXBbCJAOANBXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKCxBKBKBKCGBKBKBKDPDQDnDRDSBKBKBKCGBKBKBKDTBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXBbCKBdyXCKCLBRBRBRBRBRBRBRBRBRCLCKBdyXCKAPyXBezozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaBKBKBKDUDVCxDWDXBKBKBKCGBKBKBKDYDZCxEaEbBKBKBKaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBtyYzozozoyYyYyYyYyYyXyXyXBezozozozoCzBfBRCZDaBRCZDaBRDbCzzozozozoARyXyXBvzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBLEeCxCxCxCxCxEfBKEgEhEiBKEjCxCxCxCxCxCxBLaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBvzoaaaaBzDjBRCZDaBRCZDaBRDkBzaaaazoBvyXyXyXyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaBKBKDqEsDqEtCxEuBKEvEwExBKDZCxEyEzEAEBBKBKaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoAByXyXDryYaaaaBzDjBRCZDaCaCZDaBRDkBzaaaayYyXyXyXyXyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKDqECEDEECxCxCGEFCxEGCGCxCxEHEIEJEBBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPyXyXBvzoaaaaBzDjBRCZDaBRCZDaBRDkBzaaaazoBvyXyXyXyXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaBKBKEQDqDqCxERBKEvCxExBKDnCxESETEUBKBKaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARyXAXzozozozoCzBgBRCZDaBRCZDaBRBhCzzozozozoAByXyXBvzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaBKBKEWEXCxEYBKBKCGBKBKDnCxEBEBBKBKaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXBbCKyXBcCKCLBRBRBRBRBRBRBRBRBRCLCKyXBcCKAPyXAXzozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaBKBKBKFbFcBKCxCxCxBKFdFeBKBKBKaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBtyYzozozoyYyYyYyYyYyXyXyXBbCKBdyXCKCLBRBRBRBRBRBRBRBRBRCLCKBdyXCKAPyXBbCJAOANBXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaBKBLBKBKFfFgFhBKBKBLBKaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXBezozozozoCzAWEcAWByBiBjEdBiBjCzzozozozoARyXBezozozozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaBKBKBKBLBKBKBKaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoAByXyXCrzoaaaaByEkElEmByEnEoEpEqErByaaaazoCryXyXyXCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXAOANCJAPyXyXBwzoBrBrByEkElEmByBkBlEpEpEpByBrBrzoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozozozoARyXyXyXyYaaaaByEkEKBmByELEMBnEOEPByaaaayYyXyXyXyXyXyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBvyXyXyXBwzoaaaaByEVEVBEByByByBEEVEVByaaaazoBxyXyXyXBwzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoyXAXBpBoBqzoaaaaByNGNGByFaFaFaByNGNGByaaaazoBuBoBAABCrzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayYyYzoCJCJBtyYaaaaaaaaaaByNGNGNGByaaaaaaaaaayYBtCJCJzoyYyYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBFCYBYzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBFCYBYzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoDsFiENzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoDsFiENzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazozoBXBXzoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazoBXBXzozoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFkFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFlFnFnFnFoFpFoFoFoFoFoFoFoFoFnFnFnFnFkFmFqFqFrFqFqFqFsFsFsFqFqFsFsFsFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFlFnFoFoFoFoFoFtFoFoFoFtFoFoFnFnFnFnFkFmFuFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFvFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFjFjFjFjFjFnFoFoFpFoFoFoFtFoFoFoFtFoFoFoFnFnFnFkFmFqFqFqFqFqFqFqFqFqFqFqFqFqFwFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFxFyFyFzFAFzFyFyFBFjFoFpFoFoFoFoFoFtFoFoFoFtFoFoFoFoFnFnFkFmFqFqFqFqFqFqFqFqFqFqFqFqFqFuFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFCFyFyFyFyFyFyFyFyFjFoFoFoFoFoFoFoFtFDFEFDFtFoFoFoFoFoFnFkFmFqFqFqFqFFFwFqFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFGFyFHFIFIFIFJFyFyFjFjFKFKFjFoFtFDFtFtFtFtFtFDFtFoFpFoFoFkFmFqFqFqFqFqFLFLFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFMFNFOFjFyFyFyFPFQFQFQFRFyFyFyFjFSFSFjFtFtFTFUFVFWFXFYFTFtFtFoFoFoFkFmFqFqFqFqFLFZGaFLFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjGbGbGbGcFyFyFyFPFQFQFQFRFyFyFyGdFSFSGdGeROFtGgGhGhGhGiGjGkFtFoFoFoFkFmFqFqFqFqFLGlGmFLFqFqFFFqGnFqFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjGoGoGoFjFyFyFyFPFQFQFQFRFyFyFyFjFSFSFjFtGpGqGrGjGjGjGjGjGsFtFoFoFoFkFmFqFqFqFqFqFLFLFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFjFjFyFyGtGuGuGuGvFyFyFjFjFKFKFjFtFTFTPPGjGjGjPQFTFTFtFoFoFpFkFmFqFqFwFqFqFqFqFqFqFqFqFqFqFqFqFqFuFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFjFyFyFyFyFyFyFyGyFyFjFoFoFoFoFoFtFTGzGjGAGjGBFTFtFoFoFoFoFkFmFqFqFFFwFqFqFqFqFqFqFqFqFqFqFqFqFwFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFjGCGCGCFyFyFyGCGCGCFjFoFoFpFoFoFoFtFtGDGEGFFtFtFoFoFoFoFoFkFmFqFqFqFqFqFqFqGGFqGHFqGHFqGIFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFjFjFjFjFKGJFKFjFjFjFjFoFoFoFoFoFoFoFtGKGLGMFtFoFoFoFoFoFoFkFmFqFqFqGNFqFqFqFqFqFqFqFqFqFqFqFqFqFqFqFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoGOFoFoFoFoGPGQGRGSGTGUGPFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkFmGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVGVFmFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGWGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGWFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFpFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoGOFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoGOFoFoFoGQGRGSGTGUFoFoFoFoFoFoFoFoFoFoFpFoFoFoFoFoFoGOFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGSFjFjFKFKFKFjFjFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFoFoFoFoFoFoFoGQGRGSGSFjHaFyFyFyHbFjFoFoFoFoFoFoFoFoFoFoFoFoFoFoFoFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFjFjFjFKFKFKFKFjFKGJFKFjFyFyGCFyFyFjFKFjFjFjFKFjFjFjFjFjFjFjFjFjFjFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHcFyFyFyFyFyFyFyFyFyFyHdFjFyGCHeGCFyFjHfHgFjHgHhFjHiHjHkFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHcFyFyFyFyFyFyFyFyFyFyFyFjFyFyHlFyFyFjFyHmFjHmFyFjHnHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjFKGcFKFjHoFyFyFyFyFyFyFjHpFyFyFyHbFjFyFyFjFyFyFjHqHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHrGoHsFjFKHtFKFjFyFyFyFjFKFjHuFjFKFjFjHuFjHuFjFjFjHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHvGoHwFjHxHxHxFjFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyHyHjHjFjaaaaaaaaaaFkGYGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGZGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHzHAHBFjHxHxHxFjFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFyFjHCHDFjaaaaaaaaaaFkGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYFkaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFjHEHFHGFjHHHIHJFjHcFjHcFjHKHKHKHKHKHKHKHKFyFyFBHLHMHMHMHMHMHMHMHMHMHMHMabababababababababababababababababababababaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababHNHNHNHNHNHNHNHNHNHNHNHNHNababababababababababHOHOHOHOHOHOHOHOHOHOHOHOHOababHKHKHPHQHRHSHTHUHKHKHKHKHKHMHVHWHXHWHXHWHXHWHXHMaaaaaaaaHZRlRoRpHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIeIeIeIfHNMyMyIhHNIiIjIjHNIeIdIdIdIdIdIdIdIdIdIdHOIkIlHOIkIlHOIkIlHOIkIlHOIdIdHKImInInInInInInIoHKHKIpHKHMHVHVHVHVHVHVHVHVHVHMaaaaaaaaHZIqIqIqHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIeIfIfIfIrIjIjIjHNIjIjIsItIeIeIeIdIdIdIdIdIdIdIdHOHOHOHOHOHOHOHOHOHOHOHOHOIdIdHKIuInInIvIwInInIoHKInInIxHMHMHMHMHMIyHMHMHMHMHMHMHMIzHMIAIBIBIBIAaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIeIeIfIfICIfIjIjIDIjIjIjHNIEIFIeIeIdIdIdIdIdIdIdHOIkIlHOIkIlHOIkIlHOIkIlHOIdIdHKIGInInIHIIInInHYHKIKIKIKHMHVHVHVHVHVHVHVHVHVHVHVILIMINIOIPIPIPHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdIeIeIfHNIQIjIjHNIjIjIjHNIRISITIeIeHNHNHNHNHNHNHOHOHOHOHOHOHOHOHOHOHOHOHOIdIdHKIUInInIVIWInInIXHKInInInIYHVHVHVHVHVHVHVHVHVHVHVILIMINIOIPIPIPHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdIdIeIeHNIjIjIjHNIjIjIjHNIZISISItIeJaJbJcJdHNJeJfJgJhJiJjJkabIdIdIdIdIdIdIdIdHKJlInInInInInInIXHKInInInIYJmJmJmJnJnJnJmJmJmHMHMHMIzHMIAJoIPJpIAaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNHNHNHNHNHNHNHNIjIjIjJqISISISJrHNJsJtJtJuHNJvItJwItItItJxabIdIdIdIdIdIdIdHKHKIKIKHKJyJyHKIKIKHKHKJzJzHMHMHMHMHMHMHMHMHMHMHMIdIdIdaaHZJoIPJpHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJAJBJCJBJDJEHNIjIjIjHNISISISJFHNJGJtJtJHHNJIJJJKJLJwJMJNabIdIdIdIdIdHKHKHKInInInInInInInInInHKInInInHKJOJPJQJRJSHKJTJUJVHKHKHKIdaaHZJWIPJWHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJXJYJXJYJXJZHNIjIjIjHNKaKbKcHNHNHNIDHNHNHNHNHNKdKdKdHNHNabIdIdIdIdIdHKInHKInInInKeInInInInInKfInInInHKKgJPJPJPKhHKKiKiKiKjKkHKIdaaHZRsIPRuHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJYKnJYJYJYKoKpIjIjIjHNHNHNHNHNIjIjIjIjItKpKqKrIfIfKsIfIeabIdIdIdIdIdHKKtHKInInInInInInInInInKfInInInHKKuJPJPJPKvHKKwKiKiHKHKHKIdaaHZKxKyKxHZaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNJXJYJXJYKzKAHNIjIjIjIjIjIjIjIjIjIjIjIjIjKBKqIfKCKDKEIfIeabIdIdIdIdIdHKHKHKInKFKGInInInInKHKIHKInInInHKKJJPJPJPKKHKKLKiKiKMKNHKIdaaaaHZKOHZaaaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNKPJBKQJBKRJBHNKqIjIjIjIjIjIjIjIjIjHNHNHNIeKSKqIfIfIfKTIeabIdIdIdIdIdIdIdHKHKIKIKHKKUKUHKIKIKHKHKInInHKHKHKKVHKHKHKHKKWHKHKHKHKIdaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdIdHNHNHNHNHNHNHNHNKXKYKXHNHNHNHNHNHNHNHNIeIeIeIeKZIfIfIfLaIeabIdIdIdIdIdIdIdIdHKLbInInInInInInLcHKRvInInIKLeLfLgLgLhHKLiLiLjLjLjHKHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNHNIiIjIjKqKqHNLkLkLkLkLlHNLmIjIjIjLnHNHNIeIeIeIfLoKDKDLpIeabIdIdIdIdIdIdIdIdHKLbInInLqLrInInLsHKRwInInHKLgLgLuLgLgHKLiLiLvLvLvLwHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNIjIjIjIjIjKqHNLkLkLxLkLkHNIjIjIjIjKqKqHNIeIeIeLyIfIfIfIfIeabIdIdIdIdIdIdIdIdHKLbInInLbLzInInLAHKRxInInLCLgLDLELFLgLGLiLiLiLiLiLHHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNIjIjIjIjIjIjKYLkLILJLKLkKYIjIjIjIjIjKqHNIeIdIeIeLLLMIfIeIeabIdIdIdIdIdIdIdIdHKLbInInLNLOInInLPHKLQInInHKLgLDLELFLgHKLiLiLvLvLvLRHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdIdHNKqIjHNKXKXKXHNLkLILSLKLkHNKXKXKXHNIjIjHNIeIdIdIeIeIeLTIfIeabIdIdIdIdIdIdIdIdHKLbInInInInInInLPHKInInInIKLgLgLULgLgHKLVLVLjLjLjHKHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdIdIdaaHNIjKqHNaaaaaaHNLWLkLXLkLkHNaaaaaaHNIjIjHNIeIdIdIdIdIeIeLYIeabIdIdIdIdIdIdIdIdHKHKHKLZMaMbMcHKHKHKHKInInHKIKLgLgLgIKHKHKHKIKIKIKHKIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdIdaaaaaaMdMeMeMfaaaaaaHNHNKXKXKXHNHNaaaaaaMdMeMeMfaaIdIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdIdHKHKHKHKHKHKaaaaMgMhMhMiIKIKIKIKIKaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdaaaaaaaaMdMjMkMfaaaaaaaaaaaaaaaaaaaaaaaaaaMdMjMkMfaaIdIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaMgMlMmMiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdIdaaaaaaaaMdMeMeMfaaaaaaaaaaaaaaaaaaaaaaaaaaMdMeMeMfaaaaIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaMnMhMhMoaaaaaaaaaaaaMpMpMqMrMsMpMpMpMpMpMpMpaaaaaaIdIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtMuMvMtaaaaaaMtaaaaaaaaaaMtaaaaaaMtMwMxMtaaaaIdIdIdIdIdIdIdabIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaMpMzMzMpaaaaaaMpMpMpMpMAMBMBMBMBMBMCMpMDMERyaaaaaaaaIdIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtMGMHMtaaaaaaMtMIMJMJMJMKMtaaaaaaMtRPMMMtaaaaaaaaIdIdIdIdIdabIdIdIdIdIdIdIdIdaaaaaaaaaaaaMpMpMpMpMNRQMPMQMRMSMpMpMTMUMpMVMBMBMBMBMBMWMpMDMERzaaaaaaaaaaIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtMYMZMtaaaaMtMtNbNaNdNcNeMtMtaaaaMtNfNgMtaaaaaaaaaaIdIdIdIdabIdIdIdIdIdIdIdaaaaaaaaaaMpMpMpMBMBNhNiNjNkNlNmNnNnNoNpMBMpNqMBMBMBMpMpMpMpMDMERzaaaaaaaaaaIdIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtNrMtMtaaaaMtMtNtNsNuNsNvNwMtaaaaMtMtNxMtaaaaaaaaaaIdIdIdIdabIdIdIdIdIdIdaaaaaaaaMpMpMpMpNyMBMBMpNzNANAMQNBMBMBMBMBNyMpNCMBMBNDMpNENFMpMDMERAaaaaaaaaaaaaIdIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdIdaaaaaaaaaaMtNHNIMtMtMtMtNJNsNsNsNsNsNJMtMtMtMtNKNMMtaaaaaaaaaaIdIdIdIdabIdIdIdIdIdaaaaaaaaMpMpNNNOMpMBMBNPMpNQNRNSNTMpNUNVMBMBMpMpMpNWMBNXNYNZOaMpMpMpMpMpaaaaaaaaaaaaIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIdIdaaaaaaaaaaaaMtObOcOdOeOfMtOgNsNsNsNsNsOgMtOhOiOjOcObMtaaaaaaaaaaIdIdIdIdabIdIdIdIdaaaaaaaaaaOkOlMBOmMpMBMBOnMpOoOpOpOqMpMpMpMpOrMpOsMpMSOrMpMpNZOtMpOuOvOwMpMpaaaaaaaaaaIdIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxIdaaaaaaaaaaaaaaMtObOcOcOcOyMtOzOAOBOCOzOAOBMtNLOcOcOEObMtaaaaaaaaaaIdIdIdIdabIdIdIdIdaaaaaaaaaaOFOGOpOHMpMBMBNPMpOIOpOpOJMpMBOKOLOpMBMBMBOKOpMBMpMpMpMpNZNZNZOMMpMpaaaaaaaaaaIdIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaOOObOcOcOcOcOCNsNsNsNsNsNsNsOCOcOcOPOcObOOaaaaaaaaaaaaIdIdIdabIdIdIdIdaaaaaaaaaaOFOQOROpOSOpOpOpOSOpOpOpOpOSOpOpOpOpOpOTOpOpOpNZNZNZNZOUNZNZNZNZOVMpaaaaaaaaaaaaIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaOWOXOcOYOZOcMtPaPbNsNsNsPdPcMtOcPeOcPfObOWaaaaaaaaaaaaIdIdIdabIdIdIdaaaaaaaaaaaaOFPgOpPhMpMBMBNPMpOIOpOpOJMpMBNWMBOpMBMBMBNWOpMBMpMpMpMpPiNZNZPjMpMpaaaaaaaaaaaaIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaPkOXOcOcMtPlMtMtMtPmPoPnMtMtMtPpMtPqPrPsPkaaaaaaaaaaaaaaIdIdabIdIdIdaaaaaaaaaaaaPtPuMBPvMpMBMBOnMpOoOpOpOqMpMpMpMpOrMpPwMpMSOrMpMpPxPxMpPyPzPAMpMpaaaaaaaaaaaaaaIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaMtMtPBPCPCMtPDPEPDPFPGPIPHPFPJPKPLMtPMPNPOMtMtaaaaaaaaaaaaIdIdabIdIdaaaaaaaaaaaaaaMpMpRBRCMpMBMBNPMpPRMBMBPRMpPSPTMpMBMpMpMpPUOpPVOpPWPXMpMpMpMpMpaaaaaaaaaaaaaaaaIdIdIdabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaMtMtPYPYMtMtPDPDPDPZPGQaPHPZPLPLQbMtMtPYPYMtMtaaaaaaaaaaaaIdIdabIdIdaaaaaaaaaaaaaaaaMpMpMpMpNyMBMBMpMpMpQcMpMpNZNZQdMBNPMpQeQfOpOpQgQhQiMpMDMERyaaaaaaaaaaaaaaaaaaaaIdIdabaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaMtRDRDMtMtQkQlPDQmQnNsQnQmPLPLQoMtMtRDRDMtaaaaaaaaaaaaaaIdIdabIdaaaaaaaaaaaaaaaaaaaaaaMpMpMpMBMBMBMpNENZMpQpNZNZQqQrQsMpOpOpOpOpQtQuQvMpMDMERzaaaaaaaaaaaaaaaaaaaaIdIdabaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtPDQwPDMtMtQxMtMtQyPLQzMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaMpMpMpMpMpQAQBMpMpMSMpMpQCQDMpQEOpOpOpQFOpQGMpMDMERzaaaaaaaaaaaaaaaaaaaaIdIdabaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtPDPDQHMtQIQJQKMtPLPLQLMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMpMpMpMpaaaaaaMpMpMpMpQMQNOpQOQPQQQRMpQSMERAaaaaaaaaaaaaaaaaaaBrBrIdabaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtMtQTPDMtQUQJQVMtQWQXMtMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMpMpQYQZRaMpMpMpMpMpMpMpaaaaaaaaaaaaaaaaBrBraaIdabaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaMtMtMtMtMtRbRcRdMtMtMtMtMtaaaaaaaaaaaaaaaaaaaaIdIdIdabIdBrBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBrBraaaaIdOxaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaaaaaMtMtPYPYPYPYPYMtMtaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdabIdaaBrBraaaaIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBrBraaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaIdIdIdaaaaaaaaaaaaaaaaaaMtRTRTRTRTRTMtaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdabIdaaaaBrBrIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdaaaaaaaaaaONaaaa +aaaaabababababababReabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdaaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdabIdaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdabIdaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdIdaaaaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdaaaaaaIdabIdaaaaaaaaIdIdIdIdIdIdIdBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrBrIdIdIdIdIdIdIdIdIdaaaaaaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdaaaaaaIdabIdaaaaaaaaaaIdIdIdIdIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdIdIdIdIdaaaaaaaaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdaaaaaaaaIdabIdaaaaaaaaaaaaaaaaIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdIdIdIdaaaaaaaaaaaaaaaaaaaaONaaaa +aaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIdabIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaaaa +aaaaRfababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONRgRgOxONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/southern_cross/southern_cross-7.dmm b/maps/southern_cross/southern_cross-7.dmm index a16bd52e92..d64bee5ed4 100644 --- a/maps/southern_cross/southern_cross-7.dmm +++ b/maps/southern_cross/southern_cross-7.dmm @@ -36,7 +36,7 @@ "aJ" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east,/area/space) "aK" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space,/area/space) "aL" = (/obj/machinery/light,/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/shuttle/arrival/pre_game) -"aM" = (/obj/machinery/computer/shuttle_control/arrivals,/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/shuttle/arrival/pre_game) +"aM" = (/obj/machinery/computer/shuttle_control/arrivals{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/shuttle/arrival/pre_game) "aN" = (/obj/machinery/light,/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/shuttle/arrival/pre_game) "aO" = (/obj/structure/table/steel,/obj/structure/flora/pottedplant{icon_state = "plant-09"; name = "Dave"; pixel_y = 15},/turf/simulated/shuttle/floor{icon_state = "floor_red"},/area/shuttle/arrival/pre_game) "aP" = (/turf/space/transit/east,/area/shuttle/response_ship/transit) diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 5ad22d0192..c92d5e1a85 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -22,21 +22,26 @@ var/list/all_maps = list() var/full_name = "Unnamed Map" var/path - var/list/zlevels = list() var/zlevel_datum_type // If populated, all subtypes of this type will be instantiated and used to populate the *_levels lists. - - var/list/station_levels = list() // Z-levels the station exists on - var/list/admin_levels = list() // Z-levels for admin functionality (Centcom, shuttle transit, etc) - var/list/contact_levels = list() // Z-levels that can be contacted from the station, for eg announcements - var/list/player_levels = list() // Z-levels a character can typically reach - var/list/sealed_levels = list() // Z-levels that don't allow random transit at edge - var/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning. - var/list/empty_levels = null // Empty Z-levels that may be used for various things (currently used by bluespace jump) - - var/list/map_levels // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset. var/list/base_turf_by_z = list() // Custom base turf by Z-level. Defaults to world.turf for unlisted Z-levels + // Automatically populated lists made static for faster lookups + var/static/list/zlevels = list() + var/static/list/station_levels = list() // Z-levels the station exists on + var/static/list/admin_levels = list() // Z-levels for admin functionality (Centcom, shuttle transit, etc) + var/static/list/contact_levels = list() // Z-levels that can be contacted from the station, for eg announcements + var/static/list/player_levels = list() // Z-levels a character can typically reach + var/static/list/sealed_levels = list() // Z-levels that don't allow random transit at edge + var/static/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning. + var/static/list/empty_levels = null // Empty Z-levels that may be used for various things (currently used by bluespace jump) + // End Static Lists + + // Z-levels available to various consoles, such as the crew monitor. Defaults to station_levels if unset. + var/list/map_levels + + // E-mail TLDs to use for NTnet modular computer e-mail addresses var/list/usable_email_tlds = list("freemail.nt") + //This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. var/list/accessible_z_levels = list() @@ -120,6 +125,38 @@ var/list/all_maps = list() else default_skybox = new() +// Gets the current time on a current zlevel, and returns a time datum +/datum/map/proc/get_zlevel_time(var/z) + if(!z) + z = 1 + var/datum/planet/P = z <= SSplanets.z_to_planet.len ? SSplanets.z_to_planet[z] : null + // We found a planet tied to that zlevel, give them the time + if(P?.current_time) + return P.current_time + + // We have to invent a time + else + var/datum/time/T = new (station_time_in_ds) + return T + +// Returns a boolean for if it's night or not on a particular zlevel +/datum/map/proc/get_night(var/z) + if(!z) + z = 1 + var/datum/time/now = get_zlevel_time(z) + var/percent = now.seconds_stored / now.seconds_in_day //practically all of these are in DS + + // First quarter, last quarter + if(percent < 0.25 || percent > 0.75) + return TRUE + // Second quarter, third quarter + else + return FALSE + +// Boolean for if we should use SSnightshift night hours +/datum/map/proc/get_nightshift() + return get_night(1) //Defaults to z1, customize however you want on your own maps + /datum/map/proc/setup_map() return diff --git a/nano/css/shared.css b/nano/css/shared.css index c79d603d94..3517402e2a 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -663,7 +663,15 @@ th.Silicon { font-weight: bold; color: #ffffff; } -/* Damage colors for crew monitoring computer */ +/* Damage/health colors for crew monitoring computer */ + +.dead { + color: red; +} + +.alive { + color: #7cfc00; +} .burn { color: orange; @@ -674,7 +682,7 @@ th.Silicon { } .toxin { - color: green; + color: lime; } .oxyloss { diff --git a/nano/templates/apc.tmpl b/nano/templates/apc.tmpl index d99b1f8700..a26abef4a0 100644 --- a/nano/templates/apc.tmpl +++ b/nano/templates/apc.tmpl @@ -201,6 +201,17 @@
      +
      +
      + Night Lighting: +
      +
      + {{:helper.link('Disabled', null, {'nightshift' : 2}, data.nightshiftSetting == 2 ? 'selected' : null)}} + {{:helper.link('Automatic', null, {'nightshift' : 1}, data.nightshiftSetting == 1 ? 'selected' : null)}} + {{:helper.link('Enabled', null, {'nightshift' : 3}, data.nightshiftSetting == 3 ? 'selected' : null)}} +
      +
      + {{if data.siliconUser}}

      System Overrides

      diff --git a/nano/templates/crew_monitor.tmpl b/nano/templates/crew_monitor.tmpl index bf02a98b8e..2dbc65d36d 100644 --- a/nano/templates/crew_monitor.tmpl +++ b/nano/templates/crew_monitor.tmpl @@ -22,11 +22,11 @@ Used In File(s): \code\game\machinery\computer\crew.dm {{for data.crewmembers}} {{if value.sensor_type == 1}} - {{if data.isAI}}{{/if}} + {{if data.isAI}}{{/if}} {{else value.sensor_type == 2}} - {{if data.isAI}}{{/if}} + {{if data.isAI}}{{/if}} {{else value.sensor_type == 3}} - {{if data.isAI}}{{/if}} + {{if data.isAI}}{{/if}} {{/if}} {{/for}}
      {{:value.name}} ({{:value.assignment}}){{:value.dead ? "Deceased" : "Living"}}Not Available{{:helper.link('Track', null, {}, 'disabled')}}
      {{:value.name}} ({{:value.assignment}}){{:value.dead ? "Deceased" : "Living"}}Not Available{{:helper.link('Track', null, {}, 'disabled')}}
      {{:value.name}} ({{:value.assignment}}){{:value.dead ? "Deceased" : "Living"}} ({{:value.oxy}}/{{:value.tox}}/{{:value.fire}}/{{:value.brute}})Not Available{{:helper.link('Track', null, {}, 'disabled')}}
      {{:value.name}} ({{:value.assignment}}){{:value.dead ? "Deceased" : "Living"}} ({{:value.oxy}}/{{:value.tox}}/{{:value.fire}}/{{:value.brute}})Not Available{{:helper.link('Track', null, {}, 'disabled')}}
      {{:value.name}} ({{:value.assignment}}){{:value.dead ? "Deceased" : "Living"}} ({{:value.oxy}}/{{:value.tox}}/{{:value.fire}}/{{:value.brute}}){{:value.area}}({{:value.x}}, {{:value.y}}, {{:value.z}}){{:helper.link('Track', null, {'track' : value.ref})}}
      {{:value.name}} ({{:value.assignment}}){{:value.dead ? "Deceased" : "Living"}} ({{:value.oxy}}/{{:value.tox}}/{{:value.fire}}/{{:value.brute}}){{:value.area}}({{:value.x}}, {{:value.y}}, {{:value.z}}){{:helper.link('Track', null, {'track' : value.ref})}}
      diff --git a/nano/templates/janitorcart.tmpl b/nano/templates/janitorcart.tmpl index 916b92bc72..3b8ee07680 100644 --- a/nano/templates/janitorcart.tmpl +++ b/nano/templates/janitorcart.tmpl @@ -27,4 +27,9 @@ {{:helper.link(data.signs, '', { 'take' : 'sign' })}} {{/if}} + {{if data.bucket}} +
      + {{:helper.link(data.bucket, '', { 'take' : 'bucket' })}} +
      + {{/if}} \ No newline at end of file diff --git a/nano/templates/mod_uav.tmpl b/nano/templates/mod_uav.tmpl new file mode 100644 index 0000000000..94498ec109 --- /dev/null +++ b/nano/templates/mod_uav.tmpl @@ -0,0 +1,53 @@ +
      +
      +
      UAV:
      +
      + {{if data.current_uav}} + {{:data.current_uav.status}} + {{else}} + [Not Connected] + {{/if}} +
      +
      + +
      +
      Signal:
      +
      + {{if data.current_uav}} + {{:data.signal_strength}} + {{else}} + [Not Connected] + {{/if}} +
      +
      + +
      +
      Power:
      +
      + {{if data.current_uav}} + {{:helper.link(data.current_uav.power ? 'Online' : 'Offline', data.current_uav.power ? 'check' : 'close', {'power_uav' : 1}, null, data.current_uav.power ? 'linkOn' : 'redButton')}} + {{else}} + [Not Connected] + {{/if}} +
      +
      + +
      +
      Camera:
      +
      + {{if data.current_uav}} + {{:helper.link(data.current_uav.power ? 'Available' : 'Unavailable', data.current_uav.power ? 'check' : 'close', {'view_uav' : 1}, null, data.in_use ? 'linkOn' : null)}} + {{else}} + [Not Connected] + {{/if}} +
      +
      +
      +
      +
      Paired UAVs:
      +
      +{{for data.paired_uavs}} +
      + {{:helper.link(value.name, '', {'switch_uav' : value.uavref})}}{{:helper.link('', 'close', {'del_uav' : value.uavref}, null, 'redButton')}} +
      +{{/for}} diff --git a/nano/templates/photocopier.tmpl b/nano/templates/photocopier.tmpl index 9c9910e969..695f5677ad 100644 --- a/nano/templates/photocopier.tmpl +++ b/nano/templates/photocopier.tmpl @@ -1,47 +1,45 @@ - - -{{if data.copyItem}} -
      - {{:helper.link('Remove Item', 'eject', {'remove' : 1})}} - {{if data.toner}} - {{:helper.link('Copy', 'copy', {'copy' : 1})}}
      -
      -
      -
      - Printing: -
      -
      -
      - {{:helper.link('-', null, {'min' : 1}, data.copies == 1 ? 'linkOff' : null)}} -
      {{:data.copies}}
      - {{:helper.link('+', null, {'add' : 1}, data.copies == data.maxCopies ? 'linkOff' : null)}} -
      -
      -
      -
      -
      -
      Current toner level:
      -
      {{:data.toner}}u
      -
      - {{else}} -
      - Please insert a new toner cartridge! -
      - {{/if}} -{{else data.toner}} -

      Please insert something to copy.

      - {{if data.isSilicon}} - {{:helper.link('Print photo from database', 'image', {'aipic' : 1})}} - {{/if}} -
      -
      Current toner level:
      -
      {{:data.toner}}u
      -
      -{{else}} -
      - Please insert a new toner cartridge! -
      + + +{{if data.copyItem}} +
      + {{:helper.link('Remove Item', 'eject', {'remove' : 1})}} + {{if data.toner}} + {{:helper.link('Copy', 'copy', {'copy' : 1})}} +
      +
      + Printing: +
      +
      +
      + {{:helper.link('-', null, {'min' : 1}, data.copies == 1 ? 'linkOff' : null)}} +
      {{:data.copies}}
      + {{:helper.link('+', null, {'add' : 1}, data.copies == data.maxCopies ? 'linkOff' : null)}} +
      +
      +
      +
      +
      +
      Current toner level:
      +
      {{:data.toner}}u
      +
      + {{else}} + Please insert a new toner cartridge! + {{/if}} +
      +{{else data.toner}} +

      Please insert something to copy.

      + {{if data.isSilicon}} + {{:helper.link('Print photo from database', 'image', {'aipic' : 1})}} + {{/if}} +
      +
      Current toner level:
      +
      {{:data.toner}}u
      +
      +{{else}} +
      + Please insert a new toner cartridge! +
      {{/if}} \ No newline at end of file diff --git a/nano/templates/teleport_control.tmpl b/nano/templates/teleport_control.tmpl new file mode 100644 index 0000000000..c849eb516f --- /dev/null +++ b/nano/templates/teleport_control.tmpl @@ -0,0 +1,44 @@ +
      +
      +
      Target:
      +
      + {{:helper.link(data.locked_name, null, {'select_target' : 1}, null, null)}} +
      +
      + +
      +
      Calibrated:
      +
      + {{:helper.link(data.calibrated ? 'Accurate' : 'Test Fire', data.calibrated ? 'check' : 'close', {'test_fire' : 1}, null, data.calibrated ? 'linkOn' : 'redButton')}} +
      +
      + +
      +
      Teleporter:
      +
      + {{:helper.link(data.teleporter_on ? 'Online' : 'Offline', data.teleporter_on ? 'check' : 'close', {'toggle_on' : 1}, null, data.teleporter_on ? 'linkOn' : 'redButton')}} +
      +
      + +
      +
      Station:
      +
      + {{if data.station_connected}} + Connected + {{else}} + Not Connected! + {{/if}} +
      +
      + +
      +
      Hub:
      +
      + {{if data.hub_connected}} + Connected + {{else}} + Not Connected! + {{/if}} +
      +
      +
      \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 709f5582c5..aea3e1f5df 100644 --- a/polaris.dme +++ b/polaris.dme @@ -123,6 +123,7 @@ #include "code\_onclick\hud\ability_screen_objects.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" #include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\gun_mode.dm" @@ -217,6 +218,7 @@ #include "code\controllers\subsystems\mapping.dm" #include "code\controllers\subsystems\mobs.dm" #include "code\controllers\subsystems\nanoui.dm" +#include "code\controllers\subsystems\nightshift.dm" #include "code\controllers\subsystems\open_space.dm" #include "code\controllers\subsystems\orbits.dm" #include "code\controllers\subsystems\overlays.dm" @@ -305,10 +307,12 @@ #include "code\datums\observation\logged_in.dm" #include "code\datums\observation\moved.dm" #include "code\datums\observation\observation.dm" +#include "code\datums\observation\power_change.dm" #include "code\datums\observation\shuttle_added.dm" #include "code\datums\observation\shuttle_moved.dm" #include "code\datums\observation\stat_set.dm" #include "code\datums\observation\turf_changed.dm" +#include "code\datums\observation\turf_enterexit.dm" #include "code\datums\observation\unequipped.dm" #include "code\datums\observation\z_moved.dm" #include "code\datums\observation\~cleanup.dm" @@ -690,6 +694,7 @@ #include "code\game\machinery\jukebox.dm" #include "code\game\machinery\lightswitch.dm" #include "code\game\machinery\machinery.dm" +#include "code\game\machinery\machinery_power.dm" #include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\navbeacon.dm" @@ -945,6 +950,7 @@ #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\trash_material.dm" +#include "code\game\objects\items\uav.dm" #include "code\game\objects\items\devices\ai_detector.dm" #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\binoculars.dm" @@ -1269,6 +1275,7 @@ #include "code\game\turfs\simulated\floor_icon.dm" #include "code\game\turfs\simulated\floor_static.dm" #include "code\game\turfs\simulated\floor_types.dm" +#include "code\game\turfs\simulated\floor_types_eris.dm" #include "code\game\turfs\simulated\lava.dm" #include "code\game\turfs\simulated\wall_attacks.dm" #include "code\game\turfs\simulated\wall_icon.dm" @@ -1369,6 +1376,7 @@ #include "code\modules\admin\verbs\atmosdebug.dm" #include "code\modules\admin\verbs\BrokenInhands.dm" #include "code\modules\admin\verbs\buildmode.dm" +#include "code\modules\admin\verbs\change_appearance.dm" #include "code\modules\admin\verbs\check_customitem_activity.dm" #include "code\modules\admin\verbs\cinematic.dm" #include "code\modules\admin\verbs\custom_event.dm" @@ -1417,8 +1425,8 @@ #include "code\modules\ai\ai_holder_targeting.dm" #include "code\modules\ai\interfaces.dm" #include "code\modules\ai\say_list.dm" -#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\aI_holder_subtypes\slime_xenobio_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" #include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm_handler.dm" #include "code\modules\alarm\atmosphere_alarm.dm" @@ -1606,6 +1614,7 @@ #include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" #include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" #include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\spacesuits\void\event.dm" #include "code\modules\clothing\spacesuits\void\merc.dm" #include "code\modules\clothing\spacesuits\void\station.dm" #include "code\modules\clothing\spacesuits\void\void.dm" @@ -2361,6 +2370,7 @@ #include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" #include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" #include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" #include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" diff --git a/sound/effects/footstep/HeavySand1.ogg b/sound/effects/footstep/HeavySand1.ogg new file mode 100644 index 0000000000..68be7bed25 Binary files /dev/null and b/sound/effects/footstep/HeavySand1.ogg differ diff --git a/sound/effects/footstep/HeavySand2.ogg b/sound/effects/footstep/HeavySand2.ogg new file mode 100644 index 0000000000..6a32465a5b Binary files /dev/null and b/sound/effects/footstep/HeavySand2.ogg differ diff --git a/sound/effects/footstep/HeavySand3.ogg b/sound/effects/footstep/HeavySand3.ogg new file mode 100644 index 0000000000..c71a89cea2 Binary files /dev/null and b/sound/effects/footstep/HeavySand3.ogg differ diff --git a/sound/effects/footstep/HeavySand4.ogg b/sound/effects/footstep/HeavySand4.ogg new file mode 100644 index 0000000000..088519fb75 Binary files /dev/null and b/sound/effects/footstep/HeavySand4.ogg differ diff --git a/sound/effects/footstep/LightDirt2.ogg b/sound/effects/footstep/LightDirt2.ogg new file mode 100644 index 0000000000..324fd82370 Binary files /dev/null and b/sound/effects/footstep/LightDirt2.ogg differ diff --git a/sound/effects/footstep/LightDirt4.ogg b/sound/effects/footstep/LightDirt4.ogg new file mode 100644 index 0000000000..8a72738b21 Binary files /dev/null and b/sound/effects/footstep/LightDirt4.ogg differ diff --git a/sound/effects/footstep/LightStone1.ogg b/sound/effects/footstep/LightStone1.ogg new file mode 100644 index 0000000000..a61d3ccfa2 Binary files /dev/null and b/sound/effects/footstep/LightStone1.ogg differ diff --git a/sound/effects/footstep/LightStone2.ogg b/sound/effects/footstep/LightStone2.ogg new file mode 100644 index 0000000000..3409c1f4d8 Binary files /dev/null and b/sound/effects/footstep/LightStone2.ogg differ diff --git a/sound/effects/footstep/LightStone3.ogg b/sound/effects/footstep/LightStone3.ogg new file mode 100644 index 0000000000..e0843c62af Binary files /dev/null and b/sound/effects/footstep/LightStone3.ogg differ diff --git a/sound/effects/footstep/LightStone4.ogg b/sound/effects/footstep/LightStone4.ogg new file mode 100644 index 0000000000..b262be5f8e Binary files /dev/null and b/sound/effects/footstep/LightStone4.ogg differ diff --git a/sound/effects/footstep/MedDirt1.ogg b/sound/effects/footstep/MedDirt1.ogg new file mode 100644 index 0000000000..8951c4580a Binary files /dev/null and b/sound/effects/footstep/MedDirt1.ogg differ diff --git a/sound/effects/footstep/MedDirt2.ogg b/sound/effects/footstep/MedDirt2.ogg new file mode 100644 index 0000000000..7fee392796 Binary files /dev/null and b/sound/effects/footstep/MedDirt2.ogg differ diff --git a/sound/effects/footstep/MedDirt3.ogg b/sound/effects/footstep/MedDirt3.ogg new file mode 100644 index 0000000000..141c542f0a Binary files /dev/null and b/sound/effects/footstep/MedDirt3.ogg differ diff --git a/sound/effects/footstep/MedDirt4.ogg b/sound/effects/footstep/MedDirt4.ogg new file mode 100644 index 0000000000..7b980e6e31 Binary files /dev/null and b/sound/effects/footstep/MedDirt4.ogg differ diff --git a/sound/effects/footstep/bubbles3.ogg b/sound/effects/footstep/bubbles3.ogg new file mode 100644 index 0000000000..62070813e3 Binary files /dev/null and b/sound/effects/footstep/bubbles3.ogg differ diff --git a/sound/effects/footstep/bubbles4.ogg b/sound/effects/footstep/bubbles4.ogg new file mode 100644 index 0000000000..f94889c060 Binary files /dev/null and b/sound/effects/footstep/bubbles4.ogg differ diff --git a/sound/effects/footstep/bubbles5.ogg b/sound/effects/footstep/bubbles5.ogg new file mode 100644 index 0000000000..43eff29193 Binary files /dev/null and b/sound/effects/footstep/bubbles5.ogg differ diff --git a/sound/effects/footstep/mud1.ogg b/sound/effects/footstep/mud1.ogg new file mode 100644 index 0000000000..c0f5276e41 Binary files /dev/null and b/sound/effects/footstep/mud1.ogg differ diff --git a/sound/effects/footstep/mud2.ogg b/sound/effects/footstep/mud2.ogg new file mode 100644 index 0000000000..36b311a2de Binary files /dev/null and b/sound/effects/footstep/mud2.ogg differ diff --git a/sound/effects/footstep/mud3.ogg b/sound/effects/footstep/mud3.ogg new file mode 100644 index 0000000000..e44c7d05f3 Binary files /dev/null and b/sound/effects/footstep/mud3.ogg differ diff --git a/sound/effects/footstep/mud4.ogg b/sound/effects/footstep/mud4.ogg new file mode 100644 index 0000000000..158158125d Binary files /dev/null and b/sound/effects/footstep/mud4.ogg differ